Token
ERC-1155
Overview
Max Total Supply
0
Holders
31
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
LIT
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at mumbai.polygonscan.com on 2021-08-24 */ // File: src/contracts/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ 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) { 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) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @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. 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) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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) { 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) { require(b > 0, errorMessage); return a % b; } } // File: src/contracts/ERC1155.sol // File: @openzeppelin/contracts/introspection/IERC165.sol // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle( address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value ); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll( address indexed account, address indexed operator, bool approved ); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/IERC1155MetadataURI.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol pragma solidity >=0.6.0 <0.8.0; /** * _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor() internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity >=0.6.2 <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); } } } } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol pragma solidity >=0.6.0 <0.8.0; /** * * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using SafeMath for uint256; using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /* * bytes4(keccak256('balanceOf(address,uint256)')) == 0x00fdd58e * bytes4(keccak256('balanceOfBatch(address[],uint256[])')) == 0x4e1273f4 * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('safeTransferFrom(address,address,uint256,uint256,bytes)')) == 0xf242432a * bytes4(keccak256('safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)')) == 0x2eb2c2d6 * * => 0x00fdd58e ^ 0x4e1273f4 ^ 0xa22cb465 ^ * 0xe985e9c5 ^ 0xf242432a ^ 0x2eb2c2d6 == 0xd9b67a26 */ bytes4 private constant _INTERFACE_ID_ERC1155 = 0xd9b67a26; /* * bytes4(keccak256('uri(uint256)')) == 0x0e89341c */ bytes4 private constant _INTERFACE_ID_ERC1155_METADATA_URI = 0x0e89341c; /** * @dev See {_setURI}. */ constructor(string memory uri_) public { _setURI(uri_); // register the supported interfaces to conform to ERC1155 via ERC165 _registerInterface(_INTERFACE_ID_ERC1155); // register the supported interfaces to conform to ERC1155MetadataURI via ERC165 _registerInterface(_INTERFACE_ID_ERC1155_METADATA_URI); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) external view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require( account != address(0), "ERC1155: balance query for the zero address" ); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require( accounts.length == ids.length, "ERC1155: accounts and ids length mismatch" ); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require( _msgSender() != operator, "ERC1155: setting approval status for self" ); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); address operator = _msgSender(); _beforeTokenTransfer( operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data ); _balances[id][from] = _balances[id][from].sub( amount, "ERC1155: insufficient balance for transfer" ); _balances[id][to] = _balances[id][to].add(amount); emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; _balances[id][from] = _balances[id][from].sub( amount, "ERC1155: insufficient balance for transfer" ); _balances[id][to] = _balances[id][to].add(amount); } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck( operator, from, to, ids, amounts, data ); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address account, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer( operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data ); _balances[id][account] = _balances[id][account].add(amount); emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck( operator, address(0), account, id, amount, data ); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] = amounts[i].add(_balances[ids[i]][to]); } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck( operator, address(0), to, ids, amounts, data ); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn( address account, uint256 id, uint256 amount ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer( operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "" ); _balances[id][account] = _balances[id][account].sub( amount, "ERC1155: burn amount exceeds balance" ); emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address account, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][account] = _balances[ids[i]][account].sub( amounts[i], "ERC1155: burn amount exceeds balance" ); } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received( operator, from, id, amount, data ) returns (bytes4 response) { if ( response != IERC1155Receiver(to).onERC1155Received.selector ) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived( operator, from, ids, amounts, data ) returns (bytes4 response) { if ( response != IERC1155Receiver(to).onERC1155BatchReceived.selector ) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: src/contracts/MetaTxns.sol /** * https://github.com/maticnetwork/pos-portal/blob/master/contracts/common/ContextMixin.sol */ abstract contract ContextMixin { function msgSender() internal view returns (address payable sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = msg.sender; } return sender; } } /** * https://github.com/maticnetwork/pos-portal/blob/master/contracts/common/Initializable.sol */ contract Initializable { bool inited = false; modifier initializer() { require(!inited, "already inited"); _; inited = true; } } /** * https://github.com/maticnetwork/pos-portal/blob/master/contracts/common/EIP712Base.sol */ contract EIP712Base is Initializable { struct EIP712Domain { string name; string version; address verifyingContract; bytes32 salt; } string public constant ERC712_VERSION = "1"; bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256( bytes( "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)" ) ); bytes32 internal domainSeperator; // supposed to be called once while initializing. // one of the contractsa that inherits this contract follows proxy pattern // so it is not possible to do this in a constructor function _initializeEIP712(string memory name) internal initializer { _setDomainSeperator(name); } function _setDomainSeperator(string memory name) internal { domainSeperator = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(ERC712_VERSION)), address(this), bytes32(getChainId()) ) ); } function getDomainSeperator() public view returns (bytes32) { return domainSeperator; } function getChainId() public pure returns (uint256) { uint256 id; assembly { id := chainid() } return id; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash) ); } } /** * https://github.com/maticnetwork/pos-portal/blob/master/contracts/common/NativeMetaTransaction.sol */ contract NativeMetaTransaction is EIP712Base { using SafeMath for uint256; bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256( bytes( "MetaTransaction(uint256 nonce,address from,bytes functionSignature)" ) ); event MetaTransactionExecuted( address userAddress, address payable relayerAddress, bytes functionSignature ); mapping(address => uint256) nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public payable returns (bytes memory) { MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require( verify(userAddress, metaTx, sigR, sigS, sigV), "Signer and signature do not match" ); // increase nonce for user (to avoid re-use) nonces[userAddress] = nonces[userAddress].add(1); emit MetaTransactionExecuted( userAddress, msg.sender, functionSignature ); // Append userAddress and relayer address at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call( abi.encodePacked(functionSignature, userAddress) ); require(success, "Function call not successful"); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256( abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) ) ); } function getNonce(address user) public view returns (uint256 nonce) { nonce = nonces[user]; } function verify( address signer, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER"); return signer == ecrecover( toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS ); } } // File: src/contracts/LIT.sol pragma solidity ^0.7.6; contract LIT is ERC1155, ContextMixin, NativeMetaTransaction { // token vars uint256 public tokenIds; // admin func vars address private admin; bool private openseaProxyEnabled; modifier onlyAdmin() { require(msg.sender == admin, "Only Admin"); _; } // constructor() ERC1155("https://mintlit.com/metadata/polygon/{id}") { // constructor() ERC1155("https://mintlit.com/metadata/eth/{id}") { // constructor() ERC1155("https://mintlit.com/metadata/fantom/{id}") { // constructor() ERC1155("https://mintlit.com/metadata/xdai/{id}") { // constructor() ERC1155("https://mintlit.com/metadata/kovan/{id}") { constructor() ERC1155("https://mintlit.com/metadata/mumbai/{id}") { admin = msg.sender; openseaProxyEnabled = true; _initializeEIP712("LIT"); } function mint(uint256 quantity) public returns (uint256) { tokenIds++; _mint(msg.sender, tokenIds, quantity, ""); return tokenIds; } /** * Override isApprovedForAll to whitelist opensea proxy account */ function isApprovedForAll(address _owner, address _operator) public view override returns (bool isOperator) { // matic / polygon // if (_operator == address(0x207Fa8Df3a17D96Ca7EA4f2893fcdCb78a304101) && openseaProxyEnabled == true) { // return true; // } // eth mainnet if ( _operator == address(0xa5409ec958C83C3f309868babACA7c86DCB077c1) && openseaProxyEnabled == true ) { return true; } return ERC1155.isApprovedForAll(_owner, _operator); } /** * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea. */ function _msgSender() internal view override returns (address payable sender) { return ContextMixin.msgSender(); } /** * Admin APIs */ function setOpenseaProxyEnabled(bool enabled) public onlyAdmin { openseaProxyEnabled = enabled; } /** * @dev admin function to set new root admin. * * @param newAdmin address the new admin to assign, which manages delegates */ function changeAdmin(address newAdmin) public onlyAdmin { admin = newAdmin; } function setURI(string memory uri) public onlyAdmin { _setURI(uri); } /** * Read APIs */ function getAdmin() public view returns (address) { return admin; } function contractURI() public view returns (string memory) { return "https://mintlit.com/contractMetadata"; } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setOpenseaProxyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526000600460006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50604051806060016040528060288152602001620039fa602891396200005f6301ffc9a760e01b6200014960201b60201c565b62000070816200025260201b60201c565b6200008863d9b67a2660e01b6200014960201b60201c565b620000a0630e89341c60e01b6200014960201b60201c565b5033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600860146101000a81548160ff021916908315150217905550620001436040518060400160405280600381526020017f4c495400000000000000000000000000000000000000000000000000000000008152506200026e60201b60201c565b620004bf565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620001e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b80600390805190602001906200026a92919062000409565b5050565b600460009054906101000a900460ff1615620002f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f616c726561647920696e6974656400000000000000000000000000000000000081525060200191505060405180910390fd5b62000303816200032160201b60201c565b6001600460006101000a81548160ff02191690831515021790555050565b6040518060800160405280604f815260200162003a22604f91398051906020012081805190602001206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001203062000398620003fc60201b60201c565b60001b604051602001808681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001955050505050506040516020818303038152906040528051906020012060058190555050565b6000804690508091505090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200044157600085556200048d565b82601f106200045c57805160ff19168380011785556200048d565b828001600101855582156200048d579182015b828111156200048c5782518255916020019190600101906200046f565b5b5090506200049c9190620004a0565b5090565b5b80821115620004bb576000816000905550600101620004a1565b5090565b61352b80620004cf6000396000f3fe60806040526004361061011e5760003560e01c80634cc63d6c116100a0578063a0712d6811610064578063a0712d6814610b16578063a22cb46514610b65578063e8a3d48514610bc2578063e985e9c514610c52578063f242432a14610cd95761011e565b80634cc63d6c1461086e5780634e1273f4146108ab5780636e9960c314610a59578063714cff5614610a9a5780638f28397014610ac55761011e565b80630f7e5970116100e75780630f7e5970146104f357806320379ee5146105835780632d0335ab146105ae5780632eb2c2d6146106135780633408e470146108435761011e565b8062fdd58e1461012357806301ffc9a71461019257806302fe5305146102025780630c53c51c146102ca5780630e89341c1461043f575b600080fd5b34801561012f57600080fd5b5061017c6004803603604081101561014657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610df5565b6040518082815260200191505060405180910390f35b34801561019e57600080fd5b506101ea600480360360208110156101b557600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610ed5565b60405180821515815260200191505060405180910390f35b34801561020e57600080fd5b506102c86004803603602081101561022557600080fd5b810190808035906020019064010000000081111561024257600080fd5b82018360208201111561025457600080fd5b8035906020019184600183028401116401000000008311171561027657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610f3c565b005b6103c4600480360360a08110156102e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561031d57600080fd5b82018360208201111561032f57600080fd5b8035906020019184600183028401116401000000008311171561035157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190929190803560ff16906020019092919050505061100b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104045780820151818401526020810190506103e9565b50505050905090810190601f1680156104315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044b57600080fd5b506104786004803603602081101561046257600080fd5b8101908080359060200190929190505050611418565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104b857808201518184015260208101905061049d565b50505050905090810190601f1680156104e55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ff57600080fd5b506105086114bc565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561054857808201518184015260208101905061052d565b50505050905090810190601f1680156105755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561058f57600080fd5b506105986114f5565b6040518082815260200191505060405180910390f35b3480156105ba57600080fd5b506105fd600480360360208110156105d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114ff565b6040518082815260200191505060405180910390f35b34801561061f57600080fd5b50610841600480360360a081101561063657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561069357600080fd5b8201836020820111156106a557600080fd5b803590602001918460208302840111640100000000831117156106c757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561072757600080fd5b82018360208201111561073957600080fd5b8035906020019184602083028401116401000000008311171561075b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156107bb57600080fd5b8201836020820111156107cd57600080fd5b803590602001918460018302840111640100000000831117156107ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611548565b005b34801561084f57600080fd5b506108586119d3565b6040518082815260200191505060405180910390f35b34801561087a57600080fd5b506108a96004803603602081101561089157600080fd5b810190808035151590602001909291905050506119e0565b005b3480156108b757600080fd5b50610a02600480360360408110156108ce57600080fd5b81019080803590602001906401000000008111156108eb57600080fd5b8201836020820111156108fd57600080fd5b8035906020019184602083028401116401000000008311171561091f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561097f57600080fd5b82018360208201111561099157600080fd5b803590602001918460208302840111640100000000831117156109b357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611ac0565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610a45578082015181840152602081019050610a2a565b505050509050019250505060405180910390f35b348015610a6557600080fd5b50610a6e611bd2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610aa657600080fd5b50610aaf611bfc565b6040518082815260200191505060405180910390f35b348015610ad157600080fd5b50610b1460048036036020811015610ae857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c02565b005b348015610b2257600080fd5b50610b4f60048036036020811015610b3957600080fd5b8101908080359060200190929190505050611d09565b6040518082815260200191505060405180910390f35b348015610b7157600080fd5b50610bc060048036036040811015610b8857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611d44565b005b348015610bce57600080fd5b50610bd7611edd565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c17578082015181840152602081019050610bfc565b50505050905090810190601f168015610c445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c5e57600080fd5b50610cc160048036036040811015610c7557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611efd565b60405180821515815260200191505060405180910390f35b348015610ce557600080fd5b50610df3600480360360a0811015610cfc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190640100000000811115610d6d57600080fd5b820183602082011115610d7f57600080fd5b80359060200191846001830284011164010000000083111715610da157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611f82565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806132d9602b913960400191505060405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f4f6e6c792041646d696e0000000000000000000000000000000000000000000081525060200191505060405180910390fd5b611008816122f7565b50565b606060006040518060600160405280600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff16815260200187815250905061108e8782878787612311565b6110e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061343a6021913960400191505060405180910390fd5b6111366001600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461244590919063ffffffff16565b600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156112155780820151818401526020810190506111fa565b50505050905090810190601f1680156112425780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a6040516020018083805190602001908083835b602083106112a35780518252602082019150602081019050602083039250611280565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040526040518082805190602001908083835b6020831061132a5780518252602082019150602081019050602083039250611307565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461138c576040519150601f19603f3d011682016040523d82523d6000602084013e611391565b606091505b509150915081611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000081525060200191505060405180910390fd5b80935050505095945050505050565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114b05780601f10611485576101008083540402835291602001916114b0565b820191906000526020600020905b81548152906001019060200180831161149357829003601f168201915b50505050509050919050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000600554905090565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b81518351146115a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806134ad6028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611628576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806133b96025913960400191505060405180910390fd5b6116306124cd565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806116765750611675856116706124cd565b611efd565b5b6116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806133de6032913960400191505060405180910390fd5b60006116d56124cd565b90506116e58187878787876124dc565b60005b84518110156118b65760008582815181106116ff57fe5b60200260200101519050600085838151811061171757fe5b6020026020010151905061179e816040518060600160405280602a8152602001613410602a91396001600086815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124e49092919063ffffffff16565b6001600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611855816001600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461244590919063ffffffff16565b6001600084815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050508060010190506116e8565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561196657808201518184015260208101905061194b565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156119a857808201518184015260208101905061198d565b5050505090500194505050505060405180910390a46119cb81878787878761259e565b505050505050565b6000804690508091505090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f4f6e6c792041646d696e0000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600860146101000a81548160ff02191690831515021790555050565b60608151835114611b1c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806134846029913960400191505060405180910390fd5b6000835167ffffffffffffffff81118015611b3657600080fd5b50604051908082528060200260200182016040528015611b655781602001602082028036833780820191505090505b50905060005b8451811015611bc757611ba4858281518110611b8357fe5b6020026020010151858381518110611b9757fe5b6020026020010151610df5565b828281518110611bb057fe5b602002602001018181525050806001019050611b6b565b508091505092915050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60075481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f4f6e6c792041646d696e0000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760008154809291906001019190505550611d3a33600754846040518060200160405280600081525061292d565b6007549050919050565b8173ffffffffffffffffffffffffffffffffffffffff16611d636124cd565b73ffffffffffffffffffffffffffffffffffffffff161415611dd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061345b6029913960400191505060405180910390fd5b8060026000611ddd6124cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e8a6124cd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b606060405180606001604052806024815260200161334760249139905090565b600073a5409ec958c83c3f309868babaca7c86dcb077c173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148015611f61575060011515600860149054906101000a900460ff161515145b15611f6f5760019050611f7c565b611f798383612b30565b90505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612008576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806133b96025913960400191505060405180910390fd5b6120106124cd565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806120565750612055856120506124cd565b611efd565b5b6120ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061336b6029913960400191505060405180910390fd5b60006120b56124cd565b90506120d58187876120c688612bc4565b6120cf88612bc4565b876124dc565b612152836040518060600160405280602a8152602001613410602a91396001600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124e49092919063ffffffff16565b6001600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612209836001600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461244590919063ffffffff16565b6001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a46122ef818787878787612c35565b505050505050565b806003908051906020019061230d9291906130fd565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415612398576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806133946025913960400191505060405180910390fd5b60016123ab6123a687612f42565b612fd2565b83868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612402573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b6000808284019050838110156124c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006124d7613039565b905090565b505050505050565b6000838311158290612591576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561255657808201518184015260208101905061253b565b50505050905090810190601f1680156125835780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082840390509392505050565b6125bd8473ffffffffffffffffffffffffffffffffffffffff166130ea565b15612925578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561267557808201518184015260208101905061265a565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156126b757808201518184015260208101905061269c565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156126f65780820151818401526020810190506126db565b50505050905090810190601f1680156127235780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561274857600080fd5b505af192505050801561277c57506040513d602081101561276857600080fd5b810190808051906020019092919050505060015b612886576127886131c6565b806127935750612835565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127fa5780820151818401526020810190506127df565b50505050905090810190601f1680156128275780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061327d6034913960400191505060405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612923576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806132b16028913960400191505060405180910390fd5b505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134d56021913960400191505060405180910390fd5b60006129bd6124cd565b90506129de816000876129cf88612bc4565b6129d888612bc4565b876124dc565b612a41836001600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461244590919063ffffffff16565b6001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4612b2981600087878787612c35565b5050505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606000600167ffffffffffffffff81118015612be057600080fd5b50604051908082528060200260200182016040528015612c0f5781602001602082028036833780820191505090505b5090508281600081518110612c2057fe5b60200260200101818152505080915050919050565b612c548473ffffffffffffffffffffffffffffffffffffffff166130ea565b15612f3a578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612d0d578082015181840152602081019050612cf2565b50505050905090810190601f168015612d3a5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015612d5d57600080fd5b505af1925050508015612d9157506040513d6020811015612d7d57600080fd5b810190808051906020019092919050505060015b612e9b57612d9d6131c6565b80612da85750612e4a565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e0f578082015181840152602081019050612df4565b50505050905090810190601f168015612e3c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061327d6034913960400191505060405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806132b16028913960400191505060405180910390fd5b505b505050505050565b6000604051806080016040528060438152602001613304604391398051906020012082600001518360200151846040015180519060200120604051602001808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050604051602081830303815290604052805190602001209050919050565b6000612fdc6114f5565b8260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156130e357600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff8183015116925050506130e7565b3390505b90565b600080823b905060008111915050919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613133576000855561317a565b82601f1061314c57805160ff191683800117855561317a565b8280016001018555821561317a579182015b8281111561317957825182559160200191906001019061315e565b5b509050613187919061318b565b5090565b5b808211156131a457600081600090555060010161318c565b5090565b6000601f19601f8301169050919050565b60008160e01c9050919050565b600060443d10156131d657613279565b60046000803e6131e76000516131b9565b6308c379a081146131f85750613279565b60405160043d036004823e80513d602482011167ffffffffffffffff8211171561322457505050613279565b808201805167ffffffffffffffff811115613243575050505050613279565b8060208301013d850181111561325e57505050505050613279565b613267826131a8565b60208401016040528296505050505050505b9056fe455243313135353a207472616e7366657220746f206e6f6e2045524331313535526563656976657220696d706c656d656e746572455243313135353a204552433131353552656365697665722072656a656374656420746f6b656e73455243313135353a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e61747572652968747470733a2f2f6d696e746c69742e636f6d2f636f6e74726163744d65746164617461455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665644e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5349474e4552455243313135353a207472616e7366657220746f20746865207a65726f2061646472657373455243313135353a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e736665725369676e657220616e64207369676e617475726520646f206e6f74206d61746368455243313135353a2073657474696e6720617070726f76616c2073746174757320666f722073656c66455243313135353a206163636f756e747320616e6420696473206c656e677468206d69736d61746368455243313135353a2069647320616e6420616d6f756e7473206c656e677468206d69736d61746368455243313135353a206d696e7420746f20746865207a65726f2061646472657373a26469706673582212207c8520e8f1863f2e2cf4418955bbe2a5116ab2137d527b88a3c86b1a47fdf69b64736f6c6343000706003368747470733a2f2f6d696e746c69742e636f6d2f6d657461646174612f6d756d6261692f7b69647d454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429
Deployed Bytecode
0x60806040526004361061011e5760003560e01c80634cc63d6c116100a0578063a0712d6811610064578063a0712d6814610b16578063a22cb46514610b65578063e8a3d48514610bc2578063e985e9c514610c52578063f242432a14610cd95761011e565b80634cc63d6c1461086e5780634e1273f4146108ab5780636e9960c314610a59578063714cff5614610a9a5780638f28397014610ac55761011e565b80630f7e5970116100e75780630f7e5970146104f357806320379ee5146105835780632d0335ab146105ae5780632eb2c2d6146106135780633408e470146108435761011e565b8062fdd58e1461012357806301ffc9a71461019257806302fe5305146102025780630c53c51c146102ca5780630e89341c1461043f575b600080fd5b34801561012f57600080fd5b5061017c6004803603604081101561014657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610df5565b6040518082815260200191505060405180910390f35b34801561019e57600080fd5b506101ea600480360360208110156101b557600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610ed5565b60405180821515815260200191505060405180910390f35b34801561020e57600080fd5b506102c86004803603602081101561022557600080fd5b810190808035906020019064010000000081111561024257600080fd5b82018360208201111561025457600080fd5b8035906020019184600183028401116401000000008311171561027657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610f3c565b005b6103c4600480360360a08110156102e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561031d57600080fd5b82018360208201111561032f57600080fd5b8035906020019184600183028401116401000000008311171561035157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190929190803560ff16906020019092919050505061100b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104045780820151818401526020810190506103e9565b50505050905090810190601f1680156104315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044b57600080fd5b506104786004803603602081101561046257600080fd5b8101908080359060200190929190505050611418565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104b857808201518184015260208101905061049d565b50505050905090810190601f1680156104e55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ff57600080fd5b506105086114bc565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561054857808201518184015260208101905061052d565b50505050905090810190601f1680156105755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561058f57600080fd5b506105986114f5565b6040518082815260200191505060405180910390f35b3480156105ba57600080fd5b506105fd600480360360208110156105d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114ff565b6040518082815260200191505060405180910390f35b34801561061f57600080fd5b50610841600480360360a081101561063657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561069357600080fd5b8201836020820111156106a557600080fd5b803590602001918460208302840111640100000000831117156106c757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561072757600080fd5b82018360208201111561073957600080fd5b8035906020019184602083028401116401000000008311171561075b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156107bb57600080fd5b8201836020820111156107cd57600080fd5b803590602001918460018302840111640100000000831117156107ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611548565b005b34801561084f57600080fd5b506108586119d3565b6040518082815260200191505060405180910390f35b34801561087a57600080fd5b506108a96004803603602081101561089157600080fd5b810190808035151590602001909291905050506119e0565b005b3480156108b757600080fd5b50610a02600480360360408110156108ce57600080fd5b81019080803590602001906401000000008111156108eb57600080fd5b8201836020820111156108fd57600080fd5b8035906020019184602083028401116401000000008311171561091f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561097f57600080fd5b82018360208201111561099157600080fd5b803590602001918460208302840111640100000000831117156109b357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611ac0565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610a45578082015181840152602081019050610a2a565b505050509050019250505060405180910390f35b348015610a6557600080fd5b50610a6e611bd2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610aa657600080fd5b50610aaf611bfc565b6040518082815260200191505060405180910390f35b348015610ad157600080fd5b50610b1460048036036020811015610ae857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c02565b005b348015610b2257600080fd5b50610b4f60048036036020811015610b3957600080fd5b8101908080359060200190929190505050611d09565b6040518082815260200191505060405180910390f35b348015610b7157600080fd5b50610bc060048036036040811015610b8857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611d44565b005b348015610bce57600080fd5b50610bd7611edd565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c17578082015181840152602081019050610bfc565b50505050905090810190601f168015610c445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c5e57600080fd5b50610cc160048036036040811015610c7557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611efd565b60405180821515815260200191505060405180910390f35b348015610ce557600080fd5b50610df3600480360360a0811015610cfc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190640100000000811115610d6d57600080fd5b820183602082011115610d7f57600080fd5b80359060200191846001830284011164010000000083111715610da157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611f82565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806132d9602b913960400191505060405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f4f6e6c792041646d696e0000000000000000000000000000000000000000000081525060200191505060405180910390fd5b611008816122f7565b50565b606060006040518060600160405280600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff16815260200187815250905061108e8782878787612311565b6110e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061343a6021913960400191505060405180910390fd5b6111366001600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461244590919063ffffffff16565b600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156112155780820151818401526020810190506111fa565b50505050905090810190601f1680156112425780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a6040516020018083805190602001908083835b602083106112a35780518252602082019150602081019050602083039250611280565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040526040518082805190602001908083835b6020831061132a5780518252602082019150602081019050602083039250611307565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461138c576040519150601f19603f3d011682016040523d82523d6000602084013e611391565b606091505b509150915081611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000081525060200191505060405180910390fd5b80935050505095945050505050565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114b05780601f10611485576101008083540402835291602001916114b0565b820191906000526020600020905b81548152906001019060200180831161149357829003601f168201915b50505050509050919050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000600554905090565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b81518351146115a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806134ad6028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611628576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806133b96025913960400191505060405180910390fd5b6116306124cd565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806116765750611675856116706124cd565b611efd565b5b6116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806133de6032913960400191505060405180910390fd5b60006116d56124cd565b90506116e58187878787876124dc565b60005b84518110156118b65760008582815181106116ff57fe5b60200260200101519050600085838151811061171757fe5b6020026020010151905061179e816040518060600160405280602a8152602001613410602a91396001600086815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124e49092919063ffffffff16565b6001600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611855816001600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461244590919063ffffffff16565b6001600084815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050508060010190506116e8565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561196657808201518184015260208101905061194b565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156119a857808201518184015260208101905061198d565b5050505090500194505050505060405180910390a46119cb81878787878761259e565b505050505050565b6000804690508091505090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f4f6e6c792041646d696e0000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600860146101000a81548160ff02191690831515021790555050565b60608151835114611b1c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806134846029913960400191505060405180910390fd5b6000835167ffffffffffffffff81118015611b3657600080fd5b50604051908082528060200260200182016040528015611b655781602001602082028036833780820191505090505b50905060005b8451811015611bc757611ba4858281518110611b8357fe5b6020026020010151858381518110611b9757fe5b6020026020010151610df5565b828281518110611bb057fe5b602002602001018181525050806001019050611b6b565b508091505092915050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60075481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f4f6e6c792041646d696e0000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760008154809291906001019190505550611d3a33600754846040518060200160405280600081525061292d565b6007549050919050565b8173ffffffffffffffffffffffffffffffffffffffff16611d636124cd565b73ffffffffffffffffffffffffffffffffffffffff161415611dd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061345b6029913960400191505060405180910390fd5b8060026000611ddd6124cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e8a6124cd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b606060405180606001604052806024815260200161334760249139905090565b600073a5409ec958c83c3f309868babaca7c86dcb077c173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148015611f61575060011515600860149054906101000a900460ff161515145b15611f6f5760019050611f7c565b611f798383612b30565b90505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612008576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806133b96025913960400191505060405180910390fd5b6120106124cd565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806120565750612055856120506124cd565b611efd565b5b6120ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061336b6029913960400191505060405180910390fd5b60006120b56124cd565b90506120d58187876120c688612bc4565b6120cf88612bc4565b876124dc565b612152836040518060600160405280602a8152602001613410602a91396001600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124e49092919063ffffffff16565b6001600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612209836001600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461244590919063ffffffff16565b6001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a46122ef818787878787612c35565b505050505050565b806003908051906020019061230d9291906130fd565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415612398576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806133946025913960400191505060405180910390fd5b60016123ab6123a687612f42565b612fd2565b83868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612402573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b6000808284019050838110156124c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006124d7613039565b905090565b505050505050565b6000838311158290612591576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561255657808201518184015260208101905061253b565b50505050905090810190601f1680156125835780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082840390509392505050565b6125bd8473ffffffffffffffffffffffffffffffffffffffff166130ea565b15612925578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561267557808201518184015260208101905061265a565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156126b757808201518184015260208101905061269c565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156126f65780820151818401526020810190506126db565b50505050905090810190601f1680156127235780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561274857600080fd5b505af192505050801561277c57506040513d602081101561276857600080fd5b810190808051906020019092919050505060015b612886576127886131c6565b806127935750612835565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127fa5780820151818401526020810190506127df565b50505050905090810190601f1680156128275780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061327d6034913960400191505060405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612923576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806132b16028913960400191505060405180910390fd5b505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134d56021913960400191505060405180910390fd5b60006129bd6124cd565b90506129de816000876129cf88612bc4565b6129d888612bc4565b876124dc565b612a41836001600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461244590919063ffffffff16565b6001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4612b2981600087878787612c35565b5050505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606000600167ffffffffffffffff81118015612be057600080fd5b50604051908082528060200260200182016040528015612c0f5781602001602082028036833780820191505090505b5090508281600081518110612c2057fe5b60200260200101818152505080915050919050565b612c548473ffffffffffffffffffffffffffffffffffffffff166130ea565b15612f3a578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612d0d578082015181840152602081019050612cf2565b50505050905090810190601f168015612d3a5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015612d5d57600080fd5b505af1925050508015612d9157506040513d6020811015612d7d57600080fd5b810190808051906020019092919050505060015b612e9b57612d9d6131c6565b80612da85750612e4a565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e0f578082015181840152602081019050612df4565b50505050905090810190601f168015612e3c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061327d6034913960400191505060405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806132b16028913960400191505060405180910390fd5b505b505050505050565b6000604051806080016040528060438152602001613304604391398051906020012082600001518360200151846040015180519060200120604051602001808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050604051602081830303815290604052805190602001209050919050565b6000612fdc6114f5565b8260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156130e357600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff8183015116925050506130e7565b3390505b90565b600080823b905060008111915050919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613133576000855561317a565b82601f1061314c57805160ff191683800117855561317a565b8280016001018555821561317a579182015b8281111561317957825182559160200191906001019061315e565b5b509050613187919061318b565b5090565b5b808211156131a457600081600090555060010161318c565b5090565b6000601f19601f8301169050919050565b60008160e01c9050919050565b600060443d10156131d657613279565b60046000803e6131e76000516131b9565b6308c379a081146131f85750613279565b60405160043d036004823e80513d602482011167ffffffffffffffff8211171561322457505050613279565b808201805167ffffffffffffffff811115613243575050505050613279565b8060208301013d850181111561325e57505050505050613279565b613267826131a8565b60208401016040528296505050505050505b9056fe455243313135353a207472616e7366657220746f206e6f6e2045524331313535526563656976657220696d706c656d656e746572455243313135353a204552433131353552656365697665722072656a656374656420746f6b656e73455243313135353a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e61747572652968747470733a2f2f6d696e746c69742e636f6d2f636f6e74726163744d65746164617461455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665644e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5349474e4552455243313135353a207472616e7366657220746f20746865207a65726f2061646472657373455243313135353a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e736665725369676e657220616e64207369676e617475726520646f206e6f74206d61746368455243313135353a2073657474696e6720617070726f76616c2073746174757320666f722073656c66455243313135353a206163636f756e747320616e6420696473206c656e677468206d69736d61746368455243313135353a2069647320616e6420616d6f756e7473206c656e677468206d69736d61746368455243313135353a206d696e7420746f20746865207a65726f2061646472657373a26469706673582212207c8520e8f1863f2e2cf4418955bbe2a5116ab2137d527b88a3c86b1a47fdf69b64736f6c63430007060033
Deployed Bytecode Sourcemap
49779:2827:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30359:318;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17925:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52264:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47542:1142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30051:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44683:43;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45679:101;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49110:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33314:1314;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45788:161;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51888:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30843:561;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52391:81;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49866:23;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52165:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50651:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31477:380;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52480:123;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50910:618;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32219:1018;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30359:318;30490:7;30556:1;30537:21;;:7;:21;;;;30515:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30647:9;:13;30657:2;30647:13;;;;;;;;;;;:22;30661:7;30647:22;;;;;;;;;;;;;;;;30640:29;;30359:318;;;;:::o;17925:200::-;18055:4;18084:20;:33;18105:11;18084:33;;;;;;;;;;;;;;;;;;;;;;;;;;;18077:40;;17925:200;;;:::o;52264:83::-;50045:5;;;;;;;;;;;50031:19;;:10;:19;;;50023:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52327:12:::1;52335:3;52327:7;:12::i;:::-;52264:83:::0;:::o;47542:1142::-;47743:12;47768:29;47800:152;;;;;;;;47838:6;:19;47845:11;47838:19;;;;;;;;;;;;;;;;47800:152;;;;47878:11;47800:152;;;;;;47923:17;47800:152;;;47768:184;;47987:45;47994:11;48007:6;48015:4;48021;48027;47987:6;:45::i;:::-;47965:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48182:26;48206:1;48182:6;:19;48189:11;48182:19;;;;;;;;;;;;;;;;:23;;:26;;;;:::i;:::-;48160:6;:19;48167:11;48160:19;;;;;;;;;;;;;;;:48;;;;48226:117;48264:11;48290:10;48315:17;48226:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48454:12;48468:23;48503:4;48495:18;;48545:17;48564:11;48528:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48495:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48453:134;;;;48606:7;48598:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48666:10;48659:17;;;;;47542:1142;;;;;;;:::o;30051:157::-;30158:13;30196:4;30189:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30051:157;;;:::o;44683:43::-;;;;;;;;;;;;;;;;;;;:::o;45679:101::-;45730:7;45757:15;;45750:22;;45679:101;:::o;49110:107::-;49163:13;49197:6;:12;49204:4;49197:12;;;;;;;;;;;;;;;;49189:20;;49110:107;;;:::o;33314:1314::-;33561:7;:14;33547:3;:10;:28;33525:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33676:1;33662:16;;:2;:16;;;;33654:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33761:12;:10;:12::i;:::-;33753:20;;:4;:20;;;:60;;;;33777:36;33794:4;33800:12;:10;:12::i;:::-;33777:16;:36::i;:::-;33753:60;33731:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33904:16;33923:12;:10;:12::i;:::-;33904:31;;33948:60;33969:8;33979:4;33985:2;33989:3;33994:7;34003:4;33948:20;:60::i;:::-;34026:9;34021:358;34045:3;:10;34041:1;:14;34021:358;;;34077:10;34090:3;34094:1;34090:6;;;;;;;;;;;;;;34077:19;;34111:14;34128:7;34136:1;34128:10;;;;;;;;;;;;;;34111:27;;34177:126;34219:6;34177:126;;;;;;;;;;;;;;;;;:9;:13;34187:2;34177:13;;;;;;;;;;;:19;34191:4;34177:19;;;;;;;;;;;;;;;;:23;;:126;;;;;:::i;:::-;34155:9;:13;34165:2;34155:13;;;;;;;;;;;:19;34169:4;34155:19;;;;;;;;;;;;;;;:148;;;;34338:29;34360:6;34338:9;:13;34348:2;34338:13;;;;;;;;;;;:17;34352:2;34338:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;34318:9;:13;34328:2;34318:13;;;;;;;;;;;:17;34332:2;34318:17;;;;;;;;;;;;;;;:49;;;;34021:358;;34057:3;;;;;34021:358;;;;34426:2;34396:47;;34420:4;34396:47;;34410:8;34396:47;;;34430:3;34435:7;34396:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34456:164;34506:8;34529:4;34548:2;34565:3;34583:7;34605:4;34456:35;:164::i;:::-;33314:1314;;;;;;:::o;45788:161::-;45831:7;45851:10;45902:9;45896:15;;45939:2;45932:9;;;45788:161;:::o;51888:111::-;50045:5;;;;;;;;;;;50031:19;;:10;:19;;;50023:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51984:7:::1;51962:19;;:29;;;;;;;;;;;;;;;;;;51888:111:::0;:::o;30843:561::-;30999:16;31074:3;:10;31055:8;:15;:29;31033:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31166:30;31213:8;:15;31199:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31166:63;;31247:9;31242:122;31266:8;:15;31262:1;:19;31242:122;;;31322:30;31332:8;31341:1;31332:11;;;;;;;;;;;;;;31345:3;31349:1;31345:6;;;;;;;;;;;;;;31322:9;:30::i;:::-;31303:13;31317:1;31303:16;;;;;;;;;;;;;:49;;;;;31283:3;;;;;31242:122;;;;31383:13;31376:20;;;30843:561;;;;:::o;52391:81::-;52432:7;52459:5;;;;;;;;;;;52452:12;;52391:81;:::o;49866:23::-;;;;:::o;52165:91::-;50045:5;;;;;;;;;;;50031:19;;:10;:19;;;50023:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52240:8:::1;52232:5;;:16;;;;;;;;;;;;;;;;;;52165:91:::0;:::o;50651:164::-;50699:7;50719:8;;:10;;;;;;;;;;;;;50740:41;50746:10;50758:8;;50768;50740:41;;;;;;;;;;;;:5;:41::i;:::-;50799:8;;50792:15;;50651:164;;;:::o;31477:380::-;31642:8;31626:24;;:12;:10;:12::i;:::-;:24;;;;31604:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31777:8;31732:18;:32;31751:12;:10;:12::i;:::-;31732:32;;;;;;;;;;;;;;;:42;31765:8;31732:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31830:8;31801:48;;31816:12;:10;:12::i;:::-;31801:48;;;31840:8;31801:48;;;;;;;;;;;;;;;;;;;;31477:380;;:::o;52480:123::-;52524:13;52550:45;;;;;;;;;;;;;;;;;;;52480:123;:::o;50910:618::-;51037:15;51321:42;51300:64;;:9;:64;;;:108;;;;;51404:4;51381:27;;:19;;;;;;;;;;;:27;;;51300:108;51282:176;;;51442:4;51435:11;;;;51282:176;51477:43;51502:6;51510:9;51477:24;:43::i;:::-;51470:50;;50910:618;;;;;:::o;32219:1018::-;32427:1;32413:16;;:2;:16;;;;32405:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32512:12;:10;:12::i;:::-;32504:20;;:4;:20;;;:60;;;;32528:36;32545:4;32551:12;:10;:12::i;:::-;32528:16;:36::i;:::-;32504:60;32482:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32646:16;32665:12;:10;:12::i;:::-;32646:31;;32690:185;32725:8;32748:4;32767:2;32784:21;32802:2;32784:17;:21::i;:::-;32820:25;32838:6;32820:17;:25::i;:::-;32860:4;32690:20;:185::i;:::-;32910:114;32948:6;32910:114;;;;;;;;;;;;;;;;;:9;:13;32920:2;32910:13;;;;;;;;;;;:19;32924:4;32910:19;;;;;;;;;;;;;;;;:23;;:114;;;;;:::i;:::-;32888:9;:13;32898:2;32888:13;;;;;;;;;;;:19;32902:4;32888:19;;;;;;;;;;;;;;;:136;;;;33055:29;33077:6;33055:9;:13;33065:2;33055:13;;;;;;;;;;;:17;33069:2;33055:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;33035:9;:13;33045:2;33035:13;;;;;;;;;;;:17;33049:2;33035:17;;;;;;;;;;;;;;;:49;;;;33133:2;33102:46;;33127:4;33102:46;;33117:8;33102:46;;;33137:2;33141:6;33102:46;;;;;;;;;;;;;;;;;;;;;;;;33161:68;33192:8;33202:4;33208:2;33212;33216:6;33224:4;33161:30;:68::i;:::-;32219:1018;;;;;;:::o;35472:88::-;35546:6;35539:4;:13;;;;;;;;;;;;:::i;:::-;;35472:88;:::o;49225:486::-;49403:4;49446:1;49428:20;;:6;:20;;;;49420:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49544:159;49572:47;49591:27;49611:6;49591:19;:27::i;:::-;49572:18;:47::i;:::-;49638:4;49661;49684;49544:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49521:182;;:6;:182;;;49501:202;;49225:486;;;;;;;:::o;2938:179::-;2996:7;3016:9;3032:1;3028;:5;3016:17;;3057:1;3052;:6;;3044:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3108:1;3101:8;;;2938:179;;;;:::o;51672:169::-;51762:22;51809:24;:22;:24::i;:::-;51802:31;;51672:169;:::o;40895:221::-;;;;;;;:::o;5765:200::-;5885:7;5918:1;5913;:6;;5921:12;5905:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5956:1;5952;:5;5945:12;;5765:200;;;;;:::o;42074:1000::-;42314:15;:2;:13;;;:15::i;:::-;42310:757;;;42384:2;42367:43;;;42433:8;42464:4;42491:3;42517:7;42547:4;42367:203;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42346:710;;;;:::i;:::-;;;;;;;;42929:6;42922:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42346:710;42978:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42346:710;42688:52;;;42655:85;;;:8;:85;;;;42629:224;;42783:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42629:224;42584:284;42310:757;42074:1000;;;;;;:::o;35961:804::-;36138:1;36119:21;;:7;:21;;;;36111:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36191:16;36210:12;:10;:12::i;:::-;36191:31;;36235:196;36270:8;36301:1;36318:7;36340:21;36358:2;36340:17;:21::i;:::-;36376:25;36394:6;36376:17;:25::i;:::-;36416:4;36235:20;:196::i;:::-;36469:34;36496:6;36469:9;:13;36479:2;36469:13;;;;;;;;;;;:22;36483:7;36469:22;;;;;;;;;;;;;;;;:26;;:34;;;;:::i;:::-;36444:9;:13;36454:2;36444:13;;;;;;;;;;;:22;36458:7;36444:22;;;;;;;;;;;;;;;:59;;;;36556:7;36519:57;;36552:1;36519:57;;36534:8;36519:57;;;36565:2;36569:6;36519:57;;;;;;;;;;;;;;;;;;;;;;;;36589:168;36634:8;36665:1;36682:7;36704:2;36721:6;36742:4;36589:30;:168::i;:::-;35961:804;;;;;:::o;31929:218::-;32073:4;32102:18;:27;32121:7;32102:27;;;;;;;;;;;;;;;:37;32130:8;32102:37;;;;;;;;;;;;;;;;;;;;;;;;;32095:44;;31929:218;;;;:::o;43082:230::-;43175:16;43209:22;43248:1;43234:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43209:41;;43272:7;43261:5;43267:1;43261:8;;;;;;;;;;;;;:18;;;;;43299:5;43292:12;;;43082:230;;;:::o;41124:942::-;41339:15;:2;:13;;;:15::i;:::-;41335:724;;;41409:2;41392:38;;;41453:8;41484:4;41511:2;41536:6;41565:4;41392:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41371:677;;;;:::i;:::-;;;;;;;;41921:6;41914:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41371:677;41970:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41371:677;41685:47;;;41673:59;;;:8;:59;;;;41647:198;;41775:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41647:198;41602:258;41335:724;41124:942;;;;;;:::o;48692:410::-;48802:7;46866:108;;;;;;;;;;;;;;;;;46842:143;;;;;;48956:6;:12;;;48991:6;:11;;;49035:6;:24;;;49025:35;;;;;;48875:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48847:247;;;;;;48827:267;;48692:410;;;:::o;46318:258::-;46417:7;46519:20;:18;:20::i;:::-;46541:11;46490:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46462:106;;;;;;46442:126;;46318:258;;;:::o;43499:609::-;43543:22;43604:4;43582:27;;:10;:27;;;43578:499;;;43626:18;43647:8;;43626:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43670:13;43686:8;;:15;;43670:31;;43938:42;43908:5;43901;43897:17;43891:24;43865:134;43855:144;;43725:289;;;;;44055:10;44046:19;;43578:499;43499:609;:::o;19510:444::-;19570:4;19778:12;19902:7;19890:20;19882:28;;19945:1;19938:4;:8;19931:15;;;19510:444;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:102:1:-;;99:2;95:7;90:2;83:5;79:14;75:28;65:38;;55:54;;;:::o;115:106::-;;208:5;203:3;199:15;178:36;;168:53;;;:::o;227:833::-;;304:4;286:16;283:26;280:2;;;312:5;;280:2;350:1;347;344;329:23;372:34;403:1;397:8;372:34;:::i;:::-;433:10;428:3;425:19;415:2;;448:5;;;415:2;483;477:9;541:1;523:16;519:24;516:1;510:4;495:49;574:4;568:11;673:16;666:4;658:6;654:17;651:39;618:18;610:6;607:30;591:113;588:2;;;719:5;;;;;588:2;765:6;759:4;755:17;801:3;795:10;828:18;820:6;817:30;814:2;;;850:5;;;;;;;814:2;898:6;891:4;886:3;882:14;878:27;935:16;929:4;925:27;920:3;917:36;914:2;;;956:5;;;;;;;;914:2;1004:29;1026:6;1004:29;:::i;:::-;997:4;992:3;988:14;984:50;980:2;973:62;1051:3;1044:10;;270:790;;;;;;;;:::o
Swarm Source
ipfs://7c8520e8f1863f2e2cf4418955bbe2a5116ab2137d527b88a3c86b1a47fdf69b
[ 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.