Overview
CRO Balance
10 CRO
CRO Value
$0.77 (@ $0.08/CRO)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 2,764 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 16216062 | 8 hrs ago | IN | 0 CRO | 0.2337746 | ||||
Set Approval For... | 16159253 | 4 days ago | IN | 0 CRO | 0.2337746 | ||||
Set Approval For... | 16108536 | 7 days ago | IN | 0 CRO | 0.2337746 | ||||
Set Approval For... | 16103027 | 7 days ago | IN | 0 CRO | 0.23152943 | ||||
Set Approval For... | 16006960 | 13 days ago | IN | 0 CRO | 0.2337746 | ||||
Set Approval For... | 15654508 | 37 days ago | IN | 0 CRO | 0.2337746 | ||||
Safe Transfer Fr... | 15555483 | 43 days ago | IN | 0 CRO | 0.41357985 | ||||
Safe Transfer Fr... | 15553092 | 43 days ago | IN | 0 CRO | 0.41357985 | ||||
Safe Transfer Fr... | 15553087 | 43 days ago | IN | 0 CRO | 0.41357985 | ||||
Set Approval For... | 15546458 | 44 days ago | IN | 0 CRO | 0.2337746 | ||||
Safe Transfer Fr... | 15546443 | 44 days ago | IN | 0 CRO | 0.55191955 | ||||
Safe Transfer Fr... | 15513225 | 46 days ago | IN | 0 CRO | 0.48579485 | ||||
Set Approval For... | 15330048 | 58 days ago | IN | 0 CRO | 0.23370516 | ||||
Set Approval For... | 15204550 | 66 days ago | IN | 0 CRO | 0.2337746 | ||||
Safe Transfer Fr... | 15188477 | 67 days ago | IN | 0 CRO | 0.55191955 | ||||
Set Approval For... | 15188286 | 67 days ago | IN | 0 CRO | 0.2337746 | ||||
Set Approval For... | 15105401 | 73 days ago | IN | 0 CRO | 0.2337746 | ||||
Set Approval For... | 15070170 | 75 days ago | IN | 0 CRO | 0.2337746 | ||||
Set Approval For... | 14256249 | 128 days ago | IN | 0 CRO | 0.2337746 | ||||
Safe Transfer Fr... | 14256128 | 128 days ago | IN | 0 CRO | 0.46556455 | ||||
Safe Transfer Fr... | 14256121 | 128 days ago | IN | 0 CRO | 0.46556455 | ||||
Safe Transfer Fr... | 14256116 | 128 days ago | IN | 0 CRO | 0.46556455 | ||||
Safe Transfer Fr... | 14256109 | 128 days ago | IN | 0 CRO | 0.46556455 | ||||
Safe Transfer Fr... | 14256104 | 128 days ago | IN | 0 CRO | 0.46556455 | ||||
Safe Transfer Fr... | 14256099 | 128 days ago | IN | 0 CRO | 0.46556455 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
4371655 | 774 days ago | 2,508 CRO | ||||
4371655 | 774 days ago | 2,978.25 CRO | ||||
4371655 | 774 days ago | 7,053.75 CRO | ||||
4371655 | 774 days ago | 9,405 CRO | ||||
4371655 | 774 days ago | 9,405 CRO | ||||
4280643 | 780 days ago | 80 CRO | ||||
4280596 | 780 days ago | 10 CRO | ||||
4280588 | 780 days ago | 20 CRO | ||||
4280572 | 780 days ago | 10 CRO | ||||
4280513 | 780 days ago | 10 CRO | ||||
4280506 | 780 days ago | 20 CRO | ||||
4280501 | 780 days ago | 10 CRO | ||||
4280470 | 780 days ago | 10 CRO | ||||
4280463 | 780 days ago | 10 CRO | ||||
4280381 | 780 days ago | 10 CRO | ||||
4280320 | 780 days ago | 10 CRO | ||||
4280273 | 780 days ago | 10 CRO | ||||
4280237 | 780 days ago | 30 CRO | ||||
4280079 | 780 days ago | 20 CRO | ||||
4280044 | 780 days ago | 10 CRO | ||||
4279904 | 780 days ago | 10 CRO | ||||
4279903 | 780 days ago | 10 CRO | ||||
4279755 | 780 days ago | 30 CRO | ||||
4279739 | 780 days ago | 10 CRO | ||||
4279486 | 781 days ago | 50 CRO |
Loading...
Loading
Contract Name:
TheCrobees
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-04-05 */ // File: contracts/SafeMathLite.sol pragma solidity ^0.8.4; library SafeMathLite{ /** * @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; } } // File: contracts/SafePct.sol pragma solidity ^0.8.4; /** * @dev Compute percentages safely without phantom overflows. * * Intermediate operations can overflow even when the result will always * fit into computed type. Developers usually * assume that overflows raise errors. `SafePct` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafePct { using SafeMathLite for uint256; /** * Requirements: * * - intermediate operations must revert on overflow */ function mulDiv(uint256 x, uint256 y, uint256 z) internal pure returns (uint256) { require(z > 0, "Division by zero"); if (x == 0) return 0; uint256 xy = x * y; if (xy / x == y) { // no overflow happened - same as in SafeMath mul return xy / z; } //slither-disable-next-line divide-before-multiply uint256 a = x / z; uint256 b = x % z; // x = a * z + b //slither-disable-next-line divide-before-multiply uint256 c = y / z; uint256 d = y % z; // y = c * z + d return (a.mul(c).mul(z)).add(a.mul(d)).add(b.mul(c)).add(b.mul(d).div(z)); } } // File: contracts/IDrop.sol pragma solidity ^0.8.0; interface IDrop { struct Info { uint256 regularCost; uint256 memberCost; uint256 whitelistCost; uint256 maxSupply; uint256 totalSupply; uint256 maxMintPerAddress; uint256 maxMintPerTx; } function mintCost(address _minter) external view returns(uint256); function canMint(address _minter) external view returns (uint16); function mint(uint256 _amount) external payable; function maxSupply() external view returns (uint256); function getInfo() external view returns (Info memory); } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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: contracts/Withdraw.sol pragma solidity ^0.8.0; contract Withdraw is Ownable { using SafeMath for uint256; struct Part { address wallet; uint256 salePart; uint256 royaltiesPart; } Part[] public parts; constructor(){ parts.push(Part(0x570D9fB355dF04d957a9999EE5523a8f583d484C, 300, 0)); parts.push(Part(0xfb45178c6614BAf3da33255BB9E1Ad68268AE3a3, 300, 0)); parts.push(Part(0x53B4bA1a81744A1C9920b341d6EFe6F7d366B583, 225, 0)); parts.push(Part(0xfC7f3da9824A2450Fc8a35498A60898c95edc9fa, 95, 0)); parts.push(Part(0x0E05826bFe8510bA2FB6155b1f34D6AA09601968, 80, 1000)); } function shareSalesPart() public onlyOwner { uint256 balance = address(this).balance; require(balance > 0, "Sales Balance = 0"); for(uint8 i = 0; i < parts.length; i++){ if(parts[i].salePart > 0){ _withdraw(parts[i].wallet, balance.mul(parts[i].salePart).div(1000)); } } _withdraw(owner(), address(this).balance); } function shareRoyaltiesPart() public onlyOwner { uint256 balance = address(this).balance; require(balance > 0, "Contract Balance = 0"); for(uint8 i = 0; i < parts.length; i++){ if(parts[i].royaltiesPart > 0){ _withdraw(parts[i].wallet, balance.mul(parts[i].royaltiesPart).div(1000)); } } _withdraw(owner(), address(this).balance); } function _withdraw(address _address, uint256 _amount) private { (bool success, ) = _address.call{value: _amount}(""); require(success, "Transfer failed."); } receive() external payable {} } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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: @openzeppelin/contracts/utils/escrow/Escrow.sol // OpenZeppelin Contracts v4.4.1 (utils/escrow/Escrow.sol) pragma solidity ^0.8.0; /** * @title Escrow * @dev Base escrow contract, holds funds designated for a payee until they * withdraw them. * * Intended usage: This contract (and derived escrow contracts) should be a * standalone contract, that only interacts with the contract that instantiated * it. That way, it is guaranteed that all Ether will be handled according to * the `Escrow` rules, and there is no need to check for payable functions or * transfers in the inheritance tree. The contract that uses the escrow as its * payment method should be its owner, and provide public methods redirecting * to the escrow's deposit and withdraw. */ contract Escrow is Ownable { using Address for address payable; event Deposited(address indexed payee, uint256 weiAmount); event Withdrawn(address indexed payee, uint256 weiAmount); mapping(address => uint256) private _deposits; function depositsOf(address payee) public view returns (uint256) { return _deposits[payee]; } /** * @dev Stores the sent amount as credit to be withdrawn. * @param payee The destination address of the funds. */ function deposit(address payee) public payable virtual onlyOwner { uint256 amount = msg.value; _deposits[payee] += amount; emit Deposited(payee, amount); } /** * @dev Withdraw accumulated balance for a payee, forwarding all gas to the * recipient. * * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities. * Make sure you trust the recipient, or are either following the * checks-effects-interactions pattern or using {ReentrancyGuard}. * * @param payee The address whose funds will be withdrawn and transferred to. */ function withdraw(address payable payee) public virtual onlyOwner { uint256 payment = _deposits[payee]; _deposits[payee] = 0; payee.sendValue(payment); emit Withdrawn(payee, payment); } } // File: @openzeppelin/contracts/security/PullPayment.sol // OpenZeppelin Contracts v4.4.1 (security/PullPayment.sol) pragma solidity ^0.8.0; /** * @dev Simple implementation of a * https://consensys.github.io/smart-contract-best-practices/recommendations/#favor-pull-over-push-for-external-calls[pull-payment] * strategy, where the paying contract doesn't interact directly with the * receiver account, which must withdraw its payments itself. * * Pull-payments are often considered the best practice when it comes to sending * Ether, security-wise. It prevents recipients from blocking execution, and * eliminates reentrancy concerns. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. * * To use, derive from the `PullPayment` contract, and use {_asyncTransfer} * instead of Solidity's `transfer` function. Payees can query their due * payments with {payments}, and retrieve them with {withdrawPayments}. */ abstract contract PullPayment { Escrow private immutable _escrow; constructor() { _escrow = new Escrow(); } /** * @dev Withdraw accumulated payments, forwarding all gas to the recipient. * * Note that _any_ account can call this function, not just the `payee`. * This means that contracts unaware of the `PullPayment` protocol can still * receive funds this way, by having a separate account call * {withdrawPayments}. * * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities. * Make sure you trust the recipient, or are either following the * checks-effects-interactions pattern or using {ReentrancyGuard}. * * @param payee Whose payments will be withdrawn. */ function withdrawPayments(address payable payee) public virtual { _escrow.withdraw(payee); } /** * @dev Returns the payments owed to an address. * @param dest The creditor's address. */ function payments(address dest) public view returns (uint256) { return _escrow.depositsOf(dest); } /** * @dev Called by the payer to store the sent amount as credit to be pulled. * Funds sent in this way are stored in an intermediate {Escrow} contract, so * there is no danger of them being spent before withdrawal. * * @param dest The destination address of the funds. * @param amount The amount to transfer. */ function _asyncTransfer(address dest, uint256 amount) internal virtual { _escrow.deposit{value: amount}(dest); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } /** * @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, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/Crobees.sol pragma solidity ^0.8.0; // @author: Querty abstract contract Market { function isMember(address user) public virtual view returns (bool); } contract TheCrobees is Ownable, ERC721Enumerable, Withdraw, PullPayment, IDrop { using SafePct for uint256; using Strings for uint256; uint256 public beesRemaining; uint256 public MAX_SUPPLY; uint16 public constant MAX_PUBLIC = 2222; uint128 constant internal SCALE = 10000; uint128 constant internal FEE = 500; Market market; uint256 public constant FOUNDING_MEMBERS_PRICE = 300 ether; string public baseURI; address[] public eligibleAddresses; uint256[] public tokenIdAirdrop; struct Sale { uint64 start; uint64 end; uint16 maxPerWallet; uint8 maxPerTx; uint256 price; bool paused; } mapping(address => bool) whitelistedAddresses; mapping(string => Sale) public sales; mapping(string => mapping(address => uint16)) balanceSale; mapping(uint256 => uint256) private assignOrders; event EventSaleChange(string _name, Sale _sale); event EventTCRBMinted(uint[] tokenIds, address buyer); constructor(string memory _initBaseURI, uint256 _maxSupply, Market _market) ERC721("The Crobees", "CRB") { setBaseURI(_initBaseURI); MAX_SUPPLY = _maxSupply; beesRemaining = _maxSupply; setFoundingMemberContract(_market); setSale("PUBLIC", Sale(1649268000, 1961100000, MAX_PUBLIC, 15, 350 ether, false)); } //**************************// // MODIFIER // //**************************// modifier isOpen(string memory _name, uint8 _count) { require(saleIsOpen(_name), "Sales not open"); require(_count > 0, "Can not mint 0 NFT"); require(_count <= beesRemaining, "Exceeds maximum supply. Try to mint less NFTs."); require(beesRemaining > 0, "Collection is SoldOut"); require(_count <= sales[_name].maxPerTx, "Max per tx limit"); if (isEBMember(_msgSender())) { require(msg.value >= FOUNDING_MEMBERS_PRICE * _count, "Insuficient funds"); } else { require(msg.value >= sales[_name].price * _count, "Insuficient funds"); } balanceSale[_name][_msgSender()] += uint16(_count); uint totalCost; if(saleIsOpen("PUBLIC") && isEBMember(_msgSender())) { totalCost = _count * FOUNDING_MEMBERS_PRICE; } else { totalCost = _count * sales["PUBLIC"].price; } uint mintFee = totalCost.mulDiv(FEE, SCALE); _asyncTransfer(0x454cfAa623A629CC0b4017aEb85d54C42e91479d, mintFee); _; } //**************************// // SALES // //**************************// function setSale(string memory _name, Sale memory _sale) public onlyOwner { sales[_name] = _sale; emit EventSaleChange(_name, _sale); } function pauseSale(string memory _name, bool _pause) public onlyOwner() { sales[_name].paused = _pause; } function saleIsOpen(string memory _name) public view returns(bool) { return sales[_name].start > 0 && block.timestamp >= sales[_name].start && block.timestamp <= sales[_name].end && !sales[_name].paused; } //**************************// // GETTERS // //**************************// function isWhitelisted(address _user) public view returns (bool) { bool userIsWhitelisted = whitelistedAddresses[_user]; return userIsWhitelisted; } function isEBMember(address _address) public view returns (bool) { return market.isMember(_address); } function getWalletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function getBalanceOfOwner(address _owner) public view returns (uint256) { uint256[] memory tokenIds = getWalletOfOwner(_owner); uint256 numberOfBees = tokenIds.length; return numberOfBees; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function minted(string memory _name, address _wallet) public view returns(uint16) { return balanceSale[_name][_wallet]; } //**************************// // SETTERS // //**************************// function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(_baseURI(), tokenId.toString(), ".json")); } function setWhitelistUsers(address[] memory _users) public onlyOwner { for(uint256 i = 0; i < _users.length; i++){ address user = _users[i]; whitelistedAddresses[user] = true; } } function setEligibleAirdrop(address[] calldata _users) public onlyOwner { delete eligibleAddresses; eligibleAddresses = _users; } function setFoundingMemberContract(Market _market) public onlyOwner { market = _market; } function setTokenId(uint256[] calldata _tokenIds) public onlyOwner { delete tokenIdAirdrop; tokenIdAirdrop = _tokenIds; } //**************************// // MINT // //**************************// function publicSalesMint(uint8 _amount) public payable isOpen("PUBLIC", _amount){ _mintTCRB(_amount, false); } function teamMint(uint256 _amount) public onlyOwner { _mintTCRB(_amount, true); } function _mintTCRB(uint256 _amount, bool _admin) private { uint[] memory tokenIdsBought = new uint[](_amount); for (uint i = 0; i < _amount; i++) { uint256 randIndex = (!_admin ? _random() : totalSupply()) % beesRemaining; uint256 beeIndex = _fillAssignOrder(--beesRemaining, randIndex); _safeMint(_msgSender(), beeIndex + 1); tokenIdsBought[i] = beeIndex; } emit EventTCRBMinted(tokenIdsBought, _msgSender()); } //*******************************// // AIRDROP // //*******************************// function airdrop() public onlyOwner { for(uint256 i = 0; i < eligibleAddresses.length; i++) { safeTransferFrom(owner(), eligibleAddresses[i], tokenIdAirdrop[i]); } } //*******************************// // INTERFACE // //*******************************// function mintCost(address _minter) external override view returns(uint256) { if (isEBMember(_minter)) { return FOUNDING_MEMBERS_PRICE; } else { return sales["PUBLIC"].price; } } function maxSupply() external override view returns (uint256) { return MAX_SUPPLY; } function canMint(address _minter) external override view returns (uint16) { if(!saleIsOpen("PUBLIC")) { return 0; } return sales["PUBLIC"].maxPerWallet; } function mint(uint256 _amount) external override payable { require(saleIsOpen("PUBLIC"),"Sales are not open"); publicSalesMint(uint8(_amount)); } function getInfo() external override view returns (Info memory) { return (Info(sales["PUBLIC"].price, FOUNDING_MEMBERS_PRICE, 0, MAX_SUPPLY, totalSupply(), sales["PUBLIC"].maxPerWallet, sales["PUBLIC"].maxPerTx)); } //**************************// // RANDOM // //**************************// function _random() internal view returns(uint256) { return uint256( keccak256(abi.encodePacked(block.timestamp + block.difficulty + block.gaslimit + block.number + ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / block.timestamp) + ((uint256(keccak256(abi.encodePacked(_msgSender())))) / block.timestamp) ))) / beesRemaining; } function _fillAssignOrder(uint256 orderA, uint256 orderB) internal returns(uint256) { uint256 temp = orderA; if (assignOrders[orderA] > 0) temp = assignOrders[orderA]; assignOrders[orderA] = orderB; if (assignOrders[orderB] > 0) assignOrders[orderA] = assignOrders[orderB]; assignOrders[orderB] = temp; return assignOrders[orderA]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"contract Market","name":"_market","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_name","type":"string"},{"components":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"uint16","name":"maxPerWallet","type":"uint16"},{"internalType":"uint8","name":"maxPerTx","type":"uint8"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"}],"indexed":false,"internalType":"struct TheCrobees.Sale","name":"_sale","type":"tuple"}],"name":"EventSaleChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"EventTCRBMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FOUNDING_MEMBERS_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"beesRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"canMint","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"eligibleAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"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"}],"name":"getBalanceOfOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInfo","outputs":[{"components":[{"internalType":"uint256","name":"regularCost","type":"uint256"},{"internalType":"uint256","name":"memberCost","type":"uint256"},{"internalType":"uint256","name":"whitelistCost","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxMintPerAddress","type":"uint256"},{"internalType":"uint256","name":"maxMintPerTx","type":"uint256"}],"internalType":"struct IDrop.Info","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getWalletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isEBMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_wallet","type":"address"}],"name":"minted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","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":"","type":"uint256"}],"name":"parts","outputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"salePart","type":"uint256"},{"internalType":"uint256","name":"royaltiesPart","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"bool","name":"_pause","type":"bool"}],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dest","type":"address"}],"name":"payments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_amount","type":"uint8"}],"name":"publicSalesMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"string","name":"_name","type":"string"}],"name":"saleIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"sales","outputs":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"uint16","name":"maxPerWallet","type":"uint16"},{"internalType":"uint8","name":"maxPerTx","type":"uint8"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"setEligibleAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Market","name":"_market","type":"address"}],"name":"setFoundingMemberContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"components":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"uint16","name":"maxPerWallet","type":"uint16"},{"internalType":"uint8","name":"maxPerTx","type":"uint8"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"}],"internalType":"struct TheCrobees.Sale","name":"_sale","type":"tuple"}],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"setTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"setWhitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareRoyaltiesPart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareSalesPart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdAirdrop","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"payee","type":"address"}],"name":"withdrawPayments","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162004d9a38038062004d9a833981016040819052620000349162000705565b604080518082018252600b81526a5468652043726f6265657360a81b60208083019182528351808501909452600384526221a92160e91b908401528151919291620000829160009162000634565b5080516200009890600190602084019062000634565b505050620000b5620000af620003c760201b60201c565b620003cb565b604080516060808201835273570d9fb355df04d957a9999ee5523a8f583d484c825261012c60208084018281526000858701818152600b80546001808201835582855298517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9600392830281810180546001600160a01b03199081166001600160a01b039586161790915597517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8083019190915595517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb918201558c51808c018e5273fb45178c6614baf3da33255bb9e1ad68268ae3a38152808a019a8b52808e018881528654808f018855878a52915191860280850180548c16938716939093179092559a51818801559951998101999099558b51808b018d527353b4ba1a81744a1c9920b341d6efe6f7d366b583815260e1818a01908152818e018881528654808f018855878a52925192860280850180548c169487169490941790935590518288015551908a01558b51808b018d5273fc7f3da9824a2450fc8a35498a60898c95edc9fa8152605f818a01908152818e018881528654808f018855878a52925192860280850180548c169487169490941790935590518288015551908a01558b51998a018c52730e05826bfe8510ba2fb6155b1f34d6aa096019688a526050978a019788526103e88a8d0190815284549b8c0185559390955297519802928301805490941697909616969096179091559051938101939093559051910155516200030390620006c3565b604051809103906000f08015801562000320573d6000803e3d6000fd5b5060601b6001600160601b0319166080526200033c836200041d565b600d829055600c829055620003518162000485565b60408051808201825260068152655055424c494360d01b602080830191909152825160c08101845263624dd52081526374e402e0918101919091526108ae92810192909252600f60608301526812f939c99edab800006080830152600060a0830152620003be91620004f2565b50505062000907565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b031633146200046c5760405162461bcd60e51b8152602060048201819052602482015260008051602062004d7a83398151915260448201526064015b60405180910390fd5b80516200048190600f90602084019062000634565b5050565b6006546001600160a01b03163314620004d05760405162461bcd60e51b8152602060048201819052602482015260008051602062004d7a833981519152604482015260640162000463565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146200053d5760405162461bcd60e51b8152602060048201819052602482015260008051602062004d7a833981519152604482015260640162000463565b80601383604051620005509190620007db565b908152604080519182900360209081018320845181549286015193860151606087015160ff16600160901b0260ff60901b1961ffff909216600160801b029190911662ffffff60801b196001600160401b0396871668010000000000000000026001600160801b031990961696909316959095179390931716929092171781556080830151600182015560a0909201516002909201805492151560ff19909316929092179091557f72bcd43411e859a3490882583e9093fcc18bd80d2927dc455e6399c45ae0893390620006289084908490620007f9565b60405180910390a15050565b8280546200064290620008b4565b90600052602060002090601f016020900481019282620006665760008555620006b1565b82601f106200068157805160ff1916838001178555620006b1565b82800160010185558215620006b1579182015b82811115620006b157825182559160200191906001019062000694565b50620006bf929150620006d1565b5090565b6105f2806200478883390190565b5b80821115620006bf5760008155600101620006d2565b80516001600160a01b03811681146200070057600080fd5b919050565b6000806000606084860312156200071b57600080fd5b83516001600160401b03808211156200073357600080fd5b818601915086601f8301126200074857600080fd5b8151818111156200075d576200075d620008f1565b604051601f8201601f19908116603f01168101908382118183101715620007885762000788620008f1565b81604052828152896020848701011115620007a257600080fd5b620007b583602083016020880162000881565b809750505050505060208401519150620007d260408501620006e8565b90509250925092565b60008251620007ef81846020870162000881565b9190910192915050565b60e08152600083518060e08401526101006200081c828286016020890162000881565b80601f19601f8401168501019250505060018060401b038084511660208401528060208501511660408401525061ffff604084015116606083015260ff6060840151166080830152608083015160a083015260a0830151151560c08301529392505050565b60005b838110156200089e57818101518382015260200162000884565b83811115620008ae576000848401525b50505050565b600181811c90821680620008c957607f821691505b60208210811415620008eb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c613e54620009346000396000818161101a0152818161214a01526129780152613e546000f3fe60806040526004361061031e5760003560e01c80636352211e116101ab578063c2ba4744116100f7578063e2310ef211610095578063eda1d5fd1161006f578063eda1d5fd146109c6578063f2fde38b146109e6578063f77b589714610a06578063fbb37cf214610a2657600080fd5b8063e2310ef21461093d578063e2982c211461095d578063e985e9c51461097d57600080fd5b8063cb4ed176116100d1578063cb4ed176146108c8578063cd5c5b9a146108e8578063d052a17a14610908578063d5abeb011461092857600080fd5b8063c2ba474414610843578063c87b56dd14610863578063c9eb46621461088357600080fd5b80638b167178116101645780639753eac01161013e5780639753eac0146107da578063a0712d68146107f0578063a22cb46514610803578063b88d4fde1461082357600080fd5b80638b167178146107745780638da5cb5b146107a757806395d89b41146107c557600080fd5b80636352211e146106e157806367e2b599146107015780636c0360eb1461071757806370a082311461072c578063715018a61461074c57806375de52951461076157600080fd5b806332cb6b0c1161026a57806346002b061161022357806355f804b3116101fd57806355f804b3146106095780635a9b0b89146106295780635c2b528814610694578063627fdeab146106b457600080fd5b806346002b06146105b457806349708058146105c95780634f6ccce7146105e957600080fd5b806332cb6b0c146104fb5780633884d635146105115780633af32abf1461052657806340f9bbe21461055f57806342842e0e1461057457806343d8384f1461059457600080fd5b8063194944db116102d75780632beab4b7116102b15780632beab4b71461047b5780632f745c591461049b5780632fbba115146104bb57806331b3eb94146104db57600080fd5b8063194944db1461041b57806323b872dd1461043b5780632acc659e1461045b57600080fd5b806301ffc9a71461032a57806306fdde031461035f578063081812fc14610381578063095ea7b3146103b95780630bb083a3146103db57806318160ddd1461040657600080fd5b3661032557005b600080fd5b34801561033657600080fd5b5061034a610345366004613719565b610ae3565b60405190151581526020015b60405180910390f35b34801561036b57600080fd5b50610374610b0e565b6040516103569190613a74565b34801561038d57600080fd5b506103a161039c3660046138d9565b610ba0565b6040516001600160a01b039091168152602001610356565b3480156103c557600080fd5b506103d96103d43660046135d7565b610c3a565b005b3480156103e757600080fd5b506103f8681043561a882930000081565b604051908152602001610356565b34801561041257600080fd5b506009546103f8565b34801561042757600080fd5b5061034a610436366004613753565b610d50565b34801561044757600080fd5b506103d96104563660046134e9565b610e21565b34801561046757600080fd5b506103f8610476366004613493565b610e52565b34801561048757600080fd5b506103d9610496366004613644565b610e9e565b3480156104a757600080fd5b506103f86104b63660046135d7565b610f2d565b3480156104c757600080fd5b506103d96104d63660046138d9565b610fc3565b3480156104e757600080fd5b506103d96104f6366004613493565b610ffb565b34801561050757600080fd5b506103f8600d5481565b34801561051d57600080fd5b506103d9611079565b34801561053257600080fd5b5061034a610541366004613493565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561056b57600080fd5b506103d9611126565b34801561058057600080fd5b506103d961058f3660046134e9565b611289565b3480156105a057600080fd5b506103d96105af366004613603565b6112a4565b3480156105c057600080fd5b506103d96112e6565b3480156105d557600080fd5b506103d96105e4366004613493565b611425565b3480156105f557600080fd5b506103f86106043660046138d9565b611471565b34801561061557600080fd5b506103d9610624366004613753565b611504565b34801561063557600080fd5b5061063e611541565b6040516103569190600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015292915050565b3480156106a057600080fd5b506103d96106af366004613813565b61163c565b3480156106c057600080fd5b506106d46106cf366004613493565b61175d565b6040516103569190613a37565b3480156106ed57600080fd5b506103a16106fc3660046138d9565b6117fe565b34801561070d57600080fd5b506103f8600c5481565b34801561072357600080fd5b50610374611875565b34801561073857600080fd5b506103f8610747366004613493565b611903565b34801561075857600080fd5b506103d961198a565b6103d961076f36600461390b565b6119c0565b34801561078057600080fd5b5061079461078f366004613787565b611db2565b60405161ffff9091168152602001610356565b3480156107b357600080fd5b506006546001600160a01b03166103a1565b3480156107d157600080fd5b50610374611df7565b3480156107e657600080fd5b506107946108ae81565b6103d96107fe3660046138d9565b611e06565b34801561080f57600080fd5b506103d961081e3660046135a9565b611e77565b34801561082f57600080fd5b506103d961083e36600461352a565b611e82565b34801561084f57600080fd5b5061079461085e366004613493565b611eba565b34801561086f57600080fd5b5061037461087e3660046138d9565b611f1f565b34801561088f57600080fd5b506108a361089e3660046138d9565b611fd6565b604080516001600160a01b039094168452602084019290925290820152606001610356565b3480156108d457600080fd5b5061034a6108e3366004613493565b612013565b3480156108f457600080fd5b506103f86109033660046138d9565b612091565b34801561091457600080fd5b506103d96109233660046137cd565b6120b2565b34801561093457600080fd5b50600d546103f8565b34801561094957600080fd5b506103f8610958366004613493565b612114565b34801561096957600080fd5b506103f8610978366004613493565b612128565b34801561098957600080fd5b5061034a6109983660046134b0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109d257600080fd5b506103a16109e13660046138d9565b6121c6565b3480156109f257600080fd5b506103d9610a01366004613493565b6121f0565b348015610a1257600080fd5b506103d9610a21366004613603565b612288565b348015610a3257600080fd5b50610a9d610a41366004613753565b8051808201602090810180516013825292820191909301209152805460018201546002909201546001600160401b0380831693600160401b84049091169261ffff600160801b8204169260ff600160901b909204821692911686565b604080516001600160401b03978816815296909516602087015261ffff9093169385019390935260ff1660608401526080830191909152151560a082015260c001610356565b60006001600160e01b0319821663780e9d6360e01b1480610b085750610b08826122ca565b92915050565b606060008054610b1d90613ced565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4990613ced565b8015610b965780601f10610b6b57610100808354040283529160200191610b96565b820191906000526020600020905b815481529060010190602001808311610b7957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c1e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c45826117fe565b9050806001600160a01b0316836001600160a01b03161415610cb35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c15565b336001600160a01b0382161480610ccf5750610ccf8133610998565b610d415760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c15565b610d4b838361231a565b505050565b600080601383604051610d63919061398d565b908152604051908190036020019020546001600160401b0316118015610db15750601382604051610d94919061398d565b908152604051908190036020019020546001600160401b03164210155b8015610ded5750601382604051610dc8919061398d565b908152604051908190036020019020546001600160401b03600160401b909104164211155b8015610b085750601382604051610e04919061398d565b9081526040519081900360200190206002015460ff161592915050565b610e2b3382612388565b610e475760405162461bcd60e51b8152600401610c1590613b79565b610d4b83838361247f565b6000610e5d82612013565b15610e725750681043561a8829300000919050565b6013604051610e80906139e8565b9081526020016040518091039020600101549050919050565b919050565b6006546001600160a01b03163314610ec85760405162461bcd60e51b8152600401610c1590613b44565b60005b8151811015610f29576000828281518110610ee857610ee8613db9565b6020908102919091018101516001600160a01b03166000908152601290915260409020805460ff191660011790555080610f2181613d28565b915050610ecb565b5050565b6000610f3883611903565b8210610f9a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c15565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6006546001600160a01b03163314610fed5760405162461bcd60e51b8152600401610c1590613b44565b610ff8816001612626565b50565b6040516351cff8d960e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906351cff8d990602401600060405180830381600087803b15801561105e57600080fd5b505af1158015611072573d6000803e3d6000fd5b5050505050565b6006546001600160a01b031633146110a35760405162461bcd60e51b8152600401610c1590613b44565b60005b601054811015610ff8576111146110c56006546001600160a01b031690565b601083815481106110d8576110d8613db9565b600091825260209091200154601180546001600160a01b03909216918590811061110457611104613db9565b9060005260206000200154611289565b8061111e81613d28565b9150506110a6565b6006546001600160a01b031633146111505760405162461bcd60e51b8152600401610c1590613b44565b47806111925760405162461bcd60e51b8152602060048201526011602482015270053616c65732042616c616e6365203d203607c1b6044820152606401610c15565b60005b600b5460ff8216101561126d576000600b8260ff16815481106111ba576111ba613db9565b906000526020600020906003020160010154111561125b5761125b600b8260ff16815481106111eb576111eb613db9565b906000526020600020906003020160000160009054906101000a90046001600160a01b03166112566103e8611250600b8660ff168154811061122f5761122f613db9565b9060005260206000209060030201600101548761274690919063ffffffff16565b90612759565b612765565b8061126581613d43565b915050611195565b50610ff86112836006546001600160a01b031690565b47612765565b610d4b83838360405180602001604052806000815250611e82565b6006546001600160a01b031633146112ce5760405162461bcd60e51b8152600401610c1590613b44565b6112da60116000613264565b610d4b60118383613282565b6006546001600160a01b031633146113105760405162461bcd60e51b8152600401610c1590613b44565b47806113555760405162461bcd60e51b81526020600482015260146024820152730436f6e74726163742042616c616e6365203d20360641b6044820152606401610c15565b60005b600b5460ff8216101561126d576000600b8260ff168154811061137d5761137d613db9565b906000526020600020906003020160020154111561141357611413600b8260ff16815481106113ae576113ae613db9565b906000526020600020906003020160000160009054906101000a90046001600160a01b03166112566103e8611250600b8660ff16815481106113f2576113f2613db9565b9060005260206000209060030201600201548761274690919063ffffffff16565b8061141d81613d43565b915050611358565b6006546001600160a01b0316331461144f5760405162461bcd60e51b8152600401610c1590613b44565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600061147c60095490565b82106114df5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c15565b600982815481106114f2576114f2613db9565b90600052602060002001549050919050565b6006546001600160a01b0316331461152e5760405162461bcd60e51b8152600401610c1590613b44565b8051610f2990600f9060208401906132cd565b6115816040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060e00160405280601360405161159a906139e8565b9081526020016040518091039020600101548152602001681043561a8829300000815260200160008152602001600d5481526020016115d860095490565b815260200160136040516115eb906139e8565b908152604080516020928190038301902054600160801b900461ffff1683525191019060139061161a906139e8565b9081526040519081900360200190205460ff600160901b909104169052919050565b6006546001600160a01b031633146116665760405162461bcd60e51b8152600401610c1590613b44565b80601383604051611677919061398d565b908152604080519182900360209081018320845181549286015193860151606087015160ff16600160901b0260ff60901b1961ffff909216600160801b029190911662ffffff60801b196001600160401b03968716600160401b026fffffffffffffffffffffffffffffffff1990961696909316959095179390931716929092171781556080830151600182015560a0909201516002909201805492151560ff19909316929092179091557f72bcd43411e859a3490882583e9093fcc18bd80d2927dc455e6399c45ae08933906117519084908490613a87565b60405180910390a15050565b6060600061176a83611903565b90506000816001600160401b0381111561178657611786613dcf565b6040519080825280602002602001820160405280156117af578160200160208202803683370190505b50905060005b828110156117f6576117c78582610f2d565b8282815181106117d9576117d9613db9565b6020908102919091010152806117ee81613d28565b9150506117b5565b509392505050565b6000818152600260205260408120546001600160a01b031680610b085760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c15565b600f805461188290613ced565b80601f01602080910402602001604051908101604052809291908181526020018280546118ae90613ced565b80156118fb5780601f106118d0576101008083540402835291602001916118fb565b820191906000526020600020905b8154815290600101906020018083116118de57829003601f168201915b505050505081565b60006001600160a01b03821661196e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c15565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146119b45760405162461bcd60e51b8152600401610c1590613b44565b6119be60006127fb565b565b604051806040016040528060068152602001655055424c494360d01b815250816119e982610d50565b611a265760405162461bcd60e51b815260206004820152600e60248201526d29b0b632b9903737ba1037b832b760911b6044820152606401610c15565b60008160ff1611611a6e5760405162461bcd60e51b815260206004820152601260248201527110d85b881b9bdd081b5a5b9d080c0813919560721b6044820152606401610c15565b600c548160ff161115611ada5760405162461bcd60e51b815260206004820152602e60248201527f45786365656473206d6178696d756d20737570706c792e2054727920746f206d60448201526d34b73a103632b9b99027232a399760911b6064820152608401610c15565b6000600c5411611b245760405162461bcd60e51b815260206004820152601560248201527410dbdb1b1958dd1a5bdb881a5cc814dbdb1913dd5d605a1b6044820152606401610c15565b601382604051611b34919061398d565b9081526040519081900360200190205460ff600160901b90910481169082161115611b945760405162461bcd60e51b815260206004820152601060248201526f13585e081c195c881d1e081b1a5b5a5d60821b6044820152606401610c15565b611b9d33612013565b15611c0057611bb860ff8216681043561a8829300000613c74565b341015611bfb5760405162461bcd60e51b8152602060048201526011602482015270496e737566696369656e742066756e647360781b6044820152606401610c15565b611c73565b8060ff16601383604051611c14919061398d565b908152602001604051809103902060010154611c309190613c74565b341015611c735760405162461bcd60e51b8152602060048201526011602482015270496e737566696369656e742066756e647360781b6044820152606401610c15565b8060ff16601483604051611c87919061398d565b90815260200160405180910390206000611c9e3390565b6001600160a01b03168152602081019190915260400160009081208054909190611ccd90849061ffff16613c22565b92506101000a81548161ffff021916908361ffff1602179055506000611d10604051806040016040528060068152602001655055424c494360d01b815250610d50565b8015611d205750611d2033612013565b15611d4257611d3b681043561a882930000060ff8416613c74565b9050611d73565b6013604051611d50906139e8565b9081526020016040518091039020600101548260ff16611d709190613c74565b90505b6000611d84826101f461271061284d565b9050611da473454cfaa623a629cc0b4017aeb85d54c42e91479d82612959565b6110728560ff166000612626565b6000601483604051611dc4919061398d565b908152604080519182900360209081019092206001600160a01b0385166000908152925290205461ffff16905092915050565b606060018054610b1d90613ced565b611e2d604051806040016040528060068152602001655055424c494360d01b815250610d50565b611e6e5760405162461bcd60e51b815260206004820152601260248201527129b0b632b99030b932903737ba1037b832b760711b6044820152606401610c15565b610ff8816119c0565b610f293383836129da565b611e8c3383612388565b611ea85760405162461bcd60e51b8152600401610c1590613b79565b611eb484848484612aa9565b50505050565b6000611ee3604051806040016040528060068152602001655055424c494360d01b815250610d50565b611eef57506000919050565b6013604051611efd906139e8565b9081526040519081900360200190205461ffff600160801b9091041692915050565b6000818152600260205260409020546060906001600160a01b0316611f9e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c15565b611fa6612adc565b611faf83612aeb565b604051602001611fc09291906139a9565b6040516020818303038152906040529050919050565b600b8181548110611fe657600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116925083565b600e5460405163288c314960e21b81526001600160a01b038381166004830152600092169063a230c5249060240160206040518083038186803b15801561205957600080fd5b505afa15801561206d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0891906136fc565b601181815481106120a157600080fd5b600091825260209091200154905081565b6006546001600160a01b031633146120dc5760405162461bcd60e51b8152600401610c1590613b44565b806013836040516120ed919061398d565b908152604051908190036020019020600201805491151560ff199092169190911790555050565b6000806121208361175d565b519392505050565b6040516371d4ed8d60e11b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e3a9db1a9060240160206040518083038186803b15801561218e57600080fd5b505afa1580156121a2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0891906138f2565b601081815481106121d657600080fd5b6000918252602090912001546001600160a01b0316905081565b6006546001600160a01b0316331461221a5760405162461bcd60e51b8152600401610c1590613b44565b6001600160a01b03811661227f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c15565b610ff8816127fb565b6006546001600160a01b031633146122b25760405162461bcd60e51b8152600401610c1590613b44565b6122be60106000613264565b610d4b60108383613341565b60006001600160e01b031982166380ac58cd60e01b14806122fb57506001600160e01b03198216635b5e139f60e01b145b80610b0857506301ffc9a760e01b6001600160e01b0319831614610b08565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061234f826117fe565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166124015760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c15565b600061240c836117fe565b9050806001600160a01b0316846001600160a01b031614806124475750836001600160a01b031661243c84610ba0565b6001600160a01b0316145b8061247757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612492826117fe565b6001600160a01b0316146124f65760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610c15565b6001600160a01b0382166125585760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c15565b612563838383612be8565b61256e60008261231a565b6001600160a01b0383166000908152600360205260408120805460019290612597908490613c93565b90915550506001600160a01b03821660009081526003602052604081208054600192906125c5908490613c48565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000826001600160401b0381111561264057612640613dcf565b604051908082528060200260200182016040528015612669578160200160208202803683370190505b50905060005b83811015612707576000600c54841561268a57600954612692565b612692612ca0565b61269c9190613d63565b905060006126bd600c600081546126b290613cd6565b918290555083612da9565b90506126d3336126ce836001613c48565b612e20565b808484815181106126e6576126e6613db9565b602002602001018181525050505080806126ff90613d28565b91505061266f565b507f463768ce9a2a760c53066a4daf03bbfab9dfc2612ca4d0de3ff494b1bf1425c78133604051612739929190613a4a565b60405180910390a1505050565b60006127528284613c74565b9392505050565b60006127528284613c60565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146127b2576040519150601f19603f3d011682016040523d82523d6000602084013e6127b7565b606091505b5050905080610d4b5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610c15565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008082116128915760405162461bcd60e51b815260206004820152601060248201526f4469766973696f6e206279207a65726f60801b6044820152606401610c15565b8361289e57506000612752565b60006128aa8486613c74565b9050836128b78683613c60565b14156128cf576128c78382613c60565b915050612752565b60006128db8487613c60565b905060006128e98588613d63565b905060006128f78688613c60565b905060006129058789613d63565b905061294c612918886112508685612746565b6129466129258686612746565b6129466129328987612746565b6129468d6129408c8b612746565b90612746565b90612e3a565b9998505050505050505050565b60405163f340fa0160e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f340fa019083906024016000604051808303818588803b1580156129bd57600080fd5b505af11580156129d1573d6000803e3d6000fd5b50505050505050565b816001600160a01b0316836001600160a01b03161415612a3c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c15565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612ab484848461247f565b612ac084848484612e46565b611eb45760405162461bcd60e51b8152600401610c1590613af2565b6060600f8054610b1d90613ced565b606081612b0f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612b395780612b2381613d28565b9150612b329050600a83613c60565b9150612b13565b6000816001600160401b03811115612b5357612b53613dcf565b6040519080825280601f01601f191660200182016040528015612b7d576020820181803683370190505b5090505b841561247757612b92600183613c93565b9150612b9f600a86613d63565b612baa906030613c48565b60f81b818381518110612bbf57612bbf613db9565b60200101906001600160f81b031916908160001a905350612be1600a86613c60565b9450612b81565b6001600160a01b038316612c4357612c3e81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612c66565b816001600160a01b0316836001600160a01b031614612c6657612c668382612f53565b6001600160a01b038216612c7d57610d4b81612ff0565b826001600160a01b0316826001600160a01b031614610d4b57610d4b828261309f565b6000600c5442612cad3390565b604051602001612cd5919060609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040528051906020012060001c612cf89190613c60565b6040516bffffffffffffffffffffffff194160601b16602082015242906034016040516020818303038152906040528051906020012060001c612d3b9190613c60565b4345612d474442613c48565b612d519190613c48565b612d5b9190613c48565b612d659190613c48565b612d6f9190613c48565b604051602001612d8191815260200190565b6040516020818303038152906040528051906020012060001c612da49190613c60565b905090565b600082815260156020526040812054839015612dd057506000838152601560205260409020545b60008481526015602052604080822085905584825290205415612e0457600083815260156020526040808220548683529120555b6000928352601560205260408084209190915592825250205490565b610f298282604051806020016040528060008152506130e3565b60006127528284613c48565b60006001600160a01b0384163b15612f4857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612e8a9033908990889088906004016139fa565b602060405180830381600087803b158015612ea457600080fd5b505af1925050508015612ed4575060408051601f3d908101601f19168201909252612ed191810190613736565b60015b612f2e573d808015612f02576040519150601f19603f3d011682016040523d82523d6000602084013e612f07565b606091505b508051612f265760405162461bcd60e51b8152600401610c1590613af2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612477565b506001949350505050565b60006001612f6084611903565b612f6a9190613c93565b600083815260086020526040902054909150808214612fbd576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061300290600190613c93565b6000838152600a60205260408120546009805493945090928490811061302a5761302a613db9565b90600052602060002001549050806009838154811061304b5761304b613db9565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061308357613083613da3565b6001900381819060005260206000200160009055905550505050565b60006130aa83611903565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6130ed8383613116565b6130fa6000848484612e46565b610d4b5760405162461bcd60e51b8152600401610c1590613af2565b6001600160a01b03821661316c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c15565b6000818152600260205260409020546001600160a01b0316156131d15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c15565b6131dd60008383612be8565b6001600160a01b0382166000908152600360205260408120805460019290613206908490613c48565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5080546000825590600052602060002090810190610ff89190613394565b8280548282559060005260206000209081019282156132bd579160200282015b828111156132bd5782358255916020019190600101906132a2565b506132c9929150613394565b5090565b8280546132d990613ced565b90600052602060002090601f0160209004810192826132fb57600085556132bd565b82601f1061331457805160ff19168380011785556132bd565b828001600101855582156132bd579182015b828111156132bd578251825591602001919060010190613326565b8280548282559060005260206000209081019282156132bd579160200282015b828111156132bd5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613361565b5b808211156132c95760008155600101613395565b60006001600160401b038311156133c2576133c2613dcf565b6133d5601f8401601f1916602001613bf2565b90508281528383830111156133e957600080fd5b828260208301376000602084830101529392505050565b60008083601f84011261341257600080fd5b5081356001600160401b0381111561342957600080fd5b6020830191508360208260051b850101111561344457600080fd5b9250929050565b600082601f83011261345c57600080fd5b612752838335602085016133a9565b80356001600160401b0381168114610e9957600080fd5b803560ff81168114610e9957600080fd5b6000602082840312156134a557600080fd5b813561275281613de5565b600080604083850312156134c357600080fd5b82356134ce81613de5565b915060208301356134de81613de5565b809150509250929050565b6000806000606084860312156134fe57600080fd5b833561350981613de5565b9250602084013561351981613de5565b929592945050506040919091013590565b6000806000806080858703121561354057600080fd5b843561354b81613de5565b9350602085013561355b81613de5565b92506040850135915060608501356001600160401b0381111561357d57600080fd5b8501601f8101871361358e57600080fd5b61359d878235602084016133a9565b91505092959194509250565b600080604083850312156135bc57600080fd5b82356135c781613de5565b915060208301356134de81613dfa565b600080604083850312156135ea57600080fd5b82356135f581613de5565b946020939093013593505050565b6000806020838503121561361657600080fd5b82356001600160401b0381111561362c57600080fd5b61363885828601613400565b90969095509350505050565b6000602080838503121561365757600080fd5b82356001600160401b038082111561366e57600080fd5b818501915085601f83011261368257600080fd5b81358181111561369457613694613dcf565b8060051b91506136a5848301613bf2565b8181528481019084860184860187018a10156136c057600080fd5b600095505b838610156136ef57803594506136da85613de5565b848352600195909501949186019186016136c5565b5098975050505050505050565b60006020828403121561370e57600080fd5b815161275281613dfa565b60006020828403121561372b57600080fd5b813561275281613e08565b60006020828403121561374857600080fd5b815161275281613e08565b60006020828403121561376557600080fd5b81356001600160401b0381111561377b57600080fd5b6124778482850161344b565b6000806040838503121561379a57600080fd5b82356001600160401b038111156137b057600080fd5b6137bc8582860161344b565b92505060208301356134de81613de5565b600080604083850312156137e057600080fd5b82356001600160401b038111156137f657600080fd5b6138028582860161344b565b92505060208301356134de81613dfa565b60008082840360e081121561382757600080fd5b83356001600160401b0381111561383d57600080fd5b6138498682870161344b565b93505060c0601f198201121561385e57600080fd5b50613867613bca565b6138736020850161346b565b81526138816040850161346b565b6020820152606084013561ffff8116811461389b57600080fd5b60408201526138ac60808501613482565b606082015260a0840135608082015260c08401356138c981613dfa565b60a0820152919491935090915050565b6000602082840312156138eb57600080fd5b5035919050565b60006020828403121561390457600080fd5b5051919050565b60006020828403121561391d57600080fd5b61275282613482565b600081518084526020808501945080840160005b838110156139565781518752958201959082019060010161393a565b509495945050505050565b60008151808452613979816020860160208601613caa565b601f01601f19169290920160200192915050565b6000825161399f818460208701613caa565b9190910192915050565b600083516139bb818460208801613caa565b8351908301906139cf818360208801613caa565b64173539b7b760d91b9101908152600501949350505050565b655055424c494360d01b815260060190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613a2d90830184613961565b9695505050505050565b6020815260006127526020830184613926565b604081526000613a5d6040830185613926565b905060018060a01b03831660208301529392505050565b6020815260006127526020830184613961565b60e081526000613a9a60e0830185613961565b90506001600160401b038084511660208401528060208501511660408401525061ffff604084015116606083015260ff6060840151166080830152608083015160a083015260a0830151151560c08301529392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60405160c081016001600160401b0381118282101715613bec57613bec613dcf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613c1a57613c1a613dcf565b604052919050565b600061ffff808316818516808303821115613c3f57613c3f613d77565b01949350505050565b60008219821115613c5b57613c5b613d77565b500190565b600082613c6f57613c6f613d8d565b500490565b6000816000190483118215151615613c8e57613c8e613d77565b500290565b600082821015613ca557613ca5613d77565b500390565b60005b83811015613cc5578181015183820152602001613cad565b83811115611eb45750506000910152565b600081613ce557613ce5613d77565b506000190190565b600181811c90821680613d0157607f821691505b60208210811415613d2257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613d3c57613d3c613d77565b5060010190565b600060ff821660ff811415613d5a57613d5a613d77565b60010192915050565b600082613d7257613d72613d8d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ff857600080fd5b8015158114610ff857600080fd5b6001600160e01b031981168114610ff857600080fdfea26469706673582212200d736b578c299bafb669e9d60c1331b3dcb7cf01a4ac27fbc014aafd044087a764736f6c63430008070033608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6105748061007e6000396000f3fe6080604052600436106100555760003560e01c806351cff8d91461005a578063715018a61461007c5780638da5cb5b14610091578063e3a9db1a146100be578063f2fde38b14610102578063f340fa0114610122575b600080fd5b34801561006657600080fd5b5061007a6100753660046104aa565b610135565b005b34801561008857600080fd5b5061007a6101d7565b34801561009d57600080fd5b506000546040516001600160a01b0390911681526020015b60405180910390f35b3480156100ca57600080fd5b506100f46100d93660046104aa565b6001600160a01b031660009081526001602052604090205490565b6040519081526020016100b5565b34801561010e57600080fd5b5061007a61011d3660046104aa565b61020d565b61007a6101303660046104aa565b6102a8565b6000546001600160a01b031633146101685760405162461bcd60e51b815260040161015f906104ce565b60405180910390fd5b6001600160a01b0381166000818152600160205260408120805491905590610190908261033c565b816001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5826040516101cb91815260200190565b60405180910390a25050565b6000546001600160a01b031633146102015760405162461bcd60e51b815260040161015f906104ce565b61020b600061045a565b565b6000546001600160a01b031633146102375760405162461bcd60e51b815260040161015f906104ce565b6001600160a01b03811661029c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161015f565b6102a58161045a565b50565b6000546001600160a01b031633146102d25760405162461bcd60e51b815260040161015f906104ce565b6001600160a01b0381166000908152600160205260408120805434928392916102fc908490610503565b90915550506040518181526001600160a01b038316907f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4906020016101cb565b8047101561038c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161015f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146103d9576040519150601f19603f3d011682016040523d82523d6000602084013e6103de565b606091505b50509050806104555760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161015f565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156104bc57600080fd5b81356104c781610529565b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561052457634e487b7160e01b600052601160045260246000fd5b500190565b6001600160a01b03811681146102a557600080fdfea26469706673582212201464ef5ea1e512fc2964c4be04b842d7e31b50876950d68c99bdbf0c1d48c12164736f6c634300080700334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000008ae0000000000000000000000007a3cdb2364f92369a602cae81167d0679087e6a30000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d594c58685a3534794c375a5666757a5a7265586d33507a6148594334416b5647616a64586e786544465762392f00000000000000000000
Deployed Bytecode
0x60806040526004361061031e5760003560e01c80636352211e116101ab578063c2ba4744116100f7578063e2310ef211610095578063eda1d5fd1161006f578063eda1d5fd146109c6578063f2fde38b146109e6578063f77b589714610a06578063fbb37cf214610a2657600080fd5b8063e2310ef21461093d578063e2982c211461095d578063e985e9c51461097d57600080fd5b8063cb4ed176116100d1578063cb4ed176146108c8578063cd5c5b9a146108e8578063d052a17a14610908578063d5abeb011461092857600080fd5b8063c2ba474414610843578063c87b56dd14610863578063c9eb46621461088357600080fd5b80638b167178116101645780639753eac01161013e5780639753eac0146107da578063a0712d68146107f0578063a22cb46514610803578063b88d4fde1461082357600080fd5b80638b167178146107745780638da5cb5b146107a757806395d89b41146107c557600080fd5b80636352211e146106e157806367e2b599146107015780636c0360eb1461071757806370a082311461072c578063715018a61461074c57806375de52951461076157600080fd5b806332cb6b0c1161026a57806346002b061161022357806355f804b3116101fd57806355f804b3146106095780635a9b0b89146106295780635c2b528814610694578063627fdeab146106b457600080fd5b806346002b06146105b457806349708058146105c95780634f6ccce7146105e957600080fd5b806332cb6b0c146104fb5780633884d635146105115780633af32abf1461052657806340f9bbe21461055f57806342842e0e1461057457806343d8384f1461059457600080fd5b8063194944db116102d75780632beab4b7116102b15780632beab4b71461047b5780632f745c591461049b5780632fbba115146104bb57806331b3eb94146104db57600080fd5b8063194944db1461041b57806323b872dd1461043b5780632acc659e1461045b57600080fd5b806301ffc9a71461032a57806306fdde031461035f578063081812fc14610381578063095ea7b3146103b95780630bb083a3146103db57806318160ddd1461040657600080fd5b3661032557005b600080fd5b34801561033657600080fd5b5061034a610345366004613719565b610ae3565b60405190151581526020015b60405180910390f35b34801561036b57600080fd5b50610374610b0e565b6040516103569190613a74565b34801561038d57600080fd5b506103a161039c3660046138d9565b610ba0565b6040516001600160a01b039091168152602001610356565b3480156103c557600080fd5b506103d96103d43660046135d7565b610c3a565b005b3480156103e757600080fd5b506103f8681043561a882930000081565b604051908152602001610356565b34801561041257600080fd5b506009546103f8565b34801561042757600080fd5b5061034a610436366004613753565b610d50565b34801561044757600080fd5b506103d96104563660046134e9565b610e21565b34801561046757600080fd5b506103f8610476366004613493565b610e52565b34801561048757600080fd5b506103d9610496366004613644565b610e9e565b3480156104a757600080fd5b506103f86104b63660046135d7565b610f2d565b3480156104c757600080fd5b506103d96104d63660046138d9565b610fc3565b3480156104e757600080fd5b506103d96104f6366004613493565b610ffb565b34801561050757600080fd5b506103f8600d5481565b34801561051d57600080fd5b506103d9611079565b34801561053257600080fd5b5061034a610541366004613493565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561056b57600080fd5b506103d9611126565b34801561058057600080fd5b506103d961058f3660046134e9565b611289565b3480156105a057600080fd5b506103d96105af366004613603565b6112a4565b3480156105c057600080fd5b506103d96112e6565b3480156105d557600080fd5b506103d96105e4366004613493565b611425565b3480156105f557600080fd5b506103f86106043660046138d9565b611471565b34801561061557600080fd5b506103d9610624366004613753565b611504565b34801561063557600080fd5b5061063e611541565b6040516103569190600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015292915050565b3480156106a057600080fd5b506103d96106af366004613813565b61163c565b3480156106c057600080fd5b506106d46106cf366004613493565b61175d565b6040516103569190613a37565b3480156106ed57600080fd5b506103a16106fc3660046138d9565b6117fe565b34801561070d57600080fd5b506103f8600c5481565b34801561072357600080fd5b50610374611875565b34801561073857600080fd5b506103f8610747366004613493565b611903565b34801561075857600080fd5b506103d961198a565b6103d961076f36600461390b565b6119c0565b34801561078057600080fd5b5061079461078f366004613787565b611db2565b60405161ffff9091168152602001610356565b3480156107b357600080fd5b506006546001600160a01b03166103a1565b3480156107d157600080fd5b50610374611df7565b3480156107e657600080fd5b506107946108ae81565b6103d96107fe3660046138d9565b611e06565b34801561080f57600080fd5b506103d961081e3660046135a9565b611e77565b34801561082f57600080fd5b506103d961083e36600461352a565b611e82565b34801561084f57600080fd5b5061079461085e366004613493565b611eba565b34801561086f57600080fd5b5061037461087e3660046138d9565b611f1f565b34801561088f57600080fd5b506108a361089e3660046138d9565b611fd6565b604080516001600160a01b039094168452602084019290925290820152606001610356565b3480156108d457600080fd5b5061034a6108e3366004613493565b612013565b3480156108f457600080fd5b506103f86109033660046138d9565b612091565b34801561091457600080fd5b506103d96109233660046137cd565b6120b2565b34801561093457600080fd5b50600d546103f8565b34801561094957600080fd5b506103f8610958366004613493565b612114565b34801561096957600080fd5b506103f8610978366004613493565b612128565b34801561098957600080fd5b5061034a6109983660046134b0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109d257600080fd5b506103a16109e13660046138d9565b6121c6565b3480156109f257600080fd5b506103d9610a01366004613493565b6121f0565b348015610a1257600080fd5b506103d9610a21366004613603565b612288565b348015610a3257600080fd5b50610a9d610a41366004613753565b8051808201602090810180516013825292820191909301209152805460018201546002909201546001600160401b0380831693600160401b84049091169261ffff600160801b8204169260ff600160901b909204821692911686565b604080516001600160401b03978816815296909516602087015261ffff9093169385019390935260ff1660608401526080830191909152151560a082015260c001610356565b60006001600160e01b0319821663780e9d6360e01b1480610b085750610b08826122ca565b92915050565b606060008054610b1d90613ced565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4990613ced565b8015610b965780601f10610b6b57610100808354040283529160200191610b96565b820191906000526020600020905b815481529060010190602001808311610b7957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c1e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c45826117fe565b9050806001600160a01b0316836001600160a01b03161415610cb35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c15565b336001600160a01b0382161480610ccf5750610ccf8133610998565b610d415760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c15565b610d4b838361231a565b505050565b600080601383604051610d63919061398d565b908152604051908190036020019020546001600160401b0316118015610db15750601382604051610d94919061398d565b908152604051908190036020019020546001600160401b03164210155b8015610ded5750601382604051610dc8919061398d565b908152604051908190036020019020546001600160401b03600160401b909104164211155b8015610b085750601382604051610e04919061398d565b9081526040519081900360200190206002015460ff161592915050565b610e2b3382612388565b610e475760405162461bcd60e51b8152600401610c1590613b79565b610d4b83838361247f565b6000610e5d82612013565b15610e725750681043561a8829300000919050565b6013604051610e80906139e8565b9081526020016040518091039020600101549050919050565b919050565b6006546001600160a01b03163314610ec85760405162461bcd60e51b8152600401610c1590613b44565b60005b8151811015610f29576000828281518110610ee857610ee8613db9565b6020908102919091018101516001600160a01b03166000908152601290915260409020805460ff191660011790555080610f2181613d28565b915050610ecb565b5050565b6000610f3883611903565b8210610f9a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c15565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6006546001600160a01b03163314610fed5760405162461bcd60e51b8152600401610c1590613b44565b610ff8816001612626565b50565b6040516351cff8d960e01b81526001600160a01b0382811660048301527f0000000000000000000000007ddf675610e738539ad43f16b5124bd5d7e1875f16906351cff8d990602401600060405180830381600087803b15801561105e57600080fd5b505af1158015611072573d6000803e3d6000fd5b5050505050565b6006546001600160a01b031633146110a35760405162461bcd60e51b8152600401610c1590613b44565b60005b601054811015610ff8576111146110c56006546001600160a01b031690565b601083815481106110d8576110d8613db9565b600091825260209091200154601180546001600160a01b03909216918590811061110457611104613db9565b9060005260206000200154611289565b8061111e81613d28565b9150506110a6565b6006546001600160a01b031633146111505760405162461bcd60e51b8152600401610c1590613b44565b47806111925760405162461bcd60e51b8152602060048201526011602482015270053616c65732042616c616e6365203d203607c1b6044820152606401610c15565b60005b600b5460ff8216101561126d576000600b8260ff16815481106111ba576111ba613db9565b906000526020600020906003020160010154111561125b5761125b600b8260ff16815481106111eb576111eb613db9565b906000526020600020906003020160000160009054906101000a90046001600160a01b03166112566103e8611250600b8660ff168154811061122f5761122f613db9565b9060005260206000209060030201600101548761274690919063ffffffff16565b90612759565b612765565b8061126581613d43565b915050611195565b50610ff86112836006546001600160a01b031690565b47612765565b610d4b83838360405180602001604052806000815250611e82565b6006546001600160a01b031633146112ce5760405162461bcd60e51b8152600401610c1590613b44565b6112da60116000613264565b610d4b60118383613282565b6006546001600160a01b031633146113105760405162461bcd60e51b8152600401610c1590613b44565b47806113555760405162461bcd60e51b81526020600482015260146024820152730436f6e74726163742042616c616e6365203d20360641b6044820152606401610c15565b60005b600b5460ff8216101561126d576000600b8260ff168154811061137d5761137d613db9565b906000526020600020906003020160020154111561141357611413600b8260ff16815481106113ae576113ae613db9565b906000526020600020906003020160000160009054906101000a90046001600160a01b03166112566103e8611250600b8660ff16815481106113f2576113f2613db9565b9060005260206000209060030201600201548761274690919063ffffffff16565b8061141d81613d43565b915050611358565b6006546001600160a01b0316331461144f5760405162461bcd60e51b8152600401610c1590613b44565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600061147c60095490565b82106114df5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c15565b600982815481106114f2576114f2613db9565b90600052602060002001549050919050565b6006546001600160a01b0316331461152e5760405162461bcd60e51b8152600401610c1590613b44565b8051610f2990600f9060208401906132cd565b6115816040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060e00160405280601360405161159a906139e8565b9081526020016040518091039020600101548152602001681043561a8829300000815260200160008152602001600d5481526020016115d860095490565b815260200160136040516115eb906139e8565b908152604080516020928190038301902054600160801b900461ffff1683525191019060139061161a906139e8565b9081526040519081900360200190205460ff600160901b909104169052919050565b6006546001600160a01b031633146116665760405162461bcd60e51b8152600401610c1590613b44565b80601383604051611677919061398d565b908152604080519182900360209081018320845181549286015193860151606087015160ff16600160901b0260ff60901b1961ffff909216600160801b029190911662ffffff60801b196001600160401b03968716600160401b026fffffffffffffffffffffffffffffffff1990961696909316959095179390931716929092171781556080830151600182015560a0909201516002909201805492151560ff19909316929092179091557f72bcd43411e859a3490882583e9093fcc18bd80d2927dc455e6399c45ae08933906117519084908490613a87565b60405180910390a15050565b6060600061176a83611903565b90506000816001600160401b0381111561178657611786613dcf565b6040519080825280602002602001820160405280156117af578160200160208202803683370190505b50905060005b828110156117f6576117c78582610f2d565b8282815181106117d9576117d9613db9565b6020908102919091010152806117ee81613d28565b9150506117b5565b509392505050565b6000818152600260205260408120546001600160a01b031680610b085760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c15565b600f805461188290613ced565b80601f01602080910402602001604051908101604052809291908181526020018280546118ae90613ced565b80156118fb5780601f106118d0576101008083540402835291602001916118fb565b820191906000526020600020905b8154815290600101906020018083116118de57829003601f168201915b505050505081565b60006001600160a01b03821661196e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c15565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146119b45760405162461bcd60e51b8152600401610c1590613b44565b6119be60006127fb565b565b604051806040016040528060068152602001655055424c494360d01b815250816119e982610d50565b611a265760405162461bcd60e51b815260206004820152600e60248201526d29b0b632b9903737ba1037b832b760911b6044820152606401610c15565b60008160ff1611611a6e5760405162461bcd60e51b815260206004820152601260248201527110d85b881b9bdd081b5a5b9d080c0813919560721b6044820152606401610c15565b600c548160ff161115611ada5760405162461bcd60e51b815260206004820152602e60248201527f45786365656473206d6178696d756d20737570706c792e2054727920746f206d60448201526d34b73a103632b9b99027232a399760911b6064820152608401610c15565b6000600c5411611b245760405162461bcd60e51b815260206004820152601560248201527410dbdb1b1958dd1a5bdb881a5cc814dbdb1913dd5d605a1b6044820152606401610c15565b601382604051611b34919061398d565b9081526040519081900360200190205460ff600160901b90910481169082161115611b945760405162461bcd60e51b815260206004820152601060248201526f13585e081c195c881d1e081b1a5b5a5d60821b6044820152606401610c15565b611b9d33612013565b15611c0057611bb860ff8216681043561a8829300000613c74565b341015611bfb5760405162461bcd60e51b8152602060048201526011602482015270496e737566696369656e742066756e647360781b6044820152606401610c15565b611c73565b8060ff16601383604051611c14919061398d565b908152602001604051809103902060010154611c309190613c74565b341015611c735760405162461bcd60e51b8152602060048201526011602482015270496e737566696369656e742066756e647360781b6044820152606401610c15565b8060ff16601483604051611c87919061398d565b90815260200160405180910390206000611c9e3390565b6001600160a01b03168152602081019190915260400160009081208054909190611ccd90849061ffff16613c22565b92506101000a81548161ffff021916908361ffff1602179055506000611d10604051806040016040528060068152602001655055424c494360d01b815250610d50565b8015611d205750611d2033612013565b15611d4257611d3b681043561a882930000060ff8416613c74565b9050611d73565b6013604051611d50906139e8565b9081526020016040518091039020600101548260ff16611d709190613c74565b90505b6000611d84826101f461271061284d565b9050611da473454cfaa623a629cc0b4017aeb85d54c42e91479d82612959565b6110728560ff166000612626565b6000601483604051611dc4919061398d565b908152604080519182900360209081019092206001600160a01b0385166000908152925290205461ffff16905092915050565b606060018054610b1d90613ced565b611e2d604051806040016040528060068152602001655055424c494360d01b815250610d50565b611e6e5760405162461bcd60e51b815260206004820152601260248201527129b0b632b99030b932903737ba1037b832b760711b6044820152606401610c15565b610ff8816119c0565b610f293383836129da565b611e8c3383612388565b611ea85760405162461bcd60e51b8152600401610c1590613b79565b611eb484848484612aa9565b50505050565b6000611ee3604051806040016040528060068152602001655055424c494360d01b815250610d50565b611eef57506000919050565b6013604051611efd906139e8565b9081526040519081900360200190205461ffff600160801b9091041692915050565b6000818152600260205260409020546060906001600160a01b0316611f9e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c15565b611fa6612adc565b611faf83612aeb565b604051602001611fc09291906139a9565b6040516020818303038152906040529050919050565b600b8181548110611fe657600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116925083565b600e5460405163288c314960e21b81526001600160a01b038381166004830152600092169063a230c5249060240160206040518083038186803b15801561205957600080fd5b505afa15801561206d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0891906136fc565b601181815481106120a157600080fd5b600091825260209091200154905081565b6006546001600160a01b031633146120dc5760405162461bcd60e51b8152600401610c1590613b44565b806013836040516120ed919061398d565b908152604051908190036020019020600201805491151560ff199092169190911790555050565b6000806121208361175d565b519392505050565b6040516371d4ed8d60e11b81526001600160a01b0382811660048301526000917f0000000000000000000000007ddf675610e738539ad43f16b5124bd5d7e1875f9091169063e3a9db1a9060240160206040518083038186803b15801561218e57600080fd5b505afa1580156121a2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0891906138f2565b601081815481106121d657600080fd5b6000918252602090912001546001600160a01b0316905081565b6006546001600160a01b0316331461221a5760405162461bcd60e51b8152600401610c1590613b44565b6001600160a01b03811661227f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c15565b610ff8816127fb565b6006546001600160a01b031633146122b25760405162461bcd60e51b8152600401610c1590613b44565b6122be60106000613264565b610d4b60108383613341565b60006001600160e01b031982166380ac58cd60e01b14806122fb57506001600160e01b03198216635b5e139f60e01b145b80610b0857506301ffc9a760e01b6001600160e01b0319831614610b08565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061234f826117fe565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166124015760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c15565b600061240c836117fe565b9050806001600160a01b0316846001600160a01b031614806124475750836001600160a01b031661243c84610ba0565b6001600160a01b0316145b8061247757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612492826117fe565b6001600160a01b0316146124f65760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610c15565b6001600160a01b0382166125585760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c15565b612563838383612be8565b61256e60008261231a565b6001600160a01b0383166000908152600360205260408120805460019290612597908490613c93565b90915550506001600160a01b03821660009081526003602052604081208054600192906125c5908490613c48565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000826001600160401b0381111561264057612640613dcf565b604051908082528060200260200182016040528015612669578160200160208202803683370190505b50905060005b83811015612707576000600c54841561268a57600954612692565b612692612ca0565b61269c9190613d63565b905060006126bd600c600081546126b290613cd6565b918290555083612da9565b90506126d3336126ce836001613c48565b612e20565b808484815181106126e6576126e6613db9565b602002602001018181525050505080806126ff90613d28565b91505061266f565b507f463768ce9a2a760c53066a4daf03bbfab9dfc2612ca4d0de3ff494b1bf1425c78133604051612739929190613a4a565b60405180910390a1505050565b60006127528284613c74565b9392505050565b60006127528284613c60565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146127b2576040519150601f19603f3d011682016040523d82523d6000602084013e6127b7565b606091505b5050905080610d4b5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610c15565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008082116128915760405162461bcd60e51b815260206004820152601060248201526f4469766973696f6e206279207a65726f60801b6044820152606401610c15565b8361289e57506000612752565b60006128aa8486613c74565b9050836128b78683613c60565b14156128cf576128c78382613c60565b915050612752565b60006128db8487613c60565b905060006128e98588613d63565b905060006128f78688613c60565b905060006129058789613d63565b905061294c612918886112508685612746565b6129466129258686612746565b6129466129328987612746565b6129468d6129408c8b612746565b90612746565b90612e3a565b9998505050505050505050565b60405163f340fa0160e01b81526001600160a01b0383811660048301527f0000000000000000000000007ddf675610e738539ad43f16b5124bd5d7e1875f169063f340fa019083906024016000604051808303818588803b1580156129bd57600080fd5b505af11580156129d1573d6000803e3d6000fd5b50505050505050565b816001600160a01b0316836001600160a01b03161415612a3c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c15565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612ab484848461247f565b612ac084848484612e46565b611eb45760405162461bcd60e51b8152600401610c1590613af2565b6060600f8054610b1d90613ced565b606081612b0f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612b395780612b2381613d28565b9150612b329050600a83613c60565b9150612b13565b6000816001600160401b03811115612b5357612b53613dcf565b6040519080825280601f01601f191660200182016040528015612b7d576020820181803683370190505b5090505b841561247757612b92600183613c93565b9150612b9f600a86613d63565b612baa906030613c48565b60f81b818381518110612bbf57612bbf613db9565b60200101906001600160f81b031916908160001a905350612be1600a86613c60565b9450612b81565b6001600160a01b038316612c4357612c3e81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612c66565b816001600160a01b0316836001600160a01b031614612c6657612c668382612f53565b6001600160a01b038216612c7d57610d4b81612ff0565b826001600160a01b0316826001600160a01b031614610d4b57610d4b828261309f565b6000600c5442612cad3390565b604051602001612cd5919060609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040528051906020012060001c612cf89190613c60565b6040516bffffffffffffffffffffffff194160601b16602082015242906034016040516020818303038152906040528051906020012060001c612d3b9190613c60565b4345612d474442613c48565b612d519190613c48565b612d5b9190613c48565b612d659190613c48565b612d6f9190613c48565b604051602001612d8191815260200190565b6040516020818303038152906040528051906020012060001c612da49190613c60565b905090565b600082815260156020526040812054839015612dd057506000838152601560205260409020545b60008481526015602052604080822085905584825290205415612e0457600083815260156020526040808220548683529120555b6000928352601560205260408084209190915592825250205490565b610f298282604051806020016040528060008152506130e3565b60006127528284613c48565b60006001600160a01b0384163b15612f4857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612e8a9033908990889088906004016139fa565b602060405180830381600087803b158015612ea457600080fd5b505af1925050508015612ed4575060408051601f3d908101601f19168201909252612ed191810190613736565b60015b612f2e573d808015612f02576040519150601f19603f3d011682016040523d82523d6000602084013e612f07565b606091505b508051612f265760405162461bcd60e51b8152600401610c1590613af2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612477565b506001949350505050565b60006001612f6084611903565b612f6a9190613c93565b600083815260086020526040902054909150808214612fbd576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061300290600190613c93565b6000838152600a60205260408120546009805493945090928490811061302a5761302a613db9565b90600052602060002001549050806009838154811061304b5761304b613db9565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061308357613083613da3565b6001900381819060005260206000200160009055905550505050565b60006130aa83611903565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6130ed8383613116565b6130fa6000848484612e46565b610d4b5760405162461bcd60e51b8152600401610c1590613af2565b6001600160a01b03821661316c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c15565b6000818152600260205260409020546001600160a01b0316156131d15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c15565b6131dd60008383612be8565b6001600160a01b0382166000908152600360205260408120805460019290613206908490613c48565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5080546000825590600052602060002090810190610ff89190613394565b8280548282559060005260206000209081019282156132bd579160200282015b828111156132bd5782358255916020019190600101906132a2565b506132c9929150613394565b5090565b8280546132d990613ced565b90600052602060002090601f0160209004810192826132fb57600085556132bd565b82601f1061331457805160ff19168380011785556132bd565b828001600101855582156132bd579182015b828111156132bd578251825591602001919060010190613326565b8280548282559060005260206000209081019282156132bd579160200282015b828111156132bd5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613361565b5b808211156132c95760008155600101613395565b60006001600160401b038311156133c2576133c2613dcf565b6133d5601f8401601f1916602001613bf2565b90508281528383830111156133e957600080fd5b828260208301376000602084830101529392505050565b60008083601f84011261341257600080fd5b5081356001600160401b0381111561342957600080fd5b6020830191508360208260051b850101111561344457600080fd5b9250929050565b600082601f83011261345c57600080fd5b612752838335602085016133a9565b80356001600160401b0381168114610e9957600080fd5b803560ff81168114610e9957600080fd5b6000602082840312156134a557600080fd5b813561275281613de5565b600080604083850312156134c357600080fd5b82356134ce81613de5565b915060208301356134de81613de5565b809150509250929050565b6000806000606084860312156134fe57600080fd5b833561350981613de5565b9250602084013561351981613de5565b929592945050506040919091013590565b6000806000806080858703121561354057600080fd5b843561354b81613de5565b9350602085013561355b81613de5565b92506040850135915060608501356001600160401b0381111561357d57600080fd5b8501601f8101871361358e57600080fd5b61359d878235602084016133a9565b91505092959194509250565b600080604083850312156135bc57600080fd5b82356135c781613de5565b915060208301356134de81613dfa565b600080604083850312156135ea57600080fd5b82356135f581613de5565b946020939093013593505050565b6000806020838503121561361657600080fd5b82356001600160401b0381111561362c57600080fd5b61363885828601613400565b90969095509350505050565b6000602080838503121561365757600080fd5b82356001600160401b038082111561366e57600080fd5b818501915085601f83011261368257600080fd5b81358181111561369457613694613dcf565b8060051b91506136a5848301613bf2565b8181528481019084860184860187018a10156136c057600080fd5b600095505b838610156136ef57803594506136da85613de5565b848352600195909501949186019186016136c5565b5098975050505050505050565b60006020828403121561370e57600080fd5b815161275281613dfa565b60006020828403121561372b57600080fd5b813561275281613e08565b60006020828403121561374857600080fd5b815161275281613e08565b60006020828403121561376557600080fd5b81356001600160401b0381111561377b57600080fd5b6124778482850161344b565b6000806040838503121561379a57600080fd5b82356001600160401b038111156137b057600080fd5b6137bc8582860161344b565b92505060208301356134de81613de5565b600080604083850312156137e057600080fd5b82356001600160401b038111156137f657600080fd5b6138028582860161344b565b92505060208301356134de81613dfa565b60008082840360e081121561382757600080fd5b83356001600160401b0381111561383d57600080fd5b6138498682870161344b565b93505060c0601f198201121561385e57600080fd5b50613867613bca565b6138736020850161346b565b81526138816040850161346b565b6020820152606084013561ffff8116811461389b57600080fd5b60408201526138ac60808501613482565b606082015260a0840135608082015260c08401356138c981613dfa565b60a0820152919491935090915050565b6000602082840312156138eb57600080fd5b5035919050565b60006020828403121561390457600080fd5b5051919050565b60006020828403121561391d57600080fd5b61275282613482565b600081518084526020808501945080840160005b838110156139565781518752958201959082019060010161393a565b509495945050505050565b60008151808452613979816020860160208601613caa565b601f01601f19169290920160200192915050565b6000825161399f818460208701613caa565b9190910192915050565b600083516139bb818460208801613caa565b8351908301906139cf818360208801613caa565b64173539b7b760d91b9101908152600501949350505050565b655055424c494360d01b815260060190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613a2d90830184613961565b9695505050505050565b6020815260006127526020830184613926565b604081526000613a5d6040830185613926565b905060018060a01b03831660208301529392505050565b6020815260006127526020830184613961565b60e081526000613a9a60e0830185613961565b90506001600160401b038084511660208401528060208501511660408401525061ffff604084015116606083015260ff6060840151166080830152608083015160a083015260a0830151151560c08301529392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60405160c081016001600160401b0381118282101715613bec57613bec613dcf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613c1a57613c1a613dcf565b604052919050565b600061ffff808316818516808303821115613c3f57613c3f613d77565b01949350505050565b60008219821115613c5b57613c5b613d77565b500190565b600082613c6f57613c6f613d8d565b500490565b6000816000190483118215151615613c8e57613c8e613d77565b500290565b600082821015613ca557613ca5613d77565b500390565b60005b83811015613cc5578181015183820152602001613cad565b83811115611eb45750506000910152565b600081613ce557613ce5613d77565b506000190190565b600181811c90821680613d0157607f821691505b60208210811415613d2257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613d3c57613d3c613d77565b5060010190565b600060ff821660ff811415613d5a57613d5a613d77565b60010192915050565b600082613d7257613d72613d8d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ff857600080fd5b8015158114610ff857600080fd5b6001600160e01b031981168114610ff857600080fdfea26469706673582212200d736b578c299bafb669e9d60c1331b3dcb7cf01a4ac27fbc014aafd044087a764736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000008ae0000000000000000000000007a3cdb2364f92369a602cae81167d0679087e6a30000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d594c58685a3534794c375a5666757a5a7265586d33507a6148594334416b5647616a64586e786544465762392f00000000000000000000
-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmYLXhZ54yL7ZVfuzZreXm3PzaHYC4AkVGajdXnxeDFWb9/
Arg [1] : _maxSupply (uint256): 2222
Arg [2] : _market (address): 0x7a3CdB2364f92369a602CAE81167d0679087e6a3
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000008ae
Arg [2] : 0000000000000000000000007a3cdb2364f92369a602cae81167d0679087e6a3
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [4] : 697066733a2f2f516d594c58685a3534794c375a5666757a5a7265586d33507a
Arg [5] : 6148594334416b5647616a64586e786544465762392f00000000000000000000
Deployed Bytecode Sourcemap
86221:8855:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79868:224;;;;;;;;;;-1:-1:-1;79868:224:0;;;;;:::i;:::-;;:::i;:::-;;;14900:14:1;;14893:22;14875:41;;14863:2;14848:18;79868:224:0;;;;;;;;66688:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;68247:221::-;;;;;;;;;;-1:-1:-1;68247:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12995:32:1;;;12977:51;;12965:2;12950:18;68247:221:0;12831:203:1;67770:411:0;;;;;;;;;;-1:-1:-1;67770:411:0;;;;;:::i;:::-;;:::i;:::-;;86595:58;;;;;;;;;;;;86644:9;86595:58;;;;;27924:25:1;;;27912:2;27897:18;86595:58:0;27778:177:1;80508:113:0;;;;;;;;;;-1:-1:-1;80596:10:0;:17;80508:113;;89237:219;;;;;;;;;;-1:-1:-1;89237:219:0;;;;;:::i;:::-;;:::i;68997:339::-;;;;;;;;;;-1:-1:-1;68997:339:0;;;;;:::i;:::-;;:::i;93197:235::-;;;;;;;;;;-1:-1:-1;93197:235:0;;;;;:::i;:::-;;:::i;91225:228::-;;;;;;;;;;-1:-1:-1;91225:228:0;;;;;:::i;:::-;;:::i;80176:256::-;;;;;;;;;;-1:-1:-1;80176:256:0;;;;;:::i;:::-;;:::i;92124:95::-;;;;;;;;;;-1:-1:-1;92124:95:0;;;;;:::i;:::-;;:::i;30752:106::-;;;;;;;;;;-1:-1:-1;30752:106:0;;;;;:::i;:::-;;:::i;86408:25::-;;;;;;;;;;;;;;;;92865:201;;;;;;;;;;;;;:::i;89572:171::-;;;;;;;;;;-1:-1:-1;89572:171:0;;;;;:::i;:::-;-1:-1:-1;;;;;89673:27:0;89631:4;89673:27;;;:20;:27;;;;;;;;;89572:171;17056:412;;;;;;;;;;;;;:::i;69407:185::-;;;;;;;;;;-1:-1:-1;69407:185:0;;;;;:::i;:::-;;:::i;91732:144::-;;;;;;;;;;-1:-1:-1;91732:144:0;;;;;:::i;:::-;;:::i;17476:429::-;;;;;;;;;;;;;:::i;91621:103::-;;;;;;;;;;-1:-1:-1;91621:103:0;;;;;:::i;:::-;;:::i;80698:233::-;;;;;;;;;;-1:-1:-1;80698:233:0;;;;;:::i;:::-;;:::i;90847:104::-;;;;;;;;;;-1:-1:-1;90847:104:0;;;;;:::i;:::-;;:::i;93929:231::-;;;;;;;;;;;;;:::i;:::-;;;;;;27109:4:1;27151:3;27140:9;27136:19;27128:27;;27188:6;27182:13;27171:9;27164:32;27252:4;27244:6;27240:17;27234:24;27227:4;27216:9;27212:20;27205:54;27315:4;27307:6;27303:17;27297:24;27290:4;27279:9;27275:20;27268:54;27378:4;27370:6;27366:17;27360:24;27353:4;27342:9;27338:20;27331:54;27441:4;27433:6;27429:17;27423:24;27416:4;27405:9;27401:20;27394:54;27504:4;27496:6;27492:17;27486:24;27479:4;27468:9;27464:20;27457:54;27567:4;27559:6;27555:17;27549:24;27542:4;27531:9;27527:20;27520:54;26975:605;;;;;88944:158:0;;;;;;;;;;-1:-1:-1;88944:158:0;;;;;:::i;:::-;;:::i;89876:361::-;;;;;;;;;;-1:-1:-1;89876:361:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66382:239::-;;;;;;;;;;-1:-1:-1;66382:239:0;;;;;:::i;:::-;;:::i;86373:28::-;;;;;;;;;;;;;;;;86662:21;;;;;;;;;;;;;:::i;66112:208::-;;;;;;;;;;-1:-1:-1;66112:208:0;;;;;:::i;:::-;;:::i;15535:103::-;;;;;;;;;;;;;:::i;91992:124::-;;;;;;:::i;:::-;;:::i;90596:135::-;;;;;;;;;;-1:-1:-1;90596:135:0;;;;;:::i;:::-;;:::i;:::-;;;27759:6:1;27747:19;;;27729:38;;27717:2;27702:18;90596:135:0;27585:188:1;14884:87:0;;;;;;;;;;-1:-1:-1;14957:6:0;;-1:-1:-1;;;;;14957:6:0;14884:87;;66857:104;;;;;;;;;;;;;:::i;86440:40::-;;;;;;;;;;;;86476:4;86440:40;;93753:168;;;;;;:::i;:::-;;:::i;68540:155::-;;;;;;;;;;-1:-1:-1;68540:155:0;;;;;:::i;:::-;;:::i;69663:328::-;;;;;;;;;;-1:-1:-1;69663:328:0;;;;;:::i;:::-;;:::i;93546:199::-;;;;;;;;;;-1:-1:-1;93546:199:0;;;;;:::i;:::-;;:::i;90959:258::-;;;;;;;;;;-1:-1:-1;90959:258:0;;;;;:::i;:::-;;:::i;16603:19::-;;;;;;;;;;-1:-1:-1;16603:19:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;13976:32:1;;;13958:51;;14040:2;14025:18;;14018:34;;;;14068:18;;;14061:34;13946:2;13931:18;16603:19:0;13756:345:1;89752:116:0;;;;;;;;;;-1:-1:-1;89752:116:0;;;;;:::i;:::-;;:::i;86733:31::-;;;;;;;;;;-1:-1:-1;86733:31:0;;;;;:::i;:::-;;:::i;89110:119::-;;;;;;;;;;-1:-1:-1;89110:119:0;;;;;:::i;:::-;;:::i;93440:98::-;;;;;;;;;;-1:-1:-1;93520:10:0;;93440:98;;90245:223;;;;;;;;;;-1:-1:-1;90245:223:0;;;;;:::i;:::-;;:::i;30982:112::-;;;;;;;;;;-1:-1:-1;30982:112:0;;;;;:::i;:::-;;:::i;68766:164::-;;;;;;;;;;-1:-1:-1;68766:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;68887:25:0;;;68863:4;68887:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;68766:164;86692:34;;;;;;;;;;-1:-1:-1;86692:34:0;;;;;:::i;:::-;;:::i;15793:201::-;;;;;;;;;;-1:-1:-1;15793:201:0;;;;;:::i;:::-;;:::i;91461:152::-;;;;;;;;;;-1:-1:-1;91461:152:0;;;;;:::i;:::-;;:::i;86998:36::-;;;;;;;;;;-1:-1:-1;86998:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;86998:36:0;;;;-1:-1:-1;;;86998:36:0;;;;;;;-1:-1:-1;;;86998:36:0;;;;;-1:-1:-1;;;86998:36:0;;;;;;;;;;;;;;-1:-1:-1;;;;;28286:15:1;;;28268:34;;28338:15;;;;28333:2;28318:18;;28311:43;28402:6;28390:19;;;28370:18;;;28363:47;;;;28458:4;28446:17;28441:2;28426:18;;28419:45;28495:3;28480:19;;28473:35;;;;28552:14;28545:22;28539:3;28524:19;;28517:51;28218:3;28203:19;86998:36:0;27960:614:1;79868:224:0;79970:4;-1:-1:-1;;;;;;79994:50:0;;-1:-1:-1;;;79994:50:0;;:90;;;80048:36;80072:11;80048:23;:36::i;:::-;79987:97;79868:224;-1:-1:-1;;79868:224:0:o;66688:100::-;66742:13;66775:5;66768:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66688:100;:::o;68247:221::-;68323:7;71590:16;;;:7;:16;;;;;;-1:-1:-1;;;;;71590:16:0;68343:73;;;;-1:-1:-1;;;68343:73:0;;22265:2:1;68343:73:0;;;22247:21:1;22304:2;22284:18;;;22277:30;22343:34;22323:18;;;22316:62;-1:-1:-1;;;22394:18:1;;;22387:42;22446:19;;68343:73:0;;;;;;;;;-1:-1:-1;68436:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;68436:24:0;;68247:221::o;67770:411::-;67851:13;67867:23;67882:7;67867:14;:23::i;:::-;67851:39;;67915:5;-1:-1:-1;;;;;67909:11:0;:2;-1:-1:-1;;;;;67909:11:0;;;67901:57;;;;-1:-1:-1;;;67901:57:0;;23800:2:1;67901:57:0;;;23782:21:1;23839:2;23819:18;;;23812:30;23878:34;23858:18;;;23851:62;-1:-1:-1;;;23929:18:1;;;23922:31;23970:19;;67901:57:0;23598:397:1;67901:57:0;13688:10;-1:-1:-1;;;;;67993:21:0;;;;:62;;-1:-1:-1;68018:37:0;68035:5;13688:10;68766:164;:::i;68018:37::-;67971:168;;;;-1:-1:-1;;;67971:168:0;;19961:2:1;67971:168:0;;;19943:21:1;20000:2;19980:18;;;19973:30;20039:34;20019:18;;;20012:62;20110:26;20090:18;;;20083:54;20154:19;;67971:168:0;19759:420:1;67971:168:0;68152:21;68161:2;68165:7;68152:8;:21::i;:::-;67840:341;67770:411;;:::o;89237:219::-;89298:4;89343:1;89322:5;89328;89322:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;89322:18:0;:22;:63;;;;;89367:5;89373;89367:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;89367:18:0;89348:15;:37;;89322:63;:102;;;;;89408:5;89414;89408:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:16;-1:-1:-1;;;;;;;;89408:16:0;;;;89389:15;:35;;89322:102;:126;;;;;89429:5;89435;89429:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:19;;;;;89428:20;89315:133;89237:219;-1:-1:-1;;89237:219:0:o;68997:339::-;69192:41;13688:10;69225:7;69192:18;:41::i;:::-;69184:103;;;;-1:-1:-1;;;69184:103:0;;;;;;;:::i;:::-;69300:28;69310:4;69316:2;69320:7;69300:9;:28::i;93197:235::-;93263:7;93287:19;93298:7;93287:10;:19::i;:::-;93283:142;;;-1:-1:-1;86644:9:0;;93197:235;-1:-1:-1;93197:235:0:o;93283:142::-;93392:5;:15;;;;;:::i;:::-;;;;;;;;;;;;;:21;;;93385:28;;93197:235;;;:::o;93283:142::-;93197:235;;;:::o;91225:228::-;14957:6;;-1:-1:-1;;;;;14957:6:0;13688:10;15104:23;15096:68;;;;-1:-1:-1;;;15096:68:0;;;;;;;:::i;:::-;91309:9:::1;91305:141;91328:6;:13;91324:1;:17;91305:141;;;91362:12;91377:6;91384:1;91377:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;91401:26:0::1;;::::0;;;:20:::1;:26:::0;;;;;;:33;;-1:-1:-1;;91401:33:0::1;91430:4;91401:33;::::0;;-1:-1:-1;91343:3:0;::::1;::::0;::::1;:::i;:::-;;;;91305:141;;;;91225:228:::0;:::o;80176:256::-;80273:7;80309:23;80326:5;80309:16;:23::i;:::-;80301:5;:31;80293:87;;;;-1:-1:-1;;;80293:87:0;;16443:2:1;80293:87:0;;;16425:21:1;16482:2;16462:18;;;16455:30;16521:34;16501:18;;;16494:62;-1:-1:-1;;;16572:18:1;;;16565:41;16623:19;;80293:87:0;16241:407:1;80293:87:0;-1:-1:-1;;;;;;80398:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;80176:256::o;92124:95::-;14957:6;;-1:-1:-1;;;;;14957:6:0;13688:10;15104:23;15096:68;;;;-1:-1:-1;;;15096:68:0;;;;;;;:::i;:::-;92187:24:::1;92197:7;92206:4;92187:9;:24::i;:::-;92124:95:::0;:::o;30752:106::-;30827:23;;-1:-1:-1;;;30827:23:0;;-1:-1:-1;;;;;12995:32:1;;;30827:23:0;;;12977:51:1;30827:7:0;:16;;;;12950:18:1;;30827:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30752:106;:::o;92865:201::-;14957:6;;-1:-1:-1;;;;;14957:6:0;13688:10;15104:23;15096:68;;;;-1:-1:-1;;;15096:68:0;;;;;;;:::i;:::-;92916:9:::1;92912:147;92935:17;:24:::0;92931:28;::::1;92912:147;;;92981:66;92998:7;14957:6:::0;;-1:-1:-1;;;;;14957:6:0;;14884:87;92998:7:::1;93007:17;93025:1;93007:20;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;93029:14:::1;:17:::0;;-1:-1:-1;;;;;93007:20:0;;::::1;::::0;93044:1;;93029:17;::::1;;;;;:::i;:::-;;;;;;;;;92981:16;:66::i;:::-;92961:3:::0;::::1;::::0;::::1;:::i;:::-;;;;92912:147;;17056:412:::0;14957:6;;-1:-1:-1;;;;;14957:6:0;13688:10;15104:23;15096:68;;;;-1:-1:-1;;;15096:68:0;;;;;;;:::i;:::-;17128:21:::1;17168:11:::0;17160:41:::1;;;::::0;-1:-1:-1;;;17160:41:0;;26067:2:1;17160:41:0::1;::::0;::::1;26049:21:1::0;26106:2;26086:18;;;26079:30;-1:-1:-1;;;26125:18:1;;;26118:47;26182:18;;17160:41:0::1;25865:341:1::0;17160:41:0::1;17218:7;17214:193;17235:5;:12:::0;17231:16:::1;::::0;::::1;;17214:193;;;17291:1;17271:5;17277:1;17271:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:17;;;:21;17268:128;;;17312:68;17322:5;17328:1;17322:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;;;;;;;;-1:-1:-1::0;;;;;17322:15:0::1;17339:40;17374:4;17339:30;17351:5;17357:1;17351:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:17;;;17339:7;:11;;:30;;;;:::i;:::-;:34:::0;::::1;:40::i;:::-;17312:9;:68::i;:::-;17249:3:::0;::::1;::::0;::::1;:::i;:::-;;;;17214:193;;;;17419:41;17429:7;14957:6:::0;;-1:-1:-1;;;;;14957:6:0;;14884:87;17429:7:::1;17438:21;17419:9;:41::i;69407:185::-:0;69545:39;69562:4;69568:2;69572:7;69545:39;;;;;;;;;;;;:16;:39::i;91732:144::-;14957:6;;-1:-1:-1;;;;;14957:6:0;13688:10;15104:23;15096:68;;;;-1:-1:-1;;;15096:68:0;;;;;;;:::i;:::-;91810:21:::1;91817:14;;91810:21;:::i;:::-;91842:26;:14;91859:9:::0;;91842:26:::1;:::i;17476:429::-:0;14957:6;;-1:-1:-1;;;;;14957:6:0;13688:10;15104:23;15096:68;;;;-1:-1:-1;;;15096:68:0;;;;;;;:::i;:::-;17552:21:::1;17592:11:::0;17584:44:::1;;;::::0;-1:-1:-1;;;17584:44:0;;26828:2:1;17584:44:0::1;::::0;::::1;26810:21:1::0;26867:2;26847:18;;;26840:30;-1:-1:-1;;;26886:18:1;;;26879:50;26946:18;;17584:44:0::1;26626:344:1::0;17584:44:0::1;17645:7;17641:203;17662:5;:12:::0;17658:16:::1;::::0;::::1;;17641:203;;;17723:1;17698:5;17704:1;17698:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;:26;17695:138;;;17744:73;17754:5;17760:1;17754:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;;;;;;;;-1:-1:-1::0;;;;;17754:15:0::1;17771:45;17811:4;17771:35;17783:5;17789:1;17783:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;17771:7;:11;;:35;;;;:::i;17744:73::-;17676:3:::0;::::1;::::0;::::1;:::i;:::-;;;;17641:203;;91621:103:::0;14957:6;;-1:-1:-1;;;;;14957:6:0;13688:10;15104:23;15096:68;;;;-1:-1:-1;;;15096:68:0;;;;;;;:::i;:::-;91700:6:::1;:16:::0;;-1:-1:-1;;;;;;91700:16:0::1;-1:-1:-1::0;;;;;91700:16:0;;;::::1;::::0;;;::::1;::::0;;91621:103::o;80698:233::-;80773:7;80809:30;80596:10;:17;;80508:113;80809:30;80801:5;:38;80793:95;;;;-1:-1:-1;;;80793:95:0;;25654:2:1;80793:95:0;;;25636:21:1;25693:2;25673:18;;;25666:30;25732:34;25712:18;;;25705:62;-1:-1:-1;;;25783:18:1;;;25776:42;25835:19;;80793:95:0;25452:408:1;80793:95:0;80906:10;80917:5;80906:17;;;;;;;;:::i;:::-;;;;;;;;;80899:24;;80698:233;;;:::o;90847:104::-;14957:6;;-1:-1:-1;;;;;14957:6:0;13688:10;15104:23;15096:68;;;;-1:-1:-1;;;15096:68:0;;;;;;;:::i;:::-;90922:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;93929:231::-:0;93980:11;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93980:11:0;94013:137;;;;;;;;94018:5;:15;;;;;:::i;:::-;;;;;;;;;;;;;:21;;;94013:137;;;;86644:9;94013:137;;;;94065:1;94013:137;;;;94068:10;;94013:137;;;;94080:13;80596:10;:17;;80508:113;94080:13;94013:137;;;;94095:5;:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;:28;-1:-1:-1;;;94095:28:0;;;;94013:137;;94125:15;94013:137;;;94125:5;;:15;;;:::i;:::-;;;;;;;;;;;;;;:24;;-1:-1:-1;;;94125:24:0;;;;94013:137;;94005:146;93929:231;-1:-1:-1;93929:231:0:o;88944:158::-;14957:6;;-1:-1:-1;;;;;14957:6:0;13688:10;15104:23;15096:68;;;;-1:-1:-1;;;15096:68:0;;;;;;;:::i;:::-;89044:5:::1;89029;89035;89029:12;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;:20;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;-1:-1:-1::0;;;89029:20:0::1;-1:-1:-1::0;;;;89029:20:0::1;::::0;;::::1;-1:-1:-1::0;;;89029:20:0::1;::::0;;;;-1:-1:-1;;;;;;;;;89029:20:0;;::::1;-1:-1:-1::0;;;89029:20:0::1;-1:-1:-1::0;;89029:20:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;89029:20:0;;::::1;::::0;;;::::1;::::0;;;89065:29:::1;::::0;::::1;::::0;89081:5;;89088;;89065:29:::1;:::i;:::-;;;;;;;;88944:158:::0;;:::o;89876:361::-;89939:16;89968:23;89994:17;90004:6;89994:9;:17::i;:::-;89968:43;;90022:25;90064:15;-1:-1:-1;;;;;90050:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;90050:30:0;;90022:58;;90096:9;90091:113;90111:15;90107:1;:19;90091:113;;;90162:30;90182:6;90190:1;90162:19;:30::i;:::-;90148:8;90157:1;90148:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;90128:3;;;;:::i;:::-;;;;90091:113;;;-1:-1:-1;90221:8:0;89876:361;-1:-1:-1;;;89876:361:0:o;66382:239::-;66454:7;66490:16;;;:7;:16;;;;;;-1:-1:-1;;;;;66490:16:0;66525:19;66517:73;;;;-1:-1:-1;;;66517:73:0;;21147:2:1;66517:73:0;;;21129:21:1;21186:2;21166:18;;;21159:30;21225:34;21205:18;;;21198:62;-1:-1:-1;;;21276:18:1;;;21269:39;21325:19;;66517:73:0;20945:405:1;86662:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66112:208::-;66184:7;-1:-1:-1;;;;;66212:19:0;;66204:74;;;;-1:-1:-1;;;66204:74:0;;20736:2:1;66204:74:0;;;20718:21:1;20775:2;20755:18;;;20748:30;20814:34;20794:18;;;20787:62;-1:-1:-1;;;20865:18:1;;;20858:40;20915:19;;66204:74:0;20534:406:1;66204:74:0;-1:-1:-1;;;;;;66296:16:0;;;;;:9;:16;;;;;;;66112:208::o;15535:103::-;14957:6;;-1:-1:-1;;;;;14957:6:0;13688:10;15104:23;15096:68;;;;-1:-1:-1;;;15096:68:0;;;;;;;:::i;:::-;15600:30:::1;15627:1;15600:18;:30::i;:::-;15535:103::o:0;91992:124::-;87750:1078;;;;;;;;;;;;;-1:-1:-1;;;87750:1078:0;;;92064:7;87820:17;87831:5;87820:10;:17::i;:::-;87812:44;;;;-1:-1:-1;;;87812:44:0;;24202:2:1;87812:44:0;;;24184:21:1;24241:2;24221:18;;;24214:30;-1:-1:-1;;;24260:18:1;;;24253:44;24314:18;;87812:44:0;24000:338:1;87812:44:0;87884:1;87875:6;:10;;;87867:41;;;;-1:-1:-1;;;87867:41:0;;16096:2:1;87867:41:0;;;16078:21:1;16135:2;16115:18;;;16108:30;-1:-1:-1;;;16154:18:1;;;16147:48;16212:18;;87867:41:0;15894:342:1;87867:41:0;87937:13;;87927:6;:23;;;;87919:82;;;;-1:-1:-1;;;87919:82:0;;26413:2:1;87919:82:0;;;26395:21:1;26452:2;26432:18;;;26425:30;26491:34;26471:18;;;26464:62;-1:-1:-1;;;26542:18:1;;;26535:44;26596:19;;87919:82:0;26211:410:1;87919:82:0;88036:1;88020:13;;:17;88012:51;;;;-1:-1:-1;;;88012:51:0;;20386:2:1;88012:51:0;;;20368:21:1;20425:2;20405:18;;;20398:30;-1:-1:-1;;;20444:18:1;;;20437:51;20505:18;;88012:51:0;20184:345:1;88012:51:0;88092:5;88098;88092:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:21;;-1:-1:-1;;;88092:21:0;;;;;88082:31;;;;;88074:60;;;;-1:-1:-1;;;88074:60:0;;19203:2:1;88074:60:0;;;19185:21:1;19242:2;19222:18;;;19215:30;-1:-1:-1;;;19261:18:1;;;19254:46;19317:18;;88074:60:0;19001:340:1;88074:60:0;88149:24;13688:10;89752:116;:::i;88149:24::-;88145:234;;;88211:31;;;;86644:9;88211:31;:::i;:::-;88198:9;:44;;88190:74;;;;-1:-1:-1;;;88190:74:0;;25308:2:1;88190:74:0;;;25290:21:1;25347:2;25327:18;;;25320:30;-1:-1:-1;;;25366:18:1;;;25359:47;25423:18;;88190:74:0;25106:341:1;88190:74:0;88145:234;;;88339:6;88318:27;;:5;88324;88318:12;;;;;;:::i;:::-;;;;;;;;;;;;;:18;;;:27;;;;:::i;:::-;88305:9;:40;;88297:70;;;;-1:-1:-1;;;88297:70:0;;25308:2:1;88297:70:0;;;25290:21:1;25347:2;25327:18;;;25320:30;-1:-1:-1;;;25366:18:1;;;25359:47;25423:18;;88297:70:0;25106:341:1;88297:70:0;88432:6;88425:14;;88389:11;88401:5;88389:18;;;;;;:::i;:::-;;;;;;;;;;;;;:32;88408:12;13688:10;;13608:98;88408:12;-1:-1:-1;;;;;88389:32:0;;;;;;;;;;;;-1:-1:-1;88389:32:0;;;:50;;:32;;-1:-1:-1;88389:50:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;88452:14;88482:20;;;;;;;;;;;;;;-1:-1:-1;;;88482:20:0;;;:10;:20::i;:::-;:48;;;;-1:-1:-1;88506:24:0;13688:10;89752:116;:::i;88506:24::-;88479:198;;;88559:31;86644:9;88559:31;;;;:::i;:::-;88547:43;;88479:198;;;88644:5;:15;;;;;:::i;:::-;;;;;;;;;;;;;:21;;;88635:6;:30;;;;;;:::i;:::-;88623:42;;88479:198;88687:12;88702:28;:9;86565:3;86521:5;88702:16;:28::i;:::-;88687:43;;88741:67;88756:42;88800:7;88741:14;:67::i;:::-;92083:25:::1;92093:7;92083:25;;92102:5;92083:9;:25::i;90596:135::-:0;90670:6;90696:11;90708:5;90696:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;90696:27:0;;;;;;;;;;;;;;-1:-1:-1;90596:135:0;;;;:::o;66857:104::-;66913:13;66946:7;66939:14;;;;;:::i;93753:168::-;93829:20;;;;;;;;;;;;;;-1:-1:-1;;;93829:20:0;;;:10;:20::i;:::-;93821:50;;;;-1:-1:-1;;;93821:50:0;;21557:2:1;93821:50:0;;;21539:21:1;21596:2;21576:18;;;21569:30;-1:-1:-1;;;21615:18:1;;;21608:48;21673:18;;93821:50:0;21355:342:1;93821:50:0;93882:31;93904:7;93882:15;:31::i;68540:155::-;68635:52;13688:10;68668:8;68678;68635:18;:52::i;69663:328::-;69838:41;13688:10;69871:7;69838:18;:41::i;:::-;69830:103;;;;-1:-1:-1;;;69830:103:0;;;;;;;:::i;:::-;69944:39;69958:4;69964:2;69968:7;69977:5;69944:13;:39::i;:::-;69663:328;;;;:::o;93546:199::-;93612:6;93635:20;;;;;;;;;;;;;;-1:-1:-1;;;93635:20:0;;;:10;:20::i;:::-;93631:61;;-1:-1:-1;93679:1:0;;93546:199;-1:-1:-1;93546:199:0:o;93631:61::-;93709:5;:15;;;;;:::i;:::-;;;;;;;;;;;;;;:28;;-1:-1:-1;;;93709:28:0;;;;;93546:199;-1:-1:-1;;93546:199:0:o;90959:258::-;71566:4;71590:16;;;:7;:16;;;;;;91024:13;;-1:-1:-1;;;;;71590:16:0;91050:76;;;;-1:-1:-1;;;91050:76:0;;23384:2:1;91050:76:0;;;23366:21:1;23423:2;23403:18;;;23396:30;23462:34;23442:18;;;23435:62;-1:-1:-1;;;23513:18:1;;;23506:45;23568:19;;91050:76:0;23182:411:1;91050:76:0;91168:10;:8;:10::i;:::-;91180:18;:7;:16;:18::i;:::-;91151:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;91137:72;;90959:258;;;:::o;16603:19::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16603:19:0;;;;-1:-1:-1;16603:19:0;:::o;89752:116::-;89835:6;;:25;;-1:-1:-1;;;89835:25:0;;-1:-1:-1;;;;;12995:32:1;;;89835:25:0;;;12977:51:1;89811:4:0;;89835:6;;:15;;12950:18:1;;89835:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;86733:31::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;86733:31:0;:::o;89110:119::-;14957:6;;-1:-1:-1;;;;;14957:6:0;13688:10;15104:23;15096:68;;;;-1:-1:-1;;;15096:68:0;;;;;;;:::i;:::-;89215:6:::1;89193:5;89199;89193:12;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:19:::1;;:28:::0;;;::::1;;-1:-1:-1::0;;89193:28:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;89110:119:0:o;90245:223::-;90309:7;90329:25;90357:24;90374:6;90357:16;:24::i;:::-;90415:15;;90245:223;-1:-1:-1;;;90245:223:0:o;30982:112::-;31062:24;;-1:-1:-1;;;31062:24:0;;-1:-1:-1;;;;;12995:32:1;;;31062:24:0;;;12977:51:1;31035:7:0;;31062;:18;;;;;;12950::1;;31062:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;86692:34::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;86692:34:0;;-1:-1:-1;86692:34:0;:::o;15793:201::-;14957:6;;-1:-1:-1;;;;;14957:6:0;13688:10;15104:23;15096:68;;;;-1:-1:-1;;;15096:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15882:22:0;::::1;15874:73;;;::::0;-1:-1:-1;;;15874:73:0;;17274:2:1;15874:73:0::1;::::0;::::1;17256:21:1::0;17313:2;17293:18;;;17286:30;17352:34;17332:18;;;17325:62;-1:-1:-1;;;17403:18:1;;;17396:36;17449:19;;15874:73:0::1;17072:402:1::0;15874:73:0::1;15958:28;15977:8;15958:18;:28::i;91461:152::-:0;14957:6;;-1:-1:-1;;;;;14957:6:0;13688:10;15104:23;15096:68;;;;-1:-1:-1;;;15096:68:0;;;;;;;:::i;:::-;91544:24:::1;91551:17;;91544:24;:::i;:::-;91579:26;:17;91599:6:::0;;91579:26:::1;:::i;65743:305::-:0;65845:4;-1:-1:-1;;;;;;65882:40:0;;-1:-1:-1;;;65882:40:0;;:105;;-1:-1:-1;;;;;;;65939:48:0;;-1:-1:-1;;;65939:48:0;65882:105;:158;;;-1:-1:-1;;;;;;;;;;41969:40:0;;;66004:36;41860:157;75647:174;75722:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;75722:29:0;-1:-1:-1;;;;;75722:29:0;;;;;;;;:24;;75776:23;75722:24;75776:14;:23::i;:::-;-1:-1:-1;;;;;75767:46:0;;;;;;;;;;;75647:174;;:::o;71795:348::-;71888:4;71590:16;;;:7;:16;;;;;;-1:-1:-1;;;;;71590:16:0;71905:73;;;;-1:-1:-1;;;71905:73:0;;19548:2:1;71905:73:0;;;19530:21:1;19587:2;19567:18;;;19560:30;19626:34;19606:18;;;19599:62;-1:-1:-1;;;19677:18:1;;;19670:42;19729:19;;71905:73:0;19346:408:1;71905:73:0;71989:13;72005:23;72020:7;72005:14;:23::i;:::-;71989:39;;72058:5;-1:-1:-1;;;;;72047:16:0;:7;-1:-1:-1;;;;;72047:16:0;;:51;;;;72091:7;-1:-1:-1;;;;;72067:31:0;:20;72079:7;72067:11;:20::i;:::-;-1:-1:-1;;;;;72067:31:0;;72047:51;:87;;;-1:-1:-1;;;;;;68887:25:0;;;68863:4;68887:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;72102:32;72039:96;71795:348;-1:-1:-1;;;;71795:348:0:o;74904:625::-;75063:4;-1:-1:-1;;;;;75036:31:0;:23;75051:7;75036:14;:23::i;:::-;-1:-1:-1;;;;;75036:31:0;;75028:81;;;;-1:-1:-1;;;75028:81:0;;17681:2:1;75028:81:0;;;17663:21:1;17720:2;17700:18;;;17693:30;17759:34;17739:18;;;17732:62;-1:-1:-1;;;17810:18:1;;;17803:35;17855:19;;75028:81:0;17479:401:1;75028:81:0;-1:-1:-1;;;;;75128:16:0;;75120:65;;;;-1:-1:-1;;;75120:65:0;;18444:2:1;75120:65:0;;;18426:21:1;18483:2;18463:18;;;18456:30;18522:34;18502:18;;;18495:62;-1:-1:-1;;;18573:18:1;;;18566:34;18617:19;;75120:65:0;18242:400:1;75120:65:0;75198:39;75219:4;75225:2;75229:7;75198:20;:39::i;:::-;75302:29;75319:1;75323:7;75302:8;:29::i;:::-;-1:-1:-1;;;;;75344:15:0;;;;;;:9;:15;;;;;:20;;75363:1;;75344:15;:20;;75363:1;;75344:20;:::i;:::-;;;;-1:-1:-1;;;;;;;75375:13:0;;;;;;:9;:13;;;;;:18;;75392:1;;75375:13;:18;;75392:1;;75375:18;:::i;:::-;;;;-1:-1:-1;;75404:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;75404:21:0;-1:-1:-1;;;;;75404:21:0;;;;;;;;;75443:27;;75404:16;;75443:27;;;;;;;67840:341;67770:411;;:::o;92227:507::-;92295:28;92337:7;-1:-1:-1;;;;;92326:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;92326:19:0;;92295:50;;92363:6;92358:308;92379:7;92375:1;:11;92358:308;;;92408:17;92468:13;;92430:6;92429:7;:35;;80596:10;:17;92429:35;;;92439:9;:7;:9::i;:::-;92428:53;;;;:::i;:::-;92408:73;;92496:16;92515:44;92534:13;;92532:15;;;;;:::i;:::-;;;;;-1:-1:-1;92549:9:0;92515:16;:44::i;:::-;92496:63;-1:-1:-1;92574:37:0;13688:10;92598:12;:8;92609:1;92598:12;:::i;:::-;92574:9;:37::i;:::-;92646:8;92626:14;92641:1;92626:17;;;;;;;;:::i;:::-;;;;;;:28;;;;;92393:273;;92388:3;;;;;:::i;:::-;;;;92358:308;;;-1:-1:-1;92681:45:0;92697:14;13688:10;92681:45;;;;;;;:::i;:::-;;;;;;;;92284:450;92227:507;;:::o;7378:98::-;7436:7;7463:5;7467:1;7463;:5;:::i;:::-;7456:12;7378:98;-1:-1:-1;;;7378:98:0:o;7777:::-;7835:7;7862:5;7866:1;7862;:5;:::i;17913:180::-;17987:12;18005:8;-1:-1:-1;;;;;18005:13:0;18026:7;18005:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17986:52;;;18057:7;18049:36;;;;-1:-1:-1;;;18049:36:0;;24545:2:1;18049:36:0;;;24527:21:1;24584:2;24564:18;;;24557:30;-1:-1:-1;;;24603:18:1;;;24596:46;24659:18;;18049:36:0;24343:340:1;16154:191:0;16247:6;;;-1:-1:-1;;;;;16264:17:0;;;-1:-1:-1;;;;;;16264:17:0;;;;;;;16297:40;;16247:6;;;16264:17;16247:6;;16297:40;;16228:16;;16297:40;16217:128;16154:191;:::o;2454:669::-;2526:7;2558:1;2554;:5;2546:34;;;;-1:-1:-1;;;2546:34:0;;22678:2:1;2546:34:0;;;22660:21:1;22717:2;22697:18;;;22690:30;-1:-1:-1;;;22736:18:1;;;22729:46;22792:18;;2546:34:0;22476:340:1;2546:34:0;2597:6;2593:20;;-1:-1:-1;2612:1:0;2605:8;;2593:20;2624:10;2637:5;2641:1;2637;:5;:::i;:::-;2624:18;-1:-1:-1;2667:1:0;2657:6;2662:1;2624:18;2657:6;:::i;:::-;:11;2653:107;;;2742:6;2747:1;2742:2;:6;:::i;:::-;2735:13;;;;;2653:107;2832:9;2844:5;2848:1;2844;:5;:::i;:::-;2832:17;-1:-1:-1;2860:9:0;2872:5;2876:1;2872;:5;:::i;:::-;2860:17;-1:-1:-1;2967:9:0;2979:5;2983:1;2979;:5;:::i;:::-;2967:17;-1:-1:-1;2995:9:0;3007:5;3011:1;3007;:5;:::i;:::-;2995:17;-1:-1:-1;3049:66:0;3099:15;3112:1;3099:8;:1;2995:17;3099:5;:8::i;:15::-;3049:45;3085:8;:1;3091;3085:5;:8::i;:::-;3049:31;3071:8;:1;3077;3071:5;:8::i;:::-;3050:15;3063:1;3050:8;:1;3056;3050:5;:8::i;:::-;:12;;:15::i;:::-;3049:21;;:31::i;:66::-;3042:73;2454:669;-1:-1:-1;;;;;;;;;2454:669:0:o;31463:126::-;31545:36;;-1:-1:-1;;;31545:36:0;;-1:-1:-1;;;;;12995:32:1;;;31545:36:0;;;12977:51:1;31545:7:0;:15;;;;31568:6;;12950:18:1;;31545:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31463:126;;:::o;75963:315::-;76118:8;-1:-1:-1;;;;;76109:17:0;:5;-1:-1:-1;;;;;76109:17:0;;;76101:55;;;;-1:-1:-1;;;76101:55:0;;18849:2:1;76101:55:0;;;18831:21:1;18888:2;18868:18;;;18861:30;18927:27;18907:18;;;18900:55;18972:18;;76101:55:0;18647:349:1;76101:55:0;-1:-1:-1;;;;;76167:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;76167:46:0;;;;;;;;;;76229:41;;14875::1;;;76229::0;;14848:18:1;76229:41:0;;;;;;;75963:315;;;:::o;70873:::-;71030:28;71040:4;71046:2;71050:7;71030:9;:28::i;:::-;71077:48;71100:4;71106:2;71110:7;71119:5;71077:22;:48::i;:::-;71069:111;;;;-1:-1:-1;;;71069:111:0;;;;;;;:::i;90480:108::-;90540:13;90573:7;90566:14;;;;;:::i;11170:723::-;11226:13;11447:10;11443:53;;-1:-1:-1;;11474:10:0;;;;;;;;;;;;-1:-1:-1;;;11474:10:0;;;;;11170:723::o;11443:53::-;11521:5;11506:12;11562:78;11569:9;;11562:78;;11595:8;;;;:::i;:::-;;-1:-1:-1;11618:10:0;;-1:-1:-1;11626:2:0;11618:10;;:::i;:::-;;;11562:78;;;11650:19;11682:6;-1:-1:-1;;;;;11672:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11672:17:0;;11650:39;;11700:154;11707:10;;11700:154;;11734:11;11744:1;11734:11;;:::i;:::-;;-1:-1:-1;11803:10:0;11811:2;11803:5;:10;:::i;:::-;11790:24;;:2;:24;:::i;:::-;11777:39;;11760:6;11767;11760:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;11760:56:0;;;;;;;;-1:-1:-1;11831:11:0;11840:2;11831:11;;:::i;:::-;;;11700:154;;81544:589;-1:-1:-1;;;;;81750:18:0;;81746:187;;81785:40;81817:7;82960:10;:17;;82933:24;;;;:15;:24;;;;;:44;;;82988:24;;;;;;;;;;;;82856:164;81785:40;81746:187;;;81855:2;-1:-1:-1;;;;;81847:10:0;:4;-1:-1:-1;;;;;81847:10:0;;81843:90;;81874:47;81907:4;81913:7;81874:32;:47::i;:::-;-1:-1:-1;;;;;81947:16:0;;81943:183;;81980:45;82017:7;81980:36;:45::i;81943:183::-;82053:4;-1:-1:-1;;;;;82047:10:0;:2;-1:-1:-1;;;;;82047:10:0;;82043:83;;82074:40;82102:2;82106:7;82074:27;:40::i;94276:395::-;94317:7;94650:13;;94618:15;94599:12;13688:10;;13608:98;94599:12;94582:30;;;;;;;10915:2:1;10911:15;;;;-1:-1:-1;;10907:53:1;10895:66;;10986:2;10977:12;;10766:229;94582:30:0;;;;;;;;;;;;;94572:41;;;;;;94564:50;;94563:70;;;;:::i;:::-;94493:32;;-1:-1:-1;;94510:14:0;10915:2:1;10911:15;10907:53;94493:32:0;;;10895:66:1;94531:15:0;;10977:12:1;;94493:32:0;;;;;;;;;;;;94483:43;;;;;;94475:52;;94474:72;;;;:::i;:::-;94447:12;94430:14;94393:34;94411:16;94393:15;:34;:::i;:::-;:51;;;;:::i;:::-;:66;;;;:::i;:::-;:154;;;;:::i;:::-;:241;;;;:::i;:::-;94376:269;;;;;;12773:19:1;;12817:2;12808:12;;12644:182;94376:269:0;;;;;;;;;;;;;94366:280;;;;;;94344:303;;:319;;;;:::i;:::-;94337:326;;94276:395;:::o;94679:392::-;94754:7;94810:20;;;:12;:20;;;;;;94789:6;;94810:24;94806:57;;-1:-1:-1;94843:20:0;;;;:12;:20;;;;;;94806:57;94874:20;;;;:12;:20;;;;;;:29;;;94918:20;;;;;;:24;94914:73;;94967:20;;;;:12;:20;;;;;;;94944;;;;;:43;94914:73;94998:20;;;;:12;:20;;;;;;:27;;;;95043:20;;;-1:-1:-1;95043:20:0;;;94679:392::o;72485:110::-;72561:26;72571:2;72575:7;72561:26;;;;;;;;;;;;:9;:26::i;334:98::-;392:7;419:5;423:1;419;:5;:::i;76843:799::-;76998:4;-1:-1:-1;;;;;77019:13:0;;19665:19;:23;77015:620;;77055:72;;-1:-1:-1;;;77055:72:0;;-1:-1:-1;;;;;77055:36:0;;;;;:72;;13688:10;;77106:4;;77112:7;;77121:5;;77055:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77055:72:0;;;;;;;;-1:-1:-1;;77055:72:0;;;;;;;;;;;;:::i;:::-;;;77051:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77297:13:0;;77293:272;;77340:60;;-1:-1:-1;;;77340:60:0;;;;;;;:::i;77293:272::-;77515:6;77509:13;77500:6;77496:2;77492:15;77485:38;77051:529;-1:-1:-1;;;;;;77178:51:0;-1:-1:-1;;;77178:51:0;;-1:-1:-1;77171:58:0;;77015:620;-1:-1:-1;77619:4:0;76843:799;;;;;;:::o;83647:988::-;83913:22;83963:1;83938:22;83955:4;83938:16;:22::i;:::-;:26;;;;:::i;:::-;83975:18;83996:26;;;:17;:26;;;;;;83913:51;;-1:-1:-1;84129:28:0;;;84125:328;;-1:-1:-1;;;;;84196:18:0;;84174:19;84196:18;;;:12;:18;;;;;;;;:34;;;;;;;;;84247:30;;;;;;:44;;;84364:30;;:17;:30;;;;;:43;;;84125:328;-1:-1:-1;84549:26:0;;;;:17;:26;;;;;;;;84542:33;;;-1:-1:-1;;;;;84593:18:0;;;;;:12;:18;;;;;:34;;;;;;;84586:41;83647:988::o;84930:1079::-;85208:10;:17;85183:22;;85208:21;;85228:1;;85208:21;:::i;:::-;85240:18;85261:24;;;:15;:24;;;;;;85634:10;:26;;85183:46;;-1:-1:-1;85261:24:0;;85183:46;;85634:26;;;;;;:::i;:::-;;;;;;;;;85612:48;;85698:11;85673:10;85684;85673:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;85778:28;;;:15;:28;;;;;;;:41;;;85950:24;;;;;85943:31;85985:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;85001:1008;;;84930:1079;:::o;82434:221::-;82519:14;82536:20;82553:2;82536:16;:20::i;:::-;-1:-1:-1;;;;;82567:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;82612:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;82434:221:0:o;72822:321::-;72952:18;72958:2;72962:7;72952:5;:18::i;:::-;73003:54;73034:1;73038:2;73042:7;73051:5;73003:22;:54::i;:::-;72981:154;;;;-1:-1:-1;;;72981:154:0;;;;;;;:::i;73479:439::-;-1:-1:-1;;;;;73559:16:0;;73551:61;;;;-1:-1:-1;;;73551:61:0;;21904:2:1;73551:61:0;;;21886:21:1;;;21923:18;;;21916:30;21982:34;21962:18;;;21955:62;22034:18;;73551:61:0;21702:356:1;73551:61:0;71566:4;71590:16;;;:7;:16;;;;;;-1:-1:-1;;;;;71590:16:0;:30;73623:58;;;;-1:-1:-1;;;73623:58:0;;18087:2:1;73623:58:0;;;18069:21:1;18126:2;18106:18;;;18099:30;18165;18145:18;;;18138:58;18213:18;;73623:58:0;17885:352:1;73623:58:0;73694:45;73723:1;73727:2;73731:7;73694:20;:45::i;:::-;-1:-1:-1;;;;;73752:13:0;;;;;;:9;:13;;;;;:18;;73769:1;;73752:13;:18;;73769:1;;73752:18;:::i;:::-;;;;-1:-1:-1;;73781:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;73781:21:0;-1:-1:-1;;;;;73781:21:0;;;;;;;;73820:33;;73781:16;;;73820:33;;73781:16;;73820:33;91305:141:::1;91225:228:::0;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:367::-;488:8;498:6;552:3;545:4;537:6;533:17;529:27;519:55;;570:1;567;560:12;519:55;-1:-1:-1;593:20:1;;-1:-1:-1;;;;;625:30:1;;622:50;;;668:1;665;658:12;622:50;705:4;697:6;693:17;681:29;;765:3;758:4;748:6;745:1;741:14;733:6;729:27;725:38;722:47;719:67;;;782:1;779;772:12;719:67;425:367;;;;;:::o;797:221::-;840:5;893:3;886:4;878:6;874:17;870:27;860:55;;911:1;908;901:12;860:55;933:79;1008:3;999:6;986:20;979:4;971:6;967:17;933:79;:::i;1023:171::-;1090:20;;-1:-1:-1;;;;;1139:30:1;;1129:41;;1119:69;;1184:1;1181;1174:12;1199:156;1265:20;;1325:4;1314:16;;1304:27;;1294:55;;1345:1;1342;1335:12;1360:247;1419:6;1472:2;1460:9;1451:7;1447:23;1443:32;1440:52;;;1488:1;1485;1478:12;1440:52;1527:9;1514:23;1546:31;1571:5;1546:31;:::i;1872:388::-;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;-1:-1:-1;2182:2:1;2167:18;;2154:32;2195:33;2154:32;2195:33;:::i;:::-;2247:7;2237:17;;;1872:388;;;;;:::o;2265:456::-;2342:6;2350;2358;2411:2;2399:9;2390:7;2386:23;2382:32;2379:52;;;2427:1;2424;2417:12;2379:52;2466:9;2453:23;2485:31;2510:5;2485:31;:::i;:::-;2535:5;-1:-1:-1;2592:2:1;2577:18;;2564:32;2605:33;2564:32;2605:33;:::i;:::-;2265:456;;2657:7;;-1:-1:-1;;;2711:2:1;2696:18;;;;2683:32;;2265:456::o;2726:794::-;2821:6;2829;2837;2845;2898:3;2886:9;2877:7;2873:23;2869:33;2866:53;;;2915:1;2912;2905:12;2866:53;2954:9;2941:23;2973:31;2998:5;2973:31;:::i;:::-;3023:5;-1:-1:-1;3080:2:1;3065:18;;3052:32;3093:33;3052:32;3093:33;:::i;:::-;3145:7;-1:-1:-1;3199:2:1;3184:18;;3171:32;;-1:-1:-1;3254:2:1;3239:18;;3226:32;-1:-1:-1;;;;;3270:30:1;;3267:50;;;3313:1;3310;3303:12;3267:50;3336:22;;3389:4;3381:13;;3377:27;-1:-1:-1;3367:55:1;;3418:1;3415;3408:12;3367:55;3441:73;3506:7;3501:2;3488:16;3483:2;3479;3475:11;3441:73;:::i;:::-;3431:83;;;2726:794;;;;;;;:::o;3525:382::-;3590:6;3598;3651:2;3639:9;3630:7;3626:23;3622:32;3619:52;;;3667:1;3664;3657:12;3619:52;3706:9;3693:23;3725:31;3750:5;3725:31;:::i;:::-;3775:5;-1:-1:-1;3832:2:1;3817:18;;3804:32;3845:30;3804:32;3845:30;:::i;3912:315::-;3980:6;3988;4041:2;4029:9;4020:7;4016:23;4012:32;4009:52;;;4057:1;4054;4047:12;4009:52;4096:9;4083:23;4115:31;4140:5;4115:31;:::i;:::-;4165:5;4217:2;4202:18;;;;4189:32;;-1:-1:-1;;;3912:315:1:o;4232:437::-;4318:6;4326;4379:2;4367:9;4358:7;4354:23;4350:32;4347:52;;;4395:1;4392;4385:12;4347:52;4435:9;4422:23;-1:-1:-1;;;;;4460:6:1;4457:30;4454:50;;;4500:1;4497;4490:12;4454:50;4539:70;4601:7;4592:6;4581:9;4577:22;4539:70;:::i;:::-;4628:8;;4513:96;;-1:-1:-1;4232:437:1;-1:-1:-1;;;;4232:437:1:o;4674:1032::-;4758:6;4789:2;4832;4820:9;4811:7;4807:23;4803:32;4800:52;;;4848:1;4845;4838:12;4800:52;4888:9;4875:23;-1:-1:-1;;;;;4958:2:1;4950:6;4947:14;4944:34;;;4974:1;4971;4964:12;4944:34;5012:6;5001:9;4997:22;4987:32;;5057:7;5050:4;5046:2;5042:13;5038:27;5028:55;;5079:1;5076;5069:12;5028:55;5115:2;5102:16;5137:2;5133;5130:10;5127:36;;;5143:18;;:::i;:::-;5189:2;5186:1;5182:10;5172:20;;5212:28;5236:2;5232;5228:11;5212:28;:::i;:::-;5274:15;;;5305:12;;;;5337:11;;;5367;;;5363:20;;5360:33;-1:-1:-1;5357:53:1;;;5406:1;5403;5396:12;5357:53;5428:1;5419:10;;5438:238;5452:2;5449:1;5446:9;5438:238;;;5523:3;5510:17;5497:30;;5540:31;5565:5;5540:31;:::i;:::-;5584:18;;;5470:1;5463:9;;;;;5622:12;;;;5654;;5438:238;;;-1:-1:-1;5695:5:1;4674:1032;-1:-1:-1;;;;;;;;4674:1032:1:o;6153:245::-;6220:6;6273:2;6261:9;6252:7;6248:23;6244:32;6241:52;;;6289:1;6286;6279:12;6241:52;6321:9;6315:16;6340:28;6362:5;6340:28;:::i;6403:245::-;6461:6;6514:2;6502:9;6493:7;6489:23;6485:32;6482:52;;;6530:1;6527;6520:12;6482:52;6569:9;6556:23;6588:30;6612:5;6588:30;:::i;6653:249::-;6722:6;6775:2;6763:9;6754:7;6750:23;6746:32;6743:52;;;6791:1;6788;6781:12;6743:52;6823:9;6817:16;6842:30;6866:5;6842:30;:::i;7174:322::-;7243:6;7296:2;7284:9;7275:7;7271:23;7267:32;7264:52;;;7312:1;7309;7302:12;7264:52;7352:9;7339:23;-1:-1:-1;;;;;7377:6:1;7374:30;7371:50;;;7417:1;7414;7407:12;7371:50;7440;7482:7;7473:6;7462:9;7458:22;7440:50;:::i;7501:457::-;7579:6;7587;7640:2;7628:9;7619:7;7615:23;7611:32;7608:52;;;7656:1;7653;7646:12;7608:52;7696:9;7683:23;-1:-1:-1;;;;;7721:6:1;7718:30;7715:50;;;7761:1;7758;7751:12;7715:50;7784;7826:7;7817:6;7806:9;7802:22;7784:50;:::i;:::-;7774:60;;;7884:2;7873:9;7869:18;7856:32;7897:31;7922:5;7897:31;:::i;7963:451::-;8038:6;8046;8099:2;8087:9;8078:7;8074:23;8070:32;8067:52;;;8115:1;8112;8105:12;8067:52;8155:9;8142:23;-1:-1:-1;;;;;8180:6:1;8177:30;8174:50;;;8220:1;8217;8210:12;8174:50;8243;8285:7;8276:6;8265:9;8261:22;8243:50;:::i;:::-;8233:60;;;8343:2;8332:9;8328:18;8315:32;8356:28;8378:5;8356:28;:::i;8419:1079::-;8519:6;8527;8571:9;8562:7;8558:23;8601:3;8597:2;8593:12;8590:32;;;8618:1;8615;8608:12;8590:32;8658:9;8645:23;-1:-1:-1;;;;;8683:6:1;8680:30;8677:50;;;8723:1;8720;8713:12;8677:50;8746;8788:7;8779:6;8768:9;8764:22;8746:50;:::i;:::-;8736:60;-1:-1:-1;;8830:4:1;-1:-1:-1;;8812:16:1;;8808:27;8805:47;;;8848:1;8845;8838:12;8805:47;;8874:22;;:::i;:::-;8919:37;8952:2;8941:9;8937:18;8919:37;:::i;:::-;8912:5;8905:52;8989:37;9022:2;9011:9;9007:18;8989:37;:::i;:::-;8984:2;8977:5;8973:14;8966:61;9079:2;9068:9;9064:18;9051:32;9127:6;9118:7;9114:20;9105:7;9102:33;9092:61;;9149:1;9146;9139:12;9092:61;9180:2;9169:14;;9162:31;9225:37;9257:3;9242:19;;9225:37;:::i;:::-;9220:2;9213:5;9209:14;9202:61;9324:3;9313:9;9309:19;9296:33;9290:3;9283:5;9279:15;9272:58;9382:4;9371:9;9367:20;9354:34;9397:30;9419:7;9397:30;:::i;:::-;9454:3;9443:15;;9436:32;8419:1079;;9447:5;;-1:-1:-1;8419:1079:1;;-1:-1:-1;;8419:1079:1:o;9503:180::-;9562:6;9615:2;9603:9;9594:7;9590:23;9586:32;9583:52;;;9631:1;9628;9621:12;9583:52;-1:-1:-1;9654:23:1;;9503:180;-1:-1:-1;9503:180:1:o;9688:184::-;9758:6;9811:2;9799:9;9790:7;9786:23;9782:32;9779:52;;;9827:1;9824;9817:12;9779:52;-1:-1:-1;9850:16:1;;9688:184;-1:-1:-1;9688:184:1:o;9877:182::-;9934:6;9987:2;9975:9;9966:7;9962:23;9958:32;9955:52;;;10003:1;10000;9993:12;9955:52;10026:27;10043:9;10026:27;:::i;10064:435::-;10117:3;10155:5;10149:12;10182:6;10177:3;10170:19;10208:4;10237:2;10232:3;10228:12;10221:19;;10274:2;10267:5;10263:14;10295:1;10305:169;10319:6;10316:1;10313:13;10305:169;;;10380:13;;10368:26;;10414:12;;;;10449:15;;;;10341:1;10334:9;10305:169;;;-1:-1:-1;10490:3:1;;10064:435;-1:-1:-1;;;;;10064:435:1:o;10504:257::-;10545:3;10583:5;10577:12;10610:6;10605:3;10598:19;10626:63;10682:6;10675:4;10670:3;10666:14;10659:4;10652:5;10648:16;10626:63;:::i;:::-;10743:2;10722:15;-1:-1:-1;;10718:29:1;10709:39;;;;10750:4;10705:50;;10504:257;-1:-1:-1;;10504:257:1:o;11250:276::-;11381:3;11419:6;11413:13;11435:53;11481:6;11476:3;11469:4;11461:6;11457:17;11435:53;:::i;:::-;11504:16;;;;;11250:276;-1:-1:-1;;11250:276:1:o;11531:637::-;11811:3;11849:6;11843:13;11865:53;11911:6;11906:3;11899:4;11891:6;11887:17;11865:53;:::i;:::-;11981:13;;11940:16;;;;12003:57;11981:13;11940:16;12037:4;12025:17;;12003:57;:::i;:::-;-1:-1:-1;;;12082:20:1;;12111:22;;;12160:1;12149:13;;11531:637;-1:-1:-1;;;;11531:637:1:o;12173:256::-;-1:-1:-1;;;12375:21:1;;12421:1;12412:11;;12173:256::o;13263:488::-;-1:-1:-1;;;;;13532:15:1;;;13514:34;;13584:15;;13579:2;13564:18;;13557:43;13631:2;13616:18;;13609:34;;;13679:3;13674:2;13659:18;;13652:31;;;13457:4;;13700:45;;13725:19;;13717:6;13700:45;:::i;:::-;13692:53;13263:488;-1:-1:-1;;;;;;13263:488:1:o;14106:261::-;14285:2;14274:9;14267:21;14248:4;14305:56;14357:2;14346:9;14342:18;14334:6;14305:56;:::i;14372:358::-;14579:2;14568:9;14561:21;14542:4;14599:56;14651:2;14640:9;14636:18;14628:6;14599:56;:::i;:::-;14591:64;;14720:1;14716;14711:3;14707:11;14703:19;14695:6;14691:32;14686:2;14675:9;14671:18;14664:60;14372:358;;;;;:::o;14927:219::-;15076:2;15065:9;15058:21;15039:4;15096:44;15136:2;15125:9;15121:18;15113:6;15096:44;:::i;15151:738::-;15372:3;15361:9;15354:22;15335:4;15393:45;15433:3;15422:9;15418:19;15410:6;15393:45;:::i;:::-;15385:53;;-1:-1:-1;;;;;15530:2:1;15521:6;15515:13;15511:22;15506:2;15495:9;15491:18;15484:50;15598:2;15592;15584:6;15580:15;15574:22;15570:31;15565:2;15554:9;15550:18;15543:59;;15666:6;15660:2;15652:6;15648:15;15642:22;15638:35;15633:2;15622:9;15618:18;15611:63;15739:4;15733:2;15725:6;15721:15;15715:22;15711:33;15705:3;15694:9;15690:19;15683:62;15800:3;15792:6;15788:16;15782:23;15776:3;15765:9;15761:19;15754:52;15875:3;15867:6;15863:16;15857:23;15850:31;15843:39;15837:3;15826:9;15822:19;15815:68;15151:738;;;;;:::o;16653:414::-;16855:2;16837:21;;;16894:2;16874:18;;;16867:30;16933:34;16928:2;16913:18;;16906:62;-1:-1:-1;;;16999:2:1;16984:18;;16977:48;17057:3;17042:19;;16653:414::o;22821:356::-;23023:2;23005:21;;;23042:18;;;23035:30;23101:34;23096:2;23081:18;;23074:62;23168:2;23153:18;;22821:356::o;24688:413::-;24890:2;24872:21;;;24929:2;24909:18;;;24902:30;24968:34;24963:2;24948:18;;24941:62;-1:-1:-1;;;25034:2:1;25019:18;;25012:47;25091:3;25076:19;;24688:413::o;28579:253::-;28651:2;28645:9;28693:4;28681:17;;-1:-1:-1;;;;;28713:34:1;;28749:22;;;28710:62;28707:88;;;28775:18;;:::i;:::-;28811:2;28804:22;28579:253;:::o;28837:275::-;28908:2;28902:9;28973:2;28954:13;;-1:-1:-1;;28950:27:1;28938:40;;-1:-1:-1;;;;;28993:34:1;;29029:22;;;28990:62;28987:88;;;29055:18;;:::i;:::-;29091:2;29084:22;28837:275;;-1:-1:-1;28837:275:1:o;29117:224::-;29156:3;29184:6;29217:2;29214:1;29210:10;29247:2;29244:1;29240:10;29278:3;29274:2;29270:12;29265:3;29262:21;29259:47;;;29286:18;;:::i;:::-;29322:13;;29117:224;-1:-1:-1;;;;29117:224:1:o;29346:128::-;29386:3;29417:1;29413:6;29410:1;29407:13;29404:39;;;29423:18;;:::i;:::-;-1:-1:-1;29459:9:1;;29346:128::o;29479:120::-;29519:1;29545;29535:35;;29550:18;;:::i;:::-;-1:-1:-1;29584:9:1;;29479:120::o;29604:168::-;29644:7;29710:1;29706;29702:6;29698:14;29695:1;29692:21;29687:1;29680:9;29673:17;29669:45;29666:71;;;29717:18;;:::i;:::-;-1:-1:-1;29757:9:1;;29604:168::o;29777:125::-;29817:4;29845:1;29842;29839:8;29836:34;;;29850:18;;:::i;:::-;-1:-1:-1;29887:9:1;;29777:125::o;29907:258::-;29979:1;29989:113;30003:6;30000:1;29997:13;29989:113;;;30079:11;;;30073:18;30060:11;;;30053:39;30025:2;30018:10;29989:113;;;30120:6;30117:1;30114:13;30111:48;;;-1:-1:-1;;30155:1:1;30137:16;;30130:27;29907:258::o;30170:136::-;30209:3;30237:5;30227:39;;30246:18;;:::i;:::-;-1:-1:-1;;;30282:18:1;;30170:136::o;30311:380::-;30390:1;30386:12;;;;30433;;;30454:61;;30508:4;30500:6;30496:17;30486:27;;30454:61;30561:2;30553:6;30550:14;30530:18;30527:38;30524:161;;;30607:10;30602:3;30598:20;30595:1;30588:31;30642:4;30639:1;30632:15;30670:4;30667:1;30660:15;30524:161;;30311:380;;;:::o;30696:135::-;30735:3;-1:-1:-1;;30756:17:1;;30753:43;;;30776:18;;:::i;:::-;-1:-1:-1;30823:1:1;30812:13;;30696:135::o;30836:175::-;30873:3;30917:4;30910:5;30906:16;30946:4;30937:7;30934:17;30931:43;;;30954:18;;:::i;:::-;31003:1;30990:15;;30836:175;-1:-1:-1;;30836:175:1:o;31016:112::-;31048:1;31074;31064:35;;31079:18;;:::i;:::-;-1:-1:-1;31113:9:1;;31016:112::o;31133:127::-;31194:10;31189:3;31185:20;31182:1;31175:31;31225:4;31222:1;31215:15;31249:4;31246:1;31239:15;31265:127;31326:10;31321:3;31317:20;31314:1;31307:31;31357:4;31354:1;31347:15;31381:4;31378:1;31371:15;31397:127;31458:10;31453:3;31449:20;31446:1;31439:31;31489:4;31486:1;31479:15;31513:4;31510:1;31503:15;31529:127;31590:10;31585:3;31581:20;31578:1;31571:31;31621:4;31618:1;31611:15;31645:4;31642:1;31635:15;31661:127;31722:10;31717:3;31713:20;31710:1;31703:31;31753:4;31750:1;31743:15;31777:4;31774:1;31767:15;31793:131;-1:-1:-1;;;;;31868:31:1;;31858:42;;31848:70;;31914:1;31911;31904:12;31929:118;32015:5;32008:13;32001:21;31994:5;31991:32;31981:60;;32037:1;32034;32027:12;32052:131;-1:-1:-1;;;;;;32126:32:1;;32116:43;;32106:71;;32173:1;32170;32163:12
Swarm Source
ipfs://1464ef5ea1e512fc2964c4be04b842d7e31b50876950d68c99bdbf0c1d48c121
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
CRONOS | Cronos (CRO) | 100.00% | $0.077362 | 10 | $0.773619 |
[ 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.