Overview
Max Total Supply
255 GRVSWARRANT
Holders
82
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 GRVSWARRANTLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
GravisCollectible
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-10-21 */ // Sources flattened with hardhat v2.3.0 https://hardhat.org // File @openzeppelin/contracts/introspection/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/introspection/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File @openzeppelin/contracts/math/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/token/ERC721/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File contracts/utils/CountedMap.sol pragma solidity =0.6.2; // Reference counted mapping[address => uint]. library CountedMap { uint256 constant COUNTER_MASK = (1 << 128) - 1; struct Map { // Maps addresses to pair (index, counter) represented as single uint256. mapping(address => uint256) dict; address[] data; } function add(Map storage _map, address _who, uint256 _cnt) internal { uint256 value = _map.dict[_who]; if (value == 0) { _map.data.push(_who); require(_cnt > 0 && _cnt <= COUNTER_MASK, "CountedMap: overflow"); _map.dict[_who] = (_map.data.length << 128) + (_cnt - 1); } else { uint256 newVal = value + _cnt; require((newVal > value) && ((value & COUNTER_MASK) + _cnt < COUNTER_MASK), "CountedMap: overflow"); _map.dict[_who] = newVal; } } function remove(Map storage _map, address _who, uint256 _cnt) internal { uint256 value = _map.dict[_who]; if (value == 0) { return; } else if ((value & COUNTER_MASK) < _cnt) { uint256 index = (value >> 128) - 1; uint256 last = _map.data.length - 1; address moved = _map.data[index] = _map.data[last]; _map.dict[moved] = (_map.dict[moved] & COUNTER_MASK) | ((index + 1) << 128); _map.data.pop(); delete _map.dict[_who]; } else { _map.dict[_who] = value - _cnt; } } function length(Map storage _map) internal view returns(uint256) { return _map.data.length; } function at(Map storage _map, uint256 _index) internal view returns(address) { return _map.data[_index]; } function counter(Map storage _map, address _addr) internal view returns(uint256) { uint256 value = _map.dict[_addr]; if (value == 0) return 0; return (value & COUNTER_MASK) + 1; } } // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context { using EnumerableSet for EnumerableSet.AddressSet; using Address for address; struct RoleData { EnumerableSet.AddressSet members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view returns (bool) { return _roles[role].members.contains(account); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view returns (uint256) { return _roles[role].members.length(); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view returns (address) { return _roles[role].members.at(index); } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, _roles[role].adminRole, adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (_roles[role].members.add(account)) { emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (_roles[role].members.remove(account)) { emit RoleRevoked(role, account, _msgSender()); } } } // File contracts/GravisCollectionMintable.sol pragma solidity =0.6.2; contract GravisCollectionMintable is Context, AccessControl { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); constructor() public { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); } modifier onlyAdmin() { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "GravisCollectible: must have admin role"); _; } } // File @openzeppelin/contracts/access/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () 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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File contracts/Whitelist.sol pragma solidity =0.6.2; /** * @title Whitelist * @author Alberto Cuesta Canada * @dev Implements a simple whitelist of addresses. */ contract Whitelist is Ownable { event MemberAdded(address member); event MemberRemoved(address member); mapping(address => bool) private members; uint256 public whitelisted; /** * @dev A method to verify whether an address is a member of the whitelist * @param _member The address to verify. * @return Whether the address is a member of the whitelist. */ function isMember(address _member) public view returns (bool) { return members[_member]; } /** * @dev A method to add a member to the whitelist * @param _member The member to add as a member. */ function addMember(address _member) public onlyOwner { address[] memory mem = new address[](1); mem[0] = _member; _addMembers(mem); } /** * @dev A method to add a member to the whitelist * @param _members The members to add as a member. */ function addMembers(address[] memory _members) public onlyOwner { _addMembers(_members); } /** * @dev A method to remove a member from the whitelist * @param _member The member to remove as a member. */ function removeMember(address _member) public onlyOwner { require(isMember(_member), "Whitelist: Not member of whitelist"); delete members[_member]; --whitelisted; emit MemberRemoved(_member); } function _addMembers(address[] memory _members) internal { uint256 l = _members.length; for (uint256 i = 0; i < l; i++) { require(!isMember(_members[i]), "Whitelist: Address is member already"); members[_members[i]] = true; emit MemberAdded(_members[i]); } whitelisted += _members.length; } /** * @dev Access modifier for whitelisted members. */ modifier canParticipate() { require(whitelisted == 0 || isMember(msg.sender), "Seller: not from private list"); _; } } // File contracts/GravisCollectible.sol pragma solidity =0.6.2; /** * @title GravisCollectible - Collectible token implementation, * from Gravis project, based on bitmap implementation. * * @author Darth Andeddu <[email protected]> */ contract GravisCollectible is GravisCollectionMintable, Whitelist, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using CountedMap for CountedMap.Map; // Bitmask size in slots (256 bit words) to fit all NFTs in the round uint256 internal constant VAULT_SIZE_SLOTS = 79; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; struct TokenVault { uint256[VAULT_SIZE_SLOTS] data; } struct TypeData { address minterOnly; string info; uint256 nominalPrice; uint256 totalSupply; uint256 maxSupply; TokenVault vault; string uri; } TypeData[] private typeData; mapping(address => TokenVault) private tokens; mapping(uint256 => address) private _tokenApprovals; mapping(address => mapping(address => bool)) private _operatorApprovals; uint256 public last = 0; string public baseURI; CountedMap.Map owners; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract. */ constructor() public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev Returns the token collection name. */ function name() external view override returns (string memory) { return "Gravis Finance GRVS Warrant"; } /** * @dev Returns the token collection symbol. */ function symbol() external view override returns (string memory) { return "GRVSWARRANT"; } /** * @dev Returns the number of decimals used to get its user representation. */ function decimals() public pure virtual returns (uint8) { return 0; } /** * @dev Default transfer from ERC20 is not possible so disabled. */ function transfer(address, uint256) public pure virtual returns (bool) { revert("This type of token cannot be transferred from this type of wallet"); } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 _tokenId) external view override returns (string memory) { uint256 typ = getTokenType(_tokenId); require(typ != uint256(-1), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(baseURI, typeData[typ].uri)); } /** * @dev Returns the balance for the `_who` address. */ function balanceOf(address _who) public view override returns (uint256) { return owners.counter(_who); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex( address _who, uint256 _index ) public view virtual override returns (uint256) { TokenVault storage vault = tokens[_who]; uint256 index = 0; uint256 bit = 0; uint256 cnt = 0; while (true) { uint256 val = vault.data[index]; if (val != 0) { while (bit < 256 && (val & (1 << bit) == 0)) ++bit; } if (val == 0 || bit == 256) { bit = 0; ++index; require(index < VAULT_SIZE_SLOTS, "GravisCollectible: not enough tokens"); continue; } if (cnt == _index) break; ++cnt; ++bit; } return index * 256 + bit; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return last; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { return index; } /** * @dev Returns data about token collection by type id `_typeId`. */ function getTypeInfo(uint256 _typeId) public view returns ( uint256 nominalPrice, uint256 capSupply, uint256 maxSupply, string memory info, address minterOnly, string memory uri ) { TypeData memory t = typeData[_typeId]; return (t.nominalPrice, t.totalSupply, t.maxSupply, t.info, t.minterOnly, t.uri); } /** * @dev Returns token type by token id `_tokenId`. */ function getTokenType(uint256 _tokenId) public view returns (uint256) { if (_tokenId < last) { (uint256 index, uint256 mask) = _position(_tokenId); for (uint256 i = 0; i < typeData.length; ++i) { if (typeData[i].vault.data[index] & mask != 0) return i; } } return uint256(-1); } /** * @dev See {IERC721-approve}. */ function approve(address _to, uint256 _tokenId) public virtual override { if (isOwner(_msgSender(), _tokenId)) { require(_to != _msgSender(), "ERC721: approval to current owner"); _approve(_to, _tokenId, _msgSender()); } else { address owner = ownerOf(_tokenId); require(isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all"); _approve(_to, _tokenId, owner); } } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 _tokenId) public view virtual override returns (address) { require(exists(_tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[_tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address _operator, bool _approved) public virtual override { require(_operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][_operator] = _approved; emit ApprovalForAll(_msgSender(), _operator, _approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll( address _owner, address _operator ) public view virtual override returns (bool) { return _operatorApprovals[_owner][_operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address _from, address _to, uint256 _tokenId ) public virtual override { require(_isApprovedOrOwner(_msgSender(), _tokenId, _from), "ERC721: transfer caller is not owner nor approved"); _transfer(_from, _to, _tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId ) public virtual override { safeTransferFrom(_from, _to, _tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), _tokenId, _from), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(_from, _to, _tokenId, _data); } /** * @dev See {ERC71-_exists}. */ function exists(uint256 _tokenId) public view returns (bool) { return getTokenType(_tokenId) != uint256(-1); } /** * @dev See {ERC71-_setBaseURI}. */ function setBaseURI(string memory _baseURI) public onlyAdmin { baseURI = _baseURI; } /** * @dev Create new token collection, with uniq id. * * Permission: onlyAdmin * * @param _nominalPrice - nominal price per item, should be set in USD, * with decimal zero * @param _maxTotal - maximum total amount items in collection * @param _info - general information about collection * @param _uri - JSON metadata address based on `baseURI` */ function createNewTokenType( uint256 _nominalPrice, uint256 _maxTotal, string memory _info, string memory _uri ) public onlyAdmin { require(_nominalPrice != 0, "GravisCollectible: nominal price is zero"); TypeData memory t; t.nominalPrice = _nominalPrice; t.maxSupply = _maxTotal; t.info = _info; t.uri = _uri; typeData.push(t); } /** * @dev Setter for lock minter rights by `_minter` and `_type`. * * Permission: onlyAdmin */ function setMinterOnly(address _minter, uint256 _type) external onlyAdmin { require(typeData[_type].minterOnly == address(0), "GravisCollectible: minter locked already"); typeData[_type].minterOnly = _minter; } /** * @dev Add new user with MINTER_ROLE permission. * * Permission: onlyAdmin */ function addMinter(address _newMinter) public onlyAdmin { _setupRole(MINTER_ROLE, _newMinter); } /** * @dev Mint one NFT token to specific address `_to` with specific type id `_type`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function mint( address _to, uint256 _type, uint256 _amount ) public returns (uint256) { require(hasRole(MINTER_ROLE, _msgSender()), "GravisCollectible: must have minter role to mint"); require(_type < typeData.length, "GravisCollectible: type not exist"); TypeData storage currentType = typeData[_type]; if (currentType.minterOnly != address(0)) { require(typeData[_type].minterOnly == _msgSender(), "GravisCollectible: minting locked by another account"); } return _mint(_to, _type, _amount); } function mintFor(address[] calldata _to, uint256[] calldata _amount, uint256 _type) external { require(hasRole(MINTER_ROLE, _msgSender()), "GravisCollectible: must have minter role to mint"); require(_to.length == _amount.length, "GravisCollectible: input arrays don't match"); require(_type < typeData.length, "GravisCollectible: type not exist"); TypeData storage currentType = typeData[_type]; if (currentType.minterOnly != address(0)) { require(typeData[_type].minterOnly == _msgSender(), "GravisCollectible: minting locked by another account"); } for (uint256 i = 0; i < _to.length; ++i) { _mint(_to[i], _type, _amount[i]); } } function _mint( address _to, uint256 _type, uint256 _amount ) internal returns (uint256) { require(_to != address(0), "ERC721: mint to the zero address"); TokenVault storage vaultUser = tokens[_to]; TokenVault storage vaultType = typeData[_type].vault; uint256 tokenId = last; (uint256 index, uint256 mask) = _position(tokenId); uint256 userBuf = vaultUser.data[index]; uint256 typeBuf = vaultType.data[index]; while (tokenId < last.add(_amount)) { userBuf |= mask; typeBuf |= mask; mask <<= 1; if (mask == 0) { mask = 1; vaultUser.data[index] = userBuf; vaultType.data[index] = typeBuf; ++index; userBuf = vaultUser.data[index]; typeBuf = vaultType.data[index]; } emit Transfer(address(0), _to, tokenId); ++tokenId; } last = tokenId; vaultUser.data[index] = userBuf; vaultType.data[index] = typeBuf; typeData[_type].totalSupply = typeData[_type].totalSupply.add(_amount); owners.add(_to, _amount); require(typeData[_type].totalSupply <= typeData[_type].maxSupply, "GravisCollectible: max supply reached"); return last; } /** * @dev Moves one NFT token to specific address `_to` with specific token id `_tokenId`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFromContract(address _to, uint256 _tokenId) public onlyAdmin returns (bool) { _transfer(address(this), _to, _tokenId); return true; } /** * @dev Returns address of the caller if the token `_tokenId` belongs to her, 0 otherwise. */ function ownerOf(uint256 _tokenId) public view override returns (address) { (uint256 index, uint256 mask) = _position(_tokenId); if (tokens[_msgSender()].data[index] & mask != 0) return _msgSender(); for (uint256 i = 0; i < owners.length(); ++i) { address candidate = owners.at(i); if (tokens[candidate].data[index] & mask != 0) return candidate; } revert("ERC721: owner query for nonexistent token"); } /** * @dev Returns true if `_who` owns token `_tokenId`. */ function isOwner(address _who, uint256 _tokenId) public view returns (bool) { (uint256 index, uint256 mask) = _position(_tokenId); return tokens[_who].data[index] & mask != 0; } function ownersLength() public view returns (uint256) { return owners.length(); } function ownerAt(uint256 _index) public view returns (address) { return owners.at(_index); } /** * @dev See {ERC71-_burn}. */ function burn(uint256 _tokenId) public { if (isOwner(_msgSender(), _tokenId)) { _burnFor(_msgSender(), _tokenId); } else { address owner = ownerOf(_tokenId); require(getApproved(_tokenId) == _msgSender() || isApprovedForAll(owner, _msgSender()), "GravisCollectible: caller is not owner nor approved"); _burnFor(owner, _tokenId); } } /** * @dev Burn `_amount` tokens ot type `_type` for account `_who`. */ function burnFor( address _who, uint256 _type, uint256 _amount ) public { require(_who == _msgSender() || isApprovedForAll(_who, _msgSender()), "GravisCollectible: must have approval"); require(_type < typeData.length, "GravisCollectible: type not exist"); TokenVault storage vaultUser = tokens[_who]; TokenVault storage vaultType = typeData[_type].vault; uint256 index = 0; uint256 burned = 0; uint256 userBuf; uint256 typeBuf; while (burned < _amount) { while (index < VAULT_SIZE_SLOTS && vaultUser.data[index] == 0) ++index; require(index < VAULT_SIZE_SLOTS, "GravisCollectible: not enough tokens"); userBuf = vaultUser.data[index]; typeBuf = vaultType.data[index]; uint256 bit = 0; while (burned < _amount) { while (bit < 256) { uint256 mask = 1 << bit; if (userBuf & mask != 0 && typeBuf & mask != 0) break; ++bit; } if (bit == 256) { vaultUser.data[index] = userBuf; vaultType.data[index] = typeBuf; ++index; break; } uint256 tokenId = index * 256 + bit; _unapprove(_who, tokenId); uint256 mask = ~(1 << bit); userBuf &= mask; typeBuf &= mask; emit Transfer(_who, address(0), tokenId); ++burned; } } vaultUser.data[index] = userBuf; vaultType.data[index] = typeBuf; owners.remove(_who, _amount); } /** * @dev Transfer `_amount` tokens ot type `_type` between accounts `_from` and `_to`. */ function transferFor( address _from, address _to, uint256 _type, uint256 _amount ) public { require(_from == _msgSender() || isApprovedForAll(_from, _msgSender()), "GravisCollectible: must have approval"); require(_type < typeData.length, "GravisCollectible: type not exist"); TokenVault storage vaultFrom = tokens[_from]; TokenVault storage vaultTo = tokens[_to]; TokenVault storage vaultType = typeData[_type].vault; uint256 index = 0; uint256 transfered = 0; uint256 fromBuf; uint256 toBuf; while (transfered < _amount) { while (index < VAULT_SIZE_SLOTS && vaultFrom.data[index] == 0) ++index; require(index < VAULT_SIZE_SLOTS, "GravisCollectible: not enough tokens"); fromBuf = vaultFrom.data[index]; toBuf = vaultTo.data[index]; uint256 bit = 0; while (transfered < _amount) { while (bit < 256) { uint256 mask = 1 << bit; if (fromBuf & mask != 0 && vaultType.data[index] & mask != 0) break; ++bit; } if (bit == 256) { vaultFrom.data[index] = fromBuf; vaultTo.data[index] = toBuf; ++index; break; } uint256 tokenId = index * 256 + bit; _unapprove(_from, tokenId); uint256 mask = 1 << bit; toBuf |= mask; fromBuf &= ~mask; emit Transfer(_from, _to, tokenId); ++transfered; } } vaultFrom.data[index] = fromBuf; vaultTo.data[index] = toBuf; owners.add(_to, _amount); owners.remove(_from, _amount); } /** * @dev Approve `_to` to operate on `_tokenId` * * Emits an {Approval} event. */ function _approve(address _to, uint256 _tokenId, address _owner) internal virtual { _tokenApprovals[_tokenId] = _to; emit Approval(_owner, _to, _tokenId); } function _unapprove(address _owner, uint256 _tokenId) internal virtual { if (_tokenApprovals[_tokenId] != address(0)) { delete _tokenApprovals[_tokenId]; emit Approval(_owner, address(0), _tokenId); } } /** * @dev Burn a single token `_tokenId` for address `_who`. */ function _burnFor(address _who, uint256 _tokenId) internal virtual { (uint256 index, uint256 mask) = _position(_tokenId); require(tokens[_who].data[index] & mask != 0, "not owner"); _unapprove(_who, _tokenId); mask = ~mask; tokens[_who].data[index] &= mask; for (uint256 i = 0; i < typeData.length; ++i) { typeData[i].vault.data[index] &= mask; } owners.remove(_who, 1); emit Transfer(_who, address(0), _tokenId); } /** * @dev Transfers `_tokenId` from `_from` to `_to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Emits a {Transfer} event. */ function _transfer( address _from, address _to, uint256 _tokenId ) internal virtual { require(isOwner(_from, _tokenId), "ERC721: transfer of token that is not own"); require(_to != address(0), "ERC721: transfer to the zero address"); // Clear approvals from the previous owner _approve(address(0), _tokenId, _from); (uint256 index, uint256 mask) = _position(_tokenId); tokens[_from].data[index] &= ~mask; tokens[_to].data[index] |= mask; owners.add(_to, 1); owners.remove(_from, 1); emit Transfer(_from, _to, _tokenId); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract * recipients are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * Emits a {Transfer} event. */ function _safeTransfer( address _from, address _to, uint256 _tokenId, bytes memory _data ) internal virtual { _transfer(_from, _to, _tokenId); require( _checkOnERC721Received(_from, _to, _tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param _from address representing the previous owner of the given token ID * @param _to target address that will receive the tokens * @param _tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address _from, address _to, uint256 _tokenId, bytes memory _data ) private returns (bool) { if (!_to.isContract()) { return true; } bytes memory returndata = _to.functionCall( abi.encodeWithSelector( IERC721Receiver(_to).onERC721Received.selector, _msgSender(), _from, _tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer" ); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } /** * @dev Returns whether `_spender` is allowed to manage `_tokenId`. */ function _isApprovedOrOwner( address _spender, uint256 _tokenId, address _owner ) internal view virtual returns (bool) { return (_spender == _owner || getApproved(_tokenId) == _spender || isApprovedForAll(_owner, _spender)); } function _position(uint256 _tokenId) internal pure returns (uint256 index, uint256 mask) { index = _tokenId / 256; require(index < VAULT_SIZE_SLOTS, "GravisCollectible: OOB"); mask = uint256(1 << (_tokenId % 256)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"member","type":"address"}],"name":"MemberAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"member","type":"address"}],"name":"MemberRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_member","type":"address"}],"name":"addMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_members","type":"address[]"}],"name":"addMembers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newMinter","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"},{"internalType":"uint256","name":"_type","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nominalPrice","type":"uint256"},{"internalType":"uint256","name":"_maxTotal","type":"uint256"},{"internalType":"string","name":"_info","type":"string"},{"internalType":"string","name":"_uri","type":"string"}],"name":"createNewTokenType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTokenType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_typeId","type":"uint256"}],"name":"getTypeInfo","outputs":[{"internalType":"uint256","name":"nominalPrice","type":"uint256"},{"internalType":"uint256","name":"capSupply","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"string","name":"info","type":"string"},{"internalType":"address","name":"minterOnly","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_member","type":"address"}],"name":"isMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"last","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_type","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"},{"internalType":"uint256","name":"_type","type":"uint256"}],"name":"mintFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"ownerAt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownersLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_member","type":"address"}],"name":"removeMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"},{"internalType":"uint256","name":"_type","type":"uint256"}],"name":"setMinterOnly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_type","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFromContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelisted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260006009553480156200001657600080fd5b506200003f6000620000306001600160e01b036200011416565b6001600160e01b036200011816565b6000620000546001600160e01b036200011416565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000bd6301ffc9a760e01b6001600160e01b036200013116565b620000d86380ac58cd60e01b6001600160e01b036200013116565b620000f3635b5e139f60e01b6001600160e01b036200013116565b6200010e63780e9d6360e01b6001600160e01b036200013116565b620002d1565b3390565b6200012d82826001600160e01b03620001b616565b5050565b6001600160e01b0319808216141562000191576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152600460205260409020805460ff19166001179055565b600082815260208181526040909120620001db9183906200394462000238821b17901c565b156200012d57620001f46001600160e01b036200011416565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600062000258836001600160a01b0384166001600160e01b036200026116565b90505b92915050565b60006200027883836001600160e01b03620002b916565b620002b0575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200025b565b5060006200025b565b60009081526001919091016020526040902054151590565b6144be80620002e16000396000f3fe608060405234801561001057600080fd5b50600436106103265760003560e01c80636352211e116101b8578063a22cb46511610104578063ca15c873116100a2578063d547741f1161007c578063d547741f14610e43578063e327a6af14610e6f578063e985e9c514610e9b578063f2fde38b14610ec957610326565b8063ca15c87314610df8578063ca6d56dc14610e15578063d539139314610e3b57610326565b8063b18f1943116100de578063b18f194314610c51578063b88d4fde14610c59578063bdb6836914610d1d578063c87b56dd14610ddb57610326565b8063a22cb46514610bd1578063a230c52414610bff578063a9059cbb14610c2557610326565b80638da5cb5b1161017157806395d89b411161014b57806395d89b4114610a72578063983b2d5614610a7a5780639bd993ff14610aa0578063a217fddf14610bc957610326565b80638da5cb5b14610a1b5780639010d07c14610a2357806391d1485414610a4657610326565b80636352211e1461090a5780636c0360eb146109275780636f4d469b1461092f57806370a08231146109d0578063715018a6146109f657806376aed2e1146109fe57610326565b80632f745c591161027757806342966c68116102305780634f558e791161020a5780634f558e79146108005780634f6ccce71461081d57806350a2388f1461083a57806355f804b31461086657610326565b806342966c68146106a6578063473360a1146106c357806347799da8146107f857610326565b80632f745c59146105b6578063313ce567146105e257806336568abe146106005780633d9287fa1461062c5780633ee9f8bb1461063457806342842e0e1461067057610326565b8063156e29f6116102e457806323b872dd116102be57806323b872dd1461051a5780632435987914610550578063248a9ca31461056d5780632f2ff15d1461058a57610326565b8063156e29f6146104a257806318160ddd146104e65780631a88f306146104ee57610326565b8062c2a9451461032b57806301ffc9a71461035f57806306fdde031461039a578063081812fc14610417578063095ea7b3146104505780630b1ca49a1461047c575b600080fd5b61035d6004803603606081101561034157600080fd5b506001600160a01b038135169060208101359060400135610eef565b005b6103866004803603602081101561037557600080fd5b50356001600160e01b031916611177565b604080519115158252519081900360200190f35b6103a261119a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103dc5781810151838201526020016103c4565b50505050905090810190601f1680156104095780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104346004803603602081101561042d57600080fd5b50356111d2565b604080516001600160a01b039092168252519081900360200190f35b61035d6004803603604081101561046657600080fd5b506001600160a01b038135169060200135611234565b61035d6004803603602081101561049257600080fd5b50356001600160a01b031661131e565b6104d4600480360360608110156104b857600080fd5b506001600160a01b038135169060208101359060400135611426565b60408051918252519081900360200190f35b6104d4611591565b6103866004803603604081101561050457600080fd5b506001600160a01b038135169060200135611597565b61035d6004803603606081101561053057600080fd5b506001600160a01b038135811691602081013590911690604001356115f5565b6104346004803603602081101561056657600080fd5b503561164d565b6104d46004803603602081101561058357600080fd5b5035611660565b61035d600480360360408110156105a057600080fd5b50803590602001356001600160a01b0316611675565b6104d4600480360360408110156105cc57600080fd5b506001600160a01b0381351690602001356116d8565b6105ea6117bf565b6040805160ff9092168252519081900360200190f35b61035d6004803603604081101561061657600080fd5b50803590602001356001600160a01b03166117c4565b6104d4611825565b61035d6004803603608081101561064a57600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013561182b565b61035d6004803603606081101561068657600080fd5b506001600160a01b03813581169160208101359091169060400135611ae7565b61035d600480360360208110156106bc57600080fd5b5035611b02565b61035d600480360360808110156106d957600080fd5b813591602081013591810190606081016040820135600160201b8111156106ff57600080fd5b82018360208201111561071157600080fd5b803590602001918460018302840111600160201b8311171561073257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561078457600080fd5b82018360208201111561079657600080fd5b803590602001918460018302840111600160201b831117156107b757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611bb3945050505050565b6104d4611d48565b6103866004803603602081101561081657600080fd5b5035611d4e565b6104d46004803603602081101561083357600080fd5b50356111cf565b61035d6004803603604081101561085057600080fd5b506001600160a01b038135169060200135611d64565b61035d6004803603602081101561087c57600080fd5b810190602081018135600160201b81111561089657600080fd5b8201836020820111156108a857600080fd5b803590602001918460018302840111600160201b831117156108c957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e5a945050505050565b6104346004803603602081101561092057600080fd5b5035611eb5565b6103a2611fb4565b61035d6004803603602081101561094557600080fd5b810190602081018135600160201b81111561095f57600080fd5b82018360208201111561097157600080fd5b803590602001918460208302840111600160201b8311171561099257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612042945050505050565b6104d4600480360360208110156109e657600080fd5b50356001600160a01b03166120ad565b61035d6120c0565b6104d460048036036020811015610a1457600080fd5b503561216c565b6104346121ea565b61043460048036036040811015610a3957600080fd5b50803590602001356121f9565b61038660048036036040811015610a5c57600080fd5b50803590602001356001600160a01b0316612217565b6103a2612235565b61035d60048036036020811015610a9057600080fd5b50356001600160a01b031661225a565b610abd60048036036020811015610ab657600080fd5b50356122cc565b6040518087815260200186815260200185815260200180602001846001600160a01b03166001600160a01b0316815260200180602001838103835286818151815260200191508051906020019080838360005b83811015610b28578181015183820152602001610b10565b50505050905090810190601f168015610b555780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015610b88578181015183820152602001610b70565b50505050905090810190601f168015610bb55780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b6104d46124e1565b61035d60048036036040811015610be757600080fd5b506001600160a01b03813516906020013515156124e6565b61038660048036036020811015610c1557600080fd5b50356001600160a01b03166125eb565b61038660048036036040811015610c3b57600080fd5b506001600160a01b038135169060200135612609565b6104d4612642565b61035d60048036036080811015610c6f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610ca957600080fd5b820183602082011115610cbb57600080fd5b803590602001918460018302840111600160201b83111715610cdc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612653945050505050565b61035d60048036036060811015610d3357600080fd5b810190602081018135600160201b811115610d4d57600080fd5b820183602082011115610d5f57600080fd5b803590602001918460208302840111600160201b83111715610d8057600080fd5b919390929091602081019035600160201b811115610d9d57600080fd5b820183602082011115610daf57600080fd5b803590602001918460208302840111600160201b83111715610dd057600080fd5b9193509150356126b2565b6103a260048036036020811015610df157600080fd5b5035612892565b6104d460048036036020811015610e0e57600080fd5b50356129d5565b61035d60048036036020811015610e2b57600080fd5b50356001600160a01b03166129ec565b6104d4612aa7565b61035d60048036036040811015610e5957600080fd5b50803590602001356001600160a01b0316612aca565b61038660048036036040811015610e8557600080fd5b506001600160a01b038135169060200135612b23565b61038660048036036040811015610eb157600080fd5b506001600160a01b0381358116916020013516612b69565b61035d60048036036020811015610edf57600080fd5b50356001600160a01b0316612b97565b610ef7612c9a565b6001600160a01b0316836001600160a01b03161480610f225750610f2283610f1d612c9a565b612b69565b610f5d5760405162461bcd60e51b81526004018080602001828103825260258152602001806143136025913960400191505060405180910390fd5b6005548210610f9d5760405162461bcd60e51b8152600401808060200182810382526021815260200180613f976021913960400191505060405180910390fd5b6001600160a01b03831660009081526006602052604081206005805491929185908110610fc657fe5b60009182526020822060056055909202010191508080805b8683101561113c575b604f8410801561100257508584604f8110610ffe57fe5b0154155b1561101257836001019350610fe7565b604f84106110515760405162461bcd60e51b81526004018080602001828103825260248152602001806143d16024913960400191505060405180910390fd5b8584604f811061105d57fe5b015491508484604f811061106d57fe5b0154905060005b87841015611136575b6101008110156110b1576001811b8381161580159061109d575082811615155b156110a857506110b1565b5060010161107d565b8061010014156110e457828786604f81106110c857fe5b0155818686604f81106110d757fe5b0155600190940193611136565b610100850281016110f58b82612c9e565b6040516001831b1994851694938416939082906000906001600160a01b038f1690600080516020614390833981519152908390a48560010195505050611074565b50610fde565b818685604f811061114957fe5b0155808585604f811061115857fe5b015561116c600b8a8963ffffffff612d1016565b505050505050505050565b6001600160e01b0319811660009081526004602052604090205460ff165b919050565b60408051808201909152601b81527f4772617669732046696e616e636520475256532057617272616e74000000000060208201525b90565b60006111dd82611d4e565b6112185760405162461bcd60e51b815260040180806020018281038252602c81526020018061429c602c913960400191505060405180910390fd5b506000908152600760205260409020546001600160a01b031690565b61124561123f612c9a565b82612b23565b156112b957611252612c9a565b6001600160a01b0316826001600160a01b031614156112a25760405162461bcd60e51b81526004018080602001828103825260218152602001806143b06021913960400191505060405180910390fd5b6112b482826112af612c9a565b612e52565b61131a565b60006112c482611eb5565b90506112d281610f1d612c9a565b61130d5760405162461bcd60e51b815260040180806020018281038252603881526020018061417d6038913960400191505060405180910390fd5b611318838383612e52565b505b5050565b611326612c9a565b6001600160a01b03166113376121ea565b6001600160a01b031614611380576040805162461bcd60e51b815260206004820181905260248201526000805160206142f3833981519152604482015290519081900360640190fd5b611389816125eb565b6113c45760405162461bcd60e51b81526004018080602001828103825260228152602001806141b56022913960400191505060405180910390fd5b6001600160a01b038116600081815260026020908152604091829020805460ff1916905560038054600019019055815192835290517f6e76fb4c77256006d9c38ec7d82b45a8c8f3c27b1d6766fffc42dfb8de6844929281900390910190a150565b604080516a4d494e5445525f524f4c4560a81b8152905190819003600b01902060009061145a90611455612c9a565b612217565b6114955760405162461bcd60e51b81526004018080602001828103825260308152602001806140866030913960400191505060405180910390fd5b60055483106114d55760405162461bcd60e51b8152600401808060200182810382526021815260200180613f976021913960400191505060405180910390fd5b6000600584815481106114e457fe5b6000918252602090912060559091020180549091506001600160a01b03161561157b5761150f612c9a565b6001600160a01b03166005858154811061152557fe5b60009182526020909120605590910201546001600160a01b03161461157b5760405162461bcd60e51b81526004018080602001828103825260348152602001806144266034913960400191505060405180910390fd5b611586858585612eae565b9150505b9392505050565b60095490565b60006115a581611455612c9a565b6115e05760405162461bcd60e51b81526004018080602001828103825260278152602001806140de6027913960400191505060405180910390fd5b6115eb30848461313f565b5060015b92915050565b611607611600612c9a565b828561329d565b6116425760405162461bcd60e51b81526004018080602001828103825260318152602001806143f56031913960400191505060405180910390fd5b61131883838361313f565b60006115ef600b8363ffffffff6132f016565b60009081526020819052604090206002015490565b60008281526020819052604090206002015461169390611455612c9a565b6116ce5760405162461bcd60e51b815260040180806020018281038252602f815260200180613fff602f913960400191505060405180910390fd5b61131a828261331d565b6001600160a01b03821660009081526006602052604081208180805b60008484604f811061170257fe5b015490508015611731575b6101008310801561172157506001831b8116155b156117315782600101925061170d565b80158061173f575082610100145b156117935760009250836001019350604f841061178d5760405162461bcd60e51b81526004018080602001828103825260248152602001806143d16024913960400191505060405180910390fd5b506116f4565b868214156117a157506117ae565b50600191820191016116f4565b506101009091020191505092915050565b600090565b6117cc612c9a565b6001600160a01b0316816001600160a01b03161461181b5760405162461bcd60e51b815260040180806020018281038252602f81526020018061445a602f913960400191505060405180910390fd5b61131a828261338c565b60035481565b611833612c9a565b6001600160a01b0316846001600160a01b03161480611859575061185984610f1d612c9a565b6118945760405162461bcd60e51b81526004018080602001828103825260258152602001806143136025913960400191505060405180910390fd5b60055482106118d45760405162461bcd60e51b8152600401808060200182810382526021815260200180613f976021913960400191505060405180910390fd5b6001600160a01b0380851660009081526006602052604080822092861682528120600580549192918690811061190657fe5b60009182526020822060056055909202010191508080805b87831015611a98575b604f8410801561194257508684604f811061193e57fe5b0154155b1561195257836001019350611927565b604f84106119915760405162461bcd60e51b81526004018080602001828103825260248152602001806143d16024913960400191505060405180910390fd5b8684604f811061199d57fe5b015491508584604f81106119ad57fe5b0154905060005b88841015611a92575b6101008110156119fe576001811b838116158015906119ea5750808787604f81106119e457fe5b01541615155b156119f557506119fe565b506001016119bd565b806101001415611a3157828886604f8110611a1557fe5b0155818786604f8110611a2457fe5b0155600190940193611a92565b61010085028101611a428d82612c9e565b6000826001901b90508084179350801985169450818d6001600160a01b03168f6001600160a01b031660008051602061439083398151915260405160405180910390a485600101955050506119b4565b5061191e565b818785604f8110611aa557fe5b0155808685604f8110611ab457fe5b0155611ac8600b8b8a63ffffffff6133fb16565b611ada600b8c8a63ffffffff612d1016565b5050505050505050505050565b61131883838360405180602001604052806000815250612653565b611b0d61123f612c9a565b15611b2857611b23611b1d612c9a565b82613560565b611bb0565b6000611b3382611eb5565b9050611b3d612c9a565b6001600160a01b0316611b4f836111d2565b6001600160a01b03161480611b6b5750611b6b81610f1d612c9a565b611ba65760405162461bcd60e51b81526004018080602001828103825260338152602001806141d76033913960400191505060405180910390fd5b61131a8183613560565b50565b611bc06000611455612c9a565b611bfb5760405162461bcd60e51b81526004018080602001828103825260278152602001806140de6027913960400191505060405180910390fd5b83611c375760405162461bcd60e51b81526004018080602001828103825260288152602001806142746028913960400191505060405180910390fd5b611c3f613e4e565b6040810185905260808101849052602080820184815260c083018490526005805460018101825560009190915283517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0605590920291820180546001600160a01b0319166001600160a01b03909216919091178155915180518594611ce8937f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db101920190613e9a565b5060408201516002820155606082015160038201556080820151600482015560a082015180516005830190611d20908290604f613f18565b50505060c08201518051611d3e916054840191602090910190613e9a565b5050505050505050565b60095481565b6000600019611d5c8361216c565b141592915050565b611d716000611455612c9a565b611dac5760405162461bcd60e51b81526004018080602001828103825260278152602001806140de6027913960400191505060405180910390fd5b60006001600160a01b031660058281548110611dc457fe5b60009182526020909120605590910201546001600160a01b031614611e1a5760405162461bcd60e51b81526004018080602001828103825260288152602001806140b66028913960400191505060405180910390fd5b8160058281548110611e2857fe5b6000918252602090912060559091020180546001600160a01b0319166001600160a01b03929092169190911790555050565b611e676000611455612c9a565b611ea25760405162461bcd60e51b81526004018080602001828103825260278152602001806140de6027913960400191505060405180910390fd5b805161131a90600a906020840190613e9a565b6000806000611ec38461369a565b915091508060066000611ed4612c9a565b6001600160a01b03168152602081019190915260400160002083604f8110611ef857fe5b01541615611f1157611f08612c9a565b92505050611195565b60005b611f1e600b6136ff565b811015611f7c576000611f38600b8363ffffffff6132f016565b6001600160a01b0381166000908152600660205260409020909150839085604f8110611f6057fe5b01541615611f7357935061119592505050565b50600101611f14565b5060405162461bcd60e51b815260040180806020018281038252602981526020018061424b6029913960400191505060405180910390fd5b600a805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050505081565b61204a612c9a565b6001600160a01b031661205b6121ea565b6001600160a01b0316146120a4576040805162461bcd60e51b815260206004820181905260248201526000805160206142f3833981519152604482015290519081900360640190fd5b611bb081613706565b60006115ef600b8363ffffffff61382e16565b6120c8612c9a565b6001600160a01b03166120d96121ea565b6001600160a01b031614612122576040805162461bcd60e51b815260206004820181905260248201526000805160206142f3833981519152604482015290519081900360640190fd5b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b60006009548210156121e1576000806121848461369a565b909250905060005b6005548110156121dd5781600582815481106121a457fe5b906000526020600020906055020160050160000184604f81106121c357fe5b015416156121d5579250611195915050565b60010161218c565b5050505b50600019919050565b6001546001600160a01b031690565b600082815260208190526040812061158a908363ffffffff61386c16565b600082815260208190526040812061158a908363ffffffff61387816565b60408051808201909152600b81526a11d49594d5d0549490539560aa1b602082015290565b6122676000611455612c9a565b6122a25760405162461bcd60e51b81526004018080602001828103825260278152602001806140de6027913960400191505060405180910390fd5b604080516a4d494e5445525f524f4c4560a81b8152905190819003600b019020611bb090826116ce565b60008060006060600060606122df613e4e565b600588815481106122ec57fe5b60009182526020918290206040805160e081018252605590930290910180546001600160a01b03168352600180820180548451601f600260001995841615610100029590950190921693909304908101879004870283018701909452838252939491938583019391929091908301828280156123a95780601f1061237e576101008083540402835291602001916123a9565b820191906000526020600020905b81548152906001019060200180831161238c57829003601f168201915b505050918352505060028201546020808301919091526003830154604080840191909152600484015460608401528051610a0081019182905260809093019291600585019183918201908390604f9082845b8154815260200190600101908083116123fb5750505091909252505050815260548201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156124a65780601f1061247b576101008083540402835291602001916124a6565b820191906000526020600020905b81548152906001019060200180831161248957829003601f168201915b505050919092525050506040810151606082015160808301516020840151845160c090950151939d929c50909a509850919650945092505050565b600081565b6124ee612c9a565b6001600160a01b0316826001600160a01b03161415612554576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060086000612561612c9a565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556125a5612c9a565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6001600160a01b031660009081526002602052604090205460ff1690565b600060405162461bcd60e51b815260040180806020018281038252604181526020018061420a6041913960600191505060405180910390fd5b600061264e600b6136ff565b905090565b61266561265e612c9a565b838661329d565b6126a05760405162461bcd60e51b81526004018080602001828103825260318152602001806143f56031913960400191505060405180910390fd5b6126ac8484848461388d565b50505050565b604080516a4d494e5445525f524f4c4560a81b8152905190819003600b0190206126de90611455612c9a565b6127195760405162461bcd60e51b81526004018080602001828103825260308152602001806140866030913960400191505060405180910390fd5b8382146127575760405162461bcd60e51b815260040180806020018281038252602b8152602001806142c8602b913960400191505060405180910390fd5b60055481106127975760405162461bcd60e51b8152600401808060200182810382526021815260200180613f976021913960400191505060405180910390fd5b6000600582815481106127a657fe5b6000918252602090912060559091020180549091506001600160a01b03161561283d576127d1612c9a565b6001600160a01b0316600583815481106127e757fe5b60009182526020909120605590910201546001600160a01b03161461283d5760405162461bcd60e51b81526004018080602001828103825260348152602001806144266034913960400191505060405180910390fd5b60005b858110156128895761288087878381811061285757fe5b905060200201356001600160a01b03168487878581811061287457fe5b90506020020135612eae565b50600101612840565b50505050505050565b6060600061289f8361216c565b90506000198114156128e25760405162461bcd60e51b815260040180806020018281038252602f815260200180614361602f913960400191505060405180910390fd5b600a600582815481106128f157fe5b906000526020600020906055020160540160405160200180838054600181600116156101000203166002900480156129605780601f1061293e576101008083540402835291820191612960565b820191906000526020600020905b81548152906001019060200180831161294c575b5050828054600181600116156101000203166002900480156129b95780601f106129975761010080835404028352918201916129b9565b820191906000526020600020905b8154815290600101906020018083116129a5575b505060408051601f198184030181529190529695505050505050565b60008181526020819052604081206115ef906138df565b6129f4612c9a565b6001600160a01b0316612a056121ea565b6001600160a01b031614612a4e576040805162461bcd60e51b815260206004820181905260248201526000805160206142f3833981519152604482015290519081900360640190fd5b604080516001808252818301909252606091602080830190803883390190505090508181600081518110612a7e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061131a81613706565b604080516a4d494e5445525f524f4c4560a81b8152905190819003600b01902081565b600082815260208190526040902060020154612ae890611455612c9a565b61181b5760405162461bcd60e51b81526004018080602001828103825260308152602001806141296030913960400191505060405180910390fd5b6000806000612b318461369a565b6001600160a01b03871660009081526006602052604090209193509150819083604f8110612b5b57fe5b015416151595945050505050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b612b9f612c9a565b6001600160a01b0316612bb06121ea565b6001600160a01b031614612bf9576040805162461bcd60e51b815260206004820181905260248201526000805160206142f3833981519152604482015290519081900360640190fd5b6001600160a01b038116612c3e5760405162461bcd60e51b81526004018080602001828103825260268152602001806140606026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000818152600760205260409020546001600160a01b03161561131a5760008181526007602052604080822080546001600160a01b0319169055518291906001600160a01b038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b6001600160a01b03821660009081526020849052604090205480612d345750611318565b816001600160801b0382161015612e2f57600184018054600019608084901c810192908201916000919083908110612d6857fe5b6000918252602090912001546001880180546001600160a01b039092169185908110612d9057fe5b6000918252602080832090910180546001600160a01b0385166001600160a01b0319909116811790915582528990526040902080546001600160801b0316600186810160801b91909117909155880180549192509080612dec57fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03881682528890526040812055506126ac915050565b6001600160a01b0383166000908152602085905260409020828203905550505050565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006001600160a01b038416612f0b576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6001600160a01b03841660009081526006602052604081206005805491929186908110612f3457fe5b9060005260206000209060550201600501905060006009549050600080612f5a8361369a565b909250905060008583604f8110612f6d57fe5b0154905060008584604f8110612f7f57fe5b015490505b600954612f97908a63ffffffff6138ea16565b85101561302857600183901b92918217911782612ff75760019250818785604f8110612fbf57fe5b0155808685604f8110612fce57fe5b01556001909301928684604f8110612fe257fe5b015491508584604f8110612ff257fe5b015490505b60405185906001600160a01b038d1690600090600080516020614390833981519152908290a4846001019450612f84565b6009859055818785604f811061303a57fe5b0155808685604f811061304957fe5b018190555061307f8960058c8154811061305f57fe5b9060005260206000209060550201600301546138ea90919063ffffffff16565b60058b8154811061308c57fe5b60009182526020909120600360559092020101556130b2600b8c8b63ffffffff6133fb16565b60058a815481106130bf57fe5b90600052602060002090605502016004015460058b815481106130de57fe5b906000526020600020906055020160030154111561312d5760405162461bcd60e51b8152600401808060200182810382526025815260200180613fda6025913960400191505060405180910390fd5b50506009549998505050505050505050565b6131498382612b23565b6131845760405162461bcd60e51b81526004018080602001828103825260298152602001806143386029913960400191505060405180910390fd5b6001600160a01b0382166131c95760405162461bcd60e51b81526004018080602001828103825260248152602001806141056024913960400191505060405180910390fd5b6131d560008285612e52565b6000806131e18361369a565b6001600160a01b0387166000908152600660205260409020919350915081199083604f811061320c57fe5b01805490911690556001600160a01b0384166000908152600660205260409020819083604f811061323957fe5b0180549091179055613254600b85600163ffffffff6133fb16565b613267600b86600163ffffffff612d1016565b82846001600160a01b0316866001600160a01b031660008051602061439083398151915260405160405180910390a45050505050565b6000816001600160a01b0316846001600160a01b031614806132d85750836001600160a01b03166132cd846111d2565b6001600160a01b0316145b806132e857506132e88285612b69565b949350505050565b600082600101828154811061330157fe5b6000918252602090912001546001600160a01b03169392505050565b600082815260208190526040902061333b908263ffffffff61394416565b1561131a57613348612c9a565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020819052604090206133aa908263ffffffff61395916565b1561131a576133b7612c9a565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6001600160a01b038216600090815260208490526040902054806134d6576001848101805491820181556000908152602090200180546001600160a01b0319166001600160a01b038516179055811580159061345e57506001600160801b038211155b6134a6576040805162461bcd60e51b8152602060048201526014602482015273436f756e7465644d61703a206f766572666c6f7760601b604482015290519081900360640190fd5b60018401546001600160a01b038416600090815260208690526040902060809190911b83016000190190556126ac565b80820181811180156134f957506001600160801b03836001600160801b03841601105b613541576040805162461bcd60e51b8152602060048201526014602482015273436f756e7465644d61703a206f766572666c6f7760601b604482015290519081900360640190fd5b6001600160a01b03841660009081526020869052604090205550505050565b60008061356c8361369a565b6001600160a01b03861660009081526006602052604090209193509150819083604f811061359657fe5b0154166135d6576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b6135e08484612c9e565b6001600160a01b0384166000908152600660205260409020901990819083604f811061360857fe5b018054909116905560005b60055481101561365a57816005828154811061362b57fe5b906000526020600020906055020160050160000184604f811061364a57fe5b0180549091169055600101613613565b5061366e600b85600163ffffffff612d1016565b60405183906000906001600160a01b03871690600080516020614390833981519152908390a450505050565b61010081046000604f82106136ef576040805162461bcd60e51b815260206004820152601660248201527523b930bb34b9a1b7b63632b1ba34b136329d1027a7a160511b604482015290519081900360640190fd5b61010083066001901b9050915091565b6001015490565b805160005b818110156138205761372f83828151811061372257fe5b60200260200101516125eb565b1561376b5760405162461bcd60e51b81526004018080602001828103825260248152602001806141596024913960400191505060405180910390fd5b60016002600085848151811061377d57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055507fb251eb052afc73ffd02ffe85ad79990a8b3fed60d76dbc2fa2fdd7123dffd9148382815181106137e957fe5b602002602001015160405180826001600160a01b03166001600160a01b0316815260200191505060405180910390a160010161370b565b505051600380549091019055565b6001600160a01b038116600090815260208390526040812054806138565760009150506115ef565b6001600160801b03811660010191505092915050565b600061158a838361396e565b600061158a836001600160a01b0384166139d2565b61389884848461313f565b6138a4848484846139ea565b6126ac5760405162461bcd60e51b815260040180806020018281038252603281526020018061402e6032913960400191505060405180910390fd5b60006115ef82613b6a565b60008282018381101561158a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061158a836001600160a01b038416613b6e565b600061158a836001600160a01b038416613bb8565b815460009082106139b05760405162461bcd60e51b8152600401808060200182810382526022815260200180613fb86022913960400191505060405180910390fd5b8260000182815481106139bf57fe5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b60006139fe846001600160a01b0316613c7e565b613a0a575060016132e8565b6060613b30630a85bd0160e11b613a1f612c9a565b88878760405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613a98578181015183820152602001613a80565b50505050905090810190601f168015613ac55780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505060405180606001604052806032815260200161402e603291396001600160a01b038816919063ffffffff613c8416565b90506000818060200190516020811015613b4957600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b5490565b6000613b7a83836139d2565b613bb0575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556115ef565b5060006115ef565b60008181526001830160205260408120548015613c745783546000198083019190810190600090879083908110613beb57fe5b9060005260206000200154905080876000018481548110613c0857fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080613c3857fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506115ef565b60009150506115ef565b3b151590565b60606132e8848460008585613c9885613c7e565b613ce9576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613d285780518252601f199092019160209182019101613d09565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613d8a576040519150601f19603f3d011682016040523d82523d6000602084013e613d8f565b606091505b5091509150613d9f828286613daa565b979650505050505050565b60608315613db957508161158a565b825115613dc95782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613e13578181015183820152602001613dfb565b50505050905090810190601f168015613e405780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060e0016040528060006001600160a01b0316815260200160608152602001600081526020016000815260200160008152602001613e8d613f45565b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613edb57805160ff1916838001178555613f08565b82800160010185558215613f08579182015b82811115613f08578251825591602001919060010190613eed565b50613f14929150613f5d565b5090565b82604f8101928215613f085791602002820182811115613f08578251825591602001919060010190613eed565b6040518060200160405280613f58613f77565b905290565b6111cf91905b80821115613f145760008155600101613f63565b604051806109e00160405280604f90602082028038833950919291505056fe477261766973436f6c6c65637469626c653a2074797065206e6f74206578697374456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473477261766973436f6c6c65637469626c653a206d617820737570706c792072656163686564416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e744552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373477261766973436f6c6c65637469626c653a206d7573742068617665206d696e74657220726f6c6520746f206d696e74477261766973436f6c6c65637469626c653a206d696e746572206c6f636b656420616c7265616479477261766973436f6c6c65637469626c653a206d75737420686176652061646d696e20726f6c654552433732313a207472616e7366657220746f20746865207a65726f2061646472657373416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b6557686974656c6973743a2041646472657373206973206d656d62657220616c72656164794552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c57686974656c6973743a204e6f74206d656d626572206f662077686974656c697374477261766973436f6c6c65637469626c653a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564546869732074797065206f6620746f6b656e2063616e6e6f74206265207472616e736665727265642066726f6d20746869732074797065206f662077616c6c65744552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e477261766973436f6c6c65637469626c653a206e6f6d696e616c207072696365206973207a65726f4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e477261766973436f6c6c65637469626c653a20696e7075742061727261797320646f6e2774206d617463684f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572477261766973436f6c6c65637469626c653a206d757374206861766520617070726f76616c4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef4552433732313a20617070726f76616c20746f2063757272656e74206f776e6572477261766973436f6c6c65637469626c653a206e6f7420656e6f75676820746f6b656e734552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564477261766973436f6c6c65637469626c653a206d696e74696e67206c6f636b656420627920616e6f74686572206163636f756e74416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a264697066735822122002cc14953b7f5b7f217e6fe83685b08111a4dd6404a31a92641d42004805e94e64736f6c63430006020033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103265760003560e01c80636352211e116101b8578063a22cb46511610104578063ca15c873116100a2578063d547741f1161007c578063d547741f14610e43578063e327a6af14610e6f578063e985e9c514610e9b578063f2fde38b14610ec957610326565b8063ca15c87314610df8578063ca6d56dc14610e15578063d539139314610e3b57610326565b8063b18f1943116100de578063b18f194314610c51578063b88d4fde14610c59578063bdb6836914610d1d578063c87b56dd14610ddb57610326565b8063a22cb46514610bd1578063a230c52414610bff578063a9059cbb14610c2557610326565b80638da5cb5b1161017157806395d89b411161014b57806395d89b4114610a72578063983b2d5614610a7a5780639bd993ff14610aa0578063a217fddf14610bc957610326565b80638da5cb5b14610a1b5780639010d07c14610a2357806391d1485414610a4657610326565b80636352211e1461090a5780636c0360eb146109275780636f4d469b1461092f57806370a08231146109d0578063715018a6146109f657806376aed2e1146109fe57610326565b80632f745c591161027757806342966c68116102305780634f558e791161020a5780634f558e79146108005780634f6ccce71461081d57806350a2388f1461083a57806355f804b31461086657610326565b806342966c68146106a6578063473360a1146106c357806347799da8146107f857610326565b80632f745c59146105b6578063313ce567146105e257806336568abe146106005780633d9287fa1461062c5780633ee9f8bb1461063457806342842e0e1461067057610326565b8063156e29f6116102e457806323b872dd116102be57806323b872dd1461051a5780632435987914610550578063248a9ca31461056d5780632f2ff15d1461058a57610326565b8063156e29f6146104a257806318160ddd146104e65780631a88f306146104ee57610326565b8062c2a9451461032b57806301ffc9a71461035f57806306fdde031461039a578063081812fc14610417578063095ea7b3146104505780630b1ca49a1461047c575b600080fd5b61035d6004803603606081101561034157600080fd5b506001600160a01b038135169060208101359060400135610eef565b005b6103866004803603602081101561037557600080fd5b50356001600160e01b031916611177565b604080519115158252519081900360200190f35b6103a261119a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103dc5781810151838201526020016103c4565b50505050905090810190601f1680156104095780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104346004803603602081101561042d57600080fd5b50356111d2565b604080516001600160a01b039092168252519081900360200190f35b61035d6004803603604081101561046657600080fd5b506001600160a01b038135169060200135611234565b61035d6004803603602081101561049257600080fd5b50356001600160a01b031661131e565b6104d4600480360360608110156104b857600080fd5b506001600160a01b038135169060208101359060400135611426565b60408051918252519081900360200190f35b6104d4611591565b6103866004803603604081101561050457600080fd5b506001600160a01b038135169060200135611597565b61035d6004803603606081101561053057600080fd5b506001600160a01b038135811691602081013590911690604001356115f5565b6104346004803603602081101561056657600080fd5b503561164d565b6104d46004803603602081101561058357600080fd5b5035611660565b61035d600480360360408110156105a057600080fd5b50803590602001356001600160a01b0316611675565b6104d4600480360360408110156105cc57600080fd5b506001600160a01b0381351690602001356116d8565b6105ea6117bf565b6040805160ff9092168252519081900360200190f35b61035d6004803603604081101561061657600080fd5b50803590602001356001600160a01b03166117c4565b6104d4611825565b61035d6004803603608081101561064a57600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013561182b565b61035d6004803603606081101561068657600080fd5b506001600160a01b03813581169160208101359091169060400135611ae7565b61035d600480360360208110156106bc57600080fd5b5035611b02565b61035d600480360360808110156106d957600080fd5b813591602081013591810190606081016040820135600160201b8111156106ff57600080fd5b82018360208201111561071157600080fd5b803590602001918460018302840111600160201b8311171561073257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561078457600080fd5b82018360208201111561079657600080fd5b803590602001918460018302840111600160201b831117156107b757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611bb3945050505050565b6104d4611d48565b6103866004803603602081101561081657600080fd5b5035611d4e565b6104d46004803603602081101561083357600080fd5b50356111cf565b61035d6004803603604081101561085057600080fd5b506001600160a01b038135169060200135611d64565b61035d6004803603602081101561087c57600080fd5b810190602081018135600160201b81111561089657600080fd5b8201836020820111156108a857600080fd5b803590602001918460018302840111600160201b831117156108c957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e5a945050505050565b6104346004803603602081101561092057600080fd5b5035611eb5565b6103a2611fb4565b61035d6004803603602081101561094557600080fd5b810190602081018135600160201b81111561095f57600080fd5b82018360208201111561097157600080fd5b803590602001918460208302840111600160201b8311171561099257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612042945050505050565b6104d4600480360360208110156109e657600080fd5b50356001600160a01b03166120ad565b61035d6120c0565b6104d460048036036020811015610a1457600080fd5b503561216c565b6104346121ea565b61043460048036036040811015610a3957600080fd5b50803590602001356121f9565b61038660048036036040811015610a5c57600080fd5b50803590602001356001600160a01b0316612217565b6103a2612235565b61035d60048036036020811015610a9057600080fd5b50356001600160a01b031661225a565b610abd60048036036020811015610ab657600080fd5b50356122cc565b6040518087815260200186815260200185815260200180602001846001600160a01b03166001600160a01b0316815260200180602001838103835286818151815260200191508051906020019080838360005b83811015610b28578181015183820152602001610b10565b50505050905090810190601f168015610b555780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015610b88578181015183820152602001610b70565b50505050905090810190601f168015610bb55780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b6104d46124e1565b61035d60048036036040811015610be757600080fd5b506001600160a01b03813516906020013515156124e6565b61038660048036036020811015610c1557600080fd5b50356001600160a01b03166125eb565b61038660048036036040811015610c3b57600080fd5b506001600160a01b038135169060200135612609565b6104d4612642565b61035d60048036036080811015610c6f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610ca957600080fd5b820183602082011115610cbb57600080fd5b803590602001918460018302840111600160201b83111715610cdc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612653945050505050565b61035d60048036036060811015610d3357600080fd5b810190602081018135600160201b811115610d4d57600080fd5b820183602082011115610d5f57600080fd5b803590602001918460208302840111600160201b83111715610d8057600080fd5b919390929091602081019035600160201b811115610d9d57600080fd5b820183602082011115610daf57600080fd5b803590602001918460208302840111600160201b83111715610dd057600080fd5b9193509150356126b2565b6103a260048036036020811015610df157600080fd5b5035612892565b6104d460048036036020811015610e0e57600080fd5b50356129d5565b61035d60048036036020811015610e2b57600080fd5b50356001600160a01b03166129ec565b6104d4612aa7565b61035d60048036036040811015610e5957600080fd5b50803590602001356001600160a01b0316612aca565b61038660048036036040811015610e8557600080fd5b506001600160a01b038135169060200135612b23565b61038660048036036040811015610eb157600080fd5b506001600160a01b0381358116916020013516612b69565b61035d60048036036020811015610edf57600080fd5b50356001600160a01b0316612b97565b610ef7612c9a565b6001600160a01b0316836001600160a01b03161480610f225750610f2283610f1d612c9a565b612b69565b610f5d5760405162461bcd60e51b81526004018080602001828103825260258152602001806143136025913960400191505060405180910390fd5b6005548210610f9d5760405162461bcd60e51b8152600401808060200182810382526021815260200180613f976021913960400191505060405180910390fd5b6001600160a01b03831660009081526006602052604081206005805491929185908110610fc657fe5b60009182526020822060056055909202010191508080805b8683101561113c575b604f8410801561100257508584604f8110610ffe57fe5b0154155b1561101257836001019350610fe7565b604f84106110515760405162461bcd60e51b81526004018080602001828103825260248152602001806143d16024913960400191505060405180910390fd5b8584604f811061105d57fe5b015491508484604f811061106d57fe5b0154905060005b87841015611136575b6101008110156110b1576001811b8381161580159061109d575082811615155b156110a857506110b1565b5060010161107d565b8061010014156110e457828786604f81106110c857fe5b0155818686604f81106110d757fe5b0155600190940193611136565b610100850281016110f58b82612c9e565b6040516001831b1994851694938416939082906000906001600160a01b038f1690600080516020614390833981519152908390a48560010195505050611074565b50610fde565b818685604f811061114957fe5b0155808585604f811061115857fe5b015561116c600b8a8963ffffffff612d1016565b505050505050505050565b6001600160e01b0319811660009081526004602052604090205460ff165b919050565b60408051808201909152601b81527f4772617669732046696e616e636520475256532057617272616e74000000000060208201525b90565b60006111dd82611d4e565b6112185760405162461bcd60e51b815260040180806020018281038252602c81526020018061429c602c913960400191505060405180910390fd5b506000908152600760205260409020546001600160a01b031690565b61124561123f612c9a565b82612b23565b156112b957611252612c9a565b6001600160a01b0316826001600160a01b031614156112a25760405162461bcd60e51b81526004018080602001828103825260218152602001806143b06021913960400191505060405180910390fd5b6112b482826112af612c9a565b612e52565b61131a565b60006112c482611eb5565b90506112d281610f1d612c9a565b61130d5760405162461bcd60e51b815260040180806020018281038252603881526020018061417d6038913960400191505060405180910390fd5b611318838383612e52565b505b5050565b611326612c9a565b6001600160a01b03166113376121ea565b6001600160a01b031614611380576040805162461bcd60e51b815260206004820181905260248201526000805160206142f3833981519152604482015290519081900360640190fd5b611389816125eb565b6113c45760405162461bcd60e51b81526004018080602001828103825260228152602001806141b56022913960400191505060405180910390fd5b6001600160a01b038116600081815260026020908152604091829020805460ff1916905560038054600019019055815192835290517f6e76fb4c77256006d9c38ec7d82b45a8c8f3c27b1d6766fffc42dfb8de6844929281900390910190a150565b604080516a4d494e5445525f524f4c4560a81b8152905190819003600b01902060009061145a90611455612c9a565b612217565b6114955760405162461bcd60e51b81526004018080602001828103825260308152602001806140866030913960400191505060405180910390fd5b60055483106114d55760405162461bcd60e51b8152600401808060200182810382526021815260200180613f976021913960400191505060405180910390fd5b6000600584815481106114e457fe5b6000918252602090912060559091020180549091506001600160a01b03161561157b5761150f612c9a565b6001600160a01b03166005858154811061152557fe5b60009182526020909120605590910201546001600160a01b03161461157b5760405162461bcd60e51b81526004018080602001828103825260348152602001806144266034913960400191505060405180910390fd5b611586858585612eae565b9150505b9392505050565b60095490565b60006115a581611455612c9a565b6115e05760405162461bcd60e51b81526004018080602001828103825260278152602001806140de6027913960400191505060405180910390fd5b6115eb30848461313f565b5060015b92915050565b611607611600612c9a565b828561329d565b6116425760405162461bcd60e51b81526004018080602001828103825260318152602001806143f56031913960400191505060405180910390fd5b61131883838361313f565b60006115ef600b8363ffffffff6132f016565b60009081526020819052604090206002015490565b60008281526020819052604090206002015461169390611455612c9a565b6116ce5760405162461bcd60e51b815260040180806020018281038252602f815260200180613fff602f913960400191505060405180910390fd5b61131a828261331d565b6001600160a01b03821660009081526006602052604081208180805b60008484604f811061170257fe5b015490508015611731575b6101008310801561172157506001831b8116155b156117315782600101925061170d565b80158061173f575082610100145b156117935760009250836001019350604f841061178d5760405162461bcd60e51b81526004018080602001828103825260248152602001806143d16024913960400191505060405180910390fd5b506116f4565b868214156117a157506117ae565b50600191820191016116f4565b506101009091020191505092915050565b600090565b6117cc612c9a565b6001600160a01b0316816001600160a01b03161461181b5760405162461bcd60e51b815260040180806020018281038252602f81526020018061445a602f913960400191505060405180910390fd5b61131a828261338c565b60035481565b611833612c9a565b6001600160a01b0316846001600160a01b03161480611859575061185984610f1d612c9a565b6118945760405162461bcd60e51b81526004018080602001828103825260258152602001806143136025913960400191505060405180910390fd5b60055482106118d45760405162461bcd60e51b8152600401808060200182810382526021815260200180613f976021913960400191505060405180910390fd5b6001600160a01b0380851660009081526006602052604080822092861682528120600580549192918690811061190657fe5b60009182526020822060056055909202010191508080805b87831015611a98575b604f8410801561194257508684604f811061193e57fe5b0154155b1561195257836001019350611927565b604f84106119915760405162461bcd60e51b81526004018080602001828103825260248152602001806143d16024913960400191505060405180910390fd5b8684604f811061199d57fe5b015491508584604f81106119ad57fe5b0154905060005b88841015611a92575b6101008110156119fe576001811b838116158015906119ea5750808787604f81106119e457fe5b01541615155b156119f557506119fe565b506001016119bd565b806101001415611a3157828886604f8110611a1557fe5b0155818786604f8110611a2457fe5b0155600190940193611a92565b61010085028101611a428d82612c9e565b6000826001901b90508084179350801985169450818d6001600160a01b03168f6001600160a01b031660008051602061439083398151915260405160405180910390a485600101955050506119b4565b5061191e565b818785604f8110611aa557fe5b0155808685604f8110611ab457fe5b0155611ac8600b8b8a63ffffffff6133fb16565b611ada600b8c8a63ffffffff612d1016565b5050505050505050505050565b61131883838360405180602001604052806000815250612653565b611b0d61123f612c9a565b15611b2857611b23611b1d612c9a565b82613560565b611bb0565b6000611b3382611eb5565b9050611b3d612c9a565b6001600160a01b0316611b4f836111d2565b6001600160a01b03161480611b6b5750611b6b81610f1d612c9a565b611ba65760405162461bcd60e51b81526004018080602001828103825260338152602001806141d76033913960400191505060405180910390fd5b61131a8183613560565b50565b611bc06000611455612c9a565b611bfb5760405162461bcd60e51b81526004018080602001828103825260278152602001806140de6027913960400191505060405180910390fd5b83611c375760405162461bcd60e51b81526004018080602001828103825260288152602001806142746028913960400191505060405180910390fd5b611c3f613e4e565b6040810185905260808101849052602080820184815260c083018490526005805460018101825560009190915283517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0605590920291820180546001600160a01b0319166001600160a01b03909216919091178155915180518594611ce8937f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db101920190613e9a565b5060408201516002820155606082015160038201556080820151600482015560a082015180516005830190611d20908290604f613f18565b50505060c08201518051611d3e916054840191602090910190613e9a565b5050505050505050565b60095481565b6000600019611d5c8361216c565b141592915050565b611d716000611455612c9a565b611dac5760405162461bcd60e51b81526004018080602001828103825260278152602001806140de6027913960400191505060405180910390fd5b60006001600160a01b031660058281548110611dc457fe5b60009182526020909120605590910201546001600160a01b031614611e1a5760405162461bcd60e51b81526004018080602001828103825260288152602001806140b66028913960400191505060405180910390fd5b8160058281548110611e2857fe5b6000918252602090912060559091020180546001600160a01b0319166001600160a01b03929092169190911790555050565b611e676000611455612c9a565b611ea25760405162461bcd60e51b81526004018080602001828103825260278152602001806140de6027913960400191505060405180910390fd5b805161131a90600a906020840190613e9a565b6000806000611ec38461369a565b915091508060066000611ed4612c9a565b6001600160a01b03168152602081019190915260400160002083604f8110611ef857fe5b01541615611f1157611f08612c9a565b92505050611195565b60005b611f1e600b6136ff565b811015611f7c576000611f38600b8363ffffffff6132f016565b6001600160a01b0381166000908152600660205260409020909150839085604f8110611f6057fe5b01541615611f7357935061119592505050565b50600101611f14565b5060405162461bcd60e51b815260040180806020018281038252602981526020018061424b6029913960400191505060405180910390fd5b600a805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050505081565b61204a612c9a565b6001600160a01b031661205b6121ea565b6001600160a01b0316146120a4576040805162461bcd60e51b815260206004820181905260248201526000805160206142f3833981519152604482015290519081900360640190fd5b611bb081613706565b60006115ef600b8363ffffffff61382e16565b6120c8612c9a565b6001600160a01b03166120d96121ea565b6001600160a01b031614612122576040805162461bcd60e51b815260206004820181905260248201526000805160206142f3833981519152604482015290519081900360640190fd5b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b60006009548210156121e1576000806121848461369a565b909250905060005b6005548110156121dd5781600582815481106121a457fe5b906000526020600020906055020160050160000184604f81106121c357fe5b015416156121d5579250611195915050565b60010161218c565b5050505b50600019919050565b6001546001600160a01b031690565b600082815260208190526040812061158a908363ffffffff61386c16565b600082815260208190526040812061158a908363ffffffff61387816565b60408051808201909152600b81526a11d49594d5d0549490539560aa1b602082015290565b6122676000611455612c9a565b6122a25760405162461bcd60e51b81526004018080602001828103825260278152602001806140de6027913960400191505060405180910390fd5b604080516a4d494e5445525f524f4c4560a81b8152905190819003600b019020611bb090826116ce565b60008060006060600060606122df613e4e565b600588815481106122ec57fe5b60009182526020918290206040805160e081018252605590930290910180546001600160a01b03168352600180820180548451601f600260001995841615610100029590950190921693909304908101879004870283018701909452838252939491938583019391929091908301828280156123a95780601f1061237e576101008083540402835291602001916123a9565b820191906000526020600020905b81548152906001019060200180831161238c57829003601f168201915b505050918352505060028201546020808301919091526003830154604080840191909152600484015460608401528051610a0081019182905260809093019291600585019183918201908390604f9082845b8154815260200190600101908083116123fb5750505091909252505050815260548201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156124a65780601f1061247b576101008083540402835291602001916124a6565b820191906000526020600020905b81548152906001019060200180831161248957829003601f168201915b505050919092525050506040810151606082015160808301516020840151845160c090950151939d929c50909a509850919650945092505050565b600081565b6124ee612c9a565b6001600160a01b0316826001600160a01b03161415612554576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060086000612561612c9a565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556125a5612c9a565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6001600160a01b031660009081526002602052604090205460ff1690565b600060405162461bcd60e51b815260040180806020018281038252604181526020018061420a6041913960600191505060405180910390fd5b600061264e600b6136ff565b905090565b61266561265e612c9a565b838661329d565b6126a05760405162461bcd60e51b81526004018080602001828103825260318152602001806143f56031913960400191505060405180910390fd5b6126ac8484848461388d565b50505050565b604080516a4d494e5445525f524f4c4560a81b8152905190819003600b0190206126de90611455612c9a565b6127195760405162461bcd60e51b81526004018080602001828103825260308152602001806140866030913960400191505060405180910390fd5b8382146127575760405162461bcd60e51b815260040180806020018281038252602b8152602001806142c8602b913960400191505060405180910390fd5b60055481106127975760405162461bcd60e51b8152600401808060200182810382526021815260200180613f976021913960400191505060405180910390fd5b6000600582815481106127a657fe5b6000918252602090912060559091020180549091506001600160a01b03161561283d576127d1612c9a565b6001600160a01b0316600583815481106127e757fe5b60009182526020909120605590910201546001600160a01b03161461283d5760405162461bcd60e51b81526004018080602001828103825260348152602001806144266034913960400191505060405180910390fd5b60005b858110156128895761288087878381811061285757fe5b905060200201356001600160a01b03168487878581811061287457fe5b90506020020135612eae565b50600101612840565b50505050505050565b6060600061289f8361216c565b90506000198114156128e25760405162461bcd60e51b815260040180806020018281038252602f815260200180614361602f913960400191505060405180910390fd5b600a600582815481106128f157fe5b906000526020600020906055020160540160405160200180838054600181600116156101000203166002900480156129605780601f1061293e576101008083540402835291820191612960565b820191906000526020600020905b81548152906001019060200180831161294c575b5050828054600181600116156101000203166002900480156129b95780601f106129975761010080835404028352918201916129b9565b820191906000526020600020905b8154815290600101906020018083116129a5575b505060408051601f198184030181529190529695505050505050565b60008181526020819052604081206115ef906138df565b6129f4612c9a565b6001600160a01b0316612a056121ea565b6001600160a01b031614612a4e576040805162461bcd60e51b815260206004820181905260248201526000805160206142f3833981519152604482015290519081900360640190fd5b604080516001808252818301909252606091602080830190803883390190505090508181600081518110612a7e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061131a81613706565b604080516a4d494e5445525f524f4c4560a81b8152905190819003600b01902081565b600082815260208190526040902060020154612ae890611455612c9a565b61181b5760405162461bcd60e51b81526004018080602001828103825260308152602001806141296030913960400191505060405180910390fd5b6000806000612b318461369a565b6001600160a01b03871660009081526006602052604090209193509150819083604f8110612b5b57fe5b015416151595945050505050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b612b9f612c9a565b6001600160a01b0316612bb06121ea565b6001600160a01b031614612bf9576040805162461bcd60e51b815260206004820181905260248201526000805160206142f3833981519152604482015290519081900360640190fd5b6001600160a01b038116612c3e5760405162461bcd60e51b81526004018080602001828103825260268152602001806140606026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000818152600760205260409020546001600160a01b03161561131a5760008181526007602052604080822080546001600160a01b0319169055518291906001600160a01b038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b6001600160a01b03821660009081526020849052604090205480612d345750611318565b816001600160801b0382161015612e2f57600184018054600019608084901c810192908201916000919083908110612d6857fe5b6000918252602090912001546001880180546001600160a01b039092169185908110612d9057fe5b6000918252602080832090910180546001600160a01b0385166001600160a01b0319909116811790915582528990526040902080546001600160801b0316600186810160801b91909117909155880180549192509080612dec57fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03881682528890526040812055506126ac915050565b6001600160a01b0383166000908152602085905260409020828203905550505050565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006001600160a01b038416612f0b576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6001600160a01b03841660009081526006602052604081206005805491929186908110612f3457fe5b9060005260206000209060550201600501905060006009549050600080612f5a8361369a565b909250905060008583604f8110612f6d57fe5b0154905060008584604f8110612f7f57fe5b015490505b600954612f97908a63ffffffff6138ea16565b85101561302857600183901b92918217911782612ff75760019250818785604f8110612fbf57fe5b0155808685604f8110612fce57fe5b01556001909301928684604f8110612fe257fe5b015491508584604f8110612ff257fe5b015490505b60405185906001600160a01b038d1690600090600080516020614390833981519152908290a4846001019450612f84565b6009859055818785604f811061303a57fe5b0155808685604f811061304957fe5b018190555061307f8960058c8154811061305f57fe5b9060005260206000209060550201600301546138ea90919063ffffffff16565b60058b8154811061308c57fe5b60009182526020909120600360559092020101556130b2600b8c8b63ffffffff6133fb16565b60058a815481106130bf57fe5b90600052602060002090605502016004015460058b815481106130de57fe5b906000526020600020906055020160030154111561312d5760405162461bcd60e51b8152600401808060200182810382526025815260200180613fda6025913960400191505060405180910390fd5b50506009549998505050505050505050565b6131498382612b23565b6131845760405162461bcd60e51b81526004018080602001828103825260298152602001806143386029913960400191505060405180910390fd5b6001600160a01b0382166131c95760405162461bcd60e51b81526004018080602001828103825260248152602001806141056024913960400191505060405180910390fd5b6131d560008285612e52565b6000806131e18361369a565b6001600160a01b0387166000908152600660205260409020919350915081199083604f811061320c57fe5b01805490911690556001600160a01b0384166000908152600660205260409020819083604f811061323957fe5b0180549091179055613254600b85600163ffffffff6133fb16565b613267600b86600163ffffffff612d1016565b82846001600160a01b0316866001600160a01b031660008051602061439083398151915260405160405180910390a45050505050565b6000816001600160a01b0316846001600160a01b031614806132d85750836001600160a01b03166132cd846111d2565b6001600160a01b0316145b806132e857506132e88285612b69565b949350505050565b600082600101828154811061330157fe5b6000918252602090912001546001600160a01b03169392505050565b600082815260208190526040902061333b908263ffffffff61394416565b1561131a57613348612c9a565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020819052604090206133aa908263ffffffff61395916565b1561131a576133b7612c9a565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6001600160a01b038216600090815260208490526040902054806134d6576001848101805491820181556000908152602090200180546001600160a01b0319166001600160a01b038516179055811580159061345e57506001600160801b038211155b6134a6576040805162461bcd60e51b8152602060048201526014602482015273436f756e7465644d61703a206f766572666c6f7760601b604482015290519081900360640190fd5b60018401546001600160a01b038416600090815260208690526040902060809190911b83016000190190556126ac565b80820181811180156134f957506001600160801b03836001600160801b03841601105b613541576040805162461bcd60e51b8152602060048201526014602482015273436f756e7465644d61703a206f766572666c6f7760601b604482015290519081900360640190fd5b6001600160a01b03841660009081526020869052604090205550505050565b60008061356c8361369a565b6001600160a01b03861660009081526006602052604090209193509150819083604f811061359657fe5b0154166135d6576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b6135e08484612c9e565b6001600160a01b0384166000908152600660205260409020901990819083604f811061360857fe5b018054909116905560005b60055481101561365a57816005828154811061362b57fe5b906000526020600020906055020160050160000184604f811061364a57fe5b0180549091169055600101613613565b5061366e600b85600163ffffffff612d1016565b60405183906000906001600160a01b03871690600080516020614390833981519152908390a450505050565b61010081046000604f82106136ef576040805162461bcd60e51b815260206004820152601660248201527523b930bb34b9a1b7b63632b1ba34b136329d1027a7a160511b604482015290519081900360640190fd5b61010083066001901b9050915091565b6001015490565b805160005b818110156138205761372f83828151811061372257fe5b60200260200101516125eb565b1561376b5760405162461bcd60e51b81526004018080602001828103825260248152602001806141596024913960400191505060405180910390fd5b60016002600085848151811061377d57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055507fb251eb052afc73ffd02ffe85ad79990a8b3fed60d76dbc2fa2fdd7123dffd9148382815181106137e957fe5b602002602001015160405180826001600160a01b03166001600160a01b0316815260200191505060405180910390a160010161370b565b505051600380549091019055565b6001600160a01b038116600090815260208390526040812054806138565760009150506115ef565b6001600160801b03811660010191505092915050565b600061158a838361396e565b600061158a836001600160a01b0384166139d2565b61389884848461313f565b6138a4848484846139ea565b6126ac5760405162461bcd60e51b815260040180806020018281038252603281526020018061402e6032913960400191505060405180910390fd5b60006115ef82613b6a565b60008282018381101561158a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061158a836001600160a01b038416613b6e565b600061158a836001600160a01b038416613bb8565b815460009082106139b05760405162461bcd60e51b8152600401808060200182810382526022815260200180613fb86022913960400191505060405180910390fd5b8260000182815481106139bf57fe5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b60006139fe846001600160a01b0316613c7e565b613a0a575060016132e8565b6060613b30630a85bd0160e11b613a1f612c9a565b88878760405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613a98578181015183820152602001613a80565b50505050905090810190601f168015613ac55780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505060405180606001604052806032815260200161402e603291396001600160a01b038816919063ffffffff613c8416565b90506000818060200190516020811015613b4957600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b5490565b6000613b7a83836139d2565b613bb0575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556115ef565b5060006115ef565b60008181526001830160205260408120548015613c745783546000198083019190810190600090879083908110613beb57fe5b9060005260206000200154905080876000018481548110613c0857fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080613c3857fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506115ef565b60009150506115ef565b3b151590565b60606132e8848460008585613c9885613c7e565b613ce9576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613d285780518252601f199092019160209182019101613d09565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613d8a576040519150601f19603f3d011682016040523d82523d6000602084013e613d8f565b606091505b5091509150613d9f828286613daa565b979650505050505050565b60608315613db957508161158a565b825115613dc95782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613e13578181015183820152602001613dfb565b50505050905090810190601f168015613e405780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060e0016040528060006001600160a01b0316815260200160608152602001600081526020016000815260200160008152602001613e8d613f45565b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613edb57805160ff1916838001178555613f08565b82800160010185558215613f08579182015b82811115613f08578251825591602001919060010190613eed565b50613f14929150613f5d565b5090565b82604f8101928215613f085791602002820182811115613f08578251825591602001919060010190613eed565b6040518060200160405280613f58613f77565b905290565b6111cf91905b80821115613f145760008155600101613f63565b604051806109e00160405280604f90602082028038833950919291505056fe477261766973436f6c6c65637469626c653a2074797065206e6f74206578697374456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473477261766973436f6c6c65637469626c653a206d617820737570706c792072656163686564416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e744552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373477261766973436f6c6c65637469626c653a206d7573742068617665206d696e74657220726f6c6520746f206d696e74477261766973436f6c6c65637469626c653a206d696e746572206c6f636b656420616c7265616479477261766973436f6c6c65637469626c653a206d75737420686176652061646d696e20726f6c654552433732313a207472616e7366657220746f20746865207a65726f2061646472657373416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b6557686974656c6973743a2041646472657373206973206d656d62657220616c72656164794552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c57686974656c6973743a204e6f74206d656d626572206f662077686974656c697374477261766973436f6c6c65637469626c653a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564546869732074797065206f6620746f6b656e2063616e6e6f74206265207472616e736665727265642066726f6d20746869732074797065206f662077616c6c65744552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e477261766973436f6c6c65637469626c653a206e6f6d696e616c207072696365206973207a65726f4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e477261766973436f6c6c65637469626c653a20696e7075742061727261797320646f6e2774206d617463684f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572477261766973436f6c6c65637469626c653a206d757374206861766520617070726f76616c4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef4552433732313a20617070726f76616c20746f2063757272656e74206f776e6572477261766973436f6c6c65637469626c653a206e6f7420656e6f75676820746f6b656e734552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564477261766973436f6c6c65637469626c653a206d696e74696e67206c6f636b656420627920616e6f74686572206163636f756e74416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a264697066735822122002cc14953b7f5b7f217e6fe83685b08111a4dd6404a31a92641d42004805e94e64736f6c63430006020033
Deployed Bytecode Sourcemap
51564:25242:0:-:0;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51564:25242:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68183:1801;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;68183:1801:0;;;;;;;;;;;;;:::i;:::-;;1993:150;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1993:150:0;-1:-1:-1;;;;;;1993:150:0;;:::i;:::-;;;;;;;;;;;;;;;;;;54851:118;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;54851:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59159:223;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59159:223:0;;:::i;:::-;;;;-1:-1:-1;;;;;59159:223:0;;;;;;;;;;;;;;58569:524;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;58569:524:0;;;;;;;;:::i;50448:237::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50448:237:0;-1:-1:-1;;;;;50448:237:0;;:::i;63221:639::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;63221:639:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;57222:100;;;:::i;66313:175::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;66313:175:0;;;;;;;;:::i;60137:317::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;60137:317:0;;;;;;;;;;;;;;;;;:::i;67485:106::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;67485:106:0;;:::i;43026:114::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43026:114:0;;:::i;43402:227::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43402:227:0;;;;;;-1:-1:-1;;;;;43402:227:0;;:::i;56290:856::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;56290:856:0;;;;;;;;:::i;55256:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44611:209;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44611:209:0;;;;;;-1:-1:-1;;;;;44611:209:0;;:::i;49415:26::-;;;:::i;70101:1925::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;70101:1925:0;;;;;;;;;;;;;;;;;;;;;;:::i;60525:191::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;60525:191:0;;;;;;;;;;;;;;;;;:::i;67649:437::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;67649:437:0;;:::i;61923:443::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;61923:443:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;61923:443:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;61923:443:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;61923:443:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;61923:443:0;;;;;;;;-1:-1:-1;61923:443:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;61923:443:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;61923:443:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;61923:443:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;61923:443:0;;-1:-1:-1;61923:443:0;;-1:-1:-1;;;;;61923:443:0:i;52680:23::-;;;:::i;61208:124::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61208:124:0;;:::i;57399:115::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57399:115:0;;:::i;62499:252::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;62499:252:0;;;;;;;;:::i;61396:98::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;61396:98:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;61396:98:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;61396:98:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;61396:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;61396:98:0;;-1:-1:-1;61396:98:0;;-1:-1:-1;;;;;61396:98:0:i;66610:479::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66610:479:0;;:::i;52710:21::-;;;:::i;50201:104::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50201:104:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;50201:104:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;50201:104:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;50201:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;50201:104:0;;-1:-1:-1;50201:104:0;;-1:-1:-1;;;;;50201:104:0:i;56088:118::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56088:118:0;-1:-1:-1;;;;;56088:118:0;;:::i;48511:148::-;;;:::i;58141:366::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58141:366:0;;:::i;47860:87::-;;;:::i;42699:138::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42699:138:0;;;;;;;:::i;41660:139::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41660:139:0;;;;;;-1:-1:-1;;;;;41660:139:0;;:::i;55045:104::-;;;:::i;62870:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62870:110:0;-1:-1:-1;;;;;62870:110:0;;:::i;57611:448::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57611:448:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57611:448:0;-1:-1:-1;;;;;57611:448:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;57611:448:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57611:448:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;57611:448:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40405:49;;;:::i;59454:302::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;59454:302:0;;;;;;;;;;:::i;49660:104::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49660:104:0;-1:-1:-1;;;;;49660:104:0;;:::i;55435:165::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;55435:165:0;;;;;;;;:::i;67382:95::-;;;:::i;60787:361::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;60787:361:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;60787:361:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;60787:361:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;60787:361:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;60787:361:0;;-1:-1:-1;60787:361:0;;-1:-1:-1;;;;;60787:361:0:i;63868:775::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;63868:775:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;63868:775:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;63868:775:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;63868:775:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;63868:775:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;63868:775:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;63868:775:0;;-1:-1:-1;63868:775:0;-1:-1:-1;63868:775:0;;:::i;55706:299::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55706:299:0;;:::i;41973:127::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41973:127:0;;:::i;49899:165::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49899:165:0;-1:-1:-1;;;;;49899:165:0;;:::i;46395:62::-;;;:::i;43874:230::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43874:230:0;;;;;;-1:-1:-1;;;;;43874:230:0;;:::i;67174:200::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;67174:200:0;;;;;;;;:::i;59827:243::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;59827:243:0;;;;;;;;;;:::i;48814:244::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48814:244:0;-1:-1:-1;;;;;48814:244:0;;:::i;68183:1801::-;68314:12;:10;:12::i;:::-;-1:-1:-1;;;;;68306:20:0;:4;-1:-1:-1;;;;;68306:20:0;;:60;;;;68330:36;68347:4;68353:12;:10;:12::i;:::-;68330:16;:36::i;:::-;68298:127;;;;-1:-1:-1;;;68298:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68452:8;:15;68444:23;;68436:69;;;;-1:-1:-1;;;68436:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68549:12:0;;68518:28;68549:12;;;:6;:12;;;;;68603:8;:15;;68549:12;;68518:28;68612:5;;68603:15;;;;;;;;;;;;;:21;:15;;;;;:21;;-1:-1:-1;68603:15:0;;;68744:1110;68760:7;68751:6;:16;68744:1110;;;68784:70;51918:2;68791:5;:24;:54;;;;-1:-1:-1;68819:9:0;68834:5;68819:21;;;;;;;;;:26;68791:54;68784:70;;;68847:7;;;;;68784:70;;;51918:2;68877:5;:24;68869:73;;;;-1:-1:-1;;;68869:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68967:9;68982:5;68967:21;;;;;;;;;;-1:-1:-1;69013:9:0;69028:5;69013:21;;;;;;;;;;-1:-1:-1;69049:11:0;69079:764;69095:7;69086:6;:16;69079:764;;;69123:188;69136:3;69130;:9;69123:188;;;69179:1;:8;;69214:14;;;:19;;;;:42;;-1:-1:-1;69237:14:0;;;:19;;69214:42;69210:53;;;69258:5;;;69210:53;-1:-1:-1;69286:5:0;;69123:188;;;69333:3;69340;69333:10;69329:202;;;69392:7;69368:9;69383:5;69368:21;;;;;;;;:31;69446:7;69422:9;69437:5;69422:21;;;;;;;;:31;69476:7;;;;;69506:5;;69329:202;69575:3;69567:11;;:17;;69603:25;69614:4;69567:17;69603:10;:25::i;:::-;69765:35;;69664:1;:8;;69662:11;69692:15;;;;69726;;;;69662:11;69792:7;;69647:12;;-1:-1:-1;;;;;69765:35:0;;;-1:-1:-1;;;;;;;;;;;69765:35:0;69647:12;;69765:35;69819:8;;;;;69079:764;;;;;68744:1110;;;;69888:7;69864:9;69879:5;69864:21;;;;;;;;:31;69930:7;69906:9;69921:5;69906:21;;;;;;;;:31;69948:28;:6;69962:4;69968:7;69948:28;:13;:28;:::i;:::-;68183:1801;;;;;;;;;:::o;1993:150::-;-1:-1:-1;;;;;;2102:33:0;;2078:4;2102:33;;;:20;:33;;;;;;;;1993:150;;;;:::o;54851:118::-;54925:36;;;;;;;;;;;;;;;;;54851:118;;:::o;59159:223::-;59236:7;59264:16;59271:8;59264:6;:16::i;:::-;59256:73;;;;-1:-1:-1;;;59256:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59349:25:0;;;;:15;:25;;;;;;-1:-1:-1;;;;;59349:25:0;;59159:223::o;58569:524::-;58656:31;58664:12;:10;:12::i;:::-;58678:8;58656:7;:31::i;:::-;58652:434;;;58719:12;:10;:12::i;:::-;-1:-1:-1;;;;;58712:19:0;:3;-1:-1:-1;;;;;58712:19:0;;;58704:65;;;;-1:-1:-1;;;58704:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58784:37;58793:3;58798:8;58808:12;:10;:12::i;:::-;58784:8;:37::i;:::-;58652:434;;;58854:13;58870:17;58878:8;58870:7;:17::i;:::-;58854:33;;58910:37;58927:5;58934:12;:10;:12::i;58910:37::-;58902:127;;;;-1:-1:-1;;;58902:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59044:30;59053:3;59058:8;59068:5;59044:8;:30::i;:::-;58652:434;;58569:524;;:::o;50448:237::-;48091:12;:10;:12::i;:::-;-1:-1:-1;;;;;48080:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48080:23:0;;48072:68;;;;;-1:-1:-1;;;48072:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;48072:68:0;;;;;;;;;;;;;;;50523:17:::1;50532:7;50523:8;:17::i;:::-;50515:64;;;;-1:-1:-1::0;;;50515:64:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;50599:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;;50592:23;;-1:-1:-1;;50592:23:0::1;::::0;;50628:11:::1;50626:13:::0;;-1:-1:-1;;50626:13:0;;;50655:22;;;;;;;::::1;::::0;;;;;;;;::::1;50448:237:::0;:::o;63221:639::-;46433:24;;;-1:-1:-1;;;46433:24:0;;;;;;;;;;;;63330:7;;63358:34;;63379:12;:10;:12::i;:::-;63358:7;:34::i;:::-;63350:112;;;;-1:-1:-1;;;63350:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63489:8;:15;63481:23;;63473:69;;;;-1:-1:-1;;;63473:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63553:28;63584:8;63593:5;63584:15;;;;;;;;;;;;;;;;;;;;;63614:22;;63584:15;;-1:-1:-1;;;;;;63614:22:0;:36;63610:197;;63705:12;:10;:12::i;:::-;-1:-1:-1;;;;;63675:42:0;:8;63684:5;63675:15;;;;;;;;;;;;;;;;;;;;;:26;-1:-1:-1;;;;;63675:26:0;:42;63667:128;;;;-1:-1:-1;;;63667:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63826:26;63832:3;63837:5;63844:7;63826:5;:26::i;:::-;63819:33;;;63221:639;;;;;;:::o;57222:100::-;57310:4;;57222:100;:::o;66313:175::-;66400:4;46598:41;66400:4;46626:12;:10;:12::i;46598:41::-;46590:93;;;;-1:-1:-1;;;46590:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66417:39:::1;66435:4;66442:3;66447:8;66417:9;:39::i;:::-;-1:-1:-1::0;66476:4:0::1;46694:1;66313:175:::0;;;;:::o;60137:317::-;60282:49;60301:12;:10;:12::i;:::-;60315:8;60325:5;60282:18;:49::i;:::-;60274:128;;;;-1:-1:-1;;;60274:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60415:31;60425:5;60432:3;60437:8;60415:9;:31::i;67485:106::-;67539:7;67566:17;:6;67576;67566:17;:9;:17;:::i;43026:114::-;43083:7;43110:12;;;;;;;;;;:22;;;;43026:114::o;43402:227::-;43494:6;:12;;;;;;;;;;:22;;;43486:45;;43518:12;:10;:12::i;43486:45::-;43478:105;;;;-1:-1:-1;;;43478:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43596:25;43607:4;43613:7;43596:10;:25::i;56290:856::-;-1:-1:-1;;;;;56509:12:0;;56457:7;56509:12;;;:6;:12;;;;;56457:7;;;56612:492;56640:11;56654:5;56665;56654:17;;;;;;;;;;-1:-1:-1;56690:8:0;;56686:99;;56719:50;56732:3;56726;:9;:36;;;;-1:-1:-1;56747:1:0;:8;;56740:16;;:21;56726:36;56719:50;;;56764:5;;;;;56719:50;;;56803:8;;;:22;;;56815:3;56822;56815:10;56803:22;56799:215;;;56852:1;56846:7;;56872;;;;;51918:2;56906:5;:24;56898:73;;;;-1:-1:-1;;;56898:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56990:8;;;56799:215;57039:6;57032:3;:13;57028:24;;;57047:5;;;57028:24;-1:-1:-1;57067:5:0;57087;;;;57067;56612:492;;;-1:-1:-1;57129:3:0;57121:11;;;:17;;-1:-1:-1;;56290:856:0;;;;:::o;55256:83::-;55305:5;55256:83;:::o;44611:209::-;44709:12;:10;:12::i;:::-;-1:-1:-1;;;;;44698:23:0;:7;-1:-1:-1;;;;;44698:23:0;;44690:83;;;;-1:-1:-1;;;44690:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44786:26;44798:4;44804:7;44786:11;:26::i;49415:::-;;;;:::o;70101:1925::-;70260:12;:10;:12::i;:::-;-1:-1:-1;;;;;70251:21:0;:5;-1:-1:-1;;;;;70251:21:0;;:62;;;;70276:37;70293:5;70300:12;:10;:12::i;70276:37::-;70243:129;;;;-1:-1:-1;;;70243:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70399:8;:15;70391:23;;70383:69;;;;-1:-1:-1;;;70383:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;70496:13:0;;;70465:28;70496:13;;;:6;:13;;;;;;70549:11;;;;;;;70602:8;:15;;70549:11;;70465:28;70611:5;;70602:15;;;;;;;;;;;;;:21;:15;;;;;:21;;-1:-1:-1;70602:15:0;;;70745:1119;70765:7;70752:10;:20;70745:1119;;;70789:70;51918:2;70796:5;:24;:54;;;;-1:-1:-1;70824:9:0;70839:5;70824:21;;;;;;;;;:26;70796:54;70789:70;;;70852:7;;;;;70789:70;;;51918:2;70882:5;:24;70874:73;;;;-1:-1:-1;;;70874:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70972:9;70987:5;70972:21;;;;;;;;;;-1:-1:-1;71016:7:0;71029:5;71016:19;;;;;;;;;;-1:-1:-1;71050:11:0;71080:773;71100:7;71087:10;:20;71080:773;;;71128:202;71141:3;71135;:9;71128:202;;;71184:1;:8;;71219:14;;;:19;;;;:56;;-1:-1:-1;71266:4:0;71242:9;71257:5;71242:21;;;;;;;;;:28;:33;;71219:56;71215:67;;;71277:5;;;71215:67;-1:-1:-1;71305:5:0;;71128:202;;;71352:3;71359;71352:10;71348:198;;;71411:7;71387:9;71402:5;71387:21;;;;;;;;:31;71463:5;71441:7;71454:5;71441:19;;;;;;;;:27;71491:7;;;;;71521:5;;71348:198;71590:3;71582:11;;:17;;71618:26;71629:5;71582:17;71618:10;:26::i;:::-;71663:12;71683:3;71678:1;:8;;71663:23;;71714:4;71705:13;;;;71749:4;71748:5;71737:16;;;;71798:7;71793:3;-1:-1:-1;;;;;71777:29:0;71786:5;-1:-1:-1;;;;;71777:29:0;-1:-1:-1;;;;;;;;;;;71777:29:0;;;;;;;;;71825:12;;;;;71080:773;;;;;70745:1119;;;;71898:7;71874:9;71889:5;71874:21;;;;;;;;:31;71938:5;71916:7;71929:5;71916:19;;;;;;;;:27;71954:24;:6;71965:3;71970:7;71954:24;:10;:24;:::i;:::-;71989:29;:6;72003:5;72010:7;71989:29;:13;:29;:::i;:::-;70101:1925;;;;;;;;;;;:::o;60525:191::-;60666:42;60683:5;60690:3;60695:8;60666:42;;;;;;;;;;;;:16;:42::i;67649:437::-;67703:31;67711:12;:10;:12::i;67703:31::-;67699:380;;;67751:32;67760:12;:10;:12::i;:::-;67774:8;67751;:32::i;:::-;67699:380;;;67816:13;67832:17;67840:8;67832:7;:17::i;:::-;67816:33;;67897:12;:10;:12::i;:::-;-1:-1:-1;;;;;67872:37:0;:21;67884:8;67872:11;:21::i;:::-;-1:-1:-1;;;;;67872:37:0;;:78;;;;67913:37;67930:5;67937:12;:10;:12::i;67913:37::-;67864:163;;;;-1:-1:-1;;;67864:163:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68042:25;68051:5;68058:8;68042;:25::i;67699:380::-;67649:437;:::o;61923:443::-;46598:41;40450:4;46626:12;:10;:12::i;46598:41::-;46590:93;;;;-1:-1:-1;;;46590:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62113:18;62105:71:::1;;;;-1:-1:-1::0;;;62105:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62189:17;;:::i;:::-;62217:14;::::0;::::1;:30:::0;;;62258:11:::1;::::0;::::1;:23:::0;;;62292:6:::1;::::0;;::::1;:14:::0;;;62317:5:::1;::::0;::::1;:12:::0;;;62342:8:::1;27:10:-1::0;;39:1:::1;23:18:::0;::::1;45:23:::0;;-1:-1;62342:16:0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;62342:16:0::1;-1:-1:-1::0;;;;;62342:16:0;;::::1;::::0;;;::::1;::::0;;;;;;62217:14;;62342:16:::1;::::0;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;62342:16:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;;:::i;:::-;-1:-1:-1::0;;;62342:16:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;46694:1;61923:443:::0;;;;:::o;52680:23::-;;;;:::o;61208:124::-;61263:4;-1:-1:-1;;61287:22:0;61300:8;61287:12;:22::i;:::-;:37;;;61208:124;-1:-1:-1;;61208:124:0:o;62499:252::-;46598:41;40450:4;46626:12;:10;:12::i;46598:41::-;46590:93;;;;-1:-1:-1;;;46590:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62630:1:::1;-1:-1:-1::0;;;;;62592:40:0::1;:8;62601:5;62592:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:26:::0;-1:-1:-1;;;;;62592:26:0::1;:40;62584:110;;;;-1:-1:-1::0;;;62584:110:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62736:7;62707:8;62716:5;62707:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:36:::0;;-1:-1:-1;;;;;;62707:36:0::1;-1:-1:-1::0;;;;;62707:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;62499:252:0:o;61396:98::-;46598:41;40450:4;46626:12;:10;:12::i;46598:41::-;46590:93;;;;-1:-1:-1;;;46590:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61468:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;66610:479::-:0;66675:7;66696:13;66711:12;66727:19;66737:8;66727:9;:19::i;:::-;66695:51;;;;66796:4;66761:6;:20;66768:12;:10;:12::i;:::-;-1:-1:-1;;;;;66761:20:0;;;;;;;;;;;;-1:-1:-1;66761:20:0;66787:5;66761:32;;;;;;;;;:39;:44;66757:69;;66814:12;:10;:12::i;:::-;66807:19;;;;;;66757:69;66842:9;66837:183;66861:15;:6;:13;:15::i;:::-;66857:1;:19;66837:183;;;66898:17;66918:12;:6;66928:1;66918:12;:9;:12;:::i;:::-;-1:-1:-1;;;;;66949:17:0;;;;;;:6;:17;;;;;66898:32;;-1:-1:-1;66981:4:0;;66972:5;66949:29;;;;;;;;;:36;:41;66945:63;;66999:9;-1:-1:-1;66992:16:0;;-1:-1:-1;;;66992:16:0;66945:63;-1:-1:-1;66878:3:0;;66837:183;;;;67030:51;;-1:-1:-1;;;67030:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52710:21;;;;;;;;;;;;;;;-1:-1:-1;;52710:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50201:104::-;48091:12;:10;:12::i;:::-;-1:-1:-1;;;;;48080:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48080:23:0;;48072:68;;;;;-1:-1:-1;;;48072:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;48072:68:0;;;;;;;;;;;;;;;50276:21:::1;50288:8;50276:11;:21::i;56088:118::-:0;56151:7;56178:20;:6;56193:4;56178:20;:14;:20;:::i;48511:148::-;48091:12;:10;:12::i;:::-;-1:-1:-1;;;;;48080:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48080:23:0;;48072:68;;;;;-1:-1:-1;;;48072:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;48072:68:0;;;;;;;;;;;;;;;48602:6:::1;::::0;48581:40:::1;::::0;48618:1:::1;::::0;-1:-1:-1;;;;;48602:6:0::1;::::0;48581:40:::1;::::0;48618:1;;48581:40:::1;48632:6;:19:::0;;-1:-1:-1;;;;;;48632:19:0::1;::::0;;48511:148::o;58141:366::-;58202:7;58237:4;;58226:8;:15;58222:249;;;58259:13;58274:12;58290:19;58300:8;58290:9;:19::i;:::-;58258:51;;-1:-1:-1;58258:51:0;-1:-1:-1;58329:9:0;58324:136;58348:8;:15;58344:19;;58324:136;;;58425:4;58393:8;58402:1;58393:11;;;;;;;;;;;;;;;;;;:17;;:22;;58416:5;58393:29;;;;;;;;;:36;:41;58389:55;;58443:1;-1:-1:-1;58436:8:0;;-1:-1:-1;;58436:8:0;58389:55;58365:3;;58324:136;;;;58222:249;;;-1:-1:-1;;;58141:366:0;;;:::o;47860:87::-;47933:6;;-1:-1:-1;;;;;47933:6:0;47860:87;:::o;42699:138::-;42772:7;42799:12;;;;;;;;;;:30;;42823:5;42799:30;:23;:30;:::i;41660:139::-;41729:4;41753:12;;;;;;;;;;:38;;41783:7;41753:38;:29;:38;:::i;55045:104::-;55121:20;;;;;;;;;;;;-1:-1:-1;;;55121:20:0;;;;55045:104;:::o;62870:110::-;46598:41;40450:4;46626:12;:10;:12::i;46598:41::-;46590:93;;;;-1:-1:-1;;;46590:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46433:24:::1;::::0;;-1:-1:-1;;;46433:24:0;;;;;;;;::::1;::::0;;;62937:35:::1;::::0;62961:10;62937::::1;:35::i;57611:448::-:0;57711:20;57746:17;57778;57810:18;57843;57876:17;57921;;:::i;:::-;57941:8;57950:7;57941:17;;;;;;;;;;;;;;;;;57921:37;;;;;;;;57941:17;;;;;;;57921:37;;-1:-1:-1;;;;;57921:37:0;;;;;;;;;;;;;-1:-1:-1;;57921:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57941:17;;57921:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57921:37:0;;;-1:-1:-1;;57921:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57921:37:0;;;;-1:-1:-1;;;57921:37:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;57921:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57921:37:0;;;;-1:-1:-1;;;57979:14:0;;;;57995:13;;;;58010:11;;;;58023:6;;;;58031:12;;58045:5;;;;;57979:14;;57995:13;;-1:-1:-1;58010:11:0;;-1:-1:-1;58023:6:0;-1:-1:-1;58031:12:0;;-1:-1:-1;58045:5:0;-1:-1:-1;57611:448:0;-1:-1:-1;;;57611:448:0:o;40405:49::-;40450:4;40405:49;:::o;59454:302::-;59572:12;:10;:12::i;:::-;-1:-1:-1;;;;;59559:25:0;:9;-1:-1:-1;;;;;59559:25:0;;;59551:63;;;;;-1:-1:-1;;;59551:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59673:9;59627:18;:32;59646:12;:10;:12::i;:::-;-1:-1:-1;;;;;59627:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;59627:32:0;;;:43;;;;;;;;;;;;:55;;-1:-1:-1;;59627:55:0;;;;;;;;;;;59713:12;:10;:12::i;:::-;59698:50;;;;;;;;;;-1:-1:-1;;;;;59698:50:0;;;;;;;;;;;;;;59454:302;;:::o;49660:104::-;-1:-1:-1;;;;;49740:16:0;49716:4;49740:16;;;:7;:16;;;;;;;;;49660:104::o;55435:165::-;55500:4;55517:75;;-1:-1:-1;;;55517:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67382:95;67427:7;67454:15;:6;:13;:15::i;:::-;67447:22;;67382:95;:::o;60787:361::-;60965:49;60984:12;:10;:12::i;:::-;60998:8;61008:5;60965:18;:49::i;:::-;60957:128;;;;-1:-1:-1;;;60957:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61098:42;61112:5;61119:3;61124:8;61134:5;61098:13;:42::i;:::-;60787:361;;;;:::o;63868:775::-;46433:24;;;-1:-1:-1;;;46433:24:0;;;;;;;;;;;;63980:34;;64001:12;:10;:12::i;63980:34::-;63972:112;;;;-1:-1:-1;;;63972:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64103:28;;;64095:84;;;;-1:-1:-1;;;64095:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64206:8;:15;64198:23;;64190:69;;;;-1:-1:-1;;;64190:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64270:28;64301:8;64310:5;64301:15;;;;;;;;;;;;;;;;;;;;;64331:22;;64301:15;;-1:-1:-1;;;;;;64331:22:0;:36;64327:197;;64422:12;:10;:12::i;:::-;-1:-1:-1;;;;;64392:42:0;:8;64401:5;64392:15;;;;;;;;;;;;;;;;;;;;;:26;-1:-1:-1;;;;;64392:26:0;:42;64384:128;;;;-1:-1:-1;;;64384:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64541:9;64536:100;64556:14;;;64536:100;;;64592:32;64598:3;;64602:1;64598:6;;;;;;;;;;;;;-1:-1:-1;;;;;64598:6:0;64606:5;64613:7;;64621:1;64613:10;;;;;;;;;;;;;64592:5;:32::i;:::-;-1:-1:-1;64572:3:0;;64536:100;;;;63868:775;;;;;;:::o;55706:299::-;55774:13;55800:11;55814:22;55827:8;55814:12;:22::i;:::-;55800:36;;-1:-1:-1;;55855:3:0;:18;;55847:78;;;;-1:-1:-1;;;55847:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55969:7;55978:8;55987:3;55978:13;;;;;;;;;;;;;;;;;;:17;;55952:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55952:44:0;;;-1:-1:-1;;26:21;;;22:32;6:49;;55952:44:0;;;;55706:299;-1:-1:-1;;;;;;55706:299:0:o;41973:127::-;42036:7;42063:12;;;;;;;;;;:29;;:27;:29::i;49899:165::-;48091:12;:10;:12::i;:::-;-1:-1:-1;;;;;48080:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48080:23:0;;48072:68;;;;;-1:-1:-1;;;48072:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;48072:68:0;;;;;;;;;;;;;;;49986:16:::1;::::0;;50000:1:::1;49986:16:::0;;;;;::::1;::::0;;;49963:20:::1;::::0;49986:16:::1;::::0;;::::1;::::0;;105:10:-1::1;49986:16:0::0;88:34:-1::1;136:17;::::0;-1:-1;49986:16:0::1;49963:39;;50022:7;50013:3;50017:1;50013:6;;;;;;;;;;;;;:16;-1:-1:-1::0;;;;;50013:16:0::1;;;-1:-1:-1::0;;;;;50013:16:0::1;;;::::0;::::1;50040;50052:3;50040:11;:16::i;46395:62::-:0;46433:24;;;-1:-1:-1;;;46433:24:0;;;;;;;;;;;;46395:62;:::o;43874:230::-;43967:6;:12;;;;;;;;;;:22;;;43959:45;;43991:12;:10;:12::i;43959:45::-;43951:106;;;;-1:-1:-1;;;43951:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67174:200;67244:4;67262:13;67277:12;67293:19;67303:8;67293:9;:19::i;:::-;-1:-1:-1;;;;;67330:12:0;;;;;;:6;:12;;;;;67261:51;;-1:-1:-1;67261:51:0;-1:-1:-1;67261:51:0;;;67330:24;;;;;;;;;:31;:36;;;67174:200;-1:-1:-1;;;;;67174:200:0:o;59827:243::-;-1:-1:-1;;;;;60025:26:0;;;59996:4;60025:26;;;:18;:26;;;;;;;;:37;;;;;;;;;;;;;;;59827:243::o;48814:244::-;48091:12;:10;:12::i;:::-;-1:-1:-1;;;;;48080:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48080:23:0;;48072:68;;;;;-1:-1:-1;;;48072:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;48072:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48903:22:0;::::1;48895:73;;;;-1:-1:-1::0;;;48895:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49005:6;::::0;48984:38:::1;::::0;-1:-1:-1;;;;;48984:38:0;;::::1;::::0;49005:6:::1;::::0;48984:38:::1;::::0;49005:6:::1;::::0;48984:38:::1;49033:6;:17:::0;;-1:-1:-1;;;;;;49033:17:0::1;-1:-1:-1::0;;;;;49033:17:0;;;::::1;::::0;;;::::1;::::0;;48814:244::o;38301:106::-;38389:10;38301:106;:::o;72334:251::-;72457:1;72420:25;;;:15;:25;;;;;;-1:-1:-1;;;;;72420:25:0;:39;72416:162;;72483:25;;;;:15;:25;;;;;;72476:32;;-1:-1:-1;;;;;;72476:32:0;;;72528:38;72499:8;;72483:25;-1:-1:-1;;;;;72528:38:0;;;;;72483:25;;72528:38;72334:251;;:::o;18713:617::-;-1:-1:-1;;;;;18811:15:0;;18795:13;18811:15;;;;;;;;;;;18841:10;18837:486;;18868:7;;;18837:486;18921:4;-1:-1:-1;;;;;18897:5:0;:20;18896:29;18892:431;;;18975:1;19006:9;;:16;;-1:-1:-1;;18968:3:0;18959:12;;;18958:18;;;19006:20;;;;18942:13;;19006:9;:20;;19076:15;;;;;;;;;;;;;;;;;19057:9;;:16;;-1:-1:-1;;;;;19076:15:0;;;;19067:5;;19057:16;;;;;;;;;;;;;;;;;:34;;-1:-1:-1;;;;;19057:34:0;;-1:-1:-1;;;;;;19057:34:0;;;;;;;;19126:16;;;;;;;;;;-1:-1:-1;;;;;19126:31:0;19057:34;19163:9;;;19177:3;19162:18;19125:56;;;;19106:75;;;19196:9;;:15;;19057:34;;-1:-1:-1;19196:9:0;:15;;;;;;;;;;;;;;;-1:-1:-1;;19196:15:0;;;;;-1:-1:-1;;;;;;19196:15:0;;;;;;;;;-1:-1:-1;;;;;19233:15:0;;;;;;;;;;19226:22;-1:-1:-1;18892:431:0;;-1:-1:-1;;18892:431:0;;-1:-1:-1;;;;;19281:15:0;;:9;:15;;;;;;;;;;19299:12;;;19281:30;;18713:617;;;;:::o;72147:179::-;72240:25;;;;:15;:25;;;;;;:31;;-1:-1:-1;;;;;;72240:31:0;-1:-1:-1;;;;;72240:31:0;;;;;;;;;72287;;72240:25;;72287:31;;;;;;;72147:179;;;:::o;64651:1416::-;64763:7;-1:-1:-1;;;;;64791:17:0;;64783:62;;;;;-1:-1:-1;;;64783:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64889:11:0;;64858:28;64889:11;;;:6;:11;;;;;64942:8;:15;;64889:11;;64858:28;64951:5;;64942:15;;;;;;;;;;;;;;;;:21;;64911:52;;64974:15;64992:4;;64974:22;;65008:13;65023:12;65039:18;65049:7;65039:9;:18::i;:::-;65007:50;;-1:-1:-1;65007:50:0;-1:-1:-1;65068:15:0;65086:9;65007:50;65086:21;;;;;;;;;;-1:-1:-1;65118:15:0;65136:9;65151:5;65136:21;;;;;;;;;65118:39;;65168:509;65185:4;;:17;;65194:7;65185:17;:8;:17;:::i;:::-;65175:7;:27;65168:509;;;65288:1;65279:10;;;;65219:15;;;;65249;65308:9;65304:284;;65345:1;;-1:-1:-1;65389:7:0;65365:9;65380:5;65365:21;;;;;;;;:31;65439:7;65415:9;65430:5;65415:21;;;;;;;;:31;65465:7;;;;;65501:9;65465:7;65501:21;;;;;;;;;;-1:-1:-1;65551:9:0;65566:5;65551:21;;;;;;;;;65541:31;;65304:284;65607:34;;65633:7;;-1:-1:-1;;;;;65607:34:0;;;65624:1;;-1:-1:-1;;;;;;;;;;;65607:34:0;65624:1;;65607:34;65656:9;;;;;65168:509;;;65687:4;:14;;;65736:7;65712:9;65727:5;65712:21;;;;;;;;:31;65778:7;65754:9;65769:5;65754:21;;;;;;;;:31;;;;65826:40;65858:7;65826:8;65835:5;65826:15;;;;;;;;;;;;;;;;;;:27;;;:31;;:40;;;;:::i;:::-;65796:8;65805:5;65796:15;;;;;;;;;;;;;;;;:27;:15;;;;;:27;:70;65877:24;:6;65888:3;65893:7;65877:24;:10;:24;:::i;:::-;65951:8;65960:5;65951:15;;;;;;;;;;;;;;;;;;:25;;;65920:8;65929:5;65920:15;;;;;;;;;;;;;;;;;;:27;;;:56;;65912:123;;;;-1:-1:-1;;;65912:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66055:4:0;;;64651:1416;-1:-1:-1;;;;;;;;;64651:1416:0:o;73403:654::-;73538:24;73546:5;73553:8;73538:7;:24::i;:::-;73530:78;;;;-1:-1:-1;;;73530:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;73627:17:0;;73619:66;;;;-1:-1:-1;;;73619:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73750:37;73767:1;73771:8;73781:5;73750:8;:37::i;:::-;73801:13;73816:12;73832:19;73842:8;73832:9;:19::i;:::-;-1:-1:-1;;;;;73862:13:0;;;;;;:6;:13;;;;;73800:51;;-1:-1:-1;73800:51:0;-1:-1:-1;73891:5:0;;;73800:51;73862:25;;;;;;;;:34;;;;;;;-1:-1:-1;;;;;73907:11:0;;73862:25;73907:11;;;:6;:11;;;;;73934:4;;73924:5;73907:23;;;;;;;;:31;;;;;;;73949:18;:6;73960:3;-1:-1:-1;73949:18:0;:10;:18;:::i;:::-;73978:23;:6;73992:5;73999:1;73978:23;:13;:23;:::i;:::-;74040:8;74035:3;-1:-1:-1;;;;;74019:30:0;74028:5;-1:-1:-1;;;;;74019:30:0;-1:-1:-1;;;;;;;;;;;74019:30:0;;;;;;;;;73403:654;;;;;:::o;76200:347::-;76381:4;76423:6;-1:-1:-1;;;;;76411:18:0;:8;-1:-1:-1;;;;;76411:18:0;;:72;;;;76475:8;-1:-1:-1;;;;;76450:33:0;:21;76462:8;76450:11;:21::i;:::-;-1:-1:-1;;;;;76450:33:0;;76411:72;:127;;;;76504:34;76521:6;76529:8;76504:16;:34::i;:::-;76403:136;76200:347;-1:-1:-1;;;;76200:347:0:o;19453:120::-;19521:7;19548:4;:9;;19558:6;19548:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19548:17:0;;19453:120;-1:-1:-1;;;19453:120:0:o;45854:188::-;45928:6;:12;;;;;;;;;;:33;;45953:7;45928:33;:24;:33;:::i;:::-;45924:111;;;46010:12;:10;:12::i;:::-;-1:-1:-1;;;;;45983:40:0;46001:7;-1:-1:-1;;;;;45983:40:0;45995:4;45983:40;;;;;;;;;;45854:188;;:::o;46050:192::-;46125:6;:12;;;;;;;;;;:36;;46153:7;46125:36;:27;:36;:::i;:::-;46121:114;;;46210:12;:10;:12::i;:::-;-1:-1:-1;;;;;46183:40:0;46201:7;-1:-1:-1;;;;;46183:40:0;46195:4;46183:40;;;;;;;;;;46050:192;;:::o;18148:557::-;-1:-1:-1;;;;;18243:15:0;;18227:13;18243:15;;;;;;;;;;;18273:10;18269:429;;18300:9;;;;27:10:-1;;23:18;;;45:23;;-1:-1;18300:20:0;;;;;;;;;-1:-1:-1;;;;;;18300:20:0;-1:-1:-1;;;;;18300:20:0;;;;;18343:8;;;;;:32;;;-1:-1:-1;;;;;18355:4:0;:20;;18343:32;18335:65;;;;;-1:-1:-1;;;18335:65:0;;;;;;;;;;;;-1:-1:-1;;;18335:65:0;;;;;;;;;;;;;;;18469:1;18434:9;;:16;-1:-1:-1;;;;;18415:15:0;;:9;:15;;;;;;;;;;18454:3;18434:23;;;;18433:38;;-1:-1:-1;;18433:38:0;18415:56;;18269:429;;;18521:12;;;18557:14;;;18556:66;;;;;-1:-1:-1;;;;;18602:4:0;-1:-1:-1;;;;;18578:5:0;:20;18577:29;:44;18556:66;18548:99;;;;;-1:-1:-1;;;18548:99:0;;;;;;;;;;;;-1:-1:-1;;;18548:99:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18662:15:0;;:9;:15;;;;;;;;;;:24;18148:557;;;;:::o;72675:520::-;72754:13;72769:12;72785:19;72795:8;72785:9;:19::i;:::-;-1:-1:-1;;;;;72823:12:0;;;;;;:6;:12;;;;;72753:51;;-1:-1:-1;72753:51:0;-1:-1:-1;72753:51:0;;;72823:24;;;;;;;;;:31;72815:58;;;;;-1:-1:-1;;;72815:58:0;;;;;;;;;;;;-1:-1:-1;;;72815:58:0;;;;;;;;;;;;;;;72886:26;72897:4;72903:8;72886:10;:26::i;:::-;-1:-1:-1;;;;;72948:12:0;;;;;;:6;:12;;;;;72932:5;;;;;72966;72948:24;;;;;;;;:32;;;;;;;:24;72991:110;73015:8;:15;73011:19;;72991:110;;;73085:4;73052:8;73061:1;73052:11;;;;;;;;;;;;;;;;;;:17;;:22;;73075:5;73052:29;;;;;;;;:37;;;;;;;-1:-1:-1;73032:3:0;72991:110;;;-1:-1:-1;73111:22:0;:6;73125:4;73131:1;73111:22;:13;:22;:::i;:::-;73151:36;;73178:8;;73174:1;;-1:-1:-1;;;;;73151:36:0;;;-1:-1:-1;;;;;;;;;;;73151:36:0;73174:1;;73151:36;72675:520;;;;:::o;76555:248::-;76674:3;76663:14;;76615:13;51918:2;76696:24;;76688:59;;;;;-1:-1:-1;;;76688:59:0;;;;;;;;;;;;-1:-1:-1;;;76688:59:0;;;;;;;;;;;;;;;76790:3;76779:8;:14;76773:1;:21;;76758:37;;76555:248;;;:::o;19338:107::-;19421:9;;:16;;19338:107::o;50693:372::-;50773:15;;50761:9;50799:218;50823:1;50819;:5;50799:218;;;50855:21;50864:8;50873:1;50864:11;;;;;;;;;;;;;;50855:8;:21::i;:::-;50854:22;50846:71;;;;-1:-1:-1;;;50846:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50957:4;50934:7;:20;50942:8;50951:1;50942:11;;;;;;;;;;;;;;-1:-1:-1;;;;;50934:20:0;-1:-1:-1;;;;;50934:20:0;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;50981:24;50993:8;51002:1;50993:11;;;;;;;;;;;;;;50981:24;;;;-1:-1:-1;;;;;50981:24:0;-1:-1:-1;;;;;50981:24:0;;;;;;;;;;;;;;;50826:3;;50799:218;;;-1:-1:-1;;51042:15:0;51027:11;:30;;;;;;;50693:372::o;19581:211::-;-1:-1:-1;;;;;19689:16:0;;19653:7;19689:16;;;;;;;;;;;19720:10;19716:24;;19739:1;19732:8;;;;;19716:24;-1:-1:-1;;;;;19759:5:0;:20;19783:1;19758:26;19751:33;;;19581:211;;;;:::o;27782:158::-;27856:7;27907:22;27911:3;27923:5;27907:3;:22::i;27068:167::-;27148:4;27172:55;27182:3;-1:-1:-1;;;;;27202:23:0;;27172:9;:55::i;74421:361::-;74581:31;74591:5;74598:3;74603:8;74581:9;:31::i;:::-;74645:51;74668:5;74675:3;74680:8;74690:5;74645:22;:51::i;:::-;74623:151;;;;-1:-1:-1;;;74623:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27321:117;27384:7;27411:19;27419:3;27411:7;:19::i;5594:179::-;5652:7;5684:5;;;5708:6;;;;5700:46;;;;;-1:-1:-1;;;5700:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26496:152;26566:4;26590:50;26595:3;-1:-1:-1;;;;;26615:23:0;;26590:4;:50::i;26824:158::-;26897:4;26921:53;26929:3;-1:-1:-1;;;;;26949:23:0;;26921:7;:53::i;24448:204::-;24543:18;;24515:7;;24543:26;-1:-1:-1;24535:73:0;;;;-1:-1:-1;;;24535:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24626:3;:11;;24638:5;24626:18;;;;;;;;;;;;;;;;24619:25;;24448:204;;;;:::o;23780:129::-;23853:4;23877:19;;;:12;;;;;:19;;;;;;:24;;;23780:129::o;75350:751::-;75508:4;75530:16;:3;-1:-1:-1;;;;;75530:14:0;;:16::i;:::-;75525:61;;-1:-1:-1;75570:4:0;75563:11;;75525:61;75596:23;75635:353;-1:-1:-1;;;75784:12:0;:10;:12::i;:::-;75819:5;75847:8;75878:5;75670:232;;;;;;-1:-1:-1;;;;;75670:232:0;-1:-1:-1;;;;;75670:232:0;;;;;;-1:-1:-1;;;;;75670:232:0;-1:-1:-1;;;;;75670:232:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;75670:232:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;75670:232:0;;;;-1:-1:-1;;;;;75670:232:0;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;75670:232:0;75635:353;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;75635:16:0;;;:353;;:16;:353;:::i;:::-;75596:392;;75999:13;76026:10;76015:32;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76015:32:0;-1:-1:-1;;;;;;76066:26:0;-1:-1:-1;;;76066:26:0;;-1:-1:-1;;;75350:751:0;;;;;;:::o;23995:109::-;24078:18;;23995:109::o;21560:414::-;21623:4;21645:21;21655:3;21660:5;21645:9;:21::i;:::-;21640:327;;-1:-1:-1;27:10;;39:1;23:18;;;45:23;;21683:11:0;:23;;;;;;;;;;;;;21866:18;;21844:19;;;:12;;;:19;;;;;;:40;;;;21899:11;;21640:327;-1:-1:-1;21950:5:0;21943:12;;22150:1544;22216:4;22355:19;;;:12;;;:19;;;;;;22391:15;;22387:1300;;22826:18;;-1:-1:-1;;22777:14:0;;;;22826:22;;;;22753:21;;22826:3;;:22;;23113;;;;;;;;;;;;;;23093:42;;23259:9;23230:3;:11;;23242:13;23230:26;;;;;;;;;;;;;;;;;;;:38;;;;23336:23;;;23378:1;23336:12;;;:23;;;;;;23362:17;;;23336:43;;23488:17;;23336:3;;23488:17;;;;;;;;;;;;;;;;;;;;;;23583:3;:12;;:19;23596:5;23583:19;;;;;;;;;;;23576:26;;;23626:4;23619:11;;;;;;;;22387:1300;23670:5;23663:12;;;;;30367:422;30734:20;30773:8;;;30367:422::o;33285:195::-;33388:12;33420:52;33442:6;33450:4;33456:1;33459:12;33388;34589:18;34600:6;34589:10;:18::i;:::-;34581:60;;;;;-1:-1:-1;;;34581:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34715:12;34729:23;34756:6;-1:-1:-1;;;;;34756:11:0;34776:5;34784:4;34756:33;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;34756:33:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;34714:75:0;;;;34807:52;34825:7;34834:10;34846:12;34807:17;:52::i;:::-;34800:59;34337:530;-1:-1:-1;;;;;;;34337:530:0:o;36877:742::-;36992:12;37021:7;37017:595;;;-1:-1:-1;37052:10:0;37045:17;;37017:595;37166:17;;:21;37162:439;;37429:10;37423:17;37490:15;37477:10;37473:2;37469:19;37462:44;37377:148;37572:12;37565:20;;-1:-1:-1;;;37565:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37565:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51564:25242;;;;;;;;;;-1:-1:-1;;;;;51564:25242:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51564:25242:0;;;-1:-1:-1;51564:25242:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;51564:25242:0;;;-1:-1:-1;;51564:25242:0:o
Swarm Source
ipfs://02cc14953b7f5b7f217e6fe83685b08111a4dd6404a31a92641d42004805e94e
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.