Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
5,000 MKBX
Holders
558
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MKBXLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MonkeyBrix
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-18 */ /** *Submitted for verification at Etherscan.io on 2021-06-27 */ // SPDX-License-Identifier: MIT 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. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * 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; } } } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } 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; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } 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); } 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); } 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; } } 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; } 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); } 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); } 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } 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}. 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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` 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 { } } 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(); } } pragma solidity ^0.8.0; contract MonkeyBrix is ERC721Enumerable, Ownable{ using SafeMath for uint256; using Address for address; using Strings for uint256; uint256 public constant NFT_PRICE = 80000000000000000; // 0.08 ETH uint public constant MAX_NFT_PURCHASE = 20; uint256 public MAX_SUPPLY = 10000; bool public saleIsActive = false; uint256 public startingIndex; uint256 public startingIndexBlock; string private _baseURIExtended; mapping (uint256 => string) _tokenURIs; constructor() ERC721("Monkeybrix","MKBX"){ } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } function reserveTokens() public onlyOwner { uint supply = totalSupply(); uint i; for (i = 0; i < 50; i++) { _safeMint(msg.sender, supply + i); } if (startingIndexBlock == 0) { startingIndexBlock = block.number; } } function mintMonkey(uint numberOfTokens) public payable { require(saleIsActive, "Sale is not active at the moment"); require(numberOfTokens > 0, "Number of tokens can not be less than or equal to 0"); require(totalSupply().add(numberOfTokens) <= MAX_SUPPLY, "Purchase would exceed max supply of Monkeys"); require(numberOfTokens <= MAX_NFT_PURCHASE,"Can only mint up to 10 per purchase"); require(NFT_PRICE.mul(numberOfTokens) == msg.value, "Sent ether value is incorrect"); for (uint i = 0; i < numberOfTokens; i++) { _safeMint(msg.sender, totalSupply()); } } function calcStartingIndex() public onlyOwner { require(startingIndex == 0, "Starting index has already been set"); require(startingIndexBlock != 0, "Starting index has not been set yet"); startingIndex = uint(blockhash(startingIndexBlock)) % MAX_SUPPLY; // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes) if(block.number.sub(startingIndexBlock) > 255) { startingIndex = uint(blockhash(block.number - 1)) % MAX_SUPPLY; } // To prevent original sequence if (startingIndex == 0) { startingIndex = startingIndex.add(1); } } function emergencySetStartingIndexBlock() public onlyOwner { require(startingIndex == 0, "Starting index is already set"); startingIndexBlock = block.number; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIExtended; } // Sets base URI for all tokens, only able to be called by contract owner function setBaseURI(string memory baseURI_) external onlyOwner { _baseURIExtended = baseURI_; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } }
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":"MAX_NFT_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calcStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","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":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintMonkey","outputs":[],"stateMutability":"payable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052612710600b556000600c60006101000a81548160ff0219169083151502179055503480156200003257600080fd5b506040518060400160405280600a81526020017f4d6f6e6b657962726978000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d4b4258000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b792919062000192565b508060019080519060200190620000d092919062000192565b5050506000620000e56200018a60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002a7565b600033905090565b828054620001a09062000242565b90600052602060002090601f016020900481019282620001c4576000855562000210565b82601f10620001df57805160ff191683800117855562000210565b8280016001018555821562000210579182015b828111156200020f578251825591602001919060010190620001f2565b5b5090506200021f919062000223565b5090565b5b808211156200023e57600081600090555060010162000224565b5090565b600060028204905060018216806200025b57607f821691505b6020821081141562000272576200027162000278565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61441a80620002b76000396000f3fe6080604052600436106101e35760003560e01c80636352211e11610102578063b88d4fde11610095578063e36d649811610064578063e36d649814610687578063e985e9c5146106b2578063eb8d2444146106ef578063f2fde38b1461071a576101e3565b8063b88d4fde146105df578063c87b56dd14610608578063cb774d4714610645578063e13f351a14610670576101e3565b80637d17fcbe116100d15780637d17fcbe146105495780638da5cb5b1461056057806395d89b411461058b578063a22cb465146105b6576101e3565b80636352211e1461048d578063676dd563146104ca57806370a08231146104f5578063715018a614610532576101e3565b80632f745c591161017a57806342842e0e1161014957806342842e0e146103e25780634f6ccce71461040b57806355aabf5b1461044857806355f804b314610464576101e3565b80632f745c591461034c57806332cb6b0c1461038957806334918dfd146103b45780633ccfd60b146103cb576101e3565b8063095ea7b3116101b6578063095ea7b3146102b857806318160ddd146102e157806323b872dd1461030c57806327ac36c414610335576101e3565b806301ffc9a7146101e8578063020b39cc1461022557806306fdde0314610250578063081812fc1461027b575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a919061306f565b610743565b60405161021c9190613bd8565b60405180910390f35b34801561023157600080fd5b5061023a6107bd565b6040516102479190613f55565b60405180910390f35b34801561025c57600080fd5b506102656107c2565b6040516102729190613bf3565b60405180910390f35b34801561028757600080fd5b506102a2600480360381019061029d9190613102565b610854565b6040516102af9190613b71565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190613033565b6108d9565b005b3480156102ed57600080fd5b506102f66109f1565b6040516103039190613f55565b60405180910390f35b34801561031857600080fd5b50610333600480360381019061032e9190612f2d565b6109fe565b005b34801561034157600080fd5b5061034a610a5e565b005b34801561035857600080fd5b50610373600480360381019061036e9190613033565b610b31565b6040516103809190613f55565b60405180910390f35b34801561039557600080fd5b5061039e610bd6565b6040516103ab9190613f55565b60405180910390f35b3480156103c057600080fd5b506103c9610bdc565b005b3480156103d757600080fd5b506103e0610c84565b005b3480156103ee57600080fd5b5061040960048036038101906104049190612f2d565b610d4f565b005b34801561041757600080fd5b50610432600480360381019061042d9190613102565b610d6f565b60405161043f9190613f55565b60405180910390f35b610462600480360381019061045d9190613102565b610e06565b005b34801561047057600080fd5b5061048b600480360381019061048691906130c1565b610fc9565b005b34801561049957600080fd5b506104b460048036038101906104af9190613102565b61105f565b6040516104c19190613b71565b60405180910390f35b3480156104d657600080fd5b506104df611111565b6040516104ec9190613f55565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190612ec8565b61111d565b6040516105299190613f55565b60405180910390f35b34801561053e57600080fd5b506105476111d5565b005b34801561055557600080fd5b5061055e611312565b005b34801561056c57600080fd5b506105756113dc565b6040516105829190613b71565b60405180910390f35b34801561059757600080fd5b506105a0611406565b6040516105ad9190613bf3565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d89190612ff7565b611498565b005b3480156105eb57600080fd5b5061060660048036038101906106019190612f7c565b611619565b005b34801561061457600080fd5b5061062f600480360381019061062a9190613102565b61167b565b60405161063c9190613bf3565b60405180910390f35b34801561065157600080fd5b5061065a6117ee565b6040516106679190613f55565b60405180910390f35b34801561067c57600080fd5b506106856117f4565b005b34801561069357600080fd5b5061069c611981565b6040516106a99190613f55565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190612ef1565b611987565b6040516106e69190613bd8565b60405180910390f35b3480156106fb57600080fd5b50610704611a1b565b6040516107119190613bd8565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c9190612ec8565b611a2e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b657506107b582611bda565b5b9050919050565b601481565b6060600080546107d19061420f565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd9061420f565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b5050505050905090565b600061085f82611cbc565b61089e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089590613e35565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e48261105f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094c90613eb5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610974611d28565b73ffffffffffffffffffffffffffffffffffffffff1614806109a357506109a28161099d611d28565b611987565b5b6109e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d990613d95565b60405180910390fd5b6109ec8383611d30565b505050565b6000600880549050905090565b610a0f610a09611d28565b82611de9565b610a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4590613ed5565b60405180910390fd5b610a59838383611ec7565b505050565b610a66611d28565b73ffffffffffffffffffffffffffffffffffffffff16610a846113dc565b73ffffffffffffffffffffffffffffffffffffffff1614610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190613e55565b60405180910390fd5b6000610ae46109f1565b905060005b6032811015610b1a57610b07338284610b029190614044565b612123565b8080610b1290614241565b915050610ae9565b6000600e541415610b2d5743600e819055505b5050565b6000610b3c8361111d565b8210610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490613c55565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b610be4611d28565b73ffffffffffffffffffffffffffffffffffffffff16610c026113dc565b73ffffffffffffffffffffffffffffffffffffffff1614610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90613e55565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b610c8c611d28565b73ffffffffffffffffffffffffffffffffffffffff16610caa6113dc565b73ffffffffffffffffffffffffffffffffffffffff1614610d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf790613e55565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d4b573d6000803e3d6000fd5b5050565b610d6a83838360405180602001604052806000815250611619565b505050565b6000610d796109f1565b8210610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190613ef5565b60405180910390fd5b60088281548110610df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600c60009054906101000a900460ff16610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90613f35565b60405180910390fd5b60008111610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f90613c35565b60405180910390fd5b600b54610eb582610ea76109f1565b61214190919063ffffffff16565b1115610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed90613d55565b60405180910390fd5b6014811115610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3190613cd5565b60405180910390fd5b34610f568267011c37937e08000061215790919063ffffffff16565b14610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d90613df5565b60405180910390fd5b60005b81811015610fc557610fb233610fad6109f1565b612123565b8080610fbd90614241565b915050610f99565b5050565b610fd1611d28565b73ffffffffffffffffffffffffffffffffffffffff16610fef6113dc565b73ffffffffffffffffffffffffffffffffffffffff1614611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c90613e55565b60405180910390fd5b80600f908051906020019061105b929190612cec565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff90613dd5565b60405180910390fd5b80915050919050565b67011c37937e08000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118590613db5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111dd611d28565b73ffffffffffffffffffffffffffffffffffffffff166111fb6113dc565b73ffffffffffffffffffffffffffffffffffffffff1614611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124890613e55565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61131a611d28565b73ffffffffffffffffffffffffffffffffffffffff166113386113dc565b73ffffffffffffffffffffffffffffffffffffffff161461138e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138590613e55565b60405180910390fd5b6000600d54146113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca90613d75565b60405180910390fd5b43600e81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114159061420f565b80601f01602080910402602001604051908101604052809291908181526020018280546114419061420f565b801561148e5780601f106114635761010080835404028352916020019161148e565b820191906000526020600020905b81548152906001019060200180831161147157829003601f168201915b5050505050905090565b6114a0611d28565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561150e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150590613d15565b60405180910390fd5b806005600061151b611d28565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115c8611d28565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161160d9190613bd8565b60405180910390a35050565b61162a611624611d28565b83611de9565b611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090613ed5565b60405180910390fd5b6116758484848461216d565b50505050565b606061168682611cbc565b6116c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bc90613e95565b60405180910390fd5b60006010600084815260200190815260200160002080546116e59061420f565b80601f01602080910402602001604051908101604052809291908181526020018280546117119061420f565b801561175e5780601f106117335761010080835404028352916020019161175e565b820191906000526020600020905b81548152906001019060200180831161174157829003601f168201915b50505050509050600061176f6121c9565b90506000815114156117855781925050506117e9565b6000825111156117ba5780826040516020016117a2929190613b4d565b604051602081830303815290604052925050506117e9565b806117c48561225b565b6040516020016117d5929190613b4d565b604051602081830303815290604052925050505b919050565b600d5481565b6117fc611d28565b73ffffffffffffffffffffffffffffffffffffffff1661181a6113dc565b73ffffffffffffffffffffffffffffffffffffffff1614611870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186790613e55565b60405180910390fd5b6000600d54146118b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ac90613f15565b60405180910390fd5b6000600e5414156118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290613c15565b60405180910390fd5b600b54600e544060001c61190f919061428a565b600d8190555060ff61192c600e544361240890919063ffffffff16565b111561195757600b546001436119429190614125565b4060001c611950919061428a565b600d819055505b6000600d54141561197f576119786001600d5461214190919063ffffffff16565b600d819055505b565b600e5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611a36611d28565b73ffffffffffffffffffffffffffffffffffffffff16611a546113dc565b73ffffffffffffffffffffffffffffffffffffffff1614611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa190613e55565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190613c95565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ca557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611cb55750611cb48261241e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611da38361105f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611df482611cbc565b611e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2a90613d35565b60405180910390fd5b6000611e3e8361105f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ead57508373ffffffffffffffffffffffffffffffffffffffff16611e9584610854565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ebe5750611ebd8185611987565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ee78261105f565b73ffffffffffffffffffffffffffffffffffffffff1614611f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3490613e75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa490613cf5565b60405180910390fd5b611fb8838383612488565b611fc3600082611d30565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120139190614125565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461206a9190614044565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61213d82826040518060200160405280600081525061259c565b5050565b6000818361214f9190614044565b905092915050565b6000818361216591906140cb565b905092915050565b612178848484611ec7565b612184848484846125f7565b6121c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ba90613c75565b60405180910390fd5b50505050565b6060600f80546121d89061420f565b80601f01602080910402602001604051908101604052809291908181526020018280546122049061420f565b80156122515780601f1061222657610100808354040283529160200191612251565b820191906000526020600020905b81548152906001019060200180831161223457829003601f168201915b5050505050905090565b606060008214156122a3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612403565b600082905060005b600082146122d55780806122be90614241565b915050600a826122ce919061409a565b91506122ab565b60008167ffffffffffffffff811115612317577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123495781602001600182028036833780820191505090505b5090505b600085146123fc576001826123629190614125565b9150600a85612371919061428a565b603061237d9190614044565b60f81b8183815181106123b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123f5919061409a565b945061234d565b8093505050505b919050565b600081836124169190614125565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61249383838361278e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124d6576124d181612793565b612515565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125145761251383826127dc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125585761255381612949565b612597565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612596576125958282612a8c565b5b5b505050565b6125a68383612b0b565b6125b360008484846125f7565b6125f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e990613c75565b60405180910390fd5b505050565b60006126188473ffffffffffffffffffffffffffffffffffffffff16612cd9565b15612781578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612641611d28565b8786866040518563ffffffff1660e01b81526004016126639493929190613b8c565b602060405180830381600087803b15801561267d57600080fd5b505af19250505080156126ae57506040513d601f19601f820116820180604052508101906126ab9190613098565b60015b612731573d80600081146126de576040519150601f19603f3d011682016040523d82523d6000602084013e6126e3565b606091505b50600081511415612729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272090613c75565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612786565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127e98461111d565b6127f39190614125565b90506000600760008481526020019081526020016000205490508181146128d8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061295d9190614125565b90506000600960008481526020019081526020016000205490506000600883815481106129b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106129fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a70577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a978361111d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7290613e15565b60405180910390fd5b612b8481611cbc565b15612bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbb90613cb5565b60405180910390fd5b612bd060008383612488565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c209190614044565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612cf89061420f565b90600052602060002090601f016020900481019282612d1a5760008555612d61565b82601f10612d3357805160ff1916838001178555612d61565b82800160010185558215612d61579182015b82811115612d60578251825591602001919060010190612d45565b5b509050612d6e9190612d72565b5090565b5b80821115612d8b576000816000905550600101612d73565b5090565b6000612da2612d9d84613fa1565b613f70565b905082815260208101848484011115612dba57600080fd5b612dc58482856141cd565b509392505050565b6000612de0612ddb84613fd1565b613f70565b905082815260208101848484011115612df857600080fd5b612e038482856141cd565b509392505050565b600081359050612e1a81614388565b92915050565b600081359050612e2f8161439f565b92915050565b600081359050612e44816143b6565b92915050565b600081519050612e59816143b6565b92915050565b600082601f830112612e7057600080fd5b8135612e80848260208601612d8f565b91505092915050565b600082601f830112612e9a57600080fd5b8135612eaa848260208601612dcd565b91505092915050565b600081359050612ec2816143cd565b92915050565b600060208284031215612eda57600080fd5b6000612ee884828501612e0b565b91505092915050565b60008060408385031215612f0457600080fd5b6000612f1285828601612e0b565b9250506020612f2385828601612e0b565b9150509250929050565b600080600060608486031215612f4257600080fd5b6000612f5086828701612e0b565b9350506020612f6186828701612e0b565b9250506040612f7286828701612eb3565b9150509250925092565b60008060008060808587031215612f9257600080fd5b6000612fa087828801612e0b565b9450506020612fb187828801612e0b565b9350506040612fc287828801612eb3565b925050606085013567ffffffffffffffff811115612fdf57600080fd5b612feb87828801612e5f565b91505092959194509250565b6000806040838503121561300a57600080fd5b600061301885828601612e0b565b925050602061302985828601612e20565b9150509250929050565b6000806040838503121561304657600080fd5b600061305485828601612e0b565b925050602061306585828601612eb3565b9150509250929050565b60006020828403121561308157600080fd5b600061308f84828501612e35565b91505092915050565b6000602082840312156130aa57600080fd5b60006130b884828501612e4a565b91505092915050565b6000602082840312156130d357600080fd5b600082013567ffffffffffffffff8111156130ed57600080fd5b6130f984828501612e89565b91505092915050565b60006020828403121561311457600080fd5b600061312284828501612eb3565b91505092915050565b61313481614159565b82525050565b6131438161416b565b82525050565b600061315482614001565b61315e8185614017565b935061316e8185602086016141dc565b61317781614377565b840191505092915050565b600061318d8261400c565b6131978185614028565b93506131a78185602086016141dc565b6131b081614377565b840191505092915050565b60006131c68261400c565b6131d08185614039565b93506131e08185602086016141dc565b80840191505092915050565b60006131f9602383614028565b91507f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008301527f79657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061325f603383614028565b91507f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008301527f207468616e206f7220657175616c20746f2030000000000000000000000000006020830152604082019050919050565b60006132c5602b83614028565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061332b603283614028565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613391602683614028565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133f7601c83614028565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613437602383614028565b91507f43616e206f6e6c79206d696e7420757020746f2031302070657220707572636860008301527f61736500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061349d602483614028565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613503601983614028565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613543602c83614028565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006135a9602b83614028565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66204d6f6e6b6579730000000000000000000000000000000000000000006020830152604082019050919050565b600061360f601d83614028565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b600061364f603883614028565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006136b5602a83614028565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061371b602983614028565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613781601d83614028565b91507f53656e742065746865722076616c756520697320696e636f72726563740000006000830152602082019050919050565b60006137c1602083614028565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613801602c83614028565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613867602083614028565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006138a7602983614028565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061390d602f83614028565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613973602183614028565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139d9603183614028565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613a3f602c83614028565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613aa5602383614028565b91507f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b0b602083614028565b91507f53616c65206973206e6f742061637469766520617420746865206d6f6d656e746000830152602082019050919050565b613b47816141c3565b82525050565b6000613b5982856131bb565b9150613b6582846131bb565b91508190509392505050565b6000602082019050613b86600083018461312b565b92915050565b6000608082019050613ba1600083018761312b565b613bae602083018661312b565b613bbb6040830185613b3e565b8181036060830152613bcd8184613149565b905095945050505050565b6000602082019050613bed600083018461313a565b92915050565b60006020820190508181036000830152613c0d8184613182565b905092915050565b60006020820190508181036000830152613c2e816131ec565b9050919050565b60006020820190508181036000830152613c4e81613252565b9050919050565b60006020820190508181036000830152613c6e816132b8565b9050919050565b60006020820190508181036000830152613c8e8161331e565b9050919050565b60006020820190508181036000830152613cae81613384565b9050919050565b60006020820190508181036000830152613cce816133ea565b9050919050565b60006020820190508181036000830152613cee8161342a565b9050919050565b60006020820190508181036000830152613d0e81613490565b9050919050565b60006020820190508181036000830152613d2e816134f6565b9050919050565b60006020820190508181036000830152613d4e81613536565b9050919050565b60006020820190508181036000830152613d6e8161359c565b9050919050565b60006020820190508181036000830152613d8e81613602565b9050919050565b60006020820190508181036000830152613dae81613642565b9050919050565b60006020820190508181036000830152613dce816136a8565b9050919050565b60006020820190508181036000830152613dee8161370e565b9050919050565b60006020820190508181036000830152613e0e81613774565b9050919050565b60006020820190508181036000830152613e2e816137b4565b9050919050565b60006020820190508181036000830152613e4e816137f4565b9050919050565b60006020820190508181036000830152613e6e8161385a565b9050919050565b60006020820190508181036000830152613e8e8161389a565b9050919050565b60006020820190508181036000830152613eae81613900565b9050919050565b60006020820190508181036000830152613ece81613966565b9050919050565b60006020820190508181036000830152613eee816139cc565b9050919050565b60006020820190508181036000830152613f0e81613a32565b9050919050565b60006020820190508181036000830152613f2e81613a98565b9050919050565b60006020820190508181036000830152613f4e81613afe565b9050919050565b6000602082019050613f6a6000830184613b3e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613f9757613f96614348565b5b8060405250919050565b600067ffffffffffffffff821115613fbc57613fbb614348565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613fec57613feb614348565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061404f826141c3565b915061405a836141c3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561408f5761408e6142bb565b5b828201905092915050565b60006140a5826141c3565b91506140b0836141c3565b9250826140c0576140bf6142ea565b5b828204905092915050565b60006140d6826141c3565b91506140e1836141c3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561411a576141196142bb565b5b828202905092915050565b6000614130826141c3565b915061413b836141c3565b92508282101561414e5761414d6142bb565b5b828203905092915050565b6000614164826141a3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141fa5780820151818401526020810190506141df565b83811115614209576000848401525b50505050565b6000600282049050600182168061422757607f821691505b6020821081141561423b5761423a614319565b5b50919050565b600061424c826141c3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561427f5761427e6142bb565b5b600182019050919050565b6000614295826141c3565b91506142a0836141c3565b9250826142b0576142af6142ea565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61439181614159565b811461439c57600080fd5b50565b6143a88161416b565b81146143b357600080fd5b50565b6143bf81614177565b81146143ca57600080fd5b50565b6143d6816141c3565b81146143e157600080fd5b5056fea26469706673582212202c20d2f6dd0b958b996692b9d14ab3c07d7cbfcd3fc55ca20cca1ddc52a0621264736f6c63430008000033
Deployed Bytecode
0x6080604052600436106101e35760003560e01c80636352211e11610102578063b88d4fde11610095578063e36d649811610064578063e36d649814610687578063e985e9c5146106b2578063eb8d2444146106ef578063f2fde38b1461071a576101e3565b8063b88d4fde146105df578063c87b56dd14610608578063cb774d4714610645578063e13f351a14610670576101e3565b80637d17fcbe116100d15780637d17fcbe146105495780638da5cb5b1461056057806395d89b411461058b578063a22cb465146105b6576101e3565b80636352211e1461048d578063676dd563146104ca57806370a08231146104f5578063715018a614610532576101e3565b80632f745c591161017a57806342842e0e1161014957806342842e0e146103e25780634f6ccce71461040b57806355aabf5b1461044857806355f804b314610464576101e3565b80632f745c591461034c57806332cb6b0c1461038957806334918dfd146103b45780633ccfd60b146103cb576101e3565b8063095ea7b3116101b6578063095ea7b3146102b857806318160ddd146102e157806323b872dd1461030c57806327ac36c414610335576101e3565b806301ffc9a7146101e8578063020b39cc1461022557806306fdde0314610250578063081812fc1461027b575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a919061306f565b610743565b60405161021c9190613bd8565b60405180910390f35b34801561023157600080fd5b5061023a6107bd565b6040516102479190613f55565b60405180910390f35b34801561025c57600080fd5b506102656107c2565b6040516102729190613bf3565b60405180910390f35b34801561028757600080fd5b506102a2600480360381019061029d9190613102565b610854565b6040516102af9190613b71565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190613033565b6108d9565b005b3480156102ed57600080fd5b506102f66109f1565b6040516103039190613f55565b60405180910390f35b34801561031857600080fd5b50610333600480360381019061032e9190612f2d565b6109fe565b005b34801561034157600080fd5b5061034a610a5e565b005b34801561035857600080fd5b50610373600480360381019061036e9190613033565b610b31565b6040516103809190613f55565b60405180910390f35b34801561039557600080fd5b5061039e610bd6565b6040516103ab9190613f55565b60405180910390f35b3480156103c057600080fd5b506103c9610bdc565b005b3480156103d757600080fd5b506103e0610c84565b005b3480156103ee57600080fd5b5061040960048036038101906104049190612f2d565b610d4f565b005b34801561041757600080fd5b50610432600480360381019061042d9190613102565b610d6f565b60405161043f9190613f55565b60405180910390f35b610462600480360381019061045d9190613102565b610e06565b005b34801561047057600080fd5b5061048b600480360381019061048691906130c1565b610fc9565b005b34801561049957600080fd5b506104b460048036038101906104af9190613102565b61105f565b6040516104c19190613b71565b60405180910390f35b3480156104d657600080fd5b506104df611111565b6040516104ec9190613f55565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190612ec8565b61111d565b6040516105299190613f55565b60405180910390f35b34801561053e57600080fd5b506105476111d5565b005b34801561055557600080fd5b5061055e611312565b005b34801561056c57600080fd5b506105756113dc565b6040516105829190613b71565b60405180910390f35b34801561059757600080fd5b506105a0611406565b6040516105ad9190613bf3565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d89190612ff7565b611498565b005b3480156105eb57600080fd5b5061060660048036038101906106019190612f7c565b611619565b005b34801561061457600080fd5b5061062f600480360381019061062a9190613102565b61167b565b60405161063c9190613bf3565b60405180910390f35b34801561065157600080fd5b5061065a6117ee565b6040516106679190613f55565b60405180910390f35b34801561067c57600080fd5b506106856117f4565b005b34801561069357600080fd5b5061069c611981565b6040516106a99190613f55565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190612ef1565b611987565b6040516106e69190613bd8565b60405180910390f35b3480156106fb57600080fd5b50610704611a1b565b6040516107119190613bd8565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c9190612ec8565b611a2e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b657506107b582611bda565b5b9050919050565b601481565b6060600080546107d19061420f565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd9061420f565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b5050505050905090565b600061085f82611cbc565b61089e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089590613e35565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e48261105f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094c90613eb5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610974611d28565b73ffffffffffffffffffffffffffffffffffffffff1614806109a357506109a28161099d611d28565b611987565b5b6109e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d990613d95565b60405180910390fd5b6109ec8383611d30565b505050565b6000600880549050905090565b610a0f610a09611d28565b82611de9565b610a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4590613ed5565b60405180910390fd5b610a59838383611ec7565b505050565b610a66611d28565b73ffffffffffffffffffffffffffffffffffffffff16610a846113dc565b73ffffffffffffffffffffffffffffffffffffffff1614610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190613e55565b60405180910390fd5b6000610ae46109f1565b905060005b6032811015610b1a57610b07338284610b029190614044565b612123565b8080610b1290614241565b915050610ae9565b6000600e541415610b2d5743600e819055505b5050565b6000610b3c8361111d565b8210610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490613c55565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b610be4611d28565b73ffffffffffffffffffffffffffffffffffffffff16610c026113dc565b73ffffffffffffffffffffffffffffffffffffffff1614610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90613e55565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b610c8c611d28565b73ffffffffffffffffffffffffffffffffffffffff16610caa6113dc565b73ffffffffffffffffffffffffffffffffffffffff1614610d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf790613e55565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d4b573d6000803e3d6000fd5b5050565b610d6a83838360405180602001604052806000815250611619565b505050565b6000610d796109f1565b8210610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190613ef5565b60405180910390fd5b60088281548110610df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600c60009054906101000a900460ff16610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90613f35565b60405180910390fd5b60008111610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f90613c35565b60405180910390fd5b600b54610eb582610ea76109f1565b61214190919063ffffffff16565b1115610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed90613d55565b60405180910390fd5b6014811115610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3190613cd5565b60405180910390fd5b34610f568267011c37937e08000061215790919063ffffffff16565b14610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d90613df5565b60405180910390fd5b60005b81811015610fc557610fb233610fad6109f1565b612123565b8080610fbd90614241565b915050610f99565b5050565b610fd1611d28565b73ffffffffffffffffffffffffffffffffffffffff16610fef6113dc565b73ffffffffffffffffffffffffffffffffffffffff1614611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c90613e55565b60405180910390fd5b80600f908051906020019061105b929190612cec565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff90613dd5565b60405180910390fd5b80915050919050565b67011c37937e08000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118590613db5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111dd611d28565b73ffffffffffffffffffffffffffffffffffffffff166111fb6113dc565b73ffffffffffffffffffffffffffffffffffffffff1614611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124890613e55565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61131a611d28565b73ffffffffffffffffffffffffffffffffffffffff166113386113dc565b73ffffffffffffffffffffffffffffffffffffffff161461138e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138590613e55565b60405180910390fd5b6000600d54146113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca90613d75565b60405180910390fd5b43600e81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114159061420f565b80601f01602080910402602001604051908101604052809291908181526020018280546114419061420f565b801561148e5780601f106114635761010080835404028352916020019161148e565b820191906000526020600020905b81548152906001019060200180831161147157829003601f168201915b5050505050905090565b6114a0611d28565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561150e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150590613d15565b60405180910390fd5b806005600061151b611d28565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115c8611d28565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161160d9190613bd8565b60405180910390a35050565b61162a611624611d28565b83611de9565b611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090613ed5565b60405180910390fd5b6116758484848461216d565b50505050565b606061168682611cbc565b6116c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bc90613e95565b60405180910390fd5b60006010600084815260200190815260200160002080546116e59061420f565b80601f01602080910402602001604051908101604052809291908181526020018280546117119061420f565b801561175e5780601f106117335761010080835404028352916020019161175e565b820191906000526020600020905b81548152906001019060200180831161174157829003601f168201915b50505050509050600061176f6121c9565b90506000815114156117855781925050506117e9565b6000825111156117ba5780826040516020016117a2929190613b4d565b604051602081830303815290604052925050506117e9565b806117c48561225b565b6040516020016117d5929190613b4d565b604051602081830303815290604052925050505b919050565b600d5481565b6117fc611d28565b73ffffffffffffffffffffffffffffffffffffffff1661181a6113dc565b73ffffffffffffffffffffffffffffffffffffffff1614611870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186790613e55565b60405180910390fd5b6000600d54146118b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ac90613f15565b60405180910390fd5b6000600e5414156118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290613c15565b60405180910390fd5b600b54600e544060001c61190f919061428a565b600d8190555060ff61192c600e544361240890919063ffffffff16565b111561195757600b546001436119429190614125565b4060001c611950919061428a565b600d819055505b6000600d54141561197f576119786001600d5461214190919063ffffffff16565b600d819055505b565b600e5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611a36611d28565b73ffffffffffffffffffffffffffffffffffffffff16611a546113dc565b73ffffffffffffffffffffffffffffffffffffffff1614611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa190613e55565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190613c95565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ca557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611cb55750611cb48261241e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611da38361105f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611df482611cbc565b611e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2a90613d35565b60405180910390fd5b6000611e3e8361105f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ead57508373ffffffffffffffffffffffffffffffffffffffff16611e9584610854565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ebe5750611ebd8185611987565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ee78261105f565b73ffffffffffffffffffffffffffffffffffffffff1614611f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3490613e75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa490613cf5565b60405180910390fd5b611fb8838383612488565b611fc3600082611d30565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120139190614125565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461206a9190614044565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61213d82826040518060200160405280600081525061259c565b5050565b6000818361214f9190614044565b905092915050565b6000818361216591906140cb565b905092915050565b612178848484611ec7565b612184848484846125f7565b6121c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ba90613c75565b60405180910390fd5b50505050565b6060600f80546121d89061420f565b80601f01602080910402602001604051908101604052809291908181526020018280546122049061420f565b80156122515780601f1061222657610100808354040283529160200191612251565b820191906000526020600020905b81548152906001019060200180831161223457829003601f168201915b5050505050905090565b606060008214156122a3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612403565b600082905060005b600082146122d55780806122be90614241565b915050600a826122ce919061409a565b91506122ab565b60008167ffffffffffffffff811115612317577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123495781602001600182028036833780820191505090505b5090505b600085146123fc576001826123629190614125565b9150600a85612371919061428a565b603061237d9190614044565b60f81b8183815181106123b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123f5919061409a565b945061234d565b8093505050505b919050565b600081836124169190614125565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61249383838361278e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124d6576124d181612793565b612515565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125145761251383826127dc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125585761255381612949565b612597565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612596576125958282612a8c565b5b5b505050565b6125a68383612b0b565b6125b360008484846125f7565b6125f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e990613c75565b60405180910390fd5b505050565b60006126188473ffffffffffffffffffffffffffffffffffffffff16612cd9565b15612781578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612641611d28565b8786866040518563ffffffff1660e01b81526004016126639493929190613b8c565b602060405180830381600087803b15801561267d57600080fd5b505af19250505080156126ae57506040513d601f19601f820116820180604052508101906126ab9190613098565b60015b612731573d80600081146126de576040519150601f19603f3d011682016040523d82523d6000602084013e6126e3565b606091505b50600081511415612729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272090613c75565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612786565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127e98461111d565b6127f39190614125565b90506000600760008481526020019081526020016000205490508181146128d8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061295d9190614125565b90506000600960008481526020019081526020016000205490506000600883815481106129b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106129fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a70577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a978361111d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7290613e15565b60405180910390fd5b612b8481611cbc565b15612bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbb90613cb5565b60405180910390fd5b612bd060008383612488565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c209190614044565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612cf89061420f565b90600052602060002090601f016020900481019282612d1a5760008555612d61565b82601f10612d3357805160ff1916838001178555612d61565b82800160010185558215612d61579182015b82811115612d60578251825591602001919060010190612d45565b5b509050612d6e9190612d72565b5090565b5b80821115612d8b576000816000905550600101612d73565b5090565b6000612da2612d9d84613fa1565b613f70565b905082815260208101848484011115612dba57600080fd5b612dc58482856141cd565b509392505050565b6000612de0612ddb84613fd1565b613f70565b905082815260208101848484011115612df857600080fd5b612e038482856141cd565b509392505050565b600081359050612e1a81614388565b92915050565b600081359050612e2f8161439f565b92915050565b600081359050612e44816143b6565b92915050565b600081519050612e59816143b6565b92915050565b600082601f830112612e7057600080fd5b8135612e80848260208601612d8f565b91505092915050565b600082601f830112612e9a57600080fd5b8135612eaa848260208601612dcd565b91505092915050565b600081359050612ec2816143cd565b92915050565b600060208284031215612eda57600080fd5b6000612ee884828501612e0b565b91505092915050565b60008060408385031215612f0457600080fd5b6000612f1285828601612e0b565b9250506020612f2385828601612e0b565b9150509250929050565b600080600060608486031215612f4257600080fd5b6000612f5086828701612e0b565b9350506020612f6186828701612e0b565b9250506040612f7286828701612eb3565b9150509250925092565b60008060008060808587031215612f9257600080fd5b6000612fa087828801612e0b565b9450506020612fb187828801612e0b565b9350506040612fc287828801612eb3565b925050606085013567ffffffffffffffff811115612fdf57600080fd5b612feb87828801612e5f565b91505092959194509250565b6000806040838503121561300a57600080fd5b600061301885828601612e0b565b925050602061302985828601612e20565b9150509250929050565b6000806040838503121561304657600080fd5b600061305485828601612e0b565b925050602061306585828601612eb3565b9150509250929050565b60006020828403121561308157600080fd5b600061308f84828501612e35565b91505092915050565b6000602082840312156130aa57600080fd5b60006130b884828501612e4a565b91505092915050565b6000602082840312156130d357600080fd5b600082013567ffffffffffffffff8111156130ed57600080fd5b6130f984828501612e89565b91505092915050565b60006020828403121561311457600080fd5b600061312284828501612eb3565b91505092915050565b61313481614159565b82525050565b6131438161416b565b82525050565b600061315482614001565b61315e8185614017565b935061316e8185602086016141dc565b61317781614377565b840191505092915050565b600061318d8261400c565b6131978185614028565b93506131a78185602086016141dc565b6131b081614377565b840191505092915050565b60006131c68261400c565b6131d08185614039565b93506131e08185602086016141dc565b80840191505092915050565b60006131f9602383614028565b91507f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008301527f79657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061325f603383614028565b91507f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008301527f207468616e206f7220657175616c20746f2030000000000000000000000000006020830152604082019050919050565b60006132c5602b83614028565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061332b603283614028565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613391602683614028565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133f7601c83614028565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613437602383614028565b91507f43616e206f6e6c79206d696e7420757020746f2031302070657220707572636860008301527f61736500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061349d602483614028565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613503601983614028565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613543602c83614028565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006135a9602b83614028565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66204d6f6e6b6579730000000000000000000000000000000000000000006020830152604082019050919050565b600061360f601d83614028565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b600061364f603883614028565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006136b5602a83614028565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061371b602983614028565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613781601d83614028565b91507f53656e742065746865722076616c756520697320696e636f72726563740000006000830152602082019050919050565b60006137c1602083614028565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613801602c83614028565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613867602083614028565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006138a7602983614028565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061390d602f83614028565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613973602183614028565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139d9603183614028565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613a3f602c83614028565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613aa5602383614028565b91507f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b0b602083614028565b91507f53616c65206973206e6f742061637469766520617420746865206d6f6d656e746000830152602082019050919050565b613b47816141c3565b82525050565b6000613b5982856131bb565b9150613b6582846131bb565b91508190509392505050565b6000602082019050613b86600083018461312b565b92915050565b6000608082019050613ba1600083018761312b565b613bae602083018661312b565b613bbb6040830185613b3e565b8181036060830152613bcd8184613149565b905095945050505050565b6000602082019050613bed600083018461313a565b92915050565b60006020820190508181036000830152613c0d8184613182565b905092915050565b60006020820190508181036000830152613c2e816131ec565b9050919050565b60006020820190508181036000830152613c4e81613252565b9050919050565b60006020820190508181036000830152613c6e816132b8565b9050919050565b60006020820190508181036000830152613c8e8161331e565b9050919050565b60006020820190508181036000830152613cae81613384565b9050919050565b60006020820190508181036000830152613cce816133ea565b9050919050565b60006020820190508181036000830152613cee8161342a565b9050919050565b60006020820190508181036000830152613d0e81613490565b9050919050565b60006020820190508181036000830152613d2e816134f6565b9050919050565b60006020820190508181036000830152613d4e81613536565b9050919050565b60006020820190508181036000830152613d6e8161359c565b9050919050565b60006020820190508181036000830152613d8e81613602565b9050919050565b60006020820190508181036000830152613dae81613642565b9050919050565b60006020820190508181036000830152613dce816136a8565b9050919050565b60006020820190508181036000830152613dee8161370e565b9050919050565b60006020820190508181036000830152613e0e81613774565b9050919050565b60006020820190508181036000830152613e2e816137b4565b9050919050565b60006020820190508181036000830152613e4e816137f4565b9050919050565b60006020820190508181036000830152613e6e8161385a565b9050919050565b60006020820190508181036000830152613e8e8161389a565b9050919050565b60006020820190508181036000830152613eae81613900565b9050919050565b60006020820190508181036000830152613ece81613966565b9050919050565b60006020820190508181036000830152613eee816139cc565b9050919050565b60006020820190508181036000830152613f0e81613a32565b9050919050565b60006020820190508181036000830152613f2e81613a98565b9050919050565b60006020820190508181036000830152613f4e81613afe565b9050919050565b6000602082019050613f6a6000830184613b3e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613f9757613f96614348565b5b8060405250919050565b600067ffffffffffffffff821115613fbc57613fbb614348565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613fec57613feb614348565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061404f826141c3565b915061405a836141c3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561408f5761408e6142bb565b5b828201905092915050565b60006140a5826141c3565b91506140b0836141c3565b9250826140c0576140bf6142ea565b5b828204905092915050565b60006140d6826141c3565b91506140e1836141c3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561411a576141196142bb565b5b828202905092915050565b6000614130826141c3565b915061413b836141c3565b92508282101561414e5761414d6142bb565b5b828203905092915050565b6000614164826141a3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141fa5780820151818401526020810190506141df565b83811115614209576000848401525b50505050565b6000600282049050600182168061422757607f821691505b6020821081141561423b5761423a614319565b5b50919050565b600061424c826141c3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561427f5761427e6142bb565b5b600182019050919050565b6000614295826141c3565b91506142a0836141c3565b9250826142b0576142af6142ea565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61439181614159565b811461439c57600080fd5b50565b6143a88161416b565b81146143b357600080fd5b50565b6143bf81614177565b81146143ca57600080fd5b50565b6143d6816141c3565b81146143e157600080fd5b5056fea26469706673582212202c20d2f6dd0b958b996692b9d14ab3c07d7cbfcd3fc55ca20cca1ddc52a0621264736f6c63430008000033
Deployed Bytecode Sourcemap
49027:3792:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42871:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49253:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31158:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32618:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32155:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43524:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33508:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49847:301;;;;;;;;;;;;;:::i;:::-;;43192:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49302:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49602:89;;;;;;;;;;;;;:::i;:::-;;49699:140;;;;;;;;;;;;;:::i;:::-;;33884:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43714:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50156:643;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51906:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30852:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49181:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30582:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28410:148;;;;;;;;;;;;;:::i;:::-;;51512:182;;;;;;;;;;;;;:::i;:::-;;27759:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31327:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32911:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34106:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52023:793;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49383:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50807:697;;;;;;;;;;;;;:::i;:::-;;49418:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33277:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49342:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28713:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42871:237;42973:4;43012:35;42997:50;;;:11;:50;;;;:103;;;;43064:36;43088:11;43064:23;:36::i;:::-;42997:103;42990:110;;42871:237;;;:::o;49253:42::-;49293:2;49253:42;:::o;31158:100::-;31212:13;31245:5;31238:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31158:100;:::o;32618:221::-;32694:7;32722:16;32730:7;32722;:16::i;:::-;32714:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32807:15;:24;32823:7;32807:24;;;;;;;;;;;;;;;;;;;;;32800:31;;32618:221;;;:::o;32155:397::-;32236:13;32252:23;32267:7;32252:14;:23::i;:::-;32236:39;;32300:5;32294:11;;:2;:11;;;;32286:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32380:5;32364:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32389:37;32406:5;32413:12;:10;:12::i;:::-;32389:16;:37::i;:::-;32364:62;32356:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32523:21;32532:2;32536:7;32523:8;:21::i;:::-;32155:397;;;:::o;43524:113::-;43585:7;43612:10;:17;;;;43605:24;;43524:113;:::o;33508:305::-;33669:41;33688:12;:10;:12::i;:::-;33702:7;33669:18;:41::i;:::-;33661:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33777:28;33787:4;33793:2;33797:7;33777:9;:28::i;:::-;33508:305;;;:::o;49847:301::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49900:11:::1;49914:13;:11;:13::i;:::-;49900:27;;49938:6;49955:85;49971:2;49967:1;:6;49955:85;;;49995:33;50005:10;50026:1;50017:6;:10;;;;:::i;:::-;49995:9;:33::i;:::-;49975:3;;;;;:::i;:::-;;;;49955:85;;;50078:1;50056:18;;:23;50052:89;;;50117:12;50096:18;:33;;;;50052:89;28050:1;;49847:301::o:0;43192:256::-;43289:7;43325:23;43342:5;43325:16;:23::i;:::-;43317:5;:31;43309:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43414:12;:19;43427:5;43414:19;;;;;;;;;;;;;;;:26;43434:5;43414:26;;;;;;;;;;;;43407:33;;43192:256;;;;:::o;49302:33::-;;;;:::o;49602:89::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49671:12:::1;;;;;;;;;;;49670:13;49655:12;;:28;;;;;;;;;;;;;;;;;;49602:89::o:0;49699:140::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49747:12:::1;49762:21;49747:36;;49802:10;49794:28;;:37;49823:7;49794:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;28050:1;49699:140::o:0;33884:151::-;33988:39;34005:4;34011:2;34015:7;33988:39;;;;;;;;;;;;:16;:39::i;:::-;33884:151;;;:::o;43714:233::-;43789:7;43825:30;:28;:30::i;:::-;43817:5;:38;43809:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43922:10;43933:5;43922:17;;;;;;;;;;;;;;;;;;;;;;;;43915:24;;43714:233;;;:::o;50156:643::-;50231:12;;;;;;;;;;;50223:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50316:1;50299:14;:18;50291:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50429:10;;50392:33;50410:14;50392:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;50384:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;49293:2;50506:14;:34;;50498:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50631:9;50598:29;50612:14;49217:17;50598:13;;:29;;;;:::i;:::-;:42;50590:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;50692:6;50687:105;50708:14;50704:1;:18;50687:105;;;50744:36;50754:10;50766:13;:11;:13::i;:::-;50744:9;:36::i;:::-;50724:3;;;;;:::i;:::-;;;;50687:105;;;;50156:643;:::o;51906:109::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51999:8:::1;51980:16;:27;;;;;;;;;;;;:::i;:::-;;51906:109:::0;:::o;30852:239::-;30924:7;30944:13;30960:7;:16;30968:7;30960:16;;;;;;;;;;;;;;;;;;;;;30944:32;;31012:1;30995:19;;:5;:19;;;;30987:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31078:5;31071:12;;;30852:239;;;:::o;49181:53::-;49217:17;49181:53;:::o;30582:208::-;30654:7;30699:1;30682:19;;:5;:19;;;;30674:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30766:9;:16;30776:5;30766:16;;;;;;;;;;;;;;;;30759:23;;30582:208;;;:::o;28410:148::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28517:1:::1;28480:40;;28501:6;;;;;;;;;;;28480:40;;;;;;;;;;;;28548:1;28531:6;;:19;;;;;;;;;;;;;;;;;;28410:148::o:0;51512:182::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51607:1:::1;51590:13;;:18;51582:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;51674:12;51653:18;:33;;;;51512:182::o:0;27759:87::-;27805:7;27832:6;;;;;;;;;;;27825:13;;27759:87;:::o;31327:104::-;31383:13;31416:7;31409:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31327:104;:::o;32911:295::-;33026:12;:10;:12::i;:::-;33014:24;;:8;:24;;;;33006:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33126:8;33081:18;:32;33100:12;:10;:12::i;:::-;33081:32;;;;;;;;;;;;;;;:42;33114:8;33081:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33179:8;33150:48;;33165:12;:10;:12::i;:::-;33150:48;;;33189:8;33150:48;;;;;;:::i;:::-;;;;;;;;32911:295;;:::o;34106:285::-;34238:41;34257:12;:10;:12::i;:::-;34271:7;34238:18;:41::i;:::-;34230:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34344:39;34358:4;34364:2;34368:7;34377:5;34344:13;:39::i;:::-;34106:285;;;;:::o;52023:793::-;52096:13;52130:16;52138:7;52130;:16::i;:::-;52122:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52211:23;52237:10;:19;52248:7;52237:19;;;;;;;;;;;52211:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52267:18;52288:10;:8;:10::i;:::-;52267:31;;52396:1;52380:4;52374:18;:23;52370:72;;;52421:9;52414:16;;;;;;52370:72;52572:1;52552:9;52546:23;:27;52542:108;;;52621:4;52627:9;52604:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52590:48;;;;;;52542:108;52782:4;52788:18;:7;:16;:18::i;:::-;52765:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52751:57;;;;52023:793;;;;:::o;49383:28::-;;;;:::o;50807:697::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50889:1:::1;50872:13;;:18;50864:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50971:1;50949:18;;:23;;50941:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;51079:10;;51056:18;;51046:29;51041:35;;:48;;;;:::i;:::-;51025:13;:64;;;;51263:3;51224:36;51241:18;;51224:12;:16;;:36;;;;:::i;:::-;:42;51221:136;;;51335:10;;51329:1;51314:12;:16;;;;:::i;:::-;51304:27;51299:33;;:46;;;;:::i;:::-;51283:13;:62;;;;51221:136;51431:1;51414:13;;:18;51410:87;;;51465:20;51483:1;51465:13;;:17;;:20;;;;:::i;:::-;51449:13;:36;;;;51410:87;50807:697::o:0;49418:33::-;;;;:::o;33277:164::-;33374:4;33398:18;:25;33417:5;33398:25;;;;;;;;;;;;;;;:35;33424:8;33398:35;;;;;;;;;;;;;;;;;;;;;;;;;33391:42;;33277:164;;;;:::o;49342:32::-;;;;;;;;;;;;;:::o;28713:244::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28822:1:::1;28802:22;;:8;:22;;;;28794:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28912:8;28883:38;;28904:6;;;;;;;;;;;28883:38;;;;;;;;;;;;28941:8;28932:6;;:17;;;;;;;;;;;;;;;;;;28713:244:::0;:::o;30226:292::-;30328:4;30367:25;30352:40;;;:11;:40;;;;:105;;;;30424:33;30409:48;;;:11;:48;;;;30352:105;:158;;;;30474:36;30498:11;30474:23;:36::i;:::-;30352:158;30345:165;;30226:292;;;:::o;35858:127::-;35923:4;35975:1;35947:30;;:7;:16;35955:7;35947:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35940:37;;35858:127;;;:::o;26376:98::-;26429:7;26456:10;26449:17;;26376:98;:::o;39735:174::-;39837:2;39810:15;:24;39826:7;39810:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39893:7;39889:2;39855:46;;39864:23;39879:7;39864:14;:23::i;:::-;39855:46;;;;;;;;;;;;39735:174;;:::o;36152:348::-;36245:4;36270:16;36278:7;36270;:16::i;:::-;36262:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36346:13;36362:23;36377:7;36362:14;:23::i;:::-;36346:39;;36415:5;36404:16;;:7;:16;;;:51;;;;36448:7;36424:31;;:20;36436:7;36424:11;:20::i;:::-;:31;;;36404:51;:87;;;;36459:32;36476:5;36483:7;36459:16;:32::i;:::-;36404:87;36396:96;;;36152:348;;;;:::o;39073:544::-;39198:4;39171:31;;:23;39186:7;39171:14;:23::i;:::-;:31;;;39163:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39281:1;39267:16;;:2;:16;;;;39259:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39337:39;39358:4;39364:2;39368:7;39337:20;:39::i;:::-;39441:29;39458:1;39462:7;39441:8;:29::i;:::-;39502:1;39483:9;:15;39493:4;39483:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39531:1;39514:9;:13;39524:2;39514:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39562:2;39543:7;:16;39551:7;39543:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39601:7;39597:2;39582:27;;39591:4;39582:27;;;;;;;;;;;;39073:544;;;:::o;36842:110::-;36918:26;36928:2;36932:7;36918:26;;;;;;;;;;;;:9;:26::i;:::-;36842:110;;:::o;2834:98::-;2892:7;2923:1;2919;:5;;;;:::i;:::-;2912:12;;2834:98;;;;:::o;3572:::-;3630:7;3661:1;3657;:5;;;;:::i;:::-;3650:12;;3572:98;;;;:::o;35273:272::-;35387:28;35397:4;35403:2;35407:7;35387:9;:28::i;:::-;35434:48;35457:4;35463:2;35467:7;35476:5;35434:22;:48::i;:::-;35426:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35273:272;;;;:::o;51702:117::-;51762:13;51795:16;51788:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51702:117;:::o;7375:723::-;7431:13;7661:1;7652:5;:10;7648:53;;;7679:10;;;;;;;;;;;;;;;;;;;;;7648:53;7711:12;7726:5;7711:20;;7742:14;7767:78;7782:1;7774:4;:9;7767:78;;7800:8;;;;;:::i;:::-;;;;7831:2;7823:10;;;;;:::i;:::-;;;7767:78;;;7855:19;7887:6;7877:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7855:39;;7905:154;7921:1;7912:5;:10;7905:154;;7949:1;7939:11;;;;;:::i;:::-;;;8016:2;8008:5;:10;;;;:::i;:::-;7995:2;:24;;;;:::i;:::-;7982:39;;7965:6;7972;7965:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;8045:2;8036:11;;;;;:::i;:::-;;;7905:154;;;8083:6;8069:21;;;;;7375:723;;;;:::o;3215:98::-;3273:7;3304:1;3300;:5;;;;:::i;:::-;3293:12;;3215:98;;;;:::o;19449:157::-;19534:4;19573:25;19558:40;;;:11;:40;;;;19551:47;;19449:157;;;:::o;44560:555::-;44670:45;44697:4;44703:2;44707:7;44670:26;:45::i;:::-;44748:1;44732:18;;:4;:18;;;44728:187;;;44767:40;44799:7;44767:31;:40::i;:::-;44728:187;;;44837:2;44829:10;;:4;:10;;;44825:90;;44856:47;44889:4;44895:7;44856:32;:47::i;:::-;44825:90;44728:187;44943:1;44929:16;;:2;:16;;;44925:183;;;44962:45;44999:7;44962:36;:45::i;:::-;44925:183;;;45035:4;45029:10;;:2;:10;;;45025:83;;45056:40;45084:2;45088:7;45056:27;:40::i;:::-;45025:83;44925:183;44560:555;;;:::o;37179:250::-;37275:18;37281:2;37285:7;37275:5;:18::i;:::-;37312:54;37343:1;37347:2;37351:7;37360:5;37312:22;:54::i;:::-;37304:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;37179:250;;;:::o;40474:843::-;40595:4;40621:15;:2;:13;;;:15::i;:::-;40617:693;;;40673:2;40657:36;;;40694:12;:10;:12::i;:::-;40708:4;40714:7;40723:5;40657:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40653:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40920:1;40903:6;:13;:18;40899:341;;;40946:60;;;;;;;;;;:::i;:::-;;;;;;;;40899:341;41190:6;41184:13;41175:6;41171:2;41167:15;41160:38;40653:602;40790:45;;;40780:55;;;:6;:55;;;;40773:62;;;;;40617:693;41294:4;41287:11;;40474:843;;;;;;;:::o;41930:93::-;;;;:::o;45838:164::-;45942:10;:17;;;;45915:15;:24;45931:7;45915:24;;;;;;;;;;;:44;;;;45970:10;45986:7;45970:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45838:164;:::o;46629:988::-;46895:22;46945:1;46920:22;46937:4;46920:16;:22::i;:::-;:26;;;;:::i;:::-;46895:51;;46957:18;46978:17;:26;46996:7;46978:26;;;;;;;;;;;;46957:47;;47125:14;47111:10;:28;47107:328;;47156:19;47178:12;:18;47191:4;47178:18;;;;;;;;;;;;;;;:34;47197:14;47178:34;;;;;;;;;;;;47156:56;;47262:11;47229:12;:18;47242:4;47229:18;;;;;;;;;;;;;;;:30;47248:10;47229:30;;;;;;;;;;;:44;;;;47379:10;47346:17;:30;47364:11;47346:30;;;;;;;;;;;:43;;;;47107:328;;47531:17;:26;47549:7;47531:26;;;;;;;;;;;47524:33;;;47575:12;:18;47588:4;47575:18;;;;;;;;;;;;;;;:34;47594:14;47575:34;;;;;;;;;;;47568:41;;;46629:988;;;;:::o;47912:1079::-;48165:22;48210:1;48190:10;:17;;;;:21;;;;:::i;:::-;48165:46;;48222:18;48243:15;:24;48259:7;48243:24;;;;;;;;;;;;48222:45;;48594:19;48616:10;48627:14;48616:26;;;;;;;;;;;;;;;;;;;;;;;;48594:48;;48680:11;48655:10;48666;48655:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;48791:10;48760:15;:28;48776:11;48760:28;;;;;;;;;;;:41;;;;48932:15;:24;48948:7;48932:24;;;;;;;;;;;48925:31;;;48967:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47912:1079;;;;:::o;45416:221::-;45501:14;45518:20;45535:2;45518:16;:20::i;:::-;45501:37;;45576:7;45549:12;:16;45562:2;45549:16;;;;;;;;;;;;;;;:24;45566:6;45549:24;;;;;;;;;;;:34;;;;45623:6;45594:17;:26;45612:7;45594:26;;;;;;;;;;;:35;;;;45416:221;;;:::o;37765:382::-;37859:1;37845:16;;:2;:16;;;;37837:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37918:16;37926:7;37918;:16::i;:::-;37917:17;37909:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37980:45;38009:1;38013:2;38017:7;37980:20;:45::i;:::-;38055:1;38038:9;:13;38048:2;38038:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38086:2;38067:7;:16;38075:7;38067:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38131:7;38127:2;38106:33;;38123:1;38106:33;;;;;;;;;;;;37765:382;;:::o;9840:422::-;9900:4;10108:12;10219:7;10207:20;10199:28;;10253:1;10246:4;:8;10239:15;;;9840:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:118::-;6171:24;6189:5;6171:24;:::i;:::-;6166:3;6159:37;6149:53;;:::o;6208:109::-;6289:21;6304:5;6289:21;:::i;:::-;6284:3;6277:34;6267:50;;:::o;6323:360::-;;6437:38;6469:5;6437:38;:::i;:::-;6491:70;6554:6;6549:3;6491:70;:::i;:::-;6484:77;;6570:52;6615:6;6610:3;6603:4;6596:5;6592:16;6570:52;:::i;:::-;6647:29;6669:6;6647:29;:::i;:::-;6642:3;6638:39;6631:46;;6413:270;;;;;:::o;6689:364::-;;6805:39;6838:5;6805:39;:::i;:::-;6860:71;6924:6;6919:3;6860:71;:::i;:::-;6853:78;;6940:52;6985:6;6980:3;6973:4;6966:5;6962:16;6940:52;:::i;:::-;7017:29;7039:6;7017:29;:::i;:::-;7012:3;7008:39;7001:46;;6781:272;;;;;:::o;7059:377::-;;7193:39;7226:5;7193:39;:::i;:::-;7248:89;7330:6;7325:3;7248:89;:::i;:::-;7241:96;;7346:52;7391:6;7386:3;7379:4;7372:5;7368:16;7346:52;:::i;:::-;7423:6;7418:3;7414:16;7407:23;;7169:267;;;;;:::o;7442:367::-;;7605:67;7669:2;7664:3;7605:67;:::i;:::-;7598:74;;7702:34;7698:1;7693:3;7689:11;7682:55;7768:5;7763:2;7758:3;7754:12;7747:27;7800:2;7795:3;7791:12;7784:19;;7588:221;;;:::o;7815:383::-;;7978:67;8042:2;8037:3;7978:67;:::i;:::-;7971:74;;8075:34;8071:1;8066:3;8062:11;8055:55;8141:21;8136:2;8131:3;8127:12;8120:43;8189:2;8184:3;8180:12;8173:19;;7961:237;;;:::o;8204:375::-;;8367:67;8431:2;8426:3;8367:67;:::i;:::-;8360:74;;8464:34;8460:1;8455:3;8451:11;8444:55;8530:13;8525:2;8520:3;8516:12;8509:35;8570:2;8565:3;8561:12;8554:19;;8350:229;;;:::o;8585:382::-;;8748:67;8812:2;8807:3;8748:67;:::i;:::-;8741:74;;8845:34;8841:1;8836:3;8832:11;8825:55;8911:20;8906:2;8901:3;8897:12;8890:42;8958:2;8953:3;8949:12;8942:19;;8731:236;;;:::o;8973:370::-;;9136:67;9200:2;9195:3;9136:67;:::i;:::-;9129:74;;9233:34;9229:1;9224:3;9220:11;9213:55;9299:8;9294:2;9289:3;9285:12;9278:30;9334:2;9329:3;9325:12;9318:19;;9119:224;;;:::o;9349:326::-;;9512:67;9576:2;9571:3;9512:67;:::i;:::-;9505:74;;9609:30;9605:1;9600:3;9596:11;9589:51;9666:2;9661:3;9657:12;9650:19;;9495:180;;;:::o;9681:367::-;;9844:67;9908:2;9903:3;9844:67;:::i;:::-;9837:74;;9941:34;9937:1;9932:3;9928:11;9921:55;10007:5;10002:2;9997:3;9993:12;9986:27;10039:2;10034:3;10030:12;10023:19;;9827:221;;;:::o;10054:368::-;;10217:67;10281:2;10276:3;10217:67;:::i;:::-;10210:74;;10314:34;10310:1;10305:3;10301:11;10294:55;10380:6;10375:2;10370:3;10366:12;10359:28;10413:2;10408:3;10404:12;10397:19;;10200:222;;;:::o;10428:323::-;;10591:67;10655:2;10650:3;10591:67;:::i;:::-;10584:74;;10688:27;10684:1;10679:3;10675:11;10668:48;10742:2;10737:3;10733:12;10726:19;;10574:177;;;:::o;10757:376::-;;10920:67;10984:2;10979:3;10920:67;:::i;:::-;10913:74;;11017:34;11013:1;11008:3;11004:11;10997:55;11083:14;11078:2;11073:3;11069:12;11062:36;11124:2;11119:3;11115:12;11108:19;;10903:230;;;:::o;11139:375::-;;11302:67;11366:2;11361:3;11302:67;:::i;:::-;11295:74;;11399:34;11395:1;11390:3;11386:11;11379:55;11465:13;11460:2;11455:3;11451:12;11444:35;11505:2;11500:3;11496:12;11489:19;;11285:229;;;:::o;11520:327::-;;11683:67;11747:2;11742:3;11683:67;:::i;:::-;11676:74;;11780:31;11776:1;11771:3;11767:11;11760:52;11838:2;11833:3;11829:12;11822:19;;11666:181;;;:::o;11853:388::-;;12016:67;12080:2;12075:3;12016:67;:::i;:::-;12009:74;;12113:34;12109:1;12104:3;12100:11;12093:55;12179:26;12174:2;12169:3;12165:12;12158:48;12232:2;12227:3;12223:12;12216:19;;11999:242;;;:::o;12247:374::-;;12410:67;12474:2;12469:3;12410:67;:::i;:::-;12403:74;;12507:34;12503:1;12498:3;12494:11;12487:55;12573:12;12568:2;12563:3;12559:12;12552:34;12612:2;12607:3;12603:12;12596:19;;12393:228;;;:::o;12627:373::-;;12790:67;12854:2;12849:3;12790:67;:::i;:::-;12783:74;;12887:34;12883:1;12878:3;12874:11;12867:55;12953:11;12948:2;12943:3;12939:12;12932:33;12991:2;12986:3;12982:12;12975:19;;12773:227;;;:::o;13006:327::-;;13169:67;13233:2;13228:3;13169:67;:::i;:::-;13162:74;;13266:31;13262:1;13257:3;13253:11;13246:52;13324:2;13319:3;13315:12;13308:19;;13152:181;;;:::o;13339:330::-;;13502:67;13566:2;13561:3;13502:67;:::i;:::-;13495:74;;13599:34;13595:1;13590:3;13586:11;13579:55;13660:2;13655:3;13651:12;13644:19;;13485:184;;;:::o;13675:376::-;;13838:67;13902:2;13897:3;13838:67;:::i;:::-;13831:74;;13935:34;13931:1;13926:3;13922:11;13915:55;14001:14;13996:2;13991:3;13987:12;13980:36;14042:2;14037:3;14033:12;14026:19;;13821:230;;;:::o;14057:330::-;;14220:67;14284:2;14279:3;14220:67;:::i;:::-;14213:74;;14317:34;14313:1;14308:3;14304:11;14297:55;14378:2;14373:3;14369:12;14362:19;;14203:184;;;:::o;14393:373::-;;14556:67;14620:2;14615:3;14556:67;:::i;:::-;14549:74;;14653:34;14649:1;14644:3;14640:11;14633:55;14719:11;14714:2;14709:3;14705:12;14698:33;14757:2;14752:3;14748:12;14741:19;;14539:227;;;:::o;14772:379::-;;14935:67;14999:2;14994:3;14935:67;:::i;:::-;14928:74;;15032:34;15028:1;15023:3;15019:11;15012:55;15098:17;15093:2;15088:3;15084:12;15077:39;15142:2;15137:3;15133:12;15126:19;;14918:233;;;:::o;15157:365::-;;15320:67;15384:2;15379:3;15320:67;:::i;:::-;15313:74;;15417:34;15413:1;15408:3;15404:11;15397:55;15483:3;15478:2;15473:3;15469:12;15462:25;15513:2;15508:3;15504:12;15497:19;;15303:219;;;:::o;15528:381::-;;15691:67;15755:2;15750:3;15691:67;:::i;:::-;15684:74;;15788:34;15784:1;15779:3;15775:11;15768:55;15854:19;15849:2;15844:3;15840:12;15833:41;15900:2;15895:3;15891:12;15884:19;;15674:235;;;:::o;15915:376::-;;16078:67;16142:2;16137:3;16078:67;:::i;:::-;16071:74;;16175:34;16171:1;16166:3;16162:11;16155:55;16241:14;16236:2;16231:3;16227:12;16220:36;16282:2;16277:3;16273:12;16266:19;;16061:230;;;:::o;16297:367::-;;16460:67;16524:2;16519:3;16460:67;:::i;:::-;16453:74;;16557:34;16553:1;16548:3;16544:11;16537:55;16623:5;16618:2;16613:3;16609:12;16602:27;16655:2;16650:3;16646:12;16639:19;;16443:221;;;:::o;16670:330::-;;16833:67;16897:2;16892:3;16833:67;:::i;:::-;16826:74;;16930:34;16926:1;16921:3;16917:11;16910:55;16991:2;16986:3;16982:12;16975:19;;16816:184;;;:::o;17006:118::-;17093:24;17111:5;17093:24;:::i;:::-;17088:3;17081:37;17071:53;;:::o;17130:435::-;;17332:95;17423:3;17414:6;17332:95;:::i;:::-;17325:102;;17444:95;17535:3;17526:6;17444:95;:::i;:::-;17437:102;;17556:3;17549:10;;17314:251;;;;;:::o;17571:222::-;;17702:2;17691:9;17687:18;17679:26;;17715:71;17783:1;17772:9;17768:17;17759:6;17715:71;:::i;:::-;17669:124;;;;:::o;17799:640::-;;18032:3;18021:9;18017:19;18009:27;;18046:71;18114:1;18103:9;18099:17;18090:6;18046:71;:::i;:::-;18127:72;18195:2;18184:9;18180:18;18171:6;18127:72;:::i;:::-;18209;18277:2;18266:9;18262:18;18253:6;18209:72;:::i;:::-;18328:9;18322:4;18318:20;18313:2;18302:9;18298:18;18291:48;18356:76;18427:4;18418:6;18356:76;:::i;:::-;18348:84;;17999:440;;;;;;;:::o;18445:210::-;;18570:2;18559:9;18555:18;18547:26;;18583:65;18645:1;18634:9;18630:17;18621:6;18583:65;:::i;:::-;18537:118;;;;:::o;18661:313::-;;18812:2;18801:9;18797:18;18789:26;;18861:9;18855:4;18851:20;18847:1;18836:9;18832:17;18825:47;18889:78;18962:4;18953:6;18889:78;:::i;:::-;18881:86;;18779:195;;;;:::o;18980:419::-;;19184:2;19173:9;19169:18;19161:26;;19233:9;19227:4;19223:20;19219:1;19208:9;19204:17;19197:47;19261:131;19387:4;19261:131;:::i;:::-;19253:139;;19151:248;;;:::o;19405:419::-;;19609:2;19598:9;19594:18;19586:26;;19658:9;19652:4;19648:20;19644:1;19633:9;19629:17;19622:47;19686:131;19812:4;19686:131;:::i;:::-;19678:139;;19576:248;;;:::o;19830:419::-;;20034:2;20023:9;20019:18;20011:26;;20083:9;20077:4;20073:20;20069:1;20058:9;20054:17;20047:47;20111:131;20237:4;20111:131;:::i;:::-;20103:139;;20001:248;;;:::o;20255:419::-;;20459:2;20448:9;20444:18;20436:26;;20508:9;20502:4;20498:20;20494:1;20483:9;20479:17;20472:47;20536:131;20662:4;20536:131;:::i;:::-;20528:139;;20426:248;;;:::o;20680:419::-;;20884:2;20873:9;20869:18;20861:26;;20933:9;20927:4;20923:20;20919:1;20908:9;20904:17;20897:47;20961:131;21087:4;20961:131;:::i;:::-;20953:139;;20851:248;;;:::o;21105:419::-;;21309:2;21298:9;21294:18;21286:26;;21358:9;21352:4;21348:20;21344:1;21333:9;21329:17;21322:47;21386:131;21512:4;21386:131;:::i;:::-;21378:139;;21276:248;;;:::o;21530:419::-;;21734:2;21723:9;21719:18;21711:26;;21783:9;21777:4;21773:20;21769:1;21758:9;21754:17;21747:47;21811:131;21937:4;21811:131;:::i;:::-;21803:139;;21701:248;;;:::o;21955:419::-;;22159:2;22148:9;22144:18;22136:26;;22208:9;22202:4;22198:20;22194:1;22183:9;22179:17;22172:47;22236:131;22362:4;22236:131;:::i;:::-;22228:139;;22126:248;;;:::o;22380:419::-;;22584:2;22573:9;22569:18;22561:26;;22633:9;22627:4;22623:20;22619:1;22608:9;22604:17;22597:47;22661:131;22787:4;22661:131;:::i;:::-;22653:139;;22551:248;;;:::o;22805:419::-;;23009:2;22998:9;22994:18;22986:26;;23058:9;23052:4;23048:20;23044:1;23033:9;23029:17;23022:47;23086:131;23212:4;23086:131;:::i;:::-;23078:139;;22976:248;;;:::o;23230:419::-;;23434:2;23423:9;23419:18;23411:26;;23483:9;23477:4;23473:20;23469:1;23458:9;23454:17;23447:47;23511:131;23637:4;23511:131;:::i;:::-;23503:139;;23401:248;;;:::o;23655:419::-;;23859:2;23848:9;23844:18;23836:26;;23908:9;23902:4;23898:20;23894:1;23883:9;23879:17;23872:47;23936:131;24062:4;23936:131;:::i;:::-;23928:139;;23826:248;;;:::o;24080:419::-;;24284:2;24273:9;24269:18;24261:26;;24333:9;24327:4;24323:20;24319:1;24308:9;24304:17;24297:47;24361:131;24487:4;24361:131;:::i;:::-;24353:139;;24251:248;;;:::o;24505:419::-;;24709:2;24698:9;24694:18;24686:26;;24758:9;24752:4;24748:20;24744:1;24733:9;24729:17;24722:47;24786:131;24912:4;24786:131;:::i;:::-;24778:139;;24676:248;;;:::o;24930:419::-;;25134:2;25123:9;25119:18;25111:26;;25183:9;25177:4;25173:20;25169:1;25158:9;25154:17;25147:47;25211:131;25337:4;25211:131;:::i;:::-;25203:139;;25101:248;;;:::o;25355:419::-;;25559:2;25548:9;25544:18;25536:26;;25608:9;25602:4;25598:20;25594:1;25583:9;25579:17;25572:47;25636:131;25762:4;25636:131;:::i;:::-;25628:139;;25526:248;;;:::o;25780:419::-;;25984:2;25973:9;25969:18;25961:26;;26033:9;26027:4;26023:20;26019:1;26008:9;26004:17;25997:47;26061:131;26187:4;26061:131;:::i;:::-;26053:139;;25951:248;;;:::o;26205:419::-;;26409:2;26398:9;26394:18;26386:26;;26458:9;26452:4;26448:20;26444:1;26433:9;26429:17;26422:47;26486:131;26612:4;26486:131;:::i;:::-;26478:139;;26376:248;;;:::o;26630:419::-;;26834:2;26823:9;26819:18;26811:26;;26883:9;26877:4;26873:20;26869:1;26858:9;26854:17;26847:47;26911:131;27037:4;26911:131;:::i;:::-;26903:139;;26801:248;;;:::o;27055:419::-;;27259:2;27248:9;27244:18;27236:26;;27308:9;27302:4;27298:20;27294:1;27283:9;27279:17;27272:47;27336:131;27462:4;27336:131;:::i;:::-;27328:139;;27226:248;;;:::o;27480:419::-;;27684:2;27673:9;27669:18;27661:26;;27733:9;27727:4;27723:20;27719:1;27708:9;27704:17;27697:47;27761:131;27887:4;27761:131;:::i;:::-;27753:139;;27651:248;;;:::o;27905:419::-;;28109:2;28098:9;28094:18;28086:26;;28158:9;28152:4;28148:20;28144:1;28133:9;28129:17;28122:47;28186:131;28312:4;28186:131;:::i;:::-;28178:139;;28076:248;;;:::o;28330:419::-;;28534:2;28523:9;28519:18;28511:26;;28583:9;28577:4;28573:20;28569:1;28558:9;28554:17;28547:47;28611:131;28737:4;28611:131;:::i;:::-;28603:139;;28501:248;;;:::o;28755:419::-;;28959:2;28948:9;28944:18;28936:26;;29008:9;29002:4;28998:20;28994:1;28983:9;28979:17;28972:47;29036:131;29162:4;29036:131;:::i;:::-;29028:139;;28926:248;;;:::o;29180:419::-;;29384:2;29373:9;29369:18;29361:26;;29433:9;29427:4;29423:20;29419:1;29408:9;29404:17;29397:47;29461:131;29587:4;29461:131;:::i;:::-;29453:139;;29351:248;;;:::o;29605:419::-;;29809:2;29798:9;29794:18;29786:26;;29858:9;29852:4;29848:20;29844:1;29833:9;29829:17;29822:47;29886:131;30012:4;29886:131;:::i;:::-;29878:139;;29776:248;;;:::o;30030:222::-;;30161:2;30150:9;30146:18;30138:26;;30174:71;30242:1;30231:9;30227:17;30218:6;30174:71;:::i;:::-;30128:124;;;;:::o;30258:283::-;;30324:2;30318:9;30308:19;;30366:4;30358:6;30354:17;30473:6;30461:10;30458:22;30437:18;30425:10;30422:34;30419:62;30416:2;;;30484:18;;:::i;:::-;30416:2;30524:10;30520:2;30513:22;30298:243;;;;:::o;30547:331::-;;30698:18;30690:6;30687:30;30684:2;;;30720:18;;:::i;:::-;30684:2;30805:4;30801:9;30794:4;30786:6;30782:17;30778:33;30770:41;;30866:4;30860;30856:15;30848:23;;30613:265;;;:::o;30884:332::-;;31036:18;31028:6;31025:30;31022:2;;;31058:18;;:::i;:::-;31022:2;31143:4;31139:9;31132:4;31124:6;31120:17;31116:33;31108:41;;31204:4;31198;31194:15;31186:23;;30951:265;;;:::o;31222:98::-;;31307:5;31301:12;31291:22;;31280:40;;;:::o;31326:99::-;;31412:5;31406:12;31396:22;;31385:40;;;:::o;31431:168::-;;31548:6;31543:3;31536:19;31588:4;31583:3;31579:14;31564:29;;31526:73;;;;:::o;31605:169::-;;31723:6;31718:3;31711:19;31763:4;31758:3;31754:14;31739:29;;31701:73;;;;:::o;31780:148::-;;31919:3;31904:18;;31894:34;;;;:::o;31934:305::-;;31993:20;32011:1;31993:20;:::i;:::-;31988:25;;32027:20;32045:1;32027:20;:::i;:::-;32022:25;;32181:1;32113:66;32109:74;32106:1;32103:81;32100:2;;;32187:18;;:::i;:::-;32100:2;32231:1;32228;32224:9;32217:16;;31978:261;;;;:::o;32245:185::-;;32302:20;32320:1;32302:20;:::i;:::-;32297:25;;32336:20;32354:1;32336:20;:::i;:::-;32331:25;;32375:1;32365:2;;32380:18;;:::i;:::-;32365:2;32422:1;32419;32415:9;32410:14;;32287:143;;;;:::o;32436:348::-;;32499:20;32517:1;32499:20;:::i;:::-;32494:25;;32533:20;32551:1;32533:20;:::i;:::-;32528:25;;32721:1;32653:66;32649:74;32646:1;32643:81;32638:1;32631:9;32624:17;32620:105;32617:2;;;32728:18;;:::i;:::-;32617:2;32776:1;32773;32769:9;32758:20;;32484:300;;;;:::o;32790:191::-;;32850:20;32868:1;32850:20;:::i;:::-;32845:25;;32884:20;32902:1;32884:20;:::i;:::-;32879:25;;32923:1;32920;32917:8;32914:2;;;32928:18;;:::i;:::-;32914:2;32973:1;32970;32966:9;32958:17;;32835:146;;;;:::o;32987:96::-;;33053:24;33071:5;33053:24;:::i;:::-;33042:35;;33032:51;;;:::o;33089:90::-;;33166:5;33159:13;33152:21;33141:32;;33131:48;;;:::o;33185:149::-;;33261:66;33254:5;33250:78;33239:89;;33229:105;;;:::o;33340:126::-;;33417:42;33410:5;33406:54;33395:65;;33385:81;;;:::o;33472:77::-;;33538:5;33527:16;;33517:32;;;:::o;33555:154::-;33639:6;33634:3;33629;33616:30;33701:1;33692:6;33687:3;33683:16;33676:27;33606:103;;;:::o;33715:307::-;33783:1;33793:113;33807:6;33804:1;33801:13;33793:113;;;33892:1;33887:3;33883:11;33877:18;33873:1;33868:3;33864:11;33857:39;33829:2;33826:1;33822:10;33817:15;;33793:113;;;33924:6;33921:1;33918:13;33915:2;;;34004:1;33995:6;33990:3;33986:16;33979:27;33915:2;33764:258;;;;:::o;34028:320::-;;34109:1;34103:4;34099:12;34089:22;;34156:1;34150:4;34146:12;34177:18;34167:2;;34233:4;34225:6;34221:17;34211:27;;34167:2;34295;34287:6;34284:14;34264:18;34261:38;34258:2;;;34314:18;;:::i;:::-;34258:2;34079:269;;;;:::o;34354:233::-;;34416:24;34434:5;34416:24;:::i;:::-;34407:33;;34462:66;34455:5;34452:77;34449:2;;;34532:18;;:::i;:::-;34449:2;34579:1;34572:5;34568:13;34561:20;;34397:190;;;:::o;34593:176::-;;34642:20;34660:1;34642:20;:::i;:::-;34637:25;;34676:20;34694:1;34676:20;:::i;:::-;34671:25;;34715:1;34705:2;;34720:18;;:::i;:::-;34705:2;34761:1;34758;34754:9;34749:14;;34627:142;;;;:::o;34775:180::-;34823:77;34820:1;34813:88;34920:4;34917:1;34910:15;34944:4;34941:1;34934:15;34961:180;35009:77;35006:1;34999:88;35106:4;35103:1;35096:15;35130:4;35127:1;35120:15;35147:180;35195:77;35192:1;35185:88;35292:4;35289:1;35282:15;35316:4;35313:1;35306:15;35333:180;35381:77;35378:1;35371:88;35478:4;35475:1;35468:15;35502:4;35499:1;35492:15;35519:102;;35611:2;35607:7;35602:2;35595:5;35591:14;35587:28;35577:38;;35567:54;;;:::o;35627:122::-;35700:24;35718:5;35700:24;:::i;:::-;35693:5;35690:35;35680:2;;35739:1;35736;35729:12;35680:2;35670:79;:::o;35755:116::-;35825:21;35840:5;35825:21;:::i;:::-;35818:5;35815:32;35805:2;;35861:1;35858;35851:12;35805:2;35795:76;:::o;35877:120::-;35949:23;35966:5;35949:23;:::i;:::-;35942:5;35939:34;35929:2;;35987:1;35984;35977:12;35929:2;35919:78;:::o;36003:122::-;36076:24;36094:5;36076:24;:::i;:::-;36069:5;36066:35;36056:2;;36115:1;36112;36105:12;36056:2;36046:79;:::o
Swarm Source
ipfs://2c20d2f6dd0b958b996692b9d14ab3c07d7cbfcd3fc55ca20cca1ddc52a06212
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.