Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
9,902 TENN
Holders
2,559
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TENNLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TenNeighbors
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-12 */ // SPDX-License-Identifier: MIT // File: contracts/Base64.sol pragma solidity ^0.8.0; /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides a function for encoding some bytes in base64 library Base64 { string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and( input, 0x3F))))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/TenNeighbors.sol pragma solidity ^0.8.0; contract TenNeighbors is ERC721Enumerable, ReentrancyGuard, Ownable { using Strings for uint256; uint256 public numClaimed = 0; struct Neighbors { uint256[10] x; uint256[10] y; } constructor() ERC721("TenNeighbors", "TENN") {} function random(bytes memory input) internal pure returns (uint256) { return uint256(keccak256(input)); } function getTenNeighbors(uint256 tokenId) public pure returns (Neighbors memory) { tokenId = 54000 - tokenId; Neighbors memory neighbors; uint256 x; uint256 y; uint256 rand; bool[10][10] memory grid; string[10] memory nb = ["first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth"]; for (uint256 i = 0; i < 10; i++) { x = random(abi.encodePacked("x", nb[i], tokenId.toString())) % 9; y = random(abi.encodePacked(tokenId.toString(), nb[i], "y")) % 9; if (grid[x][y]) { rand = random(abi.encodePacked(nb[i], tokenId.toString(), x.toString(), y.toString())) % 8; while (grid[x][y]) { if (rand == 0 || rand == 1) { x++; if (x == 9) { x = 0; if (rand == 0) { y++; if (y == 9) { y = 0; } } else { if (y > 0) { y--; } else { y = 8; } } } } else if (rand == 2 || rand == 3) { if (x > 0) { x--; } else { x = 8; if (rand == 2) { y++; if (y == 9) { y = 0; } } else { if (y > 0) { y--; } else { y = 8; } } } } else if (rand == 4 || rand == 5) { y++; if (y == 9) { y = 0; if (rand == 4) { x++; if (x == 9) { x = 0; } } else { if (x > 0) { x--; } else { x = 8; } } } } else { if (y > 0) { y--; } else { y = 8; if (rand == 6) { x++; if (x == 9) { x = 0; } } else { if (x > 0) { x--; } else { x = 8; } } } } } } grid[x][y] = true; grid[x + 1][y] = true; grid[x + 1][y + 1] = true; grid[x][y + 1] = true; if (x > 0) { grid[x - 1][y] = true; grid[x - 1][y + 1] = true; } if (y > 0) { grid[x][y - 1] = true; grid[x + 1][y - 1] = true; } if (x > 0 && y > 0) { grid[x - 1][y - 1] = true; } neighbors.x[i] = x; neighbors.y[i] = y; } return neighbors; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "Nonexistent token"); Neighbors memory neighbors = getTenNeighbors(tokenId); string memory svg; string memory metadata; for (uint256 i; i < 10; i++) { svg = string( abi.encodePacked( svg, '<rect class="t" x="', neighbors.x[i].toString(), '" y="', neighbors.y[i].toString(), '"/>' ) ); metadata = string( abi.encodePacked( metadata, '{"trait_type": "X-Y"', ', "value": "', neighbors.x[i].toString(), '-', neighbors.y[i].toString(), '"}' ) ); if (i != 9) { metadata = string(abi.encodePacked(metadata, ', ')); } } svg = string( abi.encodePacked( '<svg id="ten-svg" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 10 10"> ', '<rect x="0" y="0" width="10" height="10" fill="#F3F3F3"/>', svg, '<style>.t{width:2px;height:2px;fill:#E96868} #ten-svg{shape-rendering:crispedges;}</style></svg>' ) ); return string( abi.encodePacked( "data:application/json;base64,", Base64.encode( bytes( string( abi.encodePacked( '{"name": "Ten Neighbors #', tokenId.toString(), '", "description": "Ten Neighbors."', ', "image": "data:image/svg+xml;base64,', Base64.encode(bytes(svg)), '", "attributes": [', metadata, ']}' ) ) ) ) ) ); } function claim() public nonReentrant { require(numClaimed < 9900, "invalid claim"); _safeMint(_msgSender(), numClaimed); numClaimed += 1; } function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner { require(tokenId > 9899 && tokenId < 10000, "invalid claim"); _safeMint(owner(), tokenId); } }
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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTenNeighbors","outputs":[{"components":[{"internalType":"uint256[10]","name":"x","type":"uint256[10]"},{"internalType":"uint256[10]","name":"y","type":"uint256[10]"}],"internalType":"struct TenNeighbors.Neighbors","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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"}]
Contract Creation Code
60806040526000600c553480156200001657600080fd5b506040518060400160405280600c81526020017f54656e4e65696768626f727300000000000000000000000000000000000000008152506040518060400160405280600481526020017f54454e4e0000000000000000000000000000000000000000000000000000000081525081600090805190602001906200009b929190620001b3565b508060019080519060200190620000b4929190620001b3565b5050506001600a81905550620000df620000d3620000e560201b60201c565b620000ed60201b60201c565b620002c8565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001c19062000263565b90600052602060002090601f016020900481019282620001e5576000855562000231565b82601f106200020057805160ff191683800117855562000231565b8280016001018555821562000231579182015b828111156200023057825182559160200191906001019062000213565b5b50905062000240919062000244565b5090565b5b808211156200025f57600081600090555060010162000245565b5090565b600060028204905060018216806200027c57607f821691505b6020821081141562000293576200029262000299565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614d2b80620002d86000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80634f6ccce7116100c35780639c2f2a421161007c5780639c2f2a421461039e578063a22cb465146103bc578063b88d4fde146103d8578063c87b56dd146103f4578063e985e9c514610424578063f2fde38b146104545761014d565b80634f6ccce7146102c85780636352211e146102f857806370a0823114610328578063715018a6146103585780638da5cb5b1461036257806395d89b41146103805761014d565b806323b872dd1161011557806323b872dd1461020a5780632f745c59146102265780633ff106561461025657806342842e0e14610286578063434f48c4146102a25780634e71d92d146102be5761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d057806318160ddd146101ec575b600080fd5b61016c60048036038101906101679190613140565b610470565b6040516101799190613b31565b60405180910390f35b61018a6104ea565b6040516101979190613b4c565b60405180910390f35b6101ba60048036038101906101b5919061319a565b61057c565b6040516101c79190613aca565b60405180910390f35b6101ea60048036038101906101e59190613100565b610601565b005b6101f4610719565b6040516102019190613e0a565b60405180910390f35b610224600480360381019061021f9190612fea565b610726565b005b610240600480360381019061023b9190613100565b610786565b60405161024d9190613e0a565b60405180910390f35b610270600480360381019061026b919061319a565b61082b565b60405161027d9190613dee565b60405180910390f35b6102a0600480360381019061029b9190612fea565b611171565b005b6102bc60048036038101906102b7919061319a565b611191565b005b6102c66112c8565b005b6102e260048036038101906102dd919061319a565b611393565b6040516102ef9190613e0a565b60405180910390f35b610312600480360381019061030d919061319a565b611404565b60405161031f9190613aca565b60405180910390f35b610342600480360381019061033d9190612f7d565b6114b6565b60405161034f9190613e0a565b60405180910390f35b61036061156e565b005b61036a6115f6565b6040516103779190613aca565b60405180910390f35b610388611620565b6040516103959190613b4c565b60405180910390f35b6103a66116b2565b6040516103b39190613e0a565b60405180910390f35b6103d660048036038101906103d191906130c0565b6116b8565b005b6103f260048036038101906103ed919061303d565b611839565b005b61040e6004803603810190610409919061319a565b61189b565b60405161041b9190613b4c565b60405180910390f35b61043e60048036038101906104399190612faa565b611a9f565b60405161044b9190613b31565b60405180910390f35b61046e60048036038101906104699190612f7d565b611b33565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104e357506104e282611c2b565b5b9050919050565b6060600080546104f9906140e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610525906140e0565b80156105725780601f1061054757610100808354040283529160200191610572565b820191906000526020600020905b81548152906001019060200180831161055557829003601f168201915b5050505050905090565b600061058782611d0d565b6105c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bd90613cee565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061060c82611404565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067490613d4e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661069c611d79565b73ffffffffffffffffffffffffffffffffffffffff1614806106cb57506106ca816106c5611d79565b611a9f565b5b61070a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070190613c4e565b60405180910390fd5b6107148383611d81565b505050565b6000600880549050905090565b610737610731611d79565b82611e3a565b610776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076d90613d6e565b60405180910390fd5b610781838383611f18565b505050565b6000610791836114b6565b82106107d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c990613b6e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610833612e0a565b8161d2f06108419190613fcc565b915061084b612e0a565b6000806000610858612e30565b60006040518061014001604052806040518060400160405280600581526020017f666972737400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f7365636f6e64000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f746869726400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f666f75727468000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f666966746800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f736978746800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f736576656e74680000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f656967687468000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6e696e746800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f74656e7468000000000000000000000000000000000000000000000000000000815250815250905060005b600a811015611162576009610b0b8383600a8110610ad857610ad7614279565b5b6020020151610ae68c612174565b604051602001610af7929190613a41565b6040516020818303038152906040526122d5565b610b15919061418c565b95506009610b62610b258b612174565b8484600a8110610b3857610b37614279565b5b6020020151604051602001610b4e9291906138d9565b6040516020818303038152906040526122d5565b610b6c919061418c565b94508286600a8110610b8157610b80614279565b5b602002015185600a8110610b9857610b97614279565b5b602002015115610e40576008610c018383600a8110610bba57610bb9614279565b5b6020020151610bc88c612174565b610bd18a612174565b610bda8a612174565b604051602001610bed949392919061389b565b6040516020818303038152906040526122d5565b610c0b919061418c565b93505b8286600a8110610c2157610c20614279565b5b602002015185600a8110610c3857610c37614279565b5b602002015115610e3f576000841480610c515750600184145b15610cc3578580610c6190614143565b9650506009861415610cbe57600095506000841415610c9b578480610c8590614143565b9550506009851415610c9657600094505b610cbd565b6000851115610cb7578480610caf906140b6565b955050610cbc565b600894505b5b5b610e3a565b6002841480610cd25750600384145b15610d49576000861115610cf3578580610ceb906140b6565b965050610d44565b600895506002841415610d21578480610d0b90614143565b9550506009851415610d1c57600094505b610d43565b6000851115610d3d578480610d35906140b6565b955050610d42565b600894505b5b5b610e39565b6004841480610d585750600584145b15610dca578480610d6890614143565b9550506009851415610dc557600094506004841415610da2578580610d8c90614143565b9650506009861415610d9d57600095505b610dc4565b6000861115610dbe578580610db6906140b6565b965050610dc3565b600895505b5b5b610e38565b6000851115610de6578480610dde906140b6565b955050610e37565b600894506006841415610e14578580610dfe90614143565b9650506009861415610e0f57600095505b610e36565b6000861115610e30578580610e28906140b6565b965050610e35565b600895505b5b5b5b5b5b610c0e565b5b60018387600a8110610e5557610e54614279565b5b602002015186600a8110610e6c57610e6b614279565b5b602002019015159081151581525050600183600188610e8b9190613eeb565b600a8110610e9c57610e9b614279565b5b602002015186600a8110610eb357610eb2614279565b5b602002019015159081151581525050600183600188610ed29190613eeb565b600a8110610ee357610ee2614279565b5b6020020151600187610ef59190613eeb565b600a8110610f0657610f05614279565b5b60200201901515908115158152505060018387600a8110610f2a57610f29614279565b5b6020020151600187610f3c9190613eeb565b600a8110610f4d57610f4c614279565b5b602002019015159081151581525050600086111561100057600183600188610f759190613fcc565b600a8110610f8657610f85614279565b5b602002015186600a8110610f9d57610f9c614279565b5b602002019015159081151581525050600183600188610fbc9190613fcc565b600a8110610fcd57610fcc614279565b5b6020020151600187610fdf9190613eeb565b600a8110610ff057610fef614279565b5b6020020190151590811515815250505b60008511156110a45760018387600a811061101e5761101d614279565b5b60200201516001876110309190613fcc565b600a811061104157611040614279565b5b6020020190151590811515815250506001836001886110609190613eeb565b600a811061107157611070614279565b5b60200201516001876110839190613fcc565b600a811061109457611093614279565b5b6020020190151590811515815250505b6000861180156110b45750600085115b1561110d576001836001886110c99190613fcc565b600a81106110da576110d9614279565b5b60200201516001876110ec9190613fcc565b600a81106110fd576110fc614279565b5b6020020190151590811515815250505b85876000015182600a811061112557611124614279565b5b60200201818152505084876020015182600a811061114657611145614279565b5b602002018181525050808061115a90614143565b915050610ab7565b50859650505050505050919050565b61118c83838360405180602001604052806000815250611839565b505050565b6002600a5414156111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90613dce565b60405180910390fd5b6002600a819055506111e7611d79565b73ffffffffffffffffffffffffffffffffffffffff166112056115f6565b73ffffffffffffffffffffffffffffffffffffffff161461125b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125290613d0e565b60405180910390fd5b6126ab8111801561126d575061271081105b6112ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a390613dae565b60405180910390fd5b6112bd6112b76115f6565b826122e9565b6001600a8190555050565b6002600a54141561130e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130590613dce565b60405180910390fd5b6002600a819055506126ac600c541061135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390613dae565b60405180910390fd5b61136f611367611d79565b600c546122e9565b6001600c60008282546113829190613eeb565b925050819055506001600a81905550565b600061139d610719565b82106113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590613d8e565b60405180910390fd5b600882815481106113f2576113f1614279565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a490613cae565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151e90613c8e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611576611d79565b73ffffffffffffffffffffffffffffffffffffffff166115946115f6565b73ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190613d0e565b60405180910390fd5b6115f46000612307565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461162f906140e0565b80601f016020809104026020016040519081016040528092919081815260200182805461165b906140e0565b80156116a85780601f1061167d576101008083540402835291602001916116a8565b820191906000526020600020905b81548152906001019060200180831161168b57829003601f168201915b5050505050905090565b600c5481565b6116c0611d79565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590613c0e565b60405180910390fd5b806005600061173b611d79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117e8611d79565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161182d9190613b31565b60405180910390a35050565b61184a611844611d79565b83611e3a565b611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090613d6e565b60405180910390fd5b611895848484846123cd565b50505050565b60606118a682611d0d565b6118e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dc90613c6e565b60405180910390fd5b60006118f08361082b565b905060608060005b600a811015611a175782611926856000015183600a811061191c5761191b614279565b5b6020020151612174565b61194a866020015184600a81106119405761193f614279565b5b6020020151612174565b60405160200161195c93929190613908565b604051602081830303815290604052925081611992856000015183600a811061198857611987614279565b5b6020020151612174565b6119b6866020015184600a81106119ac576119ab614279565b5b6020020151612174565b6040516020016119c89392919061395a565b604051602081830303815290604052915060098114611a0457816040516020016119f291906139b7565b60405160208183030381529060405291505b8080611a0f90614143565b9150506118f8565b5081604051602001611a299190613a92565b6040516020818303038152906040529150611a76611a4686612174565b611a4f84612429565b83604051602001611a62939291906139d9565b604051602081830303815290604052612429565b604051602001611a869190613a70565b6040516020818303038152906040529350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b3b611d79565b73ffffffffffffffffffffffffffffffffffffffff16611b596115f6565b73ffffffffffffffffffffffffffffffffffffffff1614611baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba690613d0e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1690613bae565b60405180910390fd5b611c2881612307565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cf657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d065750611d05826125ae565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611df483611404565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e4582611d0d565b611e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7b90613c2e565b60405180910390fd5b6000611e8f83611404565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611efe57508373ffffffffffffffffffffffffffffffffffffffff16611ee68461057c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f0f5750611f0e8185611a9f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f3882611404565b73ffffffffffffffffffffffffffffffffffffffff1614611f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8590613d2e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff590613bee565b60405180910390fd5b612009838383612618565b612014600082611d81565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120649190613fcc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120bb9190613eeb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008214156121bc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506122d0565b600082905060005b600082146121ee5780806121d790614143565b915050600a826121e79190613f41565b91506121c4565b60008167ffffffffffffffff81111561220a576122096142a8565b5b6040519080825280601f01601f19166020018201604052801561223c5781602001600182028036833780820191505090505b5090505b600085146122c9576001826122559190613fcc565b9150600a85612264919061418c565b60306122709190613eeb565b60f81b81838151811061228657612285614279565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122c29190613f41565b9450612240565b8093505050505b919050565b6000818051906020012060001c9050919050565b61230382826040518060200160405280600081525061272c565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123d8848484611f18565b6123e484848484612787565b612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a90613b8e565b60405180910390fd5b50505050565b606060008251141561244c576040518060200160405280600081525090506125a9565b6000604051806060016040528060408152602001614cb6604091399050600060036002855161247b9190613eeb565b6124859190613f41565b60046124919190613f72565b905060006020826124a29190613eeb565b67ffffffffffffffff8111156124bb576124ba6142a8565b5b6040519080825280601f01601f1916602001820160405280156124ed5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612568576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612501565b60038951066001811461258257600281146125925761259d565b613d3d60f01b600283035261259d565b603d60f81b60018303525b50505050508093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61262383838361291e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126665761266181612923565b6126a5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126a4576126a3838261296c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e8576126e381612ad9565b612727565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612726576127258282612baa565b5b5b505050565b6127368383612c29565b6127436000848484612787565b612782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277990613b8e565b60405180910390fd5b505050565b60006127a88473ffffffffffffffffffffffffffffffffffffffff16612df7565b15612911578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127d1611d79565b8786866040518563ffffffff1660e01b81526004016127f39493929190613ae5565b602060405180830381600087803b15801561280d57600080fd5b505af192505050801561283e57506040513d601f19601f8201168201806040525081019061283b919061316d565b60015b6128c1573d806000811461286e576040519150601f19603f3d011682016040523d82523d6000602084013e612873565b606091505b506000815114156128b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b090613b8e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612916565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612979846114b6565b6129839190613fcc565b9050600060076000848152602001908152602001600020549050818114612a68576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612aed9190613fcc565b9050600060096000848152602001908152602001600020549050600060088381548110612b1d57612b1c614279565b5b906000526020600020015490508060088381548110612b3f57612b3e614279565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612b8e57612b8d61424a565b5b6001900381819060005260206000200160009055905550505050565b6000612bb5836114b6565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9090613cce565b60405180910390fd5b612ca281611d0d565b15612ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd990613bce565b60405180910390fd5b612cee60008383612618565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d3e9190613eeb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518060400160405280612e1d612e5e565b8152602001612e2a612e5e565b81525090565b604051806101400160405280600a905b612e48612e81565b815260200190600190039081612e405790505090565b604051806101400160405280600a90602082028036833780820191505090505090565b604051806101400160405280600a90602082028036833780820191505090505090565b6000612eb7612eb284613e4a565b613e25565b905082815260208101848484011115612ed357612ed26142dc565b5b612ede848285614074565b509392505050565b600081359050612ef581614c59565b92915050565b600081359050612f0a81614c70565b92915050565b600081359050612f1f81614c87565b92915050565b600081519050612f3481614c87565b92915050565b600082601f830112612f4f57612f4e6142d7565b5b8135612f5f848260208601612ea4565b91505092915050565b600081359050612f7781614c9e565b92915050565b600060208284031215612f9357612f926142e6565b5b6000612fa184828501612ee6565b91505092915050565b60008060408385031215612fc157612fc06142e6565b5b6000612fcf85828601612ee6565b9250506020612fe085828601612ee6565b9150509250929050565b600080600060608486031215613003576130026142e6565b5b600061301186828701612ee6565b935050602061302286828701612ee6565b925050604061303386828701612f68565b9150509250925092565b60008060008060808587031215613057576130566142e6565b5b600061306587828801612ee6565b945050602061307687828801612ee6565b935050604061308787828801612f68565b925050606085013567ffffffffffffffff8111156130a8576130a76142e1565b5b6130b487828801612f3a565b91505092959194509250565b600080604083850312156130d7576130d66142e6565b5b60006130e585828601612ee6565b92505060206130f685828601612efb565b9150509250929050565b60008060408385031215613117576131166142e6565b5b600061312585828601612ee6565b925050602061313685828601612f68565b9150509250929050565b600060208284031215613156576131556142e6565b5b600061316484828501612f10565b91505092915050565b600060208284031215613183576131826142e6565b5b600061319184828501612f25565b91505092915050565b6000602082840312156131b0576131af6142e6565b5b60006131be84828501612f68565b91505092915050565b60006131d3838361387d565b60208301905092915050565b6131e881614000565b82525050565b6131f781613e85565b6132018184613eb3565b925061320c82613e7b565b8060005b8381101561323d57815161322487826131c7565b965061322f83613ea6565b925050600181019050613210565b505050505050565b61324e81614012565b82525050565b600061325f82613e90565b6132698185613ebe565b9350613279818560208601614083565b613282816142eb565b840191505092915050565b600061329882613e9b565b6132a28185613ecf565b93506132b2818560208601614083565b6132bb816142eb565b840191505092915050565b60006132d182613e9b565b6132db8185613ee0565b93506132eb818560208601614083565b80840191505092915050565b6000613304601283613ee0565b915061330f826142fc565b601282019050919050565b6000613327602b83613ecf565b915061333282614325565b604082019050919050565b600061334a603283613ecf565b915061335582614374565b604082019050919050565b600061336d601383613ee0565b9150613378826143c3565b601382019050919050565b6000613390602683613ecf565b915061339b826143ec565b604082019050919050565b60006133b3601c83613ecf565b91506133be8261443b565b602082019050919050565b60006133d6602483613ecf565b91506133e182614464565b604082019050919050565b60006133f9601983613ecf565b9150613404826144b3565b602082019050919050565b600061341c602283613ee0565b9150613427826144dc565b602282019050919050565b600061343f601483613ee0565b915061344a8261452b565b601482019050919050565b6000613462602c83613ecf565b915061346d82614554565b604082019050919050565b6000613485603883613ecf565b9150613490826145a3565b604082019050919050565b60006134a8601183613ecf565b91506134b3826145f2565b602082019050919050565b60006134cb601983613ee0565b91506134d68261461b565b601982019050919050565b60006134ee600c83613ee0565b91506134f982614644565b600c82019050919050565b6000613511602a83613ecf565b915061351c8261466d565b604082019050919050565b6000613534602983613ecf565b915061353f826146bc565b604082019050919050565b6000613557600183613ee0565b91506135628261470b565b600182019050919050565b600061357a600283613ee0565b915061358582614734565b600282019050919050565b600061359d600183613ee0565b91506135a88261475d565b600182019050919050565b60006135c0602083613ecf565b91506135cb82614786565b602082019050919050565b60006135e3602c83613ecf565b91506135ee826147af565b604082019050919050565b6000613606602083613ecf565b9150613611826147fe565b602082019050919050565b6000613629602983613ecf565b915061363482614827565b604082019050919050565b600061364c603983613ee0565b915061365782614876565b603982019050919050565b600061366f600283613ee0565b915061367a826148c5565b600282019050919050565b6000613692600383613ee0565b915061369d826148ee565b600382019050919050565b60006136b5602183613ecf565b91506136c082614917565b604082019050919050565b60006136d8606083613ee0565b91506136e382614966565b606082019050919050565b60006136fb600283613ee0565b9150613706826149db565b600282019050919050565b600061371e601d83613ee0565b915061372982614a04565b601d82019050919050565b6000613741600583613ee0565b915061374c82614a2d565b600582019050919050565b6000613764603183613ecf565b915061376f82614a56565b604082019050919050565b6000613787602c83613ecf565b915061379282614aa5565b604082019050919050565b60006137aa600183613ee0565b91506137b582614af4565b600182019050919050565b60006137cd606e83613ee0565b91506137d882614b1d565b606e82019050919050565b60006137f0600d83613ecf565b91506137fb82614bb8565b602082019050919050565b6000613813601f83613ecf565b915061381e82614be1565b602082019050919050565b6000613836602683613ee0565b915061384182614c0a565b602682019050919050565b6102808201600082015161386360008501826131ee565b5060208201516138776101408501826131ee565b50505050565b6138868161406a565b82525050565b6138958161406a565b82525050565b60006138a782876132c6565b91506138b382866132c6565b91506138bf82856132c6565b91506138cb82846132c6565b915081905095945050505050565b60006138e582856132c6565b91506138f182846132c6565b91506138fc82613590565b91508190509392505050565b600061391482866132c6565b915061391f82613360565b915061392b82856132c6565b915061393682613734565b915061394282846132c6565b915061394d82613685565b9150819050949350505050565b600061396682866132c6565b915061397182613432565b915061397c826134e1565b915061398882856132c6565b91506139938261379d565b915061399f82846132c6565b91506139aa8261356d565b9150819050949350505050565b60006139c382846132c6565b91506139ce826136ee565b915081905092915050565b60006139e4826134be565b91506139f082866132c6565b91506139fb8261340f565b9150613a0682613829565b9150613a1282856132c6565b9150613a1d826132f7565b9150613a2982846132c6565b9150613a3482613662565b9150819050949350505050565b6000613a4c8261354a565b9150613a5882856132c6565b9150613a6482846132c6565b91508190509392505050565b6000613a7b82613711565b9150613a8782846132c6565b915081905092915050565b6000613a9d826137c0565b9150613aa88261363f565b9150613ab482846132c6565b9150613abf826136cb565b915081905092915050565b6000602082019050613adf60008301846131df565b92915050565b6000608082019050613afa60008301876131df565b613b0760208301866131df565b613b14604083018561388c565b8181036060830152613b268184613254565b905095945050505050565b6000602082019050613b466000830184613245565b92915050565b60006020820190508181036000830152613b66818461328d565b905092915050565b60006020820190508181036000830152613b878161331a565b9050919050565b60006020820190508181036000830152613ba78161333d565b9050919050565b60006020820190508181036000830152613bc781613383565b9050919050565b60006020820190508181036000830152613be7816133a6565b9050919050565b60006020820190508181036000830152613c07816133c9565b9050919050565b60006020820190508181036000830152613c27816133ec565b9050919050565b60006020820190508181036000830152613c4781613455565b9050919050565b60006020820190508181036000830152613c6781613478565b9050919050565b60006020820190508181036000830152613c878161349b565b9050919050565b60006020820190508181036000830152613ca781613504565b9050919050565b60006020820190508181036000830152613cc781613527565b9050919050565b60006020820190508181036000830152613ce7816135b3565b9050919050565b60006020820190508181036000830152613d07816135d6565b9050919050565b60006020820190508181036000830152613d27816135f9565b9050919050565b60006020820190508181036000830152613d478161361c565b9050919050565b60006020820190508181036000830152613d67816136a8565b9050919050565b60006020820190508181036000830152613d8781613757565b9050919050565b60006020820190508181036000830152613da78161377a565b9050919050565b60006020820190508181036000830152613dc7816137e3565b9050919050565b60006020820190508181036000830152613de781613806565b9050919050565b600061028082019050613e04600083018461384c565b92915050565b6000602082019050613e1f600083018461388c565b92915050565b6000613e2f613e40565b9050613e3b8282614112565b919050565b6000604051905090565b600067ffffffffffffffff821115613e6557613e646142a8565b5b613e6e826142eb565b9050602081019050919050565b6000819050919050565b6000600a9050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ef68261406a565b9150613f018361406a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f3657613f356141bd565b5b828201905092915050565b6000613f4c8261406a565b9150613f578361406a565b925082613f6757613f666141ec565b5b828204905092915050565b6000613f7d8261406a565b9150613f888361406a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fc157613fc06141bd565b5b828202905092915050565b6000613fd78261406a565b9150613fe28361406a565b925082821015613ff557613ff46141bd565b5b828203905092915050565b600061400b8261404a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140a1578082015181840152602081019050614086565b838111156140b0576000848401525b50505050565b60006140c18261406a565b915060008214156140d5576140d46141bd565b5b600182039050919050565b600060028204905060018216806140f857607f821691505b6020821081141561410c5761410b61421b565b5b50919050565b61411b826142eb565b810181811067ffffffffffffffff8211171561413a576141396142a8565b5b80604052505050565b600061414e8261406a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614181576141806141bd565b5b600182019050919050565b60006141978261406a565b91506141a28361406a565b9250826141b2576141b16141ec565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f222c202261747472696275746573223a205b0000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f3c7265637420636c6173733d22742220783d2200000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f222c20226465736372697074696f6e223a202254656e204e65696768626f727360008201527f2e22000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a2022582d5922000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f7b226e616d65223a202254656e204e65696768626f7273202300000000000000600082015250565b7f2c202276616c7565223a20220000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f7800000000000000000000000000000000000000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f7900000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f3c7265637420783d22302220793d2230222077696474683d223130222068656960008201527f6768743d223130222066696c6c3d2223463346334633222f3e00000000000000602082015250565b7f5d7d000000000000000000000000000000000000000000000000000000000000600082015250565b7f222f3e0000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f3c7374796c653e2e747b77696474683a3270783b6865696768743a3270783b6660008201527f696c6c3a234539363836387d202374656e2d7376677b73686170652d72656e6460208201527f6572696e673a637269737065646765733b7d3c2f7374796c653e3c2f7376673e604082015250565b7f2c20000000000000000000000000000000000000000000000000000000000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f2220793d22000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f2d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f3c7376672069643d2274656e2d7376672220786d6c6e733d22687474703a2f2f60008201527f7777772e77332e6f72672f323030302f7376672220707265736572766541737060208201527f656374526174696f3d22784d696e594d696e206d656574222076696577426f7860408201527f3d22302030203130203130223e20000000000000000000000000000000000000606082015250565b7f696e76616c696420636c61696d00000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b6260008201527f61736536342c0000000000000000000000000000000000000000000000000000602082015250565b614c6281614000565b8114614c6d57600080fd5b50565b614c7981614012565b8114614c8457600080fd5b50565b614c908161401e565b8114614c9b57600080fd5b50565b614ca78161406a565b8114614cb257600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220b87b949381ba863842f14c07b1a81e79380b18c29e5ed7d9b79dc8ae6729af7d64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80634f6ccce7116100c35780639c2f2a421161007c5780639c2f2a421461039e578063a22cb465146103bc578063b88d4fde146103d8578063c87b56dd146103f4578063e985e9c514610424578063f2fde38b146104545761014d565b80634f6ccce7146102c85780636352211e146102f857806370a0823114610328578063715018a6146103585780638da5cb5b1461036257806395d89b41146103805761014d565b806323b872dd1161011557806323b872dd1461020a5780632f745c59146102265780633ff106561461025657806342842e0e14610286578063434f48c4146102a25780634e71d92d146102be5761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d057806318160ddd146101ec575b600080fd5b61016c60048036038101906101679190613140565b610470565b6040516101799190613b31565b60405180910390f35b61018a6104ea565b6040516101979190613b4c565b60405180910390f35b6101ba60048036038101906101b5919061319a565b61057c565b6040516101c79190613aca565b60405180910390f35b6101ea60048036038101906101e59190613100565b610601565b005b6101f4610719565b6040516102019190613e0a565b60405180910390f35b610224600480360381019061021f9190612fea565b610726565b005b610240600480360381019061023b9190613100565b610786565b60405161024d9190613e0a565b60405180910390f35b610270600480360381019061026b919061319a565b61082b565b60405161027d9190613dee565b60405180910390f35b6102a0600480360381019061029b9190612fea565b611171565b005b6102bc60048036038101906102b7919061319a565b611191565b005b6102c66112c8565b005b6102e260048036038101906102dd919061319a565b611393565b6040516102ef9190613e0a565b60405180910390f35b610312600480360381019061030d919061319a565b611404565b60405161031f9190613aca565b60405180910390f35b610342600480360381019061033d9190612f7d565b6114b6565b60405161034f9190613e0a565b60405180910390f35b61036061156e565b005b61036a6115f6565b6040516103779190613aca565b60405180910390f35b610388611620565b6040516103959190613b4c565b60405180910390f35b6103a66116b2565b6040516103b39190613e0a565b60405180910390f35b6103d660048036038101906103d191906130c0565b6116b8565b005b6103f260048036038101906103ed919061303d565b611839565b005b61040e6004803603810190610409919061319a565b61189b565b60405161041b9190613b4c565b60405180910390f35b61043e60048036038101906104399190612faa565b611a9f565b60405161044b9190613b31565b60405180910390f35b61046e60048036038101906104699190612f7d565b611b33565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104e357506104e282611c2b565b5b9050919050565b6060600080546104f9906140e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610525906140e0565b80156105725780601f1061054757610100808354040283529160200191610572565b820191906000526020600020905b81548152906001019060200180831161055557829003601f168201915b5050505050905090565b600061058782611d0d565b6105c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bd90613cee565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061060c82611404565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067490613d4e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661069c611d79565b73ffffffffffffffffffffffffffffffffffffffff1614806106cb57506106ca816106c5611d79565b611a9f565b5b61070a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070190613c4e565b60405180910390fd5b6107148383611d81565b505050565b6000600880549050905090565b610737610731611d79565b82611e3a565b610776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076d90613d6e565b60405180910390fd5b610781838383611f18565b505050565b6000610791836114b6565b82106107d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c990613b6e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610833612e0a565b8161d2f06108419190613fcc565b915061084b612e0a565b6000806000610858612e30565b60006040518061014001604052806040518060400160405280600581526020017f666972737400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f7365636f6e64000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f746869726400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f666f75727468000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f666966746800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f736978746800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f736576656e74680000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f656967687468000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6e696e746800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f74656e7468000000000000000000000000000000000000000000000000000000815250815250905060005b600a811015611162576009610b0b8383600a8110610ad857610ad7614279565b5b6020020151610ae68c612174565b604051602001610af7929190613a41565b6040516020818303038152906040526122d5565b610b15919061418c565b95506009610b62610b258b612174565b8484600a8110610b3857610b37614279565b5b6020020151604051602001610b4e9291906138d9565b6040516020818303038152906040526122d5565b610b6c919061418c565b94508286600a8110610b8157610b80614279565b5b602002015185600a8110610b9857610b97614279565b5b602002015115610e40576008610c018383600a8110610bba57610bb9614279565b5b6020020151610bc88c612174565b610bd18a612174565b610bda8a612174565b604051602001610bed949392919061389b565b6040516020818303038152906040526122d5565b610c0b919061418c565b93505b8286600a8110610c2157610c20614279565b5b602002015185600a8110610c3857610c37614279565b5b602002015115610e3f576000841480610c515750600184145b15610cc3578580610c6190614143565b9650506009861415610cbe57600095506000841415610c9b578480610c8590614143565b9550506009851415610c9657600094505b610cbd565b6000851115610cb7578480610caf906140b6565b955050610cbc565b600894505b5b5b610e3a565b6002841480610cd25750600384145b15610d49576000861115610cf3578580610ceb906140b6565b965050610d44565b600895506002841415610d21578480610d0b90614143565b9550506009851415610d1c57600094505b610d43565b6000851115610d3d578480610d35906140b6565b955050610d42565b600894505b5b5b610e39565b6004841480610d585750600584145b15610dca578480610d6890614143565b9550506009851415610dc557600094506004841415610da2578580610d8c90614143565b9650506009861415610d9d57600095505b610dc4565b6000861115610dbe578580610db6906140b6565b965050610dc3565b600895505b5b5b610e38565b6000851115610de6578480610dde906140b6565b955050610e37565b600894506006841415610e14578580610dfe90614143565b9650506009861415610e0f57600095505b610e36565b6000861115610e30578580610e28906140b6565b965050610e35565b600895505b5b5b5b5b5b610c0e565b5b60018387600a8110610e5557610e54614279565b5b602002015186600a8110610e6c57610e6b614279565b5b602002019015159081151581525050600183600188610e8b9190613eeb565b600a8110610e9c57610e9b614279565b5b602002015186600a8110610eb357610eb2614279565b5b602002019015159081151581525050600183600188610ed29190613eeb565b600a8110610ee357610ee2614279565b5b6020020151600187610ef59190613eeb565b600a8110610f0657610f05614279565b5b60200201901515908115158152505060018387600a8110610f2a57610f29614279565b5b6020020151600187610f3c9190613eeb565b600a8110610f4d57610f4c614279565b5b602002019015159081151581525050600086111561100057600183600188610f759190613fcc565b600a8110610f8657610f85614279565b5b602002015186600a8110610f9d57610f9c614279565b5b602002019015159081151581525050600183600188610fbc9190613fcc565b600a8110610fcd57610fcc614279565b5b6020020151600187610fdf9190613eeb565b600a8110610ff057610fef614279565b5b6020020190151590811515815250505b60008511156110a45760018387600a811061101e5761101d614279565b5b60200201516001876110309190613fcc565b600a811061104157611040614279565b5b6020020190151590811515815250506001836001886110609190613eeb565b600a811061107157611070614279565b5b60200201516001876110839190613fcc565b600a811061109457611093614279565b5b6020020190151590811515815250505b6000861180156110b45750600085115b1561110d576001836001886110c99190613fcc565b600a81106110da576110d9614279565b5b60200201516001876110ec9190613fcc565b600a81106110fd576110fc614279565b5b6020020190151590811515815250505b85876000015182600a811061112557611124614279565b5b60200201818152505084876020015182600a811061114657611145614279565b5b602002018181525050808061115a90614143565b915050610ab7565b50859650505050505050919050565b61118c83838360405180602001604052806000815250611839565b505050565b6002600a5414156111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90613dce565b60405180910390fd5b6002600a819055506111e7611d79565b73ffffffffffffffffffffffffffffffffffffffff166112056115f6565b73ffffffffffffffffffffffffffffffffffffffff161461125b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125290613d0e565b60405180910390fd5b6126ab8111801561126d575061271081105b6112ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a390613dae565b60405180910390fd5b6112bd6112b76115f6565b826122e9565b6001600a8190555050565b6002600a54141561130e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130590613dce565b60405180910390fd5b6002600a819055506126ac600c541061135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390613dae565b60405180910390fd5b61136f611367611d79565b600c546122e9565b6001600c60008282546113829190613eeb565b925050819055506001600a81905550565b600061139d610719565b82106113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590613d8e565b60405180910390fd5b600882815481106113f2576113f1614279565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a490613cae565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151e90613c8e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611576611d79565b73ffffffffffffffffffffffffffffffffffffffff166115946115f6565b73ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190613d0e565b60405180910390fd5b6115f46000612307565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461162f906140e0565b80601f016020809104026020016040519081016040528092919081815260200182805461165b906140e0565b80156116a85780601f1061167d576101008083540402835291602001916116a8565b820191906000526020600020905b81548152906001019060200180831161168b57829003601f168201915b5050505050905090565b600c5481565b6116c0611d79565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590613c0e565b60405180910390fd5b806005600061173b611d79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117e8611d79565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161182d9190613b31565b60405180910390a35050565b61184a611844611d79565b83611e3a565b611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090613d6e565b60405180910390fd5b611895848484846123cd565b50505050565b60606118a682611d0d565b6118e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dc90613c6e565b60405180910390fd5b60006118f08361082b565b905060608060005b600a811015611a175782611926856000015183600a811061191c5761191b614279565b5b6020020151612174565b61194a866020015184600a81106119405761193f614279565b5b6020020151612174565b60405160200161195c93929190613908565b604051602081830303815290604052925081611992856000015183600a811061198857611987614279565b5b6020020151612174565b6119b6866020015184600a81106119ac576119ab614279565b5b6020020151612174565b6040516020016119c89392919061395a565b604051602081830303815290604052915060098114611a0457816040516020016119f291906139b7565b60405160208183030381529060405291505b8080611a0f90614143565b9150506118f8565b5081604051602001611a299190613a92565b6040516020818303038152906040529150611a76611a4686612174565b611a4f84612429565b83604051602001611a62939291906139d9565b604051602081830303815290604052612429565b604051602001611a869190613a70565b6040516020818303038152906040529350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b3b611d79565b73ffffffffffffffffffffffffffffffffffffffff16611b596115f6565b73ffffffffffffffffffffffffffffffffffffffff1614611baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba690613d0e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1690613bae565b60405180910390fd5b611c2881612307565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cf657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d065750611d05826125ae565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611df483611404565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e4582611d0d565b611e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7b90613c2e565b60405180910390fd5b6000611e8f83611404565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611efe57508373ffffffffffffffffffffffffffffffffffffffff16611ee68461057c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f0f5750611f0e8185611a9f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f3882611404565b73ffffffffffffffffffffffffffffffffffffffff1614611f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8590613d2e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff590613bee565b60405180910390fd5b612009838383612618565b612014600082611d81565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120649190613fcc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120bb9190613eeb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008214156121bc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506122d0565b600082905060005b600082146121ee5780806121d790614143565b915050600a826121e79190613f41565b91506121c4565b60008167ffffffffffffffff81111561220a576122096142a8565b5b6040519080825280601f01601f19166020018201604052801561223c5781602001600182028036833780820191505090505b5090505b600085146122c9576001826122559190613fcc565b9150600a85612264919061418c565b60306122709190613eeb565b60f81b81838151811061228657612285614279565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122c29190613f41565b9450612240565b8093505050505b919050565b6000818051906020012060001c9050919050565b61230382826040518060200160405280600081525061272c565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123d8848484611f18565b6123e484848484612787565b612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a90613b8e565b60405180910390fd5b50505050565b606060008251141561244c576040518060200160405280600081525090506125a9565b6000604051806060016040528060408152602001614cb6604091399050600060036002855161247b9190613eeb565b6124859190613f41565b60046124919190613f72565b905060006020826124a29190613eeb565b67ffffffffffffffff8111156124bb576124ba6142a8565b5b6040519080825280601f01601f1916602001820160405280156124ed5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612568576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612501565b60038951066001811461258257600281146125925761259d565b613d3d60f01b600283035261259d565b603d60f81b60018303525b50505050508093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61262383838361291e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126665761266181612923565b6126a5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126a4576126a3838261296c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e8576126e381612ad9565b612727565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612726576127258282612baa565b5b5b505050565b6127368383612c29565b6127436000848484612787565b612782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277990613b8e565b60405180910390fd5b505050565b60006127a88473ffffffffffffffffffffffffffffffffffffffff16612df7565b15612911578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127d1611d79565b8786866040518563ffffffff1660e01b81526004016127f39493929190613ae5565b602060405180830381600087803b15801561280d57600080fd5b505af192505050801561283e57506040513d601f19601f8201168201806040525081019061283b919061316d565b60015b6128c1573d806000811461286e576040519150601f19603f3d011682016040523d82523d6000602084013e612873565b606091505b506000815114156128b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b090613b8e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612916565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612979846114b6565b6129839190613fcc565b9050600060076000848152602001908152602001600020549050818114612a68576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612aed9190613fcc565b9050600060096000848152602001908152602001600020549050600060088381548110612b1d57612b1c614279565b5b906000526020600020015490508060088381548110612b3f57612b3e614279565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612b8e57612b8d61424a565b5b6001900381819060005260206000200160009055905550505050565b6000612bb5836114b6565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9090613cce565b60405180910390fd5b612ca281611d0d565b15612ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd990613bce565b60405180910390fd5b612cee60008383612618565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d3e9190613eeb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518060400160405280612e1d612e5e565b8152602001612e2a612e5e565b81525090565b604051806101400160405280600a905b612e48612e81565b815260200190600190039081612e405790505090565b604051806101400160405280600a90602082028036833780820191505090505090565b604051806101400160405280600a90602082028036833780820191505090505090565b6000612eb7612eb284613e4a565b613e25565b905082815260208101848484011115612ed357612ed26142dc565b5b612ede848285614074565b509392505050565b600081359050612ef581614c59565b92915050565b600081359050612f0a81614c70565b92915050565b600081359050612f1f81614c87565b92915050565b600081519050612f3481614c87565b92915050565b600082601f830112612f4f57612f4e6142d7565b5b8135612f5f848260208601612ea4565b91505092915050565b600081359050612f7781614c9e565b92915050565b600060208284031215612f9357612f926142e6565b5b6000612fa184828501612ee6565b91505092915050565b60008060408385031215612fc157612fc06142e6565b5b6000612fcf85828601612ee6565b9250506020612fe085828601612ee6565b9150509250929050565b600080600060608486031215613003576130026142e6565b5b600061301186828701612ee6565b935050602061302286828701612ee6565b925050604061303386828701612f68565b9150509250925092565b60008060008060808587031215613057576130566142e6565b5b600061306587828801612ee6565b945050602061307687828801612ee6565b935050604061308787828801612f68565b925050606085013567ffffffffffffffff8111156130a8576130a76142e1565b5b6130b487828801612f3a565b91505092959194509250565b600080604083850312156130d7576130d66142e6565b5b60006130e585828601612ee6565b92505060206130f685828601612efb565b9150509250929050565b60008060408385031215613117576131166142e6565b5b600061312585828601612ee6565b925050602061313685828601612f68565b9150509250929050565b600060208284031215613156576131556142e6565b5b600061316484828501612f10565b91505092915050565b600060208284031215613183576131826142e6565b5b600061319184828501612f25565b91505092915050565b6000602082840312156131b0576131af6142e6565b5b60006131be84828501612f68565b91505092915050565b60006131d3838361387d565b60208301905092915050565b6131e881614000565b82525050565b6131f781613e85565b6132018184613eb3565b925061320c82613e7b565b8060005b8381101561323d57815161322487826131c7565b965061322f83613ea6565b925050600181019050613210565b505050505050565b61324e81614012565b82525050565b600061325f82613e90565b6132698185613ebe565b9350613279818560208601614083565b613282816142eb565b840191505092915050565b600061329882613e9b565b6132a28185613ecf565b93506132b2818560208601614083565b6132bb816142eb565b840191505092915050565b60006132d182613e9b565b6132db8185613ee0565b93506132eb818560208601614083565b80840191505092915050565b6000613304601283613ee0565b915061330f826142fc565b601282019050919050565b6000613327602b83613ecf565b915061333282614325565b604082019050919050565b600061334a603283613ecf565b915061335582614374565b604082019050919050565b600061336d601383613ee0565b9150613378826143c3565b601382019050919050565b6000613390602683613ecf565b915061339b826143ec565b604082019050919050565b60006133b3601c83613ecf565b91506133be8261443b565b602082019050919050565b60006133d6602483613ecf565b91506133e182614464565b604082019050919050565b60006133f9601983613ecf565b9150613404826144b3565b602082019050919050565b600061341c602283613ee0565b9150613427826144dc565b602282019050919050565b600061343f601483613ee0565b915061344a8261452b565b601482019050919050565b6000613462602c83613ecf565b915061346d82614554565b604082019050919050565b6000613485603883613ecf565b9150613490826145a3565b604082019050919050565b60006134a8601183613ecf565b91506134b3826145f2565b602082019050919050565b60006134cb601983613ee0565b91506134d68261461b565b601982019050919050565b60006134ee600c83613ee0565b91506134f982614644565b600c82019050919050565b6000613511602a83613ecf565b915061351c8261466d565b604082019050919050565b6000613534602983613ecf565b915061353f826146bc565b604082019050919050565b6000613557600183613ee0565b91506135628261470b565b600182019050919050565b600061357a600283613ee0565b915061358582614734565b600282019050919050565b600061359d600183613ee0565b91506135a88261475d565b600182019050919050565b60006135c0602083613ecf565b91506135cb82614786565b602082019050919050565b60006135e3602c83613ecf565b91506135ee826147af565b604082019050919050565b6000613606602083613ecf565b9150613611826147fe565b602082019050919050565b6000613629602983613ecf565b915061363482614827565b604082019050919050565b600061364c603983613ee0565b915061365782614876565b603982019050919050565b600061366f600283613ee0565b915061367a826148c5565b600282019050919050565b6000613692600383613ee0565b915061369d826148ee565b600382019050919050565b60006136b5602183613ecf565b91506136c082614917565b604082019050919050565b60006136d8606083613ee0565b91506136e382614966565b606082019050919050565b60006136fb600283613ee0565b9150613706826149db565b600282019050919050565b600061371e601d83613ee0565b915061372982614a04565b601d82019050919050565b6000613741600583613ee0565b915061374c82614a2d565b600582019050919050565b6000613764603183613ecf565b915061376f82614a56565b604082019050919050565b6000613787602c83613ecf565b915061379282614aa5565b604082019050919050565b60006137aa600183613ee0565b91506137b582614af4565b600182019050919050565b60006137cd606e83613ee0565b91506137d882614b1d565b606e82019050919050565b60006137f0600d83613ecf565b91506137fb82614bb8565b602082019050919050565b6000613813601f83613ecf565b915061381e82614be1565b602082019050919050565b6000613836602683613ee0565b915061384182614c0a565b602682019050919050565b6102808201600082015161386360008501826131ee565b5060208201516138776101408501826131ee565b50505050565b6138868161406a565b82525050565b6138958161406a565b82525050565b60006138a782876132c6565b91506138b382866132c6565b91506138bf82856132c6565b91506138cb82846132c6565b915081905095945050505050565b60006138e582856132c6565b91506138f182846132c6565b91506138fc82613590565b91508190509392505050565b600061391482866132c6565b915061391f82613360565b915061392b82856132c6565b915061393682613734565b915061394282846132c6565b915061394d82613685565b9150819050949350505050565b600061396682866132c6565b915061397182613432565b915061397c826134e1565b915061398882856132c6565b91506139938261379d565b915061399f82846132c6565b91506139aa8261356d565b9150819050949350505050565b60006139c382846132c6565b91506139ce826136ee565b915081905092915050565b60006139e4826134be565b91506139f082866132c6565b91506139fb8261340f565b9150613a0682613829565b9150613a1282856132c6565b9150613a1d826132f7565b9150613a2982846132c6565b9150613a3482613662565b9150819050949350505050565b6000613a4c8261354a565b9150613a5882856132c6565b9150613a6482846132c6565b91508190509392505050565b6000613a7b82613711565b9150613a8782846132c6565b915081905092915050565b6000613a9d826137c0565b9150613aa88261363f565b9150613ab482846132c6565b9150613abf826136cb565b915081905092915050565b6000602082019050613adf60008301846131df565b92915050565b6000608082019050613afa60008301876131df565b613b0760208301866131df565b613b14604083018561388c565b8181036060830152613b268184613254565b905095945050505050565b6000602082019050613b466000830184613245565b92915050565b60006020820190508181036000830152613b66818461328d565b905092915050565b60006020820190508181036000830152613b878161331a565b9050919050565b60006020820190508181036000830152613ba78161333d565b9050919050565b60006020820190508181036000830152613bc781613383565b9050919050565b60006020820190508181036000830152613be7816133a6565b9050919050565b60006020820190508181036000830152613c07816133c9565b9050919050565b60006020820190508181036000830152613c27816133ec565b9050919050565b60006020820190508181036000830152613c4781613455565b9050919050565b60006020820190508181036000830152613c6781613478565b9050919050565b60006020820190508181036000830152613c878161349b565b9050919050565b60006020820190508181036000830152613ca781613504565b9050919050565b60006020820190508181036000830152613cc781613527565b9050919050565b60006020820190508181036000830152613ce7816135b3565b9050919050565b60006020820190508181036000830152613d07816135d6565b9050919050565b60006020820190508181036000830152613d27816135f9565b9050919050565b60006020820190508181036000830152613d478161361c565b9050919050565b60006020820190508181036000830152613d67816136a8565b9050919050565b60006020820190508181036000830152613d8781613757565b9050919050565b60006020820190508181036000830152613da78161377a565b9050919050565b60006020820190508181036000830152613dc7816137e3565b9050919050565b60006020820190508181036000830152613de781613806565b9050919050565b600061028082019050613e04600083018461384c565b92915050565b6000602082019050613e1f600083018461388c565b92915050565b6000613e2f613e40565b9050613e3b8282614112565b919050565b6000604051905090565b600067ffffffffffffffff821115613e6557613e646142a8565b5b613e6e826142eb565b9050602081019050919050565b6000819050919050565b6000600a9050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ef68261406a565b9150613f018361406a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f3657613f356141bd565b5b828201905092915050565b6000613f4c8261406a565b9150613f578361406a565b925082613f6757613f666141ec565b5b828204905092915050565b6000613f7d8261406a565b9150613f888361406a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fc157613fc06141bd565b5b828202905092915050565b6000613fd78261406a565b9150613fe28361406a565b925082821015613ff557613ff46141bd565b5b828203905092915050565b600061400b8261404a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140a1578082015181840152602081019050614086565b838111156140b0576000848401525b50505050565b60006140c18261406a565b915060008214156140d5576140d46141bd565b5b600182039050919050565b600060028204905060018216806140f857607f821691505b6020821081141561410c5761410b61421b565b5b50919050565b61411b826142eb565b810181811067ffffffffffffffff8211171561413a576141396142a8565b5b80604052505050565b600061414e8261406a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614181576141806141bd565b5b600182019050919050565b60006141978261406a565b91506141a28361406a565b9250826141b2576141b16141ec565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f222c202261747472696275746573223a205b0000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f3c7265637420636c6173733d22742220783d2200000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f222c20226465736372697074696f6e223a202254656e204e65696768626f727360008201527f2e22000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a2022582d5922000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f7b226e616d65223a202254656e204e65696768626f7273202300000000000000600082015250565b7f2c202276616c7565223a20220000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f7800000000000000000000000000000000000000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f7900000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f3c7265637420783d22302220793d2230222077696474683d223130222068656960008201527f6768743d223130222066696c6c3d2223463346334633222f3e00000000000000602082015250565b7f5d7d000000000000000000000000000000000000000000000000000000000000600082015250565b7f222f3e0000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f3c7374796c653e2e747b77696474683a3270783b6865696768743a3270783b6660008201527f696c6c3a234539363836387d202374656e2d7376677b73686170652d72656e6460208201527f6572696e673a637269737065646765733b7d3c2f7374796c653e3c2f7376673e604082015250565b7f2c20000000000000000000000000000000000000000000000000000000000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f2220793d22000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f2d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f3c7376672069643d2274656e2d7376672220786d6c6e733d22687474703a2f2f60008201527f7777772e77332e6f72672f323030302f7376672220707265736572766541737060208201527f656374526174696f3d22784d696e594d696e206d656574222076696577426f7860408201527f3d22302030203130203130223e20000000000000000000000000000000000000606082015250565b7f696e76616c696420636c61696d00000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b6260008201527f61736536342c0000000000000000000000000000000000000000000000000000602082015250565b614c6281614000565b8114614c6d57600080fd5b50565b614c7981614012565b8114614c8457600080fd5b50565b614c908161401e565b8114614c9b57600080fd5b50565b614ca78161406a565b8114614cb257600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220b87b949381ba863842f14c07b1a81e79380b18c29e5ed7d9b79dc8ae6729af7d64736f6c63430008070033
Deployed Bytecode Sourcemap
48353:7397:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42127:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30019:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31578:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31101:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42767:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32468:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42435:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48763:4187;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32878:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55564:183;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55385:171;;;:::i;:::-;;42957:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29713:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29443:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9718:94;;;:::i;:::-;;9067:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30188:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48462:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31871:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33134:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52958:2419;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32237:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9967:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42127:224;42229:4;42268:35;42253:50;;;:11;:50;;;;:90;;;;42307:36;42331:11;42307:23;:36::i;:::-;42253:90;42246:97;;42127:224;;;:::o;30019:100::-;30073:13;30106:5;30099:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30019:100;:::o;31578:221::-;31654:7;31682:16;31690:7;31682;:16::i;:::-;31674:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31767:15;:24;31783:7;31767:24;;;;;;;;;;;;;;;;;;;;;31760:31;;31578:221;;;:::o;31101:411::-;31182:13;31198:23;31213:7;31198:14;:23::i;:::-;31182:39;;31246:5;31240:11;;:2;:11;;;;31232:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31340:5;31324:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31349:37;31366:5;31373:12;:10;:12::i;:::-;31349:16;:37::i;:::-;31324:62;31302:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31483:21;31492:2;31496:7;31483:8;:21::i;:::-;31171:341;31101:411;;:::o;42767:113::-;42828:7;42855:10;:17;;;;42848:24;;42767:113;:::o;32468:339::-;32663:41;32682:12;:10;:12::i;:::-;32696:7;32663:18;:41::i;:::-;32655:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32771:28;32781:4;32787:2;32791:7;32771:9;:28::i;:::-;32468:339;;;:::o;42435:256::-;42532:7;42568:23;42585:5;42568:16;:23::i;:::-;42560:5;:31;42552:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;42657:12;:19;42670:5;42657:19;;;;;;;;;;;;;;;:26;42677:5;42657:26;;;;;;;;;;;;42650:33;;42435:256;;;;:::o;48763:4187::-;48826:16;;:::i;:::-;48873:7;48865:5;:15;;;;:::i;:::-;48855:25;;48891:26;;:::i;:::-;48930:9;48950;48970:12;48993:24;;:::i;:::-;49028:20;:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49164:9;49159:3755;49183:2;49179:1;:6;49159:3755;;;49270:1;49211:56;49240:2;49243:1;49240:5;;;;;;;:::i;:::-;;;;;;49247:18;:7;:16;:18::i;:::-;49218:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49211:6;:56::i;:::-;:60;;;;:::i;:::-;49207:64;;49349:1;49290:56;49314:18;:7;:16;:18::i;:::-;49334:2;49337:1;49334:5;;;;;;;:::i;:::-;;;;;;49297:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49290:6;:56::i;:::-;:60;;;;:::i;:::-;49286:64;;49369:4;49374:1;49369:7;;;;;;;:::i;:::-;;;;;;49377:1;49369:10;;;;;;;:::i;:::-;;;;;;49365:2976;;;49489:1;49407:79;49431:2;49434:1;49431:5;;;;;;;:::i;:::-;;;;;;49438:18;:7;:16;:18::i;:::-;49458:12;:1;:10;:12::i;:::-;49472;:1;:10;:12::i;:::-;49414:71;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49407:6;:79::i;:::-;:83;;;;:::i;:::-;49400:90;;49509:2817;49516:4;49521:1;49516:7;;;;;;;:::i;:::-;;;;;;49524:1;49516:10;;;;;;;:::i;:::-;;;;;;49509:2817;;;49565:1;49557:4;:9;:22;;;;49578:1;49570:4;:9;49557:22;49553:2752;;;49608:3;;;;;:::i;:::-;;;;49647:1;49642;:6;49638:564;;;49685:1;49681:5;;49729:1;49721:4;:9;49717:458;;;49767:3;;;;;:::i;:::-;;;;49814:1;49809;:6;49805:92;;;49860:1;49856:5;;49805:92;49717:458;;;49977:1;49973;:5;49969:175;;;50019:3;;;;;:::i;:::-;;;;49969:175;;;50107:1;50103:5;;49969:175;49717:458;49638:564;49553:2752;;;50243:1;50235:4;:9;:22;;;;50256:1;50248:4;:9;50235:22;50231:2074;;;50294:1;50290;:5;50286:631;;;50328:3;;;;;:::i;:::-;;;;50286:631;;;50400:1;50396:5;;50444:1;50436:4;:9;50432:458;;;50482:3;;;;;:::i;:::-;;;;50529:1;50524;:6;50520:92;;;50575:1;50571:5;;50520:92;50432:458;;;50692:1;50688;:5;50684:175;;;50734:3;;;;;:::i;:::-;;;;50684:175;;;50822:1;50818:5;;50684:175;50432:458;50286:631;50231:2074;;;50958:1;50950:4;:9;:22;;;;50971:1;50963:4;:9;50950:22;50946:1359;;;51001:3;;;;;:::i;:::-;;;;51040:1;51035;:6;51031:564;;;51078:1;51074:5;;51122:1;51114:4;:9;51110:458;;;51160:3;;;;;:::i;:::-;;;;51207:1;51202;:6;51198:92;;;51253:1;51249:5;;51198:92;51110:458;;;51370:1;51366;:5;51362:175;;;51412:3;;;;;:::i;:::-;;;;51362:175;;;51500:1;51496:5;;51362:175;51110:458;51031:564;50946:1359;;;51659:1;51655;:5;51651:631;;;51693:3;;;;;:::i;:::-;;;;51651:631;;;51765:1;51761:5;;51809:1;51801:4;:9;51797:458;;;51847:3;;;;;:::i;:::-;;;;51894:1;51889;:6;51885:92;;;51940:1;51936:5;;51885:92;51797:458;;;52057:1;52053;:5;52049:175;;;52099:3;;;;;:::i;:::-;;;;52049:175;;;52187:1;52183:5;;52049:175;51797:458;51651:631;50946:1359;50231:2074;49553:2752;49509:2817;;;49365:2976;52368:4;52355;52360:1;52355:7;;;;;;;:::i;:::-;;;;;;52363:1;52355:10;;;;;;;:::i;:::-;;;;;:17;;;;;;;;;;;52404:4;52387;52396:1;52392;:5;;;;:::i;:::-;52387:11;;;;;;;:::i;:::-;;;;;;52399:1;52387:14;;;;;;;:::i;:::-;;;;;:21;;;;;;;;;;;52444:4;52423;52432:1;52428;:5;;;;:::i;:::-;52423:11;;;;;;;:::i;:::-;;;;;;52439:1;52435;:5;;;;:::i;:::-;52423:18;;;;;;;:::i;:::-;;;;;:25;;;;;;;;;;;52480:4;52463;52468:1;52463:7;;;;;;;:::i;:::-;;;;;;52475:1;52471;:5;;;;:::i;:::-;52463:14;;;;;;;:::i;:::-;;;;;:21;;;;;;;;;;;52509:1;52505;:5;52501:111;;;52548:4;52531;52540:1;52536;:5;;;;:::i;:::-;52531:11;;;;;;;:::i;:::-;;;;;;52543:1;52531:14;;;;;;;:::i;:::-;;;;;:21;;;;;;;;;;;52592:4;52571;52580:1;52576;:5;;;;:::i;:::-;52571:11;;;;;;;:::i;:::-;;;;;;52587:1;52583;:5;;;;:::i;:::-;52571:18;;;;;;;:::i;:::-;;;;;:25;;;;;;;;;;;52501:111;52636:1;52632;:5;52628:111;;;52675:4;52658;52663:1;52658:7;;;;;;;:::i;:::-;;;;;;52670:1;52666;:5;;;;:::i;:::-;52658:14;;;;;;;:::i;:::-;;;;;:21;;;;;;;;;;;52719:4;52698;52707:1;52703;:5;;;;:::i;:::-;52698:11;;;;;;;:::i;:::-;;;;;;52714:1;52710;:5;;;;:::i;:::-;52698:18;;;;;;;:::i;:::-;;;;;:25;;;;;;;;;;;52628:111;52763:1;52759;:5;:14;;;;;52772:1;52768;:5;52759:14;52755:80;;;52815:4;52794;52803:1;52799;:5;;;;:::i;:::-;52794:11;;;;;;;:::i;:::-;;;;;;52810:1;52806;:5;;;;:::i;:::-;52794:18;;;;;;;:::i;:::-;;;;;:25;;;;;;;;;;;52755:80;52868:1;52851:9;:11;;;52863:1;52851:14;;;;;;;:::i;:::-;;;;;:18;;;;;52901:1;52884:9;:11;;;52896:1;52884:14;;;;;;;:::i;:::-;;;;;:18;;;;;49187:3;;;;;:::i;:::-;;;;49159:3755;;;;52933:9;52926:16;;;;;;;;48763:4187;;;:::o;32878:185::-;33016:39;33033:4;33039:2;33043:7;33016:39;;;;;;;;;;;;:16;:39::i;:::-;32878:185;;;:::o;55564:183::-;4213:1;4811:7;;:19;;4803:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4213:1;4944:7;:18;;;;9298:12:::1;:10;:12::i;:::-;9287:23;;:7;:5;:7::i;:::-;:23;;;9279:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55660:4:::2;55650:7;:14;:33;;;;;55678:5;55668:7;:15;55650:33;55642:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;55712:27;55722:7;:5;:7::i;:::-;55731;55712:9;:27::i;:::-;4169:1:::0;5123:7;:22;;;;55564:183;:::o;55385:171::-;4213:1;4811:7;;:19;;4803:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4213:1;4944:7;:18;;;;55454:4:::1;55441:10;;:17;55433:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;55487:35;55497:12;:10;:12::i;:::-;55511:10;;55487:9;:35::i;:::-;55547:1;55533:10;;:15;;;;;;;:::i;:::-;;;;;;;;4169:1:::0;5123:7;:22;;;;55385:171::o;42957:233::-;43032:7;43068:30;:28;:30::i;:::-;43060:5;:38;43052:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43165:10;43176:5;43165:17;;;;;;;;:::i;:::-;;;;;;;;;;43158:24;;42957:233;;;:::o;29713:239::-;29785:7;29805:13;29821:7;:16;29829:7;29821:16;;;;;;;;;;;;;;;;;;;;;29805:32;;29873:1;29856:19;;:5;:19;;;;29848:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29939:5;29932:12;;;29713:239;;;:::o;29443:208::-;29515:7;29560:1;29543:19;;:5;:19;;;;29535:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29627:9;:16;29637:5;29627:16;;;;;;;;;;;;;;;;29620:23;;29443:208;;;:::o;9718:94::-;9298:12;:10;:12::i;:::-;9287:23;;:7;:5;:7::i;:::-;:23;;;9279:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9783:21:::1;9801:1;9783:9;:21::i;:::-;9718:94::o:0;9067:87::-;9113:7;9140:6;;;;;;;;;;;9133:13;;9067:87;:::o;30188:104::-;30244:13;30277:7;30270:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30188:104;:::o;48462:29::-;;;;:::o;31871:295::-;31986:12;:10;:12::i;:::-;31974:24;;:8;:24;;;;31966:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32086:8;32041:18;:32;32060:12;:10;:12::i;:::-;32041:32;;;;;;;;;;;;;;;:42;32074:8;32041:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32139:8;32110:48;;32125:12;:10;:12::i;:::-;32110:48;;;32149:8;32110:48;;;;;;:::i;:::-;;;;;;;;31871:295;;:::o;33134:328::-;33309:41;33328:12;:10;:12::i;:::-;33342:7;33309:18;:41::i;:::-;33301:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33415:39;33429:4;33435:2;33439:7;33448:5;33415:13;:39::i;:::-;33134:328;;;;:::o;52958:2419::-;53043:13;53082:16;53090:7;53082;:16::i;:::-;53074:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;53133:26;53162:24;53178:7;53162:15;:24::i;:::-;53133:53;;53197:17;53225:22;53265:9;53260:840;53280:2;53276:1;:6;53260:840;;;53374:3;53444:25;:9;:11;;;53456:1;53444:14;;;;;;;:::i;:::-;;;;;;:23;:25::i;:::-;53522;:9;:11;;;53534:1;53522:14;;;;;;;:::i;:::-;;;;;;:23;:25::i;:::-;53335:259;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53304:305;;53701:8;53814:25;:9;:11;;;53826:1;53814:14;;;;;;;:::i;:::-;;;;;;:23;:25::i;:::-;53888;:9;:11;;;53900:1;53888:14;;;;;;;:::i;:::-;;;;;;:23;:25::i;:::-;53662:297;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53626:348;;54000:1;53995;:6;53991:98;;54057:8;54040:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;54022:51;;53991:98;53284:3;;;;;:::i;:::-;;;;53260:840;;;;54383:3;54139:379;;;;;;;;:::i;:::-;;;;;;;;;;;;;54112:417;;54664:679;54882:18;:7;:16;:18::i;:::-;55081:25;55101:3;55081:13;:25::i;:::-;55196:8;54769:505;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54664:13;:679::i;:::-;54579:779;;;;;;;;:::i;:::-;;;;;;;;;;;;;54542:827;;;;;52958:2419;;;:::o;32237:164::-;32334:4;32358:18;:25;32377:5;32358:25;;;;;;;;;;;;;;;:35;32384:8;32358:35;;;;;;;;;;;;;;;;;;;;;;;;;32351:42;;32237:164;;;;:::o;9967:192::-;9298:12;:10;:12::i;:::-;9287:23;;:7;:5;:7::i;:::-;:23;;;9279:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10076:1:::1;10056:22;;:8;:22;;;;10048:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10132:19;10142:8;10132:9;:19::i;:::-;9967:192:::0;:::o;29074:305::-;29176:4;29228:25;29213:40;;;:11;:40;;;;:105;;;;29285:33;29270:48;;;:11;:48;;;;29213:105;:158;;;;29335:36;29359:11;29335:23;:36::i;:::-;29213:158;29193:178;;29074:305;;;:::o;34972:127::-;35037:4;35089:1;35061:30;;:7;:16;35069:7;35061:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35054:37;;34972:127;;;:::o;7855:98::-;7908:7;7935:10;7928:17;;7855:98;:::o;38954:174::-;39056:2;39029:15;:24;39045:7;39029:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39112:7;39108:2;39074:46;;39083:23;39098:7;39083:14;:23::i;:::-;39074:46;;;;;;;;;;;;38954:174;;:::o;35266:348::-;35359:4;35384:16;35392:7;35384;:16::i;:::-;35376:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35460:13;35476:23;35491:7;35476:14;:23::i;:::-;35460:39;;35529:5;35518:16;;:7;:16;;;:51;;;;35562:7;35538:31;;:20;35550:7;35538:11;:20::i;:::-;:31;;;35518:51;:87;;;;35573:32;35590:5;35597:7;35573:16;:32::i;:::-;35518:87;35510:96;;;35266:348;;;;:::o;38258:578::-;38417:4;38390:31;;:23;38405:7;38390:14;:23::i;:::-;:31;;;38382:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38500:1;38486:16;;:2;:16;;;;38478:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38556:39;38577:4;38583:2;38587:7;38556:20;:39::i;:::-;38660:29;38677:1;38681:7;38660:8;:29::i;:::-;38721:1;38702:9;:15;38712:4;38702:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38750:1;38733:9;:13;38743:2;38733:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38781:2;38762:7;:16;38770:7;38762:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38820:7;38816:2;38801:27;;38810:4;38801:27;;;;;;;;;;;;38258:578;;;:::o;5471:723::-;5527:13;5757:1;5748:5;:10;5744:53;;;5775:10;;;;;;;;;;;;;;;;;;;;;5744:53;5807:12;5822:5;5807:20;;5838:14;5863:78;5878:1;5870:4;:9;5863:78;;5896:8;;;;;:::i;:::-;;;;5927:2;5919:10;;;;;:::i;:::-;;;5863:78;;;5951:19;5983:6;5973:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5951:39;;6001:154;6017:1;6008:5;:10;6001:154;;6045:1;6035:11;;;;;:::i;:::-;;;6112:2;6104:5;:10;;;;:::i;:::-;6091:2;:24;;;;:::i;:::-;6078:39;;6061:6;6068;6061:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6141:2;6132:11;;;;;:::i;:::-;;;6001:154;;;6179:6;6165:21;;;;;5471:723;;;;:::o;48636:119::-;48695:7;48740:5;48730:16;;;;;;48722:25;;48715:32;;48636:119;;;:::o;35956:110::-;36032:26;36042:2;36046:7;36032:26;;;;;;;;;;;;:9;:26::i;:::-;35956:110;;:::o;10167:173::-;10223:16;10242:6;;;;;;;;;;;10223:25;;10268:8;10259:6;;:17;;;;;;;;;;;;;;;;;;10323:8;10292:40;;10313:8;10292:40;;;;;;;;;;;;10212:128;10167:173;:::o;34344:315::-;34501:28;34511:4;34517:2;34521:7;34501:9;:28::i;:::-;34548:48;34571:4;34577:2;34581:7;34590:5;34548:22;:48::i;:::-;34540:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34344:315;;;;:::o;359:2037::-;417:13;462:1;447:4;:11;:16;443:31;;;465:9;;;;;;;;;;;;;;;;443:31;534:19;556:5;;;;;;;;;;;;;;;;;534:27;;613:18;659:1;654;640:4;:11;:15;;;;:::i;:::-;639:21;;;;:::i;:::-;634:1;:27;;;;:::i;:::-;613:48;;744:20;791:2;778:10;:15;;;;:::i;:::-;767:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;744:50;;891:10;883:6;876:26;998:1;991:5;987:13;1069:4;1120;1114:11;1105:7;1101:25;1228:2;1220:6;1216:15;1313:810;1332:6;1323:7;1320:19;1313:810;;;1398:1;1389:7;1385:15;1374:26;;1485:7;1479:14;1632:4;1624:5;1620:2;1616:14;1612:25;1602:8;1598:40;1592:47;1587:3;1583:57;1572:9;1565:76;1686:1;1675:9;1671:17;1658:30;;1772:4;1764:5;1760:2;1756:14;1752:25;1742:8;1738:40;1732:47;1727:3;1723:57;1712:9;1705:76;1826:1;1815:9;1811:17;1798:30;;1912:4;1904:5;1901:1;1896:14;1892:25;1882:8;1878:40;1872:47;1867:3;1863:57;1852:9;1845:76;1966:1;1955:9;1951:17;1938:30;;2052:4;2044:5;2032:25;2022:8;2018:40;2012:47;2007:3;2003:57;1992:9;1985:76;2106:1;2095:9;2091:17;2078:30;;1356:767;1313:810;;;2208:1;2201:4;2195:11;2191:19;2229:1;2224:54;;;;2297:1;2292:52;;;;2184:160;;2224:54;2268:6;2263:3;2259:16;2255:1;2244:9;2240:17;2233:43;2224:54;;2292:52;2336:4;2331:3;2327:14;2323:1;2312:9;2308:17;2301:41;2184:160;;816:1539;;;;2382:6;2375:13;;;;;359:2037;;;;:::o;21053:157::-;21138:4;21177:25;21162:40;;;:11;:40;;;;21155:47;;21053:157;;;:::o;43803:589::-;43947:45;43974:4;43980:2;43984:7;43947:26;:45::i;:::-;44025:1;44009:18;;:4;:18;;;44005:187;;;44044:40;44076:7;44044:31;:40::i;:::-;44005:187;;;44114:2;44106:10;;:4;:10;;;44102:90;;44133:47;44166:4;44172:7;44133:32;:47::i;:::-;44102:90;44005:187;44220:1;44206:16;;:2;:16;;;44202:183;;;44239:45;44276:7;44239:36;:45::i;:::-;44202:183;;;44312:4;44306:10;;:2;:10;;;44302:83;;44333:40;44361:2;44365:7;44333:27;:40::i;:::-;44302:83;44202:183;43803:589;;;:::o;36293:321::-;36423:18;36429:2;36433:7;36423:5;:18::i;:::-;36474:54;36505:1;36509:2;36513:7;36522:5;36474:22;:54::i;:::-;36452:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36293:321;;;:::o;39693:799::-;39848:4;39869:15;:2;:13;;;:15::i;:::-;39865:620;;;39921:2;39905:36;;;39942:12;:10;:12::i;:::-;39956:4;39962:7;39971:5;39905:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39901:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40164:1;40147:6;:13;:18;40143:272;;;40190:60;;;;;;;;;;:::i;:::-;;;;;;;;40143:272;40365:6;40359:13;40350:6;40346:2;40342:15;40335:38;39901:529;40038:41;;;40028:51;;;:6;:51;;;;40021:58;;;;;39865:620;40469:4;40462:11;;39693:799;;;;;;;:::o;41064:126::-;;;;:::o;45115:164::-;45219:10;:17;;;;45192:15;:24;45208:7;45192:24;;;;;;;;;;;:44;;;;45247:10;45263:7;45247:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45115:164;:::o;45906:988::-;46172:22;46222:1;46197:22;46214:4;46197:16;:22::i;:::-;:26;;;;:::i;:::-;46172:51;;46234:18;46255:17;:26;46273:7;46255:26;;;;;;;;;;;;46234:47;;46402:14;46388:10;:28;46384:328;;46433:19;46455:12;:18;46468:4;46455:18;;;;;;;;;;;;;;;:34;46474:14;46455:34;;;;;;;;;;;;46433:56;;46539:11;46506:12;:18;46519:4;46506:18;;;;;;;;;;;;;;;:30;46525:10;46506:30;;;;;;;;;;;:44;;;;46656:10;46623:17;:30;46641:11;46623:30;;;;;;;;;;;:43;;;;46418:294;46384:328;46808:17;:26;46826:7;46808:26;;;;;;;;;;;46801:33;;;46852:12;:18;46865:4;46852:18;;;;;;;;;;;;;;;:34;46871:14;46852:34;;;;;;;;;;;46845:41;;;45987:907;;45906:988;;:::o;47189:1079::-;47442:22;47487:1;47467:10;:17;;;;:21;;;;:::i;:::-;47442:46;;47499:18;47520:15;:24;47536:7;47520:24;;;;;;;;;;;;47499:45;;47871:19;47893:10;47904:14;47893:26;;;;;;;;:::i;:::-;;;;;;;;;;47871:48;;47957:11;47932:10;47943;47932:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48068:10;48037:15;:28;48053:11;48037:28;;;;;;;;;;;:41;;;;48209:15;:24;48225:7;48209:24;;;;;;;;;;;48202:31;;;48244:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47260:1008;;;47189:1079;:::o;44693:221::-;44778:14;44795:20;44812:2;44795:16;:20::i;:::-;44778:37;;44853:7;44826:12;:16;44839:2;44826:16;;;;;;;;;;;;;;;:24;44843:6;44826:24;;;;;;;;;;;:34;;;;44900:6;44871:17;:26;44889:7;44871:26;;;;;;;;;;;:35;;;;44767:147;44693:221;;:::o;36950:382::-;37044:1;37030:16;;:2;:16;;;;37022:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37103:16;37111:7;37103;:16::i;:::-;37102:17;37094:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37165:45;37194:1;37198:2;37202:7;37165:20;:45::i;:::-;37240:1;37223:9;:13;37233:2;37223:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37271:2;37252:7;:16;37260:7;37252:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37316:7;37312:2;37291:33;;37308:1;37291:33;;;;;;;;;;;;36950:382;;:::o;11113:387::-;11173:4;11381:12;11448:7;11436:20;11428:28;;11491:1;11484:4;:8;11477:15;;;11113:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:327::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:52;5144:7;5135:6;5124:9;5120:22;5100:52;:::i;:::-;5090:62;;5046:116;4842:327;;;;:::o;5175:349::-;5244:6;5293:2;5281:9;5272:7;5268:23;5264:32;5261:119;;;5299:79;;:::i;:::-;5261:119;5419:1;5444:63;5499:7;5490:6;5479:9;5475:22;5444:63;:::i;:::-;5434:73;;5390:127;5175:349;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:179::-;5934:10;5955:46;5997:3;5989:6;5955:46;:::i;:::-;6033:4;6028:3;6024:14;6010:28;;5865:179;;;;:::o;6050:118::-;6137:24;6155:5;6137:24;:::i;:::-;6132:3;6125:37;6050:118;;:::o;6208:680::-;6336:53;6383:5;6336:53;:::i;:::-;6405:75;6473:6;6468:3;6405:75;:::i;:::-;6398:82;;6504:55;6553:5;6504:55;:::i;:::-;6582:7;6613:1;6598:283;6623:6;6620:1;6617:13;6598:283;;;6699:6;6693:13;6726:63;6785:3;6770:13;6726:63;:::i;:::-;6719:70;;6812:59;6864:6;6812:59;:::i;:::-;6802:69;;6658:223;6645:1;6642;6638:9;6633:14;;6598:283;;;6602:14;6312:576;;;6208:680;;:::o;6894:109::-;6975:21;6990:5;6975:21;:::i;:::-;6970:3;6963:34;6894:109;;:::o;7009:360::-;7095:3;7123:38;7155:5;7123:38;:::i;:::-;7177:70;7240:6;7235:3;7177:70;:::i;:::-;7170:77;;7256:52;7301:6;7296:3;7289:4;7282:5;7278:16;7256:52;:::i;:::-;7333:29;7355:6;7333:29;:::i;:::-;7328:3;7324:39;7317:46;;7099:270;7009:360;;;;:::o;7375:364::-;7463:3;7491:39;7524:5;7491:39;:::i;:::-;7546:71;7610:6;7605:3;7546:71;:::i;:::-;7539:78;;7626:52;7671:6;7666:3;7659:4;7652:5;7648:16;7626:52;:::i;:::-;7703:29;7725:6;7703:29;:::i;:::-;7698:3;7694:39;7687:46;;7467:272;7375:364;;;;:::o;7745:377::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:89;8016:6;8011:3;7934:89;:::i;:::-;7927:96;;8032:52;8077:6;8072:3;8065:4;8058:5;8054:16;8032:52;:::i;:::-;8109:6;8104:3;8100:16;8093:23;;7855:267;7745:377;;;;:::o;8128:402::-;8288:3;8309:85;8391:2;8386:3;8309:85;:::i;:::-;8302:92;;8403:93;8492:3;8403:93;:::i;:::-;8521:2;8516:3;8512:12;8505:19;;8128:402;;;:::o;8536:366::-;8678:3;8699:67;8763:2;8758:3;8699:67;:::i;:::-;8692:74;;8775:93;8864:3;8775:93;:::i;:::-;8893:2;8888:3;8884:12;8877:19;;8536:366;;;:::o;8908:::-;9050:3;9071:67;9135:2;9130:3;9071:67;:::i;:::-;9064:74;;9147:93;9236:3;9147:93;:::i;:::-;9265:2;9260:3;9256:12;9249:19;;8908:366;;;:::o;9280:402::-;9440:3;9461:85;9543:2;9538:3;9461:85;:::i;:::-;9454:92;;9555:93;9644:3;9555:93;:::i;:::-;9673:2;9668:3;9664:12;9657:19;;9280:402;;;:::o;9688:366::-;9830:3;9851:67;9915:2;9910:3;9851:67;:::i;:::-;9844:74;;9927:93;10016:3;9927:93;:::i;:::-;10045:2;10040:3;10036:12;10029:19;;9688:366;;;:::o;10060:::-;10202:3;10223:67;10287:2;10282:3;10223:67;:::i;:::-;10216:74;;10299:93;10388:3;10299:93;:::i;:::-;10417:2;10412:3;10408:12;10401:19;;10060:366;;;:::o;10432:::-;10574:3;10595:67;10659:2;10654:3;10595:67;:::i;:::-;10588:74;;10671:93;10760:3;10671:93;:::i;:::-;10789:2;10784:3;10780:12;10773:19;;10432:366;;;:::o;10804:::-;10946:3;10967:67;11031:2;11026:3;10967:67;:::i;:::-;10960:74;;11043:93;11132:3;11043:93;:::i;:::-;11161:2;11156:3;11152:12;11145:19;;10804:366;;;:::o;11176:402::-;11336:3;11357:85;11439:2;11434:3;11357:85;:::i;:::-;11350:92;;11451:93;11540:3;11451:93;:::i;:::-;11569:2;11564:3;11560:12;11553:19;;11176:402;;;:::o;11584:::-;11744:3;11765:85;11847:2;11842:3;11765:85;:::i;:::-;11758:92;;11859:93;11948:3;11859:93;:::i;:::-;11977:2;11972:3;11968:12;11961:19;;11584:402;;;:::o;11992:366::-;12134:3;12155:67;12219:2;12214:3;12155:67;:::i;:::-;12148:74;;12231:93;12320:3;12231:93;:::i;:::-;12349:2;12344:3;12340:12;12333:19;;11992:366;;;:::o;12364:::-;12506:3;12527:67;12591:2;12586:3;12527:67;:::i;:::-;12520:74;;12603:93;12692:3;12603:93;:::i;:::-;12721:2;12716:3;12712:12;12705:19;;12364:366;;;:::o;12736:::-;12878:3;12899:67;12963:2;12958:3;12899:67;:::i;:::-;12892:74;;12975:93;13064:3;12975:93;:::i;:::-;13093:2;13088:3;13084:12;13077:19;;12736:366;;;:::o;13108:402::-;13268:3;13289:85;13371:2;13366:3;13289:85;:::i;:::-;13282:92;;13383:93;13472:3;13383:93;:::i;:::-;13501:2;13496:3;13492:12;13485:19;;13108:402;;;:::o;13516:::-;13676:3;13697:85;13779:2;13774:3;13697:85;:::i;:::-;13690:92;;13791:93;13880:3;13791:93;:::i;:::-;13909:2;13904:3;13900:12;13893:19;;13516:402;;;:::o;13924:366::-;14066:3;14087:67;14151:2;14146:3;14087:67;:::i;:::-;14080:74;;14163:93;14252:3;14163:93;:::i;:::-;14281:2;14276:3;14272:12;14265:19;;13924:366;;;:::o;14296:::-;14438:3;14459:67;14523:2;14518:3;14459:67;:::i;:::-;14452:74;;14535:93;14624:3;14535:93;:::i;:::-;14653:2;14648:3;14644:12;14637:19;;14296:366;;;:::o;14668:400::-;14828:3;14849:84;14931:1;14926:3;14849:84;:::i;:::-;14842:91;;14942:93;15031:3;14942:93;:::i;:::-;15060:1;15055:3;15051:11;15044:18;;14668:400;;;:::o;15074:::-;15234:3;15255:84;15337:1;15332:3;15255:84;:::i;:::-;15248:91;;15348:93;15437:3;15348:93;:::i;:::-;15466:1;15461:3;15457:11;15450:18;;15074:400;;;:::o;15480:::-;15640:3;15661:84;15743:1;15738:3;15661:84;:::i;:::-;15654:91;;15754:93;15843:3;15754:93;:::i;:::-;15872:1;15867:3;15863:11;15856:18;;15480:400;;;:::o;15886:366::-;16028:3;16049:67;16113:2;16108:3;16049:67;:::i;:::-;16042:74;;16125:93;16214:3;16125:93;:::i;:::-;16243:2;16238:3;16234:12;16227:19;;15886:366;;;:::o;16258:::-;16400:3;16421:67;16485:2;16480:3;16421:67;:::i;:::-;16414:74;;16497:93;16586:3;16497:93;:::i;:::-;16615:2;16610:3;16606:12;16599:19;;16258:366;;;:::o;16630:::-;16772:3;16793:67;16857:2;16852:3;16793:67;:::i;:::-;16786:74;;16869:93;16958:3;16869:93;:::i;:::-;16987:2;16982:3;16978:12;16971:19;;16630:366;;;:::o;17002:::-;17144:3;17165:67;17229:2;17224:3;17165:67;:::i;:::-;17158:74;;17241:93;17330:3;17241:93;:::i;:::-;17359:2;17354:3;17350:12;17343:19;;17002:366;;;:::o;17374:402::-;17534:3;17555:85;17637:2;17632:3;17555:85;:::i;:::-;17548:92;;17649:93;17738:3;17649:93;:::i;:::-;17767:2;17762:3;17758:12;17751:19;;17374:402;;;:::o;17782:400::-;17942:3;17963:84;18045:1;18040:3;17963:84;:::i;:::-;17956:91;;18056:93;18145:3;18056:93;:::i;:::-;18174:1;18169:3;18165:11;18158:18;;17782:400;;;:::o;18188:::-;18348:3;18369:84;18451:1;18446:3;18369:84;:::i;:::-;18362:91;;18462:93;18551:3;18462:93;:::i;:::-;18580:1;18575:3;18571:11;18564:18;;18188:400;;;:::o;18594:366::-;18736:3;18757:67;18821:2;18816:3;18757:67;:::i;:::-;18750:74;;18833:93;18922:3;18833:93;:::i;:::-;18951:2;18946:3;18942:12;18935:19;;18594:366;;;:::o;18966:402::-;19126:3;19147:85;19229:2;19224:3;19147:85;:::i;:::-;19140:92;;19241:93;19330:3;19241:93;:::i;:::-;19359:2;19354:3;19350:12;19343:19;;18966:402;;;:::o;19374:400::-;19534:3;19555:84;19637:1;19632:3;19555:84;:::i;:::-;19548:91;;19648:93;19737:3;19648:93;:::i;:::-;19766:1;19761:3;19757:11;19750:18;;19374:400;;;:::o;19780:402::-;19940:3;19961:85;20043:2;20038:3;19961:85;:::i;:::-;19954:92;;20055:93;20144:3;20055:93;:::i;:::-;20173:2;20168:3;20164:12;20157:19;;19780:402;;;:::o;20188:400::-;20348:3;20369:84;20451:1;20446:3;20369:84;:::i;:::-;20362:91;;20462:93;20551:3;20462:93;:::i;:::-;20580:1;20575:3;20571:11;20564:18;;20188:400;;;:::o;20594:366::-;20736:3;20757:67;20821:2;20816:3;20757:67;:::i;:::-;20750:74;;20833:93;20922:3;20833:93;:::i;:::-;20951:2;20946:3;20942:12;20935:19;;20594:366;;;:::o;20966:::-;21108:3;21129:67;21193:2;21188:3;21129:67;:::i;:::-;21122:74;;21205:93;21294:3;21205:93;:::i;:::-;21323:2;21318:3;21314:12;21307:19;;20966:366;;;:::o;21338:400::-;21498:3;21519:84;21601:1;21596:3;21519:84;:::i;:::-;21512:91;;21612:93;21701:3;21612:93;:::i;:::-;21730:1;21725:3;21721:11;21714:18;;21338:400;;;:::o;21744:404::-;21904:3;21925:86;22007:3;22002;21925:86;:::i;:::-;21918:93;;22020;22109:3;22020:93;:::i;:::-;22138:3;22133;22129:13;22122:20;;21744:404;;;:::o;22154:366::-;22296:3;22317:67;22381:2;22376:3;22317:67;:::i;:::-;22310:74;;22393:93;22482:3;22393:93;:::i;:::-;22511:2;22506:3;22502:12;22495:19;;22154:366;;;:::o;22526:::-;22668:3;22689:67;22753:2;22748:3;22689:67;:::i;:::-;22682:74;;22765:93;22854:3;22765:93;:::i;:::-;22883:2;22878:3;22874:12;22867:19;;22526:366;;;:::o;22898:402::-;23058:3;23079:85;23161:2;23156:3;23079:85;:::i;:::-;23072:92;;23173:93;23262:3;23173:93;:::i;:::-;23291:2;23286:3;23282:12;23275:19;;22898:402;;;:::o;23376:605::-;23527:6;23522:3;23518:16;23613:4;23606:5;23602:16;23596:23;23632:111;23737:4;23732:3;23728:14;23714:12;23632:111;:::i;:::-;23544:209;23832:4;23825:5;23821:16;23815:23;23851:113;23956:6;23951:3;23947:16;23933:12;23851:113;:::i;:::-;23763:211;23496:485;23376:605;;:::o;23987:108::-;24064:24;24082:5;24064:24;:::i;:::-;24059:3;24052:37;23987:108;;:::o;24101:118::-;24188:24;24206:5;24188:24;:::i;:::-;24183:3;24176:37;24101:118;;:::o;24225:755::-;24501:3;24523:95;24614:3;24605:6;24523:95;:::i;:::-;24516:102;;24635:95;24726:3;24717:6;24635:95;:::i;:::-;24628:102;;24747:95;24838:3;24829:6;24747:95;:::i;:::-;24740:102;;24859:95;24950:3;24941:6;24859:95;:::i;:::-;24852:102;;24971:3;24964:10;;24225:755;;;;;;;:::o;24986:701::-;25267:3;25289:95;25380:3;25371:6;25289:95;:::i;:::-;25282:102;;25401:95;25492:3;25483:6;25401:95;:::i;:::-;25394:102;;25513:148;25657:3;25513:148;:::i;:::-;25506:155;;25678:3;25671:10;;24986:701;;;;;:::o;25693:1393::-;26224:3;26246:95;26337:3;26328:6;26246:95;:::i;:::-;26239:102;;26358:148;26502:3;26358:148;:::i;:::-;26351:155;;26523:95;26614:3;26605:6;26523:95;:::i;:::-;26516:102;;26635:148;26779:3;26635:148;:::i;:::-;26628:155;;26800:95;26891:3;26882:6;26800:95;:::i;:::-;26793:102;;26912:148;27056:3;26912:148;:::i;:::-;26905:155;;27077:3;27070:10;;25693:1393;;;;;;:::o;27092:1659::-;27724:3;27746:95;27837:3;27828:6;27746:95;:::i;:::-;27739:102;;27858:148;28002:3;27858:148;:::i;:::-;27851:155;;28023:148;28167:3;28023:148;:::i;:::-;28016:155;;28188:95;28279:3;28270:6;28188:95;:::i;:::-;28181:102;;28300:148;28444:3;28300:148;:::i;:::-;28293:155;;28465:95;28556:3;28547:6;28465:95;:::i;:::-;28458:102;;28577:148;28721:3;28577:148;:::i;:::-;28570:155;;28742:3;28735:10;;27092:1659;;;;;;:::o;28757:541::-;28990:3;29012:95;29103:3;29094:6;29012:95;:::i;:::-;29005:102;;29124:148;29268:3;29124:148;:::i;:::-;29117:155;;29289:3;29282:10;;28757:541;;;;:::o;29304:1925::-;30037:3;30059:148;30203:3;30059:148;:::i;:::-;30052:155;;30224:95;30315:3;30306:6;30224:95;:::i;:::-;30217:102;;30336:148;30480:3;30336:148;:::i;:::-;30329:155;;30501:148;30645:3;30501:148;:::i;:::-;30494:155;;30666:95;30757:3;30748:6;30666:95;:::i;:::-;30659:102;;30778:148;30922:3;30778:148;:::i;:::-;30771:155;;30943:95;31034:3;31025:6;30943:95;:::i;:::-;30936:102;;31055:148;31199:3;31055:148;:::i;:::-;31048:155;;31220:3;31213:10;;29304:1925;;;;;;:::o;31235:701::-;31516:3;31538:148;31682:3;31538:148;:::i;:::-;31531:155;;31703:95;31794:3;31785:6;31703:95;:::i;:::-;31696:102;;31815:95;31906:3;31897:6;31815:95;:::i;:::-;31808:102;;31927:3;31920:10;;31235:701;;;;;:::o;31942:541::-;32175:3;32197:148;32341:3;32197:148;:::i;:::-;32190:155;;32362:95;32453:3;32444:6;32362:95;:::i;:::-;32355:102;;32474:3;32467:10;;31942:541;;;;:::o;32489:1073::-;32924:3;32946:148;33090:3;32946:148;:::i;:::-;32939:155;;33111:148;33255:3;33111:148;:::i;:::-;33104:155;;33276:95;33367:3;33358:6;33276:95;:::i;:::-;33269:102;;33388:148;33532:3;33388:148;:::i;:::-;33381:155;;33553:3;33546:10;;32489:1073;;;;:::o;33568:222::-;33661:4;33699:2;33688:9;33684:18;33676:26;;33712:71;33780:1;33769:9;33765:17;33756:6;33712:71;:::i;:::-;33568:222;;;;:::o;33796:640::-;33991:4;34029:3;34018:9;34014:19;34006:27;;34043:71;34111:1;34100:9;34096:17;34087:6;34043:71;:::i;:::-;34124:72;34192:2;34181:9;34177:18;34168:6;34124:72;:::i;:::-;34206;34274:2;34263:9;34259:18;34250:6;34206:72;:::i;:::-;34325:9;34319:4;34315:20;34310:2;34299:9;34295:18;34288:48;34353:76;34424:4;34415:6;34353:76;:::i;:::-;34345:84;;33796:640;;;;;;;:::o;34442:210::-;34529:4;34567:2;34556:9;34552:18;34544:26;;34580:65;34642:1;34631:9;34627:17;34618:6;34580:65;:::i;:::-;34442:210;;;;:::o;34658:313::-;34771:4;34809:2;34798:9;34794:18;34786:26;;34858:9;34852:4;34848:20;34844:1;34833:9;34829:17;34822:47;34886:78;34959:4;34950:6;34886:78;:::i;:::-;34878:86;;34658:313;;;;:::o;34977:419::-;35143:4;35181:2;35170:9;35166:18;35158:26;;35230:9;35224:4;35220:20;35216:1;35205:9;35201:17;35194:47;35258:131;35384:4;35258:131;:::i;:::-;35250:139;;34977:419;;;:::o;35402:::-;35568:4;35606:2;35595:9;35591:18;35583:26;;35655:9;35649:4;35645:20;35641:1;35630:9;35626:17;35619:47;35683:131;35809:4;35683:131;:::i;:::-;35675:139;;35402:419;;;:::o;35827:::-;35993:4;36031:2;36020:9;36016:18;36008:26;;36080:9;36074:4;36070:20;36066:1;36055:9;36051:17;36044:47;36108:131;36234:4;36108:131;:::i;:::-;36100:139;;35827:419;;;:::o;36252:::-;36418:4;36456:2;36445:9;36441:18;36433:26;;36505:9;36499:4;36495:20;36491:1;36480:9;36476:17;36469:47;36533:131;36659:4;36533:131;:::i;:::-;36525:139;;36252:419;;;:::o;36677:::-;36843:4;36881:2;36870:9;36866:18;36858:26;;36930:9;36924:4;36920:20;36916:1;36905:9;36901:17;36894:47;36958:131;37084:4;36958:131;:::i;:::-;36950:139;;36677:419;;;:::o;37102:::-;37268:4;37306:2;37295:9;37291:18;37283:26;;37355:9;37349:4;37345:20;37341:1;37330:9;37326:17;37319:47;37383:131;37509:4;37383:131;:::i;:::-;37375:139;;37102:419;;;:::o;37527:::-;37693:4;37731:2;37720:9;37716:18;37708:26;;37780:9;37774:4;37770:20;37766:1;37755:9;37751:17;37744:47;37808:131;37934:4;37808:131;:::i;:::-;37800:139;;37527:419;;;:::o;37952:::-;38118:4;38156:2;38145:9;38141:18;38133:26;;38205:9;38199:4;38195:20;38191:1;38180:9;38176:17;38169:47;38233:131;38359:4;38233:131;:::i;:::-;38225:139;;37952:419;;;:::o;38377:::-;38543:4;38581:2;38570:9;38566:18;38558:26;;38630:9;38624:4;38620:20;38616:1;38605:9;38601:17;38594:47;38658:131;38784:4;38658:131;:::i;:::-;38650:139;;38377:419;;;:::o;38802:::-;38968:4;39006:2;38995:9;38991:18;38983:26;;39055:9;39049:4;39045:20;39041:1;39030:9;39026:17;39019:47;39083:131;39209:4;39083:131;:::i;:::-;39075:139;;38802:419;;;:::o;39227:::-;39393:4;39431:2;39420:9;39416:18;39408:26;;39480:9;39474:4;39470:20;39466:1;39455:9;39451:17;39444:47;39508:131;39634:4;39508:131;:::i;:::-;39500:139;;39227:419;;;:::o;39652:::-;39818:4;39856:2;39845:9;39841:18;39833:26;;39905:9;39899:4;39895:20;39891:1;39880:9;39876:17;39869:47;39933:131;40059:4;39933:131;:::i;:::-;39925:139;;39652:419;;;:::o;40077:::-;40243:4;40281:2;40270:9;40266:18;40258:26;;40330:9;40324:4;40320:20;40316:1;40305:9;40301:17;40294:47;40358:131;40484:4;40358:131;:::i;:::-;40350:139;;40077:419;;;:::o;40502:::-;40668:4;40706:2;40695:9;40691:18;40683:26;;40755:9;40749:4;40745:20;40741:1;40730:9;40726:17;40719:47;40783:131;40909:4;40783:131;:::i;:::-;40775:139;;40502:419;;;:::o;40927:::-;41093:4;41131:2;41120:9;41116:18;41108:26;;41180:9;41174:4;41170:20;41166:1;41155:9;41151:17;41144:47;41208:131;41334:4;41208:131;:::i;:::-;41200:139;;40927:419;;;:::o;41352:::-;41518:4;41556:2;41545:9;41541:18;41533:26;;41605:9;41599:4;41595:20;41591:1;41580:9;41576:17;41569:47;41633:131;41759:4;41633:131;:::i;:::-;41625:139;;41352:419;;;:::o;41777:::-;41943:4;41981:2;41970:9;41966:18;41958:26;;42030:9;42024:4;42020:20;42016:1;42005:9;42001:17;41994:47;42058:131;42184:4;42058:131;:::i;:::-;42050:139;;41777:419;;;:::o;42202:::-;42368:4;42406:2;42395:9;42391:18;42383:26;;42455:9;42449:4;42445:20;42441:1;42430:9;42426:17;42419:47;42483:131;42609:4;42483:131;:::i;:::-;42475:139;;42202:419;;;:::o;42627:::-;42793:4;42831:2;42820:9;42816:18;42808:26;;42880:9;42874:4;42870:20;42866:1;42855:9;42851:17;42844:47;42908:131;43034:4;42908:131;:::i;:::-;42900:139;;42627:419;;;:::o;43052:::-;43218:4;43256:2;43245:9;43241:18;43233:26;;43305:9;43299:4;43295:20;43291:1;43280:9;43276:17;43269:47;43333:131;43459:4;43333:131;:::i;:::-;43325:139;;43052:419;;;:::o;43477:331::-;43624:4;43662:3;43651:9;43647:19;43639:27;;43676:125;43798:1;43787:9;43783:17;43774:6;43676:125;:::i;:::-;43477:331;;;;:::o;43814:222::-;43907:4;43945:2;43934:9;43930:18;43922:26;;43958:71;44026:1;44015:9;44011:17;44002:6;43958:71;:::i;:::-;43814:222;;;;:::o;44042:129::-;44076:6;44103:20;;:::i;:::-;44093:30;;44132:33;44160:4;44152:6;44132:33;:::i;:::-;44042:129;;;:::o;44177:75::-;44210:6;44243:2;44237:9;44227:19;;44177:75;:::o;44258:307::-;44319:4;44409:18;44401:6;44398:30;44395:56;;;44431:18;;:::i;:::-;44395:56;44469:29;44491:6;44469:29;:::i;:::-;44461:37;;44553:4;44547;44543:15;44535:23;;44258:307;;;:::o;44571:99::-;44637:4;44660:3;44652:11;;44571:99;;;:::o;44676:105::-;44742:6;44770:4;44760:14;;44676:105;;;:::o;44787:98::-;44838:6;44872:5;44866:12;44856:22;;44787:98;;;:::o;44891:99::-;44943:6;44977:5;44971:12;44961:22;;44891:99;;;:::o;44996:112::-;45065:4;45097;45092:3;45088:14;45080:22;;44996:112;;;:::o;45114:134::-;45202:11;45239:3;45224:18;;45114:134;;;;:::o;45254:168::-;45337:11;45371:6;45366:3;45359:19;45411:4;45406:3;45402:14;45387:29;;45254:168;;;;:::o;45428:169::-;45512:11;45546:6;45541:3;45534:19;45586:4;45581:3;45577:14;45562:29;;45428:169;;;;:::o;45603:148::-;45705:11;45742:3;45727:18;;45603:148;;;;:::o;45757:305::-;45797:3;45816:20;45834:1;45816:20;:::i;:::-;45811:25;;45850:20;45868:1;45850:20;:::i;:::-;45845:25;;46004:1;45936:66;45932:74;45929:1;45926:81;45923:107;;;46010:18;;:::i;:::-;45923:107;46054:1;46051;46047:9;46040:16;;45757:305;;;;:::o;46068:185::-;46108:1;46125:20;46143:1;46125:20;:::i;:::-;46120:25;;46159:20;46177:1;46159:20;:::i;:::-;46154:25;;46198:1;46188:35;;46203:18;;:::i;:::-;46188:35;46245:1;46242;46238:9;46233:14;;46068:185;;;;:::o;46259:348::-;46299:7;46322:20;46340:1;46322:20;:::i;:::-;46317:25;;46356:20;46374:1;46356:20;:::i;:::-;46351:25;;46544:1;46476:66;46472:74;46469:1;46466:81;46461:1;46454:9;46447:17;46443:105;46440:131;;;46551:18;;:::i;:::-;46440:131;46599:1;46596;46592:9;46581:20;;46259:348;;;;:::o;46613:191::-;46653:4;46673:20;46691:1;46673:20;:::i;:::-;46668:25;;46707:20;46725:1;46707:20;:::i;:::-;46702:25;;46746:1;46743;46740:8;46737:34;;;46751:18;;:::i;:::-;46737:34;46796:1;46793;46789:9;46781:17;;46613:191;;;;:::o;46810:96::-;46847:7;46876:24;46894:5;46876:24;:::i;:::-;46865:35;;46810:96;;;:::o;46912:90::-;46946:7;46989:5;46982:13;46975:21;46964:32;;46912:90;;;:::o;47008:149::-;47044:7;47084:66;47077:5;47073:78;47062:89;;47008:149;;;:::o;47163:126::-;47200:7;47240:42;47233:5;47229:54;47218:65;;47163:126;;;:::o;47295:77::-;47332:7;47361:5;47350:16;;47295:77;;;:::o;47378:154::-;47462:6;47457:3;47452;47439:30;47524:1;47515:6;47510:3;47506:16;47499:27;47378:154;;;:::o;47538:307::-;47606:1;47616:113;47630:6;47627:1;47624:13;47616:113;;;47715:1;47710:3;47706:11;47700:18;47696:1;47691:3;47687:11;47680:39;47652:2;47649:1;47645:10;47640:15;;47616:113;;;47747:6;47744:1;47741:13;47738:101;;;47827:1;47818:6;47813:3;47809:16;47802:27;47738:101;47587:258;47538:307;;;:::o;47851:171::-;47890:3;47913:24;47931:5;47913:24;:::i;:::-;47904:33;;47959:4;47952:5;47949:15;47946:41;;;47967:18;;:::i;:::-;47946:41;48014:1;48007:5;48003:13;47996:20;;47851:171;;;:::o;48028:320::-;48072:6;48109:1;48103:4;48099:12;48089:22;;48156:1;48150:4;48146:12;48177:18;48167:81;;48233:4;48225:6;48221:17;48211:27;;48167:81;48295:2;48287:6;48284:14;48264:18;48261:38;48258:84;;;48314:18;;:::i;:::-;48258:84;48079:269;48028:320;;;:::o;48354:281::-;48437:27;48459:4;48437:27;:::i;:::-;48429:6;48425:40;48567:6;48555:10;48552:22;48531:18;48519:10;48516:34;48513:62;48510:88;;;48578:18;;:::i;:::-;48510:88;48618:10;48614:2;48607:22;48397:238;48354:281;;:::o;48641:233::-;48680:3;48703:24;48721:5;48703:24;:::i;:::-;48694:33;;48749:66;48742:5;48739:77;48736:103;;;48819:18;;:::i;:::-;48736:103;48866:1;48859:5;48855:13;48848:20;;48641:233;;;:::o;48880:176::-;48912:1;48929:20;48947:1;48929:20;:::i;:::-;48924:25;;48963:20;48981:1;48963:20;:::i;:::-;48958:25;;49002:1;48992:35;;49007:18;;:::i;:::-;48992:35;49048:1;49045;49041:9;49036:14;;48880:176;;;;:::o;49062:180::-;49110:77;49107:1;49100:88;49207:4;49204:1;49197:15;49231:4;49228:1;49221:15;49248:180;49296:77;49293:1;49286:88;49393:4;49390:1;49383:15;49417:4;49414:1;49407:15;49434:180;49482:77;49479:1;49472:88;49579:4;49576:1;49569:15;49603:4;49600:1;49593:15;49620:180;49668:77;49665:1;49658:88;49765:4;49762:1;49755:15;49789:4;49786:1;49779:15;49806:180;49854:77;49851:1;49844:88;49951:4;49948:1;49941:15;49975:4;49972:1;49965:15;49992:180;50040:77;50037:1;50030:88;50137:4;50134:1;50127:15;50161:4;50158:1;50151:15;50178:117;50287:1;50284;50277:12;50301:117;50410:1;50407;50400:12;50424:117;50533:1;50530;50523:12;50547:117;50656:1;50653;50646:12;50670:102;50711:6;50762:2;50758:7;50753:2;50746:5;50742:14;50738:28;50728:38;;50670:102;;;:::o;50778:214::-;50918:66;50914:1;50906:6;50902:14;50895:90;50778:214;:::o;50998:230::-;51138:34;51134:1;51126:6;51122:14;51115:58;51207:13;51202:2;51194:6;51190:15;51183:38;50998:230;:::o;51234:237::-;51374:34;51370:1;51362:6;51358:14;51351:58;51443:20;51438:2;51430:6;51426:15;51419:45;51234:237;:::o;51477:214::-;51617:66;51613:1;51605:6;51601:14;51594:90;51477:214;:::o;51697:225::-;51837:34;51833:1;51825:6;51821:14;51814:58;51906:8;51901:2;51893:6;51889:15;51882:33;51697:225;:::o;51928:178::-;52068:30;52064:1;52056:6;52052:14;52045:54;51928:178;:::o;52112:223::-;52252:34;52248:1;52240:6;52236:14;52229:58;52321:6;52316:2;52308:6;52304:15;52297:31;52112:223;:::o;52341:175::-;52481:27;52477:1;52469:6;52465:14;52458:51;52341:175;:::o;52522:315::-;52662:66;52658:1;52650:6;52646:14;52639:90;52763:66;52758:2;52750:6;52746:15;52739:91;52522:315;:::o;52843:214::-;52983:66;52979:1;52971:6;52967:14;52960:90;52843:214;:::o;53063:231::-;53203:34;53199:1;53191:6;53187:14;53180:58;53272:14;53267:2;53259:6;53255:15;53248:39;53063:231;:::o;53300:243::-;53440:34;53436:1;53428:6;53424:14;53417:58;53509:26;53504:2;53496:6;53492:15;53485:51;53300:243;:::o;53549:167::-;53689:19;53685:1;53677:6;53673:14;53666:43;53549:167;:::o;53722:214::-;53862:66;53858:1;53850:6;53846:14;53839:90;53722:214;:::o;53942:::-;54082:66;54078:1;54070:6;54066:14;54059:90;53942:214;:::o;54162:229::-;54302:34;54298:1;54290:6;54286:14;54279:58;54371:12;54366:2;54358:6;54354:15;54347:37;54162:229;:::o;54397:228::-;54537:34;54533:1;54525:6;54521:14;54514:58;54606:11;54601:2;54593:6;54589:15;54582:36;54397:228;:::o;54631:151::-;54771:3;54767:1;54759:6;54755:14;54748:27;54631:151;:::o;54788:214::-;54928:66;54924:1;54916:6;54912:14;54905:90;54788:214;:::o;55008:151::-;55148:3;55144:1;55136:6;55132:14;55125:27;55008:151;:::o;55165:182::-;55305:34;55301:1;55293:6;55289:14;55282:58;55165:182;:::o;55353:231::-;55493:34;55489:1;55481:6;55477:14;55470:58;55562:14;55557:2;55549:6;55545:15;55538:39;55353:231;:::o;55590:182::-;55730:34;55726:1;55718:6;55714:14;55707:58;55590:182;:::o;55778:228::-;55918:34;55914:1;55906:6;55902:14;55895:58;55987:11;55982:2;55974:6;55970:15;55963:36;55778:228;:::o;56012:315::-;56152:66;56148:1;56140:6;56136:14;56129:90;56253:66;56248:2;56240:6;56236:15;56229:91;56012:315;:::o;56333:144::-;56469:4;56465:1;56457:6;56453:14;56446:28;56333:144;:::o;56479:206::-;56615:66;56611:1;56603:6;56599:14;56592:90;56479:206;:::o;56687:208::-;56823:34;56819:1;56811:6;56807:14;56800:58;56888:3;56883:2;56875:6;56871:15;56864:28;56687:208;:::o;56897:308::-;57033:34;57029:1;57021:6;57017:14;57010:58;57102:34;57097:2;57089:6;57085:15;57078:59;57167:34;57162:2;57154:6;57150:15;57143:59;56897:308;:::o;57207:144::-;57343:4;57339:1;57331:6;57327:14;57320:28;57207:144;:::o;57353:171::-;57489:31;57485:1;57477:6;57473:14;57466:55;57353:171;:::o;57526:206::-;57662:66;57658:1;57650:6;57646:14;57639:90;57526:206;:::o;57734:224::-;57870:34;57866:1;57858:6;57854:14;57847:58;57935:19;57930:2;57922:6;57918:15;57911:44;57734:224;:::o;57960:219::-;58096:34;58092:1;58084:6;58080:14;58073:58;58161:14;58156:2;58148:6;58144:15;58137:39;57960:219;:::o;58181:143::-;58317:3;58313:1;58305:6;58301:14;58294:27;58181:143;:::o;58326:497::-;58462:66;58458:1;58450:6;58446:14;58439:90;58559:66;58554:2;58546:6;58542:15;58535:91;58656:66;58651:2;58643:6;58639:15;58632:91;58753:66;58748:2;58740:6;58736:15;58729:91;58326:497;:::o;58825:155::-;58961:15;58957:1;58949:6;58945:14;58938:39;58825:155;:::o;58982:173::-;59118:33;59114:1;59106:6;59102:14;59095:57;58982:173;:::o;59157:245::-;59293:66;59289:1;59281:6;59277:14;59270:90;59390:8;59385:2;59377:6;59373:15;59366:33;59157:245;:::o;59404:114::-;59473:24;59491:5;59473:24;:::i;:::-;59466:5;59463:35;59453:63;;59512:1;59509;59502:12;59453:63;59404:114;:::o;59520:108::-;59586:21;59601:5;59586:21;:::i;:::-;59579:5;59576:32;59566:60;;59622:1;59619;59612:12;59566:60;59520:108;:::o;59630:112::-;59698:23;59715:5;59698:23;:::i;:::-;59691:5;59688:34;59678:62;;59736:1;59733;59726:12;59678:62;59630:112;:::o;59744:114::-;59813:24;59831:5;59813:24;:::i;:::-;59806:5;59803:35;59793:63;;59852:1;59849;59842:12;59793:63;59744:114;:::o
Swarm Source
ipfs://b87b949381ba863842f14c07b1a81e79380b18c29e5ed7d9b79dc8ae6729af7d
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.