ETH Price: $2,619.41 (-2.85%)

Token

ScawyNFT (SCAWY)
 

Overview

Max Total Supply

59 SCAWY

Holders

29

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 SCAWY
0xC53b12eB25fB5bb8dc66c809908CFCCCA1ecD77e
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:
ScawyNFT

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-19
*/

// 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/IERC721Enumerable.sol



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: gist-657f83452cf50b59bb6964e16371e12b/contracts/Scawy.sol


pragma solidity ^0.8.0;



contract ScawyNFT is ERC721Enumerable, Ownable {

    using Strings for uint256;

    string _baseTokenURI = "";
    uint256 private _reserved = 20;
    uint256 private _price = 0.03 ether;
    bool public _paused = true;

    // withdraw addresses
    address t1 = 0xC81dc67Fb2Dde3130495C5b8FCA591Bf3ea72350;
    address t2 = 0x9a1bAfA4Ed1E4F590fE79e9f1a721eb3b3714999;


    modifier canWithdraw(){
        require(address(this).balance > 0.2 ether);
        _;
    }

    struct ContractOwners {
        address payable addr;
        uint percent;
    }

    ContractOwners[] contractOnwers;

    constructor() ERC721("ScawyNFT", "SCAWY")  {
        contractOnwers.push(ContractOwners(payable(address(t1)), 50));
        contractOnwers.push(ContractOwners(payable(address(t2)), 50));
    }

    function buyScawy(uint256 num) public payable {
        uint256 supply = totalSupply();
        require( !_paused,                              "Sale paused" );
        require( num < 11,                              "You can buy a maximum of 20 Scawy NFTs" );
        require( supply + num < 888 - _reserved,        "Exceeds maximum Scawy supply" );
        require( msg.value >= _price * num,             "Ether sent is not correct" );

        for(uint256 i; i < num; i++){
            _safeMint( msg.sender, supply + i );
        }
    }

    function walletOfOwner(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    // In case ETH goes wild
    function setPrice(uint256 _newPrice) public onlyOwner() {
        _price = _newPrice;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

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

    function getPrice() public view returns (uint256){
        return _price;
    }

    function giveAway(address _to, uint256 _amount) external onlyOwner() {
        require( _amount <= _reserved, "Exceeds reserved ScawyNFT supply" );

        uint256 supply = totalSupply();
        for(uint256 i; i < _amount; i++){
            _safeMint( _to, supply + i );
        }

        _reserved -= _amount;
    }

    function pause(bool val) public onlyOwner {
        _paused = val;
    }

    function withdraw() external payable onlyOwner() canWithdraw() {
        uint nbalance = address(this).balance - 0.1 ether;
        for(uint i = 0; i < contractOnwers.length; i++){
            ContractOwners storage o = contractOnwers[i];
            o.addr.transfer((nbalance * o.percent) / 100);
        }
    }
}

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"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"buyScawy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"giveAway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260405180602001604052806000815250600b90805190602001906200002b9291906200043b565b506014600c55666a94d74f430000600d556001600e60006101000a81548160ff02191690831515021790555073c81dc67fb2dde3130495c5b8fca591bf3ea72350600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550739a1bafa4ed1e4f590fe79e9f1a721eb3b3714999600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200010e57600080fd5b506040518060400160405280600881526020017f53636177794e46540000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f53434157590000000000000000000000000000000000000000000000000000008152508160009080519060200190620001939291906200043b565b508060019080519060200190620001ac9291906200043b565b505050620001cf620001c36200036d60201b60201c565b6200037560201b60201c565b60106040518060400160405280600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016032815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155505060106040518060400160405280600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016032815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155505062000550565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200044990620004eb565b90600052602060002090601f0160209004810192826200046d5760008555620004b9565b82601f106200048857805160ff1916838001178555620004b9565b82800160010185558215620004b9579182015b82811115620004b85782518255916020019190600101906200049b565b5b509050620004c89190620004cc565b5090565b5b80821115620004e7576000816000905550600101620004cd565b5090565b600060028204905060018216806200050457607f821691505b602082108114156200051b576200051a62000521565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61411580620005606000396000f3fe6080604052600436106101b75760003560e01c806355f804b3116100ec57806398d5fdca1161008a578063c87b56dd11610064578063c87b56dd146105ee578063ca8001441461062b578063e985e9c514610654578063f2fde38b14610691576101b7565b806398d5fdca14610571578063a22cb4651461059c578063b88d4fde146105c5576101b7565b8063715018a6116100c6578063715018a6146104db5780638da5cb5b146104f257806391b7f5ed1461051d57806395d89b4114610546576101b7565b806355f804b3146104385780636352211e1461046157806370a082311461049e576101b7565b806323b872dd116101595780633ccfd60b116101335780633ccfd60b1461038b57806342842e0e14610395578063438b6300146103be5780634f6ccce7146103fb576101b7565b806323b872dd146103095780632f745c59146103325780633c6d2ff91461036f576101b7565b8063081812fc11610195578063081812fc1461024d578063095ea7b31461028a57806316c61ccc146102b357806318160ddd146102de576101b7565b806301ffc9a7146101bc57806302329a29146101f957806306fdde0314610222575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612e42565b6106ba565b6040516101f091906138fa565b60405180910390f35b34801561020557600080fd5b50610220600480360381019061021b9190612e19565b610734565b005b34801561022e57600080fd5b506102376107cd565b6040516102449190613915565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f9190612ed5565b61085f565b6040516102819190613871565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac9190612ddd565b6108e4565b005b3480156102bf57600080fd5b506102c86109fc565b6040516102d591906138fa565b60405180910390f35b3480156102ea57600080fd5b506102f3610a0f565b6040516103009190613c17565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b9190612cd7565b610a1c565b005b34801561033e57600080fd5b5061035960048036038101906103549190612ddd565b610a7c565b6040516103669190613c17565b60405180910390f35b61038960048036038101906103849190612ed5565b610b21565b005b610393610ca4565b005b3480156103a157600080fd5b506103bc60048036038101906103b79190612cd7565b610e46565b005b3480156103ca57600080fd5b506103e560048036038101906103e09190612c72565b610e66565b6040516103f291906138d8565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d9190612ed5565b610f60565b60405161042f9190613c17565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190612e94565b610ff7565b005b34801561046d57600080fd5b5061048860048036038101906104839190612ed5565b61108d565b6040516104959190613871565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c09190612c72565b61113f565b6040516104d29190613c17565b60405180910390f35b3480156104e757600080fd5b506104f06111f7565b005b3480156104fe57600080fd5b5061050761127f565b6040516105149190613871565b60405180910390f35b34801561052957600080fd5b50610544600480360381019061053f9190612ed5565b6112a9565b005b34801561055257600080fd5b5061055b61132f565b6040516105689190613915565b60405180910390f35b34801561057d57600080fd5b506105866113c1565b6040516105939190613c17565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be9190612da1565b6113cb565b005b3480156105d157600080fd5b506105ec60048036038101906105e79190612d26565b61154c565b005b3480156105fa57600080fd5b5061061560048036038101906106109190612ed5565b6115ae565b6040516106229190613915565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d9190612ddd565b611655565b005b34801561066057600080fd5b5061067b60048036038101906106769190612c9b565b611774565b60405161068891906138fa565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190612c72565b611808565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072d575061072c82611900565b5b9050919050565b61073c6119e2565b73ffffffffffffffffffffffffffffffffffffffff1661075a61127f565b73ffffffffffffffffffffffffffffffffffffffff16146107b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a790613b37565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6060600080546107dc90613f0a565b80601f016020809104026020016040519081016040528092919081815260200182805461080890613f0a565b80156108555780601f1061082a57610100808354040283529160200191610855565b820191906000526020600020905b81548152906001019060200180831161083857829003601f168201915b5050505050905090565b600061086a826119ea565b6108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a090613b17565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ef8261108d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095790613b97565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661097f6119e2565b73ffffffffffffffffffffffffffffffffffffffff1614806109ae57506109ad816109a86119e2565b611774565b5b6109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e490613a37565b60405180910390fd5b6109f78383611a56565b505050565b600e60009054906101000a900460ff1681565b6000600880549050905090565b610a2d610a276119e2565b82611b0f565b610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390613bd7565b60405180910390fd5b610a77838383611bed565b505050565b6000610a878361113f565b8210610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf90613957565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610b2b610a0f565b9050600e60009054906101000a900460ff1615610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490613937565b60405180910390fd5b600b8210610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb790613ab7565b60405180910390fd5b600c54610378610bd09190613e20565b8282610bdc9190613d3f565b10610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390613a97565b60405180910390fd5b81600d54610c2a9190613dc6565b341015610c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6390613bb7565b60405180910390fd5b60005b82811015610c9f57610c8c338284610c879190613d3f565b611e49565b8080610c9790613f3c565b915050610c6f565b505050565b610cac6119e2565b73ffffffffffffffffffffffffffffffffffffffff16610cca61127f565b73ffffffffffffffffffffffffffffffffffffffff1614610d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1790613b37565b60405180910390fd5b6702c68af0bb1400004711610d3457600080fd5b600067016345785d8a000047610d4a9190613e20565b905060005b601080549050811015610e4257600060108281548110610d98577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6064836001015486610df89190613dc6565b610e029190613d95565b9081150290604051600060405180830381858888f19350505050158015610e2d573d6000803e3d6000fd5b50508080610e3a90613f3c565b915050610d4f565b5050565b610e618383836040518060200160405280600081525061154c565b505050565b60606000610e738361113f565b905060008167ffffffffffffffff811115610eb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610ee55781602001602082028036833780820191505090505b50905060005b82811015610f5557610efd8582610a7c565b828281518110610f36577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610f4d90613f3c565b915050610eeb565b508092505050919050565b6000610f6a610a0f565b8210610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa290613bf7565b60405180910390fd5b60088281548110610fe5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610fff6119e2565b73ffffffffffffffffffffffffffffffffffffffff1661101d61127f565b73ffffffffffffffffffffffffffffffffffffffff1614611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a90613b37565b60405180910390fd5b80600b9080519060200190611089929190612a96565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112d90613a77565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a790613a57565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111ff6119e2565b73ffffffffffffffffffffffffffffffffffffffff1661121d61127f565b73ffffffffffffffffffffffffffffffffffffffff1614611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90613b37565b60405180910390fd5b61127d6000611e67565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112b16119e2565b73ffffffffffffffffffffffffffffffffffffffff166112cf61127f565b73ffffffffffffffffffffffffffffffffffffffff1614611325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131c90613b37565b60405180910390fd5b80600d8190555050565b60606001805461133e90613f0a565b80601f016020809104026020016040519081016040528092919081815260200182805461136a90613f0a565b80156113b75780601f1061138c576101008083540402835291602001916113b7565b820191906000526020600020905b81548152906001019060200180831161139a57829003601f168201915b5050505050905090565b6000600d54905090565b6113d36119e2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611441576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611438906139f7565b60405180910390fd5b806005600061144e6119e2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114fb6119e2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161154091906138fa565b60405180910390a35050565b61155d6115576119e2565b83611b0f565b61159c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159390613bd7565b60405180910390fd5b6115a884848484611f2d565b50505050565b60606115b9826119ea565b6115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90613b77565b60405180910390fd5b6000611602611f89565b90506000815111611622576040518060200160405280600081525061164d565b8061162c8461201b565b60405160200161163d92919061384d565b6040516020818303038152906040525b915050919050565b61165d6119e2565b73ffffffffffffffffffffffffffffffffffffffff1661167b61127f565b73ffffffffffffffffffffffffffffffffffffffff16146116d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c890613b37565b60405180910390fd5b600c54811115611716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170d90613af7565b60405180910390fd5b6000611720610a0f565b905060005b828110156117555761174284828461173d9190613d3f565b611e49565b808061174d90613f3c565b915050611725565b5081600c60008282546117689190613e20565b92505081905550505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118106119e2565b73ffffffffffffffffffffffffffffffffffffffff1661182e61127f565b73ffffffffffffffffffffffffffffffffffffffff1614611884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187b90613b37565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb90613997565b60405180910390fd5b6118fd81611e67565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119cb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119db57506119da826121c8565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ac98361108d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b1a826119ea565b611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090613a17565b60405180910390fd5b6000611b648361108d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bd357508373ffffffffffffffffffffffffffffffffffffffff16611bbb8461085f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611be45750611be38185611774565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c0d8261108d565b73ffffffffffffffffffffffffffffffffffffffff1614611c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5a90613b57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cca906139d7565b60405180910390fd5b611cde838383612232565b611ce9600082611a56565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d399190613e20565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d909190613d3f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e63828260405180602001604052806000815250612346565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f38848484611bed565b611f44848484846123a1565b611f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7a90613977565b60405180910390fd5b50505050565b6060600b8054611f9890613f0a565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc490613f0a565b80156120115780601f10611fe657610100808354040283529160200191612011565b820191906000526020600020905b815481529060010190602001808311611ff457829003601f168201915b5050505050905090565b60606000821415612063576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121c3565b600082905060005b6000821461209557808061207e90613f3c565b915050600a8261208e9190613d95565b915061206b565b60008167ffffffffffffffff8111156120d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121095781602001600182028036833780820191505090505b5090505b600085146121bc576001826121229190613e20565b9150600a856121319190613f85565b603061213d9190613d3f565b60f81b818381518110612179577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121b59190613d95565b945061210d565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61223d838383612538565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122805761227b8161253d565b6122bf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122be576122bd8382612586565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612302576122fd816126f3565b612341565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123405761233f8282612836565b5b5b505050565b61235083836128b5565b61235d60008484846123a1565b61239c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239390613977565b60405180910390fd5b505050565b60006123c28473ffffffffffffffffffffffffffffffffffffffff16612a83565b1561252b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123eb6119e2565b8786866040518563ffffffff1660e01b815260040161240d949392919061388c565b602060405180830381600087803b15801561242757600080fd5b505af192505050801561245857506040513d601f19601f820116820180604052508101906124559190612e6b565b60015b6124db573d8060008114612488576040519150601f19603f3d011682016040523d82523d6000602084013e61248d565b606091505b506000815114156124d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ca90613977565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612530565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016125938461113f565b61259d9190613e20565b9050600060076000848152602001908152602001600020549050818114612682576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127079190613e20565b905060006009600084815260200190815260200160002054905060006008838154811061275d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106127a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061281a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006128418361113f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291c90613ad7565b60405180910390fd5b61292e816119ea565b1561296e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612965906139b7565b60405180910390fd5b61297a60008383612232565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129ca9190613d3f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612aa290613f0a565b90600052602060002090601f016020900481019282612ac45760008555612b0b565b82601f10612add57805160ff1916838001178555612b0b565b82800160010185558215612b0b579182015b82811115612b0a578251825591602001919060010190612aef565b5b509050612b189190612b1c565b5090565b5b80821115612b35576000816000905550600101612b1d565b5090565b6000612b4c612b4784613c63565b613c32565b905082815260208101848484011115612b6457600080fd5b612b6f848285613ec8565b509392505050565b6000612b8a612b8584613c93565b613c32565b905082815260208101848484011115612ba257600080fd5b612bad848285613ec8565b509392505050565b600081359050612bc481614083565b92915050565b600081359050612bd98161409a565b92915050565b600081359050612bee816140b1565b92915050565b600081519050612c03816140b1565b92915050565b600082601f830112612c1a57600080fd5b8135612c2a848260208601612b39565b91505092915050565b600082601f830112612c4457600080fd5b8135612c54848260208601612b77565b91505092915050565b600081359050612c6c816140c8565b92915050565b600060208284031215612c8457600080fd5b6000612c9284828501612bb5565b91505092915050565b60008060408385031215612cae57600080fd5b6000612cbc85828601612bb5565b9250506020612ccd85828601612bb5565b9150509250929050565b600080600060608486031215612cec57600080fd5b6000612cfa86828701612bb5565b9350506020612d0b86828701612bb5565b9250506040612d1c86828701612c5d565b9150509250925092565b60008060008060808587031215612d3c57600080fd5b6000612d4a87828801612bb5565b9450506020612d5b87828801612bb5565b9350506040612d6c87828801612c5d565b925050606085013567ffffffffffffffff811115612d8957600080fd5b612d9587828801612c09565b91505092959194509250565b60008060408385031215612db457600080fd5b6000612dc285828601612bb5565b9250506020612dd385828601612bca565b9150509250929050565b60008060408385031215612df057600080fd5b6000612dfe85828601612bb5565b9250506020612e0f85828601612c5d565b9150509250929050565b600060208284031215612e2b57600080fd5b6000612e3984828501612bca565b91505092915050565b600060208284031215612e5457600080fd5b6000612e6284828501612bdf565b91505092915050565b600060208284031215612e7d57600080fd5b6000612e8b84828501612bf4565b91505092915050565b600060208284031215612ea657600080fd5b600082013567ffffffffffffffff811115612ec057600080fd5b612ecc84828501612c33565b91505092915050565b600060208284031215612ee757600080fd5b6000612ef584828501612c5d565b91505092915050565b6000612f0a838361382f565b60208301905092915050565b612f1f81613e54565b82525050565b6000612f3082613cd3565b612f3a8185613d01565b9350612f4583613cc3565b8060005b83811015612f76578151612f5d8882612efe565b9750612f6883613cf4565b925050600181019050612f49565b5085935050505092915050565b612f8c81613e66565b82525050565b6000612f9d82613cde565b612fa78185613d12565b9350612fb7818560208601613ed7565b612fc081614072565b840191505092915050565b6000612fd682613ce9565b612fe08185613d23565b9350612ff0818560208601613ed7565b612ff981614072565b840191505092915050565b600061300f82613ce9565b6130198185613d34565b9350613029818560208601613ed7565b80840191505092915050565b6000613042600b83613d23565b91507f53616c65207061757365640000000000000000000000000000000000000000006000830152602082019050919050565b6000613082602b83613d23565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006130e8603283613d23565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061314e602683613d23565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131b4601c83613d23565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006131f4602483613d23565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061325a601983613d23565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061329a602c83613d23565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613300603883613d23565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613366602a83613d23565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006133cc602983613d23565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613432601c83613d23565b91507f45786365656473206d6178696d756d20536361777920737570706c79000000006000830152602082019050919050565b6000613472602683613d23565b91507f596f752063616e206275792061206d6178696d756d206f66203230205363617760008301527f79204e46547300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134d8602083613d23565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613518602083613d23565b91507f457863656564732072657365727665642053636177794e465420737570706c796000830152602082019050919050565b6000613558602c83613d23565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006135be602083613d23565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006135fe602983613d23565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613664602f83613d23565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006136ca602183613d23565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613730601983613d23565b91507f45746865722073656e74206973206e6f7420636f7272656374000000000000006000830152602082019050919050565b6000613770603183613d23565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006137d6602c83613d23565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b61383881613ebe565b82525050565b61384781613ebe565b82525050565b60006138598285613004565b91506138658284613004565b91508190509392505050565b60006020820190506138866000830184612f16565b92915050565b60006080820190506138a16000830187612f16565b6138ae6020830186612f16565b6138bb604083018561383e565b81810360608301526138cd8184612f92565b905095945050505050565b600060208201905081810360008301526138f28184612f25565b905092915050565b600060208201905061390f6000830184612f83565b92915050565b6000602082019050818103600083015261392f8184612fcb565b905092915050565b6000602082019050818103600083015261395081613035565b9050919050565b6000602082019050818103600083015261397081613075565b9050919050565b60006020820190508181036000830152613990816130db565b9050919050565b600060208201905081810360008301526139b081613141565b9050919050565b600060208201905081810360008301526139d0816131a7565b9050919050565b600060208201905081810360008301526139f0816131e7565b9050919050565b60006020820190508181036000830152613a108161324d565b9050919050565b60006020820190508181036000830152613a308161328d565b9050919050565b60006020820190508181036000830152613a50816132f3565b9050919050565b60006020820190508181036000830152613a7081613359565b9050919050565b60006020820190508181036000830152613a90816133bf565b9050919050565b60006020820190508181036000830152613ab081613425565b9050919050565b60006020820190508181036000830152613ad081613465565b9050919050565b60006020820190508181036000830152613af0816134cb565b9050919050565b60006020820190508181036000830152613b108161350b565b9050919050565b60006020820190508181036000830152613b308161354b565b9050919050565b60006020820190508181036000830152613b50816135b1565b9050919050565b60006020820190508181036000830152613b70816135f1565b9050919050565b60006020820190508181036000830152613b9081613657565b9050919050565b60006020820190508181036000830152613bb0816136bd565b9050919050565b60006020820190508181036000830152613bd081613723565b9050919050565b60006020820190508181036000830152613bf081613763565b9050919050565b60006020820190508181036000830152613c10816137c9565b9050919050565b6000602082019050613c2c600083018461383e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613c5957613c58614043565b5b8060405250919050565b600067ffffffffffffffff821115613c7e57613c7d614043565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613cae57613cad614043565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d4a82613ebe565b9150613d5583613ebe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d8a57613d89613fb6565b5b828201905092915050565b6000613da082613ebe565b9150613dab83613ebe565b925082613dbb57613dba613fe5565b5b828204905092915050565b6000613dd182613ebe565b9150613ddc83613ebe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e1557613e14613fb6565b5b828202905092915050565b6000613e2b82613ebe565b9150613e3683613ebe565b925082821015613e4957613e48613fb6565b5b828203905092915050565b6000613e5f82613e9e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ef5578082015181840152602081019050613eda565b83811115613f04576000848401525b50505050565b60006002820490506001821680613f2257607f821691505b60208210811415613f3657613f35614014565b5b50919050565b6000613f4782613ebe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f7a57613f79613fb6565b5b600182019050919050565b6000613f9082613ebe565b9150613f9b83613ebe565b925082613fab57613faa613fe5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61408c81613e54565b811461409757600080fd5b50565b6140a381613e66565b81146140ae57600080fd5b50565b6140ba81613e72565b81146140c557600080fd5b50565b6140d181613ebe565b81146140dc57600080fd5b5056fea2646970667358221220bc1835cac710a7d0f3c3c38e53e161683cef765a9f57a98ccc3cde1dfcb3695364736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101b75760003560e01c806355f804b3116100ec57806398d5fdca1161008a578063c87b56dd11610064578063c87b56dd146105ee578063ca8001441461062b578063e985e9c514610654578063f2fde38b14610691576101b7565b806398d5fdca14610571578063a22cb4651461059c578063b88d4fde146105c5576101b7565b8063715018a6116100c6578063715018a6146104db5780638da5cb5b146104f257806391b7f5ed1461051d57806395d89b4114610546576101b7565b806355f804b3146104385780636352211e1461046157806370a082311461049e576101b7565b806323b872dd116101595780633ccfd60b116101335780633ccfd60b1461038b57806342842e0e14610395578063438b6300146103be5780634f6ccce7146103fb576101b7565b806323b872dd146103095780632f745c59146103325780633c6d2ff91461036f576101b7565b8063081812fc11610195578063081812fc1461024d578063095ea7b31461028a57806316c61ccc146102b357806318160ddd146102de576101b7565b806301ffc9a7146101bc57806302329a29146101f957806306fdde0314610222575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612e42565b6106ba565b6040516101f091906138fa565b60405180910390f35b34801561020557600080fd5b50610220600480360381019061021b9190612e19565b610734565b005b34801561022e57600080fd5b506102376107cd565b6040516102449190613915565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f9190612ed5565b61085f565b6040516102819190613871565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac9190612ddd565b6108e4565b005b3480156102bf57600080fd5b506102c86109fc565b6040516102d591906138fa565b60405180910390f35b3480156102ea57600080fd5b506102f3610a0f565b6040516103009190613c17565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b9190612cd7565b610a1c565b005b34801561033e57600080fd5b5061035960048036038101906103549190612ddd565b610a7c565b6040516103669190613c17565b60405180910390f35b61038960048036038101906103849190612ed5565b610b21565b005b610393610ca4565b005b3480156103a157600080fd5b506103bc60048036038101906103b79190612cd7565b610e46565b005b3480156103ca57600080fd5b506103e560048036038101906103e09190612c72565b610e66565b6040516103f291906138d8565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d9190612ed5565b610f60565b60405161042f9190613c17565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190612e94565b610ff7565b005b34801561046d57600080fd5b5061048860048036038101906104839190612ed5565b61108d565b6040516104959190613871565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c09190612c72565b61113f565b6040516104d29190613c17565b60405180910390f35b3480156104e757600080fd5b506104f06111f7565b005b3480156104fe57600080fd5b5061050761127f565b6040516105149190613871565b60405180910390f35b34801561052957600080fd5b50610544600480360381019061053f9190612ed5565b6112a9565b005b34801561055257600080fd5b5061055b61132f565b6040516105689190613915565b60405180910390f35b34801561057d57600080fd5b506105866113c1565b6040516105939190613c17565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be9190612da1565b6113cb565b005b3480156105d157600080fd5b506105ec60048036038101906105e79190612d26565b61154c565b005b3480156105fa57600080fd5b5061061560048036038101906106109190612ed5565b6115ae565b6040516106229190613915565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d9190612ddd565b611655565b005b34801561066057600080fd5b5061067b60048036038101906106769190612c9b565b611774565b60405161068891906138fa565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190612c72565b611808565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072d575061072c82611900565b5b9050919050565b61073c6119e2565b73ffffffffffffffffffffffffffffffffffffffff1661075a61127f565b73ffffffffffffffffffffffffffffffffffffffff16146107b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a790613b37565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6060600080546107dc90613f0a565b80601f016020809104026020016040519081016040528092919081815260200182805461080890613f0a565b80156108555780601f1061082a57610100808354040283529160200191610855565b820191906000526020600020905b81548152906001019060200180831161083857829003601f168201915b5050505050905090565b600061086a826119ea565b6108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a090613b17565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ef8261108d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095790613b97565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661097f6119e2565b73ffffffffffffffffffffffffffffffffffffffff1614806109ae57506109ad816109a86119e2565b611774565b5b6109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e490613a37565b60405180910390fd5b6109f78383611a56565b505050565b600e60009054906101000a900460ff1681565b6000600880549050905090565b610a2d610a276119e2565b82611b0f565b610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390613bd7565b60405180910390fd5b610a77838383611bed565b505050565b6000610a878361113f565b8210610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf90613957565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610b2b610a0f565b9050600e60009054906101000a900460ff1615610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490613937565b60405180910390fd5b600b8210610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb790613ab7565b60405180910390fd5b600c54610378610bd09190613e20565b8282610bdc9190613d3f565b10610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390613a97565b60405180910390fd5b81600d54610c2a9190613dc6565b341015610c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6390613bb7565b60405180910390fd5b60005b82811015610c9f57610c8c338284610c879190613d3f565b611e49565b8080610c9790613f3c565b915050610c6f565b505050565b610cac6119e2565b73ffffffffffffffffffffffffffffffffffffffff16610cca61127f565b73ffffffffffffffffffffffffffffffffffffffff1614610d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1790613b37565b60405180910390fd5b6702c68af0bb1400004711610d3457600080fd5b600067016345785d8a000047610d4a9190613e20565b905060005b601080549050811015610e4257600060108281548110610d98577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6064836001015486610df89190613dc6565b610e029190613d95565b9081150290604051600060405180830381858888f19350505050158015610e2d573d6000803e3d6000fd5b50508080610e3a90613f3c565b915050610d4f565b5050565b610e618383836040518060200160405280600081525061154c565b505050565b60606000610e738361113f565b905060008167ffffffffffffffff811115610eb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610ee55781602001602082028036833780820191505090505b50905060005b82811015610f5557610efd8582610a7c565b828281518110610f36577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610f4d90613f3c565b915050610eeb565b508092505050919050565b6000610f6a610a0f565b8210610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa290613bf7565b60405180910390fd5b60088281548110610fe5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610fff6119e2565b73ffffffffffffffffffffffffffffffffffffffff1661101d61127f565b73ffffffffffffffffffffffffffffffffffffffff1614611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a90613b37565b60405180910390fd5b80600b9080519060200190611089929190612a96565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112d90613a77565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a790613a57565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111ff6119e2565b73ffffffffffffffffffffffffffffffffffffffff1661121d61127f565b73ffffffffffffffffffffffffffffffffffffffff1614611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90613b37565b60405180910390fd5b61127d6000611e67565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112b16119e2565b73ffffffffffffffffffffffffffffffffffffffff166112cf61127f565b73ffffffffffffffffffffffffffffffffffffffff1614611325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131c90613b37565b60405180910390fd5b80600d8190555050565b60606001805461133e90613f0a565b80601f016020809104026020016040519081016040528092919081815260200182805461136a90613f0a565b80156113b75780601f1061138c576101008083540402835291602001916113b7565b820191906000526020600020905b81548152906001019060200180831161139a57829003601f168201915b5050505050905090565b6000600d54905090565b6113d36119e2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611441576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611438906139f7565b60405180910390fd5b806005600061144e6119e2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114fb6119e2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161154091906138fa565b60405180910390a35050565b61155d6115576119e2565b83611b0f565b61159c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159390613bd7565b60405180910390fd5b6115a884848484611f2d565b50505050565b60606115b9826119ea565b6115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90613b77565b60405180910390fd5b6000611602611f89565b90506000815111611622576040518060200160405280600081525061164d565b8061162c8461201b565b60405160200161163d92919061384d565b6040516020818303038152906040525b915050919050565b61165d6119e2565b73ffffffffffffffffffffffffffffffffffffffff1661167b61127f565b73ffffffffffffffffffffffffffffffffffffffff16146116d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c890613b37565b60405180910390fd5b600c54811115611716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170d90613af7565b60405180910390fd5b6000611720610a0f565b905060005b828110156117555761174284828461173d9190613d3f565b611e49565b808061174d90613f3c565b915050611725565b5081600c60008282546117689190613e20565b92505081905550505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118106119e2565b73ffffffffffffffffffffffffffffffffffffffff1661182e61127f565b73ffffffffffffffffffffffffffffffffffffffff1614611884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187b90613b37565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb90613997565b60405180910390fd5b6118fd81611e67565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119cb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119db57506119da826121c8565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ac98361108d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b1a826119ea565b611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090613a17565b60405180910390fd5b6000611b648361108d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bd357508373ffffffffffffffffffffffffffffffffffffffff16611bbb8461085f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611be45750611be38185611774565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c0d8261108d565b73ffffffffffffffffffffffffffffffffffffffff1614611c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5a90613b57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cca906139d7565b60405180910390fd5b611cde838383612232565b611ce9600082611a56565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d399190613e20565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d909190613d3f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e63828260405180602001604052806000815250612346565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f38848484611bed565b611f44848484846123a1565b611f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7a90613977565b60405180910390fd5b50505050565b6060600b8054611f9890613f0a565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc490613f0a565b80156120115780601f10611fe657610100808354040283529160200191612011565b820191906000526020600020905b815481529060010190602001808311611ff457829003601f168201915b5050505050905090565b60606000821415612063576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121c3565b600082905060005b6000821461209557808061207e90613f3c565b915050600a8261208e9190613d95565b915061206b565b60008167ffffffffffffffff8111156120d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121095781602001600182028036833780820191505090505b5090505b600085146121bc576001826121229190613e20565b9150600a856121319190613f85565b603061213d9190613d3f565b60f81b818381518110612179577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121b59190613d95565b945061210d565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61223d838383612538565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122805761227b8161253d565b6122bf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122be576122bd8382612586565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612302576122fd816126f3565b612341565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123405761233f8282612836565b5b5b505050565b61235083836128b5565b61235d60008484846123a1565b61239c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239390613977565b60405180910390fd5b505050565b60006123c28473ffffffffffffffffffffffffffffffffffffffff16612a83565b1561252b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123eb6119e2565b8786866040518563ffffffff1660e01b815260040161240d949392919061388c565b602060405180830381600087803b15801561242757600080fd5b505af192505050801561245857506040513d601f19601f820116820180604052508101906124559190612e6b565b60015b6124db573d8060008114612488576040519150601f19603f3d011682016040523d82523d6000602084013e61248d565b606091505b506000815114156124d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ca90613977565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612530565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016125938461113f565b61259d9190613e20565b9050600060076000848152602001908152602001600020549050818114612682576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127079190613e20565b905060006009600084815260200190815260200160002054905060006008838154811061275d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106127a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061281a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006128418361113f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291c90613ad7565b60405180910390fd5b61292e816119ea565b1561296e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612965906139b7565b60405180910390fd5b61297a60008383612232565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129ca9190613d3f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612aa290613f0a565b90600052602060002090601f016020900481019282612ac45760008555612b0b565b82601f10612add57805160ff1916838001178555612b0b565b82800160010185558215612b0b579182015b82811115612b0a578251825591602001919060010190612aef565b5b509050612b189190612b1c565b5090565b5b80821115612b35576000816000905550600101612b1d565b5090565b6000612b4c612b4784613c63565b613c32565b905082815260208101848484011115612b6457600080fd5b612b6f848285613ec8565b509392505050565b6000612b8a612b8584613c93565b613c32565b905082815260208101848484011115612ba257600080fd5b612bad848285613ec8565b509392505050565b600081359050612bc481614083565b92915050565b600081359050612bd98161409a565b92915050565b600081359050612bee816140b1565b92915050565b600081519050612c03816140b1565b92915050565b600082601f830112612c1a57600080fd5b8135612c2a848260208601612b39565b91505092915050565b600082601f830112612c4457600080fd5b8135612c54848260208601612b77565b91505092915050565b600081359050612c6c816140c8565b92915050565b600060208284031215612c8457600080fd5b6000612c9284828501612bb5565b91505092915050565b60008060408385031215612cae57600080fd5b6000612cbc85828601612bb5565b9250506020612ccd85828601612bb5565b9150509250929050565b600080600060608486031215612cec57600080fd5b6000612cfa86828701612bb5565b9350506020612d0b86828701612bb5565b9250506040612d1c86828701612c5d565b9150509250925092565b60008060008060808587031215612d3c57600080fd5b6000612d4a87828801612bb5565b9450506020612d5b87828801612bb5565b9350506040612d6c87828801612c5d565b925050606085013567ffffffffffffffff811115612d8957600080fd5b612d9587828801612c09565b91505092959194509250565b60008060408385031215612db457600080fd5b6000612dc285828601612bb5565b9250506020612dd385828601612bca565b9150509250929050565b60008060408385031215612df057600080fd5b6000612dfe85828601612bb5565b9250506020612e0f85828601612c5d565b9150509250929050565b600060208284031215612e2b57600080fd5b6000612e3984828501612bca565b91505092915050565b600060208284031215612e5457600080fd5b6000612e6284828501612bdf565b91505092915050565b600060208284031215612e7d57600080fd5b6000612e8b84828501612bf4565b91505092915050565b600060208284031215612ea657600080fd5b600082013567ffffffffffffffff811115612ec057600080fd5b612ecc84828501612c33565b91505092915050565b600060208284031215612ee757600080fd5b6000612ef584828501612c5d565b91505092915050565b6000612f0a838361382f565b60208301905092915050565b612f1f81613e54565b82525050565b6000612f3082613cd3565b612f3a8185613d01565b9350612f4583613cc3565b8060005b83811015612f76578151612f5d8882612efe565b9750612f6883613cf4565b925050600181019050612f49565b5085935050505092915050565b612f8c81613e66565b82525050565b6000612f9d82613cde565b612fa78185613d12565b9350612fb7818560208601613ed7565b612fc081614072565b840191505092915050565b6000612fd682613ce9565b612fe08185613d23565b9350612ff0818560208601613ed7565b612ff981614072565b840191505092915050565b600061300f82613ce9565b6130198185613d34565b9350613029818560208601613ed7565b80840191505092915050565b6000613042600b83613d23565b91507f53616c65207061757365640000000000000000000000000000000000000000006000830152602082019050919050565b6000613082602b83613d23565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006130e8603283613d23565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061314e602683613d23565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131b4601c83613d23565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006131f4602483613d23565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061325a601983613d23565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061329a602c83613d23565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613300603883613d23565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613366602a83613d23565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006133cc602983613d23565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613432601c83613d23565b91507f45786365656473206d6178696d756d20536361777920737570706c79000000006000830152602082019050919050565b6000613472602683613d23565b91507f596f752063616e206275792061206d6178696d756d206f66203230205363617760008301527f79204e46547300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134d8602083613d23565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613518602083613d23565b91507f457863656564732072657365727665642053636177794e465420737570706c796000830152602082019050919050565b6000613558602c83613d23565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006135be602083613d23565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006135fe602983613d23565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613664602f83613d23565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006136ca602183613d23565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613730601983613d23565b91507f45746865722073656e74206973206e6f7420636f7272656374000000000000006000830152602082019050919050565b6000613770603183613d23565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006137d6602c83613d23565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b61383881613ebe565b82525050565b61384781613ebe565b82525050565b60006138598285613004565b91506138658284613004565b91508190509392505050565b60006020820190506138866000830184612f16565b92915050565b60006080820190506138a16000830187612f16565b6138ae6020830186612f16565b6138bb604083018561383e565b81810360608301526138cd8184612f92565b905095945050505050565b600060208201905081810360008301526138f28184612f25565b905092915050565b600060208201905061390f6000830184612f83565b92915050565b6000602082019050818103600083015261392f8184612fcb565b905092915050565b6000602082019050818103600083015261395081613035565b9050919050565b6000602082019050818103600083015261397081613075565b9050919050565b60006020820190508181036000830152613990816130db565b9050919050565b600060208201905081810360008301526139b081613141565b9050919050565b600060208201905081810360008301526139d0816131a7565b9050919050565b600060208201905081810360008301526139f0816131e7565b9050919050565b60006020820190508181036000830152613a108161324d565b9050919050565b60006020820190508181036000830152613a308161328d565b9050919050565b60006020820190508181036000830152613a50816132f3565b9050919050565b60006020820190508181036000830152613a7081613359565b9050919050565b60006020820190508181036000830152613a90816133bf565b9050919050565b60006020820190508181036000830152613ab081613425565b9050919050565b60006020820190508181036000830152613ad081613465565b9050919050565b60006020820190508181036000830152613af0816134cb565b9050919050565b60006020820190508181036000830152613b108161350b565b9050919050565b60006020820190508181036000830152613b308161354b565b9050919050565b60006020820190508181036000830152613b50816135b1565b9050919050565b60006020820190508181036000830152613b70816135f1565b9050919050565b60006020820190508181036000830152613b9081613657565b9050919050565b60006020820190508181036000830152613bb0816136bd565b9050919050565b60006020820190508181036000830152613bd081613723565b9050919050565b60006020820190508181036000830152613bf081613763565b9050919050565b60006020820190508181036000830152613c10816137c9565b9050919050565b6000602082019050613c2c600083018461383e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613c5957613c58614043565b5b8060405250919050565b600067ffffffffffffffff821115613c7e57613c7d614043565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613cae57613cad614043565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d4a82613ebe565b9150613d5583613ebe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d8a57613d89613fb6565b5b828201905092915050565b6000613da082613ebe565b9150613dab83613ebe565b925082613dbb57613dba613fe5565b5b828204905092915050565b6000613dd182613ebe565b9150613ddc83613ebe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e1557613e14613fb6565b5b828202905092915050565b6000613e2b82613ebe565b9150613e3683613ebe565b925082821015613e4957613e48613fb6565b5b828203905092915050565b6000613e5f82613e9e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ef5578082015181840152602081019050613eda565b83811115613f04576000848401525b50505050565b60006002820490506001821680613f2257607f821691505b60208210811415613f3657613f35614014565b5b50919050565b6000613f4782613ebe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f7a57613f79613fb6565b5b600182019050919050565b6000613f9082613ebe565b9150613f9b83613ebe565b925082613fab57613faa613fe5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61408c81613e54565b811461409757600080fd5b50565b6140a381613e66565b81146140ae57600080fd5b50565b6140ba81613e72565b81146140c557600080fd5b50565b6140d181613ebe565b81146140dc57600080fd5b5056fea2646970667358221220bc1835cac710a7d0f3c3c38e53e161683cef765a9f57a98ccc3cde1dfcb3695364736f6c63430008000033

Deployed Bytecode Sourcemap

43218:2930:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36967:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45744:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24859:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26418:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25941:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43419:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37607:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27308:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37275:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44047:551;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45826:319;;;:::i;:::-;;27718:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44606:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37797:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45209:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24553:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24283:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4558:94;;;;;;;;;;;;;:::i;:::-;;3907:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44986:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25028:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45319:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26711:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27974:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25203:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45408:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27077:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4807:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36967:224;37069:4;37108:35;37093:50;;;:11;:50;;;;:90;;;;37147:36;37171:11;37147:23;:36::i;:::-;37093:90;37086:97;;36967:224;;;:::o;45744:74::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45807:3:::1;45797:7;;:13;;;;;;;;;;;;;;;;;;45744:74:::0;:::o;24859:100::-;24913:13;24946:5;24939:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24859:100;:::o;26418:221::-;26494:7;26522:16;26530:7;26522;:16::i;:::-;26514:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26607:15;:24;26623:7;26607:24;;;;;;;;;;;;;;;;;;;;;26600:31;;26418:221;;;:::o;25941:411::-;26022:13;26038:23;26053:7;26038:14;:23::i;:::-;26022:39;;26086:5;26080:11;;:2;:11;;;;26072:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26180:5;26164:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26189:37;26206:5;26213:12;:10;:12::i;:::-;26189:16;:37::i;:::-;26164:62;26142:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26323:21;26332:2;26336:7;26323:8;:21::i;:::-;25941:411;;;:::o;43419:26::-;;;;;;;;;;;;;:::o;37607:113::-;37668:7;37695:10;:17;;;;37688:24;;37607:113;:::o;27308:339::-;27503:41;27522:12;:10;:12::i;:::-;27536:7;27503:18;:41::i;:::-;27495:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27611:28;27621:4;27627:2;27631:7;27611:9;:28::i;:::-;27308:339;;;:::o;37275:256::-;37372:7;37408:23;37425:5;37408:16;:23::i;:::-;37400:5;:31;37392:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37497:12;:19;37510:5;37497:19;;;;;;;;;;;;;;;:26;37517:5;37497:26;;;;;;;;;;;;37490:33;;37275:256;;;;:::o;44047:551::-;44104:14;44121:13;:11;:13::i;:::-;44104:30;;44155:7;;;;;;;;;;;44154:8;44145:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;44234:2;44228:3;:8;44219:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;44350:9;;44344:3;:15;;;;:::i;:::-;44338:3;44329:6;:12;;;;:::i;:::-;:30;44320:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;44442:3;44433:6;;:12;;;;:::i;:::-;44420:9;:25;;44411:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;44505:9;44501:90;44520:3;44516:1;:7;44501:90;;;44544:35;44555:10;44576:1;44567:6;:10;;;;:::i;:::-;44544:9;:35::i;:::-;44525:3;;;;;:::i;:::-;;;;44501:90;;;;44047:551;;:::o;45826:319::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43674:9:::1;43650:21;:33;43642:42;;;::::0;::::1;;45900:13:::2;45940:9;45916:21;:33;;;;:::i;:::-;45900:49;;45964:6;45960:178;45980:14;:21;;;;45976:1;:25;45960:178;;;46022:24;46049:14;46064:1;46049:17;;;;;;;;;;;;;;;;;;;;;;;;;;46022:44;;46081:1;:6;;;;;;;;;;;;:15;;:45;46122:3;46109:1;:9;;;46098:8;:20;;;;:::i;:::-;46097:28;;;;:::i;:::-;46081:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;45960:178;46003:3;;;;;:::i;:::-;;;;45960:178;;;;43695:1;45826:319::o:0;27718:185::-;27856:39;27873:4;27879:2;27883:7;27856:39;;;;;;;;;;;;:16;:39::i;:::-;27718:185;;;:::o;44606:342::-;44665:16;44694:18;44715:17;44725:6;44715:9;:17::i;:::-;44694:38;;44745:25;44787:10;44773:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44745:53;;44813:9;44809:106;44828:10;44824:1;:14;44809:106;;;44873:30;44893:6;44901:1;44873:19;:30::i;:::-;44859:8;44868:1;44859:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;44840:3;;;;;:::i;:::-;;;;44809:106;;;;44932:8;44925:15;;;;44606:342;;;:::o;37797:233::-;37872:7;37908:30;:28;:30::i;:::-;37900:5;:38;37892:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38005:10;38016:5;38005:17;;;;;;;;;;;;;;;;;;;;;;;;37998:24;;37797:233;;;:::o;45209:102::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45296:7:::1;45280:13;:23;;;;;;;;;;;;:::i;:::-;;45209:102:::0;:::o;24553:239::-;24625:7;24645:13;24661:7;:16;24669:7;24661:16;;;;;;;;;;;;;;;;;;;;;24645:32;;24713:1;24696:19;;:5;:19;;;;24688:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24779:5;24772:12;;;24553:239;;;:::o;24283:208::-;24355:7;24400:1;24383:19;;:5;:19;;;;24375:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24467:9;:16;24477:5;24467:16;;;;;;;;;;;;;;;;24460:23;;24283:208;;;:::o;4558:94::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4623:21:::1;4641:1;4623:9;:21::i;:::-;4558:94::o:0;3907:87::-;3953:7;3980:6;;;;;;;;;;;3973:13;;3907:87;:::o;44986:93::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45062:9:::1;45053:6;:18;;;;44986:93:::0;:::o;25028:104::-;25084:13;25117:7;25110:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25028:104;:::o;45319:81::-;45360:7;45386:6;;45379:13;;45319:81;:::o;26711:295::-;26826:12;:10;:12::i;:::-;26814:24;;:8;:24;;;;26806:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26926:8;26881:18;:32;26900:12;:10;:12::i;:::-;26881:32;;;;;;;;;;;;;;;:42;26914:8;26881:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26979:8;26950:48;;26965:12;:10;:12::i;:::-;26950:48;;;26989:8;26950:48;;;;;;:::i;:::-;;;;;;;;26711:295;;:::o;27974:328::-;28149:41;28168:12;:10;:12::i;:::-;28182:7;28149:18;:41::i;:::-;28141:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28255:39;28269:4;28275:2;28279:7;28288:5;28255:13;:39::i;:::-;27974:328;;;;:::o;25203:334::-;25276:13;25310:16;25318:7;25310;:16::i;:::-;25302:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25391:21;25415:10;:8;:10::i;:::-;25391:34;;25467:1;25449:7;25443:21;:25;:86;;;;;;;;;;;;;;;;;25495:7;25504:18;:7;:16;:18::i;:::-;25478:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25443:86;25436:93;;;25203:334;;;:::o;45408:328::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45508:9:::1;;45497:7;:20;;45488:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45568:14;45585:13;:11;:13::i;:::-;45568:30;;45613:9;45609:87;45628:7;45624:1;:11;45609:87;;;45656:28;45667:3;45681:1;45672:6;:10;;;;:::i;:::-;45656:9;:28::i;:::-;45637:3;;;;;:::i;:::-;;;;45609:87;;;;45721:7;45708:9;;:20;;;;;;;:::i;:::-;;;;;;;;4198:1;45408:328:::0;;:::o;27077:164::-;27174:4;27198:18;:25;27217:5;27198:25;;;;;;;;;;;;;;;:35;27224:8;27198:35;;;;;;;;;;;;;;;;;;;;;;;;;27191:42;;27077:164;;;;:::o;4807:192::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4916:1:::1;4896:22;;:8;:22;;;;4888:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4972:19;4982:8;4972:9;:19::i;:::-;4807:192:::0;:::o;23914:305::-;24016:4;24068:25;24053:40;;;:11;:40;;;;:105;;;;24125:33;24110:48;;;:11;:48;;;;24053:105;:158;;;;24175:36;24199:11;24175:23;:36::i;:::-;24053:158;24033:178;;23914:305;;;:::o;2695:98::-;2748:7;2775:10;2768:17;;2695:98;:::o;29812:127::-;29877:4;29929:1;29901:30;;:7;:16;29909:7;29901:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29894:37;;29812:127;;;:::o;33794:174::-;33896:2;33869:15;:24;33885:7;33869:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33952:7;33948:2;33914:46;;33923:23;33938:7;33923:14;:23::i;:::-;33914:46;;;;;;;;;;;;33794:174;;:::o;30106:348::-;30199:4;30224:16;30232:7;30224;:16::i;:::-;30216:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30300:13;30316:23;30331:7;30316:14;:23::i;:::-;30300:39;;30369:5;30358:16;;:7;:16;;;:51;;;;30402:7;30378:31;;:20;30390:7;30378:11;:20::i;:::-;:31;;;30358:51;:87;;;;30413:32;30430:5;30437:7;30413:16;:32::i;:::-;30358:87;30350:96;;;30106:348;;;;:::o;33098:578::-;33257:4;33230:31;;:23;33245:7;33230:14;:23::i;:::-;:31;;;33222:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33340:1;33326:16;;:2;:16;;;;33318:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33396:39;33417:4;33423:2;33427:7;33396:20;:39::i;:::-;33500:29;33517:1;33521:7;33500:8;:29::i;:::-;33561:1;33542:9;:15;33552:4;33542:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33590:1;33573:9;:13;33583:2;33573:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33621:2;33602:7;:16;33610:7;33602:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33660:7;33656:2;33641:27;;33650:4;33641:27;;;;;;;;;;;;33098:578;;;:::o;30796:110::-;30872:26;30882:2;30886:7;30872:26;;;;;;;;;;;;:9;:26::i;:::-;30796:110;;:::o;5007:173::-;5063:16;5082:6;;;;;;;;;;;5063:25;;5108:8;5099:6;;:17;;;;;;;;;;;;;;;;;;5163:8;5132:40;;5153:8;5132:40;;;;;;;;;;;;5007:173;;:::o;29184:315::-;29341:28;29351:4;29357:2;29361:7;29341:9;:28::i;:::-;29388:48;29411:4;29417:2;29421:7;29430:5;29388:22;:48::i;:::-;29380:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29184:315;;;;:::o;45087:114::-;45147:13;45180;45173:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45087:114;:::o;311:723::-;367:13;597:1;588:5;:10;584:53;;;615:10;;;;;;;;;;;;;;;;;;;;;584:53;647:12;662:5;647:20;;678:14;703:78;718:1;710:4;:9;703:78;;736:8;;;;;:::i;:::-;;;;767:2;759:10;;;;;:::i;:::-;;;703:78;;;791:19;823:6;813:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;791:39;;841:154;857:1;848:5;:10;841:154;;885:1;875:11;;;;;:::i;:::-;;;952:2;944:5;:10;;;;:::i;:::-;931:2;:24;;;;:::i;:::-;918:39;;901:6;908;901:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;841:154;;;1019:6;1005:21;;;;;311:723;;;;:::o;15893:157::-;15978:4;16017:25;16002:40;;;:11;:40;;;;15995:47;;15893:157;;;:::o;38643:589::-;38787:45;38814:4;38820:2;38824:7;38787:26;:45::i;:::-;38865:1;38849:18;;:4;:18;;;38845:187;;;38884:40;38916:7;38884:31;:40::i;:::-;38845:187;;;38954:2;38946:10;;:4;:10;;;38942:90;;38973:47;39006:4;39012:7;38973:32;:47::i;:::-;38942:90;38845:187;39060:1;39046:16;;:2;:16;;;39042:183;;;39079:45;39116:7;39079:36;:45::i;:::-;39042:183;;;39152:4;39146:10;;:2;:10;;;39142:83;;39173:40;39201:2;39205:7;39173:27;:40::i;:::-;39142:83;39042:183;38643:589;;;:::o;31133:321::-;31263:18;31269:2;31273:7;31263:5;:18::i;:::-;31314:54;31345:1;31349:2;31353:7;31362:5;31314:22;:54::i;:::-;31292:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31133:321;;;:::o;34533:799::-;34688:4;34709:15;:2;:13;;;:15::i;:::-;34705:620;;;34761:2;34745:36;;;34782:12;:10;:12::i;:::-;34796:4;34802:7;34811:5;34745:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34741:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35004:1;34987:6;:13;:18;34983:272;;;35030:60;;;;;;;;;;:::i;:::-;;;;;;;;34983:272;35205:6;35199:13;35190:6;35186:2;35182:15;35175:38;34741:529;34878:41;;;34868:51;;;:6;:51;;;;34861:58;;;;;34705:620;35309:4;35302:11;;34533:799;;;;;;;:::o;35904:126::-;;;;:::o;39955:164::-;40059:10;:17;;;;40032:15;:24;40048:7;40032:24;;;;;;;;;;;:44;;;;40087:10;40103:7;40087:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39955:164;:::o;40746:988::-;41012:22;41062:1;41037:22;41054:4;41037:16;:22::i;:::-;:26;;;;:::i;:::-;41012:51;;41074:18;41095:17;:26;41113:7;41095:26;;;;;;;;;;;;41074:47;;41242:14;41228:10;:28;41224:328;;41273:19;41295:12;:18;41308:4;41295:18;;;;;;;;;;;;;;;:34;41314:14;41295:34;;;;;;;;;;;;41273:56;;41379:11;41346:12;:18;41359:4;41346:18;;;;;;;;;;;;;;;:30;41365:10;41346:30;;;;;;;;;;;:44;;;;41496:10;41463:17;:30;41481:11;41463:30;;;;;;;;;;;:43;;;;41224:328;;41648:17;:26;41666:7;41648:26;;;;;;;;;;;41641:33;;;41692:12;:18;41705:4;41692:18;;;;;;;;;;;;;;;:34;41711:14;41692:34;;;;;;;;;;;41685:41;;;40746:988;;;;:::o;42029:1079::-;42282:22;42327:1;42307:10;:17;;;;:21;;;;:::i;:::-;42282:46;;42339:18;42360:15;:24;42376:7;42360:24;;;;;;;;;;;;42339:45;;42711:19;42733:10;42744:14;42733:26;;;;;;;;;;;;;;;;;;;;;;;;42711:48;;42797:11;42772:10;42783;42772:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;42908:10;42877:15;:28;42893:11;42877:28;;;;;;;;;;;:41;;;;43049:15;:24;43065:7;43049:24;;;;;;;;;;;43042:31;;;43084:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42029:1079;;;;:::o;39533:221::-;39618:14;39635:20;39652:2;39635:16;:20::i;:::-;39618:37;;39693:7;39666:12;:16;39679:2;39666:16;;;;;;;;;;;;;;;:24;39683:6;39666:24;;;;;;;;;;;:34;;;;39740:6;39711:17;:26;39729:7;39711:26;;;;;;;;;;;:35;;;;39533:221;;;:::o;31790:382::-;31884:1;31870:16;;:2;:16;;;;31862:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31943:16;31951:7;31943;:16::i;:::-;31942:17;31934:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32005:45;32034:1;32038:2;32042:7;32005:20;:45::i;:::-;32080:1;32063:9;:13;32073:2;32063:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32111:2;32092:7;:16;32100:7;32092:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32156:7;32152:2;32131:33;;32148:1;32131:33;;;;;;;;;;;;31790:382;;:::o;5953:387::-;6013:4;6221:12;6288:7;6276:20;6268:28;;6331:1;6324:4;:8;6317:15;;;5953:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:256::-;;4986:2;4974:9;4965:7;4961:23;4957:32;4954:2;;;5002:1;4999;4992:12;4954:2;5045:1;5070:50;5112:7;5103:6;5092:9;5088:22;5070:50;:::i;:::-;5060:60;;5016:114;4944:193;;;;:::o;5143:260::-;;5250:2;5238:9;5229:7;5225:23;5221:32;5218:2;;;5266:1;5263;5256:12;5218:2;5309:1;5334:52;5378:7;5369:6;5358:9;5354:22;5334:52;:::i;:::-;5324:62;;5280:116;5208:195;;;;:::o;5409:282::-;;5527:2;5515:9;5506:7;5502:23;5498:32;5495:2;;;5543:1;5540;5533:12;5495:2;5586:1;5611:63;5666:7;5657:6;5646:9;5642:22;5611:63;:::i;:::-;5601:73;;5557:127;5485:206;;;;:::o;5697:375::-;;5815:2;5803:9;5794:7;5790:23;5786:32;5783:2;;;5831:1;5828;5821:12;5783:2;5902:1;5891:9;5887:17;5874:31;5932:18;5924:6;5921:30;5918:2;;;5964:1;5961;5954:12;5918:2;5992:63;6047:7;6038:6;6027:9;6023:22;5992:63;:::i;:::-;5982:73;;5845:220;5773:299;;;;:::o;6078:262::-;;6186:2;6174:9;6165:7;6161:23;6157:32;6154:2;;;6202:1;6199;6192:12;6154:2;6245:1;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6216:117;6144:196;;;;:::o;6346:179::-;;6436:46;6478:3;6470:6;6436:46;:::i;:::-;6514:4;6509:3;6505:14;6491:28;;6426:99;;;;:::o;6531:118::-;6618:24;6636:5;6618:24;:::i;:::-;6613:3;6606:37;6596:53;;:::o;6685:732::-;;6833:54;6881:5;6833:54;:::i;:::-;6903:86;6982:6;6977:3;6903:86;:::i;:::-;6896:93;;7013:56;7063:5;7013:56;:::i;:::-;7092:7;7123:1;7108:284;7133:6;7130:1;7127:13;7108:284;;;7209:6;7203:13;7236:63;7295:3;7280:13;7236:63;:::i;:::-;7229:70;;7322:60;7375:6;7322:60;:::i;:::-;7312:70;;7168:224;7155:1;7152;7148:9;7143:14;;7108:284;;;7112:14;7408:3;7401:10;;6809:608;;;;;;;:::o;7423:109::-;7504:21;7519:5;7504:21;:::i;:::-;7499:3;7492:34;7482:50;;:::o;7538:360::-;;7652:38;7684:5;7652:38;:::i;:::-;7706:70;7769:6;7764:3;7706:70;:::i;:::-;7699:77;;7785:52;7830:6;7825:3;7818:4;7811:5;7807:16;7785:52;:::i;:::-;7862:29;7884:6;7862:29;:::i;:::-;7857:3;7853:39;7846:46;;7628:270;;;;;:::o;7904:364::-;;8020:39;8053:5;8020:39;:::i;:::-;8075:71;8139:6;8134:3;8075:71;:::i;:::-;8068:78;;8155:52;8200:6;8195:3;8188:4;8181:5;8177:16;8155:52;:::i;:::-;8232:29;8254:6;8232:29;:::i;:::-;8227:3;8223:39;8216:46;;7996:272;;;;;:::o;8274:377::-;;8408:39;8441:5;8408:39;:::i;:::-;8463:89;8545:6;8540:3;8463:89;:::i;:::-;8456:96;;8561:52;8606:6;8601:3;8594:4;8587:5;8583:16;8561:52;:::i;:::-;8638:6;8633:3;8629:16;8622:23;;8384:267;;;;;:::o;8657:309::-;;8820:67;8884:2;8879:3;8820:67;:::i;:::-;8813:74;;8917:13;8913:1;8908:3;8904:11;8897:34;8957:2;8952:3;8948:12;8941:19;;8803:163;;;:::o;8972:375::-;;9135:67;9199:2;9194:3;9135:67;:::i;:::-;9128:74;;9232:34;9228:1;9223:3;9219:11;9212:55;9298:13;9293:2;9288:3;9284:12;9277:35;9338:2;9333:3;9329:12;9322:19;;9118:229;;;:::o;9353:382::-;;9516:67;9580:2;9575:3;9516:67;:::i;:::-;9509:74;;9613:34;9609:1;9604:3;9600:11;9593:55;9679:20;9674:2;9669:3;9665:12;9658:42;9726:2;9721:3;9717:12;9710:19;;9499:236;;;:::o;9741:370::-;;9904:67;9968:2;9963:3;9904:67;:::i;:::-;9897:74;;10001:34;9997:1;9992:3;9988:11;9981:55;10067:8;10062:2;10057:3;10053:12;10046:30;10102:2;10097:3;10093:12;10086:19;;9887:224;;;:::o;10117:326::-;;10280:67;10344:2;10339:3;10280:67;:::i;:::-;10273:74;;10377:30;10373:1;10368:3;10364:11;10357:51;10434:2;10429:3;10425:12;10418:19;;10263:180;;;:::o;10449:368::-;;10612:67;10676:2;10671:3;10612:67;:::i;:::-;10605:74;;10709:34;10705:1;10700:3;10696:11;10689:55;10775:6;10770:2;10765:3;10761:12;10754:28;10808:2;10803:3;10799:12;10792:19;;10595:222;;;:::o;10823:323::-;;10986:67;11050:2;11045:3;10986:67;:::i;:::-;10979:74;;11083:27;11079:1;11074:3;11070:11;11063:48;11137:2;11132:3;11128:12;11121:19;;10969:177;;;:::o;11152:376::-;;11315:67;11379:2;11374:3;11315:67;:::i;:::-;11308:74;;11412:34;11408:1;11403:3;11399:11;11392:55;11478:14;11473:2;11468:3;11464:12;11457:36;11519:2;11514:3;11510:12;11503:19;;11298:230;;;:::o;11534:388::-;;11697:67;11761:2;11756:3;11697:67;:::i;:::-;11690:74;;11794:34;11790:1;11785:3;11781:11;11774:55;11860:26;11855:2;11850:3;11846:12;11839:48;11913:2;11908:3;11904:12;11897:19;;11680:242;;;:::o;11928:374::-;;12091:67;12155:2;12150:3;12091:67;:::i;:::-;12084:74;;12188:34;12184:1;12179:3;12175:11;12168:55;12254:12;12249:2;12244:3;12240:12;12233:34;12293:2;12288:3;12284:12;12277:19;;12074:228;;;:::o;12308:373::-;;12471:67;12535:2;12530:3;12471:67;:::i;:::-;12464:74;;12568:34;12564:1;12559:3;12555:11;12548:55;12634:11;12629:2;12624:3;12620:12;12613:33;12672:2;12667:3;12663:12;12656:19;;12454:227;;;:::o;12687:326::-;;12850:67;12914:2;12909:3;12850:67;:::i;:::-;12843:74;;12947:30;12943:1;12938:3;12934:11;12927:51;13004:2;12999:3;12995:12;12988:19;;12833:180;;;:::o;13019:370::-;;13182:67;13246:2;13241:3;13182:67;:::i;:::-;13175:74;;13279:34;13275:1;13270:3;13266:11;13259:55;13345:8;13340:2;13335:3;13331:12;13324:30;13380:2;13375:3;13371:12;13364:19;;13165:224;;;:::o;13395:330::-;;13558:67;13622:2;13617:3;13558:67;:::i;:::-;13551:74;;13655:34;13651:1;13646:3;13642:11;13635:55;13716:2;13711:3;13707:12;13700:19;;13541:184;;;:::o;13731:330::-;;13894:67;13958:2;13953:3;13894:67;:::i;:::-;13887:74;;13991:34;13987:1;13982:3;13978:11;13971:55;14052:2;14047:3;14043:12;14036:19;;13877:184;;;:::o;14067:376::-;;14230:67;14294:2;14289:3;14230:67;:::i;:::-;14223:74;;14327:34;14323:1;14318:3;14314:11;14307:55;14393:14;14388:2;14383:3;14379:12;14372:36;14434:2;14429:3;14425:12;14418:19;;14213:230;;;:::o;14449:330::-;;14612:67;14676:2;14671:3;14612:67;:::i;:::-;14605:74;;14709:34;14705:1;14700:3;14696:11;14689:55;14770:2;14765:3;14761:12;14754:19;;14595:184;;;:::o;14785:373::-;;14948:67;15012:2;15007:3;14948:67;:::i;:::-;14941:74;;15045:34;15041:1;15036:3;15032:11;15025:55;15111:11;15106:2;15101:3;15097:12;15090:33;15149:2;15144:3;15140:12;15133:19;;14931:227;;;:::o;15164:379::-;;15327:67;15391:2;15386:3;15327:67;:::i;:::-;15320:74;;15424:34;15420:1;15415:3;15411:11;15404:55;15490:17;15485:2;15480:3;15476:12;15469:39;15534:2;15529:3;15525:12;15518:19;;15310:233;;;:::o;15549:365::-;;15712:67;15776:2;15771:3;15712:67;:::i;:::-;15705:74;;15809:34;15805:1;15800:3;15796:11;15789:55;15875:3;15870:2;15865:3;15861:12;15854:25;15905:2;15900:3;15896:12;15889:19;;15695:219;;;:::o;15920:323::-;;16083:67;16147:2;16142:3;16083:67;:::i;:::-;16076:74;;16180:27;16176:1;16171:3;16167:11;16160:48;16234:2;16229:3;16225:12;16218:19;;16066:177;;;:::o;16249:381::-;;16412:67;16476:2;16471:3;16412:67;:::i;:::-;16405:74;;16509:34;16505:1;16500:3;16496:11;16489:55;16575:19;16570:2;16565:3;16561:12;16554:41;16621:2;16616:3;16612:12;16605:19;;16395:235;;;:::o;16636:376::-;;16799:67;16863:2;16858:3;16799:67;:::i;:::-;16792:74;;16896:34;16892:1;16887:3;16883:11;16876:55;16962:14;16957:2;16952:3;16948:12;16941:36;17003:2;16998:3;16994:12;16987:19;;16782:230;;;:::o;17018:108::-;17095:24;17113:5;17095:24;:::i;:::-;17090:3;17083:37;17073:53;;:::o;17132:118::-;17219:24;17237:5;17219:24;:::i;:::-;17214:3;17207:37;17197:53;;:::o;17256:435::-;;17458:95;17549:3;17540:6;17458:95;:::i;:::-;17451:102;;17570:95;17661:3;17652:6;17570:95;:::i;:::-;17563:102;;17682:3;17675:10;;17440:251;;;;;:::o;17697:222::-;;17828:2;17817:9;17813:18;17805:26;;17841:71;17909:1;17898:9;17894:17;17885:6;17841:71;:::i;:::-;17795:124;;;;:::o;17925:640::-;;18158:3;18147:9;18143:19;18135:27;;18172:71;18240:1;18229:9;18225:17;18216:6;18172:71;:::i;:::-;18253:72;18321:2;18310:9;18306:18;18297:6;18253:72;:::i;:::-;18335;18403:2;18392:9;18388:18;18379:6;18335:72;:::i;:::-;18454:9;18448:4;18444:20;18439:2;18428:9;18424:18;18417:48;18482:76;18553:4;18544:6;18482:76;:::i;:::-;18474:84;;18125:440;;;;;;;:::o;18571:373::-;;18752:2;18741:9;18737:18;18729:26;;18801:9;18795:4;18791:20;18787:1;18776:9;18772:17;18765:47;18829:108;18932:4;18923:6;18829:108;:::i;:::-;18821:116;;18719:225;;;;:::o;18950:210::-;;19075:2;19064:9;19060:18;19052:26;;19088:65;19150:1;19139:9;19135:17;19126:6;19088:65;:::i;:::-;19042:118;;;;:::o;19166:313::-;;19317:2;19306:9;19302:18;19294:26;;19366:9;19360:4;19356:20;19352:1;19341:9;19337:17;19330:47;19394:78;19467:4;19458:6;19394:78;:::i;:::-;19386:86;;19284:195;;;;:::o;19485:419::-;;19689:2;19678:9;19674:18;19666:26;;19738:9;19732:4;19728:20;19724:1;19713:9;19709:17;19702:47;19766:131;19892:4;19766:131;:::i;:::-;19758:139;;19656:248;;;:::o;19910:419::-;;20114:2;20103:9;20099:18;20091:26;;20163:9;20157:4;20153:20;20149:1;20138:9;20134:17;20127:47;20191:131;20317:4;20191:131;:::i;:::-;20183:139;;20081:248;;;:::o;20335:419::-;;20539:2;20528:9;20524:18;20516:26;;20588:9;20582:4;20578:20;20574:1;20563:9;20559:17;20552:47;20616:131;20742:4;20616:131;:::i;:::-;20608:139;;20506:248;;;:::o;20760:419::-;;20964:2;20953:9;20949:18;20941:26;;21013:9;21007:4;21003:20;20999:1;20988:9;20984:17;20977:47;21041:131;21167:4;21041:131;:::i;:::-;21033:139;;20931:248;;;:::o;21185:419::-;;21389:2;21378:9;21374:18;21366:26;;21438:9;21432:4;21428:20;21424:1;21413:9;21409:17;21402:47;21466:131;21592:4;21466:131;:::i;:::-;21458:139;;21356:248;;;:::o;21610:419::-;;21814:2;21803:9;21799:18;21791:26;;21863:9;21857:4;21853:20;21849:1;21838:9;21834:17;21827:47;21891:131;22017:4;21891:131;:::i;:::-;21883:139;;21781:248;;;:::o;22035:419::-;;22239:2;22228:9;22224:18;22216:26;;22288:9;22282:4;22278:20;22274:1;22263:9;22259:17;22252:47;22316:131;22442:4;22316:131;:::i;:::-;22308:139;;22206:248;;;:::o;22460:419::-;;22664:2;22653:9;22649:18;22641:26;;22713:9;22707:4;22703:20;22699:1;22688:9;22684:17;22677:47;22741:131;22867:4;22741:131;:::i;:::-;22733:139;;22631:248;;;:::o;22885:419::-;;23089:2;23078:9;23074:18;23066:26;;23138:9;23132:4;23128:20;23124:1;23113:9;23109:17;23102:47;23166:131;23292:4;23166:131;:::i;:::-;23158:139;;23056:248;;;:::o;23310:419::-;;23514:2;23503:9;23499:18;23491:26;;23563:9;23557:4;23553:20;23549:1;23538:9;23534:17;23527:47;23591:131;23717:4;23591:131;:::i;:::-;23583:139;;23481:248;;;:::o;23735:419::-;;23939:2;23928:9;23924:18;23916:26;;23988:9;23982:4;23978:20;23974:1;23963:9;23959:17;23952:47;24016:131;24142:4;24016:131;:::i;:::-;24008:139;;23906:248;;;:::o;24160:419::-;;24364:2;24353:9;24349:18;24341:26;;24413:9;24407:4;24403:20;24399:1;24388:9;24384:17;24377:47;24441:131;24567:4;24441:131;:::i;:::-;24433:139;;24331:248;;;:::o;24585:419::-;;24789:2;24778:9;24774:18;24766:26;;24838:9;24832:4;24828:20;24824:1;24813:9;24809:17;24802:47;24866:131;24992:4;24866:131;:::i;:::-;24858:139;;24756:248;;;:::o;25010:419::-;;25214:2;25203:9;25199:18;25191:26;;25263:9;25257:4;25253:20;25249:1;25238:9;25234:17;25227:47;25291:131;25417:4;25291:131;:::i;:::-;25283:139;;25181:248;;;:::o;25435:419::-;;25639:2;25628:9;25624:18;25616:26;;25688:9;25682:4;25678:20;25674:1;25663:9;25659:17;25652:47;25716:131;25842:4;25716:131;:::i;:::-;25708:139;;25606:248;;;:::o;25860:419::-;;26064:2;26053:9;26049:18;26041:26;;26113:9;26107:4;26103:20;26099:1;26088:9;26084:17;26077:47;26141:131;26267:4;26141:131;:::i;:::-;26133:139;;26031:248;;;:::o;26285:419::-;;26489:2;26478:9;26474:18;26466:26;;26538:9;26532:4;26528:20;26524:1;26513:9;26509:17;26502:47;26566:131;26692:4;26566:131;:::i;:::-;26558:139;;26456:248;;;:::o;26710:419::-;;26914:2;26903:9;26899:18;26891:26;;26963:9;26957:4;26953:20;26949:1;26938:9;26934:17;26927:47;26991:131;27117:4;26991:131;:::i;:::-;26983:139;;26881:248;;;:::o;27135:419::-;;27339:2;27328:9;27324:18;27316:26;;27388:9;27382:4;27378:20;27374:1;27363:9;27359:17;27352:47;27416:131;27542:4;27416:131;:::i;:::-;27408:139;;27306:248;;;:::o;27560:419::-;;27764:2;27753:9;27749:18;27741:26;;27813:9;27807:4;27803:20;27799:1;27788:9;27784:17;27777:47;27841:131;27967:4;27841:131;:::i;:::-;27833:139;;27731:248;;;:::o;27985:419::-;;28189:2;28178:9;28174:18;28166:26;;28238:9;28232:4;28228:20;28224:1;28213:9;28209:17;28202:47;28266:131;28392:4;28266:131;:::i;:::-;28258:139;;28156:248;;;:::o;28410:419::-;;28614:2;28603:9;28599:18;28591:26;;28663:9;28657:4;28653:20;28649:1;28638:9;28634:17;28627:47;28691:131;28817:4;28691:131;:::i;:::-;28683:139;;28581:248;;;:::o;28835:419::-;;29039:2;29028:9;29024:18;29016:26;;29088:9;29082:4;29078:20;29074:1;29063:9;29059:17;29052:47;29116:131;29242:4;29116:131;:::i;:::-;29108:139;;29006:248;;;:::o;29260:222::-;;29391:2;29380:9;29376:18;29368:26;;29404:71;29472:1;29461:9;29457:17;29448:6;29404:71;:::i;:::-;29358:124;;;;:::o;29488:283::-;;29554:2;29548:9;29538:19;;29596:4;29588:6;29584:17;29703:6;29691:10;29688:22;29667:18;29655:10;29652:34;29649:62;29646:2;;;29714:18;;:::i;:::-;29646:2;29754:10;29750:2;29743:22;29528:243;;;;:::o;29777:331::-;;29928:18;29920:6;29917:30;29914:2;;;29950:18;;:::i;:::-;29914:2;30035:4;30031:9;30024:4;30016:6;30012:17;30008:33;30000:41;;30096:4;30090;30086:15;30078:23;;29843:265;;;:::o;30114:332::-;;30266:18;30258:6;30255:30;30252:2;;;30288:18;;:::i;:::-;30252:2;30373:4;30369:9;30362:4;30354:6;30350:17;30346:33;30338:41;;30434:4;30428;30424:15;30416:23;;30181:265;;;:::o;30452:132::-;;30542:3;30534:11;;30572:4;30567:3;30563:14;30555:22;;30524:60;;;:::o;30590:114::-;;30691:5;30685:12;30675:22;;30664:40;;;:::o;30710:98::-;;30795:5;30789:12;30779:22;;30768:40;;;:::o;30814:99::-;;30900:5;30894:12;30884:22;;30873:40;;;:::o;30919:113::-;;31021:4;31016:3;31012:14;31004:22;;30994:38;;;:::o;31038:184::-;;31171:6;31166:3;31159:19;31211:4;31206:3;31202:14;31187:29;;31149:73;;;;:::o;31228:168::-;;31345:6;31340:3;31333:19;31385:4;31380:3;31376:14;31361:29;;31323:73;;;;:::o;31402:169::-;;31520:6;31515:3;31508:19;31560:4;31555:3;31551:14;31536:29;;31498:73;;;;:::o;31577:148::-;;31716:3;31701:18;;31691:34;;;;:::o;31731:305::-;;31790:20;31808:1;31790:20;:::i;:::-;31785:25;;31824:20;31842:1;31824:20;:::i;:::-;31819:25;;31978:1;31910:66;31906:74;31903:1;31900:81;31897:2;;;31984:18;;:::i;:::-;31897:2;32028:1;32025;32021:9;32014:16;;31775:261;;;;:::o;32042:185::-;;32099:20;32117:1;32099:20;:::i;:::-;32094:25;;32133:20;32151:1;32133:20;:::i;:::-;32128:25;;32172:1;32162:2;;32177:18;;:::i;:::-;32162:2;32219:1;32216;32212:9;32207:14;;32084:143;;;;:::o;32233:348::-;;32296:20;32314:1;32296:20;:::i;:::-;32291:25;;32330:20;32348:1;32330:20;:::i;:::-;32325:25;;32518:1;32450:66;32446:74;32443:1;32440:81;32435:1;32428:9;32421:17;32417:105;32414:2;;;32525:18;;:::i;:::-;32414:2;32573:1;32570;32566:9;32555:20;;32281:300;;;;:::o;32587:191::-;;32647:20;32665:1;32647:20;:::i;:::-;32642:25;;32681:20;32699:1;32681:20;:::i;:::-;32676:25;;32720:1;32717;32714:8;32711:2;;;32725:18;;:::i;:::-;32711:2;32770:1;32767;32763:9;32755:17;;32632:146;;;;:::o;32784:96::-;;32850:24;32868:5;32850:24;:::i;:::-;32839:35;;32829:51;;;:::o;32886:90::-;;32963:5;32956:13;32949:21;32938:32;;32928:48;;;:::o;32982:149::-;;33058:66;33051:5;33047:78;33036:89;;33026:105;;;:::o;33137:126::-;;33214:42;33207:5;33203:54;33192:65;;33182:81;;;:::o;33269:77::-;;33335:5;33324:16;;33314:32;;;:::o;33352:154::-;33436:6;33431:3;33426;33413:30;33498:1;33489:6;33484:3;33480:16;33473:27;33403:103;;;:::o;33512:307::-;33580:1;33590:113;33604:6;33601:1;33598:13;33590:113;;;33689:1;33684:3;33680:11;33674:18;33670:1;33665:3;33661:11;33654:39;33626:2;33623:1;33619:10;33614:15;;33590:113;;;33721:6;33718:1;33715:13;33712:2;;;33801:1;33792:6;33787:3;33783:16;33776:27;33712:2;33561:258;;;;:::o;33825:320::-;;33906:1;33900:4;33896:12;33886:22;;33953:1;33947:4;33943:12;33974:18;33964:2;;34030:4;34022:6;34018:17;34008:27;;33964:2;34092;34084:6;34081:14;34061:18;34058:38;34055:2;;;34111:18;;:::i;:::-;34055:2;33876:269;;;;:::o;34151:233::-;;34213:24;34231:5;34213:24;:::i;:::-;34204:33;;34259:66;34252:5;34249:77;34246:2;;;34329:18;;:::i;:::-;34246:2;34376:1;34369:5;34365:13;34358:20;;34194:190;;;:::o;34390:176::-;;34439:20;34457:1;34439:20;:::i;:::-;34434:25;;34473:20;34491:1;34473:20;:::i;:::-;34468:25;;34512:1;34502:2;;34517:18;;:::i;:::-;34502:2;34558:1;34555;34551:9;34546:14;;34424:142;;;;:::o;34572:180::-;34620:77;34617:1;34610:88;34717:4;34714:1;34707:15;34741:4;34738:1;34731:15;34758:180;34806:77;34803:1;34796:88;34903:4;34900:1;34893:15;34927:4;34924:1;34917:15;34944:180;34992:77;34989:1;34982:88;35089:4;35086:1;35079:15;35113:4;35110:1;35103:15;35130:180;35178:77;35175:1;35168:88;35275:4;35272:1;35265:15;35299:4;35296:1;35289:15;35316:102;;35408:2;35404:7;35399:2;35392:5;35388:14;35384:28;35374:38;;35364:54;;;:::o;35424:122::-;35497:24;35515:5;35497:24;:::i;:::-;35490:5;35487:35;35477:2;;35536:1;35533;35526:12;35477:2;35467:79;:::o;35552:116::-;35622:21;35637:5;35622:21;:::i;:::-;35615:5;35612:32;35602:2;;35658:1;35655;35648:12;35602:2;35592:76;:::o;35674:120::-;35746:23;35763:5;35746:23;:::i;:::-;35739:5;35736:34;35726:2;;35784:1;35781;35774:12;35726:2;35716:78;:::o;35800:122::-;35873:24;35891:5;35873:24;:::i;:::-;35866:5;35863:35;35853:2;;35912:1;35909;35902:12;35853:2;35843:79;:::o

Swarm Source

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