ERC-721
NFT
Overview
Max Total Supply
9,036 RetroPandas
Holders
251
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
38 RetroPandasLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
RetroPandas
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-24 */ // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT 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/[email protected] 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/introspection/[email protected] 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/token/ERC721/[email protected] 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/[email protected] 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/token/ERC721/extensions/[email protected] 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/utils/[email protected] 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/utils/[email protected] 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/introspection/[email protected] 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/[email protected] 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/[email protected] 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/[email protected] 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 @openzeppelin/contracts/utils/math/[email protected] pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens 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 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File contracts/SteamedBuns.sol pragma solidity >=0.8.0 <0.9.0; interface IRetroPandas { function pandasBalance(address user) external view returns(uint256); function pandanatorsBalance(address user) external view returns(uint256); } contract SteamedBuns is ERC20("Steamed Buns", "BUNS") { using SafeMath for uint256; IRetroPandas public retroPandasContract; uint256 public rewardEndTime; uint256 constant public pandasDailyRate = 10 ether; uint256 constant public pandanatorsDailyRate = 20 ether; mapping(address => uint256) public rewards; mapping(address => uint256) public lastReward; event RewardClaimed(address indexed user, uint256 reward); constructor(address retroPandas) { retroPandasContract =IRetroPandas(retroPandas); rewardEndTime = block.timestamp + 5 * 31536000; // 5 years } function registerUser(address user) external onlyContract { if (lastReward[user] == 0) { uint256 time = min(block.timestamp, rewardEndTime); lastReward[user] = time; } } function updateReward(address user) external onlyContract { uint256 timeFrom = lastReward[user]; uint256 timeTo = min(block.timestamp, rewardEndTime); uint256 pendingRewards = calcPendingRewards(user, timeFrom, timeTo); if (pendingRewards > 0) { rewards[user] += pendingRewards; } if (timeFrom != rewardEndTime) { lastReward[user] = timeTo; } } function claimReward(address user) external onlyContract { uint256 reward = rewards[user]; if (reward > 0) { rewards[user] = 0; _mint(user, reward); emit RewardClaimed(user, reward); } } function getClaimableAmount(address user) external view returns(uint256) { uint256 timeFrom = lastReward[user]; uint256 timeTo = min(block.timestamp, rewardEndTime); return rewards[user] + calcPendingRewards(user, timeFrom, timeTo); } function burn(address user, uint256 amount) external onlyContract { require(balanceOf(user) >= amount, "User don't have enough bums"); _burn(user, amount); } function calcPendingRewards(address user, uint256 timeFrom, uint256 timeTo) internal view returns (uint256) { if(timeFrom == 0) { return 0; } uint256 timeMultiplier = timeTo.sub(timeFrom).div(86400); return retroPandasContract.pandasBalance(user).mul(pandasDailyRate.mul(timeMultiplier)) + retroPandasContract.pandanatorsBalance(user).mul(pandanatorsDailyRate.mul(timeMultiplier)); } function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } modifier onlyContract { require(msg.sender == address(retroPandasContract), "Can be called only from contract."); _; } } // File contracts/RetroPandas.sol pragma solidity >=0.8.0 <0.9.0; contract RetroPandas is ERC721Enumerable, Ownable { using SafeMath for uint256; uint constant public maxPandas = 3000; uint constant public maxPandanators = 6000; uint constant public assemblePrice = 300 ether; uint constant public mintPrice = 0.05 ether; bool public mintStarted = false; bool public mintWhitelistStarted = false; bool public assemblingEnabled = false; uint public pandasMinted = 0; uint public batchLimit = 5; uint public pandanatorsAssembled = 0; string public baseURI = "ipfs://QmPj14j8UWqu4QxFnqxFTDqMcZQtfG3NZZUtfQSRJYfVyt/"; mapping(address => uint16) public whitelist; mapping(address => bool) public blacklist; mapping(uint => bool) public anotherNFTIdMinted; mapping(address => uint16) public pandasBalance; mapping(address => uint16) public pandanatorsBalance; ERC721Enumerable public anotherNFT; SteamedBuns public steamedBuns; constructor() ERC721("Retro Pandas", "RetroPandas") { anotherNFT = ERC721Enumerable(address(0x9BfA45382268E4BacbD1175395728153dC5248f2)); } function mint(uint pandasToMint) public payable { require(blacklist[msg.sender] != true, "User is blacklisted"); require(mintStarted, "Mint is not started"); require(pandasToMint <= batchLimit, "Not in batch limit"); require(msg.value.mul(pandasToMint) >= mintPrice, "Not enough ether"); require(pandasMinted + pandasToMint <= maxPandas, "Too much pandas to mint"); for(uint16 i = 0; i < pandasToMint; i++) { uint256 id = pandasMinted + 1; _mint(msg.sender, id); pandasMinted += 1; } steamedBuns.registerUser(msg.sender); } function whitelistMint(uint pandasToMint) public { require(blacklist[msg.sender] != true, "User is blacklisted"); require(mintWhitelistStarted, "Mint for whitelist is not started"); require(pandasMinted + pandasToMint <= maxPandas, "Too much pandas to mint"); uint allowedPandasToMint = totalMintable(); require(allowedPandasToMint >= pandasToMint, "Sender is not allowed to mint that amount of pandas"); uint pandas = 0; // first mint by tokens in another NFT uint balance = anotherNFT.balanceOf(msg.sender); for(uint i = 0; i < balance && pandas < pandasToMint; i++) { uint tokenId = anotherNFT.tokenOfOwnerByIndex(msg.sender, i); if(!anotherNFTIdMinted[tokenId]) { uint256 id = pandasMinted + 1; anotherNFTIdMinted[tokenId] = true; pandas += 1; _mint(msg.sender, id); pandasMinted += 1; } } // then mint by whitelist for(uint i = pandas; i < pandasToMint; i++) { uint256 id = pandasMinted + 1; _mint(msg.sender, id); pandasMinted += 1; whitelist[msg.sender] -= 1; } steamedBuns.registerUser(msg.sender); } function totalMintable() public view returns(uint) { return whitelist[msg.sender] + anotherNFTMintable(msg.sender); } function anotherNFTMintable(address user) private view returns(uint) { uint balance = anotherNFT.balanceOf(user); uint mintable = 0; for(uint i = 0; i < balance; i++) { uint tokenId = anotherNFT.tokenOfOwnerByIndex(msg.sender, i); if(!anotherNFTIdMinted[tokenId]) { mintable += 1; } } return mintable; } function withdraw() public onlyOwner { payable(owner()).transfer(address(this).balance); } function assemblePandanator() public { steamedBuns.burn(msg.sender, assemblePrice); uint256 id = maxPandas + pandanatorsAssembled + 1; _mint(msg.sender, id); pandanatorsAssembled += 1; } function claimReward() public { steamedBuns.updateReward(msg.sender); steamedBuns.claimReward(msg.sender); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override { super._beforeTokenTransfer(from, to, tokenId); updateInfoOnTranfer(from, -1, tokenId); updateInfoOnTranfer(to, 1, tokenId); } function updateInfoOnTranfer(address user, int16 balanceChange, uint tokenId) private { if (user != address(0)) { steamedBuns.updateReward(user); if (tokenId <= maxPandas) { pandasBalance[user] = uint16(int16(pandasBalance[user]) + balanceChange); } else { pandanatorsBalance[user] = uint16(int16(pandanatorsBalance[user]) + balanceChange); } } } function _baseURI() internal view override returns (string memory) { return baseURI; } function setBaseURI(string memory newBaseURI) external onlyOwner { baseURI = newBaseURI; } function setSteamedBuns(address contractAddress) external onlyOwner { steamedBuns = SteamedBuns(contractAddress); } function startWhitelistMint() external onlyOwner { mintWhitelistStarted = true; } function pauseWhitelistMint() external onlyOwner { mintWhitelistStarted = false; } function startMint() external onlyOwner { mintStarted = true; } function pauseMint() external onlyOwner { mintStarted = false; } function enableAssembling() external onlyOwner { assemblingEnabled = true; } function disableAssembling() external onlyOwner { assemblingEnabled = false; } function updateBlacklist(address[] memory users, bool[] memory blackListed) external onlyOwner { uint256 length = users.length; require(length == blackListed.length); for (uint256 i = 0; i < length; i++) { blacklist[users[i]] = blackListed[i]; } } function updateWhitelist(address[] memory users, uint16[] memory allowedPandas) external onlyOwner { uint256 length = users.length; require(length == allowedPandas.length); for (uint256 i = 0; i < length; i++) { whitelist[users[i]] = allowedPandas[i]; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"anotherNFT","outputs":[{"internalType":"contract ERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"anotherNFTIdMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assemblePandanator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assemblePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assemblingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"batchLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableAssembling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAssembling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPandanators","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPandas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pandasToMint","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintWhitelistStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pandanatorsAssembled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pandanatorsBalance","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pandasBalance","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pandasMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setSteamedBuns","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"steamedBuns","outputs":[{"internalType":"contract SteamedBuns","name":"","type":"address"}],"stateMutability":"view","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":"totalMintable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"bool[]","name":"blackListed","type":"bool[]"}],"name":"updateBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint16[]","name":"allowedPandas","type":"uint16[]"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pandasToMint","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600a60146101000a81548160ff0219169083151502179055506000600a60156101000a81548160ff0219169083151502179055506000600a60166101000a81548160ff0219169083151502179055506000600b556005600c556000600d556040518060600160405280603681526020016200626660369139600e9080519060200190620000959291906200028d565b50348015620000a357600080fd5b506040518060400160405280600c81526020017f526574726f2050616e64617300000000000000000000000000000000000000008152506040518060400160405280600b81526020017f526574726f50616e6461730000000000000000000000000000000000000000008152508160009080519060200190620001289291906200028d565b508060019080519060200190620001419291906200028d565b5050506200016462000158620001bf60201b60201c565b620001c760201b60201c565b739bfa45382268e4bacbd1175395728153dc5248f2601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003a2565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200029b906200033d565b90600052602060002090601f016020900481019282620002bf57600085556200030b565b82601f10620002da57805160ff19168380011785556200030b565b828001600101855582156200030b579182015b828111156200030a578251825591602001919060010190620002ed565b5b5090506200031a91906200031e565b5090565b5b80821115620003395760008160009055506001016200031f565b5090565b600060028204905060018216806200035657607f821691505b602082108114156200036d576200036c62000373565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615eb480620003b26000396000f3fe60806040526004361061031a5760003560e01c806388778735116101ab578063a9722cf3116100f7578063d79b7c0711610095578063f15553d21161006f578063f15553d214610b5b578063f2df9fb714610b72578063f2fde38b14610b9d578063f9f92be414610bc65761031a565b8063d79b7c0714610aca578063dbb311dc14610ae1578063e985e9c514610b1e5761031a565b8063b88a802f116100d1578063b88a802f14610a36578063b88d4fde14610a4d578063c87b56dd14610a76578063cd85cdb514610ab35761031a565b8063a9722cf3146109c9578063adb88996146109f4578063b70196d714610a1f5761031a565b806395d89b4111610164578063a0712d681161013e578063a0712d6814610942578063a109858b1461095e578063a22cb46514610989578063a72584dc146109b25761031a565b806395d89b41146108b15780639ad4949d146108dc5780639b19251a146109055761031a565b806388778735146107b1578063898596ee146107dc5780638da5cb5b146108075780638fef40391461083257806391ab00dc1461085d578063944c50a4146108885761031a565b806343f219581161026a57806369385ca311610223578063715018a6116101fd578063715018a6146107095780637907b22b146107205780637e73ee3a1461074b578063868ff4a2146107885761031a565b806369385ca3146106765780636c0360eb146106a157806370a08231146106cc5761031a565b806343f2195814610540578063474740b11461057d5780634f6ccce7146105a857806355f804b3146105e55780636352211e1461060e5780636817c76c1461064b5761031a565b806323b872dd116102d757806335ac3bcc116102b157806335ac3bcc146104c05780633ccfd60b146104d75780633d857400146104ee57806342842e0e146105175761031a565b806323b872dd146104435780632be095611461046c5780632f745c59146104835761031a565b806301ffc9a71461031f57806306fdde031461035c578063081812fc14610387578063095ea7b3146103c457806318160ddd146103ed57806321991d1f14610418575b600080fd5b34801561032b57600080fd5b50610346600480360381019061034191906147e5565b610c03565b6040516103539190614de6565b60405180910390f35b34801561036857600080fd5b50610371610c7d565b60405161037e9190614e37565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190614878565b610d0f565b6040516103bb9190614d56565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e691906146d1565b610d94565b005b3480156103f957600080fd5b50610402610eac565b60405161040f9190615194565b60405180910390f35b34801561042457600080fd5b5061042d610eb9565b60405161043a9190614de6565b60405180910390f35b34801561044f57600080fd5b5061046a600480360381019061046591906145cb565b610ecc565b005b34801561047857600080fd5b50610481610f2c565b005b34801561048f57600080fd5b506104aa60048036038101906104a591906146d1565b610fc5565b6040516104b79190615194565b60405180910390f35b3480156104cc57600080fd5b506104d561106a565b005b3480156104e357600080fd5b506104ec611103565b005b3480156104fa57600080fd5b5061051560048036038101906105109190614779565b6111cf565b005b34801561052357600080fd5b5061053e600480360381019061053991906145cb565b61135c565b005b34801561054c57600080fd5b5061056760048036038101906105629190614566565b61137c565b6040516105749190615179565b60405180910390f35b34801561058957600080fd5b5061059261139d565b60405161059f9190615194565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190614878565b6113a3565b6040516105dc9190615194565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190614837565b61143a565b005b34801561061a57600080fd5b5061063560048036038101906106309190614878565b6114d0565b6040516106429190614d56565b60405180910390f35b34801561065757600080fd5b50610660611582565b60405161066d9190615194565b60405180910390f35b34801561068257600080fd5b5061068b61158d565b6040516106989190615194565b60405180910390f35b3480156106ad57600080fd5b506106b6611593565b6040516106c39190614e37565b60405180910390f35b3480156106d857600080fd5b506106f360048036038101906106ee9190614566565b611621565b6040516107009190615194565b60405180910390f35b34801561071557600080fd5b5061071e6116d9565b005b34801561072c57600080fd5b50610735611761565b6040516107429190614de6565b60405180910390f35b34801561075757600080fd5b50610772600480360381019061076d9190614566565b611774565b60405161077f9190615179565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa9190614878565b611795565b005b3480156107bd57600080fd5b506107c6611ca2565b6040516107d39190615194565b60405180910390f35b3480156107e857600080fd5b506107f1611caf565b6040516107fe9190615194565b60405180910390f35b34801561081357600080fd5b5061081c611cb5565b6040516108299190614d56565b60405180910390f35b34801561083e57600080fd5b50610847611cdf565b6040516108549190615194565b60405180910390f35b34801561086957600080fd5b50610872611ce5565b60405161087f9190614e01565b60405180910390f35b34801561089457600080fd5b506108af60048036038101906108aa9190614566565b611d0b565b005b3480156108bd57600080fd5b506108c6611dcb565b6040516108d39190614e37565b60405180910390f35b3480156108e857600080fd5b5061090360048036038101906108fe919061470d565b611e5d565b005b34801561091157600080fd5b5061092c60048036038101906109279190614566565b611fe7565b6040516109399190615179565b60405180910390f35b61095c60048036038101906109579190614878565b612008565b005b34801561096a57600080fd5b506109736122c9565b6040516109809190614e1c565b60405180910390f35b34801561099557600080fd5b506109b060048036038101906109ab9190614695565b6122ef565b005b3480156109be57600080fd5b506109c7612470565b005b3480156109d557600080fd5b506109de612509565b6040516109eb9190614de6565b60405180910390f35b348015610a0057600080fd5b50610a0961251c565b604051610a169190615194565b60405180910390f35b348015610a2b57600080fd5b50610a34612588565b005b348015610a4257600080fd5b50610a4b612621565b005b348015610a5957600080fd5b50610a746004803603810190610a6f919061461a565b61273d565b005b348015610a8257600080fd5b50610a9d6004803603810190610a989190614878565b61279f565b604051610aaa9190614e37565b60405180910390f35b348015610abf57600080fd5b50610ac8612846565b005b348015610ad657600080fd5b50610adf6128df565b005b348015610aed57600080fd5b50610b086004803603810190610b039190614878565b612978565b604051610b159190614de6565b60405180910390f35b348015610b2a57600080fd5b50610b456004803603810190610b40919061458f565b612998565b604051610b529190614de6565b60405180910390f35b348015610b6757600080fd5b50610b70612a2c565b005b348015610b7e57600080fd5b50610b87612b0b565b604051610b949190615194565b60405180910390f35b348015610ba957600080fd5b50610bc46004803603810190610bbf9190614566565b612b11565b005b348015610bd257600080fd5b50610bed6004803603810190610be89190614566565b612c09565b604051610bfa9190614de6565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c765750610c7582612c29565b5b9050919050565b606060008054610c8c906155d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb8906155d5565b8015610d055780601f10610cda57610100808354040283529160200191610d05565b820191906000526020600020905b815481529060010190602001808311610ce857829003601f168201915b5050505050905090565b6000610d1a82612d0b565b610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5090615059565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d9f826114d0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e07906150f9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e2f612d77565b73ffffffffffffffffffffffffffffffffffffffff161480610e5e5750610e5d81610e58612d77565b612998565b5b610e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9490614f99565b60405180910390fd5b610ea78383612d7f565b505050565b6000600880549050905090565b600a60169054906101000a900460ff1681565b610edd610ed7612d77565b82612e38565b610f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1390615139565b60405180910390fd5b610f27838383612f16565b505050565b610f34612d77565b73ffffffffffffffffffffffffffffffffffffffff16610f52611cb5565b73ffffffffffffffffffffffffffffffffffffffff1614610fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9f90615079565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b6000610fd083611621565b8210611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100890614e79565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611072612d77565b73ffffffffffffffffffffffffffffffffffffffff16611090611cb5565b73ffffffffffffffffffffffffffffffffffffffff16146110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd90615079565b60405180910390fd5b6000600a60156101000a81548160ff021916908315150217905550565b61110b612d77565b73ffffffffffffffffffffffffffffffffffffffff16611129611cb5565b73ffffffffffffffffffffffffffffffffffffffff161461117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117690615079565b60405180910390fd5b611187611cb5565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111cc573d6000803e3d6000fd5b50565b6111d7612d77565b73ffffffffffffffffffffffffffffffffffffffff166111f5611cb5565b73ffffffffffffffffffffffffffffffffffffffff161461124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124290615079565b60405180910390fd5b6000825190508151811461125e57600080fd5b60005b81811015611356578281815181106112a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600f60008684815181106112e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550808061134e90615663565b915050611261565b50505050565b6113778383836040518060200160405280600081525061273d565b505050565b60126020528060005260406000206000915054906101000a900461ffff1681565b600c5481565b60006113ad610eac565b82106113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e590615159565b60405180910390fd5b60088281548110611428577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611442612d77565b73ffffffffffffffffffffffffffffffffffffffff16611460611cb5565b73ffffffffffffffffffffffffffffffffffffffff16146114b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ad90615079565b60405180910390fd5b80600e90805190602001906114cc92919061419e565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090614fd9565b60405180910390fd5b80915050919050565b66b1a2bc2ec5000081565b610bb881565b600e80546115a0906155d5565b80601f01602080910402602001604051908101604052809291908181526020018280546115cc906155d5565b80156116195780601f106115ee57610100808354040283529160200191611619565b820191906000526020600020905b8154815290600101906020018083116115fc57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168990614fb9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116e1612d77565b73ffffffffffffffffffffffffffffffffffffffff166116ff611cb5565b73ffffffffffffffffffffffffffffffffffffffff1614611755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174c90615079565b60405180910390fd5b61175f6000613172565b565b600a60159054906101000a900460ff1681565b60136020528060005260406000206000915054906101000a900461ffff1681565b60011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415611829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182090614ff9565b60405180910390fd5b600a60159054906101000a900460ff16611878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186f906150b9565b60405180910390fd5b610bb881600b546118899190615373565b11156118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614ef9565b60405180910390fd5b60006118d461251c565b905081811015611919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191090614f19565b60405180910390fd5b600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016119779190614d56565b60206040518083038186803b15801561198f57600080fd5b505afa1580156119a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c791906148a1565b905060005b81811080156119da57508483105b15611b3d576000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b8152600401611a3e929190614dbd565b60206040518083038186803b158015611a5657600080fd5b505afa158015611a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8e91906148a1565b90506011600082815260200190815260200160002060009054906101000a900460ff16611b295760006001600b54611ac69190615373565b905060016011600084815260200190815260200160002060006101000a81548160ff021916908315150217905550600185611b019190615373565b9450611b0d3382613238565b6001600b6000828254611b209190615373565b92505081905550505b508080611b3590615663565b9150506119cc565b5060008290505b84811015611c0e5760006001600b54611b5d9190615373565b9050611b693382613238565b6001600b6000828254611b7c9190615373565b925050819055506001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900461ffff16611be09190615454565b92506101000a81548161ffff021916908361ffff160217905550508080611c0690615663565b915050611b44565b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632199d5cd336040518263ffffffff1660e01b8152600401611c6a9190614d56565b600060405180830381600087803b158015611c8457600080fd5b505af1158015611c98573d6000803e3d6000fd5b5050505050505050565b681043561a882930000081565b600b5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61177081565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d13612d77565b73ffffffffffffffffffffffffffffffffffffffff16611d31611cb5565b73ffffffffffffffffffffffffffffffffffffffff1614611d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7e90615079565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060018054611dda906155d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611e06906155d5565b8015611e535780601f10611e2857610100808354040283529160200191611e53565b820191906000526020600020905b815481529060010190602001808311611e3657829003601f168201915b5050505050905090565b611e65612d77565b73ffffffffffffffffffffffffffffffffffffffff16611e83611cb5565b73ffffffffffffffffffffffffffffffffffffffff1614611ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed090615079565b60405180910390fd5b60008251905081518114611eec57600080fd5b60005b81811015611fe157828181518110611f30577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160106000868481518110611f75577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611fd990615663565b915050611eef565b50505050565b600f6020528060005260406000206000915054906101000a900461ffff1681565b60011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561209c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209390614ff9565b60405180910390fd5b600a60149054906101000a900460ff166120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e290615019565b60405180910390fd5b600c54811115612130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212790615119565b60405180910390fd5b66b1a2bc2ec5000061214b823461340690919063ffffffff16565b101561218c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218390614e59565b60405180910390fd5b610bb881600b5461219d9190615373565b11156121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d590614ef9565b60405180910390fd5b60005b818161ffff1610156122385760006001600b546121fe9190615373565b905061220a3382613238565b6001600b600082825461221d9190615373565b9250508190555050808061223090615638565b9150506121e1565b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632199d5cd336040518263ffffffff1660e01b81526004016122949190614d56565b600060405180830381600087803b1580156122ae57600080fd5b505af11580156122c2573d6000803e3d6000fd5b5050505050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122f7612d77565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c90614f59565b60405180910390fd5b8060056000612372612d77565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661241f612d77565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124649190614de6565b60405180910390a35050565b612478612d77565b73ffffffffffffffffffffffffffffffffffffffff16612496611cb5565b73ffffffffffffffffffffffffffffffffffffffff16146124ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e390615079565b60405180910390fd5b6001600a60166101000a81548160ff021916908315150217905550565b600a60149054906101000a900460ff1681565b60006125273361341c565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff1661ffff166125839190615373565b905090565b612590612d77565b73ffffffffffffffffffffffffffffffffffffffff166125ae611cb5565b73ffffffffffffffffffffffffffffffffffffffff1614612604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fb90615079565b60405180910390fd5b6001600a60156101000a81548160ff021916908315150217905550565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663632447c9336040518263ffffffff1660e01b815260040161267c9190614d56565b600060405180830381600087803b15801561269657600080fd5b505af11580156126aa573d6000803e3d6000fd5b50505050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d279c191336040518263ffffffff1660e01b81526004016127099190614d56565b600060405180830381600087803b15801561272357600080fd5b505af1158015612737573d6000803e3d6000fd5b50505050565b61274e612748612d77565b83612e38565b61278d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278490615139565b60405180910390fd5b612799848484846135dd565b50505050565b60606127aa82612d0b565b6127e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e0906150d9565b60405180910390fd5b60006127f3613639565b90506000815111612813576040518060200160405280600081525061283e565b8061281d846136cb565b60405160200161282e929190614d32565b6040516020818303038152906040525b915050919050565b61284e612d77565b73ffffffffffffffffffffffffffffffffffffffff1661286c611cb5565b73ffffffffffffffffffffffffffffffffffffffff16146128c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b990615079565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b6128e7612d77565b73ffffffffffffffffffffffffffffffffffffffff16612905611cb5565b73ffffffffffffffffffffffffffffffffffffffff161461295b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295290615079565b60405180910390fd5b6000600a60166101000a81548160ff021916908315150217905550565b60116020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33681043561a88293000006040518363ffffffff1660e01b8152600401612a92929190614dbd565b600060405180830381600087803b158015612aac57600080fd5b505af1158015612ac0573d6000803e3d6000fd5b5050505060006001600d54610bb8612ad89190615373565b612ae29190615373565b9050612aee3382613238565b6001600d6000828254612b019190615373565b9250508190555050565b600d5481565b612b19612d77565b73ffffffffffffffffffffffffffffffffffffffff16612b37611cb5565b73ffffffffffffffffffffffffffffffffffffffff1614612b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8490615079565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf490614eb9565b60405180910390fd5b612c0681613172565b50565b60106020528060005260406000206000915054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cf457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d045750612d0382613878565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612df2836114d0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e4382612d0b565b612e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7990614f79565b60405180910390fd5b6000612e8d836114d0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612efc57508373ffffffffffffffffffffffffffffffffffffffff16612ee484610d0f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f0d5750612f0c8185612998565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f36826114d0565b73ffffffffffffffffffffffffffffffffffffffff1614612f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8390615099565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff390614f39565b60405180910390fd5b6130078383836138e2565b613012600082612d7f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130629190615488565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130b99190615373565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329f90615039565b60405180910390fd5b6132b181612d0b565b156132f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e890614ed9565b60405180910390fd5b6132fd600083836138e2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461334d9190615373565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000818361341491906153fa565b905092915050565b600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161347a9190614d56565b60206040518083038186803b15801561349257600080fd5b505afa1580156134a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ca91906148a1565b90506000805b828110156135d2576000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b8152600401613537929190614dbd565b60206040518083038186803b15801561354f57600080fd5b505afa158015613563573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358791906148a1565b90506011600082815260200190815260200160002060009054906101000a900460ff166135be576001836135bb9190615373565b92505b5080806135ca90615663565b9150506134d0565b508092505050919050565b6135e8848484612f16565b6135f484848484613929565b613633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362a90614e99565b60405180910390fd5b50505050565b6060600e8054613648906155d5565b80601f0160208091040260200160405190810160405280929190818152602001828054613674906155d5565b80156136c15780601f10613696576101008083540402835291602001916136c1565b820191906000526020600020905b8154815290600101906020018083116136a457829003601f168201915b5050505050905090565b60606000821415613713576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613873565b600082905060005b6000821461374557808061372e90615663565b915050600a8261373e91906153c9565b915061371b565b60008167ffffffffffffffff811115613787577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156137b95781602001600182028036833780820191505090505b5090505b6000851461386c576001826137d29190615488565b9150600a856137e191906156ac565b60306137ed9190615373565b60f81b818381518110613829577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561386591906153c9565b94506137bd565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6138ed838383613ac0565b613918837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83613bd4565b61392482600183613bd4565b505050565b600061394a8473ffffffffffffffffffffffffffffffffffffffff16613e0e565b15613ab3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613973612d77565b8786866040518563ffffffff1660e01b81526004016139959493929190614d71565b602060405180830381600087803b1580156139af57600080fd5b505af19250505080156139e057506040513d601f19601f820116820180604052508101906139dd919061480e565b60015b613a63573d8060008114613a10576040519150601f19603f3d011682016040523d82523d6000602084013e613a15565b606091505b50600081511415613a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a5290614e99565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613ab8565b600190505b949350505050565b613acb838383613e21565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613b0e57613b0981613e26565b613b4d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613b4c57613b4b8382613e6f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b9057613b8b81613fdc565b613bcf565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613bce57613bcd828261411f565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613e0957601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663632447c9846040518263ffffffff1660e01b8152600401613c639190614d56565b600060405180830381600087803b158015613c7d57600080fd5b505af1158015613c91573d6000803e3d6000fd5b50505050610bb88111613d555781601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff16613cf791906152fd565b601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550613e08565b81601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff16613dae91906152fd565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055505b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613e7c84611621565b613e869190615488565b9050600060076000848152602001908152602001600020549050818114613f6b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613ff09190615488565b9050600060096000848152602001908152602001600020549050600060088381548110614046577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061408e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480614103577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061412a83611621565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546141aa906155d5565b90600052602060002090601f0160209004810192826141cc5760008555614213565b82601f106141e557805160ff1916838001178555614213565b82800160010185558215614213579182015b828111156142125782518255916020019190600101906141f7565b5b5090506142209190614224565b5090565b5b8082111561423d576000816000905550600101614225565b5090565b600061425461424f846151d4565b6151af565b9050808382526020820190508285602086028201111561427357600080fd5b60005b858110156142a357816142898882614401565b845260208401935060208301925050600181019050614276565b5050509392505050565b60006142c06142bb84615200565b6151af565b905080838252602082019050828560208602820111156142df57600080fd5b60005b8581101561430f57816142f58882614494565b8452602084019350602083019250506001810190506142e2565b5050509392505050565b600061432c6143278461522c565b6151af565b9050808382526020820190508285602086028201111561434b57600080fd5b60005b8581101561437b57816143618882614527565b84526020840193506020830192505060018101905061434e565b5050509392505050565b600061439861439384615258565b6151af565b9050828152602081018484840111156143b057600080fd5b6143bb848285615593565b509392505050565b60006143d66143d184615289565b6151af565b9050828152602081018484840111156143ee57600080fd5b6143f9848285615593565b509392505050565b60008135905061441081615e0b565b92915050565b600082601f83011261442757600080fd5b8135614437848260208601614241565b91505092915050565b600082601f83011261445157600080fd5b81356144618482602086016142ad565b91505092915050565b600082601f83011261447b57600080fd5b813561448b848260208601614319565b91505092915050565b6000813590506144a381615e22565b92915050565b6000813590506144b881615e39565b92915050565b6000815190506144cd81615e39565b92915050565b600082601f8301126144e457600080fd5b81356144f4848260208601614385565b91505092915050565b600082601f83011261450e57600080fd5b813561451e8482602086016143c3565b91505092915050565b60008135905061453681615e50565b92915050565b60008135905061454b81615e67565b92915050565b60008151905061456081615e67565b92915050565b60006020828403121561457857600080fd5b600061458684828501614401565b91505092915050565b600080604083850312156145a257600080fd5b60006145b085828601614401565b92505060206145c185828601614401565b9150509250929050565b6000806000606084860312156145e057600080fd5b60006145ee86828701614401565b93505060206145ff86828701614401565b92505060406146108682870161453c565b9150509250925092565b6000806000806080858703121561463057600080fd5b600061463e87828801614401565b945050602061464f87828801614401565b93505060406146608782880161453c565b925050606085013567ffffffffffffffff81111561467d57600080fd5b614689878288016144d3565b91505092959194509250565b600080604083850312156146a857600080fd5b60006146b685828601614401565b92505060206146c785828601614494565b9150509250929050565b600080604083850312156146e457600080fd5b60006146f285828601614401565b92505060206147038582860161453c565b9150509250929050565b6000806040838503121561472057600080fd5b600083013567ffffffffffffffff81111561473a57600080fd5b61474685828601614416565b925050602083013567ffffffffffffffff81111561476357600080fd5b61476f85828601614440565b9150509250929050565b6000806040838503121561478c57600080fd5b600083013567ffffffffffffffff8111156147a657600080fd5b6147b285828601614416565b925050602083013567ffffffffffffffff8111156147cf57600080fd5b6147db8582860161446a565b9150509250929050565b6000602082840312156147f757600080fd5b6000614805848285016144a9565b91505092915050565b60006020828403121561482057600080fd5b600061482e848285016144be565b91505092915050565b60006020828403121561484957600080fd5b600082013567ffffffffffffffff81111561486357600080fd5b61486f848285016144fd565b91505092915050565b60006020828403121561488a57600080fd5b60006148988482850161453c565b91505092915050565b6000602082840312156148b357600080fd5b60006148c184828501614551565b91505092915050565b6148d3816154bc565b82525050565b6148e2816154ce565b82525050565b60006148f3826152ba565b6148fd81856152d0565b935061490d8185602086016155a2565b61491681615799565b840191505092915050565b61492a8161554b565b82525050565b6149398161556f565b82525050565b600061494a826152c5565b61495481856152e1565b93506149648185602086016155a2565b61496d81615799565b840191505092915050565b6000614983826152c5565b61498d81856152f2565b935061499d8185602086016155a2565b80840191505092915050565b60006149b66010836152e1565b91506149c1826157aa565b602082019050919050565b60006149d9602b836152e1565b91506149e4826157d3565b604082019050919050565b60006149fc6032836152e1565b9150614a0782615822565b604082019050919050565b6000614a1f6026836152e1565b9150614a2a82615871565b604082019050919050565b6000614a42601c836152e1565b9150614a4d826158c0565b602082019050919050565b6000614a656017836152e1565b9150614a70826158e9565b602082019050919050565b6000614a886033836152e1565b9150614a9382615912565b604082019050919050565b6000614aab6024836152e1565b9150614ab682615961565b604082019050919050565b6000614ace6019836152e1565b9150614ad9826159b0565b602082019050919050565b6000614af1602c836152e1565b9150614afc826159d9565b604082019050919050565b6000614b146038836152e1565b9150614b1f82615a28565b604082019050919050565b6000614b37602a836152e1565b9150614b4282615a77565b604082019050919050565b6000614b5a6029836152e1565b9150614b6582615ac6565b604082019050919050565b6000614b7d6013836152e1565b9150614b8882615b15565b602082019050919050565b6000614ba06013836152e1565b9150614bab82615b3e565b602082019050919050565b6000614bc36020836152e1565b9150614bce82615b67565b602082019050919050565b6000614be6602c836152e1565b9150614bf182615b90565b604082019050919050565b6000614c096020836152e1565b9150614c1482615bdf565b602082019050919050565b6000614c2c6029836152e1565b9150614c3782615c08565b604082019050919050565b6000614c4f6021836152e1565b9150614c5a82615c57565b604082019050919050565b6000614c72602f836152e1565b9150614c7d82615ca6565b604082019050919050565b6000614c956021836152e1565b9150614ca082615cf5565b604082019050919050565b6000614cb86012836152e1565b9150614cc382615d44565b602082019050919050565b6000614cdb6031836152e1565b9150614ce682615d6d565b604082019050919050565b6000614cfe602c836152e1565b9150614d0982615dbc565b604082019050919050565b614d1d81615513565b82525050565b614d2c81615541565b82525050565b6000614d3e8285614978565b9150614d4a8284614978565b91508190509392505050565b6000602082019050614d6b60008301846148ca565b92915050565b6000608082019050614d8660008301876148ca565b614d9360208301866148ca565b614da06040830185614d23565b8181036060830152614db281846148e8565b905095945050505050565b6000604082019050614dd260008301856148ca565b614ddf6020830184614d23565b9392505050565b6000602082019050614dfb60008301846148d9565b92915050565b6000602082019050614e166000830184614921565b92915050565b6000602082019050614e316000830184614930565b92915050565b60006020820190508181036000830152614e51818461493f565b905092915050565b60006020820190508181036000830152614e72816149a9565b9050919050565b60006020820190508181036000830152614e92816149cc565b9050919050565b60006020820190508181036000830152614eb2816149ef565b9050919050565b60006020820190508181036000830152614ed281614a12565b9050919050565b60006020820190508181036000830152614ef281614a35565b9050919050565b60006020820190508181036000830152614f1281614a58565b9050919050565b60006020820190508181036000830152614f3281614a7b565b9050919050565b60006020820190508181036000830152614f5281614a9e565b9050919050565b60006020820190508181036000830152614f7281614ac1565b9050919050565b60006020820190508181036000830152614f9281614ae4565b9050919050565b60006020820190508181036000830152614fb281614b07565b9050919050565b60006020820190508181036000830152614fd281614b2a565b9050919050565b60006020820190508181036000830152614ff281614b4d565b9050919050565b6000602082019050818103600083015261501281614b70565b9050919050565b6000602082019050818103600083015261503281614b93565b9050919050565b6000602082019050818103600083015261505281614bb6565b9050919050565b6000602082019050818103600083015261507281614bd9565b9050919050565b6000602082019050818103600083015261509281614bfc565b9050919050565b600060208201905081810360008301526150b281614c1f565b9050919050565b600060208201905081810360008301526150d281614c42565b9050919050565b600060208201905081810360008301526150f281614c65565b9050919050565b6000602082019050818103600083015261511281614c88565b9050919050565b6000602082019050818103600083015261513281614cab565b9050919050565b6000602082019050818103600083015261515281614cce565b9050919050565b6000602082019050818103600083015261517281614cf1565b9050919050565b600060208201905061518e6000830184614d14565b92915050565b60006020820190506151a96000830184614d23565b92915050565b60006151b96151ca565b90506151c58282615607565b919050565b6000604051905090565b600067ffffffffffffffff8211156151ef576151ee61576a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561521b5761521a61576a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156152475761524661576a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156152735761527261576a565b5b61527c82615799565b9050602081019050919050565b600067ffffffffffffffff8211156152a4576152a361576a565b5b6152ad82615799565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061530882615506565b915061531383615506565b925081617fff038313600083121516156153305761532f6156dd565b5b817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000038312600083121615615368576153676156dd565b5b828201905092915050565b600061537e82615541565b915061538983615541565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153be576153bd6156dd565b5b828201905092915050565b60006153d482615541565b91506153df83615541565b9250826153ef576153ee61570c565b5b828204905092915050565b600061540582615541565b915061541083615541565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615449576154486156dd565b5b828202905092915050565b600061545f82615513565b915061546a83615513565b92508282101561547d5761547c6156dd565b5b828203905092915050565b600061549382615541565b915061549e83615541565b9250828210156154b1576154b06156dd565b5b828203905092915050565b60006154c782615521565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008160010b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006155568261555d565b9050919050565b600061556882615521565b9050919050565b600061557a82615581565b9050919050565b600061558c82615521565b9050919050565b82818337600083830152505050565b60005b838110156155c05780820151818401526020810190506155a5565b838111156155cf576000848401525b50505050565b600060028204905060018216806155ed57607f821691505b602082108114156156015761560061573b565b5b50919050565b61561082615799565b810181811067ffffffffffffffff8211171561562f5761562e61576a565b5b80604052505050565b600061564382615513565b915061ffff821415615658576156576156dd565b5b600182019050919050565b600061566e82615541565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156a1576156a06156dd565b5b600182019050919050565b60006156b782615541565b91506156c283615541565b9250826156d2576156d161570c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4e6f7420656e6f75676820657468657200000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f546f6f206d7563682070616e64617320746f206d696e74000000000000000000600082015250565b7f53656e646572206973206e6f7420616c6c6f77656420746f206d696e7420746860008201527f617420616d6f756e74206f662070616e64617300000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5573657220697320626c61636b6c697374656400000000000000000000000000600082015250565b7f4d696e74206973206e6f74207374617274656400000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4d696e7420666f722077686974656c697374206973206e6f742073746172746560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420696e206261746368206c696d69740000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b615e14816154bc565b8114615e1f57600080fd5b50565b615e2b816154ce565b8114615e3657600080fd5b50565b615e42816154da565b8114615e4d57600080fd5b50565b615e5981615513565b8114615e6457600080fd5b50565b615e7081615541565b8114615e7b57600080fd5b5056fea264697066735822122049dca19281665cbb91699d25c121efc44440b28ddd95f83c5eaac010619a414e64736f6c63430008040033697066733a2f2f516d506a31346a3855577175345178466e7178465444714d635a51746647334e5a5a5574665153524a59665679742f
Deployed Bytecode
0x60806040526004361061031a5760003560e01c806388778735116101ab578063a9722cf3116100f7578063d79b7c0711610095578063f15553d21161006f578063f15553d214610b5b578063f2df9fb714610b72578063f2fde38b14610b9d578063f9f92be414610bc65761031a565b8063d79b7c0714610aca578063dbb311dc14610ae1578063e985e9c514610b1e5761031a565b8063b88a802f116100d1578063b88a802f14610a36578063b88d4fde14610a4d578063c87b56dd14610a76578063cd85cdb514610ab35761031a565b8063a9722cf3146109c9578063adb88996146109f4578063b70196d714610a1f5761031a565b806395d89b4111610164578063a0712d681161013e578063a0712d6814610942578063a109858b1461095e578063a22cb46514610989578063a72584dc146109b25761031a565b806395d89b41146108b15780639ad4949d146108dc5780639b19251a146109055761031a565b806388778735146107b1578063898596ee146107dc5780638da5cb5b146108075780638fef40391461083257806391ab00dc1461085d578063944c50a4146108885761031a565b806343f219581161026a57806369385ca311610223578063715018a6116101fd578063715018a6146107095780637907b22b146107205780637e73ee3a1461074b578063868ff4a2146107885761031a565b806369385ca3146106765780636c0360eb146106a157806370a08231146106cc5761031a565b806343f2195814610540578063474740b11461057d5780634f6ccce7146105a857806355f804b3146105e55780636352211e1461060e5780636817c76c1461064b5761031a565b806323b872dd116102d757806335ac3bcc116102b157806335ac3bcc146104c05780633ccfd60b146104d75780633d857400146104ee57806342842e0e146105175761031a565b806323b872dd146104435780632be095611461046c5780632f745c59146104835761031a565b806301ffc9a71461031f57806306fdde031461035c578063081812fc14610387578063095ea7b3146103c457806318160ddd146103ed57806321991d1f14610418575b600080fd5b34801561032b57600080fd5b50610346600480360381019061034191906147e5565b610c03565b6040516103539190614de6565b60405180910390f35b34801561036857600080fd5b50610371610c7d565b60405161037e9190614e37565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190614878565b610d0f565b6040516103bb9190614d56565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e691906146d1565b610d94565b005b3480156103f957600080fd5b50610402610eac565b60405161040f9190615194565b60405180910390f35b34801561042457600080fd5b5061042d610eb9565b60405161043a9190614de6565b60405180910390f35b34801561044f57600080fd5b5061046a600480360381019061046591906145cb565b610ecc565b005b34801561047857600080fd5b50610481610f2c565b005b34801561048f57600080fd5b506104aa60048036038101906104a591906146d1565b610fc5565b6040516104b79190615194565b60405180910390f35b3480156104cc57600080fd5b506104d561106a565b005b3480156104e357600080fd5b506104ec611103565b005b3480156104fa57600080fd5b5061051560048036038101906105109190614779565b6111cf565b005b34801561052357600080fd5b5061053e600480360381019061053991906145cb565b61135c565b005b34801561054c57600080fd5b5061056760048036038101906105629190614566565b61137c565b6040516105749190615179565b60405180910390f35b34801561058957600080fd5b5061059261139d565b60405161059f9190615194565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190614878565b6113a3565b6040516105dc9190615194565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190614837565b61143a565b005b34801561061a57600080fd5b5061063560048036038101906106309190614878565b6114d0565b6040516106429190614d56565b60405180910390f35b34801561065757600080fd5b50610660611582565b60405161066d9190615194565b60405180910390f35b34801561068257600080fd5b5061068b61158d565b6040516106989190615194565b60405180910390f35b3480156106ad57600080fd5b506106b6611593565b6040516106c39190614e37565b60405180910390f35b3480156106d857600080fd5b506106f360048036038101906106ee9190614566565b611621565b6040516107009190615194565b60405180910390f35b34801561071557600080fd5b5061071e6116d9565b005b34801561072c57600080fd5b50610735611761565b6040516107429190614de6565b60405180910390f35b34801561075757600080fd5b50610772600480360381019061076d9190614566565b611774565b60405161077f9190615179565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa9190614878565b611795565b005b3480156107bd57600080fd5b506107c6611ca2565b6040516107d39190615194565b60405180910390f35b3480156107e857600080fd5b506107f1611caf565b6040516107fe9190615194565b60405180910390f35b34801561081357600080fd5b5061081c611cb5565b6040516108299190614d56565b60405180910390f35b34801561083e57600080fd5b50610847611cdf565b6040516108549190615194565b60405180910390f35b34801561086957600080fd5b50610872611ce5565b60405161087f9190614e01565b60405180910390f35b34801561089457600080fd5b506108af60048036038101906108aa9190614566565b611d0b565b005b3480156108bd57600080fd5b506108c6611dcb565b6040516108d39190614e37565b60405180910390f35b3480156108e857600080fd5b5061090360048036038101906108fe919061470d565b611e5d565b005b34801561091157600080fd5b5061092c60048036038101906109279190614566565b611fe7565b6040516109399190615179565b60405180910390f35b61095c60048036038101906109579190614878565b612008565b005b34801561096a57600080fd5b506109736122c9565b6040516109809190614e1c565b60405180910390f35b34801561099557600080fd5b506109b060048036038101906109ab9190614695565b6122ef565b005b3480156109be57600080fd5b506109c7612470565b005b3480156109d557600080fd5b506109de612509565b6040516109eb9190614de6565b60405180910390f35b348015610a0057600080fd5b50610a0961251c565b604051610a169190615194565b60405180910390f35b348015610a2b57600080fd5b50610a34612588565b005b348015610a4257600080fd5b50610a4b612621565b005b348015610a5957600080fd5b50610a746004803603810190610a6f919061461a565b61273d565b005b348015610a8257600080fd5b50610a9d6004803603810190610a989190614878565b61279f565b604051610aaa9190614e37565b60405180910390f35b348015610abf57600080fd5b50610ac8612846565b005b348015610ad657600080fd5b50610adf6128df565b005b348015610aed57600080fd5b50610b086004803603810190610b039190614878565b612978565b604051610b159190614de6565b60405180910390f35b348015610b2a57600080fd5b50610b456004803603810190610b40919061458f565b612998565b604051610b529190614de6565b60405180910390f35b348015610b6757600080fd5b50610b70612a2c565b005b348015610b7e57600080fd5b50610b87612b0b565b604051610b949190615194565b60405180910390f35b348015610ba957600080fd5b50610bc46004803603810190610bbf9190614566565b612b11565b005b348015610bd257600080fd5b50610bed6004803603810190610be89190614566565b612c09565b604051610bfa9190614de6565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c765750610c7582612c29565b5b9050919050565b606060008054610c8c906155d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb8906155d5565b8015610d055780601f10610cda57610100808354040283529160200191610d05565b820191906000526020600020905b815481529060010190602001808311610ce857829003601f168201915b5050505050905090565b6000610d1a82612d0b565b610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5090615059565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d9f826114d0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e07906150f9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e2f612d77565b73ffffffffffffffffffffffffffffffffffffffff161480610e5e5750610e5d81610e58612d77565b612998565b5b610e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9490614f99565b60405180910390fd5b610ea78383612d7f565b505050565b6000600880549050905090565b600a60169054906101000a900460ff1681565b610edd610ed7612d77565b82612e38565b610f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1390615139565b60405180910390fd5b610f27838383612f16565b505050565b610f34612d77565b73ffffffffffffffffffffffffffffffffffffffff16610f52611cb5565b73ffffffffffffffffffffffffffffffffffffffff1614610fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9f90615079565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b6000610fd083611621565b8210611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100890614e79565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611072612d77565b73ffffffffffffffffffffffffffffffffffffffff16611090611cb5565b73ffffffffffffffffffffffffffffffffffffffff16146110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd90615079565b60405180910390fd5b6000600a60156101000a81548160ff021916908315150217905550565b61110b612d77565b73ffffffffffffffffffffffffffffffffffffffff16611129611cb5565b73ffffffffffffffffffffffffffffffffffffffff161461117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117690615079565b60405180910390fd5b611187611cb5565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111cc573d6000803e3d6000fd5b50565b6111d7612d77565b73ffffffffffffffffffffffffffffffffffffffff166111f5611cb5565b73ffffffffffffffffffffffffffffffffffffffff161461124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124290615079565b60405180910390fd5b6000825190508151811461125e57600080fd5b60005b81811015611356578281815181106112a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600f60008684815181106112e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550808061134e90615663565b915050611261565b50505050565b6113778383836040518060200160405280600081525061273d565b505050565b60126020528060005260406000206000915054906101000a900461ffff1681565b600c5481565b60006113ad610eac565b82106113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e590615159565b60405180910390fd5b60088281548110611428577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611442612d77565b73ffffffffffffffffffffffffffffffffffffffff16611460611cb5565b73ffffffffffffffffffffffffffffffffffffffff16146114b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ad90615079565b60405180910390fd5b80600e90805190602001906114cc92919061419e565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090614fd9565b60405180910390fd5b80915050919050565b66b1a2bc2ec5000081565b610bb881565b600e80546115a0906155d5565b80601f01602080910402602001604051908101604052809291908181526020018280546115cc906155d5565b80156116195780601f106115ee57610100808354040283529160200191611619565b820191906000526020600020905b8154815290600101906020018083116115fc57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168990614fb9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116e1612d77565b73ffffffffffffffffffffffffffffffffffffffff166116ff611cb5565b73ffffffffffffffffffffffffffffffffffffffff1614611755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174c90615079565b60405180910390fd5b61175f6000613172565b565b600a60159054906101000a900460ff1681565b60136020528060005260406000206000915054906101000a900461ffff1681565b60011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415611829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182090614ff9565b60405180910390fd5b600a60159054906101000a900460ff16611878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186f906150b9565b60405180910390fd5b610bb881600b546118899190615373565b11156118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614ef9565b60405180910390fd5b60006118d461251c565b905081811015611919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191090614f19565b60405180910390fd5b600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016119779190614d56565b60206040518083038186803b15801561198f57600080fd5b505afa1580156119a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c791906148a1565b905060005b81811080156119da57508483105b15611b3d576000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b8152600401611a3e929190614dbd565b60206040518083038186803b158015611a5657600080fd5b505afa158015611a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8e91906148a1565b90506011600082815260200190815260200160002060009054906101000a900460ff16611b295760006001600b54611ac69190615373565b905060016011600084815260200190815260200160002060006101000a81548160ff021916908315150217905550600185611b019190615373565b9450611b0d3382613238565b6001600b6000828254611b209190615373565b92505081905550505b508080611b3590615663565b9150506119cc565b5060008290505b84811015611c0e5760006001600b54611b5d9190615373565b9050611b693382613238565b6001600b6000828254611b7c9190615373565b925050819055506001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900461ffff16611be09190615454565b92506101000a81548161ffff021916908361ffff160217905550508080611c0690615663565b915050611b44565b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632199d5cd336040518263ffffffff1660e01b8152600401611c6a9190614d56565b600060405180830381600087803b158015611c8457600080fd5b505af1158015611c98573d6000803e3d6000fd5b5050505050505050565b681043561a882930000081565b600b5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61177081565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d13612d77565b73ffffffffffffffffffffffffffffffffffffffff16611d31611cb5565b73ffffffffffffffffffffffffffffffffffffffff1614611d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7e90615079565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060018054611dda906155d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611e06906155d5565b8015611e535780601f10611e2857610100808354040283529160200191611e53565b820191906000526020600020905b815481529060010190602001808311611e3657829003601f168201915b5050505050905090565b611e65612d77565b73ffffffffffffffffffffffffffffffffffffffff16611e83611cb5565b73ffffffffffffffffffffffffffffffffffffffff1614611ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed090615079565b60405180910390fd5b60008251905081518114611eec57600080fd5b60005b81811015611fe157828181518110611f30577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160106000868481518110611f75577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611fd990615663565b915050611eef565b50505050565b600f6020528060005260406000206000915054906101000a900461ffff1681565b60011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561209c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209390614ff9565b60405180910390fd5b600a60149054906101000a900460ff166120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e290615019565b60405180910390fd5b600c54811115612130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212790615119565b60405180910390fd5b66b1a2bc2ec5000061214b823461340690919063ffffffff16565b101561218c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218390614e59565b60405180910390fd5b610bb881600b5461219d9190615373565b11156121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d590614ef9565b60405180910390fd5b60005b818161ffff1610156122385760006001600b546121fe9190615373565b905061220a3382613238565b6001600b600082825461221d9190615373565b9250508190555050808061223090615638565b9150506121e1565b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632199d5cd336040518263ffffffff1660e01b81526004016122949190614d56565b600060405180830381600087803b1580156122ae57600080fd5b505af11580156122c2573d6000803e3d6000fd5b5050505050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122f7612d77565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c90614f59565b60405180910390fd5b8060056000612372612d77565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661241f612d77565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124649190614de6565b60405180910390a35050565b612478612d77565b73ffffffffffffffffffffffffffffffffffffffff16612496611cb5565b73ffffffffffffffffffffffffffffffffffffffff16146124ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e390615079565b60405180910390fd5b6001600a60166101000a81548160ff021916908315150217905550565b600a60149054906101000a900460ff1681565b60006125273361341c565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff1661ffff166125839190615373565b905090565b612590612d77565b73ffffffffffffffffffffffffffffffffffffffff166125ae611cb5565b73ffffffffffffffffffffffffffffffffffffffff1614612604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fb90615079565b60405180910390fd5b6001600a60156101000a81548160ff021916908315150217905550565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663632447c9336040518263ffffffff1660e01b815260040161267c9190614d56565b600060405180830381600087803b15801561269657600080fd5b505af11580156126aa573d6000803e3d6000fd5b50505050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d279c191336040518263ffffffff1660e01b81526004016127099190614d56565b600060405180830381600087803b15801561272357600080fd5b505af1158015612737573d6000803e3d6000fd5b50505050565b61274e612748612d77565b83612e38565b61278d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278490615139565b60405180910390fd5b612799848484846135dd565b50505050565b60606127aa82612d0b565b6127e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e0906150d9565b60405180910390fd5b60006127f3613639565b90506000815111612813576040518060200160405280600081525061283e565b8061281d846136cb565b60405160200161282e929190614d32565b6040516020818303038152906040525b915050919050565b61284e612d77565b73ffffffffffffffffffffffffffffffffffffffff1661286c611cb5565b73ffffffffffffffffffffffffffffffffffffffff16146128c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b990615079565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b6128e7612d77565b73ffffffffffffffffffffffffffffffffffffffff16612905611cb5565b73ffffffffffffffffffffffffffffffffffffffff161461295b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295290615079565b60405180910390fd5b6000600a60166101000a81548160ff021916908315150217905550565b60116020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33681043561a88293000006040518363ffffffff1660e01b8152600401612a92929190614dbd565b600060405180830381600087803b158015612aac57600080fd5b505af1158015612ac0573d6000803e3d6000fd5b5050505060006001600d54610bb8612ad89190615373565b612ae29190615373565b9050612aee3382613238565b6001600d6000828254612b019190615373565b9250508190555050565b600d5481565b612b19612d77565b73ffffffffffffffffffffffffffffffffffffffff16612b37611cb5565b73ffffffffffffffffffffffffffffffffffffffff1614612b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8490615079565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf490614eb9565b60405180910390fd5b612c0681613172565b50565b60106020528060005260406000206000915054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cf457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d045750612d0382613878565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612df2836114d0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e4382612d0b565b612e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7990614f79565b60405180910390fd5b6000612e8d836114d0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612efc57508373ffffffffffffffffffffffffffffffffffffffff16612ee484610d0f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f0d5750612f0c8185612998565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f36826114d0565b73ffffffffffffffffffffffffffffffffffffffff1614612f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8390615099565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff390614f39565b60405180910390fd5b6130078383836138e2565b613012600082612d7f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130629190615488565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130b99190615373565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329f90615039565b60405180910390fd5b6132b181612d0b565b156132f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e890614ed9565b60405180910390fd5b6132fd600083836138e2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461334d9190615373565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000818361341491906153fa565b905092915050565b600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161347a9190614d56565b60206040518083038186803b15801561349257600080fd5b505afa1580156134a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ca91906148a1565b90506000805b828110156135d2576000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b8152600401613537929190614dbd565b60206040518083038186803b15801561354f57600080fd5b505afa158015613563573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358791906148a1565b90506011600082815260200190815260200160002060009054906101000a900460ff166135be576001836135bb9190615373565b92505b5080806135ca90615663565b9150506134d0565b508092505050919050565b6135e8848484612f16565b6135f484848484613929565b613633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362a90614e99565b60405180910390fd5b50505050565b6060600e8054613648906155d5565b80601f0160208091040260200160405190810160405280929190818152602001828054613674906155d5565b80156136c15780601f10613696576101008083540402835291602001916136c1565b820191906000526020600020905b8154815290600101906020018083116136a457829003601f168201915b5050505050905090565b60606000821415613713576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613873565b600082905060005b6000821461374557808061372e90615663565b915050600a8261373e91906153c9565b915061371b565b60008167ffffffffffffffff811115613787577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156137b95781602001600182028036833780820191505090505b5090505b6000851461386c576001826137d29190615488565b9150600a856137e191906156ac565b60306137ed9190615373565b60f81b818381518110613829577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561386591906153c9565b94506137bd565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6138ed838383613ac0565b613918837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83613bd4565b61392482600183613bd4565b505050565b600061394a8473ffffffffffffffffffffffffffffffffffffffff16613e0e565b15613ab3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613973612d77565b8786866040518563ffffffff1660e01b81526004016139959493929190614d71565b602060405180830381600087803b1580156139af57600080fd5b505af19250505080156139e057506040513d601f19601f820116820180604052508101906139dd919061480e565b60015b613a63573d8060008114613a10576040519150601f19603f3d011682016040523d82523d6000602084013e613a15565b606091505b50600081511415613a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a5290614e99565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613ab8565b600190505b949350505050565b613acb838383613e21565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613b0e57613b0981613e26565b613b4d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613b4c57613b4b8382613e6f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b9057613b8b81613fdc565b613bcf565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613bce57613bcd828261411f565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613e0957601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663632447c9846040518263ffffffff1660e01b8152600401613c639190614d56565b600060405180830381600087803b158015613c7d57600080fd5b505af1158015613c91573d6000803e3d6000fd5b50505050610bb88111613d555781601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff16613cf791906152fd565b601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550613e08565b81601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff16613dae91906152fd565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055505b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613e7c84611621565b613e869190615488565b9050600060076000848152602001908152602001600020549050818114613f6b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613ff09190615488565b9050600060096000848152602001908152602001600020549050600060088381548110614046577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061408e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480614103577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061412a83611621565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546141aa906155d5565b90600052602060002090601f0160209004810192826141cc5760008555614213565b82601f106141e557805160ff1916838001178555614213565b82800160010185558215614213579182015b828111156142125782518255916020019190600101906141f7565b5b5090506142209190614224565b5090565b5b8082111561423d576000816000905550600101614225565b5090565b600061425461424f846151d4565b6151af565b9050808382526020820190508285602086028201111561427357600080fd5b60005b858110156142a357816142898882614401565b845260208401935060208301925050600181019050614276565b5050509392505050565b60006142c06142bb84615200565b6151af565b905080838252602082019050828560208602820111156142df57600080fd5b60005b8581101561430f57816142f58882614494565b8452602084019350602083019250506001810190506142e2565b5050509392505050565b600061432c6143278461522c565b6151af565b9050808382526020820190508285602086028201111561434b57600080fd5b60005b8581101561437b57816143618882614527565b84526020840193506020830192505060018101905061434e565b5050509392505050565b600061439861439384615258565b6151af565b9050828152602081018484840111156143b057600080fd5b6143bb848285615593565b509392505050565b60006143d66143d184615289565b6151af565b9050828152602081018484840111156143ee57600080fd5b6143f9848285615593565b509392505050565b60008135905061441081615e0b565b92915050565b600082601f83011261442757600080fd5b8135614437848260208601614241565b91505092915050565b600082601f83011261445157600080fd5b81356144618482602086016142ad565b91505092915050565b600082601f83011261447b57600080fd5b813561448b848260208601614319565b91505092915050565b6000813590506144a381615e22565b92915050565b6000813590506144b881615e39565b92915050565b6000815190506144cd81615e39565b92915050565b600082601f8301126144e457600080fd5b81356144f4848260208601614385565b91505092915050565b600082601f83011261450e57600080fd5b813561451e8482602086016143c3565b91505092915050565b60008135905061453681615e50565b92915050565b60008135905061454b81615e67565b92915050565b60008151905061456081615e67565b92915050565b60006020828403121561457857600080fd5b600061458684828501614401565b91505092915050565b600080604083850312156145a257600080fd5b60006145b085828601614401565b92505060206145c185828601614401565b9150509250929050565b6000806000606084860312156145e057600080fd5b60006145ee86828701614401565b93505060206145ff86828701614401565b92505060406146108682870161453c565b9150509250925092565b6000806000806080858703121561463057600080fd5b600061463e87828801614401565b945050602061464f87828801614401565b93505060406146608782880161453c565b925050606085013567ffffffffffffffff81111561467d57600080fd5b614689878288016144d3565b91505092959194509250565b600080604083850312156146a857600080fd5b60006146b685828601614401565b92505060206146c785828601614494565b9150509250929050565b600080604083850312156146e457600080fd5b60006146f285828601614401565b92505060206147038582860161453c565b9150509250929050565b6000806040838503121561472057600080fd5b600083013567ffffffffffffffff81111561473a57600080fd5b61474685828601614416565b925050602083013567ffffffffffffffff81111561476357600080fd5b61476f85828601614440565b9150509250929050565b6000806040838503121561478c57600080fd5b600083013567ffffffffffffffff8111156147a657600080fd5b6147b285828601614416565b925050602083013567ffffffffffffffff8111156147cf57600080fd5b6147db8582860161446a565b9150509250929050565b6000602082840312156147f757600080fd5b6000614805848285016144a9565b91505092915050565b60006020828403121561482057600080fd5b600061482e848285016144be565b91505092915050565b60006020828403121561484957600080fd5b600082013567ffffffffffffffff81111561486357600080fd5b61486f848285016144fd565b91505092915050565b60006020828403121561488a57600080fd5b60006148988482850161453c565b91505092915050565b6000602082840312156148b357600080fd5b60006148c184828501614551565b91505092915050565b6148d3816154bc565b82525050565b6148e2816154ce565b82525050565b60006148f3826152ba565b6148fd81856152d0565b935061490d8185602086016155a2565b61491681615799565b840191505092915050565b61492a8161554b565b82525050565b6149398161556f565b82525050565b600061494a826152c5565b61495481856152e1565b93506149648185602086016155a2565b61496d81615799565b840191505092915050565b6000614983826152c5565b61498d81856152f2565b935061499d8185602086016155a2565b80840191505092915050565b60006149b66010836152e1565b91506149c1826157aa565b602082019050919050565b60006149d9602b836152e1565b91506149e4826157d3565b604082019050919050565b60006149fc6032836152e1565b9150614a0782615822565b604082019050919050565b6000614a1f6026836152e1565b9150614a2a82615871565b604082019050919050565b6000614a42601c836152e1565b9150614a4d826158c0565b602082019050919050565b6000614a656017836152e1565b9150614a70826158e9565b602082019050919050565b6000614a886033836152e1565b9150614a9382615912565b604082019050919050565b6000614aab6024836152e1565b9150614ab682615961565b604082019050919050565b6000614ace6019836152e1565b9150614ad9826159b0565b602082019050919050565b6000614af1602c836152e1565b9150614afc826159d9565b604082019050919050565b6000614b146038836152e1565b9150614b1f82615a28565b604082019050919050565b6000614b37602a836152e1565b9150614b4282615a77565b604082019050919050565b6000614b5a6029836152e1565b9150614b6582615ac6565b604082019050919050565b6000614b7d6013836152e1565b9150614b8882615b15565b602082019050919050565b6000614ba06013836152e1565b9150614bab82615b3e565b602082019050919050565b6000614bc36020836152e1565b9150614bce82615b67565b602082019050919050565b6000614be6602c836152e1565b9150614bf182615b90565b604082019050919050565b6000614c096020836152e1565b9150614c1482615bdf565b602082019050919050565b6000614c2c6029836152e1565b9150614c3782615c08565b604082019050919050565b6000614c4f6021836152e1565b9150614c5a82615c57565b604082019050919050565b6000614c72602f836152e1565b9150614c7d82615ca6565b604082019050919050565b6000614c956021836152e1565b9150614ca082615cf5565b604082019050919050565b6000614cb86012836152e1565b9150614cc382615d44565b602082019050919050565b6000614cdb6031836152e1565b9150614ce682615d6d565b604082019050919050565b6000614cfe602c836152e1565b9150614d0982615dbc565b604082019050919050565b614d1d81615513565b82525050565b614d2c81615541565b82525050565b6000614d3e8285614978565b9150614d4a8284614978565b91508190509392505050565b6000602082019050614d6b60008301846148ca565b92915050565b6000608082019050614d8660008301876148ca565b614d9360208301866148ca565b614da06040830185614d23565b8181036060830152614db281846148e8565b905095945050505050565b6000604082019050614dd260008301856148ca565b614ddf6020830184614d23565b9392505050565b6000602082019050614dfb60008301846148d9565b92915050565b6000602082019050614e166000830184614921565b92915050565b6000602082019050614e316000830184614930565b92915050565b60006020820190508181036000830152614e51818461493f565b905092915050565b60006020820190508181036000830152614e72816149a9565b9050919050565b60006020820190508181036000830152614e92816149cc565b9050919050565b60006020820190508181036000830152614eb2816149ef565b9050919050565b60006020820190508181036000830152614ed281614a12565b9050919050565b60006020820190508181036000830152614ef281614a35565b9050919050565b60006020820190508181036000830152614f1281614a58565b9050919050565b60006020820190508181036000830152614f3281614a7b565b9050919050565b60006020820190508181036000830152614f5281614a9e565b9050919050565b60006020820190508181036000830152614f7281614ac1565b9050919050565b60006020820190508181036000830152614f9281614ae4565b9050919050565b60006020820190508181036000830152614fb281614b07565b9050919050565b60006020820190508181036000830152614fd281614b2a565b9050919050565b60006020820190508181036000830152614ff281614b4d565b9050919050565b6000602082019050818103600083015261501281614b70565b9050919050565b6000602082019050818103600083015261503281614b93565b9050919050565b6000602082019050818103600083015261505281614bb6565b9050919050565b6000602082019050818103600083015261507281614bd9565b9050919050565b6000602082019050818103600083015261509281614bfc565b9050919050565b600060208201905081810360008301526150b281614c1f565b9050919050565b600060208201905081810360008301526150d281614c42565b9050919050565b600060208201905081810360008301526150f281614c65565b9050919050565b6000602082019050818103600083015261511281614c88565b9050919050565b6000602082019050818103600083015261513281614cab565b9050919050565b6000602082019050818103600083015261515281614cce565b9050919050565b6000602082019050818103600083015261517281614cf1565b9050919050565b600060208201905061518e6000830184614d14565b92915050565b60006020820190506151a96000830184614d23565b92915050565b60006151b96151ca565b90506151c58282615607565b919050565b6000604051905090565b600067ffffffffffffffff8211156151ef576151ee61576a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561521b5761521a61576a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156152475761524661576a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156152735761527261576a565b5b61527c82615799565b9050602081019050919050565b600067ffffffffffffffff8211156152a4576152a361576a565b5b6152ad82615799565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061530882615506565b915061531383615506565b925081617fff038313600083121516156153305761532f6156dd565b5b817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000038312600083121615615368576153676156dd565b5b828201905092915050565b600061537e82615541565b915061538983615541565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153be576153bd6156dd565b5b828201905092915050565b60006153d482615541565b91506153df83615541565b9250826153ef576153ee61570c565b5b828204905092915050565b600061540582615541565b915061541083615541565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615449576154486156dd565b5b828202905092915050565b600061545f82615513565b915061546a83615513565b92508282101561547d5761547c6156dd565b5b828203905092915050565b600061549382615541565b915061549e83615541565b9250828210156154b1576154b06156dd565b5b828203905092915050565b60006154c782615521565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008160010b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006155568261555d565b9050919050565b600061556882615521565b9050919050565b600061557a82615581565b9050919050565b600061558c82615521565b9050919050565b82818337600083830152505050565b60005b838110156155c05780820151818401526020810190506155a5565b838111156155cf576000848401525b50505050565b600060028204905060018216806155ed57607f821691505b602082108114156156015761560061573b565b5b50919050565b61561082615799565b810181811067ffffffffffffffff8211171561562f5761562e61576a565b5b80604052505050565b600061564382615513565b915061ffff821415615658576156576156dd565b5b600182019050919050565b600061566e82615541565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156a1576156a06156dd565b5b600182019050919050565b60006156b782615541565b91506156c283615541565b9250826156d2576156d161570c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4e6f7420656e6f75676820657468657200000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f546f6f206d7563682070616e64617320746f206d696e74000000000000000000600082015250565b7f53656e646572206973206e6f7420616c6c6f77656420746f206d696e7420746860008201527f617420616d6f756e74206f662070616e64617300000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5573657220697320626c61636b6c697374656400000000000000000000000000600082015250565b7f4d696e74206973206e6f74207374617274656400000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4d696e7420666f722077686974656c697374206973206e6f742073746172746560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420696e206261746368206c696d69740000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b615e14816154bc565b8114615e1f57600080fd5b50565b615e2b816154ce565b8114615e3657600080fd5b50565b615e42816154da565b8114615e4d57600080fd5b50565b615e5981615513565b8114615e6457600080fd5b50565b615e7081615541565b8114615e7b57600080fd5b5056fea264697066735822122049dca19281665cbb91699d25c121efc44440b28ddd95f83c5eaac010619a414e64736f6c63430008040033
Deployed Bytecode Sourcemap
68552:5877:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37040:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23937:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25496:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25019:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37680:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68914:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26386:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73521:71;;;;;;;;;;;;;:::i;:::-;;37348:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73423:90;;;;;;;;;;;;;:::i;:::-;;71914:98;;;;;;;;;;;;;:::i;:::-;;74141:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26796:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69291:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68989:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37870:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73101:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23631:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68782:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68639:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69061:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23361:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2527:94;;;;;;;;;;;;;:::i;:::-;;68869:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69342:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70225:1185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68731:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68956:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1876:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68681:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69401:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73202:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24106:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73858:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69147:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69630:589;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69440:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25789:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73676:84;;;;;;;;;;;;;:::i;:::-;;68833:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71416:125;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73328:89;;;;;;;;;;;;;:::i;:::-;;72227:116;;;;;;;;;;;;;:::i;:::-;;27052:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24281:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73598:72;;;;;;;;;;;;;:::i;:::-;;73766:86;;;;;;;;;;;;;:::i;:::-;;69240:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26155:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72018:203;;;;;;;;;;;;;:::i;:::-;;69020:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2776:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69195:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37040:224;37142:4;37181:35;37166:50;;;:11;:50;;;;:90;;;;37220:36;37244:11;37220:23;:36::i;:::-;37166:90;37159:97;;37040:224;;;:::o;23937:100::-;23991:13;24024:5;24017:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23937:100;:::o;25496:221::-;25572:7;25600:16;25608:7;25600;:16::i;:::-;25592:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25685:15;:24;25701:7;25685:24;;;;;;;;;;;;;;;;;;;;;25678:31;;25496:221;;;:::o;25019:411::-;25100:13;25116:23;25131:7;25116:14;:23::i;:::-;25100:39;;25164:5;25158:11;;:2;:11;;;;25150:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25258:5;25242:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25267:37;25284:5;25291:12;:10;:12::i;:::-;25267:16;:37::i;:::-;25242:62;25220:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25401:21;25410:2;25414:7;25401:8;:21::i;:::-;25019:411;;;:::o;37680:113::-;37741:7;37768:10;:17;;;;37761:24;;37680:113;:::o;68914:37::-;;;;;;;;;;;;;:::o;26386:339::-;26581:41;26600:12;:10;:12::i;:::-;26614:7;26581:18;:41::i;:::-;26573:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26689:28;26699:4;26705:2;26709:7;26689:9;:28::i;:::-;26386:339;;;:::o;73521:71::-;2107:12;:10;:12::i;:::-;2096:23;;:7;:5;:7::i;:::-;:23;;;2088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73582:4:::1;73568:11;;:18;;;;;;;;;;;;;;;;;;73521:71::o:0;37348:256::-;37445:7;37481:23;37498:5;37481:16;:23::i;:::-;37473:5;:31;37465:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37570:12;:19;37583:5;37570:19;;;;;;;;;;;;;;;:26;37590:5;37570:26;;;;;;;;;;;;37563:33;;37348:256;;;;:::o;73423:90::-;2107:12;:10;:12::i;:::-;2096:23;;:7;:5;:7::i;:::-;:23;;;2088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73502:5:::1;73479:20;;:28;;;;;;;;;;;;;;;;;;73423:90::o:0;71914:98::-;2107:12;:10;:12::i;:::-;2096:23;;:7;:5;:7::i;:::-;:23;;;2088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71966:7:::1;:5;:7::i;:::-;71958:25;;:48;71984:21;71958:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;71914:98::o:0;74141:285::-;2107:12;:10;:12::i;:::-;2096:23;;:7;:5;:7::i;:::-;:23;;;2088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74247:14:::1;74264:5;:12;74247:29;;74301:13;:20;74291:6;:30;74283:39;;;::::0;::::1;;74334:9;74329:92;74353:6;74349:1;:10;74329:92;;;74397:13;74411:1;74397:16;;;;;;;;;;;;;;;;;;;;;;74375:9;:19;74385:5;74391:1;74385:8;;;;;;;;;;;;;;;;;;;;;;74375:19;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;74361:3;;;;;:::i;:::-;;;;74329:92;;;;2167:1;74141:285:::0;;:::o;26796:185::-;26934:39;26951:4;26957:2;26961:7;26934:39;;;;;;;;;;;;:16;:39::i;:::-;26796:185;;;:::o;69291:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;68989:26::-;;;;:::o;37870:233::-;37945:7;37981:30;:28;:30::i;:::-;37973:5;:38;37965:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38078:10;38089:5;38078:17;;;;;;;;;;;;;;;;;;;;;;;;38071:24;;37870:233;;;:::o;73101:95::-;2107:12;:10;:12::i;:::-;2096:23;;:7;:5;:7::i;:::-;:23;;;2088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73181:10:::1;73171:7;:20;;;;;;;;;;;;:::i;:::-;;73101:95:::0;:::o;23631:239::-;23703:7;23723:13;23739:7;:16;23747:7;23739:16;;;;;;;;;;;;;;;;;;;;;23723:32;;23791:1;23774:19;;:5;:19;;;;23766:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23857:5;23850:12;;;23631:239;;;:::o;68782:43::-;68815:10;68782:43;:::o;68639:37::-;68672:4;68639:37;:::o;69061:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23361:208::-;23433:7;23478:1;23461:19;;:5;:19;;;;23453:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23545:9;:16;23555:5;23545:16;;;;;;;;;;;;;;;;23538:23;;23361:208;;;:::o;2527:94::-;2107:12;:10;:12::i;:::-;2096:23;;:7;:5;:7::i;:::-;:23;;;2088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2592:21:::1;2610:1;2592:9;:21::i;:::-;2527:94::o:0;68869:40::-;;;;;;;;;;;;;:::o;69342:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;70225:1185::-;70314:4;70289:29;;:9;:21;70299:10;70289:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;;70281:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;70357:20;;;;;;;;;;;70349:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;68672:4;70445:12;70430;;:27;;;;:::i;:::-;:40;;70422:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;70507:24;70534:15;:13;:15::i;:::-;70507:42;;70587:12;70564:19;:35;;70556:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;70664:11;70732:12;70747:10;;;;;;;;;;;:20;;;70768:10;70747:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70732:47;;70790:6;70786:354;70806:7;70802:1;:11;:36;;;;;70826:12;70817:6;:21;70802:36;70786:354;;;70854:12;70869:10;;;;;;;;;;;:30;;;70900:10;70912:1;70869:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70854:60;;70927:18;:27;70946:7;70927:27;;;;;;;;;;;;;;;;;;;;;70923:210;;70967:10;70995:1;70980:12;;:16;;;;:::i;:::-;70967:29;;71037:4;71007:18;:27;71026:7;71007:27;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;71062:1;71052:11;;;;;:::i;:::-;;;71074:21;71080:10;71092:2;71074:5;:21::i;:::-;71122:1;71106:12;;:17;;;;;;;:::i;:::-;;;;;;;;70923:210;;70786:354;70840:3;;;;;:::i;:::-;;;;70786:354;;;;71183:6;71192;71183:15;;71179:181;71204:12;71200:1;:16;71179:181;;;71232:10;71260:1;71245:12;;:16;;;;:::i;:::-;71232:29;;71270:21;71276:10;71288:2;71270:5;:21::i;:::-;71316:1;71300:12;;:17;;;;;;;:::i;:::-;;;;;;;;71351:1;71326:9;:21;71336:10;71326:21;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;71179:181;71218:3;;;;;:::i;:::-;;;;71179:181;;;;71368:11;;;;;;;;;;;:24;;;71393:10;71368:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70225:1185;;;;:::o;68731:46::-;68768:9;68731:46;:::o;68956:28::-;;;;:::o;1876:87::-;1922:7;1949:6;;;;;;;;;;;1942:13;;1876:87;:::o;68681:42::-;68719:4;68681:42;:::o;69401:34::-;;;;;;;;;;;;;:::o;73202:120::-;2107:12;:10;:12::i;:::-;2096:23;;:7;:5;:7::i;:::-;:23;;;2088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73301:15:::1;73275:11;;:42;;;;;;;;;;;;;;;;;;73202:120:::0;:::o;24106:104::-;24162:13;24195:7;24188:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24106:104;:::o;73858:277::-;2107:12;:10;:12::i;:::-;2096:23;;:7;:5;:7::i;:::-;:23;;;2088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73960:14:::1;73977:5;:12;73960:29;;74014:11;:18;74004:6;:28;73996:37;;;::::0;::::1;;74045:9;74040:90;74064:6;74060:1;:10;74040:90;;;74108:11;74120:1;74108:14;;;;;;;;;;;;;;;;;;;;;;74086:9;:19;74096:5;74102:1;74096:8;;;;;;;;;;;;;;;;;;;;;;74086:19;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;74072:3;;;;;:::i;:::-;;;;74040:90;;;;2167:1;73858:277:::0;;:::o;69147:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;69630:589::-;69718:4;69693:29;;:9;:21;69703:10;69693:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;;69685:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;69761:11;;;;;;;;;;;69753:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;69827:10;;69811:12;:26;;69803:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;68815:10;69875:27;69889:12;69875:9;:13;;:27;;;;:::i;:::-;:40;;69867:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;68672:4;69966:12;69951;;:27;;;;:::i;:::-;:40;;69943:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;70032:8;70028:143;70050:12;70046:1;:16;;;70028:143;;;70078:10;70106:1;70091:12;;:16;;;;:::i;:::-;70078:29;;70116:21;70122:10;70134:2;70116:5;:21::i;:::-;70162:1;70146:12;;:17;;;;;;;:::i;:::-;;;;;;;;70028:143;70064:3;;;;;:::i;:::-;;;;70028:143;;;;70177:11;;;;;;;;;;;:24;;;70202:10;70177:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69630:589;:::o;69440:30::-;;;;;;;;;;;;;:::o;25789:295::-;25904:12;:10;:12::i;:::-;25892:24;;:8;:24;;;;25884:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26004:8;25959:18;:32;25978:12;:10;:12::i;:::-;25959:32;;;;;;;;;;;;;;;:42;25992:8;25959:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26057:8;26028:48;;26043:12;:10;:12::i;:::-;26028:48;;;26067:8;26028:48;;;;;;:::i;:::-;;;;;;;;25789:295;;:::o;73676:84::-;2107:12;:10;:12::i;:::-;2096:23;;:7;:5;:7::i;:::-;:23;;;2088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73750:4:::1;73730:17;;:24;;;;;;;;;;;;;;;;;;73676:84::o:0;68833:31::-;;;;;;;;;;;;;:::o;71416:125::-;71461:4;71505:30;71524:10;71505:18;:30::i;:::-;71481:9;:21;71491:10;71481:21;;;;;;;;;;;;;;;;;;;;;;;;;:54;;;;;;:::i;:::-;71474:61;;71416:125;:::o;73328:89::-;2107:12;:10;:12::i;:::-;2096:23;;:7;:5;:7::i;:::-;:23;;;2088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73407:4:::1;73384:20;;:27;;;;;;;;;;;;;;;;;;73328:89::o:0;72227:116::-;72262:11;;;;;;;;;;;:24;;;72287:10;72262:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72303:11;;;;;;;;;;;:23;;;72327:10;72303:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72227:116::o;27052:328::-;27227:41;27246:12;:10;:12::i;:::-;27260:7;27227:18;:41::i;:::-;27219:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27333:39;27347:4;27353:2;27357:7;27366:5;27333:13;:39::i;:::-;27052:328;;;;:::o;24281:334::-;24354:13;24388:16;24396:7;24388;:16::i;:::-;24380:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24469:21;24493:10;:8;:10::i;:::-;24469:34;;24545:1;24527:7;24521:21;:25;:86;;;;;;;;;;;;;;;;;24573:7;24582:18;:7;:16;:18::i;:::-;24556:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24521:86;24514:93;;;24281:334;;;:::o;73598:72::-;2107:12;:10;:12::i;:::-;2096:23;;:7;:5;:7::i;:::-;:23;;;2088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73659:5:::1;73645:11;;:19;;;;;;;;;;;;;;;;;;73598:72::o:0;73766:86::-;2107:12;:10;:12::i;:::-;2096:23;;:7;:5;:7::i;:::-;:23;;;2088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73841:5:::1;73821:17;;:25;;;;;;;;;;;;;;;;;;73766:86::o:0;69240:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;26155:164::-;26252:4;26276:18;:25;26295:5;26276:25;;;;;;;;;;;;;;;:35;26302:8;26276:35;;;;;;;;;;;;;;;;;;;;;;;;;26269:42;;26155:164;;;;:::o;72018:203::-;72060:11;;;;;;;;;;;:16;;;72077:10;68768:9;72060:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72108:10;72156:1;72133:20;;68672:4;72121:32;;;;:::i;:::-;:36;;;;:::i;:::-;72108:49;;72162:21;72168:10;72180:2;72162:5;:21::i;:::-;72214:1;72190:20;;:25;;;;;;;:::i;:::-;;;;;;;;72018:203;:::o;69020:36::-;;;;:::o;2776:192::-;2107:12;:10;:12::i;:::-;2096:23;;:7;:5;:7::i;:::-;:23;;;2088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2885:1:::1;2865:22;;:8;:22;;;;2857:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2941:19;2951:8;2941:9;:19::i;:::-;2776:192:::0;:::o;69195:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;22992:305::-;23094:4;23146:25;23131:40;;;:11;:40;;;;:105;;;;23203:33;23188:48;;;:11;:48;;;;23131:105;:158;;;;23253:36;23277:11;23253:23;:36::i;:::-;23131:158;23111:178;;22992:305;;;:::o;28890:127::-;28955:4;29007:1;28979:30;;:7;:16;28987:7;28979:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28972:37;;28890:127;;;:::o;662:98::-;715:7;742:10;735:17;;662:98;:::o;32872:174::-;32974:2;32947:15;:24;32963:7;32947:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33030:7;33026:2;32992:46;;33001:23;33016:7;33001:14;:23::i;:::-;32992:46;;;;;;;;;;;;32872:174;;:::o;29184:348::-;29277:4;29302:16;29310:7;29302;:16::i;:::-;29294:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29378:13;29394:23;29409:7;29394:14;:23::i;:::-;29378:39;;29447:5;29436:16;;:7;:16;;;:51;;;;29480:7;29456:31;;:20;29468:7;29456:11;:20::i;:::-;:31;;;29436:51;:87;;;;29491:32;29508:5;29515:7;29491:16;:32::i;:::-;29436:87;29428:96;;;29184:348;;;;:::o;32176:578::-;32335:4;32308:31;;:23;32323:7;32308:14;:23::i;:::-;:31;;;32300:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32418:1;32404:16;;:2;:16;;;;32396:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32474:39;32495:4;32501:2;32505:7;32474:20;:39::i;:::-;32578:29;32595:1;32599:7;32578:8;:29::i;:::-;32639:1;32620:9;:15;32630:4;32620:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32668:1;32651:9;:13;32661:2;32651:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32699:2;32680:7;:16;32688:7;32680:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32738:7;32734:2;32719:27;;32728:4;32719:27;;;;;;;;;;;;32176:578;;;:::o;2976:173::-;3032:16;3051:6;;;;;;;;;;;3032:25;;3077:8;3068:6;;:17;;;;;;;;;;;;;;;;;;3132:8;3101:40;;3122:8;3101:40;;;;;;;;;;;;2976:173;;:::o;30868:382::-;30962:1;30948:16;;:2;:16;;;;30940:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31021:16;31029:7;31021;:16::i;:::-;31020:17;31012:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31083:45;31112:1;31116:2;31120:7;31083:20;:45::i;:::-;31158:1;31141:9;:13;31151:2;31141:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31189:2;31170:7;:16;31178:7;31170:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31234:7;31230:2;31209:33;;31226:1;31209:33;;;;;;;;;;;;30868:382;;:::o;46722:98::-;46780:7;46811:1;46807;:5;;;;:::i;:::-;46800:12;;46722:98;;;;:::o;71547:361::-;71610:4;71623:12;71638:10;;;;;;;;;;;:20;;;71659:4;71638:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71623:41;;71671:13;71699:6;71695:186;71715:7;71711:1;:11;71695:186;;;71738:12;71753:10;;;;;;;;;;;:30;;;71784:10;71796:1;71753:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71738:60;;71811:18;:27;71830:7;71811:27;;;;;;;;;;;;;;;;;;;;;71807:67;;71863:1;71851:13;;;;;:::i;:::-;;;71807:67;71695:186;71724:3;;;;;:::i;:::-;;;;71695:186;;;;71894:8;71887:15;;;;71547:361;;;:::o;28262:315::-;28419:28;28429:4;28435:2;28439:7;28419:9;:28::i;:::-;28466:48;28489:4;28495:2;28499:7;28508:5;28466:22;:48::i;:::-;28458:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28262:315;;;;:::o;72999:96::-;73051:13;73082:7;73075:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72999:96;:::o;18935:723::-;18991:13;19221:1;19212:5;:10;19208:53;;;19239:10;;;;;;;;;;;;;;;;;;;;;19208:53;19271:12;19286:5;19271:20;;19302:14;19327:78;19342:1;19334:4;:9;19327:78;;19360:8;;;;;:::i;:::-;;;;19391:2;19383:10;;;;;:::i;:::-;;;19327:78;;;19415:19;19447:6;19437:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19415:39;;19465:154;19481:1;19472:5;:10;19465:154;;19509:1;19499:11;;;;;:::i;:::-;;;19576:2;19568:5;:10;;;;:::i;:::-;19555:2;:24;;;;:::i;:::-;19542:39;;19525:6;19532;19525:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;19605:2;19596:11;;;;;:::i;:::-;;;19465:154;;;19643:6;19629:21;;;;;18935:723;;;;:::o;21494:157::-;21579:4;21618:25;21603:40;;;:11;:40;;;;21596:47;;21494:157;;;:::o;72349:236::-;72447:45;72474:4;72480:2;72484:7;72447:26;:45::i;:::-;72499:38;72519:4;72525:2;72529:7;72499:19;:38::i;:::-;72544:35;72564:2;72568:1;72571:7;72544:19;:35::i;:::-;72349:236;;;:::o;33611:799::-;33766:4;33787:15;:2;:13;;;:15::i;:::-;33783:620;;;33839:2;33823:36;;;33860:12;:10;:12::i;:::-;33874:4;33880:7;33889:5;33823:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33819:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34082:1;34065:6;:13;:18;34061:272;;;34108:60;;;;;;;;;;:::i;:::-;;;;;;;;34061:272;34283:6;34277:13;34268:6;34264:2;34260:15;34253:38;33819:529;33956:41;;;33946:51;;;:6;:51;;;;33939:58;;;;;33783:620;34387:4;34380:11;;33611:799;;;;;;;:::o;38716:589::-;38860:45;38887:4;38893:2;38897:7;38860:26;:45::i;:::-;38938:1;38922:18;;:4;:18;;;38918:187;;;38957:40;38989:7;38957:31;:40::i;:::-;38918:187;;;39027:2;39019:10;;:4;:10;;;39015:90;;39046:47;39079:4;39085:7;39046:32;:47::i;:::-;39015:90;38918:187;39133:1;39119:16;;:2;:16;;;39115:183;;;39152:45;39189:7;39152:36;:45::i;:::-;39115:183;;;39225:4;39219:10;;:2;:10;;;39215:83;;39246:40;39274:2;39278:7;39246:27;:40::i;:::-;39215:83;39115:183;38716:589;;;:::o;72591:398::-;72704:1;72688:18;;:4;:18;;;72684:300;;72715:11;;;;;;;;;;;:24;;;72740:4;72715:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68672:4;72758:7;:20;72754:225;;72846:13;72823;:19;72837:4;72823:19;;;;;;;;;;;;;;;;;;;;;;;;;72817:42;;;;:::i;:::-;72788:13;:19;72802:4;72788:19;;;;;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;72754:225;;;72955:13;72927:18;:24;72946:4;72927:24;;;;;;;;;;;;;;;;;;;;;;;;;72921:47;;;;:::i;:::-;72887:18;:24;72906:4;72887:24;;;;;;;;;;;;;;;;:82;;;;;;;;;;;;;;;;;;72754:225;72684:300;72591:398;;;:::o;11289:387::-;11349:4;11557:12;11624:7;11612:20;11604:28;;11667:1;11660:4;:8;11653:15;;;11289:387;;;:::o;34982:126::-;;;;:::o;40028:164::-;40132:10;:17;;;;40105:15;:24;40121:7;40105:24;;;;;;;;;;;:44;;;;40160:10;40176:7;40160:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40028:164;:::o;40819:988::-;41085:22;41135:1;41110:22;41127:4;41110:16;:22::i;:::-;:26;;;;:::i;:::-;41085:51;;41147:18;41168:17;:26;41186:7;41168:26;;;;;;;;;;;;41147:47;;41315:14;41301:10;:28;41297:328;;41346:19;41368:12;:18;41381:4;41368:18;;;;;;;;;;;;;;;:34;41387:14;41368:34;;;;;;;;;;;;41346:56;;41452:11;41419:12;:18;41432:4;41419:18;;;;;;;;;;;;;;;:30;41438:10;41419:30;;;;;;;;;;;:44;;;;41569:10;41536:17;:30;41554:11;41536:30;;;;;;;;;;;:43;;;;41297:328;;41721:17;:26;41739:7;41721:26;;;;;;;;;;;41714:33;;;41765:12;:18;41778:4;41765:18;;;;;;;;;;;;;;;:34;41784:14;41765:34;;;;;;;;;;;41758:41;;;40819:988;;;;:::o;42102:1079::-;42355:22;42400:1;42380:10;:17;;;;:21;;;;:::i;:::-;42355:46;;42412:18;42433:15;:24;42449:7;42433:24;;;;;;;;;;;;42412:45;;42784:19;42806:10;42817:14;42806:26;;;;;;;;;;;;;;;;;;;;;;;;42784:48;;42870:11;42845:10;42856;42845:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;42981:10;42950:15;:28;42966:11;42950:28;;;;;;;;;;;:41;;;;43122:15;:24;43138:7;43122:24;;;;;;;;;;;43115:31;;;43157:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42102:1079;;;;:::o;39606:221::-;39691:14;39708:20;39725:2;39708:16;:20::i;:::-;39691:37;;39766:7;39739:12;:16;39752:2;39739:16;;;;;;;;;;;;;;;:24;39756:6;39739:24;;;;;;;;;;;:34;;;;39813:6;39784:17;:26;39802:7;39784:26;;;;;;;;;;;:35;;;;39606:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;699:646::-;792:5;817:78;833:61;887:6;833:61;:::i;:::-;817:78;:::i;:::-;808:87;;915:5;944:6;937:5;930:21;978:4;971:5;967:16;960:23;;1004:6;1054:3;1046:4;1038:6;1034:17;1029:3;1025:27;1022:36;1019:2;;;1083:1;1080;1073:12;1019:2;1119:1;1104:235;1129:6;1126:1;1123:13;1104:235;;;1197:3;1226:34;1256:3;1244:10;1226:34;:::i;:::-;1221:3;1214:47;1290:4;1285:3;1281:14;1274:21;;1324:4;1319:3;1315:14;1308:21;;1164:175;1151:1;1148;1144:9;1139:14;;1104:235;;;1108:14;798:547;;;;;;;:::o;1367:652::-;1462:5;1487:80;1503:63;1559:6;1503:63;:::i;:::-;1487:80;:::i;:::-;1478:89;;1587:5;1616:6;1609:5;1602:21;1650:4;1643:5;1639:16;1632:23;;1676:6;1726:3;1718:4;1710:6;1706:17;1701:3;1697:27;1694:36;1691:2;;;1755:1;1752;1745:12;1691:2;1791:1;1776:237;1801:6;1798:1;1795:13;1776:237;;;1869:3;1898:36;1930:3;1918:10;1898:36;:::i;:::-;1893:3;1886:49;1964:4;1959:3;1955:14;1948:21;;1998:4;1993:3;1989:14;1982:21;;1836:177;1823:1;1820;1816:9;1811:14;;1776:237;;;1780:14;1468:551;;;;;;;:::o;2025:343::-;2102:5;2127:65;2143:48;2184:6;2143:48;:::i;:::-;2127:65;:::i;:::-;2118:74;;2215:6;2208:5;2201:21;2253:4;2246:5;2242:16;2291:3;2282:6;2277:3;2273:16;2270:25;2267:2;;;2308:1;2305;2298:12;2267:2;2321:41;2355:6;2350:3;2345;2321:41;:::i;:::-;2108:260;;;;;;:::o;2374:345::-;2452:5;2477:66;2493:49;2535:6;2493:49;:::i;:::-;2477:66;:::i;:::-;2468:75;;2566:6;2559:5;2552:21;2604:4;2597:5;2593:16;2642:3;2633:6;2628:3;2624:16;2621:25;2618:2;;;2659:1;2656;2649:12;2618:2;2672:41;2706:6;2701:3;2696;2672:41;:::i;:::-;2458:261;;;;;;:::o;2725:139::-;2771:5;2809:6;2796:20;2787:29;;2825:33;2852:5;2825:33;:::i;:::-;2777:87;;;;:::o;2887:303::-;2958:5;3007:3;3000:4;2992:6;2988:17;2984:27;2974:2;;3025:1;3022;3015:12;2974:2;3065:6;3052:20;3090:94;3180:3;3172:6;3165:4;3157:6;3153:17;3090:94;:::i;:::-;3081:103;;2964:226;;;;;:::o;3210:297::-;3278:5;3327:3;3320:4;3312:6;3308:17;3304:27;3294:2;;3345:1;3342;3335:12;3294:2;3385:6;3372:20;3410:91;3497:3;3489:6;3482:4;3474:6;3470:17;3410:91;:::i;:::-;3401:100;;3284:223;;;;;:::o;3529:301::-;3599:5;3648:3;3641:4;3633:6;3629:17;3625:27;3615:2;;3666:1;3663;3656:12;3615:2;3706:6;3693:20;3731:93;3820:3;3812:6;3805:4;3797:6;3793:17;3731:93;:::i;:::-;3722:102;;3605:225;;;;;:::o;3836:133::-;3879:5;3917:6;3904:20;3895:29;;3933:30;3957:5;3933:30;:::i;:::-;3885:84;;;;:::o;3975:137::-;4020:5;4058:6;4045:20;4036:29;;4074:32;4100:5;4074:32;:::i;:::-;4026:86;;;;:::o;4118:141::-;4174:5;4205:6;4199:13;4190:22;;4221:32;4247:5;4221:32;:::i;:::-;4180:79;;;;:::o;4278:271::-;4333:5;4382:3;4375:4;4367:6;4363:17;4359:27;4349:2;;4400:1;4397;4390:12;4349:2;4440:6;4427:20;4465:78;4539:3;4531:6;4524:4;4516:6;4512:17;4465:78;:::i;:::-;4456:87;;4339:210;;;;;:::o;4569:273::-;4625:5;4674:3;4667:4;4659:6;4655:17;4651:27;4641:2;;4692:1;4689;4682:12;4641:2;4732:6;4719:20;4757:79;4832:3;4824:6;4817:4;4809:6;4805:17;4757:79;:::i;:::-;4748:88;;4631:211;;;;;:::o;4848:137::-;4893:5;4931:6;4918:20;4909:29;;4947:32;4973:5;4947:32;:::i;:::-;4899:86;;;;:::o;4991:139::-;5037:5;5075:6;5062:20;5053:29;;5091:33;5118:5;5091:33;:::i;:::-;5043:87;;;;:::o;5136:143::-;5193:5;5224:6;5218:13;5209:22;;5240:33;5267:5;5240:33;:::i;:::-;5199:80;;;;:::o;5285:262::-;5344:6;5393:2;5381:9;5372:7;5368:23;5364:32;5361:2;;;5409:1;5406;5399:12;5361:2;5452:1;5477:53;5522:7;5513:6;5502:9;5498:22;5477:53;:::i;:::-;5467:63;;5423:117;5351:196;;;;:::o;5553:407::-;5621:6;5629;5678:2;5666:9;5657:7;5653:23;5649:32;5646:2;;;5694:1;5691;5684:12;5646:2;5737:1;5762:53;5807:7;5798:6;5787:9;5783:22;5762:53;:::i;:::-;5752:63;;5708:117;5864:2;5890:53;5935:7;5926:6;5915:9;5911:22;5890:53;:::i;:::-;5880:63;;5835:118;5636:324;;;;;:::o;5966:552::-;6043:6;6051;6059;6108:2;6096:9;6087:7;6083:23;6079:32;6076:2;;;6124:1;6121;6114:12;6076:2;6167:1;6192:53;6237:7;6228:6;6217:9;6213:22;6192:53;:::i;:::-;6182:63;;6138:117;6294:2;6320:53;6365:7;6356:6;6345:9;6341:22;6320:53;:::i;:::-;6310:63;;6265:118;6422:2;6448:53;6493:7;6484:6;6473:9;6469:22;6448:53;:::i;:::-;6438:63;;6393:118;6066:452;;;;;:::o;6524:809::-;6619:6;6627;6635;6643;6692:3;6680:9;6671:7;6667:23;6663:33;6660:2;;;6709:1;6706;6699:12;6660:2;6752:1;6777:53;6822:7;6813:6;6802:9;6798:22;6777:53;:::i;:::-;6767:63;;6723:117;6879:2;6905:53;6950:7;6941:6;6930:9;6926:22;6905:53;:::i;:::-;6895:63;;6850:118;7007:2;7033:53;7078:7;7069:6;7058:9;7054:22;7033:53;:::i;:::-;7023:63;;6978:118;7163:2;7152:9;7148:18;7135:32;7194:18;7186:6;7183:30;7180:2;;;7226:1;7223;7216:12;7180:2;7254:62;7308:7;7299:6;7288:9;7284:22;7254:62;:::i;:::-;7244:72;;7106:220;6650:683;;;;;;;:::o;7339:401::-;7404:6;7412;7461:2;7449:9;7440:7;7436:23;7432:32;7429:2;;;7477:1;7474;7467:12;7429:2;7520:1;7545:53;7590:7;7581:6;7570:9;7566:22;7545:53;:::i;:::-;7535:63;;7491:117;7647:2;7673:50;7715:7;7706:6;7695:9;7691:22;7673:50;:::i;:::-;7663:60;;7618:115;7419:321;;;;;:::o;7746:407::-;7814:6;7822;7871:2;7859:9;7850:7;7846:23;7842:32;7839:2;;;7887:1;7884;7877:12;7839:2;7930:1;7955:53;8000:7;7991:6;7980:9;7976:22;7955:53;:::i;:::-;7945:63;;7901:117;8057:2;8083:53;8128:7;8119:6;8108:9;8104:22;8083:53;:::i;:::-;8073:63;;8028:118;7829:324;;;;;:::o;8159:687::-;8274:6;8282;8331:2;8319:9;8310:7;8306:23;8302:32;8299:2;;;8347:1;8344;8337:12;8299:2;8418:1;8407:9;8403:17;8390:31;8448:18;8440:6;8437:30;8434:2;;;8480:1;8477;8470:12;8434:2;8508:78;8578:7;8569:6;8558:9;8554:22;8508:78;:::i;:::-;8498:88;;8361:235;8663:2;8652:9;8648:18;8635:32;8694:18;8686:6;8683:30;8680:2;;;8726:1;8723;8716:12;8680:2;8754:75;8821:7;8812:6;8801:9;8797:22;8754:75;:::i;:::-;8744:85;;8606:233;8289:557;;;;;:::o;8852:691::-;8969:6;8977;9026:2;9014:9;9005:7;9001:23;8997:32;8994:2;;;9042:1;9039;9032:12;8994:2;9113:1;9102:9;9098:17;9085:31;9143:18;9135:6;9132:30;9129:2;;;9175:1;9172;9165:12;9129:2;9203:78;9273:7;9264:6;9253:9;9249:22;9203:78;:::i;:::-;9193:88;;9056:235;9358:2;9347:9;9343:18;9330:32;9389:18;9381:6;9378:30;9375:2;;;9421:1;9418;9411:12;9375:2;9449:77;9518:7;9509:6;9498:9;9494:22;9449:77;:::i;:::-;9439:87;;9301:235;8984:559;;;;;:::o;9549:260::-;9607:6;9656:2;9644:9;9635:7;9631:23;9627:32;9624:2;;;9672:1;9669;9662:12;9624:2;9715:1;9740:52;9784:7;9775:6;9764:9;9760:22;9740:52;:::i;:::-;9730:62;;9686:116;9614:195;;;;:::o;9815:282::-;9884:6;9933:2;9921:9;9912:7;9908:23;9904:32;9901:2;;;9949:1;9946;9939:12;9901:2;9992:1;10017:63;10072:7;10063:6;10052:9;10048:22;10017:63;:::i;:::-;10007:73;;9963:127;9891:206;;;;:::o;10103:375::-;10172:6;10221:2;10209:9;10200:7;10196:23;10192:32;10189:2;;;10237:1;10234;10227:12;10189:2;10308:1;10297:9;10293:17;10280:31;10338:18;10330:6;10327:30;10324:2;;;10370:1;10367;10360:12;10324:2;10398:63;10453:7;10444:6;10433:9;10429:22;10398:63;:::i;:::-;10388:73;;10251:220;10179:299;;;;:::o;10484:262::-;10543:6;10592:2;10580:9;10571:7;10567:23;10563:32;10560:2;;;10608:1;10605;10598:12;10560:2;10651:1;10676:53;10721:7;10712:6;10701:9;10697:22;10676:53;:::i;:::-;10666:63;;10622:117;10550:196;;;;:::o;10752:284::-;10822:6;10871:2;10859:9;10850:7;10846:23;10842:32;10839:2;;;10887:1;10884;10877:12;10839:2;10930:1;10955:64;11011:7;11002:6;10991:9;10987:22;10955:64;:::i;:::-;10945:74;;10901:128;10829:207;;;;:::o;11042:118::-;11129:24;11147:5;11129:24;:::i;:::-;11124:3;11117:37;11107:53;;:::o;11166:109::-;11247:21;11262:5;11247:21;:::i;:::-;11242:3;11235:34;11225:50;;:::o;11281:360::-;11367:3;11395:38;11427:5;11395:38;:::i;:::-;11449:70;11512:6;11507:3;11449:70;:::i;:::-;11442:77;;11528:52;11573:6;11568:3;11561:4;11554:5;11550:16;11528:52;:::i;:::-;11605:29;11627:6;11605:29;:::i;:::-;11600:3;11596:39;11589:46;;11371:270;;;;;:::o;11647:181::-;11759:62;11815:5;11759:62;:::i;:::-;11754:3;11747:75;11737:91;;:::o;11834:171::-;11941:57;11992:5;11941:57;:::i;:::-;11936:3;11929:70;11919:86;;:::o;12011:364::-;12099:3;12127:39;12160:5;12127:39;:::i;:::-;12182:71;12246:6;12241:3;12182:71;:::i;:::-;12175:78;;12262:52;12307:6;12302:3;12295:4;12288:5;12284:16;12262:52;:::i;:::-;12339:29;12361:6;12339:29;:::i;:::-;12334:3;12330:39;12323:46;;12103:272;;;;;:::o;12381:377::-;12487:3;12515:39;12548:5;12515:39;:::i;:::-;12570:89;12652:6;12647:3;12570:89;:::i;:::-;12563:96;;12668:52;12713:6;12708:3;12701:4;12694:5;12690:16;12668:52;:::i;:::-;12745:6;12740:3;12736:16;12729:23;;12491:267;;;;;:::o;12764:366::-;12906:3;12927:67;12991:2;12986:3;12927:67;:::i;:::-;12920:74;;13003:93;13092:3;13003:93;:::i;:::-;13121:2;13116:3;13112:12;13105:19;;12910:220;;;:::o;13136:366::-;13278:3;13299:67;13363:2;13358:3;13299:67;:::i;:::-;13292:74;;13375:93;13464:3;13375:93;:::i;:::-;13493:2;13488:3;13484:12;13477:19;;13282:220;;;:::o;13508:366::-;13650:3;13671:67;13735:2;13730:3;13671:67;:::i;:::-;13664:74;;13747:93;13836:3;13747:93;:::i;:::-;13865:2;13860:3;13856:12;13849:19;;13654:220;;;:::o;13880:366::-;14022:3;14043:67;14107:2;14102:3;14043:67;:::i;:::-;14036:74;;14119:93;14208:3;14119:93;:::i;:::-;14237:2;14232:3;14228:12;14221:19;;14026:220;;;:::o;14252:366::-;14394:3;14415:67;14479:2;14474:3;14415:67;:::i;:::-;14408:74;;14491:93;14580:3;14491:93;:::i;:::-;14609:2;14604:3;14600:12;14593:19;;14398:220;;;:::o;14624:366::-;14766:3;14787:67;14851:2;14846:3;14787:67;:::i;:::-;14780:74;;14863:93;14952:3;14863:93;:::i;:::-;14981:2;14976:3;14972:12;14965:19;;14770:220;;;:::o;14996:366::-;15138:3;15159:67;15223:2;15218:3;15159:67;:::i;:::-;15152:74;;15235:93;15324:3;15235:93;:::i;:::-;15353:2;15348:3;15344:12;15337:19;;15142:220;;;:::o;15368:366::-;15510:3;15531:67;15595:2;15590:3;15531:67;:::i;:::-;15524:74;;15607:93;15696:3;15607:93;:::i;:::-;15725:2;15720:3;15716:12;15709:19;;15514:220;;;:::o;15740:366::-;15882:3;15903:67;15967:2;15962:3;15903:67;:::i;:::-;15896:74;;15979:93;16068:3;15979:93;:::i;:::-;16097:2;16092:3;16088:12;16081:19;;15886:220;;;:::o;16112:366::-;16254:3;16275:67;16339:2;16334:3;16275:67;:::i;:::-;16268:74;;16351:93;16440:3;16351:93;:::i;:::-;16469:2;16464:3;16460:12;16453:19;;16258:220;;;:::o;16484:366::-;16626:3;16647:67;16711:2;16706:3;16647:67;:::i;:::-;16640:74;;16723:93;16812:3;16723:93;:::i;:::-;16841:2;16836:3;16832:12;16825:19;;16630:220;;;:::o;16856:366::-;16998:3;17019:67;17083:2;17078:3;17019:67;:::i;:::-;17012:74;;17095:93;17184:3;17095:93;:::i;:::-;17213:2;17208:3;17204:12;17197:19;;17002:220;;;:::o;17228:366::-;17370:3;17391:67;17455:2;17450:3;17391:67;:::i;:::-;17384:74;;17467:93;17556:3;17467:93;:::i;:::-;17585:2;17580:3;17576:12;17569:19;;17374:220;;;:::o;17600:366::-;17742:3;17763:67;17827:2;17822:3;17763:67;:::i;:::-;17756:74;;17839:93;17928:3;17839:93;:::i;:::-;17957:2;17952:3;17948:12;17941:19;;17746:220;;;:::o;17972:366::-;18114:3;18135:67;18199:2;18194:3;18135:67;:::i;:::-;18128:74;;18211:93;18300:3;18211:93;:::i;:::-;18329:2;18324:3;18320:12;18313:19;;18118:220;;;:::o;18344:366::-;18486:3;18507:67;18571:2;18566:3;18507:67;:::i;:::-;18500:74;;18583:93;18672:3;18583:93;:::i;:::-;18701:2;18696:3;18692:12;18685:19;;18490:220;;;:::o;18716:366::-;18858:3;18879:67;18943:2;18938:3;18879:67;:::i;:::-;18872:74;;18955:93;19044:3;18955:93;:::i;:::-;19073:2;19068:3;19064:12;19057:19;;18862:220;;;:::o;19088:366::-;19230:3;19251:67;19315:2;19310:3;19251:67;:::i;:::-;19244:74;;19327:93;19416:3;19327:93;:::i;:::-;19445:2;19440:3;19436:12;19429:19;;19234:220;;;:::o;19460:366::-;19602:3;19623:67;19687:2;19682:3;19623:67;:::i;:::-;19616:74;;19699:93;19788:3;19699:93;:::i;:::-;19817:2;19812:3;19808:12;19801:19;;19606:220;;;:::o;19832:366::-;19974:3;19995:67;20059:2;20054:3;19995:67;:::i;:::-;19988:74;;20071:93;20160:3;20071:93;:::i;:::-;20189:2;20184:3;20180:12;20173:19;;19978:220;;;:::o;20204:366::-;20346:3;20367:67;20431:2;20426:3;20367:67;:::i;:::-;20360:74;;20443:93;20532:3;20443:93;:::i;:::-;20561:2;20556:3;20552:12;20545:19;;20350:220;;;:::o;20576:366::-;20718:3;20739:67;20803:2;20798:3;20739:67;:::i;:::-;20732:74;;20815:93;20904:3;20815:93;:::i;:::-;20933:2;20928:3;20924:12;20917:19;;20722:220;;;:::o;20948:366::-;21090:3;21111:67;21175:2;21170:3;21111:67;:::i;:::-;21104:74;;21187:93;21276:3;21187:93;:::i;:::-;21305:2;21300:3;21296:12;21289:19;;21094:220;;;:::o;21320:366::-;21462:3;21483:67;21547:2;21542:3;21483:67;:::i;:::-;21476:74;;21559:93;21648:3;21559:93;:::i;:::-;21677:2;21672:3;21668:12;21661:19;;21466:220;;;:::o;21692:366::-;21834:3;21855:67;21919:2;21914:3;21855:67;:::i;:::-;21848:74;;21931:93;22020:3;21931:93;:::i;:::-;22049:2;22044:3;22040:12;22033:19;;21838:220;;;:::o;22064:115::-;22149:23;22166:5;22149:23;:::i;:::-;22144:3;22137:36;22127:52;;:::o;22185:118::-;22272:24;22290:5;22272:24;:::i;:::-;22267:3;22260:37;22250:53;;:::o;22309:435::-;22489:3;22511:95;22602:3;22593:6;22511:95;:::i;:::-;22504:102;;22623:95;22714:3;22705:6;22623:95;:::i;:::-;22616:102;;22735:3;22728:10;;22493:251;;;;;:::o;22750:222::-;22843:4;22881:2;22870:9;22866:18;22858:26;;22894:71;22962:1;22951:9;22947:17;22938:6;22894:71;:::i;:::-;22848:124;;;;:::o;22978:640::-;23173:4;23211:3;23200:9;23196:19;23188:27;;23225:71;23293:1;23282:9;23278:17;23269:6;23225:71;:::i;:::-;23306:72;23374:2;23363:9;23359:18;23350:6;23306:72;:::i;:::-;23388;23456:2;23445:9;23441:18;23432:6;23388:72;:::i;:::-;23507:9;23501:4;23497:20;23492:2;23481:9;23477:18;23470:48;23535:76;23606:4;23597:6;23535:76;:::i;:::-;23527:84;;23178:440;;;;;;;:::o;23624:332::-;23745:4;23783:2;23772:9;23768:18;23760:26;;23796:71;23864:1;23853:9;23849:17;23840:6;23796:71;:::i;:::-;23877:72;23945:2;23934:9;23930:18;23921:6;23877:72;:::i;:::-;23750:206;;;;;:::o;23962:210::-;24049:4;24087:2;24076:9;24072:18;24064:26;;24100:65;24162:1;24151:9;24147:17;24138:6;24100:65;:::i;:::-;24054:118;;;;:::o;24178:272::-;24296:4;24334:2;24323:9;24319:18;24311:26;;24347:96;24440:1;24429:9;24425:17;24416:6;24347:96;:::i;:::-;24301:149;;;;:::o;24456:262::-;24569:4;24607:2;24596:9;24592:18;24584:26;;24620:91;24708:1;24697:9;24693:17;24684:6;24620:91;:::i;:::-;24574:144;;;;:::o;24724:313::-;24837:4;24875:2;24864:9;24860:18;24852:26;;24924:9;24918:4;24914:20;24910:1;24899:9;24895:17;24888:47;24952:78;25025:4;25016:6;24952:78;:::i;:::-;24944:86;;24842:195;;;;:::o;25043:419::-;25209:4;25247:2;25236:9;25232:18;25224:26;;25296:9;25290:4;25286:20;25282:1;25271:9;25267:17;25260:47;25324:131;25450:4;25324:131;:::i;:::-;25316:139;;25214:248;;;:::o;25468:419::-;25634:4;25672:2;25661:9;25657:18;25649:26;;25721:9;25715:4;25711:20;25707:1;25696:9;25692:17;25685:47;25749:131;25875:4;25749:131;:::i;:::-;25741:139;;25639:248;;;:::o;25893:419::-;26059:4;26097:2;26086:9;26082:18;26074:26;;26146:9;26140:4;26136:20;26132:1;26121:9;26117:17;26110:47;26174:131;26300:4;26174:131;:::i;:::-;26166:139;;26064:248;;;:::o;26318:419::-;26484:4;26522:2;26511:9;26507:18;26499:26;;26571:9;26565:4;26561:20;26557:1;26546:9;26542:17;26535:47;26599:131;26725:4;26599:131;:::i;:::-;26591:139;;26489:248;;;:::o;26743:419::-;26909:4;26947:2;26936:9;26932:18;26924:26;;26996:9;26990:4;26986:20;26982:1;26971:9;26967:17;26960:47;27024:131;27150:4;27024:131;:::i;:::-;27016:139;;26914:248;;;:::o;27168:419::-;27334:4;27372:2;27361:9;27357:18;27349:26;;27421:9;27415:4;27411:20;27407:1;27396:9;27392:17;27385:47;27449:131;27575:4;27449:131;:::i;:::-;27441:139;;27339:248;;;:::o;27593:419::-;27759:4;27797:2;27786:9;27782:18;27774:26;;27846:9;27840:4;27836:20;27832:1;27821:9;27817:17;27810:47;27874:131;28000:4;27874:131;:::i;:::-;27866:139;;27764:248;;;:::o;28018:419::-;28184:4;28222:2;28211:9;28207:18;28199:26;;28271:9;28265:4;28261:20;28257:1;28246:9;28242:17;28235:47;28299:131;28425:4;28299:131;:::i;:::-;28291:139;;28189:248;;;:::o;28443:419::-;28609:4;28647:2;28636:9;28632:18;28624:26;;28696:9;28690:4;28686:20;28682:1;28671:9;28667:17;28660:47;28724:131;28850:4;28724:131;:::i;:::-;28716:139;;28614:248;;;:::o;28868:419::-;29034:4;29072:2;29061:9;29057:18;29049:26;;29121:9;29115:4;29111:20;29107:1;29096:9;29092:17;29085:47;29149:131;29275:4;29149:131;:::i;:::-;29141:139;;29039:248;;;:::o;29293:419::-;29459:4;29497:2;29486:9;29482:18;29474:26;;29546:9;29540:4;29536:20;29532:1;29521:9;29517:17;29510:47;29574:131;29700:4;29574:131;:::i;:::-;29566:139;;29464:248;;;:::o;29718:419::-;29884:4;29922:2;29911:9;29907:18;29899:26;;29971:9;29965:4;29961:20;29957:1;29946:9;29942:17;29935:47;29999:131;30125:4;29999:131;:::i;:::-;29991:139;;29889:248;;;:::o;30143:419::-;30309:4;30347:2;30336:9;30332:18;30324:26;;30396:9;30390:4;30386:20;30382:1;30371:9;30367:17;30360:47;30424:131;30550:4;30424:131;:::i;:::-;30416:139;;30314:248;;;:::o;30568:419::-;30734:4;30772:2;30761:9;30757:18;30749:26;;30821:9;30815:4;30811:20;30807:1;30796:9;30792:17;30785:47;30849:131;30975:4;30849:131;:::i;:::-;30841:139;;30739:248;;;:::o;30993:419::-;31159:4;31197:2;31186:9;31182:18;31174:26;;31246:9;31240:4;31236:20;31232:1;31221:9;31217:17;31210:47;31274:131;31400:4;31274:131;:::i;:::-;31266:139;;31164:248;;;:::o;31418:419::-;31584:4;31622:2;31611:9;31607:18;31599:26;;31671:9;31665:4;31661:20;31657:1;31646:9;31642:17;31635:47;31699:131;31825:4;31699:131;:::i;:::-;31691:139;;31589:248;;;:::o;31843:419::-;32009:4;32047:2;32036:9;32032:18;32024:26;;32096:9;32090:4;32086:20;32082:1;32071:9;32067:17;32060:47;32124:131;32250:4;32124:131;:::i;:::-;32116:139;;32014:248;;;:::o;32268:419::-;32434:4;32472:2;32461:9;32457:18;32449:26;;32521:9;32515:4;32511:20;32507:1;32496:9;32492:17;32485:47;32549:131;32675:4;32549:131;:::i;:::-;32541:139;;32439:248;;;:::o;32693:419::-;32859:4;32897:2;32886:9;32882:18;32874:26;;32946:9;32940:4;32936:20;32932:1;32921:9;32917:17;32910:47;32974:131;33100:4;32974:131;:::i;:::-;32966:139;;32864:248;;;:::o;33118:419::-;33284:4;33322:2;33311:9;33307:18;33299:26;;33371:9;33365:4;33361:20;33357:1;33346:9;33342:17;33335:47;33399:131;33525:4;33399:131;:::i;:::-;33391:139;;33289:248;;;:::o;33543:419::-;33709:4;33747:2;33736:9;33732:18;33724:26;;33796:9;33790:4;33786:20;33782:1;33771:9;33767:17;33760:47;33824:131;33950:4;33824:131;:::i;:::-;33816:139;;33714:248;;;:::o;33968:419::-;34134:4;34172:2;34161:9;34157:18;34149:26;;34221:9;34215:4;34211:20;34207:1;34196:9;34192:17;34185:47;34249:131;34375:4;34249:131;:::i;:::-;34241:139;;34139:248;;;:::o;34393:419::-;34559:4;34597:2;34586:9;34582:18;34574:26;;34646:9;34640:4;34636:20;34632:1;34621:9;34617:17;34610:47;34674:131;34800:4;34674:131;:::i;:::-;34666:139;;34564:248;;;:::o;34818:419::-;34984:4;35022:2;35011:9;35007:18;34999:26;;35071:9;35065:4;35061:20;35057:1;35046:9;35042:17;35035:47;35099:131;35225:4;35099:131;:::i;:::-;35091:139;;34989:248;;;:::o;35243:419::-;35409:4;35447:2;35436:9;35432:18;35424:26;;35496:9;35490:4;35486:20;35482:1;35471:9;35467:17;35460:47;35524:131;35650:4;35524:131;:::i;:::-;35516:139;;35414:248;;;:::o;35668:218::-;35759:4;35797:2;35786:9;35782:18;35774:26;;35810:69;35876:1;35865:9;35861:17;35852:6;35810:69;:::i;:::-;35764:122;;;;:::o;35892:222::-;35985:4;36023:2;36012:9;36008:18;36000:26;;36036:71;36104:1;36093:9;36089:17;36080:6;36036:71;:::i;:::-;35990:124;;;;:::o;36120:129::-;36154:6;36181:20;;:::i;:::-;36171:30;;36210:33;36238:4;36230:6;36210:33;:::i;:::-;36161:88;;;:::o;36255:75::-;36288:6;36321:2;36315:9;36305:19;;36295:35;:::o;36336:311::-;36413:4;36503:18;36495:6;36492:30;36489:2;;;36525:18;;:::i;:::-;36489:2;36575:4;36567:6;36563:17;36555:25;;36635:4;36629;36625:15;36617:23;;36418:229;;;:::o;36653:308::-;36727:4;36817:18;36809:6;36806:30;36803:2;;;36839:18;;:::i;:::-;36803:2;36889:4;36881:6;36877:17;36869:25;;36949:4;36943;36939:15;36931:23;;36732:229;;;:::o;36967:310::-;37043:4;37133:18;37125:6;37122:30;37119:2;;;37155:18;;:::i;:::-;37119:2;37205:4;37197:6;37193:17;37185:25;;37265:4;37259;37255:15;37247:23;;37048:229;;;:::o;37283:307::-;37344:4;37434:18;37426:6;37423:30;37420:2;;;37456:18;;:::i;:::-;37420:2;37494:29;37516:6;37494:29;:::i;:::-;37486:37;;37578:4;37572;37568:15;37560:23;;37349:241;;;:::o;37596:308::-;37658:4;37748:18;37740:6;37737:30;37734:2;;;37770:18;;:::i;:::-;37734:2;37808:29;37830:6;37808:29;:::i;:::-;37800:37;;37892:4;37886;37882:15;37874:23;;37663:241;;;:::o;37910:98::-;37961:6;37995:5;37989:12;37979:22;;37968:40;;;:::o;38014:99::-;38066:6;38100:5;38094:12;38084:22;;38073:40;;;:::o;38119:168::-;38202:11;38236:6;38231:3;38224:19;38276:4;38271:3;38267:14;38252:29;;38214:73;;;;:::o;38293:169::-;38377:11;38411:6;38406:3;38399:19;38451:4;38446:3;38442:14;38427:29;;38389:73;;;;:::o;38468:148::-;38570:11;38607:3;38592:18;;38582:34;;;;:::o;38622:462::-;38660:3;38679:18;38695:1;38679:18;:::i;:::-;38674:23;;38711:18;38727:1;38711:18;:::i;:::-;38706:23;;38838:1;38830:6;38826:14;38823:1;38819:22;38814:1;38811;38807:9;38800:17;38796:46;38793:2;;;38845:18;;:::i;:::-;38793:2;39025:1;38957:66;38953:74;38950:1;38946:82;38942:1;38939;38935:9;38931:98;38928:2;;;39032:18;;:::i;:::-;38928:2;39076:1;39073;39069:9;39062:16;;38664:420;;;;:::o;39090:305::-;39130:3;39149:20;39167:1;39149:20;:::i;:::-;39144:25;;39183:20;39201:1;39183:20;:::i;:::-;39178:25;;39337:1;39269:66;39265:74;39262:1;39259:81;39256:2;;;39343:18;;:::i;:::-;39256:2;39387:1;39384;39380:9;39373:16;;39134:261;;;;:::o;39401:185::-;39441:1;39458:20;39476:1;39458:20;:::i;:::-;39453:25;;39492:20;39510:1;39492:20;:::i;:::-;39487:25;;39531:1;39521:2;;39536:18;;:::i;:::-;39521:2;39578:1;39575;39571:9;39566:14;;39443:143;;;;:::o;39592:348::-;39632:7;39655:20;39673:1;39655:20;:::i;:::-;39650:25;;39689:20;39707:1;39689:20;:::i;:::-;39684:25;;39877:1;39809:66;39805:74;39802:1;39799:81;39794:1;39787:9;39780:17;39776:105;39773:2;;;39884:18;;:::i;:::-;39773:2;39932:1;39929;39925:9;39914:20;;39640:300;;;;:::o;39946:188::-;39985:4;40005:19;40022:1;40005:19;:::i;:::-;40000:24;;40038:19;40055:1;40038:19;:::i;:::-;40033:24;;40076:1;40073;40070:8;40067:2;;;40081:18;;:::i;:::-;40067:2;40126:1;40123;40119:9;40111:17;;39990:144;;;;:::o;40140:191::-;40180:4;40200:20;40218:1;40200:20;:::i;:::-;40195:25;;40234:20;40252:1;40234:20;:::i;:::-;40229:25;;40273:1;40270;40267:8;40264:2;;;40278:18;;:::i;:::-;40264:2;40323:1;40320;40316:9;40308:17;;40185:146;;;;:::o;40337:96::-;40374:7;40403:24;40421:5;40403:24;:::i;:::-;40392:35;;40382:51;;;:::o;40439:90::-;40473:7;40516:5;40509:13;40502:21;40491:32;;40481:48;;;:::o;40535:149::-;40571:7;40611:66;40604:5;40600:78;40589:89;;40579:105;;;:::o;40690:90::-;40725:7;40768:5;40765:1;40754:20;40743:31;;40733:47;;;:::o;40786:89::-;40822:7;40862:6;40855:5;40851:18;40840:29;;40830:45;;;:::o;40881:126::-;40918:7;40958:42;40951:5;40947:54;40936:65;;40926:81;;;:::o;41013:77::-;41050:7;41079:5;41068:16;;41058:32;;;:::o;41096:176::-;41171:9;41204:62;41260:5;41204:62;:::i;:::-;41191:75;;41181:91;;;:::o;41278:138::-;41353:9;41386:24;41404:5;41386:24;:::i;:::-;41373:37;;41363:53;;;:::o;41422:166::-;41492:9;41525:57;41576:5;41525:57;:::i;:::-;41512:70;;41502:86;;;:::o;41594:133::-;41664:9;41697:24;41715:5;41697:24;:::i;:::-;41684:37;;41674:53;;;:::o;41733:154::-;41817:6;41812:3;41807;41794:30;41879:1;41870:6;41865:3;41861:16;41854:27;41784:103;;;:::o;41893:307::-;41961:1;41971:113;41985:6;41982:1;41979:13;41971:113;;;42070:1;42065:3;42061:11;42055:18;42051:1;42046:3;42042:11;42035:39;42007:2;42004:1;42000:10;41995:15;;41971:113;;;42102:6;42099:1;42096:13;42093:2;;;42182:1;42173:6;42168:3;42164:16;42157:27;42093:2;41942:258;;;;:::o;42206:320::-;42250:6;42287:1;42281:4;42277:12;42267:22;;42334:1;42328:4;42324:12;42355:18;42345:2;;42411:4;42403:6;42399:17;42389:27;;42345:2;42473;42465:6;42462:14;42442:18;42439:38;42436:2;;;42492:18;;:::i;:::-;42436:2;42257:269;;;;:::o;42532:281::-;42615:27;42637:4;42615:27;:::i;:::-;42607:6;42603:40;42745:6;42733:10;42730:22;42709:18;42697:10;42694:34;42691:62;42688:2;;;42756:18;;:::i;:::-;42688:2;42796:10;42792:2;42785:22;42575:238;;;:::o;42819:171::-;42857:3;42880:23;42897:5;42880:23;:::i;:::-;42871:32;;42925:6;42918:5;42915:17;42912:2;;;42935:18;;:::i;:::-;42912:2;42982:1;42975:5;42971:13;42964:20;;42861:129;;;:::o;42996:233::-;43035:3;43058:24;43076:5;43058:24;:::i;:::-;43049:33;;43104:66;43097:5;43094:77;43091:2;;;43174:18;;:::i;:::-;43091:2;43221:1;43214:5;43210:13;43203:20;;43039:190;;;:::o;43235:176::-;43267:1;43284:20;43302:1;43284:20;:::i;:::-;43279:25;;43318:20;43336:1;43318:20;:::i;:::-;43313:25;;43357:1;43347:2;;43362:18;;:::i;:::-;43347:2;43403:1;43400;43396:9;43391:14;;43269:142;;;;:::o;43417:180::-;43465:77;43462:1;43455:88;43562:4;43559:1;43552:15;43586:4;43583:1;43576:15;43603:180;43651:77;43648:1;43641:88;43748:4;43745:1;43738:15;43772:4;43769:1;43762:15;43789:180;43837:77;43834:1;43827:88;43934:4;43931:1;43924:15;43958:4;43955:1;43948:15;43975:180;44023:77;44020:1;44013:88;44120:4;44117:1;44110:15;44144:4;44141:1;44134:15;44161:102;44202:6;44253:2;44249:7;44244:2;44237:5;44233:14;44229:28;44219:38;;44209:54;;;:::o;44269:166::-;44409:18;44405:1;44397:6;44393:14;44386:42;44375:60;:::o;44441:230::-;44581:34;44577:1;44569:6;44565:14;44558:58;44650:13;44645:2;44637:6;44633:15;44626:38;44547:124;:::o;44677:237::-;44817:34;44813:1;44805:6;44801:14;44794:58;44886:20;44881:2;44873:6;44869:15;44862:45;44783:131;:::o;44920:225::-;45060:34;45056:1;45048:6;45044:14;45037:58;45129:8;45124:2;45116:6;45112:15;45105:33;45026:119;:::o;45151:178::-;45291:30;45287:1;45279:6;45275:14;45268:54;45257:72;:::o;45335:173::-;45475:25;45471:1;45463:6;45459:14;45452:49;45441:67;:::o;45514:238::-;45654:34;45650:1;45642:6;45638:14;45631:58;45723:21;45718:2;45710:6;45706:15;45699:46;45620:132;:::o;45758:223::-;45898:34;45894:1;45886:6;45882:14;45875:58;45967:6;45962:2;45954:6;45950:15;45943:31;45864:117;:::o;45987:175::-;46127:27;46123:1;46115:6;46111:14;46104:51;46093:69;:::o;46168:231::-;46308:34;46304:1;46296:6;46292:14;46285:58;46377:14;46372:2;46364:6;46360:15;46353:39;46274:125;:::o;46405:243::-;46545:34;46541:1;46533:6;46529:14;46522:58;46614:26;46609:2;46601:6;46597:15;46590:51;46511:137;:::o;46654:229::-;46794:34;46790:1;46782:6;46778:14;46771:58;46863:12;46858:2;46850:6;46846:15;46839:37;46760:123;:::o;46889:228::-;47029:34;47025:1;47017:6;47013:14;47006:58;47098:11;47093:2;47085:6;47081:15;47074:36;46995:122;:::o;47123:169::-;47263:21;47259:1;47251:6;47247:14;47240:45;47229:63;:::o;47298:169::-;47438:21;47434:1;47426:6;47422:14;47415:45;47404:63;:::o;47473:182::-;47613:34;47609:1;47601:6;47597:14;47590:58;47579:76;:::o;47661:231::-;47801:34;47797:1;47789:6;47785:14;47778:58;47870:14;47865:2;47857:6;47853:15;47846:39;47767:125;:::o;47898:182::-;48038:34;48034:1;48026:6;48022:14;48015:58;48004:76;:::o;48086:228::-;48226:34;48222:1;48214:6;48210:14;48203:58;48295:11;48290:2;48282:6;48278:15;48271:36;48192:122;:::o;48320:220::-;48460:34;48456:1;48448:6;48444:14;48437:58;48529:3;48524:2;48516:6;48512:15;48505:28;48426:114;:::o;48546:234::-;48686:34;48682:1;48674:6;48670:14;48663:58;48755:17;48750:2;48742:6;48738:15;48731:42;48652:128;:::o;48786:220::-;48926:34;48922:1;48914:6;48910:14;48903:58;48995:3;48990:2;48982:6;48978:15;48971:28;48892:114;:::o;49012:168::-;49152:20;49148:1;49140:6;49136:14;49129:44;49118:62;:::o;49186:236::-;49326:34;49322:1;49314:6;49310:14;49303:58;49395:19;49390:2;49382:6;49378:15;49371:44;49292:130;:::o;49428:231::-;49568:34;49564:1;49556:6;49552:14;49545:58;49637:14;49632:2;49624:6;49620:15;49613:39;49534:125;:::o;49665:122::-;49738:24;49756:5;49738:24;:::i;:::-;49731:5;49728:35;49718:2;;49777:1;49774;49767:12;49718:2;49708:79;:::o;49793:116::-;49863:21;49878:5;49863:21;:::i;:::-;49856:5;49853:32;49843:2;;49899:1;49896;49889:12;49843:2;49833:76;:::o;49915:120::-;49987:23;50004:5;49987:23;:::i;:::-;49980:5;49977:34;49967:2;;50025:1;50022;50015:12;49967:2;49957:78;:::o;50041:120::-;50113:23;50130:5;50113:23;:::i;:::-;50106:5;50103:34;50093:2;;50151:1;50148;50141:12;50093:2;50083:78;:::o;50167:122::-;50240:24;50258:5;50240:24;:::i;:::-;50233:5;50230:35;50220:2;;50279:1;50276;50269:12;50220:2;50210:79;:::o
Swarm Source
ipfs://49dca19281665cbb91699d25c121efc44440b28ddd95f83c5eaac010619a414e
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.