Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
5,555 GAW
Holders
1,100
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 GAWLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GoblinandWarriors
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-04 */ // SPDX-License-Identifier: SimPL-2.0 // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (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 // OpenZeppelin Contracts (last updated v4.7.0) (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() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (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 // OpenZeppelin Contracts v4.4.1 (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 // OpenZeppelin Contracts (last updated v4.7.0) (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`. * * 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; /** * @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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (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); /** * @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 // OpenZeppelin Contracts v4.4.1 (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 // OpenZeppelin Contracts (last updated v4.7.0) (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: address zero is not a valid owner"); 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: invalid token ID"); 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) { _requireMinted(tokenId); 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 overridden 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 token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_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: caller is not token 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: caller is not token 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (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: GoblinandWarriors.sol pragma solidity ^0.8.0; contract GoblinandWarriors is ERC721, ERC721Enumerable, Ownable { string public PROVENANCE; bool public saleIsActive = true; string private _baseURIextended; bool public isAllowListActive = false; uint256 public constant MAX_SUPPLY = 5555; uint256 public constant MAX_PUBLIC_MINT = 5; uint256 public constant PRICE_PER_TOKEN = 0 ether; uint256 public constant AllowPRICE_PER_TOKEN = 0.005 ether; mapping(address => uint8) private _allowList; constructor() ERC721("Goblin and Warriors", "GAW") { } function setIsAllowListActive(bool _isAllowListActive) external onlyOwner { isAllowListActive = _isAllowListActive; } function setAllowList(address[] calldata addresses, uint8 numAllowedToMint) external onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { _allowList[addresses[i]] = numAllowedToMint; } } function numAvailableToMint(address addr) external view returns (uint8) { return _allowList[addr]; } function mintAllowList(uint8 numberOfTokens) external payable { uint256 ts = totalSupply(); require(isAllowListActive, "Allow list is not active"); require(numberOfTokens <= _allowList[msg.sender], "Exceeded max available to purchase"); require(ts + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens"); require(AllowPRICE_PER_TOKEN * numberOfTokens <= msg.value, "Ether value sent is not correct"); _allowList[msg.sender] -= numberOfTokens; for (uint256 i = 0; i < numberOfTokens; i++) { _safeMint(msg.sender, ts + i); } } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function setBaseURI(string memory baseURI_) external onlyOwner() { _baseURIextended = baseURI_; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIextended; } function setProvenance(string memory provenance) public onlyOwner { PROVENANCE = provenance; } function reserve(uint256 n) public onlyOwner { uint supply = totalSupply(); uint i; for (i = 0; i < n; i++) { _safeMint(msg.sender, supply + i); } } function setSaleState(bool newState) public onlyOwner { saleIsActive = newState; } function mint(uint numberOfTokens) public payable { uint256 ts = totalSupply(); require(saleIsActive, "Sale must be active to mint tokens"); require(numberOfTokens <= MAX_PUBLIC_MINT, "Exceeded max token purchase"); require(ts + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens"); require(PRICE_PER_TOKEN * numberOfTokens <= msg.value, "Ether value sent is not correct"); for (uint256 i = 0; i < numberOfTokens; i++) { _safeMint(msg.sender, ts + i); } } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"AllowPRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mintAllowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"numAvailableToMint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint8","name":"numAllowedToMint","type":"uint8"}],"name":"setAllowList","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":"bool","name":"_isAllowListActive","type":"bool"}],"name":"setIsAllowListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSaleState","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001600c60006101000a81548160ff0219169083151502179055506000600e60006101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280601381526020017f476f626c696e20616e642057617272696f7273000000000000000000000000008152506040518060400160405280600381526020017f47415700000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000cc929190620001dc565b508060019080519060200190620000e5929190620001dc565b50505062000108620000fc6200010e60201b60201c565b6200011660201b60201c565b620002f1565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001ea906200028c565b90600052602060002090601f0160209004810192826200020e57600085556200025a565b82601f106200022957805160ff19168380011785556200025a565b828001600101855582156200025a579182015b82811115620002595782518255916020019190600101906200023c565b5b5090506200026991906200026d565b5090565b5b80821115620002885760008160009055506001016200026e565b5090565b60006002820490506001821680620002a557607f821691505b60208210811415620002bc57620002bb620002c2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61424380620003016000396000f3fe60806040526004361061020f5760003560e01c8063715018a611610118578063b88d4fde116100a0578063ddff5b1c1161006f578063ddff5b1c1461078e578063e985e9c5146107aa578063eb8d2444146107e7578063f2fde38b14610812578063ffe630b51461083b5761020f565b8063b88d4fde146106c2578063c04a2836146106eb578063c4e3709514610728578063c87b56dd146107515761020f565b8063833b9499116100e7578063833b9499146105fc5780638da5cb5b1461062757806395d89b4114610652578063a0712d681461067d578063a22cb465146106995761020f565b8063715018a61461056a578063718bc4af14610581578063819b25ba146105aa5780638295784d146105d35761020f565b80633ccfd60b1161019b5780636352211e1161016a5780636352211e1461046f5780636373a6b1146104ac57806364ec8bba146104d757806365f130971461050257806370a082311461052d5761020f565b80633ccfd60b146103c957806342842e0e146103e05780634f6ccce71461040957806355f804b3146104465761020f565b806318160ddd116101e257806318160ddd146102e257806323b872dd1461030d57806329fc6bae146103365780632f745c591461036157806332cb6b0c1461039e5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612f20565b610864565b6040516102489190613466565b60405180910390f35b34801561025d57600080fd5b50610266610876565b6040516102739190613481565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612fc3565b610908565b6040516102b091906133ff565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612e53565b61094e565b005b3480156102ee57600080fd5b506102f7610a66565b6040516103049190613743565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190612d3d565b610a73565b005b34801561034257600080fd5b5061034b610ad3565b6040516103589190613466565b60405180910390f35b34801561036d57600080fd5b5061038860048036038101906103839190612e53565b610ae6565b6040516103959190613743565b60405180910390f35b3480156103aa57600080fd5b506103b3610b8b565b6040516103c09190613743565b60405180910390f35b3480156103d557600080fd5b506103de610b91565b005b3480156103ec57600080fd5b5061040760048036038101906104029190612d3d565b610be8565b005b34801561041557600080fd5b50610430600480360381019061042b9190612fc3565b610c08565b60405161043d9190613743565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190612f7a565b610c79565b005b34801561047b57600080fd5b5061049660048036038101906104919190612fc3565b610c9b565b6040516104a391906133ff565b60405180910390f35b3480156104b857600080fd5b506104c1610d4d565b6040516104ce9190613481565b60405180910390f35b3480156104e357600080fd5b506104ec610ddb565b6040516104f99190613743565b60405180910390f35b34801561050e57600080fd5b50610517610de6565b6040516105249190613743565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190612cd0565b610deb565b6040516105619190613743565b60405180910390f35b34801561057657600080fd5b5061057f610ea3565b005b34801561058d57600080fd5b506105a860048036038101906105a39190612ef3565b610eb7565b005b3480156105b657600080fd5b506105d160048036038101906105cc9190612fc3565b610edc565b005b3480156105df57600080fd5b506105fa60048036038101906105f59190612e93565b610f28565b005b34801561060857600080fd5b50610611610fd6565b60405161061e9190613743565b60405180910390f35b34801561063357600080fd5b5061063c610fdb565b60405161064991906133ff565b60405180910390f35b34801561065e57600080fd5b50610667611005565b6040516106749190613481565b60405180910390f35b61069760048036038101906106929190612fc3565b611097565b005b3480156106a557600080fd5b506106c060048036038101906106bb9190612e13565b61120d565b005b3480156106ce57600080fd5b506106e960048036038101906106e49190612d90565b611223565b005b3480156106f757600080fd5b50610712600480360381019061070d9190612cd0565b611285565b60405161071f919061375e565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a9190612ef3565b6112db565b005b34801561075d57600080fd5b5061077860048036038101906107739190612fc3565b611300565b6040516107859190613481565b60405180910390f35b6107a860048036038101906107a39190612ff0565b611368565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190612cfd565b6115b1565b6040516107de9190613466565b60405180910390f35b3480156107f357600080fd5b506107fc611645565b6040516108099190613466565b60405180910390f35b34801561081e57600080fd5b5061083960048036038101906108349190612cd0565b611658565b005b34801561084757600080fd5b50610862600480360381019061085d9190612f7a565b6116dc565b005b600061086f826116fe565b9050919050565b60606000805461088590613a4f565b80601f01602080910402602001604051908101604052809291908181526020018280546108b190613a4f565b80156108fe5780601f106108d3576101008083540402835291602001916108fe565b820191906000526020600020905b8154815290600101906020018083116108e157829003601f168201915b5050505050905090565b600061091382611778565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095982610c9b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c190613683565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109e96117c3565b73ffffffffffffffffffffffffffffffffffffffff161480610a185750610a1781610a126117c3565b6115b1565b5b610a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4e906135e3565b60405180910390fd5b610a6183836117cb565b505050565b6000600880549050905090565b610a84610a7e6117c3565b82611884565b610ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aba90613723565b60405180910390fd5b610ace838383611919565b505050565b600e60009054906101000a900460ff1681565b6000610af183610deb565b8210610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b29906134a3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6115b381565b610b99611b80565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610be4573d6000803e3d6000fd5b5050565b610c0383838360405180602001604052806000815250611223565b505050565b6000610c12610a66565b8210610c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4a906136e3565b60405180910390fd5b60088281548110610c6757610c66613be8565b5b90600052602060002001549050919050565b610c81611b80565b80600d9080519060200190610c97929190612a79565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3b90613643565b60405180910390fd5b80915050919050565b600b8054610d5a90613a4f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8690613a4f565b8015610dd35780601f10610da857610100808354040283529160200191610dd3565b820191906000526020600020905b815481529060010190602001808311610db657829003601f168201915b505050505081565b6611c37937e0800081565b600581565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e53906135c3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610eab611b80565b610eb56000611bfe565b565b610ebf611b80565b80600e60006101000a81548160ff02191690831515021790555050565b610ee4611b80565b6000610eee610a66565b905060005b82811015610f2357610f10338284610f0b9190613843565b611cc4565b8080610f1b90613ab2565b915050610ef3565b505050565b610f30611b80565b60005b83839050811015610fd05781600f6000868685818110610f5657610f55613be8565b5b9050602002016020810190610f6b9190612cd0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610fc890613ab2565b915050610f33565b50505050565b600081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461101490613a4f565b80601f016020809104026020016040519081016040528092919081815260200182805461104090613a4f565b801561108d5780601f106110625761010080835404028352916020019161108d565b820191906000526020600020905b81548152906001019060200180831161107057829003601f168201915b5050505050905090565b60006110a1610a66565b9050600c60009054906101000a900460ff166110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e990613663565b60405180910390fd5b6005821115611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112d906136a3565b60405180910390fd5b6115b382826111459190613843565b1115611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117d90613503565b60405180910390fd5b3482600061119491906138ca565b11156111d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cc906135a3565b60405180910390fd5b60005b82811015611208576111f53382846111f09190613843565b611cc4565b808061120090613ab2565b9150506111d8565b505050565b61121f6112186117c3565b8383611ce2565b5050565b61123461122e6117c3565b83611884565b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90613723565b60405180910390fd5b61127f84848484611e4f565b50505050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6112e3611b80565b80600c60006101000a81548160ff02191690831515021790555050565b606061130b82611778565b6000611315611eab565b905060008151116113355760405180602001604052806000815250611360565b8061133f84611f3d565b6040516020016113509291906133db565b6040516020818303038152906040525b915050919050565b6000611372610a66565b9050600e60009054906101000a900460ff166113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613703565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168260ff161115611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f906136c3565b60405180910390fd5b6115b38260ff168261146a9190613843565b11156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290613503565b60405180910390fd5b348260ff166611c37937e080006114c291906138ca565b1115611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa906135a3565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661155e9190613958565b92506101000a81548160ff021916908360ff16021790555060005b8260ff168110156115ac576115993382846115949190613843565b611cc4565b80806115a490613ab2565b915050611579565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611660611b80565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c7906134e3565b60405180910390fd5b6116d981611bfe565b50565b6116e4611b80565b80600b90805190602001906116fa929190612a79565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061177157506117708261209e565b5b9050919050565b61178181612180565b6117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b790613643565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661183e83610c9b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061189083610c9b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118d257506118d181856115b1565b5b8061191057508373ffffffffffffffffffffffffffffffffffffffff166118f884610908565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661193982610c9b565b73ffffffffffffffffffffffffffffffffffffffff161461198f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198690613523565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f690613563565b60405180910390fd5b611a0a8383836121ec565b611a156000826117cb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a659190613924565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611abc9190613843565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b7b8383836121fc565b505050565b611b886117c3565b73ffffffffffffffffffffffffffffffffffffffff16611ba6610fdb565b73ffffffffffffffffffffffffffffffffffffffff1614611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf390613623565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611cde828260405180602001604052806000815250612201565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890613583565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e429190613466565b60405180910390a3505050565b611e5a848484611919565b611e668484848461225c565b611ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9c906134c3565b60405180910390fd5b50505050565b6060600d8054611eba90613a4f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee690613a4f565b8015611f335780601f10611f0857610100808354040283529160200191611f33565b820191906000526020600020905b815481529060010190602001808311611f1657829003601f168201915b5050505050905090565b60606000821415611f85576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612099565b600082905060005b60008214611fb7578080611fa090613ab2565b915050600a82611fb09190613899565b9150611f8d565b60008167ffffffffffffffff811115611fd357611fd2613c17565b5b6040519080825280601f01601f1916602001820160405280156120055781602001600182028036833780820191505090505b5090505b600085146120925760018261201e9190613924565b9150600a8561202d9190613afb565b60306120399190613843565b60f81b81838151811061204f5761204e613be8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561208b9190613899565b9450612009565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061216957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121795750612178826123f3565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6121f783838361245d565b505050565b505050565b61220b8383612571565b612218600084848461225c565b612257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224e906134c3565b60405180910390fd5b505050565b600061227d8473ffffffffffffffffffffffffffffffffffffffff1661274b565b156123e6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122a66117c3565b8786866040518563ffffffff1660e01b81526004016122c8949392919061341a565b602060405180830381600087803b1580156122e257600080fd5b505af192505050801561231357506040513d601f19601f820116820180604052508101906123109190612f4d565b60015b612396573d8060008114612343576040519150601f19603f3d011682016040523d82523d6000602084013e612348565b606091505b5060008151141561238e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612385906134c3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123eb565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61246883838361276e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124ab576124a681612773565b6124ea565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124e9576124e883826127bc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561252d5761252881612929565b61256c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461256b5761256a82826129fa565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d890613603565b60405180910390fd5b6125ea81612180565b1561262a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262190613543565b60405180910390fd5b612636600083836121ec565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126869190613843565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612747600083836121fc565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127c984610deb565b6127d39190613924565b90506000600760008481526020019081526020016000205490508181146128b8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061293d9190613924565b905060006009600084815260200190815260200160002054905060006008838154811061296d5761296c613be8565b5b90600052602060002001549050806008838154811061298f5761298e613be8565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806129de576129dd613bb9565b5b6001900381819060005260206000200160009055905550505050565b6000612a0583610deb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612a8590613a4f565b90600052602060002090601f016020900481019282612aa75760008555612aee565b82601f10612ac057805160ff1916838001178555612aee565b82800160010185558215612aee579182015b82811115612aed578251825591602001919060010190612ad2565b5b509050612afb9190612aff565b5090565b5b80821115612b18576000816000905550600101612b00565b5090565b6000612b2f612b2a8461379e565b613779565b905082815260208101848484011115612b4b57612b4a613c55565b5b612b56848285613a0d565b509392505050565b6000612b71612b6c846137cf565b613779565b905082815260208101848484011115612b8d57612b8c613c55565b5b612b98848285613a0d565b509392505050565b600081359050612baf8161419a565b92915050565b60008083601f840112612bcb57612bca613c4b565b5b8235905067ffffffffffffffff811115612be857612be7613c46565b5b602083019150836020820283011115612c0457612c03613c50565b5b9250929050565b600081359050612c1a816141b1565b92915050565b600081359050612c2f816141c8565b92915050565b600081519050612c44816141c8565b92915050565b600082601f830112612c5f57612c5e613c4b565b5b8135612c6f848260208601612b1c565b91505092915050565b600082601f830112612c8d57612c8c613c4b565b5b8135612c9d848260208601612b5e565b91505092915050565b600081359050612cb5816141df565b92915050565b600081359050612cca816141f6565b92915050565b600060208284031215612ce657612ce5613c5f565b5b6000612cf484828501612ba0565b91505092915050565b60008060408385031215612d1457612d13613c5f565b5b6000612d2285828601612ba0565b9250506020612d3385828601612ba0565b9150509250929050565b600080600060608486031215612d5657612d55613c5f565b5b6000612d6486828701612ba0565b9350506020612d7586828701612ba0565b9250506040612d8686828701612ca6565b9150509250925092565b60008060008060808587031215612daa57612da9613c5f565b5b6000612db887828801612ba0565b9450506020612dc987828801612ba0565b9350506040612dda87828801612ca6565b925050606085013567ffffffffffffffff811115612dfb57612dfa613c5a565b5b612e0787828801612c4a565b91505092959194509250565b60008060408385031215612e2a57612e29613c5f565b5b6000612e3885828601612ba0565b9250506020612e4985828601612c0b565b9150509250929050565b60008060408385031215612e6a57612e69613c5f565b5b6000612e7885828601612ba0565b9250506020612e8985828601612ca6565b9150509250929050565b600080600060408486031215612eac57612eab613c5f565b5b600084013567ffffffffffffffff811115612eca57612ec9613c5a565b5b612ed686828701612bb5565b93509350506020612ee986828701612cbb565b9150509250925092565b600060208284031215612f0957612f08613c5f565b5b6000612f1784828501612c0b565b91505092915050565b600060208284031215612f3657612f35613c5f565b5b6000612f4484828501612c20565b91505092915050565b600060208284031215612f6357612f62613c5f565b5b6000612f7184828501612c35565b91505092915050565b600060208284031215612f9057612f8f613c5f565b5b600082013567ffffffffffffffff811115612fae57612fad613c5a565b5b612fba84828501612c78565b91505092915050565b600060208284031215612fd957612fd8613c5f565b5b6000612fe784828501612ca6565b91505092915050565b60006020828403121561300657613005613c5f565b5b600061301484828501612cbb565b91505092915050565b6130268161398c565b82525050565b6130358161399e565b82525050565b600061304682613800565b6130508185613816565b9350613060818560208601613a1c565b61306981613c64565b840191505092915050565b600061307f8261380b565b6130898185613827565b9350613099818560208601613a1c565b6130a281613c64565b840191505092915050565b60006130b88261380b565b6130c28185613838565b93506130d2818560208601613a1c565b80840191505092915050565b60006130eb602b83613827565b91506130f682613c75565b604082019050919050565b600061310e603283613827565b915061311982613cc4565b604082019050919050565b6000613131602683613827565b915061313c82613d13565b604082019050919050565b6000613154602083613827565b915061315f82613d62565b602082019050919050565b6000613177602583613827565b915061318282613d8b565b604082019050919050565b600061319a601c83613827565b91506131a582613dda565b602082019050919050565b60006131bd602483613827565b91506131c882613e03565b604082019050919050565b60006131e0601983613827565b91506131eb82613e52565b602082019050919050565b6000613203601f83613827565b915061320e82613e7b565b602082019050919050565b6000613226602983613827565b915061323182613ea4565b604082019050919050565b6000613249603e83613827565b915061325482613ef3565b604082019050919050565b600061326c602083613827565b915061327782613f42565b602082019050919050565b600061328f602083613827565b915061329a82613f6b565b602082019050919050565b60006132b2601883613827565b91506132bd82613f94565b602082019050919050565b60006132d5602283613827565b91506132e082613fbd565b604082019050919050565b60006132f8602183613827565b91506133038261400c565b604082019050919050565b600061331b601b83613827565b91506133268261405b565b602082019050919050565b600061333e602283613827565b915061334982614084565b604082019050919050565b6000613361602c83613827565b915061336c826140d3565b604082019050919050565b6000613384601883613827565b915061338f82614122565b602082019050919050565b60006133a7602e83613827565b91506133b28261414b565b604082019050919050565b6133c6816139f6565b82525050565b6133d581613a00565b82525050565b60006133e782856130ad565b91506133f382846130ad565b91508190509392505050565b6000602082019050613414600083018461301d565b92915050565b600060808201905061342f600083018761301d565b61343c602083018661301d565b61344960408301856133bd565b818103606083015261345b818461303b565b905095945050505050565b600060208201905061347b600083018461302c565b92915050565b6000602082019050818103600083015261349b8184613074565b905092915050565b600060208201905081810360008301526134bc816130de565b9050919050565b600060208201905081810360008301526134dc81613101565b9050919050565b600060208201905081810360008301526134fc81613124565b9050919050565b6000602082019050818103600083015261351c81613147565b9050919050565b6000602082019050818103600083015261353c8161316a565b9050919050565b6000602082019050818103600083015261355c8161318d565b9050919050565b6000602082019050818103600083015261357c816131b0565b9050919050565b6000602082019050818103600083015261359c816131d3565b9050919050565b600060208201905081810360008301526135bc816131f6565b9050919050565b600060208201905081810360008301526135dc81613219565b9050919050565b600060208201905081810360008301526135fc8161323c565b9050919050565b6000602082019050818103600083015261361c8161325f565b9050919050565b6000602082019050818103600083015261363c81613282565b9050919050565b6000602082019050818103600083015261365c816132a5565b9050919050565b6000602082019050818103600083015261367c816132c8565b9050919050565b6000602082019050818103600083015261369c816132eb565b9050919050565b600060208201905081810360008301526136bc8161330e565b9050919050565b600060208201905081810360008301526136dc81613331565b9050919050565b600060208201905081810360008301526136fc81613354565b9050919050565b6000602082019050818103600083015261371c81613377565b9050919050565b6000602082019050818103600083015261373c8161339a565b9050919050565b600060208201905061375860008301846133bd565b92915050565b600060208201905061377360008301846133cc565b92915050565b6000613783613794565b905061378f8282613a81565b919050565b6000604051905090565b600067ffffffffffffffff8211156137b9576137b8613c17565b5b6137c282613c64565b9050602081019050919050565b600067ffffffffffffffff8211156137ea576137e9613c17565b5b6137f382613c64565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061384e826139f6565b9150613859836139f6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561388e5761388d613b2c565b5b828201905092915050565b60006138a4826139f6565b91506138af836139f6565b9250826138bf576138be613b5b565b5b828204905092915050565b60006138d5826139f6565b91506138e0836139f6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561391957613918613b2c565b5b828202905092915050565b600061392f826139f6565b915061393a836139f6565b92508282101561394d5761394c613b2c565b5b828203905092915050565b600061396382613a00565b915061396e83613a00565b92508282101561398157613980613b2c565b5b828203905092915050565b6000613997826139d6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613a3a578082015181840152602081019050613a1f565b83811115613a49576000848401525b50505050565b60006002820490506001821680613a6757607f821691505b60208210811415613a7b57613a7a613b8a565b5b50919050565b613a8a82613c64565b810181811067ffffffffffffffff82111715613aa957613aa8613c17565b5b80604052505050565b6000613abd826139f6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613af057613aef613b2c565b5b600182019050919050565b6000613b06826139f6565b9150613b11836139f6565b925082613b2157613b20613b5b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416c6c6f77206c697374206973206e6f74206163746976650000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6141a38161398c565b81146141ae57600080fd5b50565b6141ba8161399e565b81146141c557600080fd5b50565b6141d1816139aa565b81146141dc57600080fd5b50565b6141e8816139f6565b81146141f357600080fd5b50565b6141ff81613a00565b811461420a57600080fd5b5056fea26469706673582212209f565b1540874638ee8b6334f275a22c022c85526073c83f509c169e54b84e5164736f6c63430008070033
Deployed Bytecode
0x60806040526004361061020f5760003560e01c8063715018a611610118578063b88d4fde116100a0578063ddff5b1c1161006f578063ddff5b1c1461078e578063e985e9c5146107aa578063eb8d2444146107e7578063f2fde38b14610812578063ffe630b51461083b5761020f565b8063b88d4fde146106c2578063c04a2836146106eb578063c4e3709514610728578063c87b56dd146107515761020f565b8063833b9499116100e7578063833b9499146105fc5780638da5cb5b1461062757806395d89b4114610652578063a0712d681461067d578063a22cb465146106995761020f565b8063715018a61461056a578063718bc4af14610581578063819b25ba146105aa5780638295784d146105d35761020f565b80633ccfd60b1161019b5780636352211e1161016a5780636352211e1461046f5780636373a6b1146104ac57806364ec8bba146104d757806365f130971461050257806370a082311461052d5761020f565b80633ccfd60b146103c957806342842e0e146103e05780634f6ccce71461040957806355f804b3146104465761020f565b806318160ddd116101e257806318160ddd146102e257806323b872dd1461030d57806329fc6bae146103365780632f745c591461036157806332cb6b0c1461039e5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612f20565b610864565b6040516102489190613466565b60405180910390f35b34801561025d57600080fd5b50610266610876565b6040516102739190613481565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612fc3565b610908565b6040516102b091906133ff565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612e53565b61094e565b005b3480156102ee57600080fd5b506102f7610a66565b6040516103049190613743565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190612d3d565b610a73565b005b34801561034257600080fd5b5061034b610ad3565b6040516103589190613466565b60405180910390f35b34801561036d57600080fd5b5061038860048036038101906103839190612e53565b610ae6565b6040516103959190613743565b60405180910390f35b3480156103aa57600080fd5b506103b3610b8b565b6040516103c09190613743565b60405180910390f35b3480156103d557600080fd5b506103de610b91565b005b3480156103ec57600080fd5b5061040760048036038101906104029190612d3d565b610be8565b005b34801561041557600080fd5b50610430600480360381019061042b9190612fc3565b610c08565b60405161043d9190613743565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190612f7a565b610c79565b005b34801561047b57600080fd5b5061049660048036038101906104919190612fc3565b610c9b565b6040516104a391906133ff565b60405180910390f35b3480156104b857600080fd5b506104c1610d4d565b6040516104ce9190613481565b60405180910390f35b3480156104e357600080fd5b506104ec610ddb565b6040516104f99190613743565b60405180910390f35b34801561050e57600080fd5b50610517610de6565b6040516105249190613743565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190612cd0565b610deb565b6040516105619190613743565b60405180910390f35b34801561057657600080fd5b5061057f610ea3565b005b34801561058d57600080fd5b506105a860048036038101906105a39190612ef3565b610eb7565b005b3480156105b657600080fd5b506105d160048036038101906105cc9190612fc3565b610edc565b005b3480156105df57600080fd5b506105fa60048036038101906105f59190612e93565b610f28565b005b34801561060857600080fd5b50610611610fd6565b60405161061e9190613743565b60405180910390f35b34801561063357600080fd5b5061063c610fdb565b60405161064991906133ff565b60405180910390f35b34801561065e57600080fd5b50610667611005565b6040516106749190613481565b60405180910390f35b61069760048036038101906106929190612fc3565b611097565b005b3480156106a557600080fd5b506106c060048036038101906106bb9190612e13565b61120d565b005b3480156106ce57600080fd5b506106e960048036038101906106e49190612d90565b611223565b005b3480156106f757600080fd5b50610712600480360381019061070d9190612cd0565b611285565b60405161071f919061375e565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a9190612ef3565b6112db565b005b34801561075d57600080fd5b5061077860048036038101906107739190612fc3565b611300565b6040516107859190613481565b60405180910390f35b6107a860048036038101906107a39190612ff0565b611368565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190612cfd565b6115b1565b6040516107de9190613466565b60405180910390f35b3480156107f357600080fd5b506107fc611645565b6040516108099190613466565b60405180910390f35b34801561081e57600080fd5b5061083960048036038101906108349190612cd0565b611658565b005b34801561084757600080fd5b50610862600480360381019061085d9190612f7a565b6116dc565b005b600061086f826116fe565b9050919050565b60606000805461088590613a4f565b80601f01602080910402602001604051908101604052809291908181526020018280546108b190613a4f565b80156108fe5780601f106108d3576101008083540402835291602001916108fe565b820191906000526020600020905b8154815290600101906020018083116108e157829003601f168201915b5050505050905090565b600061091382611778565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095982610c9b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c190613683565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109e96117c3565b73ffffffffffffffffffffffffffffffffffffffff161480610a185750610a1781610a126117c3565b6115b1565b5b610a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4e906135e3565b60405180910390fd5b610a6183836117cb565b505050565b6000600880549050905090565b610a84610a7e6117c3565b82611884565b610ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aba90613723565b60405180910390fd5b610ace838383611919565b505050565b600e60009054906101000a900460ff1681565b6000610af183610deb565b8210610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b29906134a3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6115b381565b610b99611b80565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610be4573d6000803e3d6000fd5b5050565b610c0383838360405180602001604052806000815250611223565b505050565b6000610c12610a66565b8210610c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4a906136e3565b60405180910390fd5b60088281548110610c6757610c66613be8565b5b90600052602060002001549050919050565b610c81611b80565b80600d9080519060200190610c97929190612a79565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3b90613643565b60405180910390fd5b80915050919050565b600b8054610d5a90613a4f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8690613a4f565b8015610dd35780601f10610da857610100808354040283529160200191610dd3565b820191906000526020600020905b815481529060010190602001808311610db657829003601f168201915b505050505081565b6611c37937e0800081565b600581565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e53906135c3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610eab611b80565b610eb56000611bfe565b565b610ebf611b80565b80600e60006101000a81548160ff02191690831515021790555050565b610ee4611b80565b6000610eee610a66565b905060005b82811015610f2357610f10338284610f0b9190613843565b611cc4565b8080610f1b90613ab2565b915050610ef3565b505050565b610f30611b80565b60005b83839050811015610fd05781600f6000868685818110610f5657610f55613be8565b5b9050602002016020810190610f6b9190612cd0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610fc890613ab2565b915050610f33565b50505050565b600081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461101490613a4f565b80601f016020809104026020016040519081016040528092919081815260200182805461104090613a4f565b801561108d5780601f106110625761010080835404028352916020019161108d565b820191906000526020600020905b81548152906001019060200180831161107057829003601f168201915b5050505050905090565b60006110a1610a66565b9050600c60009054906101000a900460ff166110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e990613663565b60405180910390fd5b6005821115611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112d906136a3565b60405180910390fd5b6115b382826111459190613843565b1115611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117d90613503565b60405180910390fd5b3482600061119491906138ca565b11156111d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cc906135a3565b60405180910390fd5b60005b82811015611208576111f53382846111f09190613843565b611cc4565b808061120090613ab2565b9150506111d8565b505050565b61121f6112186117c3565b8383611ce2565b5050565b61123461122e6117c3565b83611884565b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90613723565b60405180910390fd5b61127f84848484611e4f565b50505050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6112e3611b80565b80600c60006101000a81548160ff02191690831515021790555050565b606061130b82611778565b6000611315611eab565b905060008151116113355760405180602001604052806000815250611360565b8061133f84611f3d565b6040516020016113509291906133db565b6040516020818303038152906040525b915050919050565b6000611372610a66565b9050600e60009054906101000a900460ff166113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613703565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168260ff161115611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f906136c3565b60405180910390fd5b6115b38260ff168261146a9190613843565b11156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290613503565b60405180910390fd5b348260ff166611c37937e080006114c291906138ca565b1115611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa906135a3565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661155e9190613958565b92506101000a81548160ff021916908360ff16021790555060005b8260ff168110156115ac576115993382846115949190613843565b611cc4565b80806115a490613ab2565b915050611579565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611660611b80565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c7906134e3565b60405180910390fd5b6116d981611bfe565b50565b6116e4611b80565b80600b90805190602001906116fa929190612a79565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061177157506117708261209e565b5b9050919050565b61178181612180565b6117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b790613643565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661183e83610c9b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061189083610c9b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118d257506118d181856115b1565b5b8061191057508373ffffffffffffffffffffffffffffffffffffffff166118f884610908565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661193982610c9b565b73ffffffffffffffffffffffffffffffffffffffff161461198f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198690613523565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f690613563565b60405180910390fd5b611a0a8383836121ec565b611a156000826117cb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a659190613924565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611abc9190613843565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b7b8383836121fc565b505050565b611b886117c3565b73ffffffffffffffffffffffffffffffffffffffff16611ba6610fdb565b73ffffffffffffffffffffffffffffffffffffffff1614611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf390613623565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611cde828260405180602001604052806000815250612201565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890613583565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e429190613466565b60405180910390a3505050565b611e5a848484611919565b611e668484848461225c565b611ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9c906134c3565b60405180910390fd5b50505050565b6060600d8054611eba90613a4f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee690613a4f565b8015611f335780601f10611f0857610100808354040283529160200191611f33565b820191906000526020600020905b815481529060010190602001808311611f1657829003601f168201915b5050505050905090565b60606000821415611f85576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612099565b600082905060005b60008214611fb7578080611fa090613ab2565b915050600a82611fb09190613899565b9150611f8d565b60008167ffffffffffffffff811115611fd357611fd2613c17565b5b6040519080825280601f01601f1916602001820160405280156120055781602001600182028036833780820191505090505b5090505b600085146120925760018261201e9190613924565b9150600a8561202d9190613afb565b60306120399190613843565b60f81b81838151811061204f5761204e613be8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561208b9190613899565b9450612009565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061216957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121795750612178826123f3565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6121f783838361245d565b505050565b505050565b61220b8383612571565b612218600084848461225c565b612257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224e906134c3565b60405180910390fd5b505050565b600061227d8473ffffffffffffffffffffffffffffffffffffffff1661274b565b156123e6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122a66117c3565b8786866040518563ffffffff1660e01b81526004016122c8949392919061341a565b602060405180830381600087803b1580156122e257600080fd5b505af192505050801561231357506040513d601f19601f820116820180604052508101906123109190612f4d565b60015b612396573d8060008114612343576040519150601f19603f3d011682016040523d82523d6000602084013e612348565b606091505b5060008151141561238e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612385906134c3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123eb565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61246883838361276e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124ab576124a681612773565b6124ea565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124e9576124e883826127bc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561252d5761252881612929565b61256c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461256b5761256a82826129fa565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d890613603565b60405180910390fd5b6125ea81612180565b1561262a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262190613543565b60405180910390fd5b612636600083836121ec565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126869190613843565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612747600083836121fc565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127c984610deb565b6127d39190613924565b90506000600760008481526020019081526020016000205490508181146128b8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061293d9190613924565b905060006009600084815260200190815260200160002054905060006008838154811061296d5761296c613be8565b5b90600052602060002001549050806008838154811061298f5761298e613be8565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806129de576129dd613bb9565b5b6001900381819060005260206000200160009055905550505050565b6000612a0583610deb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612a8590613a4f565b90600052602060002090601f016020900481019282612aa75760008555612aee565b82601f10612ac057805160ff1916838001178555612aee565b82800160010185558215612aee579182015b82811115612aed578251825591602001919060010190612ad2565b5b509050612afb9190612aff565b5090565b5b80821115612b18576000816000905550600101612b00565b5090565b6000612b2f612b2a8461379e565b613779565b905082815260208101848484011115612b4b57612b4a613c55565b5b612b56848285613a0d565b509392505050565b6000612b71612b6c846137cf565b613779565b905082815260208101848484011115612b8d57612b8c613c55565b5b612b98848285613a0d565b509392505050565b600081359050612baf8161419a565b92915050565b60008083601f840112612bcb57612bca613c4b565b5b8235905067ffffffffffffffff811115612be857612be7613c46565b5b602083019150836020820283011115612c0457612c03613c50565b5b9250929050565b600081359050612c1a816141b1565b92915050565b600081359050612c2f816141c8565b92915050565b600081519050612c44816141c8565b92915050565b600082601f830112612c5f57612c5e613c4b565b5b8135612c6f848260208601612b1c565b91505092915050565b600082601f830112612c8d57612c8c613c4b565b5b8135612c9d848260208601612b5e565b91505092915050565b600081359050612cb5816141df565b92915050565b600081359050612cca816141f6565b92915050565b600060208284031215612ce657612ce5613c5f565b5b6000612cf484828501612ba0565b91505092915050565b60008060408385031215612d1457612d13613c5f565b5b6000612d2285828601612ba0565b9250506020612d3385828601612ba0565b9150509250929050565b600080600060608486031215612d5657612d55613c5f565b5b6000612d6486828701612ba0565b9350506020612d7586828701612ba0565b9250506040612d8686828701612ca6565b9150509250925092565b60008060008060808587031215612daa57612da9613c5f565b5b6000612db887828801612ba0565b9450506020612dc987828801612ba0565b9350506040612dda87828801612ca6565b925050606085013567ffffffffffffffff811115612dfb57612dfa613c5a565b5b612e0787828801612c4a565b91505092959194509250565b60008060408385031215612e2a57612e29613c5f565b5b6000612e3885828601612ba0565b9250506020612e4985828601612c0b565b9150509250929050565b60008060408385031215612e6a57612e69613c5f565b5b6000612e7885828601612ba0565b9250506020612e8985828601612ca6565b9150509250929050565b600080600060408486031215612eac57612eab613c5f565b5b600084013567ffffffffffffffff811115612eca57612ec9613c5a565b5b612ed686828701612bb5565b93509350506020612ee986828701612cbb565b9150509250925092565b600060208284031215612f0957612f08613c5f565b5b6000612f1784828501612c0b565b91505092915050565b600060208284031215612f3657612f35613c5f565b5b6000612f4484828501612c20565b91505092915050565b600060208284031215612f6357612f62613c5f565b5b6000612f7184828501612c35565b91505092915050565b600060208284031215612f9057612f8f613c5f565b5b600082013567ffffffffffffffff811115612fae57612fad613c5a565b5b612fba84828501612c78565b91505092915050565b600060208284031215612fd957612fd8613c5f565b5b6000612fe784828501612ca6565b91505092915050565b60006020828403121561300657613005613c5f565b5b600061301484828501612cbb565b91505092915050565b6130268161398c565b82525050565b6130358161399e565b82525050565b600061304682613800565b6130508185613816565b9350613060818560208601613a1c565b61306981613c64565b840191505092915050565b600061307f8261380b565b6130898185613827565b9350613099818560208601613a1c565b6130a281613c64565b840191505092915050565b60006130b88261380b565b6130c28185613838565b93506130d2818560208601613a1c565b80840191505092915050565b60006130eb602b83613827565b91506130f682613c75565b604082019050919050565b600061310e603283613827565b915061311982613cc4565b604082019050919050565b6000613131602683613827565b915061313c82613d13565b604082019050919050565b6000613154602083613827565b915061315f82613d62565b602082019050919050565b6000613177602583613827565b915061318282613d8b565b604082019050919050565b600061319a601c83613827565b91506131a582613dda565b602082019050919050565b60006131bd602483613827565b91506131c882613e03565b604082019050919050565b60006131e0601983613827565b91506131eb82613e52565b602082019050919050565b6000613203601f83613827565b915061320e82613e7b565b602082019050919050565b6000613226602983613827565b915061323182613ea4565b604082019050919050565b6000613249603e83613827565b915061325482613ef3565b604082019050919050565b600061326c602083613827565b915061327782613f42565b602082019050919050565b600061328f602083613827565b915061329a82613f6b565b602082019050919050565b60006132b2601883613827565b91506132bd82613f94565b602082019050919050565b60006132d5602283613827565b91506132e082613fbd565b604082019050919050565b60006132f8602183613827565b91506133038261400c565b604082019050919050565b600061331b601b83613827565b91506133268261405b565b602082019050919050565b600061333e602283613827565b915061334982614084565b604082019050919050565b6000613361602c83613827565b915061336c826140d3565b604082019050919050565b6000613384601883613827565b915061338f82614122565b602082019050919050565b60006133a7602e83613827565b91506133b28261414b565b604082019050919050565b6133c6816139f6565b82525050565b6133d581613a00565b82525050565b60006133e782856130ad565b91506133f382846130ad565b91508190509392505050565b6000602082019050613414600083018461301d565b92915050565b600060808201905061342f600083018761301d565b61343c602083018661301d565b61344960408301856133bd565b818103606083015261345b818461303b565b905095945050505050565b600060208201905061347b600083018461302c565b92915050565b6000602082019050818103600083015261349b8184613074565b905092915050565b600060208201905081810360008301526134bc816130de565b9050919050565b600060208201905081810360008301526134dc81613101565b9050919050565b600060208201905081810360008301526134fc81613124565b9050919050565b6000602082019050818103600083015261351c81613147565b9050919050565b6000602082019050818103600083015261353c8161316a565b9050919050565b6000602082019050818103600083015261355c8161318d565b9050919050565b6000602082019050818103600083015261357c816131b0565b9050919050565b6000602082019050818103600083015261359c816131d3565b9050919050565b600060208201905081810360008301526135bc816131f6565b9050919050565b600060208201905081810360008301526135dc81613219565b9050919050565b600060208201905081810360008301526135fc8161323c565b9050919050565b6000602082019050818103600083015261361c8161325f565b9050919050565b6000602082019050818103600083015261363c81613282565b9050919050565b6000602082019050818103600083015261365c816132a5565b9050919050565b6000602082019050818103600083015261367c816132c8565b9050919050565b6000602082019050818103600083015261369c816132eb565b9050919050565b600060208201905081810360008301526136bc8161330e565b9050919050565b600060208201905081810360008301526136dc81613331565b9050919050565b600060208201905081810360008301526136fc81613354565b9050919050565b6000602082019050818103600083015261371c81613377565b9050919050565b6000602082019050818103600083015261373c8161339a565b9050919050565b600060208201905061375860008301846133bd565b92915050565b600060208201905061377360008301846133cc565b92915050565b6000613783613794565b905061378f8282613a81565b919050565b6000604051905090565b600067ffffffffffffffff8211156137b9576137b8613c17565b5b6137c282613c64565b9050602081019050919050565b600067ffffffffffffffff8211156137ea576137e9613c17565b5b6137f382613c64565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061384e826139f6565b9150613859836139f6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561388e5761388d613b2c565b5b828201905092915050565b60006138a4826139f6565b91506138af836139f6565b9250826138bf576138be613b5b565b5b828204905092915050565b60006138d5826139f6565b91506138e0836139f6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561391957613918613b2c565b5b828202905092915050565b600061392f826139f6565b915061393a836139f6565b92508282101561394d5761394c613b2c565b5b828203905092915050565b600061396382613a00565b915061396e83613a00565b92508282101561398157613980613b2c565b5b828203905092915050565b6000613997826139d6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613a3a578082015181840152602081019050613a1f565b83811115613a49576000848401525b50505050565b60006002820490506001821680613a6757607f821691505b60208210811415613a7b57613a7a613b8a565b5b50919050565b613a8a82613c64565b810181811067ffffffffffffffff82111715613aa957613aa8613c17565b5b80604052505050565b6000613abd826139f6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613af057613aef613b2c565b5b600182019050919050565b6000613b06826139f6565b9150613b11836139f6565b925082613b2157613b20613b5b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416c6c6f77206c697374206973206e6f74206163746976650000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6141a38161398c565b81146141ae57600080fd5b50565b6141ba8161399e565b81146141c557600080fd5b50565b6141d1816139aa565b81146141dc57600080fd5b50565b6141e8816139f6565b81146141f357600080fd5b50565b6141ff81613a00565b811461420a57600080fd5b5056fea26469706673582212209f565b1540874638ee8b6334f275a22c022c85526073c83f509c169e54b84e5164736f6c63430008070033
Deployed Bytecode Sourcemap
46266:3442:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48155:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26783:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28296:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27813:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40689:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28996:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46446:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40357:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46490:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49565:140;;;;;;;;;;;;;:::i;:::-;;29403:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40879:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48342:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26494:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46337:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46644:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46538:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26225:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5312:103;;;;;;;;;;;;;:::i;:::-;;46831:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48702:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46970:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46588:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4664:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26952:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49006:551;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28539:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29659:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47208:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48902:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27127:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47330:628;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28765:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46368:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5570:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48586:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48155:179;48266:4;48290:36;48314:11;48290:23;:36::i;:::-;48283:43;;48155:179;;;:::o;26783:100::-;26837:13;26870:5;26863:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26783:100;:::o;28296:171::-;28372:7;28392:23;28407:7;28392:14;:23::i;:::-;28435:15;:24;28451:7;28435:24;;;;;;;;;;;;;;;;;;;;;28428:31;;28296:171;;;:::o;27813:417::-;27894:13;27910:23;27925:7;27910:14;:23::i;:::-;27894:39;;27958:5;27952:11;;:2;:11;;;;27944:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28052:5;28036:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28061:37;28078:5;28085:12;:10;:12::i;:::-;28061:16;:37::i;:::-;28036:62;28014:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;28201:21;28210:2;28214:7;28201:8;:21::i;:::-;27883:347;27813:417;;:::o;40689:113::-;40750:7;40777:10;:17;;;;40770:24;;40689:113;:::o;28996:336::-;29191:41;29210:12;:10;:12::i;:::-;29224:7;29191:18;:41::i;:::-;29183:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29296:28;29306:4;29312:2;29316:7;29296:9;:28::i;:::-;28996:336;;;:::o;46446:37::-;;;;;;;;;;;;;:::o;40357:256::-;40454:7;40490:23;40507:5;40490:16;:23::i;:::-;40482:5;:31;40474:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40579:12;:19;40592:5;40579:19;;;;;;;;;;;;;;;:26;40599:5;40579:26;;;;;;;;;;;;40572:33;;40357:256;;;;:::o;46490:41::-;46527:4;46490:41;:::o;49565:140::-;4550:13;:11;:13::i;:::-;49613:12:::1;49628:21;49613:36;;49668:10;49660:28;;:37;49689:7;49660:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49602:103;49565:140::o:0;29403:185::-;29541:39;29558:4;29564:2;29568:7;29541:39;;;;;;;;;;;;:16;:39::i;:::-;29403:185;;;:::o;40879:233::-;40954:7;40990:30;:28;:30::i;:::-;40982:5;:38;40974:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41087:10;41098:5;41087:17;;;;;;;;:::i;:::-;;;;;;;;;;41080:24;;40879:233;;;:::o;48342:111::-;4550:13;:11;:13::i;:::-;48437:8:::1;48418:16;:27;;;;;;;;;;;;:::i;:::-;;48342:111:::0;:::o;26494:222::-;26566:7;26586:13;26602:7;:16;26610:7;26602:16;;;;;;;;;;;;;;;;;;;;;26586:32;;26654:1;26637:19;;:5;:19;;;;26629:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;26703:5;26696:12;;;26494:222;;;:::o;46337:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46644:58::-;46691:11;46644:58;:::o;46538:43::-;46580:1;46538:43;:::o;26225:207::-;26297:7;26342:1;26325:19;;:5;:19;;;;26317:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26408:9;:16;26418:5;26408:16;;;;;;;;;;;;;;;;26401:23;;26225:207;;;:::o;5312:103::-;4550:13;:11;:13::i;:::-;5377:30:::1;5404:1;5377:18;:30::i;:::-;5312:103::o:0;46831:131::-;4550:13;:11;:13::i;:::-;46936:18:::1;46916:17;;:38;;;;;;;;;;;;;;;;;;46831:131:::0;:::o;48702:192::-;4550:13;:11;:13::i;:::-;48756:11:::1;48770:13;:11;:13::i;:::-;48756:27;;48792:6;48807:80;48823:1;48819;:5;48807:80;;;48844:33;48854:10;48875:1;48866:6;:10;;;;:::i;:::-;48844:9;:33::i;:::-;48826:3;;;;;:::i;:::-;;;;48807:80;;;48747:147;;48702:192:::0;:::o;46970:230::-;4550:13;:11;:13::i;:::-;47081:9:::1;47076:117;47100:9;;:16;;47096:1;:20;47076:117;;;47165:16;47138:10;:24;47149:9;;47159:1;47149:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;47138:24;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;47118:3;;;;;:::i;:::-;;;;47076:117;;;;46970:230:::0;;;:::o;46588:49::-;46630:7;46588:49;:::o;4664:87::-;4710:7;4737:6;;;;;;;;;;;4730:13;;4664:87;:::o;26952:104::-;27008:13;27041:7;27034:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26952:104;:::o;49006:551::-;49067:10;49080:13;:11;:13::i;:::-;49067:26;;49112:12;;;;;;;;;;;49104:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;46580:1;49182:14;:33;;49174:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46527:4;49271:14;49266:2;:19;;;;:::i;:::-;:33;;49258:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;49391:9;49373:14;46630:7;49355:32;;;;:::i;:::-;:45;;49347:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;49454:9;49449:101;49473:14;49469:1;:18;49449:101;;;49509:29;49519:10;49536:1;49531:2;:6;;;;:::i;:::-;49509:9;:29::i;:::-;49489:3;;;;;:::i;:::-;;;;49449:101;;;;49056:501;49006:551;:::o;28539:155::-;28634:52;28653:12;:10;:12::i;:::-;28667:8;28677;28634:18;:52::i;:::-;28539:155;;:::o;29659:323::-;29833:41;29852:12;:10;:12::i;:::-;29866:7;29833:18;:41::i;:::-;29825:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29936:38;29950:4;29956:2;29960:7;29969:4;29936:13;:38::i;:::-;29659:323;;;;:::o;47208:114::-;47273:5;47298:10;:16;47309:4;47298:16;;;;;;;;;;;;;;;;;;;;;;;;;47291:23;;47208:114;;;:::o;48902:96::-;4550:13;:11;:13::i;:::-;48982:8:::1;48967:12;;:23;;;;;;;;;;;;;;;;;;48902:96:::0;:::o;27127:281::-;27200:13;27226:23;27241:7;27226:14;:23::i;:::-;27262:21;27286:10;:8;:10::i;:::-;27262:34;;27338:1;27320:7;27314:21;:25;:86;;;;;;;;;;;;;;;;;27366:7;27375:18;:7;:16;:18::i;:::-;27349:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27314:86;27307:93;;;27127:281;;;:::o;47330:628::-;47403:10;47416:13;:11;:13::i;:::-;47403:26;;47448:17;;;;;;;;;;;47440:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;47531:10;:22;47542:10;47531:22;;;;;;;;;;;;;;;;;;;;;;;;;47513:40;;:14;:40;;;;47505:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;46527:4;47616:14;47611:19;;:2;:19;;;;:::i;:::-;:33;;47603:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;47741:9;47723:14;47700:37;;46691:11;47700:37;;;;:::i;:::-;:50;;47692:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;47825:14;47799:10;:22;47810:10;47799:22;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47855:9;47850:101;47874:14;47870:18;;:1;:18;47850:101;;;47910:29;47920:10;47937:1;47932:2;:6;;;;:::i;:::-;47910:9;:29::i;:::-;47890:3;;;;;:::i;:::-;;;;47850:101;;;;47392:566;47330:628;:::o;28765:164::-;28862:4;28886:18;:25;28905:5;28886:25;;;;;;;;;;;;;;;:35;28912:8;28886:35;;;;;;;;;;;;;;;;;;;;;;;;;28879:42;;28765:164;;;;:::o;46368:31::-;;;;;;;;;;;;;:::o;5570:201::-;4550:13;:11;:13::i;:::-;5679:1:::1;5659:22;;:8;:22;;;;5651:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5735:28;5754:8;5735:18;:28::i;:::-;5570:201:::0;:::o;48586:108::-;4550:13;:11;:13::i;:::-;48676:10:::1;48663;:23;;;;;;;;;;;;:::i;:::-;;48586:108:::0;:::o;40049:224::-;40151:4;40190:35;40175:50;;;:11;:50;;;;:90;;;;40229:36;40253:11;40229:23;:36::i;:::-;40175:90;40168:97;;40049:224;;;:::o;36271:135::-;36353:16;36361:7;36353;:16::i;:::-;36345:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36271:135;:::o;3215:98::-;3268:7;3295:10;3288:17;;3215:98;:::o;35550:174::-;35652:2;35625:15;:24;35641:7;35625:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35708:7;35704:2;35670:46;;35679:23;35694:7;35679:14;:23::i;:::-;35670:46;;;;;;;;;;;;35550:174;;:::o;31783:264::-;31876:4;31893:13;31909:23;31924:7;31909:14;:23::i;:::-;31893:39;;31962:5;31951:16;;:7;:16;;;:52;;;;31971:32;31988:5;31995:7;31971:16;:32::i;:::-;31951:52;:87;;;;32031:7;32007:31;;:20;32019:7;32007:11;:20::i;:::-;:31;;;31951:87;31943:96;;;31783:264;;;;:::o;34806:625::-;34965:4;34938:31;;:23;34953:7;34938:14;:23::i;:::-;:31;;;34930:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35044:1;35030:16;;:2;:16;;;;35022:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35100:39;35121:4;35127:2;35131:7;35100:20;:39::i;:::-;35204:29;35221:1;35225:7;35204:8;:29::i;:::-;35265:1;35246:9;:15;35256:4;35246:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35294:1;35277:9;:13;35287:2;35277:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35325:2;35306:7;:16;35314:7;35306:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35364:7;35360:2;35345:27;;35354:4;35345:27;;;;;;;;;;;;35385:38;35405:4;35411:2;35415:7;35385:19;:38::i;:::-;34806:625;;;:::o;4829:132::-;4904:12;:10;:12::i;:::-;4893:23;;:7;:5;:7::i;:::-;:23;;;4885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4829:132::o;5931:191::-;6005:16;6024:6;;;;;;;;;;;6005:25;;6050:8;6041:6;;:17;;;;;;;;;;;;;;;;;;6105:8;6074:40;;6095:8;6074:40;;;;;;;;;;;;5994:128;5931:191;:::o;32389:110::-;32465:26;32475:2;32479:7;32465:26;;;;;;;;;;;;:9;:26::i;:::-;32389:110;;:::o;35867:315::-;36022:8;36013:17;;:5;:17;;;;36005:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36109:8;36071:18;:25;36090:5;36071:25;;;;;;;;;;;;;;;:35;36097:8;36071:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36155:8;36133:41;;36148:5;36133:41;;;36165:8;36133:41;;;;;;:::i;:::-;;;;;;;;35867:315;;;:::o;30863:313::-;31019:28;31029:4;31035:2;31039:7;31019:9;:28::i;:::-;31066:47;31089:4;31095:2;31099:7;31108:4;31066:22;:47::i;:::-;31058:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30863:313;;;;:::o;48461:117::-;48521:13;48554:16;48547:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48461:117;:::o;469:723::-;525:13;755:1;746:5;:10;742:53;;;773:10;;;;;;;;;;;;;;;;;;;;;742:53;805:12;820:5;805:20;;836:14;861:78;876:1;868:4;:9;861:78;;894:8;;;;;:::i;:::-;;;;925:2;917:10;;;;;:::i;:::-;;;861:78;;;949:19;981:6;971:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;949:39;;999:154;1015:1;1006:5;:10;999:154;;1043:1;1033:11;;;;;:::i;:::-;;;1110:2;1102:5;:10;;;;:::i;:::-;1089:2;:24;;;;:::i;:::-;1076:39;;1059:6;1066;1059:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1139:2;1130:11;;;;;:::i;:::-;;;999:154;;;1177:6;1163:21;;;;;469:723;;;;:::o;25856:305::-;25958:4;26010:25;25995:40;;;:11;:40;;;;:105;;;;26067:33;26052:48;;;:11;:48;;;;25995:105;:158;;;;26117:36;26141:11;26117:23;:36::i;:::-;25995:158;25975:178;;25856:305;;;:::o;31489:127::-;31554:4;31606:1;31578:30;;:7;:16;31586:7;31578:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31571:37;;31489:127;;;:::o;47966:181::-;48094:45;48121:4;48127:2;48131:7;48094:26;:45::i;:::-;47966:181;;;:::o;38906:125::-;;;;:::o;32726:319::-;32855:18;32861:2;32865:7;32855:5;:18::i;:::-;32906:53;32937:1;32941:2;32945:7;32954:4;32906:22;:53::i;:::-;32884:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;32726:319;;;:::o;36970:853::-;37124:4;37145:15;:2;:13;;;:15::i;:::-;37141:675;;;37197:2;37181:36;;;37218:12;:10;:12::i;:::-;37232:4;37238:7;37247:4;37181:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37177:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37439:1;37422:6;:13;:18;37418:328;;;37465:60;;;;;;;;;;:::i;:::-;;;;;;;;37418:328;37696:6;37690:13;37681:6;37677:2;37673:15;37666:38;37177:584;37313:41;;;37303:51;;;:6;:51;;;;37296:58;;;;;37141:675;37800:4;37793:11;;36970:853;;;;;;;:::o;17518:157::-;17603:4;17642:25;17627:40;;;:11;:40;;;;17620:47;;17518:157;;;:::o;41725:589::-;41869:45;41896:4;41902:2;41906:7;41869:26;:45::i;:::-;41947:1;41931:18;;:4;:18;;;41927:187;;;41966:40;41998:7;41966:31;:40::i;:::-;41927:187;;;42036:2;42028:10;;:4;:10;;;42024:90;;42055:47;42088:4;42094:7;42055:32;:47::i;:::-;42024:90;41927:187;42142:1;42128:16;;:2;:16;;;42124:183;;;42161:45;42198:7;42161:36;:45::i;:::-;42124:183;;;42234:4;42228:10;;:2;:10;;;42224:83;;42255:40;42283:2;42287:7;42255:27;:40::i;:::-;42224:83;42124:183;41725:589;;;:::o;33381:439::-;33475:1;33461:16;;:2;:16;;;;33453:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33534:16;33542:7;33534;:16::i;:::-;33533:17;33525:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33596:45;33625:1;33629:2;33633:7;33596:20;:45::i;:::-;33671:1;33654:9;:13;33664:2;33654:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33702:2;33683:7;:16;33691:7;33683:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33747:7;33743:2;33722:33;;33739:1;33722:33;;;;;;;;;;;;33768:44;33796:1;33800:2;33804:7;33768:19;:44::i;:::-;33381:439;;:::o;7362:326::-;7422:4;7679:1;7657:7;:19;;;:23;7650:30;;7362:326;;;:::o;38395:126::-;;;;:::o;43037:164::-;43141:10;:17;;;;43114:15;:24;43130:7;43114:24;;;;;;;;;;;:44;;;;43169:10;43185:7;43169:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43037:164;:::o;43828:988::-;44094:22;44144:1;44119:22;44136:4;44119:16;:22::i;:::-;:26;;;;:::i;:::-;44094:51;;44156:18;44177:17;:26;44195:7;44177:26;;;;;;;;;;;;44156:47;;44324:14;44310:10;:28;44306:328;;44355:19;44377:12;:18;44390:4;44377:18;;;;;;;;;;;;;;;:34;44396:14;44377:34;;;;;;;;;;;;44355:56;;44461:11;44428:12;:18;44441:4;44428:18;;;;;;;;;;;;;;;:30;44447:10;44428:30;;;;;;;;;;;:44;;;;44578:10;44545:17;:30;44563:11;44545:30;;;;;;;;;;;:43;;;;44340:294;44306:328;44730:17;:26;44748:7;44730:26;;;;;;;;;;;44723:33;;;44774:12;:18;44787:4;44774:18;;;;;;;;;;;;;;;:34;44793:14;44774:34;;;;;;;;;;;44767:41;;;43909:907;;43828:988;;:::o;45111:1079::-;45364:22;45409:1;45389:10;:17;;;;:21;;;;:::i;:::-;45364:46;;45421:18;45442:15;:24;45458:7;45442:24;;;;;;;;;;;;45421:45;;45793:19;45815:10;45826:14;45815:26;;;;;;;;:::i;:::-;;;;;;;;;;45793:48;;45879:11;45854:10;45865;45854:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45990:10;45959:15;:28;45975:11;45959:28;;;;;;;;;;;:41;;;;46131:15;:24;46147:7;46131:24;;;;;;;;;;;46124:31;;;46166:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45182:1008;;;45111:1079;:::o;42615:221::-;42700:14;42717:20;42734:2;42717:16;:20::i;:::-;42700:37;;42775:7;42748:12;:16;42761:2;42748:16;;;;;;;;;;;;;;;:24;42765:6;42748:24;;;;;;;;;;;:34;;;;42822:6;42793:17;:26;42811:7;42793:26;;;;;;;;;;;:35;;;;42689:147;42615:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:135::-;2912:5;2950:6;2937:20;2928:29;;2966:31;2991:5;2966:31;:::i;:::-;2868:135;;;;:::o;3009:329::-;3068:6;3117:2;3105:9;3096:7;3092:23;3088:32;3085:119;;;3123:79;;:::i;:::-;3085:119;3243:1;3268:53;3313:7;3304:6;3293:9;3289:22;3268:53;:::i;:::-;3258:63;;3214:117;3009:329;;;;:::o;3344:474::-;3412:6;3420;3469:2;3457:9;3448:7;3444:23;3440:32;3437:119;;;3475:79;;:::i;:::-;3437:119;3595:1;3620:53;3665:7;3656:6;3645:9;3641:22;3620:53;:::i;:::-;3610:63;;3566:117;3722:2;3748:53;3793:7;3784:6;3773:9;3769:22;3748:53;:::i;:::-;3738:63;;3693:118;3344:474;;;;;:::o;3824:619::-;3901:6;3909;3917;3966:2;3954:9;3945:7;3941:23;3937:32;3934:119;;;3972:79;;:::i;:::-;3934:119;4092:1;4117:53;4162:7;4153:6;4142:9;4138:22;4117:53;:::i;:::-;4107:63;;4063:117;4219:2;4245:53;4290:7;4281:6;4270:9;4266:22;4245:53;:::i;:::-;4235:63;;4190:118;4347:2;4373:53;4418:7;4409:6;4398:9;4394:22;4373:53;:::i;:::-;4363:63;;4318:118;3824:619;;;;;:::o;4449:943::-;4544:6;4552;4560;4568;4617:3;4605:9;4596:7;4592:23;4588:33;4585:120;;;4624:79;;:::i;:::-;4585:120;4744:1;4769:53;4814:7;4805:6;4794:9;4790:22;4769:53;:::i;:::-;4759:63;;4715:117;4871:2;4897:53;4942:7;4933:6;4922:9;4918:22;4897:53;:::i;:::-;4887:63;;4842:118;4999:2;5025:53;5070:7;5061:6;5050:9;5046:22;5025:53;:::i;:::-;5015:63;;4970:118;5155:2;5144:9;5140:18;5127:32;5186:18;5178:6;5175:30;5172:117;;;5208:79;;:::i;:::-;5172:117;5313:62;5367:7;5358:6;5347:9;5343:22;5313:62;:::i;:::-;5303:72;;5098:287;4449:943;;;;;;;:::o;5398:468::-;5463:6;5471;5520:2;5508:9;5499:7;5495:23;5491:32;5488:119;;;5526:79;;:::i;:::-;5488:119;5646:1;5671:53;5716:7;5707:6;5696:9;5692:22;5671:53;:::i;:::-;5661:63;;5617:117;5773:2;5799:50;5841:7;5832:6;5821:9;5817:22;5799:50;:::i;:::-;5789:60;;5744:115;5398:468;;;;;:::o;5872:474::-;5940:6;5948;5997:2;5985:9;5976:7;5972:23;5968:32;5965:119;;;6003:79;;:::i;:::-;5965:119;6123:1;6148:53;6193:7;6184:6;6173:9;6169:22;6148:53;:::i;:::-;6138:63;;6094:117;6250:2;6276:53;6321:7;6312:6;6301:9;6297:22;6276:53;:::i;:::-;6266:63;;6221:118;5872:474;;;;;:::o;6352:700::-;6445:6;6453;6461;6510:2;6498:9;6489:7;6485:23;6481:32;6478:119;;;6516:79;;:::i;:::-;6478:119;6664:1;6653:9;6649:17;6636:31;6694:18;6686:6;6683:30;6680:117;;;6716:79;;:::i;:::-;6680:117;6829:80;6901:7;6892:6;6881:9;6877:22;6829:80;:::i;:::-;6811:98;;;;6607:312;6958:2;6984:51;7027:7;7018:6;7007:9;7003:22;6984:51;:::i;:::-;6974:61;;6929:116;6352:700;;;;;:::o;7058:323::-;7114:6;7163:2;7151:9;7142:7;7138:23;7134:32;7131:119;;;7169:79;;:::i;:::-;7131:119;7289:1;7314:50;7356:7;7347:6;7336:9;7332:22;7314:50;:::i;:::-;7304:60;;7260:114;7058:323;;;;:::o;7387:327::-;7445:6;7494:2;7482:9;7473:7;7469:23;7465:32;7462:119;;;7500:79;;:::i;:::-;7462:119;7620:1;7645:52;7689:7;7680:6;7669:9;7665:22;7645:52;:::i;:::-;7635:62;;7591:116;7387:327;;;;:::o;7720:349::-;7789:6;7838:2;7826:9;7817:7;7813:23;7809:32;7806:119;;;7844:79;;:::i;:::-;7806:119;7964:1;7989:63;8044:7;8035:6;8024:9;8020:22;7989:63;:::i;:::-;7979:73;;7935:127;7720:349;;;;:::o;8075:509::-;8144:6;8193:2;8181:9;8172:7;8168:23;8164:32;8161:119;;;8199:79;;:::i;:::-;8161:119;8347:1;8336:9;8332:17;8319:31;8377:18;8369:6;8366:30;8363:117;;;8399:79;;:::i;:::-;8363:117;8504:63;8559:7;8550:6;8539:9;8535:22;8504:63;:::i;:::-;8494:73;;8290:287;8075:509;;;;:::o;8590:329::-;8649:6;8698:2;8686:9;8677:7;8673:23;8669:32;8666:119;;;8704:79;;:::i;:::-;8666:119;8824:1;8849:53;8894:7;8885:6;8874:9;8870:22;8849:53;:::i;:::-;8839:63;;8795:117;8590:329;;;;:::o;8925:325::-;8982:6;9031:2;9019:9;9010:7;9006:23;9002:32;8999:119;;;9037:79;;:::i;:::-;8999:119;9157:1;9182:51;9225:7;9216:6;9205:9;9201:22;9182:51;:::i;:::-;9172:61;;9128:115;8925:325;;;;:::o;9256:118::-;9343:24;9361:5;9343:24;:::i;:::-;9338:3;9331:37;9256:118;;:::o;9380:109::-;9461:21;9476:5;9461:21;:::i;:::-;9456:3;9449:34;9380:109;;:::o;9495:360::-;9581:3;9609:38;9641:5;9609:38;:::i;:::-;9663:70;9726:6;9721:3;9663:70;:::i;:::-;9656:77;;9742:52;9787:6;9782:3;9775:4;9768:5;9764:16;9742:52;:::i;:::-;9819:29;9841:6;9819:29;:::i;:::-;9814:3;9810:39;9803:46;;9585:270;9495:360;;;;:::o;9861:364::-;9949:3;9977:39;10010:5;9977:39;:::i;:::-;10032:71;10096:6;10091:3;10032:71;:::i;:::-;10025:78;;10112:52;10157:6;10152:3;10145:4;10138:5;10134:16;10112:52;:::i;:::-;10189:29;10211:6;10189:29;:::i;:::-;10184:3;10180:39;10173:46;;9953:272;9861:364;;;;:::o;10231:377::-;10337:3;10365:39;10398:5;10365:39;:::i;:::-;10420:89;10502:6;10497:3;10420:89;:::i;:::-;10413:96;;10518:52;10563:6;10558:3;10551:4;10544:5;10540:16;10518:52;:::i;:::-;10595:6;10590:3;10586:16;10579:23;;10341:267;10231:377;;;;:::o;10614:366::-;10756:3;10777:67;10841:2;10836:3;10777:67;:::i;:::-;10770:74;;10853:93;10942:3;10853:93;:::i;:::-;10971:2;10966:3;10962:12;10955:19;;10614:366;;;:::o;10986:::-;11128:3;11149:67;11213:2;11208:3;11149:67;:::i;:::-;11142:74;;11225:93;11314:3;11225:93;:::i;:::-;11343:2;11338:3;11334:12;11327:19;;10986:366;;;:::o;11358:::-;11500:3;11521:67;11585:2;11580:3;11521:67;:::i;:::-;11514:74;;11597:93;11686:3;11597:93;:::i;:::-;11715:2;11710:3;11706:12;11699:19;;11358:366;;;:::o;11730:::-;11872:3;11893:67;11957:2;11952:3;11893:67;:::i;:::-;11886:74;;11969:93;12058:3;11969:93;:::i;:::-;12087:2;12082:3;12078:12;12071:19;;11730:366;;;:::o;12102:::-;12244:3;12265:67;12329:2;12324:3;12265:67;:::i;:::-;12258:74;;12341:93;12430:3;12341:93;:::i;:::-;12459:2;12454:3;12450:12;12443:19;;12102:366;;;:::o;12474:::-;12616:3;12637:67;12701:2;12696:3;12637:67;:::i;:::-;12630:74;;12713:93;12802:3;12713:93;:::i;:::-;12831:2;12826:3;12822:12;12815:19;;12474:366;;;:::o;12846:::-;12988:3;13009:67;13073:2;13068:3;13009:67;:::i;:::-;13002:74;;13085:93;13174:3;13085:93;:::i;:::-;13203:2;13198:3;13194:12;13187:19;;12846:366;;;:::o;13218:::-;13360:3;13381:67;13445:2;13440:3;13381:67;:::i;:::-;13374:74;;13457:93;13546:3;13457:93;:::i;:::-;13575:2;13570:3;13566:12;13559:19;;13218:366;;;:::o;13590:::-;13732:3;13753:67;13817:2;13812:3;13753:67;:::i;:::-;13746:74;;13829:93;13918:3;13829:93;:::i;:::-;13947:2;13942:3;13938:12;13931:19;;13590:366;;;:::o;13962:::-;14104:3;14125:67;14189:2;14184:3;14125:67;:::i;:::-;14118:74;;14201:93;14290:3;14201:93;:::i;:::-;14319:2;14314:3;14310:12;14303:19;;13962:366;;;:::o;14334:::-;14476:3;14497:67;14561:2;14556:3;14497:67;:::i;:::-;14490:74;;14573:93;14662:3;14573:93;:::i;:::-;14691:2;14686:3;14682:12;14675:19;;14334:366;;;:::o;14706:::-;14848:3;14869:67;14933:2;14928:3;14869:67;:::i;:::-;14862:74;;14945:93;15034:3;14945:93;:::i;:::-;15063:2;15058:3;15054:12;15047:19;;14706:366;;;:::o;15078:::-;15220:3;15241:67;15305:2;15300:3;15241:67;:::i;:::-;15234:74;;15317:93;15406:3;15317:93;:::i;:::-;15435:2;15430:3;15426:12;15419:19;;15078:366;;;:::o;15450:::-;15592:3;15613:67;15677:2;15672:3;15613:67;:::i;:::-;15606:74;;15689:93;15778:3;15689:93;:::i;:::-;15807:2;15802:3;15798:12;15791:19;;15450:366;;;:::o;15822:::-;15964:3;15985:67;16049:2;16044:3;15985:67;:::i;:::-;15978:74;;16061:93;16150:3;16061:93;:::i;:::-;16179:2;16174:3;16170:12;16163:19;;15822:366;;;:::o;16194:::-;16336:3;16357:67;16421:2;16416:3;16357:67;:::i;:::-;16350:74;;16433:93;16522:3;16433:93;:::i;:::-;16551:2;16546:3;16542:12;16535:19;;16194:366;;;:::o;16566:::-;16708:3;16729:67;16793:2;16788:3;16729:67;:::i;:::-;16722:74;;16805:93;16894:3;16805:93;:::i;:::-;16923:2;16918:3;16914:12;16907:19;;16566:366;;;:::o;16938:::-;17080:3;17101:67;17165:2;17160:3;17101:67;:::i;:::-;17094:74;;17177:93;17266:3;17177:93;:::i;:::-;17295:2;17290:3;17286:12;17279:19;;16938:366;;;:::o;17310:::-;17452:3;17473:67;17537:2;17532:3;17473:67;:::i;:::-;17466:74;;17549:93;17638:3;17549:93;:::i;:::-;17667:2;17662:3;17658:12;17651:19;;17310:366;;;:::o;17682:::-;17824:3;17845:67;17909:2;17904:3;17845:67;:::i;:::-;17838:74;;17921:93;18010:3;17921:93;:::i;:::-;18039:2;18034:3;18030:12;18023:19;;17682:366;;;:::o;18054:::-;18196:3;18217:67;18281:2;18276:3;18217:67;:::i;:::-;18210:74;;18293:93;18382:3;18293:93;:::i;:::-;18411:2;18406:3;18402:12;18395:19;;18054:366;;;:::o;18426:118::-;18513:24;18531:5;18513:24;:::i;:::-;18508:3;18501:37;18426:118;;:::o;18550:112::-;18633:22;18649:5;18633:22;:::i;:::-;18628:3;18621:35;18550:112;;:::o;18668:435::-;18848:3;18870:95;18961:3;18952:6;18870:95;:::i;:::-;18863:102;;18982:95;19073:3;19064:6;18982:95;:::i;:::-;18975:102;;19094:3;19087:10;;18668:435;;;;;:::o;19109:222::-;19202:4;19240:2;19229:9;19225:18;19217:26;;19253:71;19321:1;19310:9;19306:17;19297:6;19253:71;:::i;:::-;19109:222;;;;:::o;19337:640::-;19532:4;19570:3;19559:9;19555:19;19547:27;;19584:71;19652:1;19641:9;19637:17;19628:6;19584:71;:::i;:::-;19665:72;19733:2;19722:9;19718:18;19709:6;19665:72;:::i;:::-;19747;19815:2;19804:9;19800:18;19791:6;19747:72;:::i;:::-;19866:9;19860:4;19856:20;19851:2;19840:9;19836:18;19829:48;19894:76;19965:4;19956:6;19894:76;:::i;:::-;19886:84;;19337:640;;;;;;;:::o;19983:210::-;20070:4;20108:2;20097:9;20093:18;20085:26;;20121:65;20183:1;20172:9;20168:17;20159:6;20121:65;:::i;:::-;19983:210;;;;:::o;20199:313::-;20312:4;20350:2;20339:9;20335:18;20327:26;;20399:9;20393:4;20389:20;20385:1;20374:9;20370:17;20363:47;20427:78;20500:4;20491:6;20427:78;:::i;:::-;20419:86;;20199:313;;;;:::o;20518:419::-;20684:4;20722:2;20711:9;20707:18;20699:26;;20771:9;20765:4;20761:20;20757:1;20746:9;20742:17;20735:47;20799:131;20925:4;20799:131;:::i;:::-;20791:139;;20518:419;;;:::o;20943:::-;21109:4;21147:2;21136:9;21132:18;21124:26;;21196:9;21190:4;21186:20;21182:1;21171:9;21167:17;21160:47;21224:131;21350:4;21224:131;:::i;:::-;21216:139;;20943:419;;;:::o;21368:::-;21534:4;21572:2;21561:9;21557:18;21549:26;;21621:9;21615:4;21611:20;21607:1;21596:9;21592:17;21585:47;21649:131;21775:4;21649:131;:::i;:::-;21641:139;;21368:419;;;:::o;21793:::-;21959:4;21997:2;21986:9;21982:18;21974:26;;22046:9;22040:4;22036:20;22032:1;22021:9;22017:17;22010:47;22074:131;22200:4;22074:131;:::i;:::-;22066:139;;21793:419;;;:::o;22218:::-;22384:4;22422:2;22411:9;22407:18;22399:26;;22471:9;22465:4;22461:20;22457:1;22446:9;22442:17;22435:47;22499:131;22625:4;22499:131;:::i;:::-;22491:139;;22218:419;;;:::o;22643:::-;22809:4;22847:2;22836:9;22832:18;22824:26;;22896:9;22890:4;22886:20;22882:1;22871:9;22867:17;22860:47;22924:131;23050:4;22924:131;:::i;:::-;22916:139;;22643:419;;;:::o;23068:::-;23234:4;23272:2;23261:9;23257:18;23249:26;;23321:9;23315:4;23311:20;23307:1;23296:9;23292:17;23285:47;23349:131;23475:4;23349:131;:::i;:::-;23341:139;;23068:419;;;:::o;23493:::-;23659:4;23697:2;23686:9;23682:18;23674:26;;23746:9;23740:4;23736:20;23732:1;23721:9;23717:17;23710:47;23774:131;23900:4;23774:131;:::i;:::-;23766:139;;23493:419;;;:::o;23918:::-;24084:4;24122:2;24111:9;24107:18;24099:26;;24171:9;24165:4;24161:20;24157:1;24146:9;24142:17;24135:47;24199:131;24325:4;24199:131;:::i;:::-;24191:139;;23918:419;;;:::o;24343:::-;24509:4;24547:2;24536:9;24532:18;24524:26;;24596:9;24590:4;24586:20;24582:1;24571:9;24567:17;24560:47;24624:131;24750:4;24624:131;:::i;:::-;24616:139;;24343:419;;;:::o;24768:::-;24934:4;24972:2;24961:9;24957:18;24949:26;;25021:9;25015:4;25011:20;25007:1;24996:9;24992:17;24985:47;25049:131;25175:4;25049:131;:::i;:::-;25041:139;;24768:419;;;:::o;25193:::-;25359:4;25397:2;25386:9;25382:18;25374:26;;25446:9;25440:4;25436:20;25432:1;25421:9;25417:17;25410:47;25474:131;25600:4;25474:131;:::i;:::-;25466:139;;25193:419;;;:::o;25618:::-;25784:4;25822:2;25811:9;25807:18;25799:26;;25871:9;25865:4;25861:20;25857:1;25846:9;25842:17;25835:47;25899:131;26025:4;25899:131;:::i;:::-;25891:139;;25618:419;;;:::o;26043:::-;26209:4;26247:2;26236:9;26232:18;26224:26;;26296:9;26290:4;26286:20;26282:1;26271:9;26267:17;26260:47;26324:131;26450:4;26324:131;:::i;:::-;26316:139;;26043:419;;;:::o;26468:::-;26634:4;26672:2;26661:9;26657:18;26649:26;;26721:9;26715:4;26711:20;26707:1;26696:9;26692:17;26685:47;26749:131;26875:4;26749:131;:::i;:::-;26741:139;;26468:419;;;:::o;26893:::-;27059:4;27097:2;27086:9;27082:18;27074:26;;27146:9;27140:4;27136:20;27132:1;27121:9;27117:17;27110:47;27174:131;27300:4;27174:131;:::i;:::-;27166:139;;26893:419;;;:::o;27318:::-;27484:4;27522:2;27511:9;27507:18;27499:26;;27571:9;27565:4;27561:20;27557:1;27546:9;27542:17;27535:47;27599:131;27725:4;27599:131;:::i;:::-;27591:139;;27318:419;;;:::o;27743:::-;27909:4;27947:2;27936:9;27932:18;27924:26;;27996:9;27990:4;27986:20;27982:1;27971:9;27967:17;27960:47;28024:131;28150:4;28024:131;:::i;:::-;28016:139;;27743:419;;;:::o;28168:::-;28334:4;28372:2;28361:9;28357:18;28349:26;;28421:9;28415:4;28411:20;28407:1;28396:9;28392:17;28385:47;28449:131;28575:4;28449:131;:::i;:::-;28441:139;;28168:419;;;:::o;28593:::-;28759:4;28797:2;28786:9;28782:18;28774:26;;28846:9;28840:4;28836:20;28832:1;28821:9;28817:17;28810:47;28874:131;29000:4;28874:131;:::i;:::-;28866:139;;28593:419;;;:::o;29018:::-;29184:4;29222:2;29211:9;29207:18;29199:26;;29271:9;29265:4;29261:20;29257:1;29246:9;29242:17;29235:47;29299:131;29425:4;29299:131;:::i;:::-;29291:139;;29018:419;;;:::o;29443:222::-;29536:4;29574:2;29563:9;29559:18;29551:26;;29587:71;29655:1;29644:9;29640:17;29631:6;29587:71;:::i;:::-;29443:222;;;;:::o;29671:214::-;29760:4;29798:2;29787:9;29783:18;29775:26;;29811:67;29875:1;29864:9;29860:17;29851:6;29811:67;:::i;:::-;29671:214;;;;:::o;29891:129::-;29925:6;29952:20;;:::i;:::-;29942:30;;29981:33;30009:4;30001:6;29981:33;:::i;:::-;29891:129;;;:::o;30026:75::-;30059:6;30092:2;30086:9;30076:19;;30026:75;:::o;30107:307::-;30168:4;30258:18;30250:6;30247:30;30244:56;;;30280:18;;:::i;:::-;30244:56;30318:29;30340:6;30318:29;:::i;:::-;30310:37;;30402:4;30396;30392:15;30384:23;;30107:307;;;:::o;30420:308::-;30482:4;30572:18;30564:6;30561:30;30558:56;;;30594:18;;:::i;:::-;30558:56;30632:29;30654:6;30632:29;:::i;:::-;30624:37;;30716:4;30710;30706:15;30698:23;;30420:308;;;:::o;30734:98::-;30785:6;30819:5;30813:12;30803:22;;30734:98;;;:::o;30838:99::-;30890:6;30924:5;30918:12;30908:22;;30838:99;;;:::o;30943:168::-;31026:11;31060:6;31055:3;31048:19;31100:4;31095:3;31091:14;31076:29;;30943:168;;;;:::o;31117:169::-;31201:11;31235:6;31230:3;31223:19;31275:4;31270:3;31266:14;31251:29;;31117:169;;;;:::o;31292:148::-;31394:11;31431:3;31416:18;;31292:148;;;;:::o;31446:305::-;31486:3;31505:20;31523:1;31505:20;:::i;:::-;31500:25;;31539:20;31557:1;31539:20;:::i;:::-;31534:25;;31693:1;31625:66;31621:74;31618:1;31615:81;31612:107;;;31699:18;;:::i;:::-;31612:107;31743:1;31740;31736:9;31729:16;;31446:305;;;;:::o;31757:185::-;31797:1;31814:20;31832:1;31814:20;:::i;:::-;31809:25;;31848:20;31866:1;31848:20;:::i;:::-;31843:25;;31887:1;31877:35;;31892:18;;:::i;:::-;31877:35;31934:1;31931;31927:9;31922:14;;31757:185;;;;:::o;31948:348::-;31988:7;32011:20;32029:1;32011:20;:::i;:::-;32006:25;;32045:20;32063:1;32045:20;:::i;:::-;32040:25;;32233:1;32165:66;32161:74;32158:1;32155:81;32150:1;32143:9;32136:17;32132:105;32129:131;;;32240:18;;:::i;:::-;32129:131;32288:1;32285;32281:9;32270:20;;31948:348;;;;:::o;32302:191::-;32342:4;32362:20;32380:1;32362:20;:::i;:::-;32357:25;;32396:20;32414:1;32396:20;:::i;:::-;32391:25;;32435:1;32432;32429:8;32426:34;;;32440:18;;:::i;:::-;32426:34;32485:1;32482;32478:9;32470:17;;32302:191;;;;:::o;32499:185::-;32537:4;32557:18;32573:1;32557:18;:::i;:::-;32552:23;;32589:18;32605:1;32589:18;:::i;:::-;32584:23;;32626:1;32623;32620:8;32617:34;;;32631:18;;:::i;:::-;32617:34;32676:1;32673;32669:9;32661:17;;32499:185;;;;:::o;32690:96::-;32727:7;32756:24;32774:5;32756:24;:::i;:::-;32745:35;;32690:96;;;:::o;32792:90::-;32826:7;32869:5;32862:13;32855:21;32844:32;;32792:90;;;:::o;32888:149::-;32924:7;32964:66;32957:5;32953:78;32942:89;;32888:149;;;:::o;33043:126::-;33080:7;33120:42;33113:5;33109:54;33098:65;;33043:126;;;:::o;33175:77::-;33212:7;33241:5;33230:16;;33175:77;;;:::o;33258:86::-;33293:7;33333:4;33326:5;33322:16;33311:27;;33258:86;;;:::o;33350:154::-;33434:6;33429:3;33424;33411:30;33496:1;33487:6;33482:3;33478:16;33471:27;33350:154;;;:::o;33510:307::-;33578:1;33588:113;33602:6;33599:1;33596:13;33588:113;;;33687:1;33682:3;33678:11;33672:18;33668:1;33663:3;33659:11;33652:39;33624:2;33621:1;33617:10;33612:15;;33588:113;;;33719:6;33716:1;33713:13;33710:101;;;33799:1;33790:6;33785:3;33781:16;33774:27;33710:101;33559:258;33510:307;;;:::o;33823:320::-;33867:6;33904:1;33898:4;33894:12;33884:22;;33951:1;33945:4;33941:12;33972:18;33962:81;;34028:4;34020:6;34016:17;34006:27;;33962:81;34090:2;34082:6;34079:14;34059:18;34056:38;34053:84;;;34109:18;;:::i;:::-;34053:84;33874:269;33823:320;;;:::o;34149:281::-;34232:27;34254:4;34232:27;:::i;:::-;34224:6;34220:40;34362:6;34350:10;34347:22;34326:18;34314:10;34311:34;34308:62;34305:88;;;34373:18;;:::i;:::-;34305:88;34413:10;34409:2;34402:22;34192:238;34149:281;;:::o;34436:233::-;34475:3;34498:24;34516:5;34498:24;:::i;:::-;34489:33;;34544:66;34537:5;34534:77;34531:103;;;34614:18;;:::i;:::-;34531:103;34661:1;34654:5;34650:13;34643:20;;34436:233;;;:::o;34675:176::-;34707:1;34724:20;34742:1;34724:20;:::i;:::-;34719:25;;34758:20;34776:1;34758:20;:::i;:::-;34753:25;;34797:1;34787:35;;34802:18;;:::i;:::-;34787:35;34843:1;34840;34836:9;34831:14;;34675:176;;;;:::o;34857:180::-;34905:77;34902:1;34895:88;35002:4;34999:1;34992:15;35026:4;35023:1;35016:15;35043:180;35091:77;35088:1;35081:88;35188:4;35185:1;35178:15;35212:4;35209:1;35202:15;35229:180;35277:77;35274:1;35267:88;35374:4;35371:1;35364:15;35398:4;35395:1;35388:15;35415:180;35463:77;35460:1;35453:88;35560:4;35557:1;35550:15;35584:4;35581:1;35574:15;35601:180;35649:77;35646:1;35639:88;35746:4;35743:1;35736:15;35770:4;35767:1;35760:15;35787:180;35835:77;35832:1;35825:88;35932:4;35929:1;35922:15;35956:4;35953:1;35946:15;35973:117;36082:1;36079;36072:12;36096:117;36205:1;36202;36195:12;36219:117;36328:1;36325;36318:12;36342:117;36451:1;36448;36441:12;36465:117;36574:1;36571;36564:12;36588:117;36697:1;36694;36687:12;36711:102;36752:6;36803:2;36799:7;36794:2;36787:5;36783:14;36779:28;36769:38;;36711:102;;;:::o;36819:230::-;36959:34;36955:1;36947:6;36943:14;36936:58;37028:13;37023:2;37015:6;37011:15;37004:38;36819:230;:::o;37055:237::-;37195:34;37191:1;37183:6;37179:14;37172:58;37264:20;37259:2;37251:6;37247:15;37240:45;37055:237;:::o;37298:225::-;37438:34;37434:1;37426:6;37422:14;37415:58;37507:8;37502:2;37494:6;37490:15;37483:33;37298:225;:::o;37529:182::-;37669:34;37665:1;37657:6;37653:14;37646:58;37529:182;:::o;37717:224::-;37857:34;37853:1;37845:6;37841:14;37834:58;37926:7;37921:2;37913:6;37909:15;37902:32;37717:224;:::o;37947:178::-;38087:30;38083:1;38075:6;38071:14;38064:54;37947:178;:::o;38131:223::-;38271:34;38267:1;38259:6;38255:14;38248:58;38340:6;38335:2;38327:6;38323:15;38316:31;38131:223;:::o;38360:175::-;38500:27;38496:1;38488:6;38484:14;38477:51;38360:175;:::o;38541:181::-;38681:33;38677:1;38669:6;38665:14;38658:57;38541:181;:::o;38728:228::-;38868:34;38864:1;38856:6;38852:14;38845:58;38937:11;38932:2;38924:6;38920:15;38913:36;38728:228;:::o;38962:249::-;39102:34;39098:1;39090:6;39086:14;39079:58;39171:32;39166:2;39158:6;39154:15;39147:57;38962:249;:::o;39217:182::-;39357:34;39353:1;39345:6;39341:14;39334:58;39217:182;:::o;39405:::-;39545:34;39541:1;39533:6;39529:14;39522:58;39405:182;:::o;39593:174::-;39733:26;39729:1;39721:6;39717:14;39710:50;39593:174;:::o;39773:221::-;39913:34;39909:1;39901:6;39897:14;39890:58;39982:4;39977:2;39969:6;39965:15;39958:29;39773:221;:::o;40000:220::-;40140:34;40136:1;40128:6;40124:14;40117:58;40209:3;40204:2;40196:6;40192:15;40185:28;40000:220;:::o;40226:177::-;40366:29;40362:1;40354:6;40350:14;40343:53;40226:177;:::o;40409:221::-;40549:34;40545:1;40537:6;40533:14;40526:58;40618:4;40613:2;40605:6;40601:15;40594:29;40409:221;:::o;40636:231::-;40776:34;40772:1;40764:6;40760:14;40753:58;40845:14;40840:2;40832:6;40828:15;40821:39;40636:231;:::o;40873:174::-;41013:26;41009:1;41001:6;40997:14;40990:50;40873:174;:::o;41053:233::-;41193:34;41189:1;41181:6;41177:14;41170:58;41262:16;41257:2;41249:6;41245:15;41238:41;41053:233;:::o;41292:122::-;41365:24;41383:5;41365:24;:::i;:::-;41358:5;41355:35;41345:63;;41404:1;41401;41394:12;41345:63;41292:122;:::o;41420:116::-;41490:21;41505:5;41490:21;:::i;:::-;41483:5;41480:32;41470:60;;41526:1;41523;41516:12;41470:60;41420:116;:::o;41542:120::-;41614:23;41631:5;41614:23;:::i;:::-;41607:5;41604:34;41594:62;;41652:1;41649;41642:12;41594:62;41542:120;:::o;41668:122::-;41741:24;41759:5;41741:24;:::i;:::-;41734:5;41731:35;41721:63;;41780:1;41777;41770:12;41721:63;41668:122;:::o;41796:118::-;41867:22;41883:5;41867:22;:::i;:::-;41860:5;41857:33;41847:61;;41904:1;41901;41894:12;41847:61;41796:118;:::o
Swarm Source
ipfs://9f565b1540874638ee8b6334f275a22c022c85526073c83f509c169e54b84e51
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.