Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 61 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 17116955 | 532 days ago | IN | 0 ETH | 0.00354819 | ||||
Transfer From | 14495859 | 921 days ago | IN | 0 ETH | 0.0042003 | ||||
Withdraw | 14263424 | 957 days ago | IN | 0 ETH | 0.00856861 | ||||
Set Approval For... | 14241127 | 960 days ago | IN | 0 ETH | 0.00085609 | ||||
Transfer From | 14000347 | 998 days ago | IN | 0 ETH | 0.03778698 | ||||
Set Approval For... | 13976320 | 1001 days ago | IN | 0 ETH | 0.00644642 | ||||
Set Approval For... | 13943119 | 1006 days ago | IN | 0 ETH | 0.00577069 | ||||
Mint | 13901643 | 1013 days ago | IN | 0.06 ETH | 0.02306014 | ||||
Mint | 13882202 | 1016 days ago | IN | 0.03 ETH | 0.00737941 | ||||
Mint | 13882184 | 1016 days ago | IN | 0.09 ETH | 0.01111138 | ||||
Mint | 13881897 | 1016 days ago | IN | 0.09 ETH | 0.01218471 | ||||
Set Approval For... | 13877584 | 1017 days ago | IN | 0 ETH | 0.003044 | ||||
Set Approval For... | 13870299 | 1018 days ago | IN | 0 ETH | 0.00266672 | ||||
Mint | 13869334 | 1018 days ago | IN | 0.09 ETH | 0.02169293 | ||||
Set Approval For... | 13868351 | 1018 days ago | IN | 0 ETH | 0.00275973 | ||||
Set Approval For... | 13868279 | 1018 days ago | IN | 0 ETH | 0.00180929 | ||||
Set Approval For... | 13867976 | 1018 days ago | IN | 0 ETH | 0.00210772 | ||||
Mint | 13867946 | 1018 days ago | IN | 0.06 ETH | 0.00827577 | ||||
Mint | 13867933 | 1018 days ago | IN | 0.03 ETH | 0.00563459 | ||||
Set Approval For... | 13867277 | 1018 days ago | IN | 0 ETH | 0.00306321 | ||||
Set Approval For... | 13866942 | 1018 days ago | IN | 0 ETH | 0.00221359 | ||||
Set Base URI | 13866902 | 1018 days ago | IN | 0 ETH | 0.00216703 | ||||
Withdraw | 13866893 | 1018 days ago | IN | 0 ETH | 0.01074739 | ||||
Transfer From | 13862908 | 1019 days ago | IN | 0 ETH | 0.01045661 | ||||
Transfer From | 13862898 | 1019 days ago | IN | 0 ETH | 0.00632737 |
Loading...
Loading
Contract Name:
GTClub2021
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-09 */ // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.0 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: https://github.com/1001-digital/erc721-extensions/blob/main/contracts/WithLimitedSupply.sol pragma solidity ^0.8.0; /// @author 1001.digital /// @title A token tracker that limits the token supply and increments token IDs on each new mint. abstract contract WithLimitedSupply { using Counters for Counters.Counter; // Keeps track of how many we have minted Counters.Counter private _tokenCount; /// @dev The maximum count of tokens this token tracker will hold. uint256 private _totalSupply; /// Instanciate the contract /// @param totalSupply_ how many tokens this collection should hold constructor (uint256 totalSupply_) { _totalSupply = totalSupply_; } /// @dev Get the max Supply /// @return the maximum token count function totalSupply() public view returns (uint256) { return _totalSupply; } /// @dev Get the current token count /// @return the created token count function tokenCount() public view returns (uint256) { return _tokenCount.current(); } /// @dev Check whether tokens are still available /// @return the available token count function availableTokenCount() public view returns (uint256) { return totalSupply() - tokenCount(); } /// @dev Increment the token count and fetch the latest count /// @return the next token id function nextToken() internal virtual ensureAvailability returns (uint256) { uint256 token = _tokenCount.current(); _tokenCount.increment(); return token; } /// @dev Check whether another token is still available modifier ensureAvailability() { require(availableTokenCount() > 0, "No more tokens available"); _; } /// @param amount Check whether number of tokens are still available /// @dev Check whether tokens are still available modifier ensureAvailabilityFor(uint256 amount) { require(availableTokenCount() >= amount, "Requested number of tokens not available"); _; } } // File: https://github.com/1001-digital/erc721-extensions/blob/main/contracts/RandomlyAssigned.sol pragma solidity ^0.8.0; /// @author 1001.digital /// @title Randomly assign tokenIDs from a given set of tokens. abstract contract RandomlyAssigned is WithLimitedSupply { // Used for random index assignment mapping(uint256 => uint256) private tokenMatrix; // The initial token ID uint256 private startFrom; /// Instanciate the contract /// @param _totalSupply how many tokens this collection should hold /// @param _startFrom the tokenID with which to start counting constructor (uint256 _totalSupply, uint256 _startFrom) WithLimitedSupply(_totalSupply) { startFrom = _startFrom; } /// Get the next token ID /// @dev Randomly gets a new token ID and keeps track of the ones that are still available. /// @return the next token ID function nextToken() internal override ensureAvailability returns (uint256) { uint256 maxIndex = totalSupply() - tokenCount(); uint256 random = uint256(keccak256( abi.encodePacked( msg.sender, block.coinbase, block.difficulty, block.gaslimit, block.timestamp ) )) % maxIndex; uint256 value = 0; if (tokenMatrix[random] == 0) { // If this matrix position is empty, set the value to the generated random number. value = random; } else { // Otherwise, use the previously stored number from the matrix. value = tokenMatrix[random]; } // If the last available tokenID is still unused... if (tokenMatrix[maxIndex - 1] == 0) { // ...store that ID in the current matrix position. tokenMatrix[random] = maxIndex - 1; } else { // ...otherwise copy over the stored number to the current matrix position. tokenMatrix[random] = tokenMatrix[maxIndex - 1]; } // Increment counts super.nextToken(); return value + startFrom; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/finance/PaymentSplitter.sol // OpenZeppelin Contracts v4.4.0 (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); uint256 payment = _pendingPayment(account, totalReceived, released(token, account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: GentleTiger.sol // ##### ####### # # ####### # ####### ####### ### ##### ####### ###### ##### # # # ###### // # # # ## # # # # # # # # # # # # # # # # # # // # # # # # # # # # # # # # # # # # # # # // # #### ##### # # # # # ##### # # # #### ##### ###### # # # # ###### // # # # # # # # # # # # # # # # # # # # # # # // # # # # ## # # # # # # # # # # # # # # # # # // ##### ####### # # # ####### ####### # ### ##### ####### # # ##### ####### ##### ###### // // // ##### ####### ##### # # ####### ####### // # # # # # ## # # # // # # # # # # # # // # #### # # # # # ##### # // # # # # # # # # # // # # # # # # ## # # // ##### # ##### # # # # // ####### //SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract GTClub2021 is ERC721, Ownable, PaymentSplitter, RandomlyAssigned { using Strings for uint256; using SafeMath for uint256; uint256 public NftCount; uint256 public CurrentPrice; uint256 public MAX_MINT_NOW; uint256 public PreSale_Price = 0.03 ether; uint256 public Sale_Price = 0.07 ether; uint256 public FinalSale_Price = 0.11 ether; uint256 public constant PreSaleNum = 2000; uint256 public constant SaleNum = 5500; uint256 public constant Save_NFT = 25; uint256 public constant Reserv_NFT = 975; uint256 public constant Collection_Size = 10000; uint256 public PRESALE_BY_MINT = 3; uint256 public SALE_BY_MINT = 5; uint256 public currentSupply = 0; string public baseURI; uint256 public SalePause = 1; address public royaltyAddr; uint256 public royaltyBasis; address[] private payeeAddresses = [ 0xA6D0AA144CF5dDdfF125A13132C1b289ADCf1308, 0x13B91354327e33986A45d6C14a9B43E278aBE7C0, 0x3e634cba297081A6888C8cc9ddA7de945bD265D4 ]; uint256[] private payeeShares = [ 80, 10, 10 ]; constructor() ERC721("Gentle Tiger Club", "GTC_NFT") PaymentSplitter(payeeAddresses, payeeShares) RandomlyAssigned(Collection_Size, 1) { for (uint256 a = 1; a <= Save_NFT; a++) { mint(msg.sender, 1); } } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function setBaseURI(string memory _uri) public onlyOwner { baseURI = _uri; } function mint (address _to, uint256 _count) public payable { if (msg.sender != owner()) { require( SalePause < 1, "YOU CAN'T MINT NOW, SALE IS PAUSED"); require( tokenCount() + _count <= totalSupply() - Reserv_NFT, "YOU CAN'T MINT MORE THAN MAXIMUM SUPPLY"); require( availableTokenCount() - Reserv_NFT - _count >= 0, "YOU CAN'T MINT MORE THAN AVALABLE TOKEN COUNT"); require( tx.origin == msg.sender, "CANNOT MINT THROUGH A CUSTOM CONTRACT"); if (tokenCount() <= PreSaleNum + Save_NFT) { CurrentPrice = PreSale_Price * _count; MAX_MINT_NOW = PRESALE_BY_MINT; } else if (tokenCount() <= SaleNum + PreSaleNum + Save_NFT && tokenCount() > PreSaleNum + Save_NFT) { CurrentPrice = Sale_Price * _count; MAX_MINT_NOW = SALE_BY_MINT; } else if (tokenCount() > SaleNum + PreSaleNum + Save_NFT){ CurrentPrice = FinalSale_Price * _count; MAX_MINT_NOW = SALE_BY_MINT; } require(_count <= MAX_MINT_NOW, "Exceeds number"); require(msg.value >= CurrentPrice, "Not enough Ether provided."); } else { require( tokenCount() + _count <= totalSupply(), "YOU CAN'T MINT MORE THAN MAXIMUM SUPPLY"); require( availableTokenCount() - _count >= 0, "YOU CAN'T MINT MORE THAN AVALABLE TOKEN COUNT"); } for (uint256 bb = 1; bb <= _count; bb++) { uint256 id = nextToken(); _safeMint(_to, id); currentSupply++; } } function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount){ return (royaltyAddr, _salePrice.mul(royaltyBasis).div(10000)); } function setRoyalty(address _royaltyAddr, uint256 _royaltyBasis) public onlyOwner { royaltyAddr = _royaltyAddr; royaltyBasis = _royaltyBasis; } function setPause(uint256 _SetSalePause) public onlyOwner { SalePause = _SetSalePause; } function ChangePrice(string memory _PriceType, uint256 _NewPrice) public onlyOwner { if(keccak256(abi.encodePacked((_PriceType))) == keccak256(abi.encodePacked(("PreSale")))){ PreSale_Price = _NewPrice; } else if(keccak256(abi.encodePacked((_PriceType))) == keccak256(abi.encodePacked(("Sale")))){ Sale_Price = _NewPrice; } else if(keccak256(abi.encodePacked((_PriceType))) == keccak256(abi.encodePacked(("FinalSale")))){ FinalSale_Price = _NewPrice; } } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistant token"); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), ".json")) : ""; } function withdraw() external onlyOwner { require(address(this).balance > 0, "No balance to withdraw."); for (uint256 i = 0; i < payeeAddresses.length; i++) { release(payable(payee(i))); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":[{"internalType":"string","name":"_PriceType","type":"string"},{"internalType":"uint256","name":"_NewPrice","type":"uint256"}],"name":"ChangePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Collection_Size","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FinalSale_Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_NOW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NftCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_BY_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PreSaleNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PreSale_Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Reserv_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_BY_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SaleNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SalePause","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Sale_Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Save_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyBasis","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_SetSalePause","type":"uint256"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddr","type":"address"},{"internalType":"uint256","name":"_royaltyBasis","type":"uint256"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCount","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":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
666a94d74f43000060155566f8b0a10e470000601655670186cc6acd4b00006017556003601881905560056019556000601a556001601c5560e060405273a6d0aa144cf5dddff125a13132c1b289adcf130860809081527313b91354327e33986a45d6c14a9b43e278abe7c060a052733e634cba297081a6888c8cc9dda7de945bd265d460c0526200009591601f919062000ca6565b506040805160608101825260508152600a602080830182905292820152620000c09190600362000d10565b50348015620000ce57600080fd5b50612710600181601f8054806020026020016040519081016040528092919081815260200182805480156200012d57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116200010e575b505050505060208054806020026020016040519081016040528092919081815260200182805480156200018057602002820191906000526020600020905b8154815260200190600101908083116200016b575b5050604080518082018252601181527023b2b73a3632902a34b3b2b91021b63ab160791b60208083019182528351808501909452600784526611d510d7d3919560ca1b908401528151919550919350620001df92506000919062000d53565b508051620001f590600190602084019062000d53565b505050620002126200020c6200032660201b60201c565b6200032a565b80518251146200023f5760405162461bcd60e51b8152600401620002369062001159565b60405180910390fd5b6000825111620002635760405162461bcd60e51b8152600401620002369062001238565b60005b8251811015620002e757620002d28382815181106200029557634e487b7160e01b600052603260045260246000fd5b6020026020010151838381518110620002be57634e487b7160e01b600052603260045260246000fd5b60200260200101516200037c60201b60201c565b80620002de816200133a565b91505062000266565b505050600f556011555060015b601981116200031f576200030a336001620004ae565b8062000316816200133a565b915050620002f4565b506200138f565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620003a55760405162461bcd60e51b8152600401620002369062000f91565b60008111620003c85760405162461bcd60e51b815260040162000236906200126f565b6001600160a01b03821660009081526009602052604090205415620004015760405162461bcd60e51b81526004016200023690620011ed565b600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b03841690811790915560009081526009602052604090208190556007546200046b908290620012a6565b6007556040517f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac90620004a2908490849062000ec7565b60405180910390a15050565b620004b8620007cf565b6001600160a01b0316336001600160a01b031614620006fb576001601c5410620004f65760405162461bcd60e51b81526004016200023690620011ab565b6103cf62000503620007de565b6200050f9190620012e3565b816200051a620007e4565b620005269190620012a6565b1115620005475760405162461bcd60e51b81526004016200023690620010dd565b6000816103cf6200055762000802565b620005639190620012e3565b6200056f9190620012e3565b1015620005905760405162461bcd60e51b8152600401620002369062001059565b323314620005b25760405162461bcd60e51b8152600401620002369062001014565b620005c160196107d0620012a6565b620005cb620007e4565b11620005f05780601554620005e19190620012c1565b601355601854601455620006ab565b6019620006026107d061157c620012a6565b6200060e9190620012a6565b62000618620007e4565b111580156200063d57506200063160196107d0620012a6565b6200063b620007e4565b115b15620006625780601654620006539190620012c1565b601355601954601455620006ab565b6019620006746107d061157c620012a6565b620006809190620012a6565b6200068a620007e4565b1115620006ab5780601754620006a19190620012c1565b6013556019546014555b601454811115620006d05760405162461bcd60e51b8152600401620002369062000f17565b601354341015620006f55760405162461bcd60e51b8152600401620002369062000ee0565b62000777565b62000705620007de565b8162000710620007e4565b6200071c9190620012a6565b11156200073d5760405162461bcd60e51b81526004016200023690620010dd565b6000816200074a62000802565b620007569190620012e3565b1015620007775760405162461bcd60e51b8152600401620002369062001059565b60015b818111620007ca5760006200078e62000824565b90506200079c848262000993565b601a8054906000620007ae836200133a565b9190505550508080620007c1906200133a565b9150506200077a565b505050565b6006546001600160a01b031690565b600f5490565b6000620007fd600e620009b960201b6200180a1760201c565b905090565b60006200080e620007e4565b62000818620007de565b620007fd9190620012e3565b6000806200083162000802565b11620008515760405162461bcd60e51b81526004016200023690620010a6565b60006200085d620007e4565b62000867620007de565b620008739190620012e3565b905060008133414445426040516020016200089395949392919062000e18565b6040516020818303038152906040528051906020012060001c620008b8919062001358565b60008181526010602052604081205491925090620008d8575080620008e9565b506000818152601060205260409020545b60106000620008fa600186620012e3565b8152602001908152602001600020546000141562000934576200091f600184620012e3565b60008381526010602052604090205562000966565b6010600062000945600186620012e3565b81526020808201929092526040908101600090812054858252601090935220555b6200097b620009bd60201b6200180e1760201c565b506011546200098b9082620012a6565b935050505090565b620009b582826040518060200160405280600081525062000a1c60201b60201c565b5050565b5490565b600080620009ca62000802565b11620009ea5760405162461bcd60e51b81526004016200023690620010a6565b600062000a03600e620009b960201b6200180a1760201c565b9050620007fd600e62000a5660201b6200184a1760201c565b62000a28838362000a5f565b62000a37600084848462000b4a565b620007ca5760405162461bcd60e51b8152600401620002369062000f3f565b80546001019055565b6001600160a01b03821662000a885760405162461bcd60e51b8152600401620002369062001124565b62000a938162000c83565b1562000ab35760405162461bcd60e51b8152600401620002369062000fdd565b62000ac160008383620007ca565b6001600160a01b038216600090815260036020526040812080546001929062000aec908490620012a6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600062000b6b846001600160a01b031662000ca060201b620018531760201c565b1562000c77576001600160a01b03841663150b7a0262000b8a62000326565b8786866040518563ffffffff1660e01b815260040162000bae949392919062000e4e565b602060405180830381600087803b15801562000bc957600080fd5b505af192505050801562000bfc575060408051601f3d908101601f1916820190925262000bf99181019062000de7565b60015b62000c5c573d80801562000c2d576040519150601f19603f3d011682016040523d82523d6000602084013e62000c32565b606091505b50805162000c545760405162461bcd60e51b8152600401620002369062000f3f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000c7b565b5060015b949350505050565b6000908152600260205260409020546001600160a01b0316151590565b3b151590565b82805482825590600052602060002090810192821562000cfe579160200282015b8281111562000cfe57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000cc7565b5062000d0c92915062000dd0565b5090565b82805482825590600052602060002090810192821562000cfe579160200282015b8281111562000cfe578251829060ff1690559160200191906001019062000d31565b82805462000d6190620012fd565b90600052602060002090601f01602090048101928262000d85576000855562000cfe565b82601f1062000da057805160ff191683800117855562000cfe565b8280016001018555821562000cfe579182015b8281111562000cfe57825182559160200191906001019062000db3565b5b8082111562000d0c576000815560010162000dd1565b60006020828403121562000df9578081fd5b81516001600160e01b03198116811462000e11578182fd5b9392505050565b6001600160601b0319606096871b811682529490951b909316601485015260288401919091526048830152606882015260880190565b600060018060a01b0380871683526020818716818501528560408501526080606085015284519150816080850152825b8281101562000e9c5785810182015185820160a00152810162000e7e565b8281111562000eae578360a084870101525b5050601f01601f19169190910160a00195945050505050565b6001600160a01b03929092168252602082015260400190565b6020808252601a908201527f4e6f7420656e6f7567682045746865722070726f76696465642e000000000000604082015260600190565b6020808252600e908201526d22bc31b2b2b23990373ab6b132b960911b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602c908201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060408201526b7a65726f206164647265737360a01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526025908201527f43414e4e4f54204d494e54205448524f554748204120435553544f4d20434f4e60408201526415149050d560da1b606082015260800190565b6020808252602d908201527f594f552043414e2754204d494e54204d4f5245205448414e204156414c41424c60408201526c11481513d2d1538810d3d55395609a1b606082015260800190565b60208082526018908201527f4e6f206d6f726520746f6b656e7320617661696c61626c650000000000000000604082015260600190565b60208082526027908201527f594f552043414e2754204d494e54204d4f5245205448414e204d4158494d554d60408201526620535550504c5960c81b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526032908201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726040820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b606082015260800190565b60208082526022908201527f594f552043414e2754204d494e54204e4f572c2053414c452049532050415553604082015261115160f21b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960408201526a206861732073686172657360a81b606082015260800190565b6020808252601a908201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604082015260600190565b6020808252601d908201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604082015260600190565b60008219821115620012bc57620012bc62001379565b500190565b6000816000190483118215151615620012de57620012de62001379565b500290565b600082821015620012f857620012f862001379565b500390565b6002810460018216806200131257607f821691505b602082108114156200133457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562001351576200135162001379565b5060010190565b6000826200137457634e487b7160e01b81526012600452602481fd5b500690565b634e487b7160e01b600052601160045260246000fd5b613231806200139f6000396000f3fe60806040526004361061031e5760003560e01c8063715018a6116101ab578063bd685d70116100f7578063dc935c4211610095578063e33b7de31161006f578063e33b7de3146108ac578063e985e9c5146108c1578063f2fde38b146108e1578063ff69e2bc1461090157610365565b8063dc935c421461086d578063debdb1ed14610882578063e14ca3531461089757610365565b8063c6ec6909116100d1578063c6ec6909146107f8578063c87b56dd1461080d578063ce7c2ac21461082d578063d79779b21461084d57610365565b8063bd685d70146107b9578063bfcb487d146107ce578063c5431d47146107e357610365565b806395d89b4111610164578063a22cb4651161013e578063a22cb4651461074f578063b61de3df1461076f578063b88d4fde14610784578063b91d3c52146107a457610365565b806395d89b41146107055780639852595c1461071a5780639f181b5e1461073a57610365565b8063715018a61461067c578063771282f6146106915780637d8a82a6146106a65780638b83209b146106bb5780638da5cb5b146106db57806394953147146106f057610365565b806337ee8e9a1161026a57806342842e0e1161022357806357ea1f7e116101fd57806357ea1f7e146106125780636352211e146106275780636c0360eb1461064757806370a082311461065c57610365565b806342842e0e146105b257806348b75044146105d257806355f804b3146105f257610365565b806337ee8e9a1461052b5780633959f5b0146105405780633a98ef39146105555780633ccfd60b1461056a578063406072a91461057f57806340c10f191461059f57610365565b8063095ea7b3116102d757806319165587116102b157806319165587146104a857806323b872dd146104c85780632a55205a146104e85780633009c0831461051657610365565b8063095ea7b31461045357806310fd332b1461047357806318160ddd1461049357610365565b806301ffc9a71461036a57806303cc48c4146103a057806306fdde03146103c2578063081812fc146103e45780630835882f146104115780630868ddc91461043357610365565b36610365577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061034c610916565b3460405161035b929190612817565b60405180910390a1005b600080fd5b34801561037657600080fd5b5061038a6103853660046125f5565b61091a565b604051610397919061286d565b60405180910390f35b3480156103ac57600080fd5b506103c06103bb3660046126b5565b610962565b005b3480156103ce57600080fd5b506103d76109af565b6040516103979190612878565b3480156103f057600080fd5b506104046103ff3660046126b5565b610a41565b6040516103979190612803565b34801561041d57600080fd5b50610426610a84565b604051610397919061307f565b34801561043f57600080fd5b506103c061044e366004612672565b610a8a565b34801561045f57600080fd5b506103c061046e3660046125ae565b610bdd565b34801561047f57600080fd5b506103c061048e3660046125ae565b610c75565b34801561049f57600080fd5b50610426610cda565b3480156104b457600080fd5b506103c06104c3366004612470565b610ce0565b3480156104d457600080fd5b506103c06104e33660046124c4565b610dee565b3480156104f457600080fd5b506105086105033660046126e5565b610e26565b604051610397929190612817565b34801561052257600080fd5b50610404610e61565b34801561053757600080fd5b50610426610e70565b34801561054c57600080fd5b50610426610e76565b34801561056157600080fd5b50610426610e7c565b34801561057657600080fd5b506103c0610e82565b34801561058b57600080fd5b5061042661059a36600461262d565b610f0f565b6103c06105ad3660046125ae565b610f3a565b3480156105be57600080fd5b506103c06105cd3660046124c4565b6111f8565b3480156105de57600080fd5b506103c06105ed36600461262d565b611213565b3480156105fe57600080fd5b506103c061060d36600461263f565b6113c9565b34801561061e57600080fd5b5061042661141b565b34801561063357600080fd5b506104046106423660046126b5565b611421565b34801561065357600080fd5b506103d7611456565b34801561066857600080fd5b50610426610677366004612470565b6114e4565b34801561068857600080fd5b506103c0611528565b34801561069d57600080fd5b50610426611573565b3480156106b257600080fd5b50610426611579565b3480156106c757600080fd5b506104046106d63660046126b5565b61157f565b3480156106e757600080fd5b506104046115bd565b3480156106fc57600080fd5b506104266115cc565b34801561071157600080fd5b506103d76115d2565b34801561072657600080fd5b50610426610735366004612470565b6115e1565b34801561074657600080fd5b506104266115fc565b34801561075b57600080fd5b506103c061076a366004612581565b61160d565b34801561077b57600080fd5b5061042661161f565b34801561079057600080fd5b506103c061079f366004612504565b611625565b3480156107b057600080fd5b50610426611664565b3480156107c557600080fd5b5061042661166a565b3480156107da57600080fd5b5061042661166f565b3480156107ef57600080fd5b50610426611675565b34801561080457600080fd5b5061042661167b565b34801561081957600080fd5b506103d76108283660046126b5565b611681565b34801561083957600080fd5b50610426610848366004612470565b611704565b34801561085957600080fd5b50610426610868366004612470565b61171f565b34801561087957600080fd5b5061042661173a565b34801561088e57600080fd5b50610426611740565b3480156108a357600080fd5b50610426611746565b3480156108b857600080fd5b50610426611762565b3480156108cd57600080fd5b5061038a6108dc36600461248c565b611768565b3480156108ed57600080fd5b506103c06108fc366004612470565b611796565b34801561090d57600080fd5b50610426611804565b3390565b60006001600160e01b031982166380ac58cd60e01b148061094b57506001600160e01b03198216635b5e139f60e01b145b8061095a575061095a82611859565b90505b919050565b61096a610916565b6001600160a01b031661097b6115bd565b6001600160a01b0316146109aa5760405162461bcd60e51b81526004016109a190612e5d565b60405180910390fd5b601c55565b6060600080546109be90613116565b80601f01602080910402602001604051908101604052809291908181526020018280546109ea90613116565b8015610a375780601f10610a0c57610100808354040283529160200191610a37565b820191906000526020600020905b815481529060010190602001808311610a1a57829003601f168201915b5050505050905090565b6000610a4c82611872565b610a685760405162461bcd60e51b81526004016109a190612e11565b506000908152600460205260409020546001600160a01b031690565b6103cf81565b610a92610916565b6001600160a01b0316610aa36115bd565b6001600160a01b031614610ac95760405162461bcd60e51b81526004016109a190612e5d565b604051602001610ad8906127ed565b6040516020818303038152906040528051906020012082604051602001610aff919061276d565b604051602081830303815290604052805190602001201415610b25576015819055610bd9565b604051602001610b34906127c8565b6040516020818303038152906040528051906020012082604051602001610b5b919061276d565b604051602081830303815290604052805190602001201415610b81576016819055610bd9565b604051602001610b90906127d8565b6040516020818303038152906040528051906020012082604051602001610bb7919061276d565b604051602081830303815290604052805190602001201415610bd95760178190555b5050565b6000610be882611421565b9050806001600160a01b0316836001600160a01b03161415610c1c5760405162461bcd60e51b81526004016109a190612f2a565b806001600160a01b0316610c2e610916565b6001600160a01b03161480610c4a5750610c4a816108dc610916565b610c665760405162461bcd60e51b81526004016109a190612ca5565b610c70838361188f565b505050565b610c7d610916565b6001600160a01b0316610c8e6115bd565b6001600160a01b031614610cb45760405162461bcd60e51b81526004016109a190612e5d565b601d80546001600160a01b0319166001600160a01b039390931692909217909155601e55565b600f5490565b6001600160a01b038116600090815260096020526040902054610d155760405162461bcd60e51b81526004016109a190612a82565b6000610d1f611762565b610d299047613088565b90506000610d408383610d3b866115e1565b6118fd565b905080610d5f5760405162461bcd60e51b81526004016109a190612c5a565b6001600160a01b0383166000908152600a602052604081208054839290610d87908490613088565b925050819055508060086000828254610da09190613088565b90915550610db090508382611943565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610de1929190612817565b60405180910390a1505050565b610dff610df9610916565b826119df565b610e1b5760405162461bcd60e51b81526004016109a190612f6b565b610c70838383611a5c565b601d54601e5460009182916001600160a01b0390911690610e569061271090610e50908790611b89565b90611b95565b915091509250929050565b601d546001600160a01b031681565b60185481565b60155481565b60075490565b610e8a610916565b6001600160a01b0316610e9b6115bd565b6001600160a01b031614610ec15760405162461bcd60e51b81526004016109a190612e5d565b60004711610ee15760405162461bcd60e51b81526004016109a190612982565b60005b601f54811015610f0c57610efa6104c38261157f565b80610f0481613151565b915050610ee4565b50565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b610f426115bd565b6001600160a01b0316336001600160a01b031614611143576001601c5410610f7c5760405162461bcd60e51b81526004016109a190612ff3565b6103cf610f87610cda565b610f9191906130d3565b81610f9a6115fc565b610fa49190613088565b1115610fc25760405162461bcd60e51b81526004016109a190612d95565b6000816103cf610fd0611746565b610fda91906130d3565b610fe491906130d3565b10156110025760405162461bcd60e51b81526004016109a190612a35565b3233146110215760405162461bcd60e51b81526004016109a1906129f0565b61102e60196107d0613088565b6110366115fc565b11611057578060155461104991906130b4565b6013556018546014556110fa565b60196110676107d061157c613088565b6110719190613088565b6110796115fc565b11158015611099575061108f60196107d0613088565b6110976115fc565b115b156110ba57806016546110ac91906130b4565b6013556019546014556110fa565b60196110ca6107d061157c613088565b6110d49190613088565b6110dc6115fc565b11156110fa57806017546110f091906130b4565b6013556019546014555b60145481111561111c5760405162461bcd60e51b81526004016109a1906128c2565b60135434101561113e5760405162461bcd60e51b81526004016109a19061288b565b6111af565b61114b610cda565b816111546115fc565b61115e9190613088565b111561117c5760405162461bcd60e51b81526004016109a190612d95565b600081611187611746565b61119191906130d3565b10156111af5760405162461bcd60e51b81526004016109a190612a35565b60015b818111610c705760006111c3611ba1565b90506111cf8482611ce8565b601a80549060006111df83613151565b91905055505080806111f090613151565b9150506111b2565b610c7083838360405180602001604052806000815250611625565b6001600160a01b0381166000908152600960205260409020546112485760405162461bcd60e51b81526004016109a190612a82565b60006112538361171f565b6040516370a0823160e01b81526001600160a01b038516906370a082319061127f903090600401612803565b60206040518083038186803b15801561129757600080fd5b505afa1580156112ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cf91906126cd565b6112d99190613088565b905060006112ec8383610d3b8787610f0f565b90508061130b5760405162461bcd60e51b81526004016109a190612c5a565b6001600160a01b038085166000908152600d6020908152604080832093871683529290529081208054839290611342908490613088565b90915550506001600160a01b0384166000908152600c60205260408120805483929061136f908490613088565b909155506113809050848483611d02565b836001600160a01b03167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516113bb929190612817565b60405180910390a250505050565b6113d1610916565b6001600160a01b03166113e26115bd565b6001600160a01b0316146114085760405162461bcd60e51b81526004016109a190612e5d565b8051610bd990601b906020840190612348565b60195481565b6000818152600260205260408120546001600160a01b03168061095a5760405162461bcd60e51b81526004016109a190612d4c565b601b805461146390613116565b80601f016020809104026020016040519081016040528092919081815260200182805461148f90613116565b80156114dc5780601f106114b1576101008083540402835291602001916114dc565b820191906000526020600020905b8154815290600101906020018083116114bf57829003601f168201915b505050505081565b60006001600160a01b03821661150c5760405162461bcd60e51b81526004016109a190612d02565b506001600160a01b031660009081526003602052604090205490565b611530610916565b6001600160a01b03166115416115bd565b6001600160a01b0316146115675760405162461bcd60e51b81526004016109a190612e5d565b6115716000611d58565b565b601a5481565b6107d081565b6000600b82815481106115a257634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6006546001600160a01b031690565b60125481565b6060600180546109be90613116565b6001600160a01b03166000908152600a602052604090205490565b6000611608600e61180a565b905090565b610bd9611618610916565b8383611daa565b601c5481565b611636611630610916565b836119df565b6116525760405162461bcd60e51b81526004016109a190612f6b565b61165e84848484611e4d565b50505050565b61271081565b601981565b60145481565b60165481565b601e5481565b606061168c82611872565b6116a85760405162461bcd60e51b81526004016109a190612e92565b60006116b2611e80565b905060008151116116d257604051806020016040528060008152506116fd565b806116dc84611e8f565b6040516020016116ed929190612789565b6040516020818303038152906040525b9392505050565b6001600160a01b031660009081526009602052604090205490565b6001600160a01b03166000908152600c602052604090205490565b60175481565b61157c81565b60006117506115fc565b611758610cda565b61160891906130d3565b60085490565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61179e610916565b6001600160a01b03166117af6115bd565b6001600160a01b0316146117d55760405162461bcd60e51b81526004016109a190612e5d565b6001600160a01b0381166117fb5760405162461bcd60e51b81526004016109a19061293c565b610f0c81611d58565b60135481565b5490565b600080611819611746565b116118365760405162461bcd60e51b81526004016109a190612ba0565b6000611842600e61180a565b9050611608600e5b80546001019055565b3b151590565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118c482611421565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6007546001600160a01b0384166000908152600960205260408120549091839161192790866130b4565b61193191906130a0565b61193b91906130d3565b949350505050565b804710156119635760405162461bcd60e51b81526004016109a190612bd7565b6000826001600160a01b03168260405161197c90612800565b60006040518083038185875af1925050503d80600081146119b9576040519150601f19603f3d011682016040523d82523d6000602084013e6119be565b606091505b5050905080610c705760405162461bcd60e51b81526004016109a190612b43565b60006119ea82611872565b611a065760405162461bcd60e51b81526004016109a190612c0e565b6000611a1183611421565b9050806001600160a01b0316846001600160a01b03161480611a4c5750836001600160a01b0316611a4184610a41565b6001600160a01b0316145b8061193b575061193b8185611768565b826001600160a01b0316611a6f82611421565b6001600160a01b031614611a955760405162461bcd60e51b81526004016109a190612ee1565b6001600160a01b038216611abb5760405162461bcd60e51b81526004016109a190612ac8565b611ac6838383610c70565b611ad160008261188f565b6001600160a01b0383166000908152600360205260408120805460019290611afa9084906130d3565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b28908490613088565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006116fd82846130b4565b60006116fd82846130a0565b600080611bac611746565b11611bc95760405162461bcd60e51b81526004016109a190612ba0565b6000611bd36115fc565b611bdb610cda565b611be591906130d3565b90506000813341444542604051602001611c03959493929190612732565b6040516020818303038152906040528051906020012060001c611c26919061316c565b60008181526010602052604081205491925090611c44575080611c55565b506000818152601060205260409020545b60106000611c646001866130d3565b81526020019081526020016000205460001415611c9a57611c866001846130d3565b600083815260106020526040902055611cca565b60106000611ca96001866130d3565b81526020808201929092526040908101600090812054858252601090935220555b611cd261180e565b50601154611ce09082613088565b935050505090565b610bd9828260405180602001604052806000815250611faa565b610c708363a9059cbb60e01b8484604051602401611d21929190612817565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611fdd565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611ddc5760405162461bcd60e51b81526004016109a190612b0c565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190611e4090859061286d565b60405180910390a3505050565b611e58848484611a5c565b611e648484848461206c565b61165e5760405162461bcd60e51b81526004016109a1906128ea565b6060601b80546109be90613116565b606081611eb457506040805180820190915260018152600360fc1b602082015261095d565b8160005b8115611ede5780611ec881613151565b9150611ed79050600a836130a0565b9150611eb8565b60008167ffffffffffffffff811115611f0757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f31576020820181803683370190505b5090505b841561193b57611f466001836130d3565b9150611f53600a8661316c565b611f5e906030613088565b60f81b818381518110611f8157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611fa3600a866130a0565b9450611f35565b611fb48383612187565b611fc1600084848461206c565b610c705760405162461bcd60e51b81526004016109a1906128ea565b6000612032826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122669092919063ffffffff16565b805190915015610c70578080602001905181019061205091906125d9565b610c705760405162461bcd60e51b81526004016109a190613035565b6000612080846001600160a01b0316611853565b1561217c57836001600160a01b031663150b7a0261209c610916565b8786866040518563ffffffff1660e01b81526004016120be9493929190612830565b602060405180830381600087803b1580156120d857600080fd5b505af1925050508015612108575060408051601f3d908101601f1916820190925261210591810190612611565b60015b612162573d808015612136576040519150601f19603f3d011682016040523d82523d6000602084013e61213b565b606091505b50805161215a5760405162461bcd60e51b81526004016109a1906128ea565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061193b565b506001949350505050565b6001600160a01b0382166121ad5760405162461bcd60e51b81526004016109a190612ddc565b6121b681611872565b156121d35760405162461bcd60e51b81526004016109a1906129b9565b6121df60008383610c70565b6001600160a01b0382166000908152600360205260408120805460019290612208908490613088565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606061193b84846000858561227a85611853565b6122965760405162461bcd60e51b81526004016109a190612fbc565b600080866001600160a01b031685876040516122b2919061276d565b60006040518083038185875af1925050503d80600081146122ef576040519150601f19603f3d011682016040523d82523d6000602084013e6122f4565b606091505b509150915061230482828661230f565b979650505050505050565b6060831561231e5750816116fd565b82511561232e5782518084602001fd5b8160405162461bcd60e51b81526004016109a19190612878565b82805461235490613116565b90600052602060002090601f01602090048101928261237657600085556123bc565b82601f1061238f57805160ff19168380011785556123bc565b828001600101855582156123bc579182015b828111156123bc5782518255916020019190600101906123a1565b506123c89291506123cc565b5090565b5b808211156123c857600081556001016123cd565b600067ffffffffffffffff808411156123fc576123fc6131ac565b604051601f8501601f191681016020018281118282101715612420576124206131ac565b60405284815291508183850186101561243857600080fd5b8484602083013760006020868301015250509392505050565b600082601f830112612461578081fd5b6116fd838335602085016123e1565b600060208284031215612481578081fd5b81356116fd816131c2565b6000806040838503121561249e578081fd5b82356124a9816131c2565b915060208301356124b9816131c2565b809150509250929050565b6000806000606084860312156124d8578081fd5b83356124e3816131c2565b925060208401356124f3816131c2565b929592945050506040919091013590565b60008060008060808587031215612519578081fd5b8435612524816131c2565b93506020850135612534816131c2565b925060408501359150606085013567ffffffffffffffff811115612556578182fd5b8501601f81018713612566578182fd5b612575878235602084016123e1565b91505092959194509250565b60008060408385031215612593578182fd5b823561259e816131c2565b915060208301356124b9816131d7565b600080604083850312156125c0578182fd5b82356125cb816131c2565b946020939093013593505050565b6000602082840312156125ea578081fd5b81516116fd816131d7565b600060208284031215612606578081fd5b81356116fd816131e5565b600060208284031215612622578081fd5b81516116fd816131e5565b6000806040838503121561249e578182fd5b600060208284031215612650578081fd5b813567ffffffffffffffff811115612666578182fd5b61193b84828501612451565b60008060408385031215612684578182fd5b823567ffffffffffffffff81111561269a578283fd5b6126a685828601612451565b95602094909401359450505050565b6000602082840312156126c6578081fd5b5035919050565b6000602082840312156126de578081fd5b5051919050565b600080604083850312156126f7578182fd5b50508035926020909101359150565b6000815180845261271e8160208601602086016130ea565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606096871b811682529490951b909316601485015260288401919091526048830152606882015260880190565b6000825161277f8184602087016130ea565b9190910192915050565b6000835161279b8184602088016130ea565b8351908301906127af8183602088016130ea565b64173539b7b760d91b9101908152600501949350505050565b6353616c6560e01b815260040190565b6846696e616c53616c6560b81b815260090190565b6650726553616c6560c81b815260070190565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061286390830184612706565b9695505050505050565b901515815260200190565b6000602082526116fd6020830184612706565b6020808252601a908201527f4e6f7420656e6f7567682045746865722070726f76696465642e000000000000604082015260600190565b6020808252600e908201526d22bc31b2b2b23990373ab6b132b960911b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526017908201527f4e6f2062616c616e636520746f2077697468647261772e000000000000000000604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526025908201527f43414e4e4f54204d494e54205448524f554748204120435553544f4d20434f4e60408201526415149050d560da1b606082015260800190565b6020808252602d908201527f594f552043414e2754204d494e54204d4f5245205448414e204156414c41424c60408201526c11481513d2d1538810d3d55395609a1b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b60208082526018908201527f4e6f206d6f726520746f6b656e7320617661696c61626c650000000000000000604082015260600190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526027908201527f594f552043414e2754204d494e54204d4f5245205448414e204d4158494d554d60408201526620535550504c5960c81b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba30b73a103a37b5b2b760891b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526022908201527f594f552043414e2754204d494e54204e4f572c2053414c452049532050415553604082015261115160f21b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b90815260200190565b6000821982111561309b5761309b613180565b500190565b6000826130af576130af613196565b500490565b60008160001904831182151516156130ce576130ce613180565b500290565b6000828210156130e5576130e5613180565b500390565b60005b838110156131055781810151838201526020016130ed565b8381111561165e5750506000910152565b60028104600182168061312a57607f821691505b6020821081141561314b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561316557613165613180565b5060010190565b60008261317b5761317b613196565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f0c57600080fd5b8015158114610f0c57600080fd5b6001600160e01b031981168114610f0c57600080fdfea26469706673582212206ec48d166387218379d58de22c531584932e283a28153b6ce0362363cbb5150464736f6c63430008000033
Deployed Bytecode
0x60806040526004361061031e5760003560e01c8063715018a6116101ab578063bd685d70116100f7578063dc935c4211610095578063e33b7de31161006f578063e33b7de3146108ac578063e985e9c5146108c1578063f2fde38b146108e1578063ff69e2bc1461090157610365565b8063dc935c421461086d578063debdb1ed14610882578063e14ca3531461089757610365565b8063c6ec6909116100d1578063c6ec6909146107f8578063c87b56dd1461080d578063ce7c2ac21461082d578063d79779b21461084d57610365565b8063bd685d70146107b9578063bfcb487d146107ce578063c5431d47146107e357610365565b806395d89b4111610164578063a22cb4651161013e578063a22cb4651461074f578063b61de3df1461076f578063b88d4fde14610784578063b91d3c52146107a457610365565b806395d89b41146107055780639852595c1461071a5780639f181b5e1461073a57610365565b8063715018a61461067c578063771282f6146106915780637d8a82a6146106a65780638b83209b146106bb5780638da5cb5b146106db57806394953147146106f057610365565b806337ee8e9a1161026a57806342842e0e1161022357806357ea1f7e116101fd57806357ea1f7e146106125780636352211e146106275780636c0360eb1461064757806370a082311461065c57610365565b806342842e0e146105b257806348b75044146105d257806355f804b3146105f257610365565b806337ee8e9a1461052b5780633959f5b0146105405780633a98ef39146105555780633ccfd60b1461056a578063406072a91461057f57806340c10f191461059f57610365565b8063095ea7b3116102d757806319165587116102b157806319165587146104a857806323b872dd146104c85780632a55205a146104e85780633009c0831461051657610365565b8063095ea7b31461045357806310fd332b1461047357806318160ddd1461049357610365565b806301ffc9a71461036a57806303cc48c4146103a057806306fdde03146103c2578063081812fc146103e45780630835882f146104115780630868ddc91461043357610365565b36610365577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061034c610916565b3460405161035b929190612817565b60405180910390a1005b600080fd5b34801561037657600080fd5b5061038a6103853660046125f5565b61091a565b604051610397919061286d565b60405180910390f35b3480156103ac57600080fd5b506103c06103bb3660046126b5565b610962565b005b3480156103ce57600080fd5b506103d76109af565b6040516103979190612878565b3480156103f057600080fd5b506104046103ff3660046126b5565b610a41565b6040516103979190612803565b34801561041d57600080fd5b50610426610a84565b604051610397919061307f565b34801561043f57600080fd5b506103c061044e366004612672565b610a8a565b34801561045f57600080fd5b506103c061046e3660046125ae565b610bdd565b34801561047f57600080fd5b506103c061048e3660046125ae565b610c75565b34801561049f57600080fd5b50610426610cda565b3480156104b457600080fd5b506103c06104c3366004612470565b610ce0565b3480156104d457600080fd5b506103c06104e33660046124c4565b610dee565b3480156104f457600080fd5b506105086105033660046126e5565b610e26565b604051610397929190612817565b34801561052257600080fd5b50610404610e61565b34801561053757600080fd5b50610426610e70565b34801561054c57600080fd5b50610426610e76565b34801561056157600080fd5b50610426610e7c565b34801561057657600080fd5b506103c0610e82565b34801561058b57600080fd5b5061042661059a36600461262d565b610f0f565b6103c06105ad3660046125ae565b610f3a565b3480156105be57600080fd5b506103c06105cd3660046124c4565b6111f8565b3480156105de57600080fd5b506103c06105ed36600461262d565b611213565b3480156105fe57600080fd5b506103c061060d36600461263f565b6113c9565b34801561061e57600080fd5b5061042661141b565b34801561063357600080fd5b506104046106423660046126b5565b611421565b34801561065357600080fd5b506103d7611456565b34801561066857600080fd5b50610426610677366004612470565b6114e4565b34801561068857600080fd5b506103c0611528565b34801561069d57600080fd5b50610426611573565b3480156106b257600080fd5b50610426611579565b3480156106c757600080fd5b506104046106d63660046126b5565b61157f565b3480156106e757600080fd5b506104046115bd565b3480156106fc57600080fd5b506104266115cc565b34801561071157600080fd5b506103d76115d2565b34801561072657600080fd5b50610426610735366004612470565b6115e1565b34801561074657600080fd5b506104266115fc565b34801561075b57600080fd5b506103c061076a366004612581565b61160d565b34801561077b57600080fd5b5061042661161f565b34801561079057600080fd5b506103c061079f366004612504565b611625565b3480156107b057600080fd5b50610426611664565b3480156107c557600080fd5b5061042661166a565b3480156107da57600080fd5b5061042661166f565b3480156107ef57600080fd5b50610426611675565b34801561080457600080fd5b5061042661167b565b34801561081957600080fd5b506103d76108283660046126b5565b611681565b34801561083957600080fd5b50610426610848366004612470565b611704565b34801561085957600080fd5b50610426610868366004612470565b61171f565b34801561087957600080fd5b5061042661173a565b34801561088e57600080fd5b50610426611740565b3480156108a357600080fd5b50610426611746565b3480156108b857600080fd5b50610426611762565b3480156108cd57600080fd5b5061038a6108dc36600461248c565b611768565b3480156108ed57600080fd5b506103c06108fc366004612470565b611796565b34801561090d57600080fd5b50610426611804565b3390565b60006001600160e01b031982166380ac58cd60e01b148061094b57506001600160e01b03198216635b5e139f60e01b145b8061095a575061095a82611859565b90505b919050565b61096a610916565b6001600160a01b031661097b6115bd565b6001600160a01b0316146109aa5760405162461bcd60e51b81526004016109a190612e5d565b60405180910390fd5b601c55565b6060600080546109be90613116565b80601f01602080910402602001604051908101604052809291908181526020018280546109ea90613116565b8015610a375780601f10610a0c57610100808354040283529160200191610a37565b820191906000526020600020905b815481529060010190602001808311610a1a57829003601f168201915b5050505050905090565b6000610a4c82611872565b610a685760405162461bcd60e51b81526004016109a190612e11565b506000908152600460205260409020546001600160a01b031690565b6103cf81565b610a92610916565b6001600160a01b0316610aa36115bd565b6001600160a01b031614610ac95760405162461bcd60e51b81526004016109a190612e5d565b604051602001610ad8906127ed565b6040516020818303038152906040528051906020012082604051602001610aff919061276d565b604051602081830303815290604052805190602001201415610b25576015819055610bd9565b604051602001610b34906127c8565b6040516020818303038152906040528051906020012082604051602001610b5b919061276d565b604051602081830303815290604052805190602001201415610b81576016819055610bd9565b604051602001610b90906127d8565b6040516020818303038152906040528051906020012082604051602001610bb7919061276d565b604051602081830303815290604052805190602001201415610bd95760178190555b5050565b6000610be882611421565b9050806001600160a01b0316836001600160a01b03161415610c1c5760405162461bcd60e51b81526004016109a190612f2a565b806001600160a01b0316610c2e610916565b6001600160a01b03161480610c4a5750610c4a816108dc610916565b610c665760405162461bcd60e51b81526004016109a190612ca5565b610c70838361188f565b505050565b610c7d610916565b6001600160a01b0316610c8e6115bd565b6001600160a01b031614610cb45760405162461bcd60e51b81526004016109a190612e5d565b601d80546001600160a01b0319166001600160a01b039390931692909217909155601e55565b600f5490565b6001600160a01b038116600090815260096020526040902054610d155760405162461bcd60e51b81526004016109a190612a82565b6000610d1f611762565b610d299047613088565b90506000610d408383610d3b866115e1565b6118fd565b905080610d5f5760405162461bcd60e51b81526004016109a190612c5a565b6001600160a01b0383166000908152600a602052604081208054839290610d87908490613088565b925050819055508060086000828254610da09190613088565b90915550610db090508382611943565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610de1929190612817565b60405180910390a1505050565b610dff610df9610916565b826119df565b610e1b5760405162461bcd60e51b81526004016109a190612f6b565b610c70838383611a5c565b601d54601e5460009182916001600160a01b0390911690610e569061271090610e50908790611b89565b90611b95565b915091509250929050565b601d546001600160a01b031681565b60185481565b60155481565b60075490565b610e8a610916565b6001600160a01b0316610e9b6115bd565b6001600160a01b031614610ec15760405162461bcd60e51b81526004016109a190612e5d565b60004711610ee15760405162461bcd60e51b81526004016109a190612982565b60005b601f54811015610f0c57610efa6104c38261157f565b80610f0481613151565b915050610ee4565b50565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b610f426115bd565b6001600160a01b0316336001600160a01b031614611143576001601c5410610f7c5760405162461bcd60e51b81526004016109a190612ff3565b6103cf610f87610cda565b610f9191906130d3565b81610f9a6115fc565b610fa49190613088565b1115610fc25760405162461bcd60e51b81526004016109a190612d95565b6000816103cf610fd0611746565b610fda91906130d3565b610fe491906130d3565b10156110025760405162461bcd60e51b81526004016109a190612a35565b3233146110215760405162461bcd60e51b81526004016109a1906129f0565b61102e60196107d0613088565b6110366115fc565b11611057578060155461104991906130b4565b6013556018546014556110fa565b60196110676107d061157c613088565b6110719190613088565b6110796115fc565b11158015611099575061108f60196107d0613088565b6110976115fc565b115b156110ba57806016546110ac91906130b4565b6013556019546014556110fa565b60196110ca6107d061157c613088565b6110d49190613088565b6110dc6115fc565b11156110fa57806017546110f091906130b4565b6013556019546014555b60145481111561111c5760405162461bcd60e51b81526004016109a1906128c2565b60135434101561113e5760405162461bcd60e51b81526004016109a19061288b565b6111af565b61114b610cda565b816111546115fc565b61115e9190613088565b111561117c5760405162461bcd60e51b81526004016109a190612d95565b600081611187611746565b61119191906130d3565b10156111af5760405162461bcd60e51b81526004016109a190612a35565b60015b818111610c705760006111c3611ba1565b90506111cf8482611ce8565b601a80549060006111df83613151565b91905055505080806111f090613151565b9150506111b2565b610c7083838360405180602001604052806000815250611625565b6001600160a01b0381166000908152600960205260409020546112485760405162461bcd60e51b81526004016109a190612a82565b60006112538361171f565b6040516370a0823160e01b81526001600160a01b038516906370a082319061127f903090600401612803565b60206040518083038186803b15801561129757600080fd5b505afa1580156112ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cf91906126cd565b6112d99190613088565b905060006112ec8383610d3b8787610f0f565b90508061130b5760405162461bcd60e51b81526004016109a190612c5a565b6001600160a01b038085166000908152600d6020908152604080832093871683529290529081208054839290611342908490613088565b90915550506001600160a01b0384166000908152600c60205260408120805483929061136f908490613088565b909155506113809050848483611d02565b836001600160a01b03167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516113bb929190612817565b60405180910390a250505050565b6113d1610916565b6001600160a01b03166113e26115bd565b6001600160a01b0316146114085760405162461bcd60e51b81526004016109a190612e5d565b8051610bd990601b906020840190612348565b60195481565b6000818152600260205260408120546001600160a01b03168061095a5760405162461bcd60e51b81526004016109a190612d4c565b601b805461146390613116565b80601f016020809104026020016040519081016040528092919081815260200182805461148f90613116565b80156114dc5780601f106114b1576101008083540402835291602001916114dc565b820191906000526020600020905b8154815290600101906020018083116114bf57829003601f168201915b505050505081565b60006001600160a01b03821661150c5760405162461bcd60e51b81526004016109a190612d02565b506001600160a01b031660009081526003602052604090205490565b611530610916565b6001600160a01b03166115416115bd565b6001600160a01b0316146115675760405162461bcd60e51b81526004016109a190612e5d565b6115716000611d58565b565b601a5481565b6107d081565b6000600b82815481106115a257634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6006546001600160a01b031690565b60125481565b6060600180546109be90613116565b6001600160a01b03166000908152600a602052604090205490565b6000611608600e61180a565b905090565b610bd9611618610916565b8383611daa565b601c5481565b611636611630610916565b836119df565b6116525760405162461bcd60e51b81526004016109a190612f6b565b61165e84848484611e4d565b50505050565b61271081565b601981565b60145481565b60165481565b601e5481565b606061168c82611872565b6116a85760405162461bcd60e51b81526004016109a190612e92565b60006116b2611e80565b905060008151116116d257604051806020016040528060008152506116fd565b806116dc84611e8f565b6040516020016116ed929190612789565b6040516020818303038152906040525b9392505050565b6001600160a01b031660009081526009602052604090205490565b6001600160a01b03166000908152600c602052604090205490565b60175481565b61157c81565b60006117506115fc565b611758610cda565b61160891906130d3565b60085490565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61179e610916565b6001600160a01b03166117af6115bd565b6001600160a01b0316146117d55760405162461bcd60e51b81526004016109a190612e5d565b6001600160a01b0381166117fb5760405162461bcd60e51b81526004016109a19061293c565b610f0c81611d58565b60135481565b5490565b600080611819611746565b116118365760405162461bcd60e51b81526004016109a190612ba0565b6000611842600e61180a565b9050611608600e5b80546001019055565b3b151590565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118c482611421565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6007546001600160a01b0384166000908152600960205260408120549091839161192790866130b4565b61193191906130a0565b61193b91906130d3565b949350505050565b804710156119635760405162461bcd60e51b81526004016109a190612bd7565b6000826001600160a01b03168260405161197c90612800565b60006040518083038185875af1925050503d80600081146119b9576040519150601f19603f3d011682016040523d82523d6000602084013e6119be565b606091505b5050905080610c705760405162461bcd60e51b81526004016109a190612b43565b60006119ea82611872565b611a065760405162461bcd60e51b81526004016109a190612c0e565b6000611a1183611421565b9050806001600160a01b0316846001600160a01b03161480611a4c5750836001600160a01b0316611a4184610a41565b6001600160a01b0316145b8061193b575061193b8185611768565b826001600160a01b0316611a6f82611421565b6001600160a01b031614611a955760405162461bcd60e51b81526004016109a190612ee1565b6001600160a01b038216611abb5760405162461bcd60e51b81526004016109a190612ac8565b611ac6838383610c70565b611ad160008261188f565b6001600160a01b0383166000908152600360205260408120805460019290611afa9084906130d3565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b28908490613088565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006116fd82846130b4565b60006116fd82846130a0565b600080611bac611746565b11611bc95760405162461bcd60e51b81526004016109a190612ba0565b6000611bd36115fc565b611bdb610cda565b611be591906130d3565b90506000813341444542604051602001611c03959493929190612732565b6040516020818303038152906040528051906020012060001c611c26919061316c565b60008181526010602052604081205491925090611c44575080611c55565b506000818152601060205260409020545b60106000611c646001866130d3565b81526020019081526020016000205460001415611c9a57611c866001846130d3565b600083815260106020526040902055611cca565b60106000611ca96001866130d3565b81526020808201929092526040908101600090812054858252601090935220555b611cd261180e565b50601154611ce09082613088565b935050505090565b610bd9828260405180602001604052806000815250611faa565b610c708363a9059cbb60e01b8484604051602401611d21929190612817565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611fdd565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611ddc5760405162461bcd60e51b81526004016109a190612b0c565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190611e4090859061286d565b60405180910390a3505050565b611e58848484611a5c565b611e648484848461206c565b61165e5760405162461bcd60e51b81526004016109a1906128ea565b6060601b80546109be90613116565b606081611eb457506040805180820190915260018152600360fc1b602082015261095d565b8160005b8115611ede5780611ec881613151565b9150611ed79050600a836130a0565b9150611eb8565b60008167ffffffffffffffff811115611f0757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f31576020820181803683370190505b5090505b841561193b57611f466001836130d3565b9150611f53600a8661316c565b611f5e906030613088565b60f81b818381518110611f8157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611fa3600a866130a0565b9450611f35565b611fb48383612187565b611fc1600084848461206c565b610c705760405162461bcd60e51b81526004016109a1906128ea565b6000612032826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122669092919063ffffffff16565b805190915015610c70578080602001905181019061205091906125d9565b610c705760405162461bcd60e51b81526004016109a190613035565b6000612080846001600160a01b0316611853565b1561217c57836001600160a01b031663150b7a0261209c610916565b8786866040518563ffffffff1660e01b81526004016120be9493929190612830565b602060405180830381600087803b1580156120d857600080fd5b505af1925050508015612108575060408051601f3d908101601f1916820190925261210591810190612611565b60015b612162573d808015612136576040519150601f19603f3d011682016040523d82523d6000602084013e61213b565b606091505b50805161215a5760405162461bcd60e51b81526004016109a1906128ea565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061193b565b506001949350505050565b6001600160a01b0382166121ad5760405162461bcd60e51b81526004016109a190612ddc565b6121b681611872565b156121d35760405162461bcd60e51b81526004016109a1906129b9565b6121df60008383610c70565b6001600160a01b0382166000908152600360205260408120805460019290612208908490613088565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606061193b84846000858561227a85611853565b6122965760405162461bcd60e51b81526004016109a190612fbc565b600080866001600160a01b031685876040516122b2919061276d565b60006040518083038185875af1925050503d80600081146122ef576040519150601f19603f3d011682016040523d82523d6000602084013e6122f4565b606091505b509150915061230482828661230f565b979650505050505050565b6060831561231e5750816116fd565b82511561232e5782518084602001fd5b8160405162461bcd60e51b81526004016109a19190612878565b82805461235490613116565b90600052602060002090601f01602090048101928261237657600085556123bc565b82601f1061238f57805160ff19168380011785556123bc565b828001600101855582156123bc579182015b828111156123bc5782518255916020019190600101906123a1565b506123c89291506123cc565b5090565b5b808211156123c857600081556001016123cd565b600067ffffffffffffffff808411156123fc576123fc6131ac565b604051601f8501601f191681016020018281118282101715612420576124206131ac565b60405284815291508183850186101561243857600080fd5b8484602083013760006020868301015250509392505050565b600082601f830112612461578081fd5b6116fd838335602085016123e1565b600060208284031215612481578081fd5b81356116fd816131c2565b6000806040838503121561249e578081fd5b82356124a9816131c2565b915060208301356124b9816131c2565b809150509250929050565b6000806000606084860312156124d8578081fd5b83356124e3816131c2565b925060208401356124f3816131c2565b929592945050506040919091013590565b60008060008060808587031215612519578081fd5b8435612524816131c2565b93506020850135612534816131c2565b925060408501359150606085013567ffffffffffffffff811115612556578182fd5b8501601f81018713612566578182fd5b612575878235602084016123e1565b91505092959194509250565b60008060408385031215612593578182fd5b823561259e816131c2565b915060208301356124b9816131d7565b600080604083850312156125c0578182fd5b82356125cb816131c2565b946020939093013593505050565b6000602082840312156125ea578081fd5b81516116fd816131d7565b600060208284031215612606578081fd5b81356116fd816131e5565b600060208284031215612622578081fd5b81516116fd816131e5565b6000806040838503121561249e578182fd5b600060208284031215612650578081fd5b813567ffffffffffffffff811115612666578182fd5b61193b84828501612451565b60008060408385031215612684578182fd5b823567ffffffffffffffff81111561269a578283fd5b6126a685828601612451565b95602094909401359450505050565b6000602082840312156126c6578081fd5b5035919050565b6000602082840312156126de578081fd5b5051919050565b600080604083850312156126f7578182fd5b50508035926020909101359150565b6000815180845261271e8160208601602086016130ea565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606096871b811682529490951b909316601485015260288401919091526048830152606882015260880190565b6000825161277f8184602087016130ea565b9190910192915050565b6000835161279b8184602088016130ea565b8351908301906127af8183602088016130ea565b64173539b7b760d91b9101908152600501949350505050565b6353616c6560e01b815260040190565b6846696e616c53616c6560b81b815260090190565b6650726553616c6560c81b815260070190565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061286390830184612706565b9695505050505050565b901515815260200190565b6000602082526116fd6020830184612706565b6020808252601a908201527f4e6f7420656e6f7567682045746865722070726f76696465642e000000000000604082015260600190565b6020808252600e908201526d22bc31b2b2b23990373ab6b132b960911b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526017908201527f4e6f2062616c616e636520746f2077697468647261772e000000000000000000604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526025908201527f43414e4e4f54204d494e54205448524f554748204120435553544f4d20434f4e60408201526415149050d560da1b606082015260800190565b6020808252602d908201527f594f552043414e2754204d494e54204d4f5245205448414e204156414c41424c60408201526c11481513d2d1538810d3d55395609a1b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b60208082526018908201527f4e6f206d6f726520746f6b656e7320617661696c61626c650000000000000000604082015260600190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526027908201527f594f552043414e2754204d494e54204d4f5245205448414e204d4158494d554d60408201526620535550504c5960c81b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba30b73a103a37b5b2b760891b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526022908201527f594f552043414e2754204d494e54204e4f572c2053414c452049532050415553604082015261115160f21b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b90815260200190565b6000821982111561309b5761309b613180565b500190565b6000826130af576130af613196565b500490565b60008160001904831182151516156130ce576130ce613180565b500290565b6000828210156130e5576130e5613180565b500390565b60005b838110156131055781810151838201526020016130ed565b8381111561165e5750506000910152565b60028104600182168061312a57607f821691505b6020821081141561314b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561316557613165613180565b5060010190565b60008261317b5761317b613196565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f0c57600080fd5b8015158114610f0c57600080fd5b6001600160e01b031981168114610f0c57600080fdfea26469706673582212206ec48d166387218379d58de22c531584932e283a28153b6ce0362363cbb5150464736f6c63430008000033
Deployed Bytecode Sourcemap
66523:4664:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37473:40;37489:12;:10;:12::i;:::-;37503:9;37473:40;;;;;;;:::i;:::-;;;;;;;;66523:4664;;;;;52194:305;;;;;;;;;;-1:-1:-1;52194:305:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69968:100;;;;;;;;;;-1:-1:-1;69968:100:0;;;;;:::i;:::-;;:::i;:::-;;53139;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;54698:221::-;;;;;;;;;;-1:-1:-1;54698:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;67025:40::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;70072:516::-;;;;;;;;;;-1:-1:-1;70072:516:0;;;;;:::i;:::-;;:::i;54221:411::-;;;;;;;;;;-1:-1:-1;54221:411:0;;;;;:::i;:::-;;:::i;69808:156::-;;;;;;;;;;-1:-1:-1;69808:156:0;;;;;:::i;:::-;;:::i;2284:91::-;;;;;;;;;;;;;:::i;39259:566::-;;;;;;;;;;-1:-1:-1;39259:566:0;;;;;:::i;:::-;;:::i;55448:339::-;;;;;;;;;;-1:-1:-1;55448:339:0;;;;;:::i;:::-;;:::i;69608:196::-;;;;;;;;;;-1:-1:-1;69608:196:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;67295:26::-;;;;;;;;;;;;;:::i;67122:34::-;;;;;;;;;;;;;:::i;66757:41::-;;;;;;;;;;;;;:::i;37604:91::-;;;;;;;;;;;;;:::i;70963:219::-;;;;;;;;;;;;;:::i;38733:135::-;;;;;;;;;;-1:-1:-1;38733:135:0;;;;;:::i;:::-;;:::i;68063:1536::-;;;;;;:::i;:::-;;:::i;55858:185::-;;;;;;;;;;-1:-1:-1;55858:185:0;;;;;:::i;:::-;;:::i;40093:641::-;;;;;;;;;;-1:-1:-1;40093:641:0;;;;;:::i;:::-;;:::i;67971:88::-;;;;;;;;;;-1:-1:-1;67971:88:0;;;;;:::i;:::-;;:::i;67161:31::-;;;;;;;;;;;;;:::i;52833:239::-;;;;;;;;;;-1:-1:-1;52833:239:0;;;;;:::i;:::-;;:::i;67234:21::-;;;;;;;;;;;;;:::i;52563:208::-;;;;;;;;;;-1:-1:-1;52563:208:0;;;;;:::i;:::-;;:::i;20711:103::-;;;;;;;;;;;;;:::i;67197:32::-;;;;;;;;;;;;;:::i;66894:41::-;;;;;;;;;;;;;:::i;38959:100::-;;;;;;;;;;-1:-1:-1;38959:100:0;;;;;:::i;:::-;;:::i;20060:87::-;;;;;;;;;;;;;:::i;66663:23::-;;;;;;;;;;;;;:::i;53308:104::-;;;;;;;;;;;;;:::i;38455:109::-;;;;;;;;;;-1:-1:-1;38455:109:0;;;;;:::i;:::-;;:::i;2466:99::-;;;;;;;;;;;;;:::i;54991:155::-;;;;;;;;;;-1:-1:-1;54991:155:0;;;;;:::i;:::-;;:::i;67261:28::-;;;;;;;;;;;;;:::i;56114:328::-;;;;;;;;;;-1:-1:-1;56114:328:0;;;;;:::i;:::-;;:::i;67070:47::-;;;;;;;;;;;;;:::i;66983:37::-;;;;;;;;;;;;;:::i;66723:27::-;;;;;;;;;;;;;:::i;66803:38::-;;;;;;;;;;;;;:::i;67326:27::-;;;;;;;;;;;;;:::i;70592:367::-;;;;;;;;;;-1:-1:-1;70592:367:0;;;;;:::i;:::-;;:::i;38251:105::-;;;;;;;;;;-1:-1:-1;38251:105:0;;;;;:::i;:::-;;:::i;38041:119::-;;;;;;;;;;-1:-1:-1;38041:119:0;;;;;:::i;:::-;;:::i;66846:43::-;;;;;;;;;;;;;:::i;66940:38::-;;;;;;;;;;;;;:::i;2671:115::-;;;;;;;;;;;;;:::i;37789:95::-;;;;;;;;;;;;;:::i;55217:164::-;;;;;;;;;;-1:-1:-1;55217:164:0;;;;;:::i;:::-;;:::i;20969:201::-;;;;;;;;;;-1:-1:-1;20969:201:0;;;;;:::i;:::-;;:::i;66691:27::-;;;;;;;;;;;;;:::i;18731:98::-;18811:10;18731:98;:::o;52194:305::-;52296:4;-1:-1:-1;;;;;;52333:40:0;;-1:-1:-1;;;52333:40:0;;:105;;-1:-1:-1;;;;;;;52390:48:0;;-1:-1:-1;;;52390:48:0;52333:105;:158;;;;52455:36;52479:11;52455:23;:36::i;:::-;52313:178;;52194:305;;;;:::o;69968:100::-;20291:12;:10;:12::i;:::-;-1:-1:-1;;;;;20280:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20280:23:0;;20272:68;;;;-1:-1:-1;;;20272:68:0;;;;;;;:::i;:::-;;;;;;;;;70037:9:::1;:25:::0;69968:100::o;53139:::-;53193:13;53226:5;53219:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53139:100;:::o;54698:221::-;54774:7;54802:16;54810:7;54802;:16::i;:::-;54794:73;;;;-1:-1:-1;;;54794:73:0;;;;;;;:::i;:::-;-1:-1:-1;54887:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;54887:24:0;;54698:221::o;67025:40::-;67062:3;67025:40;:::o;70072:516::-;20291:12;:10;:12::i;:::-;-1:-1:-1;;;;;20280:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20280:23:0;;20272:68;;;;-1:-1:-1;;;20272:68:0;;;;;;;:::i;:::-;70220:29:::1;;;;;;;:::i;:::-;;;;;;;;;;;;;70210:40;;;;;;70193:10;70175:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;70165:41;;;;;;:85;70162:413;;;70260:13;:25:::0;;;70162:413:::1;;;70362:26;;;;;;;:::i;:::-;;;;;;;;;;;;;70352:37;;;;;;70335:10;70317:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;70307:41;;;;;;:82;70304:271;;;70399:10;:22:::0;;;70304:271:::1;;;70498:31;;;;;;;:::i;:::-;;;;;;;;;;;;;70488:42;;;;;;70471:10;70453:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;70443:41;;;;;;:87;70440:135;;;70540:15;:27:::0;;;70440:135:::1;70072:516:::0;;:::o;54221:411::-;54302:13;54318:23;54333:7;54318:14;:23::i;:::-;54302:39;;54366:5;-1:-1:-1;;;;;54360:11:0;:2;-1:-1:-1;;;;;54360:11:0;;;54352:57;;;;-1:-1:-1;;;54352:57:0;;;;;;;:::i;:::-;54460:5;-1:-1:-1;;;;;54444:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;54444:21:0;;:62;;;;54469:37;54486:5;54493:12;:10;:12::i;54469:37::-;54422:168;;;;-1:-1:-1;;;54422:168:0;;;;;;;:::i;:::-;54603:21;54612:2;54616:7;54603:8;:21::i;:::-;54221:411;;;:::o;69808:156::-;20291:12;:10;:12::i;:::-;-1:-1:-1;;;;;20280:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20280:23:0;;20272:68;;;;-1:-1:-1;;;20272:68:0;;;;;;;:::i;:::-;69897:11:::1;:26:::0;;-1:-1:-1;;;;;;69897:26:0::1;-1:-1:-1::0;;;;;69897:26:0;;;::::1;::::0;;;::::1;::::0;;;69930:12:::1;:28:::0;69808:156::o;2284:91::-;2355:12;;2284:91;:::o;39259:566::-;-1:-1:-1;;;;;39335:16:0;;39354:1;39335:16;;;:7;:16;;;;;;39327:71;;;;-1:-1:-1;;;39327:71:0;;;;;;;:::i;:::-;39411:21;39459:15;:13;:15::i;:::-;39435:39;;:21;:39;:::i;:::-;39411:63;;39485:15;39503:58;39519:7;39528:13;39543:17;39552:7;39543:8;:17::i;:::-;39503:15;:58::i;:::-;39485:76;-1:-1:-1;39582:12:0;39574:68;;;;-1:-1:-1;;;39574:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39655:18:0;;;;;;:9;:18;;;;;:29;;39677:7;;39655:18;:29;;39677:7;;39655:29;:::i;:::-;;;;;;;;39713:7;39695:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;39733:35:0;;-1:-1:-1;39751:7:0;39760;39733:17;:35::i;:::-;39784:33;39800:7;39809;39784:33;;;;;;;:::i;:::-;;;;;;;;39259:566;;;:::o;55448:339::-;55643:41;55662:12;:10;:12::i;:::-;55676:7;55643:18;:41::i;:::-;55635:103;;;;-1:-1:-1;;;55635:103:0;;;;;;;:::i;:::-;55751:28;55761:4;55767:2;55771:7;55751:9;:28::i;69608:196::-;69745:11;;69773:12;;69690:16;;;;-1:-1:-1;;;;;69745:11:0;;;;69758:39;;69791:5;;69758:28;;:10;;:14;:28::i;:::-;:32;;:39::i;:::-;69737:61;;;;69608:196;;;;;:::o;67295:26::-;;;-1:-1:-1;;;;;67295:26:0;;:::o;67122:34::-;;;;:::o;66757:41::-;;;;:::o;37604:91::-;37675:12;;37604:91;:::o;70963:219::-;20291:12;:10;:12::i;:::-;-1:-1:-1;;;;;20280:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20280:23:0;;20272:68;;;;-1:-1:-1;;;20272:68:0;;;;;;;:::i;:::-;71046:1:::1;71022:21;:25;71014:61;;;;-1:-1:-1::0;;;71014:61:0::1;;;;;;;:::i;:::-;71087:9;71082:95;71106:14;:21:::0;71102:25;::::1;71082:95;;;71143:26;71159:8;71165:1;71159:5;:8::i;71143:26::-;71129:3:::0;::::1;::::0;::::1;:::i;:::-;;;;71082:95;;;;70963:219::o:0;38733:135::-;-1:-1:-1;;;;;38830:21:0;;;38803:7;38830:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;38733:135::o;68063:1536::-;68147:7;:5;:7::i;:::-;-1:-1:-1;;;;;68133:21:0;:10;-1:-1:-1;;;;;68133:21:0;;68129:1310;;68188:1;68176:9;;:13;68167:61;;;;-1:-1:-1;;;68167:61:0;;;;;;;:::i;:::-;67062:3;68271:13;:11;:13::i;:::-;:26;;;;:::i;:::-;68261:6;68246:12;:10;:12::i;:::-;:21;;;;:::i;:::-;:51;;68237:104;;;;-1:-1:-1;;;68237:104:0;;;;;;;:::i;:::-;68406:1;68396:6;67062:3;68359:21;:19;:21::i;:::-;:34;;;;:::i;:::-;:43;;;;:::i;:::-;:48;;68350:107;;;;-1:-1:-1;;;68350:107:0;;;;;;;:::i;:::-;68476:9;68489:10;68476:23;68467:74;;;;-1:-1:-1;;;68467:74:0;;;;;;;:::i;:::-;68571:21;67018:2;66931:4;68571:21;:::i;:::-;68555:12;:10;:12::i;:::-;:37;68551:512;;68638:6;68622:13;;:22;;;;:::i;:::-;68607:12;:37;68670:15;;68655:12;:30;68551:512;;;67018:2;68730:20;66931:4;66974;68730:20;:::i;:::-;:31;;;;:::i;:::-;68714:12;:10;:12::i;:::-;:47;;:87;;;;-1:-1:-1;68780:21:0;67018:2;66931:4;68780:21;:::i;:::-;68765:12;:10;:12::i;:::-;:36;68714:87;68710:353;;;68844:6;68831:10;;:19;;;;:::i;:::-;68816:12;:34;68876:12;;68861;:27;68710:353;;;67018:2;68932:20;66931:4;66974;68932:20;:::i;:::-;:31;;;;:::i;:::-;68917:12;:10;:12::i;:::-;:46;68913:150;;;69008:6;68990:15;;:24;;;;:::i;:::-;68975:12;:39;69040:12;;69025;:27;68913:150;69090:12;;69080:6;:22;;69072:49;;;;-1:-1:-1;;;69072:49:0;;;;;;;:::i;:::-;69157:12;;69144:9;:25;;69136:64;;;;-1:-1:-1;;;69136:64:0;;;;;;;:::i;:::-;68129:1310;;;69267:13;:11;:13::i;:::-;69257:6;69242:12;:10;:12::i;:::-;:21;;;;:::i;:::-;:38;;69233:91;;;;-1:-1:-1;;;69233:91:0;;;;;;;:::i;:::-;69377:1;69367:6;69343:21;:19;:21::i;:::-;:30;;;;:::i;:::-;:35;;69334:94;;;;-1:-1:-1;;;69334:94:0;;;;;;;:::i;:::-;69465:1;69447:145;69474:6;69468:2;:12;69447:145;;69499:10;69512:11;:9;:11::i;:::-;69499:24;;69536:18;69546:3;69551:2;69536:9;:18::i;:::-;69567:13;:15;;;:13;:15;;;:::i;:::-;;;;;;69447:145;69482:4;;;;;:::i;:::-;;;;69447:145;;55858:185;55996:39;56013:4;56019:2;56023:7;55996:39;;;;;;;;;;;;:16;:39::i;40093:641::-;-1:-1:-1;;;;;40175:16:0;;40194:1;40175:16;;;:7;:16;;;;;;40167:71;;;;-1:-1:-1;;;40167:71:0;;;;;;;:::i;:::-;40251:21;40308:20;40322:5;40308:13;:20::i;:::-;40275:30;;-1:-1:-1;;;40275:30:0;;-1:-1:-1;;;;;40275:15:0;;;;;:30;;40299:4;;40275:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;40251:77;;40339:15;40357:65;40373:7;40382:13;40397:24;40406:5;40413:7;40397:8;:24::i;40357:65::-;40339:83;-1:-1:-1;40443:12:0;40435:68;;;;-1:-1:-1;;;40435:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40516:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;40550:7;;40516:21;:41;;40550:7;;40516:41;:::i;:::-;;;;-1:-1:-1;;;;;;;40568:26:0;;;;;;:19;:26;;;;;:37;;40598:7;;40568:26;:37;;40598:7;;40568:37;:::i;:::-;;;;-1:-1:-1;40618:47:0;;-1:-1:-1;40641:5:0;40648:7;40657;40618:22;:47::i;:::-;40702:5;-1:-1:-1;;;;;40681:45:0;;40709:7;40718;40681:45;;;;;;;:::i;:::-;;;;;;;;40093:641;;;;:::o;67971:88::-;20291:12;:10;:12::i;:::-;-1:-1:-1;;;;;20280:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20280:23:0;;20272:68;;;;-1:-1:-1;;;20272:68:0;;;;;;;:::i;:::-;68039:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;67161:31::-:0;;;;:::o;52833:239::-;52905:7;52941:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52941:16:0;52976:19;52968:73;;;;-1:-1:-1;;;52968:73:0;;;;;;;:::i;67234:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52563:208::-;52635:7;-1:-1:-1;;;;;52663:19:0;;52655:74;;;;-1:-1:-1;;;52655:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;52747:16:0;;;;;:9;:16;;;;;;;52563:208::o;20711:103::-;20291:12;:10;:12::i;:::-;-1:-1:-1;;;;;20280:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20280:23:0;;20272:68;;;;-1:-1:-1;;;20272:68:0;;;;;;;:::i;:::-;20776:30:::1;20803:1;20776:18;:30::i;:::-;20711:103::o:0;67197:32::-;;;;:::o;66894:41::-;66931:4;66894:41;:::o;38959:100::-;39010:7;39037;39045:5;39037:14;;;;;;-1:-1:-1;;;39037:14:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39037:14:0;;38959:100;-1:-1:-1;;38959:100:0:o;20060:87::-;20133:6;;-1:-1:-1;;;;;20133:6:0;20060:87;:::o;66663:23::-;;;;:::o;53308:104::-;53364:13;53397:7;53390:14;;;;;:::i;38455:109::-;-1:-1:-1;;;;;38538:18:0;38511:7;38538:18;;;:9;:18;;;;;;;38455:109::o;2466:99::-;2509:7;2536:21;:11;:19;:21::i;:::-;2529:28;;2466:99;:::o;54991:155::-;55086:52;55105:12;:10;:12::i;:::-;55119:8;55129;55086:18;:52::i;67261:28::-;;;;:::o;56114:328::-;56289:41;56308:12;:10;:12::i;:::-;56322:7;56289:18;:41::i;:::-;56281:103;;;;-1:-1:-1;;;56281:103:0;;;;;;;:::i;:::-;56395:39;56409:4;56415:2;56419:7;56428:5;56395:13;:39::i;:::-;56114:328;;;;:::o;67070:47::-;67112:5;67070:47;:::o;66983:37::-;67018:2;66983:37;:::o;66723:27::-;;;;:::o;66803:38::-;;;;:::o;67326:27::-;;;;:::o;70592:367::-;70665:13;70695:16;70703:7;70695;:16::i;:::-;70687:76;;;;-1:-1:-1;;;70687:76:0;;;;;;;:::i;:::-;70770:28;70801:10;:8;:10::i;:::-;70770:41;;70857:1;70832:14;70826:28;:32;:127;;;;;;;;;;;;;;;;;70894:14;70910:18;:7;:16;:18::i;:::-;70877:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70826:127;70819:134;70592:367;-1:-1:-1;;;70592:367:0:o;38251:105::-;-1:-1:-1;;;;;38332:16:0;38305:7;38332:16;;;:7;:16;;;;;;;38251:105::o;38041:119::-;-1:-1:-1;;;;;38126:26:0;38099:7;38126:26;;;:19;:26;;;;;;;38041:119::o;66846:43::-;;;;:::o;66940:38::-;66974:4;66940:38;:::o;2671:115::-;2723:7;2766:12;:10;:12::i;:::-;2750:13;:11;:13::i;:::-;:28;;;;:::i;37789:95::-;37862:14;;37789:95;:::o;55217:164::-;-1:-1:-1;;;;;55338:25:0;;;55314:4;55338:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;55217:164::o;20969:201::-;20291:12;:10;:12::i;:::-;-1:-1:-1;;;;;20280:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20280:23:0;;20272:68;;;;-1:-1:-1;;;20272:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21058:22:0;::::1;21050:73;;;;-1:-1:-1::0;;;21050:73:0::1;;;;;;;:::i;:::-;21134:28;21153:8;21134:18;:28::i;66691:27::-:0;;;;:::o;872:114::-;964:14;;872:114::o;2896:192::-;2962:7;3230:1;3206:21;:19;:21::i;:::-;:25;3198:62;;;;-1:-1:-1;;;3198:62:0;;;;;;;:::i;:::-;2982:13:::1;2998:21;:11;:19;:21::i;:::-;2982:37;;3032:23;:11;994:127:::0;1083:19;;1101:1;1083:19;;;994:127::o;22799:387::-;23122:20;23170:8;;;22799:387::o;44804:157::-;-1:-1:-1;;;;;;44913:40:0;;-1:-1:-1;;;44913:40:0;44804:157;;;:::o;57952:127::-;58017:4;58041:16;;;:7;:16;;;;;;-1:-1:-1;;;;;58041:16:0;:30;;;57952:127::o;61934:174::-;62009:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;62009:29:0;-1:-1:-1;;;;;62009:29:0;;;;;;;;:24;;62063:23;62009:24;62063:14;:23::i;:::-;-1:-1:-1;;;;;62054:46:0;;;;;;;;;;;61934:174;;:::o;40912:248::-;41122:12;;-1:-1:-1;;;;;41102:16:0;;41058:7;41102:16;;;:7;:16;;;;;;41058:7;;41137:15;;41086:32;;:13;:32;:::i;:::-;41085:49;;;;:::i;:::-;:67;;;;:::i;:::-;41078:74;40912:248;-1:-1:-1;;;;40912:248:0:o;24121:317::-;24236:6;24211:21;:31;;24203:73;;;;-1:-1:-1;;;24203:73:0;;;;;;;:::i;:::-;24290:12;24308:9;-1:-1:-1;;;;;24308:14:0;24330:6;24308:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24289:52;;;24360:7;24352:78;;;;-1:-1:-1;;;24352:78:0;;;;;;;:::i;58246:348::-;58339:4;58364:16;58372:7;58364;:16::i;:::-;58356:73;;;;-1:-1:-1;;;58356:73:0;;;;;;;:::i;:::-;58440:13;58456:23;58471:7;58456:14;:23::i;:::-;58440:39;;58509:5;-1:-1:-1;;;;;58498:16:0;:7;-1:-1:-1;;;;;58498:16:0;;:51;;;;58542:7;-1:-1:-1;;;;;58518:31:0;:20;58530:7;58518:11;:20::i;:::-;-1:-1:-1;;;;;58518:31:0;;58498:51;:87;;;;58553:32;58570:5;58577:7;58553:16;:32::i;61238:578::-;61397:4;-1:-1:-1;;;;;61370:31:0;:23;61385:7;61370:14;:23::i;:::-;-1:-1:-1;;;;;61370:31:0;;61362:85;;;;-1:-1:-1;;;61362:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61466:16:0;;61458:65;;;;-1:-1:-1;;;61458:65:0;;;;;;;:::i;:::-;61536:39;61557:4;61563:2;61567:7;61536:20;:39::i;:::-;61640:29;61657:1;61661:7;61640:8;:29::i;:::-;-1:-1:-1;;;;;61682:15:0;;;;;;:9;:15;;;;;:20;;61701:1;;61682:15;:20;;61701:1;;61682:20;:::i;:::-;;;;-1:-1:-1;;;;;;;61713:13:0;;;;;;:9;:13;;;;;:18;;61730:1;;61713:13;:18;;61730:1;;61713:18;:::i;:::-;;;;-1:-1:-1;;61742:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;61742:21:0;-1:-1:-1;;;;;61742:21:0;;;;;;;;;61781:27;;61742:16;;61781:27;;;;;;;61238:578;;;:::o;9446:98::-;9504:7;9531:5;9535:1;9531;:5;:::i;9845:98::-;9903:7;9930:5;9934:1;9930;:5;:::i;4522:1264::-;4589:7;3230:1;3206:21;:19;:21::i;:::-;:25;3198:62;;;;-1:-1:-1;;;3198:62:0;;;;;;;:::i;:::-;4609:16:::1;4644:12;:10;:12::i;:::-;4628:13;:11;:13::i;:::-;:28;;;;:::i;:::-;4609:47;;4667:14;4926:8;4751:10;4780:14;4813:16;4848:14;4881:15;4716:195;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4692:230;;;;;;4684:239;;:250;;;;:::i;:::-;4947:13;4979:19:::0;;;:11:::1;:19;::::0;;;;;4667:267;;-1:-1:-1;4947:13:0;4975:304:::1;;-1:-1:-1::0;5124:6:0;4975:304:::1;;;-1:-1:-1::0;5248:19:0::1;::::0;;;:11:::1;:19;::::0;;;;;4975:304:::1;5356:11;:25;5368:12;5379:1;5368:8:::0;:12:::1;:::i;:::-;5356:25;;;;;;;;;;;;5385:1;5356:30;5352:331;;;5490:12;5501:1;5490:8:::0;:12:::1;:::i;:::-;5468:19;::::0;;;:11:::1;:19;::::0;;;;:34;5352:331:::1;;;5646:11;:25;5658:12;5669:1;5658:8:::0;:12:::1;:::i;:::-;5646:25:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;5646:25:0;;;;5624:19;;;:11:::1;:19:::0;;;;:47;5352:331:::1;5724:17;:15;:17::i;:::-;-1:-1:-1::0;5769:9:0::1;::::0;5761:17:::1;::::0;:5;:17:::1;:::i;:::-;5754:24;;;;;4522:1264:::0;:::o;58936:110::-;59012:26;59022:2;59026:7;59012:26;;;;;;;;;;;;:9;:26::i;30880:211::-;30997:86;31017:5;31047:23;;;31072:2;31076:5;31024:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;31024:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31024:58:0;-1:-1:-1;;;;;;31024:58:0;;;;;;;;;;30997:19;:86::i;21330:191::-;21423:6;;;-1:-1:-1;;;;;21440:17:0;;;-1:-1:-1;;;;;;21440:17:0;;;;;;;21473:40;;21423:6;;;21440:17;21423:6;;21473:40;;21404:16;;21473:40;21330:191;;:::o;62250:315::-;62405:8;-1:-1:-1;;;;;62396:17:0;:5;-1:-1:-1;;;;;62396:17:0;;;62388:55;;;;-1:-1:-1;;;62388:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62454:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;:46;;-1:-1:-1;;62454:46:0;;;;;;;62516:41;;;;;62454:46;;62516:41;:::i;:::-;;;;;;;;62250:315;;;:::o;57324:::-;57481:28;57491:4;57497:2;57501:7;57481:9;:28::i;:::-;57528:48;57551:4;57557:2;57561:7;57570:5;57528:22;:48::i;:::-;57520:111;;;;-1:-1:-1;;;57520:111:0;;;;;;;:::i;67865:102::-;67925:13;67954:7;67947:14;;;;;:::i;16240:723::-;16296:13;16517:10;16513:53;;-1:-1:-1;16544:10:0;;;;;;;;;;;;-1:-1:-1;;;16544:10:0;;;;;;16513:53;16591:5;16576:12;16632:78;16639:9;;16632:78;;16665:8;;;;:::i;:::-;;-1:-1:-1;16688:10:0;;-1:-1:-1;16696:2:0;16688:10;;:::i;:::-;;;16632:78;;;16720:19;16752:6;16742:17;;;;;;-1:-1:-1;;;16742:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16742:17:0;;16720:39;;16770:154;16777:10;;16770:154;;16804:11;16814:1;16804:11;;:::i;:::-;;-1:-1:-1;16873:10:0;16881:2;16873:5;:10;:::i;:::-;16860:24;;:2;:24;:::i;:::-;16847:39;;16830:6;16837;16830:14;;;;;;-1:-1:-1;;;16830:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;16830:56:0;;;;;;;;-1:-1:-1;16901:11:0;16910:2;16901:11;;:::i;:::-;;;16770:154;;59273:321;59403:18;59409:2;59413:7;59403:5;:18::i;:::-;59454:54;59485:1;59489:2;59493:7;59502:5;59454:22;:54::i;:::-;59432:154;;;;-1:-1:-1;;;59432:154:0;;;;;;;:::i;33453:716::-;33877:23;33903:69;33931:4;33903:69;;;;;;;;;;;;;;;;;33911:5;-1:-1:-1;;;;;33903:27:0;;;:69;;;;;:::i;:::-;33987:17;;33877:95;;-1:-1:-1;33987:21:0;33983:179;;34084:10;34073:30;;;;;;;;;;;;:::i;:::-;34065:85;;;;-1:-1:-1;;;34065:85:0;;;;;;;:::i;63130:799::-;63285:4;63306:15;:2;-1:-1:-1;;;;;63306:13:0;;:15::i;:::-;63302:620;;;63358:2;-1:-1:-1;;;;;63342:36:0;;63379:12;:10;:12::i;:::-;63393:4;63399:7;63408:5;63342:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63342:72:0;;;;;;;;-1:-1:-1;;63342:72:0;;;;;;;;;;;;:::i;:::-;;;63338:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63584:13:0;;63580:272;;63627:60;;-1:-1:-1;;;63627:60:0;;;;;;;:::i;63580:272::-;63802:6;63796:13;63787:6;63783:2;63779:15;63772:38;63338:529;-1:-1:-1;;;;;;63465:51:0;-1:-1:-1;;;63465:51:0;;-1:-1:-1;63458:58:0;;63302:620;-1:-1:-1;63906:4:0;63130:799;;;;;;:::o;59930:382::-;-1:-1:-1;;;;;60010:16:0;;60002:61;;;;-1:-1:-1;;;60002:61:0;;;;;;;:::i;:::-;60083:16;60091:7;60083;:16::i;:::-;60082:17;60074:58;;;;-1:-1:-1;;;60074:58:0;;;;;;;:::i;:::-;60145:45;60174:1;60178:2;60182:7;60145:20;:45::i;:::-;-1:-1:-1;;;;;60203:13:0;;;;;;:9;:13;;;;;:18;;60220:1;;60203:13;:18;;60220:1;;60203:18;:::i;:::-;;;;-1:-1:-1;;60232:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;60232:21:0;-1:-1:-1;;;;;60232:21:0;;;;;;;;60271:33;;60232:16;;;60271:33;;60232:16;;60271:33;59930:382;;:::o;25605:229::-;25742:12;25774:52;25796:6;25804:4;25810:1;25813:12;25742;27020:18;27031:6;27020:10;:18::i;:::-;27012:60;;;;-1:-1:-1;;;27012:60:0;;;;;;;:::i;:::-;27086:12;27100:23;27127:6;-1:-1:-1;;;;;27127:11:0;27146:5;27153:4;27127:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27085:73;;;;27176:51;27193:7;27202:10;27214:12;27176:16;:51::i;:::-;27169:58;26725:510;-1:-1:-1;;;;;;;26725:510:0:o;29411:712::-;29561:12;29590:7;29586:530;;;-1:-1:-1;29621:10:0;29614:17;;29586:530;29735:17;;:21;29731:374;;29933:10;29927:17;29994:15;29981:10;29977:2;29973:19;29966:44;29881:148;30076:12;30069:20;;-1:-1:-1;;;30069:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:233::-;;724:3;717:4;709:6;705:17;701:27;691:2;;746:5;739;732:20;691:2;772:81;849:3;840:6;827:20;820:4;812:6;808:17;772:81;:::i;864:259::-;;976:2;964:9;955:7;951:23;947:32;944:2;;;997:6;989;982:22;944:2;1041:9;1028:23;1060:33;1087:5;1060:33;:::i;1400:402::-;;;1529:2;1517:9;1508:7;1504:23;1500:32;1497:2;;;1550:6;1542;1535:22;1497:2;1594:9;1581:23;1613:33;1640:5;1613:33;:::i;:::-;1665:5;-1:-1:-1;1722:2:1;1707:18;;1694:32;1735:35;1694:32;1735:35;:::i;:::-;1789:7;1779:17;;;1487:315;;;;;:::o;1807:470::-;;;;1953:2;1941:9;1932:7;1928:23;1924:32;1921:2;;;1974:6;1966;1959:22;1921:2;2018:9;2005:23;2037:33;2064:5;2037:33;:::i;:::-;2089:5;-1:-1:-1;2146:2:1;2131:18;;2118:32;2159:35;2118:32;2159:35;:::i;:::-;1911:366;;2213:7;;-1:-1:-1;;;2267:2:1;2252:18;;;;2239:32;;1911:366::o;2282:830::-;;;;;2454:3;2442:9;2433:7;2429:23;2425:33;2422:2;;;2476:6;2468;2461:22;2422:2;2520:9;2507:23;2539:33;2566:5;2539:33;:::i;:::-;2591:5;-1:-1:-1;2648:2:1;2633:18;;2620:32;2661:35;2620:32;2661:35;:::i;:::-;2715:7;-1:-1:-1;2769:2:1;2754:18;;2741:32;;-1:-1:-1;2824:2:1;2809:18;;2796:32;2851:18;2840:30;;2837:2;;;2888:6;2880;2873:22;2837:2;2916:22;;2969:4;2961:13;;2957:27;-1:-1:-1;2947:2:1;;3003:6;2995;2988:22;2947:2;3031:75;3098:7;3093:2;3080:16;3075:2;3071;3067:11;3031:75;:::i;:::-;3021:85;;;2412:700;;;;;;;:::o;3117:396::-;;;3243:2;3231:9;3222:7;3218:23;3214:32;3211:2;;;3264:6;3256;3249:22;3211:2;3308:9;3295:23;3327:33;3354:5;3327:33;:::i;:::-;3379:5;-1:-1:-1;3436:2:1;3421:18;;3408:32;3449;3408;3449;:::i;3518:327::-;;;3647:2;3635:9;3626:7;3622:23;3618:32;3615:2;;;3668:6;3660;3653:22;3615:2;3712:9;3699:23;3731:33;3758:5;3731:33;:::i;:::-;3783:5;3835:2;3820:18;;;;3807:32;;-1:-1:-1;;;3605:240:1:o;3850:257::-;;3970:2;3958:9;3949:7;3945:23;3941:32;3938:2;;;3991:6;3983;3976:22;3938:2;4028:9;4022:16;4047:30;4071:5;4047:30;:::i;4112:257::-;;4223:2;4211:9;4202:7;4198:23;4194:32;4191:2;;;4244:6;4236;4229:22;4191:2;4288:9;4275:23;4307:32;4333:5;4307:32;:::i;4374:261::-;;4496:2;4484:9;4475:7;4471:23;4467:32;4464:2;;;4517:6;4509;4502:22;4464:2;4554:9;4548:16;4573:32;4599:5;4573:32;:::i;4918:416::-;;;5061:2;5049:9;5040:7;5036:23;5032:32;5029:2;;;5082:6;5074;5067:22;5339:344;;5461:2;5449:9;5440:7;5436:23;5432:32;5429:2;;;5482:6;5474;5467:22;5429:2;5527:9;5514:23;5560:18;5552:6;5549:30;5546:2;;;5597:6;5589;5582:22;5546:2;5625:52;5669:7;5660:6;5649:9;5645:22;5625:52;:::i;5688:412::-;;;5827:2;5815:9;5806:7;5802:23;5798:32;5795:2;;;5848:6;5840;5833:22;5795:2;5893:9;5880:23;5926:18;5918:6;5915:30;5912:2;;;5963:6;5955;5948:22;5912:2;5991:52;6035:7;6026:6;6015:9;6011:22;5991:52;:::i;:::-;5981:62;6090:2;6075:18;;;;6062:32;;-1:-1:-1;;;;5785:315:1:o;6105:190::-;;6217:2;6205:9;6196:7;6192:23;6188:32;6185:2;;;6238:6;6230;6223:22;6185:2;-1:-1:-1;6266:23:1;;6175:120;-1:-1:-1;6175:120:1:o;6300:194::-;;6423:2;6411:9;6402:7;6398:23;6394:32;6391:2;;;6444:6;6436;6429:22;6391:2;-1:-1:-1;6472:16:1;;6381:113;-1:-1:-1;6381:113:1:o;6499:258::-;;;6628:2;6616:9;6607:7;6603:23;6599:32;6596:2;;;6649:6;6641;6634:22;6596:2;-1:-1:-1;;6677:23:1;;;6747:2;6732:18;;;6719:32;;-1:-1:-1;6586:171:1:o;6762:259::-;;6843:5;6837:12;6870:6;6865:3;6858:19;6886:63;6942:6;6935:4;6930:3;6926:14;6919:4;6912:5;6908:16;6886:63;:::i;:::-;7003:2;6982:15;-1:-1:-1;;6978:29:1;6969:39;;;;7010:4;6965:50;;6813:208;-1:-1:-1;;6813:208:1:o;7026:546::-;-1:-1:-1;;7353:2:1;7349:15;;;7345:24;;7333:37;;7404:15;;;;7400:24;;;7395:2;7386:12;;7379:46;7450:2;7441:12;;7434:28;;;;7487:2;7478:12;;7471:28;7524:3;7515:13;;7508:29;7562:3;7553:13;;7273:299::o;7577:274::-;;7744:6;7738:13;7760:53;7806:6;7801:3;7794:4;7786:6;7782:17;7760:53;:::i;:::-;7829:16;;;;;7714:137;-1:-1:-1;;7714:137:1:o;8137:637::-;;8455:6;8449:13;8471:53;8517:6;8512:3;8505:4;8497:6;8493:17;8471:53;:::i;:::-;8587:13;;8546:16;;;;8609:57;8587:13;8546:16;8643:4;8631:17;;8609:57;:::i;:::-;-1:-1:-1;;;8688:20:1;;8717:22;;;8766:1;8755:13;;8425:349;-1:-1:-1;;;;8425:349:1:o;8779:254::-;-1:-1:-1;;;8981:19:1;;9025:1;9016:11;;8971:62::o;9038:259::-;-1:-1:-1;;;9240:24:1;;9289:1;9280:11;;9230:67::o;9302:257::-;-1:-1:-1;;;9504:22:1;;9551:1;9542:11;;9494:65::o;9564:205::-;9764:3;9755:14::o;9774:203::-;-1:-1:-1;;;;;9938:32:1;;;;9920:51;;9908:2;9893:18;;9875:102::o;9982:282::-;-1:-1:-1;;;;;10182:32:1;;;;10164:51;;10246:2;10231:18;;10224:34;10152:2;10137:18;;10119:145::o;10269:490::-;-1:-1:-1;;;;;10538:15:1;;;10520:34;;10590:15;;10585:2;10570:18;;10563:43;10637:2;10622:18;;10615:34;;;10685:3;10680:2;10665:18;;10658:31;;;10269:490;;10706:47;;10733:19;;10725:6;10706:47;:::i;:::-;10698:55;10472:287;-1:-1:-1;;;;;;10472:287:1:o;11043:187::-;11208:14;;11201:22;11183:41;;11171:2;11156:18;;11138:92::o;11235:221::-;;11384:2;11373:9;11366:21;11404:46;11446:2;11435:9;11431:18;11423:6;11404:46;:::i;11461:350::-;11663:2;11645:21;;;11702:2;11682:18;;;11675:30;11741:28;11736:2;11721:18;;11714:56;11802:2;11787:18;;11635:176::o;11816:338::-;12018:2;12000:21;;;12057:2;12037:18;;;12030:30;-1:-1:-1;;;12091:2:1;12076:18;;12069:44;12145:2;12130:18;;11990:164::o;12159:414::-;12361:2;12343:21;;;12400:2;12380:18;;;12373:30;12439:34;12434:2;12419:18;;12412:62;-1:-1:-1;;;12505:2:1;12490:18;;12483:48;12563:3;12548:19;;12333:240::o;12578:402::-;12780:2;12762:21;;;12819:2;12799:18;;;12792:30;12858:34;12853:2;12838:18;;12831:62;-1:-1:-1;;;12924:2:1;12909:18;;12902:36;12970:3;12955:19;;12752:228::o;12985:347::-;13187:2;13169:21;;;13226:2;13206:18;;;13199:30;13265:25;13260:2;13245:18;;13238:53;13323:2;13308:18;;13159:173::o;13337:352::-;13539:2;13521:21;;;13578:2;13558:18;;;13551:30;13617;13612:2;13597:18;;13590:58;13680:2;13665:18;;13511:178::o;13694:401::-;13896:2;13878:21;;;13935:2;13915:18;;;13908:30;13974:34;13969:2;13954:18;;13947:62;-1:-1:-1;;;14040:2:1;14025:18;;14018:35;14085:3;14070:19;;13868:227::o;14100:409::-;14302:2;14284:21;;;14341:2;14321:18;;;14314:30;14380:34;14375:2;14360:18;;14353:62;-1:-1:-1;;;14446:2:1;14431:18;;14424:43;14499:3;14484:19;;14274:235::o;14514:402::-;14716:2;14698:21;;;14755:2;14735:18;;;14728:30;14794:34;14789:2;14774:18;;14767:62;-1:-1:-1;;;14860:2:1;14845:18;;14838:36;14906:3;14891:19;;14688:228::o;14921:400::-;15123:2;15105:21;;;15162:2;15142:18;;;15135:30;15201:34;15196:2;15181:18;;15174:62;-1:-1:-1;;;15267:2:1;15252:18;;15245:34;15311:3;15296:19;;15095:226::o;15326:349::-;15528:2;15510:21;;;15567:2;15547:18;;;15540:30;15606:27;15601:2;15586:18;;15579:55;15666:2;15651:18;;15500:175::o;15680:422::-;15882:2;15864:21;;;15921:2;15901:18;;;15894:30;15960:34;15955:2;15940:18;;15933:62;16031:28;16026:2;16011:18;;16004:56;16092:3;16077:19;;15854:248::o;16107:348::-;16309:2;16291:21;;;16348:2;16328:18;;;16321:30;16387:26;16382:2;16367:18;;16360:54;16446:2;16431:18;;16281:174::o;16460:353::-;16662:2;16644:21;;;16701:2;16681:18;;;16674:30;16740:31;16735:2;16720:18;;16713:59;16804:2;16789:18;;16634:179::o;17225:408::-;17427:2;17409:21;;;17466:2;17446:18;;;17439:30;17505:34;17500:2;17485:18;;17478:62;-1:-1:-1;;;17571:2:1;17556:18;;17549:42;17623:3;17608:19;;17399:234::o;17638:407::-;17840:2;17822:21;;;17879:2;17859:18;;;17852:30;17918:34;17913:2;17898:18;;17891:62;-1:-1:-1;;;17984:2:1;17969:18;;17962:41;18035:3;18020:19;;17812:233::o;18050:420::-;18252:2;18234:21;;;18291:2;18271:18;;;18264:30;18330:34;18325:2;18310:18;;18303:62;18401:26;18396:2;18381:18;;18374:54;18460:3;18445:19;;18224:246::o;18475:406::-;18677:2;18659:21;;;18716:2;18696:18;;;18689:30;18755:34;18750:2;18735:18;;18728:62;-1:-1:-1;;;18821:2:1;18806:18;;18799:40;18871:3;18856:19;;18649:232::o;18886:405::-;19088:2;19070:21;;;19127:2;19107:18;;;19100:30;19166:34;19161:2;19146:18;;19139:62;-1:-1:-1;;;19232:2:1;19217:18;;19210:39;19281:3;19266:19;;19060:231::o;19296:403::-;19498:2;19480:21;;;19537:2;19517:18;;;19510:30;19576:34;19571:2;19556:18;;19549:62;-1:-1:-1;;;19642:2:1;19627:18;;19620:37;19689:3;19674:19;;19470:229::o;19704:356::-;19906:2;19888:21;;;19925:18;;;19918:30;19984:34;19979:2;19964:18;;19957:62;20051:2;20036:18;;19878:182::o;20065:408::-;20267:2;20249:21;;;20306:2;20286:18;;;20279:30;20345:34;20340:2;20325:18;;20318:62;-1:-1:-1;;;20411:2:1;20396:18;;20389:42;20463:3;20448:19;;20239:234::o;20478:356::-;20680:2;20662:21;;;20699:18;;;20692:30;20758:34;20753:2;20738:18;;20731:62;20825:2;20810:18;;20652:182::o;20839:411::-;21041:2;21023:21;;;21080:2;21060:18;;;21053:30;21119:34;21114:2;21099:18;;21092:62;-1:-1:-1;;;21185:2:1;21170:18;;21163:45;21240:3;21225:19;;21013:237::o;21255:405::-;21457:2;21439:21;;;21496:2;21476:18;;;21469:30;21535:34;21530:2;21515:18;;21508:62;-1:-1:-1;;;21601:2:1;21586:18;;21579:39;21650:3;21635:19;;21429:231::o;21665:397::-;21867:2;21849:21;;;21906:2;21886:18;;;21879:30;21945:34;21940:2;21925:18;;21918:62;-1:-1:-1;;;22011:2:1;21996:18;;21989:31;22052:3;22037:19;;21839:223::o;22067:413::-;22269:2;22251:21;;;22308:2;22288:18;;;22281:30;22347:34;22342:2;22327:18;;22320:62;-1:-1:-1;;;22413:2:1;22398:18;;22391:47;22470:3;22455:19;;22241:239::o;22485:353::-;22687:2;22669:21;;;22726:2;22706:18;;;22699:30;22765:31;22760:2;22745:18;;22738:59;22829:2;22814:18;;22659:179::o;22843:398::-;23045:2;23027:21;;;23084:2;23064:18;;;23057:30;23123:34;23118:2;23103:18;;23096:62;-1:-1:-1;;;23189:2:1;23174:18;;23167:32;23231:3;23216:19;;23017:224::o;23246:406::-;23448:2;23430:21;;;23487:2;23467:18;;;23460:30;23526:34;23521:2;23506:18;;23499:62;-1:-1:-1;;;23592:2:1;23577:18;;23570:40;23642:3;23627:19;;23420:232::o;23657:177::-;23803:25;;;23791:2;23776:18;;23758:76::o;23839:128::-;;23910:1;23906:6;23903:1;23900:13;23897:2;;;23916:18;;:::i;:::-;-1:-1:-1;23952:9:1;;23887:80::o;23972:120::-;;24038:1;24028:2;;24043:18;;:::i;:::-;-1:-1:-1;24077:9:1;;24018:74::o;24097:168::-;;24203:1;24199;24195:6;24191:14;24188:1;24185:21;24180:1;24173:9;24166:17;24162:45;24159:2;;;24210:18;;:::i;:::-;-1:-1:-1;24250:9:1;;24149:116::o;24270:125::-;;24338:1;24335;24332:8;24329:2;;;24343:18;;:::i;:::-;-1:-1:-1;24380:9:1;;24319:76::o;24400:258::-;24472:1;24482:113;24496:6;24493:1;24490:13;24482:113;;;24572:11;;;24566:18;24553:11;;;24546:39;24518:2;24511:10;24482:113;;;24613:6;24610:1;24607:13;24604:2;;;-1:-1:-1;;24648:1:1;24630:16;;24623:27;24453:205::o;24663:380::-;24748:1;24738:12;;24795:1;24785:12;;;24806:2;;24860:4;24852:6;24848:17;24838:27;;24806:2;24913;24905:6;24902:14;24882:18;24879:38;24876:2;;;24959:10;24954:3;24950:20;24947:1;24940:31;24994:4;24991:1;24984:15;25022:4;25019:1;25012:15;24876:2;;24718:325;;;:::o;25048:135::-;;-1:-1:-1;;25108:17:1;;25105:2;;;25128:18;;:::i;:::-;-1:-1:-1;25175:1:1;25164:13;;25095:88::o;25188:112::-;;25246:1;25236:2;;25251:18;;:::i;:::-;-1:-1:-1;25285:9:1;;25226:74::o;25305:127::-;25366:10;25361:3;25357:20;25354:1;25347:31;25397:4;25394:1;25387:15;25421:4;25418:1;25411:15;25437:127;25498:10;25493:3;25489:20;25486:1;25479:31;25529:4;25526:1;25519:15;25553:4;25550:1;25543:15;25569:127;25630:10;25625:3;25621:20;25618:1;25611:31;25661:4;25658:1;25651:15;25685:4;25682:1;25675:15;25701:133;-1:-1:-1;;;;;25778:31:1;;25768:42;;25758:2;;25824:1;25821;25814:12;25839:120;25927:5;25920:13;25913:21;25906:5;25903:32;25893:2;;25949:1;25946;25939:12;25964:133;-1:-1:-1;;;;;;26040:32:1;;26030:43;;26020:2;;26087:1;26084;26077:12
Swarm Source
ipfs://6ec48d166387218379d58de22c531584932e283a28153b6ce0362363cbb51504
Loading...
Loading
Loading...
Loading
OVERVIEW
#MINTING PRICE: 0.07 + GAS### [CLICK HERE TO MINT](https://gentletiger.club)Tigers are different - black, white, red! There are **15 breeds** of tigers, some of which are very rare and need to be rescued first. The tigers were taken away from the masquerade ball, so they ar...Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.