ETH Price: $2,349.20 (-2.84%)

Token

Wisewands (WW)
 

Overview

Max Total Supply

278 WW

Holders

74

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
jason.q00t.eth
Balance
4 WW
0x7faf28d3cd65147c9317a068358bbf2734fa4774
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:
nft

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

// SPDX-License-Identifier: GPL-3.0
// 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: contracts/creepies.sol



pragma solidity >=0.8.2;
// to enable certain compiler features

//import '@openzeppelin/contracts/token/ERC721/ERC721.sol';









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;
    
    //Mapping para atribuirle un URI para cada token
    mapping(uint256 => string) internal id_to_URI;

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

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

contract nft is ERC721, Ownable {
    using Strings for uint256;

    //amount of tokens that have been minted so far, in total and in presale
    uint256 private numberOfTotalTokens;
    
    //declares the maximum amount of tokens that can be minted, total and in presale
    uint256 private maxTotalTokens;
    uint256 private maxTokensPresale;
    
    //initial part of the URI for the metadata
    string private _currentBaseURI;
        
    //cost of mints depending on state of sale    
    uint private constant mintCostPresale = 0.07 ether;
    uint private constant mintCostPublicSale = 0.1 ether;
    
    //maximum amount of mints allowed per person
    uint256 public constant maxMintPresale = 5;
    uint256 public constant maxMintPublicSale = 20;

    
    //the amount of reserved mints that have currently been executed by creator and giveaways
    uint private _reservedMints = 0;
    
    //the maximum amount of reserved mints allowed for creator and giveaways
    uint private maxReservedMints = 25;
    
    //dummy address that we use to sign the mint transaction to make sure it is valid
    address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c;
    
    //marks the timestamp of when the respective sales open
    uint256 internal presaleLaunchTime;
    uint256 internal publicSaleLaunchTime;
    uint256 internal revealTime;

    //amount of mints that each address has executed
    mapping(address => uint256) public mintsPerAddress;
    
    //current state os sale
    enum State {NoSale, Presale, PublicSale}

    //defines the uri for when the NFTs have not been yet revealed
    string public unrevealedURI;

    //people allowed to mint one for giveaways
    mapping(address => bool) public giveaways;
    
    //declaring initial values for variables
    constructor() ERC721('Wisewands', 'WW') {
        numberOfTotalTokens = 0;
        maxTotalTokens = 10000;
        maxTokensPresale = 1000;

        unrevealedURI = "ipfs://QmTf3msqbCNe6TJJH4LhxkPgnDFnBYHsuYaW86Fu9qW6Yi/";
    }
    
    //in case somebody accidentaly sends funds or transaction to contract
    receive() payable external {}
    fallback() payable external {
        revert();
    }
    
    //visualize baseURI
    function _baseURI() internal view virtual override returns (string memory) {
        return _currentBaseURI;
    }
    
    //change baseURI in case needed for IPFS
    function changeBaseURI(string memory baseURI_) public onlyOwner {
        _currentBaseURI = baseURI_;
    }

    function changeUnrevealedURI(string memory unrevealedURI_) public onlyOwner {
        unrevealedURI = unrevealedURI_;
    }
    
    //gets the tokenID of NFT to be minted
    function tokenId() internal view returns(uint256) {
        uint currentId = totalSupply() + maxReservedMints - _reservedMints;
        bool exists = true;
        while (exists) {
            currentId += 1;
            exists = _exists(currentId);
        }
        
        return currentId;
    }

    function switchToPresale() public onlyOwner {
        require(saleState() == State.NoSale, 'Sale is already Open!');
        presaleLaunchTime = block.timestamp;
        publicSaleLaunchTime = presaleLaunchTime + 86400;
    }

    //reveal the NFTs
    function reveal() public onlyOwner {
        revealTime = block.timestamp;
    }
    
    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) {
        require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' );
        _;
    }
 
    /* 
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _add Address of agent with access
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(address(this), _add));
        return dummy == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s);
    }
    
    //mint a @param number of NFTs in presale
    function presaleMint(uint256 number, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v,  _r, _s) public payable {
        State saleState_ = saleState();
        require(saleState_ != State.NoSale, "Sale in not open yet!");
        require(saleState_ != State.PublicSale, "Presale has closed, Check out Public Sale!");
        require(numberOfTotalTokens + number <= maxTotalTokens + _reservedMints, "Not enough NFTs left to mint..");
        require(mintsPerAddress[msg.sender] + number <= maxMintPresale, "Maximum 5 Mints per Address allowed!");
        require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.07 ether each NFT)");
        
        for (uint256 i = 0; i < number; i++) {
            uint256 tid = tokenId();
            _safeMint(msg.sender, tid);
            mintsPerAddress[msg.sender] += 1;
            numberOfTotalTokens += 1;
        }

    }

    //mint a @param number of NFTs in public sale
    function publicSaleMint(uint256 number) public payable {
        State saleState_ = saleState();
        require(saleState_ == State.PublicSale, "Public Sale in not open yet!");
        require(numberOfTotalTokens + number <= maxTotalTokens - (maxReservedMints - _reservedMints), "Not enough NFTs left to mint..");
        require(mintsPerAddress[msg.sender] + number <= maxMintPublicSale, "Maximum 20 Mints per Address allowed!");
        require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.1 ether for each NFT)");


        for (uint256 i = 0; i < number; i++) {
            uint256 tid = tokenId();
            _safeMint(msg.sender, tid);
            mintsPerAddress[msg.sender] += 1;
            numberOfTotalTokens += 1;
        }
    }

    //person that has one guveaway can get there free mint
    function mintGiveaway() public {
        require(giveaways[msg.sender] == true, 'You have not won a giveaway NFT!');
        uint256 tid = tokenId();
        _safeMint(msg.sender, tid);
        mintsPerAddress[msg.sender] += 1;
        numberOfTotalTokens += 1;
    
        giveaways[msg.sender] = false;
    }

    //add memeber to be eligible for giveaway
    function addToGiveaway(address recipient) public onlyOwner {
        giveaways[recipient] = true;
    }
    
    function tokenURI(uint256 tokenId_) public view virtual override returns (string memory) {
        require(_exists(tokenId_), "ERC721Metadata: URI query for nonexistent token");
        
        //check to see that 24 hours have passed since beginning of publicsale launch
        if (revealTime == 0 || block.timestamp < revealTime) {
            return unrevealedURI;
        }
        
        else {
            string memory baseURI = _baseURI();
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId_.toString(), '.json')) : "";
        }    
    }
    
    //reserved NFTs for creator
    function reservedMint(uint number, address recipient) public onlyOwner {
        require(_reservedMints + number <= maxReservedMints, "Not enough Reserved NFTs left to mint..");

        for (uint i = 0; i < number; i++) {
            _safeMint(recipient, _reservedMints + 1);
            mintsPerAddress[recipient] += 1;
            numberOfTotalTokens += 1;
            _reservedMints += 1;
        }    
        
    }
    
    //burn the tokens that have not been sold yet
    function burnTokens() public onlyOwner {
        maxTotalTokens = numberOfTotalTokens;
    }
    
    //se the current account balance
    function accountBalance() public onlyOwner view returns(uint) {
        return address(this).balance;
    }
    
    //retrieve all funds recieved from minting
    function withdraw() public onlyOwner {
        uint256 balance = accountBalance();
        require(balance > 0, 'No Funds to withdraw, Balance is 0');

        _withdraw(payable(0xEaeDc98671339E4068fEAe0fA7F4f7E32Fa51CC1), accountBalance()); 
    }
    
    //send the percentage of funds to a shareholder´s wallet
    function _withdraw(address payable account, uint256 amount) internal {
        (bool sent, ) = account.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }
    
    //change the dummy account used for signing transactions
    function changeDummy(address _dummy) public onlyOwner {
        dummy = _dummy;
    }
    
    //see the total amount of tokens that have been minted
    function totalSupply() public view returns(uint) {
        return numberOfTotalTokens;
    }
    
    //to see the total amount of reserved mints left 
    function reservedMintsLeft() public onlyOwner view returns(uint) {
        return maxReservedMints - _reservedMints;
    }
    
    //see current state of sale
    //see the current state of the sale
    function saleState() public view returns(State){
        if (presaleLaunchTime == 0) {
            return State.NoSale;
        }
        else if (block.timestamp < publicSaleLaunchTime) {
            return State.Presale;
        }
        else {
            return State.PublicSale;
        }
    }
    
    //gets the cost of current mint
    function mintCost() public view returns(uint) {
        State saleState_ = saleState();
        if (saleState_ == State.NoSale || saleState_ == State.Presale) {
            return mintCostPresale;
        }
        else {
            return mintCostPublicSale;
        }
    }

    //see when NFTs will be revealed
    function timeOfReveal() public view returns(uint256) {
        require(revealTime != 0, 'NFT Reveal Time has not been determined yet!');
        return revealTime;
    }
    
   
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"accountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"addToGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dummy","type":"address"}],"name":"changeDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"changeUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"giveaways","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reservedMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMintsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","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":[],"name":"saleState","outputs":[{"internalType":"enum nft.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchToPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeOfReveal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600c556019600d557380e4929c869102140e69550bbecc20bed61b080c600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200007057600080fd5b506040518060400160405280600981526020017f5769736577616e647300000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f57570000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f592919062000251565b5080600190805190602001906200010e92919062000251565b50505062000131620001256200018360201b60201c565b6200018b60201b60201c565b60006008819055506127106009819055506103e8600a819055506040518060600160405280603681526020016200565e60369139601390805190602001906200017c92919062000251565b5062000366565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025f9062000301565b90600052602060002090601f016020900481019282620002835760008555620002cf565b82601f106200029e57805160ff1916838001178555620002cf565b82800160010185558215620002cf579182015b82811115620002ce578251825591602001919060010190620002b1565b5b509050620002de9190620002e2565b5090565b5b80821115620002fd576000816000905550600101620002e3565b5090565b600060028204905060018216806200031a57607f821691505b6020821081141562000331576200033062000337565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6152e880620003766000396000f3fe60806040526004361061023f5760003560e01c806370a082311161012e578063b3ab66b0116100ab578063dcd4e7321161006f578063dcd4e73214610835578063e985e9c514610851578063eab417821461088e578063f2fde38b146108a5578063ffcd55a8146108ce57610246565b8063b3ab66b01461075f578063b88d4fde1461077b578063bdb4b848146107a4578063c4d8b9df146107cf578063c87b56dd146107f857610246565b80639ff048fc116100f25780639ff048fc146106b4578063a22cb465146106cb578063a475b5dd146106f4578063a99102871461070b578063b0a1c1c41461073457610246565b806370a08231146105df578063715018a61461061c5780637c76f698146106335780638da5cb5b1461065e57806395d89b411461068957610246565b806324b1e567116101bc57806342842e0e1161018057806342842e0e146104f85780634520e91614610521578063603f4d521461054c5780636352211e146105775780637035bf18146105b457610246565b806324b1e567146104015780633023eba61461043e578063326241141461047b57806339a0c6f9146104b85780633ccfd60b146104e157610246565b8063095ea7b311610203578063095ea7b31461033057806318160ddd1461035957806318df64031461038457806319734c8b146103ad57806323b872dd146103d857610246565b80630191a6571461024b57806301ffc9a71461027457806306fdde03146102b157806308003f78146102dc578063081812fc146102f357610246565b3661024657005b600080fd5b34801561025757600080fd5b50610272600480360381019061026d919061354a565b6108f9565b005b34801561028057600080fd5b5061029b60048036038101906102969190613774565b6109b9565b6040516102a89190613fb9565b60405180910390f35b3480156102bd57600080fd5b506102c6610a9b565b6040516102d39190614034565b60405180910390f35b3480156102e857600080fd5b506102f1610b2d565b005b3480156102ff57600080fd5b5061031a60048036038101906103159190613817565b610bb4565b6040516103279190613f52565b60405180910390f35b34801561033c57600080fd5b50610357600480360381019061035291906136cd565b610c39565b005b34801561036557600080fd5b5061036e610d51565b60405161037b9190614436565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a69190613844565b610d5b565b005b3480156103b957600080fd5b506103c2610eef565b6040516103cf9190614436565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa91906135b7565b610ef4565b005b34801561040d57600080fd5b506104286004803603810190610423919061354a565b610f54565b6040516104359190613fb9565b60405180910390f35b34801561044a57600080fd5b506104656004803603810190610460919061354a565b610f74565b6040516104729190614436565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d919061370d565b610f8c565b6040516104af9190613fb9565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906137ce565b61108a565b005b3480156104ed57600080fd5b506104f6611120565b005b34801561050457600080fd5b5061051f600480360381019061051a91906135b7565b611213565b005b34801561052d57600080fd5b50610536611233565b6040516105439190614436565b60405180910390f35b34801561055857600080fd5b506105616112c6565b60405161056e9190614019565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190613817565b6112f6565b6040516105ab9190613f52565b60405180910390f35b3480156105c057600080fd5b506105c96113a8565b6040516105d69190614034565b60405180910390f35b3480156105eb57600080fd5b506106066004803603810190610601919061354a565b611436565b6040516106139190614436565b60405180910390f35b34801561062857600080fd5b506106316114ee565b005b34801561063f57600080fd5b50610648611576565b6040516106559190614436565b60405180910390f35b34801561066a57600080fd5b506106736115c5565b6040516106809190613f52565b60405180910390f35b34801561069557600080fd5b5061069e6115ef565b6040516106ab9190614034565b60405180910390f35b3480156106c057600080fd5b506106c9611681565b005b3480156106d757600080fd5b506106f260048036038101906106ed919061368d565b6117f6565b005b34801561070057600080fd5b50610709611977565b005b34801561071757600080fd5b50610732600480360381019061072d919061354a565b6119fc565b005b34801561074057600080fd5b50610749611ad3565b6040516107569190614436565b60405180910390f35b61077960048036038101906107749190613817565b611b57565b005b34801561078757600080fd5b506107a2600480360381019061079d919061360a565b611dc3565b005b3480156107b057600080fd5b506107b9611e25565b6040516107c69190614436565b60405180910390f35b3480156107db57600080fd5b506107f660048036038101906107f191906137ce565b611eae565b005b34801561080457600080fd5b5061081f600480360381019061081a9190613817565b611f44565b60405161082c9190614034565b60405180910390f35b61084f600480360381019061084a9190613884565b612095565b005b34801561085d57600080fd5b5061087860048036038101906108739190613577565b6123b1565b6040516108859190613fb9565b60405180910390f35b34801561089a57600080fd5b506108a3612445565b005b3480156108b157600080fd5b506108cc60048036038101906108c7919061354a565b61254f565b005b3480156108da57600080fd5b506108e3612647565b6040516108f09190614436565b60405180910390f35b61090161264c565b73ffffffffffffffffffffffffffffffffffffffff1661091f6115c5565b73ffffffffffffffffffffffffffffffffffffffff1614610975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096c90614316565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a945750610a9382612654565b5b9050919050565b606060008054610aaa9061472d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad69061472d565b8015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b5050505050905090565b610b3561264c565b73ffffffffffffffffffffffffffffffffffffffff16610b536115c5565b73ffffffffffffffffffffffffffffffffffffffff1614610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba090614316565b60405180910390fd5b600854600981905550565b6000610bbf826126be565b610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf5906142d6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c44826112f6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac906143b6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd461264c565b73ffffffffffffffffffffffffffffffffffffffff161480610d035750610d0281610cfd61264c565b6123b1565b5b610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d39906141d6565b60405180910390fd5b610d4c838361272a565b505050565b6000600854905090565b610d6361264c565b73ffffffffffffffffffffffffffffffffffffffff16610d816115c5565b73ffffffffffffffffffffffffffffffffffffffff1614610dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dce90614316565b60405180910390fd5b600d5482600c54610de89190614526565b1115610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2090614296565b60405180910390fd5b60005b82811015610eea57610e4c826001600c54610e479190614526565b6127e3565b6001601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e9c9190614526565b92505081905550600160086000828254610eb69190614526565b925050819055506001600c6000828254610ed09190614526565b925050819055508080610ee290614790565b915050610e2c565b505050565b601481565b610f05610eff61264c565b82612801565b610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906143d6565b60405180910390fd5b610f4f8383836128df565b505050565b60146020528060005260406000206000915054906101000a900460ff1681565b60126020528060005260406000206000915090505481565b6000803086604051602001610fa2929190613ebc565b604051602081830303815290604052805190602001209050600181604051602001610fcd9190613f17565b60405160208183030381529060405280519060200120868686604051600081526020016040526040516110039493929190613fd4565b6020604051602081039080840390855afa158015611025573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b61109261264c565b73ffffffffffffffffffffffffffffffffffffffff166110b06115c5565b73ffffffffffffffffffffffffffffffffffffffff1614611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd90614316565b60405180910390fd5b80600b908051906020019061111c929190613334565b5050565b61112861264c565b73ffffffffffffffffffffffffffffffffffffffff166111466115c5565b73ffffffffffffffffffffffffffffffffffffffff161461119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390614316565b60405180910390fd5b60006111a6611ad3565b9050600081116111eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e290614416565b60405180910390fd5b61121073eaedc98671339e4068feae0fa7f4f7e32fa51cc161120b611ad3565b612b3b565b50565b61122e83838360405180602001604052806000815250611dc3565b505050565b600061123d61264c565b73ffffffffffffffffffffffffffffffffffffffff1661125b6115c5565b73ffffffffffffffffffffffffffffffffffffffff16146112b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a890614316565b60405180910390fd5b600c54600d546112c19190614607565b905090565b600080600f5414156112db57600090506112f3565b6010544210156112ee57600190506112f3565b600290505b90565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561139f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139690614256565b60405180910390fd5b80915050919050565b601380546113b59061472d565b80601f01602080910402602001604051908101604052809291908181526020018280546113e19061472d565b801561142e5780601f106114035761010080835404028352916020019161142e565b820191906000526020600020905b81548152906001019060200180831161141157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e90614236565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114f661264c565b73ffffffffffffffffffffffffffffffffffffffff166115146115c5565b73ffffffffffffffffffffffffffffffffffffffff161461156a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156190614316565b60405180910390fd5b6115746000612bec565b565b60008060115414156115bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b490614396565b60405180910390fd5b601154905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115fe9061472d565b80601f016020809104026020016040519081016040528092919081815260200182805461162a9061472d565b80156116775780601f1061164c57610100808354040283529160200191611677565b820191906000526020600020905b81548152906001019060200180831161165a57829003601f168201915b5050505050905090565b60011515601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170b90614216565b60405180910390fd5b600061171e612cb2565b905061172a33826127e3565b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461177a9190614526565b925050819055506001600860008282546117949190614526565b925050819055506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6117fe61264c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561186c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186390614116565b60405180910390fd5b806005600061187961264c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661192661264c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161196b9190613fb9565b60405180910390a35050565b61197f61264c565b73ffffffffffffffffffffffffffffffffffffffff1661199d6115c5565b73ffffffffffffffffffffffffffffffffffffffff16146119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea90614316565b60405180910390fd5b42601181905550565b611a0461264c565b73ffffffffffffffffffffffffffffffffffffffff16611a226115c5565b73ffffffffffffffffffffffffffffffffffffffff1614611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f90614316565b60405180910390fd5b6001601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000611add61264c565b73ffffffffffffffffffffffffffffffffffffffff16611afb6115c5565b73ffffffffffffffffffffffffffffffffffffffff1614611b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4890614316565b60405180910390fd5b47905090565b6000611b616112c6565b9050600280811115611b7657611b75614896565b5b816002811115611b8957611b88614896565b5b14611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090614276565b60405180910390fd5b600c54600d54611bd99190614607565b600954611be69190614607565b82600854611bf49190614526565b1115611c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2c90614156565b60405180910390fd5b601482601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c829190614526565b1115611cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cba906140b6565b60405180910390fd5b81611ccc611e25565b611cd691906145ad565b341015611d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0f90614176565b60405180910390fd5b60005b82811015611dbe576000611d2d612cb2565b9050611d3933826127e3565b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d899190614526565b92505081905550600160086000828254611da39190614526565b92505081905550508080611db690614790565b915050611d1b565b505050565b611dd4611dce61264c565b83612801565b611e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0a906143d6565b60405180910390fd5b611e1f84848484612d0d565b50505050565b600080611e306112c6565b905060006002811115611e4657611e45614896565b5b816002811115611e5957611e58614896565b5b1480611e89575060016002811115611e7457611e73614896565b5b816002811115611e8757611e86614896565b5b145b15611e9e5766f8b0a10e470000915050611eab565b67016345785d8a00009150505b90565b611eb661264c565b73ffffffffffffffffffffffffffffffffffffffff16611ed46115c5565b73ffffffffffffffffffffffffffffffffffffffff1614611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2190614316565b60405180910390fd5b8060139080519060200190611f40929190613334565b5050565b6060611f4f826126be565b611f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8590614356565b60405180910390fd5b60006011541480611fa0575060115442105b156120375760138054611fb29061472d565b80601f0160208091040260200160405190810160405280929190818152602001828054611fde9061472d565b801561202b5780601f106120005761010080835404028352916020019161202b565b820191906000526020600020905b81548152906001019060200180831161200e57829003601f168201915b50505050509050612090565b6000612041612d69565b90506000815111612061576040518060200160405280600081525061208c565b8061206b84612dfb565b60405160200161207c929190613ee8565b6040516020818303038152906040525b9150505b919050565b8282826120a433848484610f8c565b6120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120da906142f6565b60405180910390fd5b60006120ed6112c6565b90506000600281111561210357612102614896565b5b81600281111561211657612115614896565b5b1415612157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214e906143f6565b60405180910390fd5b60028081111561216a57612169614896565b5b81600281111561217d5761217c614896565b5b14156121be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b5906141f6565b60405180910390fd5b600c546009546121ce9190614526565b886008546121dc9190614526565b111561221d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221490614156565b60405180910390fd5b600588601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461226a9190614526565b11156122ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a290614376565b60405180910390fd5b876122b4611e25565b6122be91906145ad565b341015612300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f790614136565b60405180910390fd5b60005b888110156123a6576000612315612cb2565b905061232133826127e3565b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123719190614526565b9250508190555060016008600082825461238b9190614526565b9250508190555050808061239e90614790565b915050612303565b505050505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61244d61264c565b73ffffffffffffffffffffffffffffffffffffffff1661246b6115c5565b73ffffffffffffffffffffffffffffffffffffffff16146124c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b890614316565b60405180910390fd5b600060028111156124d5576124d4614896565b5b6124dd6112c6565b60028111156124ef576124ee614896565b5b1461252f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612526906141b6565b60405180910390fd5b42600f8190555062015180600f546125479190614526565b601081905550565b61255761264c565b73ffffffffffffffffffffffffffffffffffffffff166125756115c5565b73ffffffffffffffffffffffffffffffffffffffff16146125cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c290614316565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561263b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263290614076565b60405180910390fd5b61264481612bec565b50565b600581565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661279d836112f6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6127fd828260405180602001604052806000815250612f5c565b5050565b600061280c826126be565b61284b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284290614196565b60405180910390fd5b6000612856836112f6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128c557508373ffffffffffffffffffffffffffffffffffffffff166128ad84610bb4565b73ffffffffffffffffffffffffffffffffffffffff16145b806128d657506128d581856123b1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128ff826112f6565b73ffffffffffffffffffffffffffffffffffffffff1614612955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294c90614336565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bc906140f6565b60405180910390fd5b6129d0838383612fb7565b6129db60008261272a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a2b9190614607565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a829190614526565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b6190613f3d565b60006040518083038185875af1925050503d8060008114612b9e576040519150601f19603f3d011682016040523d82523d6000602084013e612ba3565b606091505b5050905080612be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bde906140d6565b60405180910390fd5b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600c54600d54612cc3610d51565b612ccd9190614526565b612cd79190614607565b90506000600190505b8015612d0557600182612cf39190614526565b9150612cfe826126be565b9050612ce0565b819250505090565b612d188484846128df565b612d2484848484612fbc565b612d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5a90614056565b60405180910390fd5b50505050565b6060600b8054612d789061472d565b80601f0160208091040260200160405190810160405280929190818152602001828054612da49061472d565b8015612df15780601f10612dc657610100808354040283529160200191612df1565b820191906000526020600020905b815481529060010190602001808311612dd457829003601f168201915b5050505050905090565b60606000821415612e43576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f57565b600082905060005b60008214612e75578080612e5e90614790565b915050600a82612e6e919061457c565b9150612e4b565b60008167ffffffffffffffff811115612e9157612e90614923565b5b6040519080825280601f01601f191660200182016040528015612ec35781602001600182028036833780820191505090505b5090505b60008514612f5057600182612edc9190614607565b9150600a85612eeb9190614807565b6030612ef79190614526565b60f81b818381518110612f0d57612f0c6148f4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f49919061457c565b9450612ec7565b8093505050505b919050565b612f668383613153565b612f736000848484612fbc565b612fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa990614056565b60405180910390fd5b505050565b505050565b6000612fdd8473ffffffffffffffffffffffffffffffffffffffff16613321565b15613146578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261300661264c565b8786866040518563ffffffff1660e01b81526004016130289493929190613f6d565b602060405180830381600087803b15801561304257600080fd5b505af192505050801561307357506040513d601f19601f8201168201806040525081019061307091906137a1565b60015b6130f6573d80600081146130a3576040519150601f19603f3d011682016040523d82523d6000602084013e6130a8565b606091505b506000815114156130ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e590614056565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061314b565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ba906142b6565b60405180910390fd5b6131cc816126be565b1561320c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320390614096565b60405180910390fd5b61321860008383612fb7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132689190614526565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546133409061472d565b90600052602060002090601f01602090048101928261336257600085556133a9565b82601f1061337b57805160ff19168380011785556133a9565b828001600101855582156133a9579182015b828111156133a857825182559160200191906001019061338d565b5b5090506133b691906133ba565b5090565b5b808211156133d35760008160009055506001016133bb565b5090565b60006133ea6133e584614476565b614451565b90508281526020810184848401111561340657613405614957565b5b6134118482856146eb565b509392505050565b600061342c613427846144a7565b614451565b90508281526020810184848401111561344857613447614957565b5b6134538482856146eb565b509392505050565b60008135905061346a81615228565b92915050565b60008135905061347f8161523f565b92915050565b60008135905061349481615256565b92915050565b6000813590506134a98161526d565b92915050565b6000815190506134be8161526d565b92915050565b600082601f8301126134d9576134d8614952565b5b81356134e98482602086016133d7565b91505092915050565b600082601f83011261350757613506614952565b5b8135613517848260208601613419565b91505092915050565b60008135905061352f81615284565b92915050565b6000813590506135448161529b565b92915050565b6000602082840312156135605761355f614961565b5b600061356e8482850161345b565b91505092915050565b6000806040838503121561358e5761358d614961565b5b600061359c8582860161345b565b92505060206135ad8582860161345b565b9150509250929050565b6000806000606084860312156135d0576135cf614961565b5b60006135de8682870161345b565b93505060206135ef8682870161345b565b925050604061360086828701613520565b9150509250925092565b6000806000806080858703121561362457613623614961565b5b60006136328782880161345b565b94505060206136438782880161345b565b935050604061365487828801613520565b925050606085013567ffffffffffffffff8111156136755761367461495c565b5b613681878288016134c4565b91505092959194509250565b600080604083850312156136a4576136a3614961565b5b60006136b28582860161345b565b92505060206136c385828601613470565b9150509250929050565b600080604083850312156136e4576136e3614961565b5b60006136f28582860161345b565b925050602061370385828601613520565b9150509250929050565b6000806000806080858703121561372757613726614961565b5b60006137358782880161345b565b945050602061374687828801613535565b935050604061375787828801613485565b925050606061376887828801613485565b91505092959194509250565b60006020828403121561378a57613789614961565b5b60006137988482850161349a565b91505092915050565b6000602082840312156137b7576137b6614961565b5b60006137c5848285016134af565b91505092915050565b6000602082840312156137e4576137e3614961565b5b600082013567ffffffffffffffff8111156138025761380161495c565b5b61380e848285016134f2565b91505092915050565b60006020828403121561382d5761382c614961565b5b600061383b84828501613520565b91505092915050565b6000806040838503121561385b5761385a614961565b5b600061386985828601613520565b925050602061387a8582860161345b565b9150509250929050565b6000806000806080858703121561389e5761389d614961565b5b60006138ac87828801613520565b94505060206138bd87828801613535565b93505060406138ce87828801613485565b92505060606138df87828801613485565b91505092959194509250565b6138f48161463b565b82525050565b61390b6139068261463b565b6147d9565b82525050565b61391a8161464d565b82525050565b61392981614659565b82525050565b61394061393b82614659565b6147eb565b82525050565b6000613951826144d8565b61395b81856144ee565b935061396b8185602086016146fa565b61397481614966565b840191505092915050565b613988816146d9565b82525050565b6000613999826144e3565b6139a3818561450a565b93506139b38185602086016146fa565b6139bc81614966565b840191505092915050565b60006139d2826144e3565b6139dc818561451b565b93506139ec8185602086016146fa565b80840191505092915050565b6000613a05601c8361451b565b9150613a1082614984565b601c82019050919050565b6000613a2860328361450a565b9150613a33826149ad565b604082019050919050565b6000613a4b60268361450a565b9150613a56826149fc565b604082019050919050565b6000613a6e601c8361450a565b9150613a7982614a4b565b602082019050919050565b6000613a9160258361450a565b9150613a9c82614a74565b604082019050919050565b6000613ab460148361450a565b9150613abf82614ac3565b602082019050919050565b6000613ad760248361450a565b9150613ae282614aec565b604082019050919050565b6000613afa60198361450a565b9150613b0582614b3b565b602082019050919050565b6000613b1d604d8361450a565b9150613b2882614b64565b606082019050919050565b6000613b40601e8361450a565b9150613b4b82614bd9565b602082019050919050565b6000613b6360508361450a565b9150613b6e82614c02565b606082019050919050565b6000613b86602c8361450a565b9150613b9182614c77565b604082019050919050565b6000613ba960158361450a565b9150613bb482614cc6565b602082019050919050565b6000613bcc60388361450a565b9150613bd782614cef565b604082019050919050565b6000613bef602a8361450a565b9150613bfa82614d3e565b604082019050919050565b6000613c1260208361450a565b9150613c1d82614d8d565b602082019050919050565b6000613c35602a8361450a565b9150613c4082614db6565b604082019050919050565b6000613c5860298361450a565b9150613c6382614e05565b604082019050919050565b6000613c7b601c8361450a565b9150613c8682614e54565b602082019050919050565b6000613c9e60278361450a565b9150613ca982614e7d565b604082019050919050565b6000613cc160208361450a565b9150613ccc82614ecc565b602082019050919050565b6000613ce4602c8361450a565b9150613cef82614ef5565b604082019050919050565b6000613d0760058361451b565b9150613d1282614f44565b600582019050919050565b6000613d2a60118361450a565b9150613d3582614f6d565b602082019050919050565b6000613d4d60208361450a565b9150613d5882614f96565b602082019050919050565b6000613d7060298361450a565b9150613d7b82614fbf565b604082019050919050565b6000613d93602f8361450a565b9150613d9e8261500e565b604082019050919050565b6000613db660248361450a565b9150613dc18261505d565b604082019050919050565b6000613dd9602c8361450a565b9150613de4826150ac565b604082019050919050565b6000613dfc60218361450a565b9150613e07826150fb565b604082019050919050565b6000613e1f6000836144ff565b9150613e2a8261514a565b600082019050919050565b6000613e4260318361450a565b9150613e4d8261514d565b604082019050919050565b6000613e6560158361450a565b9150613e708261519c565b602082019050919050565b6000613e8860228361450a565b9150613e93826151c5565b604082019050919050565b613ea7816146c2565b82525050565b613eb6816146cc565b82525050565b6000613ec882856138fa565b601482019150613ed882846138fa565b6014820191508190509392505050565b6000613ef482856139c7565b9150613f0082846139c7565b9150613f0b82613cfa565b91508190509392505050565b6000613f22826139f8565b9150613f2e828461392f565b60208201915081905092915050565b6000613f4882613e12565b9150819050919050565b6000602082019050613f6760008301846138eb565b92915050565b6000608082019050613f8260008301876138eb565b613f8f60208301866138eb565b613f9c6040830185613e9e565b8181036060830152613fae8184613946565b905095945050505050565b6000602082019050613fce6000830184613911565b92915050565b6000608082019050613fe96000830187613920565b613ff66020830186613ead565b6140036040830185613920565b6140106060830184613920565b95945050505050565b600060208201905061402e600083018461397f565b92915050565b6000602082019050818103600083015261404e818461398e565b905092915050565b6000602082019050818103600083015261406f81613a1b565b9050919050565b6000602082019050818103600083015261408f81613a3e565b9050919050565b600060208201905081810360008301526140af81613a61565b9050919050565b600060208201905081810360008301526140cf81613a84565b9050919050565b600060208201905081810360008301526140ef81613aa7565b9050919050565b6000602082019050818103600083015261410f81613aca565b9050919050565b6000602082019050818103600083015261412f81613aed565b9050919050565b6000602082019050818103600083015261414f81613b10565b9050919050565b6000602082019050818103600083015261416f81613b33565b9050919050565b6000602082019050818103600083015261418f81613b56565b9050919050565b600060208201905081810360008301526141af81613b79565b9050919050565b600060208201905081810360008301526141cf81613b9c565b9050919050565b600060208201905081810360008301526141ef81613bbf565b9050919050565b6000602082019050818103600083015261420f81613be2565b9050919050565b6000602082019050818103600083015261422f81613c05565b9050919050565b6000602082019050818103600083015261424f81613c28565b9050919050565b6000602082019050818103600083015261426f81613c4b565b9050919050565b6000602082019050818103600083015261428f81613c6e565b9050919050565b600060208201905081810360008301526142af81613c91565b9050919050565b600060208201905081810360008301526142cf81613cb4565b9050919050565b600060208201905081810360008301526142ef81613cd7565b9050919050565b6000602082019050818103600083015261430f81613d1d565b9050919050565b6000602082019050818103600083015261432f81613d40565b9050919050565b6000602082019050818103600083015261434f81613d63565b9050919050565b6000602082019050818103600083015261436f81613d86565b9050919050565b6000602082019050818103600083015261438f81613da9565b9050919050565b600060208201905081810360008301526143af81613dcc565b9050919050565b600060208201905081810360008301526143cf81613def565b9050919050565b600060208201905081810360008301526143ef81613e35565b9050919050565b6000602082019050818103600083015261440f81613e58565b9050919050565b6000602082019050818103600083015261442f81613e7b565b9050919050565b600060208201905061444b6000830184613e9e565b92915050565b600061445b61446c565b9050614467828261475f565b919050565b6000604051905090565b600067ffffffffffffffff82111561449157614490614923565b5b61449a82614966565b9050602081019050919050565b600067ffffffffffffffff8211156144c2576144c1614923565b5b6144cb82614966565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614531826146c2565b915061453c836146c2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561457157614570614838565b5b828201905092915050565b6000614587826146c2565b9150614592836146c2565b9250826145a2576145a1614867565b5b828204905092915050565b60006145b8826146c2565b91506145c3836146c2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145fc576145fb614838565b5b828202905092915050565b6000614612826146c2565b915061461d836146c2565b9250828210156146305761462f614838565b5b828203905092915050565b6000614646826146a2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061469d82615214565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006146e48261468f565b9050919050565b82818337600083830152505050565b60005b838110156147185780820151818401526020810190506146fd565b83811115614727576000848401525b50505050565b6000600282049050600182168061474557607f821691505b60208210811415614759576147586148c5565b5b50919050565b61476882614966565b810181811067ffffffffffffffff8211171561478757614786614923565b5b80604052505050565b600061479b826146c2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147ce576147cd614838565b5b600182019050919050565b60006147e4826147f5565b9050919050565b6000819050919050565b600061480082614977565b9050919050565b6000614812826146c2565b915061481d836146c2565b92508261482d5761482c614867565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d6178696d756d203230204d696e747320706572204164647265737320616c6c60008201527f6f77656421000000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303720657460208201527f6865722065616368204e46542900000000000000000000000000000000000000604082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e312065746860208201527f657220666f722065616368204e46542900000000000000000000000000000000604082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f53616c6520697320616c7265616479204f70656e210000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b7f596f752068617665206e6f7420776f6e2061206769766561776179204e465421600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b7f4e6f7420656e6f756768205265736572766564204e465473206c65667420746f60008201527f206d696e742e2e00000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d6178696d756d2035204d696e747320706572204164647265737320616c6c6f60008201527f7765642100000000000000000000000000000000000000000000000000000000602082015250565b7f4e46542052657665616c2054696d6520686173206e6f74206265656e2064657460008201527f65726d696e656420796574210000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b7f4e6f2046756e647320746f2077697468647261772c2042616c616e636520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b6003811061522557615224614896565b5b50565b6152318161463b565b811461523c57600080fd5b50565b6152488161464d565b811461525357600080fd5b50565b61525f81614659565b811461526a57600080fd5b50565b61527681614663565b811461528157600080fd5b50565b61528d816146c2565b811461529857600080fd5b50565b6152a4816146cc565b81146152af57600080fd5b5056fea264697066735822122052290c789c2266659585b9bfccbe4ce157ab29651c17f63459e1b4b12ab463ff64736f6c63430008070033697066733a2f2f516d5466336d737162434e6536544a4a48344c68786b50676e44466e4259487375596157383646753971573659692f

Deployed Bytecode

0x60806040526004361061023f5760003560e01c806370a082311161012e578063b3ab66b0116100ab578063dcd4e7321161006f578063dcd4e73214610835578063e985e9c514610851578063eab417821461088e578063f2fde38b146108a5578063ffcd55a8146108ce57610246565b8063b3ab66b01461075f578063b88d4fde1461077b578063bdb4b848146107a4578063c4d8b9df146107cf578063c87b56dd146107f857610246565b80639ff048fc116100f25780639ff048fc146106b4578063a22cb465146106cb578063a475b5dd146106f4578063a99102871461070b578063b0a1c1c41461073457610246565b806370a08231146105df578063715018a61461061c5780637c76f698146106335780638da5cb5b1461065e57806395d89b411461068957610246565b806324b1e567116101bc57806342842e0e1161018057806342842e0e146104f85780634520e91614610521578063603f4d521461054c5780636352211e146105775780637035bf18146105b457610246565b806324b1e567146104015780633023eba61461043e578063326241141461047b57806339a0c6f9146104b85780633ccfd60b146104e157610246565b8063095ea7b311610203578063095ea7b31461033057806318160ddd1461035957806318df64031461038457806319734c8b146103ad57806323b872dd146103d857610246565b80630191a6571461024b57806301ffc9a71461027457806306fdde03146102b157806308003f78146102dc578063081812fc146102f357610246565b3661024657005b600080fd5b34801561025757600080fd5b50610272600480360381019061026d919061354a565b6108f9565b005b34801561028057600080fd5b5061029b60048036038101906102969190613774565b6109b9565b6040516102a89190613fb9565b60405180910390f35b3480156102bd57600080fd5b506102c6610a9b565b6040516102d39190614034565b60405180910390f35b3480156102e857600080fd5b506102f1610b2d565b005b3480156102ff57600080fd5b5061031a60048036038101906103159190613817565b610bb4565b6040516103279190613f52565b60405180910390f35b34801561033c57600080fd5b50610357600480360381019061035291906136cd565b610c39565b005b34801561036557600080fd5b5061036e610d51565b60405161037b9190614436565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a69190613844565b610d5b565b005b3480156103b957600080fd5b506103c2610eef565b6040516103cf9190614436565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa91906135b7565b610ef4565b005b34801561040d57600080fd5b506104286004803603810190610423919061354a565b610f54565b6040516104359190613fb9565b60405180910390f35b34801561044a57600080fd5b506104656004803603810190610460919061354a565b610f74565b6040516104729190614436565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d919061370d565b610f8c565b6040516104af9190613fb9565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906137ce565b61108a565b005b3480156104ed57600080fd5b506104f6611120565b005b34801561050457600080fd5b5061051f600480360381019061051a91906135b7565b611213565b005b34801561052d57600080fd5b50610536611233565b6040516105439190614436565b60405180910390f35b34801561055857600080fd5b506105616112c6565b60405161056e9190614019565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190613817565b6112f6565b6040516105ab9190613f52565b60405180910390f35b3480156105c057600080fd5b506105c96113a8565b6040516105d69190614034565b60405180910390f35b3480156105eb57600080fd5b506106066004803603810190610601919061354a565b611436565b6040516106139190614436565b60405180910390f35b34801561062857600080fd5b506106316114ee565b005b34801561063f57600080fd5b50610648611576565b6040516106559190614436565b60405180910390f35b34801561066a57600080fd5b506106736115c5565b6040516106809190613f52565b60405180910390f35b34801561069557600080fd5b5061069e6115ef565b6040516106ab9190614034565b60405180910390f35b3480156106c057600080fd5b506106c9611681565b005b3480156106d757600080fd5b506106f260048036038101906106ed919061368d565b6117f6565b005b34801561070057600080fd5b50610709611977565b005b34801561071757600080fd5b50610732600480360381019061072d919061354a565b6119fc565b005b34801561074057600080fd5b50610749611ad3565b6040516107569190614436565b60405180910390f35b61077960048036038101906107749190613817565b611b57565b005b34801561078757600080fd5b506107a2600480360381019061079d919061360a565b611dc3565b005b3480156107b057600080fd5b506107b9611e25565b6040516107c69190614436565b60405180910390f35b3480156107db57600080fd5b506107f660048036038101906107f191906137ce565b611eae565b005b34801561080457600080fd5b5061081f600480360381019061081a9190613817565b611f44565b60405161082c9190614034565b60405180910390f35b61084f600480360381019061084a9190613884565b612095565b005b34801561085d57600080fd5b5061087860048036038101906108739190613577565b6123b1565b6040516108859190613fb9565b60405180910390f35b34801561089a57600080fd5b506108a3612445565b005b3480156108b157600080fd5b506108cc60048036038101906108c7919061354a565b61254f565b005b3480156108da57600080fd5b506108e3612647565b6040516108f09190614436565b60405180910390f35b61090161264c565b73ffffffffffffffffffffffffffffffffffffffff1661091f6115c5565b73ffffffffffffffffffffffffffffffffffffffff1614610975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096c90614316565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a945750610a9382612654565b5b9050919050565b606060008054610aaa9061472d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad69061472d565b8015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b5050505050905090565b610b3561264c565b73ffffffffffffffffffffffffffffffffffffffff16610b536115c5565b73ffffffffffffffffffffffffffffffffffffffff1614610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba090614316565b60405180910390fd5b600854600981905550565b6000610bbf826126be565b610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf5906142d6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c44826112f6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac906143b6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd461264c565b73ffffffffffffffffffffffffffffffffffffffff161480610d035750610d0281610cfd61264c565b6123b1565b5b610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d39906141d6565b60405180910390fd5b610d4c838361272a565b505050565b6000600854905090565b610d6361264c565b73ffffffffffffffffffffffffffffffffffffffff16610d816115c5565b73ffffffffffffffffffffffffffffffffffffffff1614610dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dce90614316565b60405180910390fd5b600d5482600c54610de89190614526565b1115610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2090614296565b60405180910390fd5b60005b82811015610eea57610e4c826001600c54610e479190614526565b6127e3565b6001601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e9c9190614526565b92505081905550600160086000828254610eb69190614526565b925050819055506001600c6000828254610ed09190614526565b925050819055508080610ee290614790565b915050610e2c565b505050565b601481565b610f05610eff61264c565b82612801565b610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906143d6565b60405180910390fd5b610f4f8383836128df565b505050565b60146020528060005260406000206000915054906101000a900460ff1681565b60126020528060005260406000206000915090505481565b6000803086604051602001610fa2929190613ebc565b604051602081830303815290604052805190602001209050600181604051602001610fcd9190613f17565b60405160208183030381529060405280519060200120868686604051600081526020016040526040516110039493929190613fd4565b6020604051602081039080840390855afa158015611025573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b61109261264c565b73ffffffffffffffffffffffffffffffffffffffff166110b06115c5565b73ffffffffffffffffffffffffffffffffffffffff1614611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd90614316565b60405180910390fd5b80600b908051906020019061111c929190613334565b5050565b61112861264c565b73ffffffffffffffffffffffffffffffffffffffff166111466115c5565b73ffffffffffffffffffffffffffffffffffffffff161461119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390614316565b60405180910390fd5b60006111a6611ad3565b9050600081116111eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e290614416565b60405180910390fd5b61121073eaedc98671339e4068feae0fa7f4f7e32fa51cc161120b611ad3565b612b3b565b50565b61122e83838360405180602001604052806000815250611dc3565b505050565b600061123d61264c565b73ffffffffffffffffffffffffffffffffffffffff1661125b6115c5565b73ffffffffffffffffffffffffffffffffffffffff16146112b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a890614316565b60405180910390fd5b600c54600d546112c19190614607565b905090565b600080600f5414156112db57600090506112f3565b6010544210156112ee57600190506112f3565b600290505b90565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561139f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139690614256565b60405180910390fd5b80915050919050565b601380546113b59061472d565b80601f01602080910402602001604051908101604052809291908181526020018280546113e19061472d565b801561142e5780601f106114035761010080835404028352916020019161142e565b820191906000526020600020905b81548152906001019060200180831161141157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e90614236565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114f661264c565b73ffffffffffffffffffffffffffffffffffffffff166115146115c5565b73ffffffffffffffffffffffffffffffffffffffff161461156a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156190614316565b60405180910390fd5b6115746000612bec565b565b60008060115414156115bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b490614396565b60405180910390fd5b601154905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115fe9061472d565b80601f016020809104026020016040519081016040528092919081815260200182805461162a9061472d565b80156116775780601f1061164c57610100808354040283529160200191611677565b820191906000526020600020905b81548152906001019060200180831161165a57829003601f168201915b5050505050905090565b60011515601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170b90614216565b60405180910390fd5b600061171e612cb2565b905061172a33826127e3565b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461177a9190614526565b925050819055506001600860008282546117949190614526565b925050819055506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6117fe61264c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561186c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186390614116565b60405180910390fd5b806005600061187961264c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661192661264c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161196b9190613fb9565b60405180910390a35050565b61197f61264c565b73ffffffffffffffffffffffffffffffffffffffff1661199d6115c5565b73ffffffffffffffffffffffffffffffffffffffff16146119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea90614316565b60405180910390fd5b42601181905550565b611a0461264c565b73ffffffffffffffffffffffffffffffffffffffff16611a226115c5565b73ffffffffffffffffffffffffffffffffffffffff1614611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f90614316565b60405180910390fd5b6001601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000611add61264c565b73ffffffffffffffffffffffffffffffffffffffff16611afb6115c5565b73ffffffffffffffffffffffffffffffffffffffff1614611b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4890614316565b60405180910390fd5b47905090565b6000611b616112c6565b9050600280811115611b7657611b75614896565b5b816002811115611b8957611b88614896565b5b14611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090614276565b60405180910390fd5b600c54600d54611bd99190614607565b600954611be69190614607565b82600854611bf49190614526565b1115611c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2c90614156565b60405180910390fd5b601482601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c829190614526565b1115611cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cba906140b6565b60405180910390fd5b81611ccc611e25565b611cd691906145ad565b341015611d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0f90614176565b60405180910390fd5b60005b82811015611dbe576000611d2d612cb2565b9050611d3933826127e3565b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d899190614526565b92505081905550600160086000828254611da39190614526565b92505081905550508080611db690614790565b915050611d1b565b505050565b611dd4611dce61264c565b83612801565b611e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0a906143d6565b60405180910390fd5b611e1f84848484612d0d565b50505050565b600080611e306112c6565b905060006002811115611e4657611e45614896565b5b816002811115611e5957611e58614896565b5b1480611e89575060016002811115611e7457611e73614896565b5b816002811115611e8757611e86614896565b5b145b15611e9e5766f8b0a10e470000915050611eab565b67016345785d8a00009150505b90565b611eb661264c565b73ffffffffffffffffffffffffffffffffffffffff16611ed46115c5565b73ffffffffffffffffffffffffffffffffffffffff1614611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2190614316565b60405180910390fd5b8060139080519060200190611f40929190613334565b5050565b6060611f4f826126be565b611f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8590614356565b60405180910390fd5b60006011541480611fa0575060115442105b156120375760138054611fb29061472d565b80601f0160208091040260200160405190810160405280929190818152602001828054611fde9061472d565b801561202b5780601f106120005761010080835404028352916020019161202b565b820191906000526020600020905b81548152906001019060200180831161200e57829003601f168201915b50505050509050612090565b6000612041612d69565b90506000815111612061576040518060200160405280600081525061208c565b8061206b84612dfb565b60405160200161207c929190613ee8565b6040516020818303038152906040525b9150505b919050565b8282826120a433848484610f8c565b6120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120da906142f6565b60405180910390fd5b60006120ed6112c6565b90506000600281111561210357612102614896565b5b81600281111561211657612115614896565b5b1415612157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214e906143f6565b60405180910390fd5b60028081111561216a57612169614896565b5b81600281111561217d5761217c614896565b5b14156121be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b5906141f6565b60405180910390fd5b600c546009546121ce9190614526565b886008546121dc9190614526565b111561221d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221490614156565b60405180910390fd5b600588601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461226a9190614526565b11156122ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a290614376565b60405180910390fd5b876122b4611e25565b6122be91906145ad565b341015612300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f790614136565b60405180910390fd5b60005b888110156123a6576000612315612cb2565b905061232133826127e3565b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123719190614526565b9250508190555060016008600082825461238b9190614526565b9250508190555050808061239e90614790565b915050612303565b505050505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61244d61264c565b73ffffffffffffffffffffffffffffffffffffffff1661246b6115c5565b73ffffffffffffffffffffffffffffffffffffffff16146124c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b890614316565b60405180910390fd5b600060028111156124d5576124d4614896565b5b6124dd6112c6565b60028111156124ef576124ee614896565b5b1461252f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612526906141b6565b60405180910390fd5b42600f8190555062015180600f546125479190614526565b601081905550565b61255761264c565b73ffffffffffffffffffffffffffffffffffffffff166125756115c5565b73ffffffffffffffffffffffffffffffffffffffff16146125cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c290614316565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561263b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263290614076565b60405180910390fd5b61264481612bec565b50565b600581565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661279d836112f6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6127fd828260405180602001604052806000815250612f5c565b5050565b600061280c826126be565b61284b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284290614196565b60405180910390fd5b6000612856836112f6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128c557508373ffffffffffffffffffffffffffffffffffffffff166128ad84610bb4565b73ffffffffffffffffffffffffffffffffffffffff16145b806128d657506128d581856123b1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128ff826112f6565b73ffffffffffffffffffffffffffffffffffffffff1614612955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294c90614336565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bc906140f6565b60405180910390fd5b6129d0838383612fb7565b6129db60008261272a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a2b9190614607565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a829190614526565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b6190613f3d565b60006040518083038185875af1925050503d8060008114612b9e576040519150601f19603f3d011682016040523d82523d6000602084013e612ba3565b606091505b5050905080612be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bde906140d6565b60405180910390fd5b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600c54600d54612cc3610d51565b612ccd9190614526565b612cd79190614607565b90506000600190505b8015612d0557600182612cf39190614526565b9150612cfe826126be565b9050612ce0565b819250505090565b612d188484846128df565b612d2484848484612fbc565b612d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5a90614056565b60405180910390fd5b50505050565b6060600b8054612d789061472d565b80601f0160208091040260200160405190810160405280929190818152602001828054612da49061472d565b8015612df15780601f10612dc657610100808354040283529160200191612df1565b820191906000526020600020905b815481529060010190602001808311612dd457829003601f168201915b5050505050905090565b60606000821415612e43576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f57565b600082905060005b60008214612e75578080612e5e90614790565b915050600a82612e6e919061457c565b9150612e4b565b60008167ffffffffffffffff811115612e9157612e90614923565b5b6040519080825280601f01601f191660200182016040528015612ec35781602001600182028036833780820191505090505b5090505b60008514612f5057600182612edc9190614607565b9150600a85612eeb9190614807565b6030612ef79190614526565b60f81b818381518110612f0d57612f0c6148f4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f49919061457c565b9450612ec7565b8093505050505b919050565b612f668383613153565b612f736000848484612fbc565b612fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa990614056565b60405180910390fd5b505050565b505050565b6000612fdd8473ffffffffffffffffffffffffffffffffffffffff16613321565b15613146578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261300661264c565b8786866040518563ffffffff1660e01b81526004016130289493929190613f6d565b602060405180830381600087803b15801561304257600080fd5b505af192505050801561307357506040513d601f19601f8201168201806040525081019061307091906137a1565b60015b6130f6573d80600081146130a3576040519150601f19603f3d011682016040523d82523d6000602084013e6130a8565b606091505b506000815114156130ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e590614056565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061314b565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ba906142b6565b60405180910390fd5b6131cc816126be565b1561320c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320390614096565b60405180910390fd5b61321860008383612fb7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132689190614526565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546133409061472d565b90600052602060002090601f01602090048101928261336257600085556133a9565b82601f1061337b57805160ff19168380011785556133a9565b828001600101855582156133a9579182015b828111156133a857825182559160200191906001019061338d565b5b5090506133b691906133ba565b5090565b5b808211156133d35760008160009055506001016133bb565b5090565b60006133ea6133e584614476565b614451565b90508281526020810184848401111561340657613405614957565b5b6134118482856146eb565b509392505050565b600061342c613427846144a7565b614451565b90508281526020810184848401111561344857613447614957565b5b6134538482856146eb565b509392505050565b60008135905061346a81615228565b92915050565b60008135905061347f8161523f565b92915050565b60008135905061349481615256565b92915050565b6000813590506134a98161526d565b92915050565b6000815190506134be8161526d565b92915050565b600082601f8301126134d9576134d8614952565b5b81356134e98482602086016133d7565b91505092915050565b600082601f83011261350757613506614952565b5b8135613517848260208601613419565b91505092915050565b60008135905061352f81615284565b92915050565b6000813590506135448161529b565b92915050565b6000602082840312156135605761355f614961565b5b600061356e8482850161345b565b91505092915050565b6000806040838503121561358e5761358d614961565b5b600061359c8582860161345b565b92505060206135ad8582860161345b565b9150509250929050565b6000806000606084860312156135d0576135cf614961565b5b60006135de8682870161345b565b93505060206135ef8682870161345b565b925050604061360086828701613520565b9150509250925092565b6000806000806080858703121561362457613623614961565b5b60006136328782880161345b565b94505060206136438782880161345b565b935050604061365487828801613520565b925050606085013567ffffffffffffffff8111156136755761367461495c565b5b613681878288016134c4565b91505092959194509250565b600080604083850312156136a4576136a3614961565b5b60006136b28582860161345b565b92505060206136c385828601613470565b9150509250929050565b600080604083850312156136e4576136e3614961565b5b60006136f28582860161345b565b925050602061370385828601613520565b9150509250929050565b6000806000806080858703121561372757613726614961565b5b60006137358782880161345b565b945050602061374687828801613535565b935050604061375787828801613485565b925050606061376887828801613485565b91505092959194509250565b60006020828403121561378a57613789614961565b5b60006137988482850161349a565b91505092915050565b6000602082840312156137b7576137b6614961565b5b60006137c5848285016134af565b91505092915050565b6000602082840312156137e4576137e3614961565b5b600082013567ffffffffffffffff8111156138025761380161495c565b5b61380e848285016134f2565b91505092915050565b60006020828403121561382d5761382c614961565b5b600061383b84828501613520565b91505092915050565b6000806040838503121561385b5761385a614961565b5b600061386985828601613520565b925050602061387a8582860161345b565b9150509250929050565b6000806000806080858703121561389e5761389d614961565b5b60006138ac87828801613520565b94505060206138bd87828801613535565b93505060406138ce87828801613485565b92505060606138df87828801613485565b91505092959194509250565b6138f48161463b565b82525050565b61390b6139068261463b565b6147d9565b82525050565b61391a8161464d565b82525050565b61392981614659565b82525050565b61394061393b82614659565b6147eb565b82525050565b6000613951826144d8565b61395b81856144ee565b935061396b8185602086016146fa565b61397481614966565b840191505092915050565b613988816146d9565b82525050565b6000613999826144e3565b6139a3818561450a565b93506139b38185602086016146fa565b6139bc81614966565b840191505092915050565b60006139d2826144e3565b6139dc818561451b565b93506139ec8185602086016146fa565b80840191505092915050565b6000613a05601c8361451b565b9150613a1082614984565b601c82019050919050565b6000613a2860328361450a565b9150613a33826149ad565b604082019050919050565b6000613a4b60268361450a565b9150613a56826149fc565b604082019050919050565b6000613a6e601c8361450a565b9150613a7982614a4b565b602082019050919050565b6000613a9160258361450a565b9150613a9c82614a74565b604082019050919050565b6000613ab460148361450a565b9150613abf82614ac3565b602082019050919050565b6000613ad760248361450a565b9150613ae282614aec565b604082019050919050565b6000613afa60198361450a565b9150613b0582614b3b565b602082019050919050565b6000613b1d604d8361450a565b9150613b2882614b64565b606082019050919050565b6000613b40601e8361450a565b9150613b4b82614bd9565b602082019050919050565b6000613b6360508361450a565b9150613b6e82614c02565b606082019050919050565b6000613b86602c8361450a565b9150613b9182614c77565b604082019050919050565b6000613ba960158361450a565b9150613bb482614cc6565b602082019050919050565b6000613bcc60388361450a565b9150613bd782614cef565b604082019050919050565b6000613bef602a8361450a565b9150613bfa82614d3e565b604082019050919050565b6000613c1260208361450a565b9150613c1d82614d8d565b602082019050919050565b6000613c35602a8361450a565b9150613c4082614db6565b604082019050919050565b6000613c5860298361450a565b9150613c6382614e05565b604082019050919050565b6000613c7b601c8361450a565b9150613c8682614e54565b602082019050919050565b6000613c9e60278361450a565b9150613ca982614e7d565b604082019050919050565b6000613cc160208361450a565b9150613ccc82614ecc565b602082019050919050565b6000613ce4602c8361450a565b9150613cef82614ef5565b604082019050919050565b6000613d0760058361451b565b9150613d1282614f44565b600582019050919050565b6000613d2a60118361450a565b9150613d3582614f6d565b602082019050919050565b6000613d4d60208361450a565b9150613d5882614f96565b602082019050919050565b6000613d7060298361450a565b9150613d7b82614fbf565b604082019050919050565b6000613d93602f8361450a565b9150613d9e8261500e565b604082019050919050565b6000613db660248361450a565b9150613dc18261505d565b604082019050919050565b6000613dd9602c8361450a565b9150613de4826150ac565b604082019050919050565b6000613dfc60218361450a565b9150613e07826150fb565b604082019050919050565b6000613e1f6000836144ff565b9150613e2a8261514a565b600082019050919050565b6000613e4260318361450a565b9150613e4d8261514d565b604082019050919050565b6000613e6560158361450a565b9150613e708261519c565b602082019050919050565b6000613e8860228361450a565b9150613e93826151c5565b604082019050919050565b613ea7816146c2565b82525050565b613eb6816146cc565b82525050565b6000613ec882856138fa565b601482019150613ed882846138fa565b6014820191508190509392505050565b6000613ef482856139c7565b9150613f0082846139c7565b9150613f0b82613cfa565b91508190509392505050565b6000613f22826139f8565b9150613f2e828461392f565b60208201915081905092915050565b6000613f4882613e12565b9150819050919050565b6000602082019050613f6760008301846138eb565b92915050565b6000608082019050613f8260008301876138eb565b613f8f60208301866138eb565b613f9c6040830185613e9e565b8181036060830152613fae8184613946565b905095945050505050565b6000602082019050613fce6000830184613911565b92915050565b6000608082019050613fe96000830187613920565b613ff66020830186613ead565b6140036040830185613920565b6140106060830184613920565b95945050505050565b600060208201905061402e600083018461397f565b92915050565b6000602082019050818103600083015261404e818461398e565b905092915050565b6000602082019050818103600083015261406f81613a1b565b9050919050565b6000602082019050818103600083015261408f81613a3e565b9050919050565b600060208201905081810360008301526140af81613a61565b9050919050565b600060208201905081810360008301526140cf81613a84565b9050919050565b600060208201905081810360008301526140ef81613aa7565b9050919050565b6000602082019050818103600083015261410f81613aca565b9050919050565b6000602082019050818103600083015261412f81613aed565b9050919050565b6000602082019050818103600083015261414f81613b10565b9050919050565b6000602082019050818103600083015261416f81613b33565b9050919050565b6000602082019050818103600083015261418f81613b56565b9050919050565b600060208201905081810360008301526141af81613b79565b9050919050565b600060208201905081810360008301526141cf81613b9c565b9050919050565b600060208201905081810360008301526141ef81613bbf565b9050919050565b6000602082019050818103600083015261420f81613be2565b9050919050565b6000602082019050818103600083015261422f81613c05565b9050919050565b6000602082019050818103600083015261424f81613c28565b9050919050565b6000602082019050818103600083015261426f81613c4b565b9050919050565b6000602082019050818103600083015261428f81613c6e565b9050919050565b600060208201905081810360008301526142af81613c91565b9050919050565b600060208201905081810360008301526142cf81613cb4565b9050919050565b600060208201905081810360008301526142ef81613cd7565b9050919050565b6000602082019050818103600083015261430f81613d1d565b9050919050565b6000602082019050818103600083015261432f81613d40565b9050919050565b6000602082019050818103600083015261434f81613d63565b9050919050565b6000602082019050818103600083015261436f81613d86565b9050919050565b6000602082019050818103600083015261438f81613da9565b9050919050565b600060208201905081810360008301526143af81613dcc565b9050919050565b600060208201905081810360008301526143cf81613def565b9050919050565b600060208201905081810360008301526143ef81613e35565b9050919050565b6000602082019050818103600083015261440f81613e58565b9050919050565b6000602082019050818103600083015261442f81613e7b565b9050919050565b600060208201905061444b6000830184613e9e565b92915050565b600061445b61446c565b9050614467828261475f565b919050565b6000604051905090565b600067ffffffffffffffff82111561449157614490614923565b5b61449a82614966565b9050602081019050919050565b600067ffffffffffffffff8211156144c2576144c1614923565b5b6144cb82614966565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614531826146c2565b915061453c836146c2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561457157614570614838565b5b828201905092915050565b6000614587826146c2565b9150614592836146c2565b9250826145a2576145a1614867565b5b828204905092915050565b60006145b8826146c2565b91506145c3836146c2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145fc576145fb614838565b5b828202905092915050565b6000614612826146c2565b915061461d836146c2565b9250828210156146305761462f614838565b5b828203905092915050565b6000614646826146a2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061469d82615214565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006146e48261468f565b9050919050565b82818337600083830152505050565b60005b838110156147185780820151818401526020810190506146fd565b83811115614727576000848401525b50505050565b6000600282049050600182168061474557607f821691505b60208210811415614759576147586148c5565b5b50919050565b61476882614966565b810181811067ffffffffffffffff8211171561478757614786614923565b5b80604052505050565b600061479b826146c2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147ce576147cd614838565b5b600182019050919050565b60006147e4826147f5565b9050919050565b6000819050919050565b600061480082614977565b9050919050565b6000614812826146c2565b915061481d836146c2565b92508261482d5761482c614867565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d6178696d756d203230204d696e747320706572204164647265737320616c6c60008201527f6f77656421000000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303720657460208201527f6865722065616368204e46542900000000000000000000000000000000000000604082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e312065746860208201527f657220666f722065616368204e46542900000000000000000000000000000000604082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f53616c6520697320616c7265616479204f70656e210000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b7f596f752068617665206e6f7420776f6e2061206769766561776179204e465421600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b7f4e6f7420656e6f756768205265736572766564204e465473206c65667420746f60008201527f206d696e742e2e00000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d6178696d756d2035204d696e747320706572204164647265737320616c6c6f60008201527f7765642100000000000000000000000000000000000000000000000000000000602082015250565b7f4e46542052657665616c2054696d6520686173206e6f74206265656e2064657460008201527f65726d696e656420796574210000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b7f4e6f2046756e647320746f2077697468647261772c2042616c616e636520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b6003811061522557615224614896565b5b50565b6152318161463b565b811461523c57600080fd5b50565b6152488161464d565b811461525357600080fd5b50565b61525f81614659565b811461526a57600080fd5b50565b61527681614663565b811461528157600080fd5b50565b61528d816146c2565b811461529857600080fd5b50565b6152a4816146cc565b81146152af57600080fd5b5056fea264697066735822122052290c789c2266659585b9bfccbe4ce157ab29651c17f63459e1b4b12ab463ff64736f6c63430008070033

Deployed Bytecode Sourcemap

34788:10184:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37037:8;;;43567:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22903:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23854:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42669:94;;;;;;;;;;;;;:::i;:::-;;25169:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24692:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43726:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42175:431;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35523:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26059:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36542:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36250:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38810:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37264:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42982:253;;;;;;;;;;;;;:::i;:::-;;26469:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43887:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44097:310;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23548:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36458:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23278:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4591:94;;;;;;;;;;;;;:::i;:::-;;44786:172;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3940:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24023:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41039:319;;;;;;;;;;;;;:::i;:::-;;25462:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38139:82;;;;;;;;;;;;;:::i;:::-;;41413:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42813:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40165:806;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26725:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44456:284;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37381:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41530:600;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39175:931;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25828:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37879:229;;;;;;;;;;;;;:::i;:::-;;4840:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35474:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43567:87;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43640:6:::1;43632:5;;:14;;;;;;;;;;;;;;;;;;43567:87:::0;:::o;22903:305::-;23005:4;23057:25;23042:40;;;:11;:40;;;;:105;;;;23114:33;23099:48;;;:11;:48;;;;23042:105;:158;;;;23164:36;23188:11;23164:23;:36::i;:::-;23042:158;23022:178;;22903:305;;;:::o;23854:100::-;23908:13;23941:5;23934:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23854:100;:::o;42669:94::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42736:19:::1;;42719:14;:36;;;;42669:94::o:0;25169:221::-;25245:7;25273:16;25281:7;25273;:16::i;:::-;25265:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25358:15;:24;25374:7;25358:24;;;;;;;;;;;;;;;;;;;;;25351:31;;25169:221;;;:::o;24692:411::-;24773:13;24789:23;24804:7;24789:14;:23::i;:::-;24773:39;;24837:5;24831:11;;:2;:11;;;;24823:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24931:5;24915:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24940:37;24957:5;24964:12;:10;:12::i;:::-;24940:16;:37::i;:::-;24915:62;24893:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25074:21;25083:2;25087:7;25074:8;:21::i;:::-;24762:341;24692:411;;:::o;43726:94::-;43769:4;43793:19;;43786:26;;43726:94;:::o;42175:431::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42292:16:::1;;42282:6;42265:14;;:23;;;;:::i;:::-;:43;;42257:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;42370:6;42365:220;42386:6;42382:1;:10;42365:220;;;42414:40;42424:9;42452:1;42435:14;;:18;;;;:::i;:::-;42414:9;:40::i;:::-;42499:1;42469:15;:26;42485:9;42469:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;42538:1;42515:19;;:24;;;;;;;:::i;:::-;;;;;;;;42572:1;42554:14;;:19;;;;;;;:::i;:::-;;;;;;;;42394:3;;;;;:::i;:::-;;;;42365:220;;;;42175:431:::0;;:::o;35523:46::-;35567:2;35523:46;:::o;26059:339::-;26254:41;26273:12;:10;:12::i;:::-;26287:7;26254:18;:41::i;:::-;26246:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26362:28;26372:4;26378:2;26382:7;26362:9;:28::i;:::-;26059:339;;;:::o;36542:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;36250:50::-;;;;;;;;;;;;;;;;;:::o;38810:306::-;38909:4;38926:12;38976:4;38983;38951:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38941:48;;;;;;38926:63;;39016:92;39089:4;39036:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;39026:69;;;;;;39097:2;39101;39105;39016:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39007:101;;:5;;;;;;;;;;;:101;;;39000:108;;;38810:306;;;;;;:::o;37264:109::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37357:8:::1;37339:15;:26;;;;;;;;;;;;:::i;:::-;;37264:109:::0;:::o;42982:253::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43030:15:::1;43048:16;:14;:16::i;:::-;43030:34;;43093:1;43083:7;:11;43075:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43146:80;43164:42;43209:16;:14;:16::i;:::-;43146:9;:80::i;:::-;43019:216;42982:253::o:0;26469:185::-;26607:39;26624:4;26630:2;26634:7;26607:39;;;;;;;;;;;;:16;:39::i;:::-;26469:185;;;:::o;43887:124::-;43946:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43989:14:::1;;43970:16;;:33;;;;:::i;:::-;43963:40;;43887:124:::0;:::o;44097:310::-;44138:5;44180:1;44159:17;;:22;44155:245;;;44205:12;44198:19;;;;44155:245;44266:20;;44248:15;:38;44244:156;;;44310:13;44303:20;;;;44244:156;44372:16;44365:23;;44097:310;;:::o;23548:239::-;23620:7;23640:13;23656:7;:16;23664:7;23656:16;;;;;;;;;;;;;;;;;;;;;23640:32;;23708:1;23691:19;;:5;:19;;;;23683:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23774:5;23767:12;;;23548:239;;;:::o;36458:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23278:208::-;23350:7;23395:1;23378:19;;:5;:19;;;;23370:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23462:9;:16;23472:5;23462:16;;;;;;;;;;;;;;;;23455:23;;23278:208;;;:::o;4591:94::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4656:21:::1;4674:1;4656:9;:21::i;:::-;4591:94::o:0;44786:172::-;44830:7;44872:1;44858:10;;:15;;44850:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;44940:10;;44933:17;;44786:172;:::o;3940:87::-;3986:7;4013:6;;;;;;;;;;;4006:13;;3940:87;:::o;24023:104::-;24079:13;24112:7;24105:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24023:104;:::o;41039:319::-;41114:4;41089:29;;:9;:21;41099:10;41089:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;41081:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41166:11;41180:9;:7;:9::i;:::-;41166:23;;41200:26;41210:10;41222:3;41200:9;:26::i;:::-;41268:1;41237:15;:27;41253:10;41237:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;41303:1;41280:19;;:24;;;;;;;:::i;:::-;;;;;;;;41345:5;41321:9;:21;41331:10;41321:21;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41070:288;41039:319::o;25462:295::-;25577:12;:10;:12::i;:::-;25565:24;;:8;:24;;;;25557:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25677:8;25632:18;:32;25651:12;:10;:12::i;:::-;25632:32;;;;;;;;;;;;;;;:42;25665:8;25632:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25730:8;25701:48;;25716:12;:10;:12::i;:::-;25701:48;;;25740:8;25701:48;;;;;;:::i;:::-;;;;;;;;25462:295;;:::o;38139:82::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38198:15:::1;38185:10;:28;;;;38139:82::o:0;41413:105::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41506:4:::1;41483:9;:20;41493:9;41483:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;41413:105:::0;:::o;42813:109::-;42869:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42893:21:::1;42886:28;;42813:109:::0;:::o;40165:806::-;40231:16;40250:11;:9;:11::i;:::-;40231:30;;40294:16;40280:30;;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;40272:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;40431:14;;40412:16;;:33;;;;:::i;:::-;40394:14;;:52;;;;:::i;:::-;40384:6;40362:19;;:28;;;;:::i;:::-;:84;;40354:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;35567:2;40530:6;40500:15;:27;40516:10;40500:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:57;;40492:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;40644:6;40631:10;:8;:10::i;:::-;:19;;;;:::i;:::-;40618:9;:32;;40610:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;40755:9;40750:214;40774:6;40770:1;:10;40750:214;;;40802:11;40816:9;:7;:9::i;:::-;40802:23;;40840:26;40850:10;40862:3;40840:9;:26::i;:::-;40912:1;40881:15;:27;40897:10;40881:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;40951:1;40928:19;;:24;;;;;;;:::i;:::-;;;;;;;;40787:177;40782:3;;;;;:::i;:::-;;;;40750:214;;;;40220:751;40165:806;:::o;26725:328::-;26900:41;26919:12;:10;:12::i;:::-;26933:7;26900:18;:41::i;:::-;26892:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27006:39;27020:4;27026:2;27030:7;27039:5;27006:13;:39::i;:::-;26725:328;;;;:::o;44456:284::-;44496:4;44513:16;44532:11;:9;:11::i;:::-;44513:30;;44572:12;44558:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;:57;;;;44602:13;44588:27;;;;;;;;:::i;:::-;;:10;:27;;;;;;;;:::i;:::-;;;44558:57;44554:179;;;35342:10;44632:22;;;;;44554:179;35402:9;44696:25;;;44456:284;;:::o;37381:125::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37484:14:::1;37468:13;:30;;;;;;;;;;;;:::i;:::-;;37381:125:::0;:::o;41530:600::-;41604:13;41638:17;41646:8;41638:7;:17::i;:::-;41630:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;41833:1;41819:10;;:15;:47;;;;41856:10;;41838:15;:28;41819:47;41815:304;;;41890:13;41883:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41815:304;41955:21;41979:10;:8;:10::i;:::-;41955:34;;42035:1;42017:7;42011:21;:25;:96;;;;;;;;;;;;;;;;;42063:7;42072:19;:8;:17;:19::i;:::-;42046:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42011:96;42004:103;;;41530:600;;;;:::o;39175:931::-;39262:2;39267;39271;38312:41;38333:10;38344:2;38347;38350;38312:20;:41::i;:::-;38303:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39301:16:::1;39320:11;:9;:11::i;:::-;39301:30;;39364:12;39350:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;39342:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;39435:16;39421:30:::0;::::1;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;39413:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39566:14;;39549;;:31;;;;:::i;:::-;39539:6;39517:19;;:28;;;;:::i;:::-;:63;;39509:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;35515:1;39664:6;39634:15;:27;39650:10;39634:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:54;;39626:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39774:6;39761:10;:8;:10::i;:::-;:19;;;;:::i;:::-;39748:9;:32;;39740:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;39888:9;39883:214;39907:6;39903:1;:10;39883:214;;;39935:11;39949:9;:7;:9::i;:::-;39935:23;;39973:26;39983:10;39995:3;39973:9;:26::i;:::-;40045:1;40014:15;:27;40030:10;40014:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;40084:1;40061:19;;:24;;;;;;;:::i;:::-;;;;;;;;39920:177;39915:3;;;;;:::i;:::-;;;;39883:214;;;;39290:816;39175:931:::0;;;;;;;:::o;25828:164::-;25925:4;25949:18;:25;25968:5;25949:25;;;;;;;;;;;;;;;:35;25975:8;25949:35;;;;;;;;;;;;;;;;;;;;;;;;;25942:42;;25828:164;;;;:::o;37879:229::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37957:12:::1;37942:27;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:27;;;;;;;;:::i;:::-;;;37934:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38026:15;38006:17;:35;;;;38095:5;38075:17;;:25;;;;:::i;:::-;38052:20;:48;;;;37879:229::o:0;4840:192::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4949:1:::1;4929:22;;:8;:22;;;;4921:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5005:19;5015:8;5005:9;:19::i;:::-;4840:192:::0;:::o;35474:42::-;35515:1;35474:42;:::o;2728:98::-;2781:7;2808:10;2801:17;;2728:98;:::o;15926:157::-;16011:4;16050:25;16035:40;;;:11;:40;;;;16028:47;;15926:157;;;:::o;28563:127::-;28628:4;28680:1;28652:30;;:7;:16;28660:7;28652:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28645:37;;28563:127;;;:::o;32545:174::-;32647:2;32620:15;:24;32636:7;32620:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32703:7;32699:2;32665:46;;32674:23;32689:7;32674:14;:23::i;:::-;32665:46;;;;;;;;;;;;32545:174;;:::o;29547:110::-;29623:26;29633:2;29637:7;29623:26;;;;;;;;;;;;:9;:26::i;:::-;29547:110;;:::o;28857:348::-;28950:4;28975:16;28983:7;28975;:16::i;:::-;28967:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29051:13;29067:23;29082:7;29067:14;:23::i;:::-;29051:39;;29120:5;29109:16;;:7;:16;;;:51;;;;29153:7;29129:31;;:20;29141:7;29129:11;:20::i;:::-;:31;;;29109:51;:87;;;;29164:32;29181:5;29188:7;29164:16;:32::i;:::-;29109:87;29101:96;;;28857:348;;;;:::o;31849:578::-;32008:4;31981:31;;:23;31996:7;31981:14;:23::i;:::-;:31;;;31973:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32091:1;32077:16;;:2;:16;;;;32069:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32147:39;32168:4;32174:2;32178:7;32147:20;:39::i;:::-;32251:29;32268:1;32272:7;32251:8;:29::i;:::-;32312:1;32293:9;:15;32303:4;32293:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32341:1;32324:9;:13;32334:2;32324:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32372:2;32353:7;:16;32361:7;32353:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32411:7;32407:2;32392:27;;32401:4;32392:27;;;;;;;;;;;;31849:578;;;:::o;43310:183::-;43391:9;43406:7;:12;;43426:6;43406:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43390:47;;;43456:4;43448:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;43379:114;43310:183;;:::o;5040:173::-;5096:16;5115:6;;;;;;;;;;;5096:25;;5141:8;5132:6;;:17;;;;;;;;;;;;;;;;;;5196:8;5165:40;;5186:8;5165:40;;;;;;;;;;;;5085:128;5040:173;:::o;37562:309::-;37603:7;37623:14;37675;;37656:16;;37640:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:49;;;;:::i;:::-;37623:66;;37700:11;37714:4;37700:18;;37729:98;37736:6;37729:98;;;37772:1;37759:14;;;;;:::i;:::-;;;37797:18;37805:9;37797:7;:18::i;:::-;37788:27;;37729:98;;;37854:9;37847:16;;;;37562:309;:::o;27935:315::-;28092:28;28102:4;28108:2;28112:7;28092:9;:28::i;:::-;28139:48;28162:4;28168:2;28172:7;28181:5;28139:22;:48::i;:::-;28131:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27935:315;;;;:::o;37090:116::-;37150:13;37183:15;37176:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37090:116;:::o;344:723::-;400:13;630:1;621:5;:10;617:53;;;648:10;;;;;;;;;;;;;;;;;;;;;617:53;680:12;695:5;680:20;;711:14;736:78;751:1;743:4;:9;736:78;;769:8;;;;;:::i;:::-;;;;800:2;792:10;;;;;:::i;:::-;;;736:78;;;824:19;856:6;846:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;824:39;;874:154;890:1;881:5;:10;874:154;;918:1;908:11;;;;;:::i;:::-;;;985:2;977:5;:10;;;;:::i;:::-;964:2;:24;;;;:::i;:::-;951:39;;934:6;941;934:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1014:2;1005:11;;;;;:::i;:::-;;;874:154;;;1052:6;1038:21;;;;;344:723;;;;:::o;29884:321::-;30014:18;30020:2;30024:7;30014:5;:18::i;:::-;30065:54;30096:1;30100:2;30104:7;30113:5;30065:22;:54::i;:::-;30043:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29884:321;;;:::o;34655:126::-;;;;:::o;33284:799::-;33439:4;33460:15;:2;:13;;;:15::i;:::-;33456:620;;;33512:2;33496:36;;;33533:12;:10;:12::i;:::-;33547:4;33553:7;33562:5;33496:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33492:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33755:1;33738:6;:13;:18;33734:272;;;33781:60;;;;;;;;;;:::i;:::-;;;;;;;;33734:272;33956:6;33950:13;33941:6;33937:2;33933:15;33926:38;33492:529;33629:41;;;33619:51;;;:6;:51;;;;33612:58;;;;;33456:620;34060:4;34053:11;;33284:799;;;;;;;:::o;30541:382::-;30635:1;30621:16;;:2;:16;;;;30613:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30694:16;30702:7;30694;:16::i;:::-;30693:17;30685:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30756:45;30785:1;30789:2;30793:7;30756:20;:45::i;:::-;30831:1;30814:9;:13;30824:2;30814:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30862:2;30843:7;:16;30851:7;30843:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30907:7;30903:2;30882:33;;30899:1;30882:33;;;;;;;;;;;;30541:382;;:::o;5986:387::-;6046:4;6254:12;6321:7;6309:20;6301:28;;6364:1;6357:4;:8;6350:15;;;5986:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:135::-;2466:5;2504:6;2491:20;2482:29;;2520:31;2545:5;2520:31;:::i;:::-;2422:135;;;;:::o;2563:329::-;2622:6;2671:2;2659:9;2650:7;2646:23;2642:32;2639:119;;;2677:79;;:::i;:::-;2639:119;2797:1;2822:53;2867:7;2858:6;2847:9;2843:22;2822:53;:::i;:::-;2812:63;;2768:117;2563:329;;;;:::o;2898:474::-;2966:6;2974;3023:2;3011:9;3002:7;2998:23;2994:32;2991:119;;;3029:79;;:::i;:::-;2991:119;3149:1;3174:53;3219:7;3210:6;3199:9;3195:22;3174:53;:::i;:::-;3164:63;;3120:117;3276:2;3302:53;3347:7;3338:6;3327:9;3323:22;3302:53;:::i;:::-;3292:63;;3247:118;2898:474;;;;;:::o;3378:619::-;3455:6;3463;3471;3520:2;3508:9;3499:7;3495:23;3491:32;3488:119;;;3526:79;;:::i;:::-;3488:119;3646:1;3671:53;3716:7;3707:6;3696:9;3692:22;3671:53;:::i;:::-;3661:63;;3617:117;3773:2;3799:53;3844:7;3835:6;3824:9;3820:22;3799:53;:::i;:::-;3789:63;;3744:118;3901:2;3927:53;3972:7;3963:6;3952:9;3948:22;3927:53;:::i;:::-;3917:63;;3872:118;3378:619;;;;;:::o;4003:943::-;4098:6;4106;4114;4122;4171:3;4159:9;4150:7;4146:23;4142:33;4139:120;;;4178:79;;:::i;:::-;4139:120;4298:1;4323:53;4368:7;4359:6;4348:9;4344:22;4323:53;:::i;:::-;4313:63;;4269:117;4425:2;4451:53;4496:7;4487:6;4476:9;4472:22;4451:53;:::i;:::-;4441:63;;4396:118;4553:2;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4524:118;4709:2;4698:9;4694:18;4681:32;4740:18;4732:6;4729:30;4726:117;;;4762:79;;:::i;:::-;4726:117;4867:62;4921:7;4912:6;4901:9;4897:22;4867:62;:::i;:::-;4857:72;;4652:287;4003:943;;;;;;;:::o;4952:468::-;5017:6;5025;5074:2;5062:9;5053:7;5049:23;5045:32;5042:119;;;5080:79;;:::i;:::-;5042:119;5200:1;5225:53;5270:7;5261:6;5250:9;5246:22;5225:53;:::i;:::-;5215:63;;5171:117;5327:2;5353:50;5395:7;5386:6;5375:9;5371:22;5353:50;:::i;:::-;5343:60;;5298:115;4952:468;;;;;:::o;5426:474::-;5494:6;5502;5551:2;5539:9;5530:7;5526:23;5522:32;5519:119;;;5557:79;;:::i;:::-;5519:119;5677:1;5702:53;5747:7;5738:6;5727:9;5723:22;5702:53;:::i;:::-;5692:63;;5648:117;5804:2;5830:53;5875:7;5866:6;5855:9;5851:22;5830:53;:::i;:::-;5820:63;;5775:118;5426:474;;;;;:::o;5906:761::-;5990:6;5998;6006;6014;6063:3;6051:9;6042:7;6038:23;6034:33;6031:120;;;6070:79;;:::i;:::-;6031:120;6190:1;6215:53;6260:7;6251:6;6240:9;6236:22;6215:53;:::i;:::-;6205:63;;6161:117;6317:2;6343:51;6386:7;6377:6;6366:9;6362:22;6343:51;:::i;:::-;6333:61;;6288:116;6443:2;6469:53;6514:7;6505:6;6494:9;6490:22;6469:53;:::i;:::-;6459:63;;6414:118;6571:2;6597:53;6642:7;6633:6;6622:9;6618:22;6597:53;:::i;:::-;6587:63;;6542:118;5906:761;;;;;;;:::o;6673:327::-;6731:6;6780:2;6768:9;6759:7;6755:23;6751:32;6748:119;;;6786:79;;:::i;:::-;6748:119;6906:1;6931:52;6975:7;6966:6;6955:9;6951:22;6931:52;:::i;:::-;6921:62;;6877:116;6673:327;;;;:::o;7006:349::-;7075:6;7124:2;7112:9;7103:7;7099:23;7095:32;7092:119;;;7130:79;;:::i;:::-;7092:119;7250:1;7275:63;7330:7;7321:6;7310:9;7306:22;7275:63;:::i;:::-;7265:73;;7221:127;7006:349;;;;:::o;7361:509::-;7430:6;7479:2;7467:9;7458:7;7454:23;7450:32;7447:119;;;7485:79;;:::i;:::-;7447:119;7633:1;7622:9;7618:17;7605:31;7663:18;7655:6;7652:30;7649:117;;;7685:79;;:::i;:::-;7649:117;7790:63;7845:7;7836:6;7825:9;7821:22;7790:63;:::i;:::-;7780:73;;7576:287;7361:509;;;;:::o;7876:329::-;7935:6;7984:2;7972:9;7963:7;7959:23;7955:32;7952:119;;;7990:79;;:::i;:::-;7952:119;8110:1;8135:53;8180:7;8171:6;8160:9;8156:22;8135:53;:::i;:::-;8125:63;;8081:117;7876:329;;;;:::o;8211:474::-;8279:6;8287;8336:2;8324:9;8315:7;8311:23;8307:32;8304:119;;;8342:79;;:::i;:::-;8304:119;8462:1;8487:53;8532:7;8523:6;8512:9;8508:22;8487:53;:::i;:::-;8477:63;;8433:117;8589:2;8615:53;8660:7;8651:6;8640:9;8636:22;8615:53;:::i;:::-;8605:63;;8560:118;8211:474;;;;;:::o;8691:761::-;8775:6;8783;8791;8799;8848:3;8836:9;8827:7;8823:23;8819:33;8816:120;;;8855:79;;:::i;:::-;8816:120;8975:1;9000:53;9045:7;9036:6;9025:9;9021:22;9000:53;:::i;:::-;8990:63;;8946:117;9102:2;9128:51;9171:7;9162:6;9151:9;9147:22;9128:51;:::i;:::-;9118:61;;9073:116;9228:2;9254:53;9299:7;9290:6;9279:9;9275:22;9254:53;:::i;:::-;9244:63;;9199:118;9356:2;9382:53;9427:7;9418:6;9407:9;9403:22;9382:53;:::i;:::-;9372:63;;9327:118;8691:761;;;;;;;:::o;9458:118::-;9545:24;9563:5;9545:24;:::i;:::-;9540:3;9533:37;9458:118;;:::o;9582:157::-;9687:45;9707:24;9725:5;9707:24;:::i;:::-;9687:45;:::i;:::-;9682:3;9675:58;9582:157;;:::o;9745:109::-;9826:21;9841:5;9826:21;:::i;:::-;9821:3;9814:34;9745:109;;:::o;9860:118::-;9947:24;9965:5;9947:24;:::i;:::-;9942:3;9935:37;9860:118;;:::o;9984:157::-;10089:45;10109:24;10127:5;10109:24;:::i;:::-;10089:45;:::i;:::-;10084:3;10077:58;9984:157;;:::o;10147:360::-;10233:3;10261:38;10293:5;10261:38;:::i;:::-;10315:70;10378:6;10373:3;10315:70;:::i;:::-;10308:77;;10394:52;10439:6;10434:3;10427:4;10420:5;10416:16;10394:52;:::i;:::-;10471:29;10493:6;10471:29;:::i;:::-;10466:3;10462:39;10455:46;;10237:270;10147:360;;;;:::o;10513:147::-;10608:45;10647:5;10608:45;:::i;:::-;10603:3;10596:58;10513:147;;:::o;10666:364::-;10754:3;10782:39;10815:5;10782:39;:::i;:::-;10837:71;10901:6;10896:3;10837:71;:::i;:::-;10830:78;;10917:52;10962:6;10957:3;10950:4;10943:5;10939:16;10917:52;:::i;:::-;10994:29;11016:6;10994:29;:::i;:::-;10989:3;10985:39;10978:46;;10758:272;10666:364;;;;:::o;11036:377::-;11142:3;11170:39;11203:5;11170:39;:::i;:::-;11225:89;11307:6;11302:3;11225:89;:::i;:::-;11218:96;;11323:52;11368:6;11363:3;11356:4;11349:5;11345:16;11323:52;:::i;:::-;11400:6;11395:3;11391:16;11384:23;;11146:267;11036:377;;;;:::o;11419:402::-;11579:3;11600:85;11682:2;11677:3;11600:85;:::i;:::-;11593:92;;11694:93;11783:3;11694:93;:::i;:::-;11812:2;11807:3;11803:12;11796:19;;11419:402;;;:::o;11827:366::-;11969:3;11990:67;12054:2;12049:3;11990:67;:::i;:::-;11983:74;;12066:93;12155:3;12066:93;:::i;:::-;12184:2;12179:3;12175:12;12168:19;;11827:366;;;:::o;12199:::-;12341:3;12362:67;12426:2;12421:3;12362:67;:::i;:::-;12355:74;;12438:93;12527:3;12438:93;:::i;:::-;12556:2;12551:3;12547:12;12540:19;;12199:366;;;:::o;12571:::-;12713:3;12734:67;12798:2;12793:3;12734:67;:::i;:::-;12727:74;;12810:93;12899:3;12810:93;:::i;:::-;12928:2;12923:3;12919:12;12912:19;;12571:366;;;:::o;12943:::-;13085:3;13106:67;13170:2;13165:3;13106:67;:::i;:::-;13099:74;;13182:93;13271:3;13182:93;:::i;:::-;13300:2;13295:3;13291:12;13284:19;;12943:366;;;:::o;13315:::-;13457:3;13478:67;13542:2;13537:3;13478:67;:::i;:::-;13471:74;;13554:93;13643:3;13554:93;:::i;:::-;13672:2;13667:3;13663:12;13656:19;;13315:366;;;:::o;13687:::-;13829:3;13850:67;13914:2;13909:3;13850:67;:::i;:::-;13843:74;;13926:93;14015:3;13926:93;:::i;:::-;14044:2;14039:3;14035:12;14028:19;;13687:366;;;:::o;14059:::-;14201:3;14222:67;14286:2;14281:3;14222:67;:::i;:::-;14215:74;;14298:93;14387:3;14298:93;:::i;:::-;14416:2;14411:3;14407:12;14400:19;;14059:366;;;:::o;14431:::-;14573:3;14594:67;14658:2;14653:3;14594:67;:::i;:::-;14587:74;;14670:93;14759:3;14670:93;:::i;:::-;14788:2;14783:3;14779:12;14772:19;;14431:366;;;:::o;14803:::-;14945:3;14966:67;15030:2;15025:3;14966:67;:::i;:::-;14959:74;;15042:93;15131:3;15042:93;:::i;:::-;15160:2;15155:3;15151:12;15144:19;;14803:366;;;:::o;15175:::-;15317:3;15338:67;15402:2;15397:3;15338:67;:::i;:::-;15331:74;;15414:93;15503:3;15414:93;:::i;:::-;15532:2;15527:3;15523:12;15516:19;;15175:366;;;:::o;15547:::-;15689:3;15710:67;15774:2;15769:3;15710:67;:::i;:::-;15703:74;;15786:93;15875:3;15786:93;:::i;:::-;15904:2;15899:3;15895:12;15888:19;;15547:366;;;:::o;15919:::-;16061:3;16082:67;16146:2;16141:3;16082:67;:::i;:::-;16075:74;;16158:93;16247:3;16158:93;:::i;:::-;16276:2;16271:3;16267:12;16260:19;;15919:366;;;:::o;16291:::-;16433:3;16454:67;16518:2;16513:3;16454:67;:::i;:::-;16447:74;;16530:93;16619:3;16530:93;:::i;:::-;16648:2;16643:3;16639:12;16632:19;;16291:366;;;:::o;16663:::-;16805:3;16826:67;16890:2;16885:3;16826:67;:::i;:::-;16819:74;;16902:93;16991:3;16902:93;:::i;:::-;17020:2;17015:3;17011:12;17004:19;;16663:366;;;:::o;17035:::-;17177:3;17198:67;17262:2;17257:3;17198:67;:::i;:::-;17191:74;;17274:93;17363:3;17274:93;:::i;:::-;17392:2;17387:3;17383:12;17376:19;;17035:366;;;:::o;17407:::-;17549:3;17570:67;17634:2;17629:3;17570:67;:::i;:::-;17563:74;;17646:93;17735:3;17646:93;:::i;:::-;17764:2;17759:3;17755:12;17748:19;;17407:366;;;:::o;17779:::-;17921:3;17942:67;18006:2;18001:3;17942:67;:::i;:::-;17935:74;;18018:93;18107:3;18018:93;:::i;:::-;18136:2;18131:3;18127:12;18120:19;;17779:366;;;:::o;18151:::-;18293:3;18314:67;18378:2;18373:3;18314:67;:::i;:::-;18307:74;;18390:93;18479:3;18390:93;:::i;:::-;18508:2;18503:3;18499:12;18492:19;;18151:366;;;:::o;18523:::-;18665:3;18686:67;18750:2;18745:3;18686:67;:::i;:::-;18679:74;;18762:93;18851:3;18762:93;:::i;:::-;18880:2;18875:3;18871:12;18864:19;;18523:366;;;:::o;18895:::-;19037:3;19058:67;19122:2;19117:3;19058:67;:::i;:::-;19051:74;;19134:93;19223:3;19134:93;:::i;:::-;19252:2;19247:3;19243:12;19236:19;;18895:366;;;:::o;19267:::-;19409:3;19430:67;19494:2;19489:3;19430:67;:::i;:::-;19423:74;;19506:93;19595:3;19506:93;:::i;:::-;19624:2;19619:3;19615:12;19608:19;;19267:366;;;:::o;19639:400::-;19799:3;19820:84;19902:1;19897:3;19820:84;:::i;:::-;19813:91;;19913:93;20002:3;19913:93;:::i;:::-;20031:1;20026:3;20022:11;20015:18;;19639:400;;;:::o;20045:366::-;20187:3;20208:67;20272:2;20267:3;20208:67;:::i;:::-;20201:74;;20284:93;20373:3;20284:93;:::i;:::-;20402:2;20397:3;20393:12;20386:19;;20045:366;;;:::o;20417:::-;20559:3;20580:67;20644:2;20639:3;20580:67;:::i;:::-;20573:74;;20656:93;20745:3;20656:93;:::i;:::-;20774:2;20769:3;20765:12;20758:19;;20417:366;;;:::o;20789:::-;20931:3;20952:67;21016:2;21011:3;20952:67;:::i;:::-;20945:74;;21028:93;21117:3;21028:93;:::i;:::-;21146:2;21141:3;21137:12;21130:19;;20789:366;;;:::o;21161:::-;21303:3;21324:67;21388:2;21383:3;21324:67;:::i;:::-;21317:74;;21400:93;21489:3;21400:93;:::i;:::-;21518:2;21513:3;21509:12;21502:19;;21161:366;;;:::o;21533:::-;21675:3;21696:67;21760:2;21755:3;21696:67;:::i;:::-;21689:74;;21772:93;21861:3;21772:93;:::i;:::-;21890:2;21885:3;21881:12;21874:19;;21533:366;;;:::o;21905:::-;22047:3;22068:67;22132:2;22127:3;22068:67;:::i;:::-;22061:74;;22144:93;22233:3;22144:93;:::i;:::-;22262:2;22257:3;22253:12;22246:19;;21905:366;;;:::o;22277:::-;22419:3;22440:67;22504:2;22499:3;22440:67;:::i;:::-;22433:74;;22516:93;22605:3;22516:93;:::i;:::-;22634:2;22629:3;22625:12;22618:19;;22277:366;;;:::o;22649:398::-;22808:3;22829:83;22910:1;22905:3;22829:83;:::i;:::-;22822:90;;22921:93;23010:3;22921:93;:::i;:::-;23039:1;23034:3;23030:11;23023:18;;22649:398;;;:::o;23053:366::-;23195:3;23216:67;23280:2;23275:3;23216:67;:::i;:::-;23209:74;;23292:93;23381:3;23292:93;:::i;:::-;23410:2;23405:3;23401:12;23394:19;;23053:366;;;:::o;23425:::-;23567:3;23588:67;23652:2;23647:3;23588:67;:::i;:::-;23581:74;;23664:93;23753:3;23664:93;:::i;:::-;23782:2;23777:3;23773:12;23766:19;;23425:366;;;:::o;23797:::-;23939:3;23960:67;24024:2;24019:3;23960:67;:::i;:::-;23953:74;;24036:93;24125:3;24036:93;:::i;:::-;24154:2;24149:3;24145:12;24138:19;;23797:366;;;:::o;24169:118::-;24256:24;24274:5;24256:24;:::i;:::-;24251:3;24244:37;24169:118;;:::o;24293:112::-;24376:22;24392:5;24376:22;:::i;:::-;24371:3;24364:35;24293:112;;:::o;24411:397::-;24551:3;24566:75;24637:3;24628:6;24566:75;:::i;:::-;24666:2;24661:3;24657:12;24650:19;;24679:75;24750:3;24741:6;24679:75;:::i;:::-;24779:2;24774:3;24770:12;24763:19;;24799:3;24792:10;;24411:397;;;;;:::o;24814:701::-;25095:3;25117:95;25208:3;25199:6;25117:95;:::i;:::-;25110:102;;25229:95;25320:3;25311:6;25229:95;:::i;:::-;25222:102;;25341:148;25485:3;25341:148;:::i;:::-;25334:155;;25506:3;25499:10;;24814:701;;;;;:::o;25521:522::-;25734:3;25756:148;25900:3;25756:148;:::i;:::-;25749:155;;25914:75;25985:3;25976:6;25914:75;:::i;:::-;26014:2;26009:3;26005:12;25998:19;;26034:3;26027:10;;25521:522;;;;:::o;26049:379::-;26233:3;26255:147;26398:3;26255:147;:::i;:::-;26248:154;;26419:3;26412:10;;26049:379;;;:::o;26434:222::-;26527:4;26565:2;26554:9;26550:18;26542:26;;26578:71;26646:1;26635:9;26631:17;26622:6;26578:71;:::i;:::-;26434:222;;;;:::o;26662:640::-;26857:4;26895:3;26884:9;26880:19;26872:27;;26909:71;26977:1;26966:9;26962:17;26953:6;26909:71;:::i;:::-;26990:72;27058:2;27047:9;27043:18;27034:6;26990:72;:::i;:::-;27072;27140:2;27129:9;27125:18;27116:6;27072:72;:::i;:::-;27191:9;27185:4;27181:20;27176:2;27165:9;27161:18;27154:48;27219:76;27290:4;27281:6;27219:76;:::i;:::-;27211:84;;26662:640;;;;;;;:::o;27308:210::-;27395:4;27433:2;27422:9;27418:18;27410:26;;27446:65;27508:1;27497:9;27493:17;27484:6;27446:65;:::i;:::-;27308:210;;;;:::o;27524:545::-;27697:4;27735:3;27724:9;27720:19;27712:27;;27749:71;27817:1;27806:9;27802:17;27793:6;27749:71;:::i;:::-;27830:68;27894:2;27883:9;27879:18;27870:6;27830:68;:::i;:::-;27908:72;27976:2;27965:9;27961:18;27952:6;27908:72;:::i;:::-;27990;28058:2;28047:9;28043:18;28034:6;27990:72;:::i;:::-;27524:545;;;;;;;:::o;28075:238::-;28176:4;28214:2;28203:9;28199:18;28191:26;;28227:79;28303:1;28292:9;28288:17;28279:6;28227:79;:::i;:::-;28075:238;;;;:::o;28319:313::-;28432:4;28470:2;28459:9;28455:18;28447:26;;28519:9;28513:4;28509:20;28505:1;28494:9;28490:17;28483:47;28547:78;28620:4;28611:6;28547:78;:::i;:::-;28539:86;;28319:313;;;;:::o;28638:419::-;28804:4;28842:2;28831:9;28827:18;28819:26;;28891:9;28885:4;28881:20;28877:1;28866:9;28862:17;28855:47;28919:131;29045:4;28919:131;:::i;:::-;28911:139;;28638:419;;;:::o;29063:::-;29229:4;29267:2;29256:9;29252:18;29244:26;;29316:9;29310:4;29306:20;29302:1;29291:9;29287:17;29280:47;29344:131;29470:4;29344:131;:::i;:::-;29336:139;;29063:419;;;:::o;29488:::-;29654:4;29692:2;29681:9;29677:18;29669:26;;29741:9;29735:4;29731:20;29727:1;29716:9;29712:17;29705:47;29769:131;29895:4;29769:131;:::i;:::-;29761:139;;29488:419;;;:::o;29913:::-;30079:4;30117:2;30106:9;30102:18;30094:26;;30166:9;30160:4;30156:20;30152:1;30141:9;30137:17;30130:47;30194:131;30320:4;30194:131;:::i;:::-;30186:139;;29913:419;;;:::o;30338:::-;30504:4;30542:2;30531:9;30527:18;30519:26;;30591:9;30585:4;30581:20;30577:1;30566:9;30562:17;30555:47;30619:131;30745:4;30619:131;:::i;:::-;30611:139;;30338:419;;;:::o;30763:::-;30929:4;30967:2;30956:9;30952:18;30944:26;;31016:9;31010:4;31006:20;31002:1;30991:9;30987:17;30980:47;31044:131;31170:4;31044:131;:::i;:::-;31036:139;;30763:419;;;:::o;31188:::-;31354:4;31392:2;31381:9;31377:18;31369:26;;31441:9;31435:4;31431:20;31427:1;31416:9;31412:17;31405:47;31469:131;31595:4;31469:131;:::i;:::-;31461:139;;31188:419;;;:::o;31613:::-;31779:4;31817:2;31806:9;31802:18;31794:26;;31866:9;31860:4;31856:20;31852:1;31841:9;31837:17;31830:47;31894:131;32020:4;31894:131;:::i;:::-;31886:139;;31613:419;;;:::o;32038:::-;32204:4;32242:2;32231:9;32227:18;32219:26;;32291:9;32285:4;32281:20;32277:1;32266:9;32262:17;32255:47;32319:131;32445:4;32319:131;:::i;:::-;32311:139;;32038:419;;;:::o;32463:::-;32629:4;32667:2;32656:9;32652:18;32644:26;;32716:9;32710:4;32706:20;32702:1;32691:9;32687:17;32680:47;32744:131;32870:4;32744:131;:::i;:::-;32736:139;;32463:419;;;:::o;32888:::-;33054:4;33092:2;33081:9;33077:18;33069:26;;33141:9;33135:4;33131:20;33127:1;33116:9;33112:17;33105:47;33169:131;33295:4;33169:131;:::i;:::-;33161:139;;32888:419;;;:::o;33313:::-;33479:4;33517:2;33506:9;33502:18;33494:26;;33566:9;33560:4;33556:20;33552:1;33541:9;33537:17;33530:47;33594:131;33720:4;33594:131;:::i;:::-;33586:139;;33313:419;;;:::o;33738:::-;33904:4;33942:2;33931:9;33927:18;33919:26;;33991:9;33985:4;33981:20;33977:1;33966:9;33962:17;33955:47;34019:131;34145:4;34019:131;:::i;:::-;34011:139;;33738:419;;;:::o;34163:::-;34329:4;34367:2;34356:9;34352:18;34344:26;;34416:9;34410:4;34406:20;34402:1;34391:9;34387:17;34380:47;34444:131;34570:4;34444:131;:::i;:::-;34436:139;;34163:419;;;:::o;34588:::-;34754:4;34792:2;34781:9;34777:18;34769:26;;34841:9;34835:4;34831:20;34827:1;34816:9;34812:17;34805:47;34869:131;34995:4;34869:131;:::i;:::-;34861:139;;34588:419;;;:::o;35013:::-;35179:4;35217:2;35206:9;35202:18;35194:26;;35266:9;35260:4;35256:20;35252:1;35241:9;35237:17;35230:47;35294:131;35420:4;35294:131;:::i;:::-;35286:139;;35013:419;;;:::o;35438:::-;35604:4;35642:2;35631:9;35627:18;35619:26;;35691:9;35685:4;35681:20;35677:1;35666:9;35662:17;35655:47;35719:131;35845:4;35719:131;:::i;:::-;35711:139;;35438:419;;;:::o;35863:::-;36029:4;36067:2;36056:9;36052:18;36044:26;;36116:9;36110:4;36106:20;36102:1;36091:9;36087:17;36080:47;36144:131;36270:4;36144:131;:::i;:::-;36136:139;;35863:419;;;:::o;36288:::-;36454:4;36492:2;36481:9;36477:18;36469:26;;36541:9;36535:4;36531:20;36527:1;36516:9;36512:17;36505:47;36569:131;36695:4;36569:131;:::i;:::-;36561:139;;36288:419;;;:::o;36713:::-;36879:4;36917:2;36906:9;36902:18;36894:26;;36966:9;36960:4;36956:20;36952:1;36941:9;36937:17;36930:47;36994:131;37120:4;36994:131;:::i;:::-;36986:139;;36713:419;;;:::o;37138:::-;37304:4;37342:2;37331:9;37327:18;37319:26;;37391:9;37385:4;37381:20;37377:1;37366:9;37362:17;37355:47;37419:131;37545:4;37419:131;:::i;:::-;37411:139;;37138:419;;;:::o;37563:::-;37729:4;37767:2;37756:9;37752:18;37744:26;;37816:9;37810:4;37806:20;37802:1;37791:9;37787:17;37780:47;37844:131;37970:4;37844:131;:::i;:::-;37836:139;;37563:419;;;:::o;37988:::-;38154:4;38192:2;38181:9;38177:18;38169:26;;38241:9;38235:4;38231:20;38227:1;38216:9;38212:17;38205:47;38269:131;38395:4;38269:131;:::i;:::-;38261:139;;37988:419;;;:::o;38413:::-;38579:4;38617:2;38606:9;38602:18;38594:26;;38666:9;38660:4;38656:20;38652:1;38641:9;38637:17;38630:47;38694:131;38820:4;38694:131;:::i;:::-;38686:139;;38413:419;;;:::o;38838:::-;39004:4;39042:2;39031:9;39027:18;39019:26;;39091:9;39085:4;39081:20;39077:1;39066:9;39062:17;39055:47;39119:131;39245:4;39119:131;:::i;:::-;39111:139;;38838:419;;;:::o;39263:::-;39429:4;39467:2;39456:9;39452:18;39444:26;;39516:9;39510:4;39506:20;39502:1;39491:9;39487:17;39480:47;39544:131;39670:4;39544:131;:::i;:::-;39536:139;;39263:419;;;:::o;39688:::-;39854:4;39892:2;39881:9;39877:18;39869:26;;39941:9;39935:4;39931:20;39927:1;39916:9;39912:17;39905:47;39969:131;40095:4;39969:131;:::i;:::-;39961:139;;39688:419;;;:::o;40113:::-;40279:4;40317:2;40306:9;40302:18;40294:26;;40366:9;40360:4;40356:20;40352:1;40341:9;40337:17;40330:47;40394:131;40520:4;40394:131;:::i;:::-;40386:139;;40113:419;;;:::o;40538:::-;40704:4;40742:2;40731:9;40727:18;40719:26;;40791:9;40785:4;40781:20;40777:1;40766:9;40762:17;40755:47;40819:131;40945:4;40819:131;:::i;:::-;40811:139;;40538:419;;;:::o;40963:::-;41129:4;41167:2;41156:9;41152:18;41144:26;;41216:9;41210:4;41206:20;41202:1;41191:9;41187:17;41180:47;41244:131;41370:4;41244:131;:::i;:::-;41236:139;;40963:419;;;:::o;41388:::-;41554:4;41592:2;41581:9;41577:18;41569:26;;41641:9;41635:4;41631:20;41627:1;41616:9;41612:17;41605:47;41669:131;41795:4;41669:131;:::i;:::-;41661:139;;41388:419;;;:::o;41813:222::-;41906:4;41944:2;41933:9;41929:18;41921:26;;41957:71;42025:1;42014:9;42010:17;42001:6;41957:71;:::i;:::-;41813:222;;;;:::o;42041:129::-;42075:6;42102:20;;:::i;:::-;42092:30;;42131:33;42159:4;42151:6;42131:33;:::i;:::-;42041:129;;;:::o;42176:75::-;42209:6;42242:2;42236:9;42226:19;;42176:75;:::o;42257:307::-;42318:4;42408:18;42400:6;42397:30;42394:56;;;42430:18;;:::i;:::-;42394:56;42468:29;42490:6;42468:29;:::i;:::-;42460:37;;42552:4;42546;42542:15;42534:23;;42257:307;;;:::o;42570:308::-;42632:4;42722:18;42714:6;42711:30;42708:56;;;42744:18;;:::i;:::-;42708:56;42782:29;42804:6;42782:29;:::i;:::-;42774:37;;42866:4;42860;42856:15;42848:23;;42570:308;;;:::o;42884:98::-;42935:6;42969:5;42963:12;42953:22;;42884:98;;;:::o;42988:99::-;43040:6;43074:5;43068:12;43058:22;;42988:99;;;:::o;43093:168::-;43176:11;43210:6;43205:3;43198:19;43250:4;43245:3;43241:14;43226:29;;43093:168;;;;:::o;43267:147::-;43368:11;43405:3;43390:18;;43267:147;;;;:::o;43420:169::-;43504:11;43538:6;43533:3;43526:19;43578:4;43573:3;43569:14;43554:29;;43420:169;;;;:::o;43595:148::-;43697:11;43734:3;43719:18;;43595:148;;;;:::o;43749:305::-;43789:3;43808:20;43826:1;43808:20;:::i;:::-;43803:25;;43842:20;43860:1;43842:20;:::i;:::-;43837:25;;43996:1;43928:66;43924:74;43921:1;43918:81;43915:107;;;44002:18;;:::i;:::-;43915:107;44046:1;44043;44039:9;44032:16;;43749:305;;;;:::o;44060:185::-;44100:1;44117:20;44135:1;44117:20;:::i;:::-;44112:25;;44151:20;44169:1;44151:20;:::i;:::-;44146:25;;44190:1;44180:35;;44195:18;;:::i;:::-;44180:35;44237:1;44234;44230:9;44225:14;;44060:185;;;;:::o;44251:348::-;44291:7;44314:20;44332:1;44314:20;:::i;:::-;44309:25;;44348:20;44366:1;44348:20;:::i;:::-;44343:25;;44536:1;44468:66;44464:74;44461:1;44458:81;44453:1;44446:9;44439:17;44435:105;44432:131;;;44543:18;;:::i;:::-;44432:131;44591:1;44588;44584:9;44573:20;;44251:348;;;;:::o;44605:191::-;44645:4;44665:20;44683:1;44665:20;:::i;:::-;44660:25;;44699:20;44717:1;44699:20;:::i;:::-;44694:25;;44738:1;44735;44732:8;44729:34;;;44743:18;;:::i;:::-;44729:34;44788:1;44785;44781:9;44773:17;;44605:191;;;;:::o;44802:96::-;44839:7;44868:24;44886:5;44868:24;:::i;:::-;44857:35;;44802:96;;;:::o;44904:90::-;44938:7;44981:5;44974:13;44967:21;44956:32;;44904:90;;;:::o;45000:77::-;45037:7;45066:5;45055:16;;45000:77;;;:::o;45083:149::-;45119:7;45159:66;45152:5;45148:78;45137:89;;45083:149;;;:::o;45238:131::-;45285:7;45314:5;45303:16;;45320:43;45357:5;45320:43;:::i;:::-;45238:131;;;:::o;45375:126::-;45412:7;45452:42;45445:5;45441:54;45430:65;;45375:126;;;:::o;45507:77::-;45544:7;45573:5;45562:16;;45507:77;;;:::o;45590:86::-;45625:7;45665:4;45658:5;45654:16;45643:27;;45590:86;;;:::o;45682:131::-;45740:9;45773:34;45801:5;45773:34;:::i;:::-;45760:47;;45682:131;;;:::o;45819:154::-;45903:6;45898:3;45893;45880:30;45965:1;45956:6;45951:3;45947:16;45940:27;45819:154;;;:::o;45979:307::-;46047:1;46057:113;46071:6;46068:1;46065:13;46057:113;;;46156:1;46151:3;46147:11;46141:18;46137:1;46132:3;46128:11;46121:39;46093:2;46090:1;46086:10;46081:15;;46057:113;;;46188:6;46185:1;46182:13;46179:101;;;46268:1;46259:6;46254:3;46250:16;46243:27;46179:101;46028:258;45979:307;;;:::o;46292:320::-;46336:6;46373:1;46367:4;46363:12;46353:22;;46420:1;46414:4;46410:12;46441:18;46431:81;;46497:4;46489:6;46485:17;46475:27;;46431:81;46559:2;46551:6;46548:14;46528:18;46525:38;46522:84;;;46578:18;;:::i;:::-;46522:84;46343:269;46292:320;;;:::o;46618:281::-;46701:27;46723:4;46701:27;:::i;:::-;46693:6;46689:40;46831:6;46819:10;46816:22;46795:18;46783:10;46780:34;46777:62;46774:88;;;46842:18;;:::i;:::-;46774:88;46882:10;46878:2;46871:22;46661:238;46618:281;;:::o;46905:233::-;46944:3;46967:24;46985:5;46967:24;:::i;:::-;46958:33;;47013:66;47006:5;47003:77;47000:103;;;47083:18;;:::i;:::-;47000:103;47130:1;47123:5;47119:13;47112:20;;46905:233;;;:::o;47144:100::-;47183:7;47212:26;47232:5;47212:26;:::i;:::-;47201:37;;47144:100;;;:::o;47250:79::-;47289:7;47318:5;47307:16;;47250:79;;;:::o;47335:94::-;47374:7;47403:20;47417:5;47403:20;:::i;:::-;47392:31;;47335:94;;;:::o;47435:176::-;47467:1;47484:20;47502:1;47484:20;:::i;:::-;47479:25;;47518:20;47536:1;47518:20;:::i;:::-;47513:25;;47557:1;47547:35;;47562:18;;:::i;:::-;47547:35;47603:1;47600;47596:9;47591:14;;47435:176;;;;:::o;47617:180::-;47665:77;47662:1;47655:88;47762:4;47759:1;47752:15;47786:4;47783:1;47776:15;47803:180;47851:77;47848:1;47841:88;47948:4;47945:1;47938:15;47972:4;47969:1;47962:15;47989:180;48037:77;48034:1;48027:88;48134:4;48131:1;48124:15;48158:4;48155:1;48148:15;48175:180;48223:77;48220:1;48213:88;48320:4;48317:1;48310:15;48344:4;48341:1;48334:15;48361:180;48409:77;48406:1;48399:88;48506:4;48503:1;48496:15;48530:4;48527:1;48520:15;48547:180;48595:77;48592:1;48585:88;48692:4;48689:1;48682:15;48716:4;48713:1;48706:15;48733:117;48842:1;48839;48832:12;48856:117;48965:1;48962;48955:12;48979:117;49088:1;49085;49078:12;49102:117;49211:1;49208;49201:12;49225:102;49266:6;49317:2;49313:7;49308:2;49301:5;49297:14;49293:28;49283:38;;49225:102;;;:::o;49333:94::-;49366:8;49414:5;49410:2;49406:14;49385:35;;49333:94;;;:::o;49433:214::-;49573:66;49569:1;49561:6;49557:14;49550:90;49433:214;:::o;49653:237::-;49793:34;49789:1;49781:6;49777:14;49770:58;49862:20;49857:2;49849:6;49845:15;49838:45;49653:237;:::o;49896:225::-;50036:34;50032:1;50024:6;50020:14;50013:58;50105:8;50100:2;50092:6;50088:15;50081:33;49896:225;:::o;50127:178::-;50267:30;50263:1;50255:6;50251:14;50244:54;50127:178;:::o;50311:224::-;50451:34;50447:1;50439:6;50435:14;50428:58;50520:7;50515:2;50507:6;50503:15;50496:32;50311:224;:::o;50541:170::-;50681:22;50677:1;50669:6;50665:14;50658:46;50541:170;:::o;50717:223::-;50857:34;50853:1;50845:6;50841:14;50834:58;50926:6;50921:2;50913:6;50909:15;50902:31;50717:223;:::o;50946:175::-;51086:27;51082:1;51074:6;51070:14;51063:51;50946:175;:::o;51127:301::-;51267:34;51263:1;51255:6;51251:14;51244:58;51336:34;51331:2;51323:6;51319:15;51312:59;51405:15;51400:2;51392:6;51388:15;51381:40;51127:301;:::o;51434:180::-;51574:32;51570:1;51562:6;51558:14;51551:56;51434:180;:::o;51620:304::-;51760:34;51756:1;51748:6;51744:14;51737:58;51829:34;51824:2;51816:6;51812:15;51805:59;51898:18;51893:2;51885:6;51881:15;51874:43;51620:304;:::o;51930:231::-;52070:34;52066:1;52058:6;52054:14;52047:58;52139:14;52134:2;52126:6;52122:15;52115:39;51930:231;:::o;52167:171::-;52307:23;52303:1;52295:6;52291:14;52284:47;52167:171;:::o;52344:243::-;52484:34;52480:1;52472:6;52468:14;52461:58;52553:26;52548:2;52540:6;52536:15;52529:51;52344:243;:::o;52593:229::-;52733:34;52729:1;52721:6;52717:14;52710:58;52802:12;52797:2;52789:6;52785:15;52778:37;52593:229;:::o;52828:182::-;52968:34;52964:1;52956:6;52952:14;52945:58;52828:182;:::o;53016:229::-;53156:34;53152:1;53144:6;53140:14;53133:58;53225:12;53220:2;53212:6;53208:15;53201:37;53016:229;:::o;53251:228::-;53391:34;53387:1;53379:6;53375:14;53368:58;53460:11;53455:2;53447:6;53443:15;53436:36;53251:228;:::o;53485:178::-;53625:30;53621:1;53613:6;53609:14;53602:54;53485:178;:::o;53669:226::-;53809:34;53805:1;53797:6;53793:14;53786:58;53878:9;53873:2;53865:6;53861:15;53854:34;53669:226;:::o;53901:182::-;54041:34;54037:1;54029:6;54025:14;54018:58;53901:182;:::o;54089:231::-;54229:34;54225:1;54217:6;54213:14;54206:58;54298:14;54293:2;54285:6;54281:15;54274:39;54089:231;:::o;54326:155::-;54466:7;54462:1;54454:6;54450:14;54443:31;54326:155;:::o;54487:167::-;54627:19;54623:1;54615:6;54611:14;54604:43;54487:167;:::o;54660:182::-;54800:34;54796:1;54788:6;54784:14;54777:58;54660:182;:::o;54848:228::-;54988:34;54984:1;54976:6;54972:14;54965:58;55057:11;55052:2;55044:6;55040:15;55033:36;54848:228;:::o;55082:234::-;55222:34;55218:1;55210:6;55206:14;55199:58;55291:17;55286:2;55278:6;55274:15;55267:42;55082:234;:::o;55322:223::-;55462:34;55458:1;55450:6;55446:14;55439:58;55531:6;55526:2;55518:6;55514:15;55507:31;55322:223;:::o;55551:231::-;55691:34;55687:1;55679:6;55675:14;55668:58;55760:14;55755:2;55747:6;55743:15;55736:39;55551:231;:::o;55788:220::-;55928:34;55924:1;55916:6;55912:14;55905:58;55997:3;55992:2;55984:6;55980:15;55973:28;55788:220;:::o;56014:114::-;;:::o;56134:236::-;56274:34;56270:1;56262:6;56258:14;56251:58;56343:19;56338:2;56330:6;56326:15;56319:44;56134:236;:::o;56376:171::-;56516:23;56512:1;56504:6;56500:14;56493:47;56376:171;:::o;56553:221::-;56693:34;56689:1;56681:6;56677:14;56670:58;56762:4;56757:2;56749:6;56745:15;56738:29;56553:221;:::o;56780:115::-;56863:1;56856:5;56853:12;56843:46;;56869:18;;:::i;:::-;56843:46;56780:115;:::o;56901:122::-;56974:24;56992:5;56974:24;:::i;:::-;56967:5;56964:35;56954:63;;57013:1;57010;57003:12;56954:63;56901:122;:::o;57029:116::-;57099:21;57114:5;57099:21;:::i;:::-;57092:5;57089:32;57079:60;;57135:1;57132;57125:12;57079:60;57029:116;:::o;57151:122::-;57224:24;57242:5;57224:24;:::i;:::-;57217:5;57214:35;57204:63;;57263:1;57260;57253:12;57204:63;57151:122;:::o;57279:120::-;57351:23;57368:5;57351:23;:::i;:::-;57344:5;57341:34;57331:62;;57389:1;57386;57379:12;57331:62;57279:120;:::o;57405:122::-;57478:24;57496:5;57478:24;:::i;:::-;57471:5;57468:35;57458:63;;57517:1;57514;57507:12;57458:63;57405:122;:::o;57533:118::-;57604:22;57620:5;57604:22;:::i;:::-;57597:5;57594:33;57584:61;;57641:1;57638;57631:12;57584:61;57533:118;:::o

Swarm Source

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