Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 13140204 | 1048 days ago | IN | Create: MintableERC1155 | 0 ETH | 0.23538902 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MintableERC1155
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-13 */ // File: contracts/Dependencies/Context.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; /* * @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: contracts/proxy/Dependencies/Ownable.sol /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/Dependencies/IERC165.sol /** * @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: contracts/Dependencies/IERC1155.sol /** * @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: contracts/Dependencies/IERC1155MetadataURI.sol /** * @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: contracts/Dependencies/IERC1155Receiver.sol /** * _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: contracts/Dependencies/SafeMath.sol /** * @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: contracts/Dependencies/Address.sol /** * @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: contracts/Dependencies/UintLibrary.sol library UintLibrary { function toString(uint256 _i) internal pure returns (string memory) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len - 1; while (_i != 0) { bstr[k--] = byte(uint8(48 + _i % 10)); _i /= 10; } return string(bstr); } } // File: contracts/Dependencies/StringLibrary.sol library StringLibrary { using UintLibrary for uint256; function append(string memory _a, string memory _b) internal pure returns (string memory) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory bab = new bytes(_ba.length + _bb.length); uint k = 0; for (uint i = 0; i < _ba.length; i++) bab[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) bab[k++] = _bb[i]; return string(bab); } function append(string memory _a, string memory _b, string memory _c) internal pure returns (string memory) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory _bc = bytes(_c); bytes memory bbb = new bytes(_ba.length + _bb.length + _bc.length); uint k = 0; for (uint i = 0; i < _ba.length; i++) bbb[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) bbb[k++] = _bb[i]; for (uint i = 0; i < _bc.length; i++) bbb[k++] = _bc[i]; return string(bbb); } function recover(string memory message, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { bytes memory msgBytes = bytes(message); bytes memory fullMessage = concat( bytes("\x19Ethereum Signed Message:\n"), bytes(msgBytes.length.toString()), msgBytes, new bytes(0), new bytes(0), new bytes(0), new bytes(0) ); return ecrecover(keccak256(fullMessage), v, r, s); } function concat(bytes memory _ba, bytes memory _bb, bytes memory _bc, bytes memory _bd, bytes memory _be, bytes memory _bf, bytes memory _bg) internal pure returns (bytes memory) { bytes memory resultBytes = new bytes(_ba.length + _bb.length + _bc.length + _bd.length + _be.length + _bf.length + _bg.length); uint k = 0; for (uint i = 0; i < _ba.length; i++) resultBytes[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) resultBytes[k++] = _bb[i]; for (uint i = 0; i < _bc.length; i++) resultBytes[k++] = _bc[i]; for (uint i = 0; i < _bd.length; i++) resultBytes[k++] = _bd[i]; for (uint i = 0; i < _be.length; i++) resultBytes[k++] = _be[i]; for (uint i = 0; i < _bf.length; i++) resultBytes[k++] = _bf[i]; for (uint i = 0; i < _bg.length; i++) resultBytes[k++] = _bg[i]; return resultBytes; } } // File: contracts/proxy/MintableERC1155.sol /** * @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; function _initRegisterInterfaceForErc165() 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, "invalid interface id"); _supportedInterfaces[interfaceId] = true; } } contract HasContractURI is ERC165 { string private _contractURI; /* * bytes4(keccak256('contractURI()')) == 0xe8a3d485 */ bytes4 private constant _INTERFACE_ID_CONTRACT_URI = 0xe8a3d485; function _initHasContractURI(string memory contractURI) internal { _contractURI = contractURI; _registerInterface(_INTERFACE_ID_CONTRACT_URI); } /** * @dev Internal function to set the contract URI * @param contractURI string URI prefix to assign */ function _setContractURI(string memory contractURI) internal { _contractURI = contractURI; } function getContractURI() public view returns (string memory){ return _contractURI; } } abstract contract HasCopyright is ERC165 { struct Copyright { address author; uint256 feeRateNumerator; } uint private constant _feeRateDenominator = 10000; event SetCopyright( uint256 id, address creator, address author, uint256 feeRateNumerator, uint256 feeRateDenominator ); /* * bytes4(keccak256('getCopyright(uint256)')) == 0x6f4eaff1 */ bytes4 private constant _INTERFACE_ID_COPYRIGHT = 0x6f4eaff1; // Mapping from id to copyright mapping(uint256 => Copyright) internal _copyrights; function _initRegisterInterfaceForCopyright() internal { _registerInterface(_INTERFACE_ID_COPYRIGHT); } function _setCopyright(uint256 id, address creator, Copyright[] memory copyrightInfos) internal { uint256 copyrightLen = copyrightInfos.length; require(copyrightLen <= 1, "the length of copyrights must be <= 1"); if (copyrightLen == 1) { require(copyrightInfos[0].author != address(0), "the author in copyright can't be zero" ); require(copyrightInfos[0].feeRateNumerator <= _feeRateDenominator, "the feeRate in copyright must be <= 1" ); _copyrights[id] = copyrightInfos[0]; emit SetCopyright(id, creator, copyrightInfos[0].author, copyrightInfos[0].feeRateNumerator, _feeRateDenominator); } } function getFeeRateDenominator() public pure returns (uint256){ return _feeRateDenominator; } function getCopyright(uint256 id) public view virtual returns (Copyright memory); } contract ERC1155Base is Context, IERC1155MetadataURI, HasCopyright, HasContractURI { using SafeMath for uint256; using Address for address; using StringLibrary for string; // Token name string private _name; // Token symbol string private _symbol; // Token URI prefix string private _tokenURIPrefix; // Mapping from id to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Mapping from id to token uri mapping(uint256 => string) private _uris; // Mapping from id to token supply mapping(uint256 => uint256) private _tokenSupply; /* * 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; function _initERC1155Base( string memory name, string memory symbol, string memory contractURI, string memory tokenURIPrefix ) internal { _name = name; _symbol = symbol; _tokenURIPrefix = tokenURIPrefix; _initHasContractURI(contractURI); // 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 id) external view virtual override returns (string memory) { _requireTokenExisted(id); return _tokenURIPrefix.append(_uris[id]); } function getTokenSupply(uint256 id) external view returns (uint256){ _requireTokenExisted(id); return _tokenSupply[id]; } /** * @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), "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, "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, "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), "transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "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, "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, "ids and amounts length mismatch"); require(to != address(0), "transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "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, "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); } function getName() external view returns (string memory){ return _name; } function getSymbol() external view returns (string memory){ return _symbol; } function getTokenURIPrefix() external view returns (string memory){ return _tokenURIPrefix; } function getCopyright(uint256 id) public view override returns (Copyright memory){ _requireTokenExisted(id); return _copyrights[id]; } /** * @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(uint256 id, address account, uint256 amount, bytes memory data) internal virtual { require(account != address(0), "mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] = amount; emit TransferSingle(operator, address(0), account, id, amount); _tokenSupply[id] = amount; _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); } /** * @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 {} /** * @dev Internal function to set the token URI for a given token. * @param id uint256 ID of the token to set its URI * @param tokenURI string URI to assign */ function _setTokenURI(uint256 id, string memory tokenURI) internal { _uris[id] = tokenURI; emit URI(tokenURI, id); } /** * @dev Internal function to set the token URI prefix. * @param tokenURIPrefix string URI prefix to assign */ function _setTokenURIPrefix(string memory tokenURIPrefix) internal { _tokenURIPrefix = tokenURIPrefix; } function _requireTokenExisted(uint256 id) private view { require(_tokenSupply[id] != 0, "target token doesn't exist"); } 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("ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("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("ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("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; } } contract MintableERC1155 is Ownable, ERC1155Base { using SafeMath for uint256; uint256 private _idCounter; bool private _onlyInitOnce; function init( string memory name, string memory symbol, address newOwner, string memory contractURI, string memory tokenURIPrefix ) public { require(!_onlyInitOnce, "already initialized"); _initRegisterInterfaceForErc165(); _initRegisterInterfaceForCopyright(); _initERC1155Base(name, symbol, contractURI, tokenURIPrefix); _registerInterface(bytes4(keccak256('MINT_WITH_ADDRESS'))); _transferOwnership(newOwner); _onlyInitOnce = true; } function mint( address receiver, uint256 amount, string memory tokenURI, bytes memory data, Copyright[] memory copyrightInfos ) external { require(amount > 0, "amount to mint must be > 0"); // 1. get id with auto-increment uint256 currentId = _idCounter; _idCounter = _idCounter.add(1); // 2. mint _mint(currentId, receiver, amount, data); // 3. set tokenURI _setTokenURI(currentId, tokenURI); // 4. set copyright _setCopyright(currentId, msg.sender, copyrightInfos); } function setTokenURIPrefix(string memory tokenURIPrefix) external onlyOwner { _setTokenURIPrefix(tokenURIPrefix); } function setContractURI(string memory contractURI) external onlyOwner { _setContractURI(contractURI); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address","name":"author","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeRateNumerator","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeRateDenominator","type":"uint256"}],"name":"SetCopyright","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":[{"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":[],"name":"getContractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getCopyright","outputs":[{"components":[{"internalType":"address","name":"author","type":"address"},{"internalType":"uint256","name":"feeRateNumerator","type":"uint256"}],"internalType":"struct HasCopyright.Copyright","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeeRateDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSymbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenURIPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"string","name":"contractURI","type":"string"},{"internalType":"string","name":"tokenURIPrefix","type":"string"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"author","type":"address"},{"internalType":"uint256","name":"feeRateNumerator","type":"uint256"}],"internalType":"struct HasCopyright.Copyright[]","name":"copyrightInfos","type":"tuple[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"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":"string","name":"contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURIPrefix","type":"string"}],"name":"setTokenURIPrefix","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600061001b61006a565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b61250f8061007d6000396000f3fe608060405234801561001057600080fd5b50600436106101415760003560e01c8063715018a6116100b8578063b7ec82391161007c578063b7ec82391461028d578063d372da96146102a0578063e985e9c5146102b3578063f242432a146102c6578063f2fde38b146102d9578063f7b20a7d146102ec57610141565b8063715018a6146102375780638da5cb5b1461023f578063938e3d7b1461025457806399e0dd7c14610267578063a22cb4651461027a57610141565b806319b88edb1161010a57806319b88edb146101bf5780632b09d58c146101d25780632eb2c2d6146101da57806337929eb4146101ef5780634e1273f4146101f75780636f4eaff11461021757610141565b8062fdd58e1461014657806301ffc9a71461016f5780630e89341c1461018f57806315070401146101af57806317d7de7c146101b7575b600080fd5b6101596101543660046119db565b6102f4565b6040516101669190612355565b60405180910390f35b61018261017d366004611be9565b610350565b6040516101669190611e7c565b6101a261019d366004611ce7565b61036f565b6040516101669190611e87565b6101a26104b1565b6101a2610548565b6101596101cd366004611ce7565b6105a9565b6101596105c7565b6101ed6101e8366004611891565b6105cd565b005b6101a26107ec565b61020a610205366004611b27565b61084d565b6040516101669190611e3b565b61022a610225366004611ce7565b61091a565b6040516101669190612335565b6101ed61095e565b6102476109e7565b6040516101669190611d84565b6101ed610262366004611c21565b6109f6565b6101ed610275366004611c21565b610a41565b6101ed6102883660046119a0565b610a89565b6101ed61029b366004611c5c565b610b57565b6101ed6102ae366004611a05565b610bdc565b6101826102c136600461185d565b610c2e565b6101ed6102d436600461193b565b610c5c565b6101ed6102e7366004611842565b610df0565b6101a2610e38565b60006001600160a01b0383166103255760405162461bcd60e51b815260040161031c90611ee0565b60405180910390fd5b5060008181526007602090815260408083206001600160a01b03861684529091529020545b92915050565b6001600160e01b03191660009081526001602052604090205460ff1690565b606061037a82610e99565b60008281526009602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845261034a93928301828280156104105780601f106103e557610100808354040283529160200191610410565b820191906000526020600020905b8154815290600101906020018083116103f357829003601f168201915b505060068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529550919350915083018282801561049e5780601f106104735761010080835404028352916020019161049e565b820191906000526020600020905b81548152906001019060200180831161048157829003601f168201915b5050505050610ec490919063ffffffff16565b60058054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053d5780601f106105125761010080835404028352916020019161053d565b820191906000526020600020905b81548152906001019060200180831161052057829003601f168201915b505050505090505b90565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053d5780601f106105125761010080835404028352916020019161053d565b60006105b482610e99565b506000908152600a602052604090205490565b61271090565b81518351146105ee5760405162461bcd60e51b815260040161031c906122c7565b6001600160a01b0384166106145760405162461bcd60e51b815260040161031c90611f22565b61061c610fcc565b6001600160a01b0316856001600160a01b031614806106425750610642856102c1610fcc565b61065e5760405162461bcd60e51b815260040161031c90612155565b6000610668610fcc565b90506106788187878787876107e4565b60005b845181101561077e57600085828151811061069257fe5b6020026020010151905060008583815181106106aa57fe5b60200260200101519050610717816040518060600160405280602181526020016124b9602191396007600086815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002054610fd09092919063ffffffff16565b60008381526007602090815260408083206001600160a01b038e811685529252808320939093558a168152205461074e9082610ffc565b60009283526007602090815260408085206001600160a01b038c168652909152909220919091555060010161067b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516107ce929190611e4e565b60405180910390a46107e4818787878787611028565b505050505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053d5780601f106105125761010080835404028352916020019161053d565b606081518351146108705760405162461bcd60e51b815260040161031c90612292565b6060835167ffffffffffffffff8111801561088a57600080fd5b506040519080825280602002602001820160405280156108b4578160200160208202803683370190505b50905060005b8451811015610912576108f38582815181106108d257fe5b60200260200101518583815181106108e657fe5b60200260200101516102f4565b8282815181106108ff57fe5b60209081029190910101526001016108ba565b509392505050565b6109226116aa565b61092b82610e99565b50600090815260026020908152604091829020825180840190935280546001600160a01b03168352600101549082015290565b610966610fcc565b6001600160a01b03166109776109e7565b6001600160a01b03161461099d5760405162461bcd60e51b815260040161031c9061219e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6109fe610fcc565b6001600160a01b0316610a0f6109e7565b6001600160a01b031614610a355760405162461bcd60e51b815260040161031c9061219e565b610a3e8161113f565b50565b610a49610fcc565b6001600160a01b0316610a5a6109e7565b6001600160a01b031614610a805760405162461bcd60e51b815260040161031c9061219e565b610a3e81611156565b816001600160a01b0316610a9b610fcc565b6001600160a01b03161415610ac25760405162461bcd60e51b815260040161031c90611f90565b8060086000610acf610fcc565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610b13610fcc565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610b4b9190611e7c565b60405180910390a35050565b600c5460ff1615610b7a5760405162461bcd60e51b815260040161031c906120fa565b610b82611169565b610b8a61117b565b610b968585848461118b565b610bbf7fe37243f27916e395706434720b54132b80ef5cc8c56f39b0df6485e8dfb697cf6111f6565b610bc883611248565b5050600c805460ff19166001179055505050565b60008411610bfc5760405162461bcd60e51b815260040161031c906120c3565b600b54610c0a816001610ffc565b600b55610c19818787866112c9565b610c23818561139a565b6107e48133846113f6565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6001600160a01b038416610c825760405162461bcd60e51b815260040161031c90611f22565b610c8a610fcc565b6001600160a01b0316856001600160a01b03161480610cb05750610cb0856102c1610fcc565b610ccc5760405162461bcd60e51b815260040161031c9061225d565b6000610cd6610fcc565b9050610cf6818787610ce78861156b565b610cf08861156b565b876107e4565b610d3d836040518060600160405280602181526020016124b96021913960008781526007602090815260408083206001600160a01b038d1684529091529020549190610fd0565b60008581526007602090815260408083206001600160a01b038b81168552925280832093909355871681522054610d749084610ffc565b60008581526007602090815260408083206001600160a01b03808b168086529190935292819020939093559151909188811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6290610dda908990899061238d565b60405180910390a46107e48187878787876115af565b610df8610fcc565b6001600160a01b0316610e096109e7565b6001600160a01b031614610e2f5760405162461bcd60e51b815260040161031c9061219e565b610a3e81611248565b60068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053d5780601f106105125761010080835404028352916020019161053d565b6000818152600a6020526040902054610a3e5760405162461bcd60e51b815260040161031c9061208c565b805182516060918491849184910167ffffffffffffffff81118015610ee857600080fd5b506040519080825280601f01601f191660200182016040528015610f13576020820181803683370190505b5090506000805b8451811015610f6b57848181518110610f2f57fe5b602001015160f81c60f81b838380600101945081518110610f4c57fe5b60200101906001600160f81b031916908160001a905350600101610f1a565b5060005b8351811015610fc057838181518110610f8457fe5b602001015160f81c60f81b838380600101945081518110610fa157fe5b60200101906001600160f81b031916908160001a905350600101610f6f565b50909695505050505050565b3390565b60008184841115610ff45760405162461bcd60e51b815260040161031c9190611e87565b505050900390565b6000828201838110156110215760405162461bcd60e51b815260040161031c90611f59565b9392505050565b61103a846001600160a01b0316611680565b156107e45760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906110739089908990889088908890600401611d98565b602060405180830381600087803b15801561108d57600080fd5b505af19250505080156110bd575060408051601f3d908101601f191682019092526110ba91810190611c05565b60015b611106576110c96123e8565b806110d457506110ee565b8060405162461bcd60e51b815260040161031c9190611e87565b60405162461bcd60e51b815260040161031c90611fc5565b6001600160e01b0319811663bc197c8160e01b146111365760405162461bcd60e51b815260040161031c90612010565b50505050505050565b80516111529060039060208401906116c1565b5050565b80516111529060069060208401906116c1565b6111796301ffc9a760e01b6111f6565b565b611179636f4eaff160e01b6111f6565b835161119e9060049060208701906116c1565b5082516111b29060059060208601906116c1565b5080516111c69060069060208401906116c1565b506111d082611686565b6111e0636cdb3d1360e11b6111f6565b6111f06303a24d0760e21b6111f6565b50505050565b6001600160e01b031980821614156112205760405162461bcd60e51b815260040161031c90612127565b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b6001600160a01b03811661126e5760405162461bcd60e51b815260040161031c90611e9a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166112ef5760405162461bcd60e51b815260040161031c906122fe565b60006112f9610fcc565b905061130b81600086610ce78961156b565b60008581526007602090815260408083206001600160a01b038089168086529190935281842087905590519092918416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629061136b908a90899061238d565b60405180910390a46000858152600a60205260408120849055611393908290868887876115af565b5050505050565b600082815260096020908152604090912082516113b9928401906116c1565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516113ea9190611e87565b60405180910390a25050565b805160018111156114195760405162461bcd60e51b815260040161031c90612047565b80600114156111f05760006001600160a01b03168260008151811061143a57fe5b6020026020010151600001516001600160a01b0316141561146d5760405162461bcd60e51b815260040161031c90612218565b6127108260008151811061147d57fe5b60200260200101516020015111156114a75760405162461bcd60e51b815260040161031c906121d3565b816000815181106114b457fe5b60209081029190910181015160008681526002835260408120825181546001600160a01b0319166001600160a01b03909116178155919092015160019091015582517f0744eac43f2c274aeab710e028e1557486f24427dd812cb06edb74fe166e4dfc9186918691869161152457fe5b6020026020010151600001518560008151811061153d57fe5b60200260200101516020015161271060405161155d95949392919061235e565b60405180910390a150505050565b60408051600180825281830190925260609182919060208083019080368337019050509050828160008151811061159e57fe5b602090810291909101015292915050565b6115c1846001600160a01b0316611680565b156107e45760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906115fa9089908990889088908890600401611df6565b602060405180830381600087803b15801561161457600080fd5b505af1925050508015611644575060408051601f3d908101601f1916820190925261164191810190611c05565b60015b611650576110c96123e8565b6001600160e01b0319811663f23a6e6160e01b146111365760405162461bcd60e51b815260040161031c90612010565b3b151590565b80516116999060039060208401906116c1565b50610a3e63e8a3d48560e01b6111f6565b604080518082019091526000808252602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061170257805160ff191683800117855561172f565b8280016001018555821561172f579182015b8281111561172f578251825591602001919060010190611714565b5061173b92915061173f565b5090565b5b8082111561173b5760008155600101611740565b80356001600160a01b038116811461034a57600080fd5b600082601f83011261177b578081fd5b813561178e611789826123c2565b61239b565b8181529150602080830190848101818402860182018710156117af57600080fd5b60005b848110156117ce578135845292820192908201906001016117b2565b505050505092915050565b600082601f8301126117e9578081fd5b813567ffffffffffffffff8111156117ff578182fd5b611812601f8201601f191660200161239b565b915080825283602082850101111561182957600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611853578081fd5b6110218383611754565b6000806040838503121561186f578081fd5b6118798484611754565b91506118888460208501611754565b90509250929050565b600080600080600060a086880312156118a8578081fd5b85356118b38161248d565b945060208601356118c38161248d565b9350604086013567ffffffffffffffff808211156118df578283fd5b6118eb89838a0161176b565b94506060880135915080821115611900578283fd5b61190c89838a0161176b565b93506080880135915080821115611921578283fd5b5061192e888289016117d9565b9150509295509295909350565b600080600080600060a08688031215611952578081fd5b61195c8787611754565b945061196b8760208801611754565b93506040860135925060608601359150608086013567ffffffffffffffff811115611994578182fd5b61192e888289016117d9565b600080604083850312156119b2578182fd5b6119bc8484611754565b9150602083013580151581146119d0578182fd5b809150509250929050565b600080604083850312156119ed578182fd5b6119f78484611754565b946020939093013593505050565b600080600080600060a08688031215611a1c578081fd5b611a268787611754565b9450602080870135945060408088013567ffffffffffffffff80821115611a4b578485fd5b611a578b838c016117d9565b965060608a0135915080821115611a6c578485fd5b611a788b838c016117d9565b955060808a0135915080821115611a8d578485fd5b508801601f81018a13611a9e578384fd5b8035611aac611789826123c2565b81815284810190838601858402850187018e1015611ac8578788fd5b8794505b83851015611b135785818f031215611ae2578788fd5b611aeb8661239b565b611af58f83611754565b81528188013588820152835260019490940193918601918501611acc565b508096505050505050509295509295909350565b60008060408385031215611b39578182fd5b823567ffffffffffffffff80821115611b50578384fd5b818501915085601f830112611b63578384fd5b8135611b71611789826123c2565b80828252602080830192508086018a828387028901011115611b91578889fd5b8896505b84871015611bbb57611ba78b82611754565b845260019690960195928101928101611b95565b509096508701359350505080821115611bd2578283fd5b50611bdf8582860161176b565b9150509250929050565b600060208284031215611bfa578081fd5b8135611021816124a2565b600060208284031215611c16578081fd5b8151611021816124a2565b600060208284031215611c32578081fd5b813567ffffffffffffffff811115611c48578182fd5b611c54848285016117d9565b949350505050565b600080600080600060a08688031215611c73578283fd5b853567ffffffffffffffff80821115611c8a578485fd5b611c9689838a016117d9565b96506020880135915080821115611cab578485fd5b611cb789838a016117d9565b9550611cc68960408a01611754565b94506060880135915080821115611cdb578283fd5b61190c89838a016117d9565b600060208284031215611cf8578081fd5b5035919050565b6000815180845260208085019450808401835b83811015611d2e57815187529582019590820190600101611d12565b509495945050505050565b60008151808452815b81811015611d5e57602081850181015186830182015201611d42565b81811115611d6f5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a060408201819052600090611dc490830186611cff565b8281036060840152611dd68186611cff565b90508281036080840152611dea8185611d39565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611e3090830184611d39565b979650505050505050565b6000602082526110216020830184611cff565b600060408252611e616040830185611cff565b8281036020840152611e738185611cff565b95945050505050565b901515815260200190565b6000602082526110216020830184611d39565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f62616c616e636520717565727920666f7220746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601c908201527f7472616e7366657220746f20746865207a65726f206164647265737300000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f73657474696e6720617070726f76616c2073746174757320666f722073656c66604082015260600190565b6020808252602b908201527f7472616e7366657220746f206e6f6e204552433131353552656365697665722060408201526a34b6b83632b6b2b73a32b960a91b606082015260800190565b6020808252601f908201527f4552433131353552656365697665722072656a656374656420746f6b656e7300604082015260600190565b60208082526025908201527f746865206c656e677468206f6620636f7079726967687473206d757374206265604082015264203c3d203160d81b606082015260800190565b6020808252601a908201527f74617267657420746f6b656e20646f65736e2774206578697374000000000000604082015260600190565b6020808252601a908201527f616d6f756e7420746f206d696e74206d757374206265203e2030000000000000604082015260600190565b602080825260139082015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b6020808252601490820152731a5b9d985b1a59081a5b9d195c999858d9481a5960621b604082015260600190565b60208082526029908201527f7472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f746865206665655261746520696e20636f70797269676874206d757374206265604082015264203c3d203160d81b606082015260800190565b60208082526025908201527f74686520617574686f7220696e20636f707972696768742063616e2774206265604082015264207a65726f60d81b606082015260800190565b6020808252818101527f63616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564604082015260600190565b6020808252818101527f6163636f756e747320616e6420696473206c656e677468206d69736d61746368604082015260600190565b6020808252601f908201527f69647320616e6420616d6f756e7473206c656e677468206d69736d6174636800604082015260600190565b60208082526018908201527f6d696e7420746f20746865207a65726f20616464726573730000000000000000604082015260600190565b81516001600160a01b031681526020918201519181019190915260400190565b90815260200190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156123ba57600080fd5b604052919050565b600067ffffffffffffffff8211156123d8578081fd5b5060209081020190565b60e01c90565b600060443d10156123f857610545565b600481823e6308c379a061240c82516123e2565b1461241657610545565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156124465750505050610545565b828401925082519150808211156124605750505050610545565b503d8301602082840101111561247857505050610545565b601f01601f1916810160200160405291505090565b6001600160a01b0381168114610a3e57600080fd5b6001600160e01b031981168114610a3e57600080fdfe696e73756666696369656e742062616c616e636520666f72207472616e73666572a2646970667358221220ce3ccd2e53743ac93be84c105992ccafe9216edc012d711d6c19c2c054608b0964736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101415760003560e01c8063715018a6116100b8578063b7ec82391161007c578063b7ec82391461028d578063d372da96146102a0578063e985e9c5146102b3578063f242432a146102c6578063f2fde38b146102d9578063f7b20a7d146102ec57610141565b8063715018a6146102375780638da5cb5b1461023f578063938e3d7b1461025457806399e0dd7c14610267578063a22cb4651461027a57610141565b806319b88edb1161010a57806319b88edb146101bf5780632b09d58c146101d25780632eb2c2d6146101da57806337929eb4146101ef5780634e1273f4146101f75780636f4eaff11461021757610141565b8062fdd58e1461014657806301ffc9a71461016f5780630e89341c1461018f57806315070401146101af57806317d7de7c146101b7575b600080fd5b6101596101543660046119db565b6102f4565b6040516101669190612355565b60405180910390f35b61018261017d366004611be9565b610350565b6040516101669190611e7c565b6101a261019d366004611ce7565b61036f565b6040516101669190611e87565b6101a26104b1565b6101a2610548565b6101596101cd366004611ce7565b6105a9565b6101596105c7565b6101ed6101e8366004611891565b6105cd565b005b6101a26107ec565b61020a610205366004611b27565b61084d565b6040516101669190611e3b565b61022a610225366004611ce7565b61091a565b6040516101669190612335565b6101ed61095e565b6102476109e7565b6040516101669190611d84565b6101ed610262366004611c21565b6109f6565b6101ed610275366004611c21565b610a41565b6101ed6102883660046119a0565b610a89565b6101ed61029b366004611c5c565b610b57565b6101ed6102ae366004611a05565b610bdc565b6101826102c136600461185d565b610c2e565b6101ed6102d436600461193b565b610c5c565b6101ed6102e7366004611842565b610df0565b6101a2610e38565b60006001600160a01b0383166103255760405162461bcd60e51b815260040161031c90611ee0565b60405180910390fd5b5060008181526007602090815260408083206001600160a01b03861684529091529020545b92915050565b6001600160e01b03191660009081526001602052604090205460ff1690565b606061037a82610e99565b60008281526009602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845261034a93928301828280156104105780601f106103e557610100808354040283529160200191610410565b820191906000526020600020905b8154815290600101906020018083116103f357829003601f168201915b505060068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529550919350915083018282801561049e5780601f106104735761010080835404028352916020019161049e565b820191906000526020600020905b81548152906001019060200180831161048157829003601f168201915b5050505050610ec490919063ffffffff16565b60058054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053d5780601f106105125761010080835404028352916020019161053d565b820191906000526020600020905b81548152906001019060200180831161052057829003601f168201915b505050505090505b90565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053d5780601f106105125761010080835404028352916020019161053d565b60006105b482610e99565b506000908152600a602052604090205490565b61271090565b81518351146105ee5760405162461bcd60e51b815260040161031c906122c7565b6001600160a01b0384166106145760405162461bcd60e51b815260040161031c90611f22565b61061c610fcc565b6001600160a01b0316856001600160a01b031614806106425750610642856102c1610fcc565b61065e5760405162461bcd60e51b815260040161031c90612155565b6000610668610fcc565b90506106788187878787876107e4565b60005b845181101561077e57600085828151811061069257fe5b6020026020010151905060008583815181106106aa57fe5b60200260200101519050610717816040518060600160405280602181526020016124b9602191396007600086815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002054610fd09092919063ffffffff16565b60008381526007602090815260408083206001600160a01b038e811685529252808320939093558a168152205461074e9082610ffc565b60009283526007602090815260408085206001600160a01b038c168652909152909220919091555060010161067b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516107ce929190611e4e565b60405180910390a46107e4818787878787611028565b505050505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053d5780601f106105125761010080835404028352916020019161053d565b606081518351146108705760405162461bcd60e51b815260040161031c90612292565b6060835167ffffffffffffffff8111801561088a57600080fd5b506040519080825280602002602001820160405280156108b4578160200160208202803683370190505b50905060005b8451811015610912576108f38582815181106108d257fe5b60200260200101518583815181106108e657fe5b60200260200101516102f4565b8282815181106108ff57fe5b60209081029190910101526001016108ba565b509392505050565b6109226116aa565b61092b82610e99565b50600090815260026020908152604091829020825180840190935280546001600160a01b03168352600101549082015290565b610966610fcc565b6001600160a01b03166109776109e7565b6001600160a01b03161461099d5760405162461bcd60e51b815260040161031c9061219e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6109fe610fcc565b6001600160a01b0316610a0f6109e7565b6001600160a01b031614610a355760405162461bcd60e51b815260040161031c9061219e565b610a3e8161113f565b50565b610a49610fcc565b6001600160a01b0316610a5a6109e7565b6001600160a01b031614610a805760405162461bcd60e51b815260040161031c9061219e565b610a3e81611156565b816001600160a01b0316610a9b610fcc565b6001600160a01b03161415610ac25760405162461bcd60e51b815260040161031c90611f90565b8060086000610acf610fcc565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610b13610fcc565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610b4b9190611e7c565b60405180910390a35050565b600c5460ff1615610b7a5760405162461bcd60e51b815260040161031c906120fa565b610b82611169565b610b8a61117b565b610b968585848461118b565b610bbf7fe37243f27916e395706434720b54132b80ef5cc8c56f39b0df6485e8dfb697cf6111f6565b610bc883611248565b5050600c805460ff19166001179055505050565b60008411610bfc5760405162461bcd60e51b815260040161031c906120c3565b600b54610c0a816001610ffc565b600b55610c19818787866112c9565b610c23818561139a565b6107e48133846113f6565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6001600160a01b038416610c825760405162461bcd60e51b815260040161031c90611f22565b610c8a610fcc565b6001600160a01b0316856001600160a01b03161480610cb05750610cb0856102c1610fcc565b610ccc5760405162461bcd60e51b815260040161031c9061225d565b6000610cd6610fcc565b9050610cf6818787610ce78861156b565b610cf08861156b565b876107e4565b610d3d836040518060600160405280602181526020016124b96021913960008781526007602090815260408083206001600160a01b038d1684529091529020549190610fd0565b60008581526007602090815260408083206001600160a01b038b81168552925280832093909355871681522054610d749084610ffc565b60008581526007602090815260408083206001600160a01b03808b168086529190935292819020939093559151909188811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6290610dda908990899061238d565b60405180910390a46107e48187878787876115af565b610df8610fcc565b6001600160a01b0316610e096109e7565b6001600160a01b031614610e2f5760405162461bcd60e51b815260040161031c9061219e565b610a3e81611248565b60068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053d5780601f106105125761010080835404028352916020019161053d565b6000818152600a6020526040902054610a3e5760405162461bcd60e51b815260040161031c9061208c565b805182516060918491849184910167ffffffffffffffff81118015610ee857600080fd5b506040519080825280601f01601f191660200182016040528015610f13576020820181803683370190505b5090506000805b8451811015610f6b57848181518110610f2f57fe5b602001015160f81c60f81b838380600101945081518110610f4c57fe5b60200101906001600160f81b031916908160001a905350600101610f1a565b5060005b8351811015610fc057838181518110610f8457fe5b602001015160f81c60f81b838380600101945081518110610fa157fe5b60200101906001600160f81b031916908160001a905350600101610f6f565b50909695505050505050565b3390565b60008184841115610ff45760405162461bcd60e51b815260040161031c9190611e87565b505050900390565b6000828201838110156110215760405162461bcd60e51b815260040161031c90611f59565b9392505050565b61103a846001600160a01b0316611680565b156107e45760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906110739089908990889088908890600401611d98565b602060405180830381600087803b15801561108d57600080fd5b505af19250505080156110bd575060408051601f3d908101601f191682019092526110ba91810190611c05565b60015b611106576110c96123e8565b806110d457506110ee565b8060405162461bcd60e51b815260040161031c9190611e87565b60405162461bcd60e51b815260040161031c90611fc5565b6001600160e01b0319811663bc197c8160e01b146111365760405162461bcd60e51b815260040161031c90612010565b50505050505050565b80516111529060039060208401906116c1565b5050565b80516111529060069060208401906116c1565b6111796301ffc9a760e01b6111f6565b565b611179636f4eaff160e01b6111f6565b835161119e9060049060208701906116c1565b5082516111b29060059060208601906116c1565b5080516111c69060069060208401906116c1565b506111d082611686565b6111e0636cdb3d1360e11b6111f6565b6111f06303a24d0760e21b6111f6565b50505050565b6001600160e01b031980821614156112205760405162461bcd60e51b815260040161031c90612127565b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b6001600160a01b03811661126e5760405162461bcd60e51b815260040161031c90611e9a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166112ef5760405162461bcd60e51b815260040161031c906122fe565b60006112f9610fcc565b905061130b81600086610ce78961156b565b60008581526007602090815260408083206001600160a01b038089168086529190935281842087905590519092918416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629061136b908a90899061238d565b60405180910390a46000858152600a60205260408120849055611393908290868887876115af565b5050505050565b600082815260096020908152604090912082516113b9928401906116c1565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516113ea9190611e87565b60405180910390a25050565b805160018111156114195760405162461bcd60e51b815260040161031c90612047565b80600114156111f05760006001600160a01b03168260008151811061143a57fe5b6020026020010151600001516001600160a01b0316141561146d5760405162461bcd60e51b815260040161031c90612218565b6127108260008151811061147d57fe5b60200260200101516020015111156114a75760405162461bcd60e51b815260040161031c906121d3565b816000815181106114b457fe5b60209081029190910181015160008681526002835260408120825181546001600160a01b0319166001600160a01b03909116178155919092015160019091015582517f0744eac43f2c274aeab710e028e1557486f24427dd812cb06edb74fe166e4dfc9186918691869161152457fe5b6020026020010151600001518560008151811061153d57fe5b60200260200101516020015161271060405161155d95949392919061235e565b60405180910390a150505050565b60408051600180825281830190925260609182919060208083019080368337019050509050828160008151811061159e57fe5b602090810291909101015292915050565b6115c1846001600160a01b0316611680565b156107e45760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906115fa9089908990889088908890600401611df6565b602060405180830381600087803b15801561161457600080fd5b505af1925050508015611644575060408051601f3d908101601f1916820190925261164191810190611c05565b60015b611650576110c96123e8565b6001600160e01b0319811663f23a6e6160e01b146111365760405162461bcd60e51b815260040161031c90612010565b3b151590565b80516116999060039060208401906116c1565b50610a3e63e8a3d48560e01b6111f6565b604080518082019091526000808252602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061170257805160ff191683800117855561172f565b8280016001018555821561172f579182015b8281111561172f578251825591602001919060010190611714565b5061173b92915061173f565b5090565b5b8082111561173b5760008155600101611740565b80356001600160a01b038116811461034a57600080fd5b600082601f83011261177b578081fd5b813561178e611789826123c2565b61239b565b8181529150602080830190848101818402860182018710156117af57600080fd5b60005b848110156117ce578135845292820192908201906001016117b2565b505050505092915050565b600082601f8301126117e9578081fd5b813567ffffffffffffffff8111156117ff578182fd5b611812601f8201601f191660200161239b565b915080825283602082850101111561182957600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611853578081fd5b6110218383611754565b6000806040838503121561186f578081fd5b6118798484611754565b91506118888460208501611754565b90509250929050565b600080600080600060a086880312156118a8578081fd5b85356118b38161248d565b945060208601356118c38161248d565b9350604086013567ffffffffffffffff808211156118df578283fd5b6118eb89838a0161176b565b94506060880135915080821115611900578283fd5b61190c89838a0161176b565b93506080880135915080821115611921578283fd5b5061192e888289016117d9565b9150509295509295909350565b600080600080600060a08688031215611952578081fd5b61195c8787611754565b945061196b8760208801611754565b93506040860135925060608601359150608086013567ffffffffffffffff811115611994578182fd5b61192e888289016117d9565b600080604083850312156119b2578182fd5b6119bc8484611754565b9150602083013580151581146119d0578182fd5b809150509250929050565b600080604083850312156119ed578182fd5b6119f78484611754565b946020939093013593505050565b600080600080600060a08688031215611a1c578081fd5b611a268787611754565b9450602080870135945060408088013567ffffffffffffffff80821115611a4b578485fd5b611a578b838c016117d9565b965060608a0135915080821115611a6c578485fd5b611a788b838c016117d9565b955060808a0135915080821115611a8d578485fd5b508801601f81018a13611a9e578384fd5b8035611aac611789826123c2565b81815284810190838601858402850187018e1015611ac8578788fd5b8794505b83851015611b135785818f031215611ae2578788fd5b611aeb8661239b565b611af58f83611754565b81528188013588820152835260019490940193918601918501611acc565b508096505050505050509295509295909350565b60008060408385031215611b39578182fd5b823567ffffffffffffffff80821115611b50578384fd5b818501915085601f830112611b63578384fd5b8135611b71611789826123c2565b80828252602080830192508086018a828387028901011115611b91578889fd5b8896505b84871015611bbb57611ba78b82611754565b845260019690960195928101928101611b95565b509096508701359350505080821115611bd2578283fd5b50611bdf8582860161176b565b9150509250929050565b600060208284031215611bfa578081fd5b8135611021816124a2565b600060208284031215611c16578081fd5b8151611021816124a2565b600060208284031215611c32578081fd5b813567ffffffffffffffff811115611c48578182fd5b611c54848285016117d9565b949350505050565b600080600080600060a08688031215611c73578283fd5b853567ffffffffffffffff80821115611c8a578485fd5b611c9689838a016117d9565b96506020880135915080821115611cab578485fd5b611cb789838a016117d9565b9550611cc68960408a01611754565b94506060880135915080821115611cdb578283fd5b61190c89838a016117d9565b600060208284031215611cf8578081fd5b5035919050565b6000815180845260208085019450808401835b83811015611d2e57815187529582019590820190600101611d12565b509495945050505050565b60008151808452815b81811015611d5e57602081850181015186830182015201611d42565b81811115611d6f5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a060408201819052600090611dc490830186611cff565b8281036060840152611dd68186611cff565b90508281036080840152611dea8185611d39565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611e3090830184611d39565b979650505050505050565b6000602082526110216020830184611cff565b600060408252611e616040830185611cff565b8281036020840152611e738185611cff565b95945050505050565b901515815260200190565b6000602082526110216020830184611d39565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f62616c616e636520717565727920666f7220746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601c908201527f7472616e7366657220746f20746865207a65726f206164647265737300000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f73657474696e6720617070726f76616c2073746174757320666f722073656c66604082015260600190565b6020808252602b908201527f7472616e7366657220746f206e6f6e204552433131353552656365697665722060408201526a34b6b83632b6b2b73a32b960a91b606082015260800190565b6020808252601f908201527f4552433131353552656365697665722072656a656374656420746f6b656e7300604082015260600190565b60208082526025908201527f746865206c656e677468206f6620636f7079726967687473206d757374206265604082015264203c3d203160d81b606082015260800190565b6020808252601a908201527f74617267657420746f6b656e20646f65736e2774206578697374000000000000604082015260600190565b6020808252601a908201527f616d6f756e7420746f206d696e74206d757374206265203e2030000000000000604082015260600190565b602080825260139082015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b6020808252601490820152731a5b9d985b1a59081a5b9d195c999858d9481a5960621b604082015260600190565b60208082526029908201527f7472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f746865206665655261746520696e20636f70797269676874206d757374206265604082015264203c3d203160d81b606082015260800190565b60208082526025908201527f74686520617574686f7220696e20636f707972696768742063616e2774206265604082015264207a65726f60d81b606082015260800190565b6020808252818101527f63616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564604082015260600190565b6020808252818101527f6163636f756e747320616e6420696473206c656e677468206d69736d61746368604082015260600190565b6020808252601f908201527f69647320616e6420616d6f756e7473206c656e677468206d69736d6174636800604082015260600190565b60208082526018908201527f6d696e7420746f20746865207a65726f20616464726573730000000000000000604082015260600190565b81516001600160a01b031681526020918201519181019190915260400190565b90815260200190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156123ba57600080fd5b604052919050565b600067ffffffffffffffff8211156123d8578081fd5b5060209081020190565b60e01c90565b600060443d10156123f857610545565b600481823e6308c379a061240c82516123e2565b1461241657610545565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156124465750505050610545565b828401925082519150808211156124605750505050610545565b503d8301602082840101111561247857505050610545565b601f01601f1916810160200160405291505090565b6001600160a01b0381168114610a3e57600080fd5b6001600160e01b031981168114610a3e57600080fdfe696e73756666696369656e742062616c616e636520666f72207472616e73666572a2646970667358221220ce3ccd2e53743ac93be84c105992ccafe9216edc012d711d6c19c2c054608b0964736f6c634300060c0033
Deployed Bytecode Sourcemap
45830:1616:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36962:222;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30527:150;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36485:174::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40794:91::-;;;:::i;40699:87::-;;;:::i;36667:144::-;;;;;;:::i;:::-;;:::i;33557:107::-;;;:::i;39519:1172::-;;;;;;:::i;:::-;;:::i;:::-;;31928:99;;;:::i;37350:520::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41008:157::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2772:148::-;;;:::i;2121:87::-;;;:::i;:::-;;;;;;;:::i;47326:117::-;;;;;;:::i;:::-;;:::i;47189:129::-;;;;;;:::i;:::-;;:::i;37943:302::-;;;;;;:::i;:::-;;:::i;45989:564::-;;;;;;:::i;:::-;;:::i;46561:620::-;;;;;;:::i;:::-;;:::i;38317:168::-;;;;;;:::i;:::-;;:::i;38557:885::-;;;;;;:::i;:::-;;:::i;3075:117::-;;;;;;:::i;:::-;;:::i;40893:107::-;;;:::i;36962:222::-;37048:7;-1:-1:-1;;;;;37076:21:0;;37068:68;;;;-1:-1:-1;;;37068:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;37154:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;37154:22:0;;;;;;;;;;36962:222;;;;;:::o;30527:150::-;-1:-1:-1;;;;;;30636:33:0;30612:4;30636:33;;;:20;:33;;;;;;;;;30527:150::o;36485:174::-;36550:13;36576:24;36597:2;36576:20;:24::i;:::-;36641:9;;;;:5;:9;;;;;;;;;36618:33;;;;;;-1:-1:-1;;36618:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36641:9;36618:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36618:15:0;:22;;;;;;;;-1:-1:-1;;36618:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36618:15:0;;-1:-1:-1;36618:22:0;-1:-1:-1;36618:22:0;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;;:::i;40794:91::-;40870:7;40863:14;;;;;;;;-1:-1:-1;;40863:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40838:13;;40863:14;;40870:7;;40863:14;;40870:7;40863:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40794:91;;:::o;40699:87::-;40773:5;40766:12;;;;;;;;-1:-1:-1;;40766:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40741:13;;40766:12;;40773:5;;40766:12;;40773:5;40766:12;;;;;;;;;;;;;;;;;;;;;;;;36667:144;36726:7;36745:24;36766:2;36745:20;:24::i;:::-;-1:-1:-1;36787:16:0;;;;:12;:16;;;;;;;36667:144::o;33557:107::-;32223:5;33557:107;:::o;39519:1172::-;39772:7;:14;39758:3;:10;:28;39750:72;;;;-1:-1:-1;;;39750:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39841:16:0;;39833:57;;;;-1:-1:-1;;;39833:57:0;;;;;;;:::i;:::-;39931:12;:10;:12::i;:::-;-1:-1:-1;;;;;39923:20:0;:4;-1:-1:-1;;;;;39923:20:0;;:60;;;;39947:36;39964:4;39970:12;:10;:12::i;39947:36::-;39901:151;;;;-1:-1:-1;;;39901:151:0;;;;;;;:::i;:::-;40065:16;40084:12;:10;:12::i;:::-;40065:31;;40109:60;40130:8;40140:4;40146:2;40150:3;40155:7;40164:4;40109:20;:60::i;:::-;40187:9;40182:349;40206:3;:10;40202:1;:14;40182:349;;;40238:10;40251:3;40255:1;40251:6;;;;;;;;;;;;;;40238:19;;40272:14;40289:7;40297:1;40289:10;;;;;;;;;;;;;;40272:27;;40338:117;40380:6;40338:117;;;;;;;;;;;;;;;;;:9;:13;40348:2;40338:13;;;;;;;;;;;:19;40352:4;-1:-1:-1;;;;;40338:19:0;-1:-1:-1;;;;;40338:19:0;;;;;;;;;;;;;:23;;:117;;;;;:::i;:::-;40316:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;40316:19:0;;;;;;;;;;:139;;;;40490:17;;;;;;:29;;40512:6;40490:21;:29::i;:::-;40470:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;40470:17:0;;;;;;;;;;:49;;;;-1:-1:-1;40218:3:0;;40182:349;;;;40578:2;-1:-1:-1;;;;;40548:47:0;40572:4;-1:-1:-1;;;;;40548:47:0;40562:8;-1:-1:-1;;;;;40548:47:0;;40582:3;40587:7;40548:47;;;;;;;:::i;:::-;;;;;;;;40608:75;40644:8;40654:4;40660:2;40664:3;40669:7;40678:4;40608:35;:75::i;:::-;39519:1172;;;;;;:::o;31928:99::-;32007:12;32000:19;;;;;;;;-1:-1:-1;;32000:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31975:13;;32000:19;;32007:12;;32000:19;;32007:12;32000:19;;;;;;;;;;;;;;;;;;;;;;;;37350:520;37511:16;37572:3;:10;37553:8;:15;:29;37545:74;;;;-1:-1:-1;;;37545:74:0;;;;;;;:::i;:::-;37632:30;37679:8;:15;37665:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37665:30:0;;37632:63;;37713:9;37708:122;37732:8;:15;37728:1;:19;37708:122;;;37788:30;37798:8;37807:1;37798:11;;;;;;;;;;;;;;37811:3;37815:1;37811:6;;;;;;;;;;;;;;37788:9;:30::i;:::-;37769:13;37783:1;37769:16;;;;;;;;;;;;;;;;;:49;37749:3;;37708:122;;;-1:-1:-1;37849:13:0;37350:520;-1:-1:-1;;;37350:520:0:o;41008:157::-;41072:16;;:::i;:::-;41100:24;41121:2;41100:20;:24::i;:::-;-1:-1:-1;41142:15:0;;;;:11;:15;;;;;;;;;41135:22;;;;;;;;;;-1:-1:-1;;;;;41135:22:0;;;;;;;;;;;41008:157::o;2772:148::-;2352:12;:10;:12::i;:::-;-1:-1:-1;;;;;2341:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2341:23:0;;2333:68;;;;-1:-1:-1;;;2333:68:0;;;;;;;:::i;:::-;2879:1:::1;2863:6:::0;;2842:40:::1;::::0;-1:-1:-1;;;;;2863:6:0;;::::1;::::0;2842:40:::1;::::0;2879:1;;2842:40:::1;2910:1;2893:19:::0;;-1:-1:-1;;;;;;2893:19:0::1;::::0;;2772:148::o;2121:87::-;2167:7;2194:6;-1:-1:-1;;;;;2194:6:0;2121:87;:::o;47326:117::-;2352:12;:10;:12::i;:::-;-1:-1:-1;;;;;2341:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2341:23:0;;2333:68;;;;-1:-1:-1;;;2333:68:0;;;;;;;:::i;:::-;47407:28:::1;47423:11;47407:15;:28::i;:::-;47326:117:::0;:::o;47189:129::-;2352:12;:10;:12::i;:::-;-1:-1:-1;;;;;2341:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2341:23:0;;2333:68;;;;-1:-1:-1;;;2333:68:0;;;;;;;:::i;:::-;47276:34:::1;47295:14;47276:18;:34::i;37943:302::-:0;38062:8;-1:-1:-1;;;;;38046:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;38046:24:0;;;38038:69;;;;-1:-1:-1;;;38038:69:0;;;;;;;:::i;:::-;38165:8;38120:18;:32;38139:12;:10;:12::i;:::-;-1:-1:-1;;;;;38120:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;38120:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;38120:53:0;;;;;;;;;;;38204:12;:10;:12::i;:::-;-1:-1:-1;;;;;38189:48:0;;38228:8;38189:48;;;;;;:::i;:::-;;;;;;;;37943:302;;:::o;45989:564::-;46204:13;;;;46203:14;46195:46;;;;-1:-1:-1;;;46195:46:0;;;;;;;:::i;:::-;46254:33;:31;:33::i;:::-;46298:36;:34;:36::i;:::-;46345:59;46362:4;46368:6;46376:11;46389:14;46345:16;:59::i;:::-;46415:58;46441:30;46415:18;:58::i;:::-;46486:28;46505:8;46486:18;:28::i;:::-;-1:-1:-1;;46525:13:0;:20;;-1:-1:-1;;46525:20:0;46541:4;46525:20;;;-1:-1:-1;;;45989:564:0:o;46561:620::-;46776:1;46767:6;:10;46759:49;;;;-1:-1:-1;;;46759:49:0;;;;;;;:::i;:::-;46881:10;;46915:17;46881:10;46930:1;46915:14;:17::i;:::-;46902:10;:30;46965:40;46971:9;46982:8;46992:6;47000:4;46965:5;:40::i;:::-;47046:33;47059:9;47070:8;47046:12;:33::i;:::-;47121:52;47135:9;47146:10;47158:14;47121:13;:52::i;38317:168::-;-1:-1:-1;;;;;38440:27:0;;;38416:4;38440:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;38317:168::o;38557:885::-;-1:-1:-1;;;;;38771:16:0;;38763:57;;;;-1:-1:-1;;;38763:57:0;;;;;;;:::i;:::-;38861:12;:10;:12::i;:::-;-1:-1:-1;;;;;38853:20:0;:4;-1:-1:-1;;;;;38853:20:0;;:60;;;;38877:36;38894:4;38900:12;:10;:12::i;38877:36::-;38831:142;;;;-1:-1:-1;;;38831:142:0;;;;;;;:::i;:::-;38986:16;39005:12;:10;:12::i;:::-;38986:31;;39030:96;39051:8;39061:4;39067:2;39071:21;39089:2;39071:17;:21::i;:::-;39094:25;39112:6;39094:17;:25::i;:::-;39121:4;39030:20;:96::i;:::-;39161:68;39185:6;39161:68;;;;;;;;;;;;;;;;;:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;39161:19:0;;;;;;;;;;;:68;:23;:68::i;:::-;39139:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;39139:19:0;;;;;;;;;;:90;;;;39260:17;;;;;;:29;;39282:6;39260:21;:29::i;:::-;39240:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;39240:17:0;;;;;;;;;;;;;;:49;;;;39307:46;;39240:17;;39307:46;;;;;;;;;;;;39250:2;;39346:6;;39307:46;:::i;:::-;;;;;;;;39366:68;39397:8;39407:4;39413:2;39417;39421:6;39429:4;39366:30;:68::i;3075:117::-;2352:12;:10;:12::i;:::-;-1:-1:-1;;;;;2341:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2341:23:0;;2333:68;;;;-1:-1:-1;;;2333:68:0;;;;;;;:::i;:::-;3156:28:::1;3175:8;3156:18;:28::i;40893:107::-:0;40977:15;40970:22;;;;;;;;-1:-1:-1;;40970:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40945:13;;40970:22;;40977:15;;40970:22;;40977:15;40970:22;;;;;;;;;;;;;;;;;;;;;;;;43948:134;44022:16;;;;:12;:16;;;;;;44014:60;;;;-1:-1:-1;;;44014:60:0;;;;;;;:::i;27177:422::-;27398:10;;27385;;27252:13;;27303:2;;27342;;27252:13;;27385:23;27375:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27375:34:0;;27356:53;;27420:6;27446;27441:55;27462:3;:10;27458:1;:14;27441:55;;;27490:3;27494:1;27490:6;;;;;;;;;;;;;;;;27479:3;27483;;;;;;27479:8;;;;;;;;;;;:17;-1:-1:-1;;;;;27479:17:0;;;;;;;;-1:-1:-1;27474:3:0;;27441:55;;;;27512:6;27507:55;27528:3;:10;27524:1;:14;27507:55;;;27556:3;27560:1;27556:6;;;;;;;;;;;;;;;;27545:3;27549;;;;;;27545:8;;;;;;;;;;;:17;-1:-1:-1;;;;;27545:17:0;;;;;;;;-1:-1:-1;27540:3:0;;27507:55;;;-1:-1:-1;27587:3:0;;27177:422;-1:-1:-1;;;;;;27177:422:0:o;688:106::-;776:10;688:106;:::o;16676:166::-;16762:7;16798:12;16790:6;;;;16782:29;;;;-1:-1:-1;;;16782:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;16829:5:0;;;16676:166::o;13849:179::-;13907:7;13939:5;;;13963:6;;;;13955:46;;;;-1:-1:-1;;;13955:46:0;;;;;;;:::i;:::-;14019:1;13849:179;-1:-1:-1;;;13849:179:0:o;44838:777::-;45088:15;:2;-1:-1:-1;;;;;45088:13:0;;:15::i;:::-;45084:524;;;45124:79;;-1:-1:-1;;;45124:79:0;;-1:-1:-1;;;;;45124:43:0;;;;;:79;;45168:8;;45178:4;;45184:3;;45189:7;;45198:4;;45124:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45124:79:0;;;;;;;;-1:-1:-1;;45124:79:0;;;;;;;;;;;;:::i;:::-;;;45120:477;;;;:::i;:::-;;;;;;;;45479:6;45472:14;;-1:-1:-1;;;45472:14:0;;;;;;;;:::i;45120:477::-;45528:53;;-1:-1:-1;;;45528:53:0;;;;;;;:::i;45120:477::-;-1:-1:-1;;;;;;45253:64:0;;-1:-1:-1;;;45253:64:0;45249:154;;45342:41;;-1:-1:-1;;;45342:41:0;;;;;;;:::i;45249:154::-;45204:214;44838:777;;;;;;:::o;31814:106::-;31886:26;;;;:12;;:26;;;;;:::i;:::-;;31814:106;:::o;43822:118::-;43900:32;;;;:15;;:32;;;;;:::i;30121:249::-;30322:40;-1:-1:-1;;;30322:18:0;:40::i;:::-;30121:249::o;32662:117::-;32728:43;-1:-1:-1;;;32728:18:0;:43::i;35453:621::-;35651:12;;;;:5;;:12;;;;;:::i;:::-;-1:-1:-1;35674:16:0;;;;:7;;:16;;;;;:::i;:::-;-1:-1:-1;35701:32:0;;;;:15;;:32;;;;;:::i;:::-;;35744;35764:11;35744:19;:32::i;:::-;35868:41;-1:-1:-1;;;35868:18:0;:41::i;:::-;36012:54;-1:-1:-1;;;36012:18:0;:54::i;:::-;35453:621;;;;:::o;31086:193::-;-1:-1:-1;;;;;;31170:25:0;;;;;31162:58;;;;-1:-1:-1;;;31162:58:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;31231:33:0;;;;;31267:4;31231:33;;;;;;;;:40;;-1:-1:-1;;31231:40:0;;;;;;31086:193::o;3200:229::-;-1:-1:-1;;;;;3274:22:0;;3266:73;;;;-1:-1:-1;;;3266:73:0;;;;;;;:::i;:::-;3376:6;;;3355:38;;-1:-1:-1;;;;;3355:38:0;;;;3376:6;;;3355:38;;;3404:6;:17;;-1:-1:-1;;;;;;3404:17:0;-1:-1:-1;;;;;3404:17:0;;;;;;;;;;3200:229::o;41566:582::-;-1:-1:-1;;;;;41681:21:0;;41673:58;;;;-1:-1:-1;;;41673:58:0;;;;;;;:::i;:::-;41744:16;41763:12;:10;:12::i;:::-;41744:31;;41788:107;41809:8;41827:1;41831:7;41840:21;41858:2;41840:17;:21::i;41788:107::-;41908:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;41908:22:0;;;;;;;;;;;;;:31;;;41955:57;;41908:22;;:13;41955:57;;;;;;;41918:2;;41933:6;;41955:57;:::i;:::-;;;;;;;;42025:16;;;;:12;:16;;;;;:25;;;42061:79;;42092:8;;42114:7;42038:2;42044:6;42135:4;42061:30;:79::i;:::-;41566:582;;;;;:::o;43539:139::-;43617:9;;;;:5;:9;;;;;;;;:20;;;;;;;;:::i;:::-;;43667:2;43653:17;43657:8;43653:17;;;;;;:::i;:::-;;;;;;;;43539:139;;:::o;32787:762::-;32917:21;;32973:1;32957:17;;;32949:80;;;;-1:-1:-1;;;32949:80:0;;;;;;;:::i;:::-;33044:12;33060:1;33044:17;33040:502;;;33122:1;-1:-1:-1;;;;;33086:38:0;:14;33101:1;33086:17;;;;;;;;;;;;;;:24;;;-1:-1:-1;;;;;33086:38:0;;;33078:119;;;;-1:-1:-1;;;33078:119:0;;;;;;;:::i;:::-;32223:5;33220:14;33235:1;33220:17;;;;;;;;;;;;;;:34;;;:57;;33212:138;;;;-1:-1:-1;;;33212:138:0;;;;;;;:::i;:::-;33385:14;33400:1;33385:17;;;;;;;;;;;;;;;;;;;33367:15;;;;:11;:15;;;;;:35;;;;-1:-1:-1;;;;;;33367:35:0;-1:-1:-1;;;;;33367:35:0;;;;;;;;;;;-1:-1:-1;33367:35:0;;;;33448:17;;33422:108;;33367:15;;33439:7;;33448:17;;;;;;;;;;;;:24;;;33474:14;33489:1;33474:17;;;;;;;;;;;;;;:34;;;32223:5;33422:108;;;;;;;;;;:::i;:::-;;;;;;;;32787:762;;;;:::o;45623:198::-;45743:16;;;45757:1;45743:16;;;;;;;;;45689;;;;45743;;;;;;;;;;;;-1:-1:-1;45743:16:0;45718:41;;45781:7;45770:5;45776:1;45770:8;;;;;;;;;;;;;;;;;:18;45808:5;45623:198;-1:-1:-1;;45623:198:0:o;44090:740::-;44315:15;:2;-1:-1:-1;;;;;44315:13:0;;:15::i;:::-;44311:512;;;44351:72;;-1:-1:-1;;;44351:72:0;;-1:-1:-1;;;;;44351:38:0;;;;;:72;;44390:8;;44400:4;;44406:2;;44410:6;;44418:4;;44351:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44351:72:0;;;;;;;;-1:-1:-1;;44351:72:0;;;;;;;;;;;;:::i;:::-;;;44347:465;;;;:::i;:::-;-1:-1:-1;;;;;;44473:59:0;;-1:-1:-1;;;44473:59:0;44469:149;;44557:41;;-1:-1:-1;;;44557:41:0;;;;;;;:::i;19244:420::-;19610:20;19648:8;;;19244:420::o;31511:167::-;31587:26;;;;:12;;:26;;;;;:::i;:::-;-1:-1:-1;31624:46:0;-1:-1:-1;;;31624:18:0;:46::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;5:130;72:20;;-1:-1;;;;;38778:54;;40378:35;;40368:2;;40427:1;;40417:12;1729:707;;1846:3;1839:4;1831:6;1827:17;1823:27;1813:2;;-1:-1;;1854:12;1813:2;1901:6;1888:20;1923:80;1938:64;1995:6;1938:64;:::i;:::-;1923:80;:::i;:::-;2031:21;;;1914:89;-1:-1;2075:4;2088:14;;;;2063:17;;;2177;;;2168:27;;;;2165:36;-1:-1;2162:2;;;2214:1;;2204:12;2162:2;2239:1;2224:206;2249:6;2246:1;2243:13;2224:206;;;4342:20;;2317:50;;2381:14;;;;2409;;;;2271:1;2264:9;2224:206;;;2228:14;;;;;1806:630;;;;:::o;2850:440::-;;2951:3;2944:4;2936:6;2932:17;2928:27;2918:2;;-1:-1;;2959:12;2918:2;3006:6;2993:20;36657:18;36649:6;36646:30;36643:2;;;-1:-1;;36679:12;36643:2;3028:64;36752:9;36733:17;;-1:-1;;36729:33;36820:4;36810:15;3028:64;:::i;:::-;3019:73;;3112:6;3105:5;3098:21;3216:3;36820:4;3207:6;3140;3198:16;;3195:25;3192:2;;;3233:1;;3223:12;3192:2;39005:6;36820:4;3140:6;3136:17;36820:4;3174:5;3170:16;38982:30;39061:1;39043:16;;;36820:4;39043:16;39036:27;3174:5;2911:379;-1:-1;;2911:379::o;4412:241::-;;4516:2;4504:9;4495:7;4491:23;4487:32;4484:2;;;-1:-1;;4522:12;4484:2;4584:53;4629:7;4605:22;4584:53;:::i;4660:366::-;;;4781:2;4769:9;4760:7;4756:23;4752:32;4749:2;;;-1:-1;;4787:12;4749:2;4849:53;4894:7;4870:22;4849:53;:::i;:::-;4839:63;;4957:53;5002:7;4939:2;4982:9;4978:22;4957:53;:::i;:::-;4947:63;;4743:283;;;;;:::o;5033:1119::-;;;;;;5264:3;5252:9;5243:7;5239:23;5235:33;5232:2;;;-1:-1;;5271:12;5232:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5323:63;-1:-1;5423:2;5462:22;;72:20;97:33;72:20;97:33;:::i;:::-;5431:63;-1:-1;5559:2;5544:18;;5531:32;5583:18;5572:30;;;5569:2;;;-1:-1;;5605:12;5569:2;5635:78;5705:7;5696:6;5685:9;5681:22;5635:78;:::i;:::-;5625:88;;5778:2;5767:9;5763:18;5750:32;5736:46;;5583:18;5794:6;5791:30;5788:2;;;-1:-1;;5824:12;5788:2;5854:78;5924:7;5915:6;5904:9;5900:22;5854:78;:::i;:::-;5844:88;;5997:3;5986:9;5982:19;5969:33;5955:47;;5583:18;6014:6;6011:30;6008:2;;;-1:-1;;6044:12;6008:2;;6074:62;6128:7;6119:6;6108:9;6104:22;6074:62;:::i;:::-;6064:72;;;5226:926;;;;;;;;:::o;6159:847::-;;;;;;6340:3;6328:9;6319:7;6315:23;6311:33;6308:2;;;-1:-1;;6347:12;6308:2;6409:53;6454:7;6430:22;6409:53;:::i;:::-;6399:63;;6517:53;6562:7;6499:2;6542:9;6538:22;6517:53;:::i;:::-;6507:63;;6607:2;6650:9;6646:22;4342:20;6615:63;;6715:2;6758:9;6754:22;4342:20;6723:63;;6851:3;6840:9;6836:19;6823:33;6876:18;6868:6;6865:30;6862:2;;;-1:-1;;6898:12;6862:2;6928:62;6982:7;6973:6;6962:9;6958:22;6928:62;:::i;7013:360::-;;;7131:2;7119:9;7110:7;7106:23;7102:32;7099:2;;;-1:-1;;7137:12;7099:2;7199:53;7244:7;7220:22;7199:53;:::i;:::-;7189:63;;7289:2;7329:9;7325:22;2508:20;40524:5;38539:13;38532:21;40502:5;40499:32;40489:2;;-1:-1;;40535:12;40489:2;7297:60;;;;7093:280;;;;;:::o;7380:366::-;;;7501:2;7489:9;7480:7;7476:23;7472:32;7469:2;;;-1:-1;;7507:12;7469:2;7569:53;7614:7;7590:22;7569:53;:::i;:::-;7559:63;7659:2;7698:22;;;;4342:20;;-1:-1;;;7463:283::o;7753:1143::-;;;;;;7996:3;7984:9;7975:7;7971:23;7967:33;7964:2;;;-1:-1;;8003:12;7964:2;8065:53;8110:7;8086:22;8065:53;:::i;:::-;8055:63;;8155:2;;8198:9;8194:22;4342:20;8163:63;;8291:2;;8280:9;8276:18;8263:32;8315:18;;8307:6;8304:30;8301:2;;;-1:-1;;8337:12;8301:2;8367:63;8422:7;8413:6;8402:9;8398:22;8367:63;:::i;:::-;8357:73;;8495:2;8484:9;8480:18;8467:32;8453:46;;8315:18;8511:6;8508:30;8505:2;;;-1:-1;;8541:12;8505:2;8571:62;8625:7;8616:6;8605:9;8601:22;8571:62;:::i;:::-;8561:72;;8698:3;8687:9;8683:19;8670:33;8656:47;;8315:18;8715:6;8712:30;8709:2;;;-1:-1;;8745:12;8709:2;-1:-1;8848:22;;1052:4;1040:17;;1036:27;-1:-1;1026:2;;-1:-1;;1067:12;1026:2;1114:6;1101:20;1136:107;1151:91;1235:6;1151:91;:::i;1136:107::-;1271:21;;;1328:14;;;;1303:17;;;1417;;;1408:27;;;;1405:36;-1:-1;1402:2;;;-1:-1;;1444:12;1402:2;-1:-1;1470:10;;1464:233;1489:6;1486:1;1483:13;1464:233;;;8291:2;3889:9;3884:3;3880:19;3876:30;3873:2;;;-1:-1;;3909:12;3873:2;3937:20;8291:2;3937:20;:::i;:::-;4041:49;4086:3;4062:22;4041:49;:::i;:::-;4016:75;;4218:22;;;4342:20;4179:16;;;4172:75;1557:77;;1511:1;1504:9;;;;;1648:14;;;;1676;;1464:233;;;1468:14;8765:115;;;;;;;;;7958:938;;;;;;;;:::o;8903:638::-;;;9074:2;9062:9;9053:7;9049:23;9045:32;9042:2;;;-1:-1;;9080:12;9042:2;9138:17;9125:31;9176:18;;9168:6;9165:30;9162:2;;;-1:-1;;9198:12;9162:2;9289:6;9278:9;9274:22;;;277:3;270:4;262:6;258:17;254:27;244:2;;-1:-1;;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;:::i;354:80::-;440:16;476:6;469:5;462:21;506:4;;523:3;519:14;512:21;;506:4;498:6;494:17;628:3;506:4;;612:6;608:17;498:6;599:27;;596:36;593:2;;;-1:-1;;635:12;593:2;-1:-1;661:10;;655:206;680:6;677:1;674:13;655:206;;;760:37;793:3;781:10;760:37;:::i;:::-;748:50;;702:1;695:9;;;;;812:14;;;;840;;655:206;;;-1:-1;9218:88;;-1:-1;9356:18;;9343:32;;-1:-1;;;9384:30;;;9381:2;;;-1:-1;;9417:12;9381:2;;9447:78;9517:7;9508:6;9497:9;9493:22;9447:78;:::i;:::-;9437:88;;;9036:505;;;;;:::o;9548:239::-;;9651:2;9639:9;9630:7;9626:23;9622:32;9619:2;;;-1:-1;;9657:12;9619:2;2654:6;2641:20;2666:32;2692:5;2666:32;:::i;9794:261::-;;9908:2;9896:9;9887:7;9883:23;9879:32;9876:2;;;-1:-1;;9914:12;9876:2;2793:6;2787:13;2805:32;2831:5;2805:32;:::i;10062:347::-;;10176:2;10164:9;10155:7;10151:23;10147:32;10144:2;;;-1:-1;;10182:12;10144:2;10240:17;10227:31;10278:18;10270:6;10267:30;10264:2;;;-1:-1;;10300:12;10264:2;10330:63;10385:7;10376:6;10365:9;10361:22;10330:63;:::i;:::-;10320:73;10138:271;-1:-1;;;;10138:271::o;10416:1167::-;;;;;;10628:3;10616:9;10607:7;10603:23;10599:33;10596:2;;;-1:-1;;10635:12;10596:2;10693:17;10680:31;10731:18;;10723:6;10720:30;10717:2;;;-1:-1;;10753:12;10717:2;10783:63;10838:7;10829:6;10818:9;10814:22;10783:63;:::i;:::-;10773:73;;10911:2;10900:9;10896:18;10883:32;10869:46;;10731:18;10927:6;10924:30;10921:2;;;-1:-1;;10957:12;10921:2;10987:63;11042:7;11033:6;11022:9;11018:22;10987:63;:::i;:::-;10977:73;;11105:53;11150:7;11087:2;11130:9;11126:22;11105:53;:::i;:::-;11095:63;;11223:2;11212:9;11208:18;11195:32;11181:46;;10731:18;11239:6;11236:30;11233:2;;;-1:-1;;11269:12;11233:2;11299:63;11354:7;11345:6;11334:9;11330:22;11299:63;:::i;11590:241::-;;11694:2;11682:9;11673:7;11669:23;11665:32;11662:2;;;-1:-1;;11700:12;11662:2;-1:-1;4342:20;;11656:175;-1:-1;11656:175::o;12281:690::-;;12474:5;37432:12;37976:6;37971:3;37964:19;38013:4;;38008:3;38004:14;12486:93;;38013:4;12650:5;37286:14;-1:-1;12689:260;12714:6;12711:1;12708:13;12689:260;;;12775:13;;21491:37;;11992:14;;;;37819;;;;12736:1;12729:9;12689:260;;;-1:-1;12955:10;;12405:566;-1:-1;;;;;12405:566::o;13090:343::-;;13232:5;37432:12;37976:6;37971:3;37964:19;-1:-1;39150:101;39164:6;39161:1;39158:13;39150:101;;;38013:4;39231:11;;;;;39225:18;39212:11;;;;;39205:39;39179:10;39150:101;;;39266:6;39263:1;39260:13;39257:2;;;-1:-1;38013:4;39322:6;38008:3;39313:16;;39306:27;39257:2;-1:-1;36752:9;39422:14;-1:-1;;39418:28;13389:39;;;;38013:4;13389:39;;13180:253;-1:-1;;13180:253::o;21660:222::-;-1:-1;;;;;38778:54;;;;12081:37;;21787:2;21772:18;;21758:124::o;21889:1048::-;-1:-1;;;;;38778:54;;;12081:37;;38778:54;;22411:2;22396:18;;12081:37;38789:42;22448:2;22433:18;;22426:48;;;21889:1048;;22488:108;;22231:19;;22582:6;22488:108;:::i;:::-;22644:9;22638:4;22634:20;22629:2;22618:9;22614:18;22607:48;22669:108;22772:4;22763:6;22669:108;:::i;:::-;22661:116;;22826:9;22820:4;22816:20;22810:3;22799:9;22795:19;22788:49;22851:76;22922:4;22913:6;22851:76;:::i;:::-;22843:84;22217:720;-1:-1;;;;;;;;22217:720::o;22944:752::-;-1:-1;;;;;38778:54;;;12081:37;;38778:54;;23366:2;23351:18;;12081:37;23449:2;23434:18;;21491:37;;;23532:2;23517:18;;21491:37;;;38789:42;23569:3;23554:19;;23547:49;;;22944:752;;23610:76;;23186:19;;23672:6;23610:76;:::i;:::-;23602:84;23172:524;-1:-1;;;;;;;23172:524::o;23703:370::-;;23880:2;23901:17;23894:47;23955:108;23880:2;23869:9;23865:18;24049:6;23955:108;:::i;24080:629::-;;24335:2;24356:17;24349:47;24410:108;24335:2;24324:9;24320:18;24504:6;24410:108;:::i;:::-;24566:9;24560:4;24556:20;24551:2;24540:9;24536:18;24529:48;24591:108;24694:4;24685:6;24591:108;:::i;:::-;24583:116;24306:403;-1:-1;;;;;24306:403::o;24716:210::-;38539:13;;38532:21;13044:34;;24837:2;24822:18;;24808:118::o;24933:310::-;;25080:2;25101:17;25094:47;25155:78;25080:2;25069:9;25065:18;25219:6;25155:78;:::i;25250:416::-;25450:2;25464:47;;;14019:2;25435:18;;;37964:19;14055:34;38004:14;;;14035:55;-1:-1;;;14110:12;;;14103:30;14152:12;;;25421:245::o;25673:416::-;25873:2;25887:47;;;14403:2;25858:18;;;37964:19;14439:34;38004:14;;;14419:55;-1:-1;;;14494:12;;;14487:26;14532:12;;;25844:245::o;26096:416::-;26296:2;26310:47;;;14783:2;26281:18;;;37964:19;14819:30;38004:14;;;14799:51;14869:12;;;26267:245::o;26519:416::-;26719:2;26733:47;;;15120:2;26704:18;;;37964:19;15156:29;38004:14;;;15136:50;15205:12;;;26690:245::o;26942:416::-;27142:2;27156:47;;;27127:18;;;37964:19;15492:34;38004:14;;;15472:55;15546:12;;;27113:245::o;27365:416::-;27565:2;27579:47;;;15797:2;27550:18;;;37964:19;15833:34;38004:14;;;15813:55;-1:-1;;;15888:12;;;15881:35;15935:12;;;27536:245::o;27788:416::-;27988:2;28002:47;;;16186:2;27973:18;;;37964:19;16222:33;38004:14;;;16202:54;16275:12;;;27959:245::o;28211:416::-;28411:2;28425:47;;;16526:2;28396:18;;;37964:19;16562:34;38004:14;;;16542:55;-1:-1;;;16617:12;;;16610:29;16658:12;;;28382:245::o;28634:416::-;28834:2;28848:47;;;16909:2;28819:18;;;37964:19;16945:28;38004:14;;;16925:49;16993:12;;;28805:245::o;29057:416::-;29257:2;29271:47;;;17244:2;29242:18;;;37964:19;17280:28;38004:14;;;17260:49;17328:12;;;29228:245::o;29480:416::-;29680:2;29694:47;;;17579:2;29665:18;;;37964:19;-1:-1;;;38004:14;;;17595:42;17656:12;;;29651:245::o;29903:416::-;30103:2;30117:47;;;17907:2;30088:18;;;37964:19;-1:-1;;;38004:14;;;17923:43;17985:12;;;30074:245::o;30326:416::-;30526:2;30540:47;;;18236:2;30511:18;;;37964:19;18272:34;38004:14;;;18252:55;-1:-1;;;18327:12;;;18320:33;18372:12;;;30497:245::o;30749:416::-;30949:2;30963:47;;;30934:18;;;37964:19;18659:34;38004:14;;;18639:55;18713:12;;;30920:245::o;31172:416::-;31372:2;31386:47;;;18964:2;31357:18;;;37964:19;19000:34;38004:14;;;18980:55;-1:-1;;;19055:12;;;19048:29;19096:12;;;31343:245::o;31595:416::-;31795:2;31809:47;;;19347:2;31780:18;;;37964:19;19383:34;38004:14;;;19363:55;-1:-1;;;19438:12;;;19431:29;19479:12;;;31766:245::o;32018:416::-;32218:2;32232:47;;;32203:18;;;37964:19;19766:34;38004:14;;;19746:55;19820:12;;;32189:245::o;32441:416::-;32641:2;32655:47;;;32626:18;;;37964:19;20107:34;38004:14;;;20087:55;20161:12;;;32612:245::o;32864:416::-;33064:2;33078:47;;;20412:2;33049:18;;;37964:19;20448:33;38004:14;;;20428:54;20501:12;;;33035:245::o;33287:416::-;33487:2;33501:47;;;20752:2;33472:18;;;37964:19;20788:26;38004:14;;;20768:47;20834:12;;;33458:245::o;33710:330::-;21144:23;;-1:-1;;;;;38778:54;12081:37;;21327:4;21316:16;;;21310:23;21387:14;;;21491:37;;;;33891:2;33876:18;;33862:178::o;34047:222::-;21491:37;;;34174:2;34159:18;;34145:124::o;34276:668::-;21491:37;;;-1:-1;;;;;38778:54;;;34680:2;34665:18;;12081:37;38778:54;;;;34763:2;34748:18;;12081:37;34846:2;34831:18;;21491:37;;;;34929:3;34914:19;;21491:37;34515:3;34500:19;;34486:458::o;34951:333::-;21491:37;;;35270:2;35255:18;;21491:37;35106:2;35091:18;;35077:207::o;35291:256::-;35353:2;35347:9;35379:17;;;35454:18;35439:34;;35475:22;;;35436:62;35433:2;;;35511:1;;35501:12;35433:2;35353;35520:22;35331:216;;-1:-1;35331:216::o;35554:304::-;;35713:18;35705:6;35702:30;35699:2;;;-1:-1;;35735:12;35699:2;-1:-1;35780:4;35768:17;;;35833:15;;35636:222::o;39459:106::-;39544:3;39540:15;;39512:53::o;39573:739::-;;39646:4;39628:16;39625:26;39622:2;;;39654:5;;39622:2;39688:1;-1:-1;;39667:23;39763:10;39706:34;-1:-1;39731:8;39706:34;:::i;:::-;39755:19;39745:2;;39778:5;;39745:2;39809;39803:9;39845:16;-1:-1;;39841:24;39688:1;39803:9;39817:49;39892:4;39886:11;39973:16;39925:18;39973:16;39966:4;39958:6;39954:17;39951:39;39925:18;39917:6;39914:30;39905:91;39902:2;;;40004:5;;;;;;39902:2;40042:6;40036:4;40032:17;40021:28;;40074:3;40068:10;40054:24;;39925:18;40089:6;40086:30;40083:2;;;40119:5;;;;;;40083:2;;40196:16;40190:4;40186:27;40156:4;40163:6;40151:3;40143:27;;40178:36;40175:2;;;40217:5;;;;;40175:2;36752:9;39422:14;-1:-1;;39418:28;40241:50;;40156:4;40241:50;39809:2;40230:62;40249:3;-1:-1;;39616:696;:::o;40319:117::-;-1:-1;;;;;38778:54;;40378:35;;40368:2;;40427:1;;40417:12;40561:115;-1:-1;;;;;;38626:78;;40619:34;;40609:2;;40667:1;;40657:12
Swarm Source
ipfs://ce3ccd2e53743ac93be84c105992ccafe9216edc012d711d6c19c2c054608b09
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.