Overview
ETH Balance
0.00179 ETH
Eth Value
$5.71 (@ $3,192.04/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 392 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Eth | 17165263 | 629 days ago | IN | 0 ETH | 0.00159148 | ||||
Claim | 17033072 | 647 days ago | IN | 0 ETH | 0.00359632 | ||||
Claim | 17015838 | 650 days ago | IN | 0 ETH | 0.00276107 | ||||
Buy Nft | 17014085 | 650 days ago | IN | 0.05 ETH | 0.00576997 | ||||
Buy Nft | 17014063 | 650 days ago | IN | 0.05 ETH | 0.00579198 | ||||
Buy Nft | 17014045 | 650 days ago | IN | 0.05 ETH | 0.01100206 | ||||
Buy Nft | 17012478 | 650 days ago | IN | 0.08 ETH | 0.0097487 | ||||
Buy Nft | 17012471 | 650 days ago | IN | 0.08 ETH | 0.00999112 | ||||
Buy Nft | 17012405 | 650 days ago | IN | 0.08 ETH | 0.00866448 | ||||
Buy Nft | 17012395 | 650 days ago | IN | 0.08 ETH | 0.00977162 | ||||
Buy Nft | 17012395 | 650 days ago | IN | 0.08 ETH | 0.00977164 | ||||
Buy Nft | 17012388 | 650 days ago | IN | 0.08 ETH | 0.00962722 | ||||
Buy Nft | 17012388 | 650 days ago | IN | 0.08 ETH | 0.0096272 | ||||
Buy Nft | 17012388 | 650 days ago | IN | 0.08 ETH | 0.00962722 | ||||
Buy Nft | 17012384 | 650 days ago | IN | 0.08 ETH | 0.00978835 | ||||
Buy Nft | 17012362 | 650 days ago | IN | 0.08 ETH | 0.01102291 | ||||
Buy Nft | 17012101 | 650 days ago | IN | 0.08 ETH | 0.01054154 | ||||
Buy Nft | 17012101 | 650 days ago | IN | 0.08 ETH | 0.0105418 | ||||
Buy Nft | 17012101 | 650 days ago | IN | 0.08 ETH | 0.01054182 | ||||
Buy Nft | 17012101 | 650 days ago | IN | 0.08 ETH | 0.01054182 | ||||
Buy Nft | 17012101 | 650 days ago | IN | 0.08 ETH | 0.01054184 | ||||
Buy Nft | 17012101 | 650 days ago | IN | 0.08 ETH | 0.01054184 | ||||
Buy Nft | 17012101 | 650 days ago | IN | 0.08 ETH | 0.01054182 | ||||
Buy Nft | 17012101 | 650 days ago | IN | 0.08 ETH | 0.0105416 | ||||
Buy Nft | 17012101 | 650 days ago | IN | 0.08 ETH | 0.01054184 |
Loading...
Loading
Contract Name:
SnakeNft
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-09 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // 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 (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.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/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/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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; /** * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // 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.8.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: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); 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) { _requireMinted(tokenId); 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 overridden 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 token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); 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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @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, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (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 See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; 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: snake/SnakeNft.sol pragma solidity ^0.8.0; contract SnakeNft is ERC721Enumerable, Ownable { using Counters for Counters.Counter; uint256 public maxSupply = 3333; Counters.Counter private _tokenIdCounter; uint256 constant PERCENT_BASE = 10000; struct Period { uint256 endTime; uint256 price; uint256 limit; uint256 free; bool useWhitelist; } mapping(uint256 => Period) public periodList; uint256 public periodCount; mapping(uint256 => bytes32) public wlTreeRoots; mapping(uint256 => mapping(address => uint256)) public quotaUsed; uint256 public sideIdMin = 1; uint256 public sideIdMax = 2; struct NftInfo { address buyer; uint256 amount; uint256 tokenId; uint256 sideId; uint256 roundNum; } mapping(address => uint256[]) public buyList; mapping(uint256 => NftInfo) public nftList; mapping(uint256 => uint256[]) public airdropList; uint256 public soldCount; uint256 public soldAmount; uint256 public totalRewards; uint256 public gameRoundCycle = 60 * 60; uint256 public gameRoundInc = 25; mapping(uint256 => uint256) public rewardPoolIncDef; mapping(uint256 => uint256[]) public rewardPoolAllocDef; uint256 public roundNum = 0; uint256[] public winRounds; mapping(uint256 => uint256) public roundList; mapping(uint256 => uint256) public rewardPools; mapping(uint256 => mapping(uint256 => uint256)) public sideCounts; mapping(uint256 => uint256) public winners; mapping(address => uint256) public claimedRewards; mapping(address => uint256) public claimedNfts; bool public claimNftEnabled; event BuyNft( address indexed buyer, uint256 indexed sideId, uint256 indexed tokenId, uint256 amount, uint256 period, uint256 round ); event Claim(address indexed buyer, uint256 amount); event ClaimNft(address indexed buyer, uint256 tokenId); event BatchMint( address indexed to, uint256 indexed sideId, uint256 indexed tokenId ); constructor() ERC721("OROCHIVERSE", "ORO") { periodList[0] = Period(9999999999, 0, 0, 0, false); roundList[0] = 9999999999; rewardPoolIncDef[1] = 1000; rewardPoolIncDef[2] = 1200; rewardPoolAllocDef[1] = [3800, 2700, 1500, 2000]; rewardPoolAllocDef[2] = [4500, 1500, 2000, 2000]; } function setPeriod( uint256 startTime_, uint256[] memory endTimes_, uint256[] memory prices_, uint256[] memory limits_, uint256[] memory frees_, bool[] memory useWhitelists_ ) external onlyOwner { require( endTimes_.length > 0 && endTimes_.length == prices_.length && endTimes_.length == limits_.length && endTimes_.length == frees_.length && endTimes_.length == useWhitelists_.length, "OROCHI: Invalid param length" ); periodCount = endTimes_.length; periodList[0].endTime = startTime_; for (uint256 i = 0; i < periodCount; i++) { periodList[i + 1] = Period( endTimes_[i], prices_[i], limits_[i], frees_[i], useWhitelists_[i] ); } periodList[periodCount + 1] = Period(9999999999, 0, 0, 0, false); roundList[0] = startTime_; } function setWlTreeRoot(uint256 periodNum_, bytes32 wlTreeRoot_) external onlyOwner { require( periodNum_ > 0 && periodNum_ <= periodCount, "OROCHI: Invalid period number" ); require(wlTreeRoot_ != 0, "OROCHI: Invalid tree root"); wlTreeRoots[periodNum_] = wlTreeRoot_; } function setGame( uint256 gameRoundCycle_, uint256 gameRoundInc_, uint256[] memory rewardPoolIncDef_, uint256[][] memory rewardPoolAllocDef_ ) external onlyOwner { require( gameRoundCycle_ > 0 && gameRoundInc_ > 0 && rewardPoolIncDef_.length == sideIdMax && rewardPoolAllocDef_.length == sideIdMax, "OROCHI: Zero time param or invalid param length" ); for (uint256 i = 0; i < sideIdMax; i++) { require( rewardPoolAllocDef_[i].length == sideIdMax + 2, "OROCHI: Invalid alloc def length" ); uint256 allocSum = 0; for (uint256 j = 0; j < rewardPoolAllocDef_[i].length; j++) { allocSum += rewardPoolAllocDef_[i][j]; } require( allocSum == PERCENT_BASE, "OROCHI: Invalid alloc def value" ); } gameRoundCycle = gameRoundCycle_; gameRoundInc = gameRoundInc_; for (uint256 i = 0; i < sideIdMax; i++) { rewardPoolIncDef[i + 1] = rewardPoolIncDef_[i]; rewardPoolAllocDef[i + 1] = rewardPoolAllocDef_[i]; } } function setNftClaim(bool enabled) external onlyOwner { claimNftEnabled = enabled; } function validWhitelist( uint256 periodNum_, address buyer_, bytes32[] calldata wlProof_ ) public view returns (bool) { require( periodNum_ > 0 && periodNum_ <= periodCount, "OROCHI: Invalid period" ); require( periodList[periodNum_].useWhitelist, "OROCHI: Whitelist not valid in this period" ); return MerkleProof.verify( wlProof_, wlTreeRoots[periodNum_], keccak256(abi.encodePacked(buyer_)) ); } function buyNft( uint256 sideId_, uint256 count_, bytes32[] calldata wlProof_ ) external payable { require( _tokenIdCounter.current() + count_ <= maxSupply, "OROCHI: Exceeds maximum supply" ); uint256 periodNum = 0; for (; periodNum <= periodCount; periodNum++) { if (block.timestamp < periodList[periodNum].endTime) { break; } } require(periodNum > 0, "OROCHI: Mint not start"); require(periodNum <= periodCount, "OROCHI: Mint has ended"); require( !periodList[periodNum].useWhitelist || validWhitelist(periodNum, msg.sender, wlProof_), "OROCHI: Not in whitelist" ); require( sideId_ >= sideIdMin && sideId_ <= sideIdMax, "OROCHI: Choose your side" ); require(count_ > 0, "OROCHI: Invalid count"); require( quotaUsed[periodNum][msg.sender] + count_ <= periodList[periodNum].limit, "OROCHI: Exceeded maximum purchase limit" ); uint256 freeToPay = quotaUsed[periodNum][msg.sender] < periodList[periodNum].free ? Math.min( periodList[periodNum].free - quotaUsed[periodNum][msg.sender], count_ ) : 0; uint256 needToPay = count_ - freeToPay; // uint256 needToPay = quotaUsed[periodNum][msg.sender] + count_ > // periodList[periodNum].free // ? quotaUsed[periodNum][msg.sender] + // count_ - // Math.max( // periodList[periodNum].free, // quotaUsed[periodNum][msg.sender] // ) // : 0; require( msg.value >= periodList[periodNum].price * needToPay, "OROCHI: Shortage of balance" ); uint256 lastRoundNum = roundNum; for (; block.timestamp >= roundList[roundNum]; roundNum++) { roundList[roundNum + 1] = roundList[roundNum] + gameRoundCycle; } if ( winRounds.length == 0 || winRounds[winRounds.length - 1] < roundNum ) { winRounds.push(roundNum); } quotaUsed[periodNum][msg.sender] += count_; require( quotaUsed[periodNum][msg.sender] <= periodList[periodNum].limit, "OROCHI: Exceeded maximum purchase limit" ); roundList[roundNum] += count_ * gameRoundInc; if (winners[roundNum] == 0 && lastRoundNum > 0) { for (uint256 s = sideIdMin; s <= sideIdMax; s++) { if (sideCounts[lastRoundNum][s] == 0) { rewardPools[roundNum] += (rewardPools[lastRoundNum] * rewardPoolAllocDef[ nftList[winners[lastRoundNum]].sideId ][s]) / PERCENT_BASE; } } } uint256 addedReward = (needToPay * periodList[periodNum].price * rewardPoolIncDef[sideId_]) / PERCENT_BASE; rewardPools[roundNum] += addedReward; totalRewards += addedReward; sideCounts[roundNum][sideId_] += count_; soldCount += count_; soldAmount += msg.value; for (uint256 i = 0; i < count_; i++) { _tokenIdCounter.increment(); uint256 tokenId = _tokenIdCounter.current(); require(tokenId <= maxSupply, "OROCHI: Exceeds maximum supply"); uint256 amount = i < freeToPay ? 0 : periodList[periodNum].price; nftList[tokenId] = NftInfo( msg.sender, amount, tokenId, sideId_, roundNum ); airdropList[amount > 0 ? 1 : 2].push(tokenId); buyList[msg.sender].push(tokenId); winners[roundNum] = tokenId; emit BuyNft( msg.sender, sideId_, tokenId, amount, periodNum, roundNum ); } } function myBought(address buyer_) public view returns (NftInfo[] memory myNfts) { myNfts = new NftInfo[](buyList[buyer_].length); for (uint256 i = 0; i < myNfts.length; i++) { myNfts[i] = nftList[buyList[buyer_][i]]; } } function myRewards(address buyer_) public view returns ( uint256 accReward, uint256 pastRoundReward, NftInfo memory pastRoundWinner ) { uint256 pastRoundNum = roundNum; uint256 curEndTime = roundList[roundNum]; while (block.timestamp >= curEndTime) { pastRoundNum++; curEndTime += gameRoundCycle; if (curEndTime >= periodList[periodCount].endTime) { break; } } if (pastRoundNum > 0) { pastRoundNum -= 1; } for (uint256 i = 0; i < buyList[buyer_].length; i++) { NftInfo memory nftInfo = nftList[buyList[buyer_][i]]; if (block.timestamp < roundList[nftInfo.roundNum]) { break; } NftInfo memory winnerInfo = nftList[winners[nftInfo.roundNum]]; uint256 reward = (rewardPools[nftInfo.roundNum] * rewardPoolAllocDef[winnerInfo.sideId][nftInfo.sideId]) / PERCENT_BASE / sideCounts[nftInfo.roundNum][nftInfo.sideId]; if (nftInfo.tokenId == winnerInfo.tokenId) { reward += (rewardPools[nftInfo.roundNum] * rewardPoolAllocDef[winnerInfo.sideId][0]) / PERCENT_BASE; } accReward += reward; if (nftInfo.roundNum == pastRoundNum) { pastRoundReward += reward; pastRoundWinner = winnerInfo; } } } function getMintPeriod() public view returns (uint256 curPeriodNum, Period memory curPeriodInfo) { for (curPeriodNum = 0; curPeriodNum <= periodCount; curPeriodNum++) { if (block.timestamp < periodList[curPeriodNum].endTime) { break; } } curPeriodInfo = periodList[curPeriodNum]; } function getGameRound() public view returns ( uint256 curRoundNum, uint256 curEndTime, uint256 curRewardPool, uint256[] memory curSideCounts ) { curRoundNum = roundNum; curEndTime = roundList[curRoundNum]; while (block.timestamp >= curEndTime) { curRoundNum++; curEndTime += gameRoundCycle; if (curEndTime >= periodList[periodCount].endTime) { break; } } curRewardPool = rewardPools[curRoundNum]; if (winners[curRoundNum] == 0 && roundNum > 0) { for (uint256 s = sideIdMin; s <= sideIdMax; s++) { if (sideCounts[roundNum][s] == 0) { curRewardPool += (rewardPools[roundNum] * rewardPoolAllocDef[ nftList[winners[roundNum]].sideId ][s]) / PERCENT_BASE; } } } curSideCounts = new uint256[](sideIdMax); for (uint256 i = 0; i < sideIdMax; i++) { curSideCounts[i] = sideCounts[curRoundNum][i + 1]; } } function getAllWinners() public view returns (NftInfo[] memory winnerInfos, uint256[] memory winnerRewards) { uint256 winRoundCount = winRounds.length; if ( winRoundCount > 0 && block.timestamp < roundList[winRounds[winRoundCount - 1]] ) { winRoundCount -= 1; } if (winRoundCount > 0) { winnerInfos = new NftInfo[](winRoundCount); winnerRewards = new uint256[](winRoundCount); for (uint256 i = 0; i < winRoundCount; i++) { winnerInfos[i] = nftList[winners[winRounds[i]]]; for ( uint256 j = 0; j < buyList[winnerInfos[i].buyer].length; j++ ) { NftInfo memory nftInfo = nftList[ buyList[winnerInfos[i].buyer][j] ]; if (nftInfo.roundNum == winnerInfos[i].roundNum) { winnerRewards[i] += (rewardPools[nftInfo.roundNum] * rewardPoolAllocDef[winnerInfos[i].sideId][ nftInfo.sideId ]) / PERCENT_BASE / sideCounts[nftInfo.roundNum][nftInfo.sideId]; if (nftInfo.tokenId == winnerInfos[i].tokenId) { winnerRewards[i] += (rewardPools[nftInfo.roundNum] * rewardPoolAllocDef[winnerInfos[i].sideId][ 0 ]) / PERCENT_BASE; } } } } } } function getTreasury() public view returns (uint256 treasury) { for (uint256 i = 1; i <= roundNum; i++) { if (block.timestamp >= roundList[i] && winners[i] != 0) { uint256[] memory rewardPoolAlloc = rewardPoolAllocDef[ nftList[winners[i]].sideId ]; treasury += (rewardPools[i] * rewardPoolAlloc[rewardPoolAlloc.length - 1]) / PERCENT_BASE; } } } function claim() external { (uint256 accReward, , ) = myRewards(msg.sender); uint256 restRewards = accReward - claimedRewards[msg.sender]; require(restRewards > 0, "OROCHI: Rewards balance is empty"); claimedRewards[msg.sender] += restRewards; Address.sendValue(payable(msg.sender), restRewards); emit Claim(msg.sender, restRewards); } function claimNft() external returns (uint256 mintCount) { require(claimNftEnabled, "OROCHI: NFT claim not start"); require( claimedNfts[msg.sender] < buyList[msg.sender].length, "OROCHI: Claim failed" ); for (uint256 i = 0; i < buyList[msg.sender].length; i++) { uint256 tokenId = buyList[msg.sender][i]; if (!_exists(tokenId)) { _mint(msg.sender, tokenId); emit ClaimNft(msg.sender, tokenId); mintCount++; } } claimedNfts[msg.sender] += mintCount; } function airdrop( uint256 batchNum_, uint256 startIndex_, uint256 length_ ) external onlyOwner returns (uint256 mintCount) { for ( uint256 i = startIndex_; i < startIndex_ + length_ && i < airdropList[batchNum_].length; i++ ) { uint256 tokenId = airdropList[batchNum_][i]; if (!_exists(tokenId)) { _mint(nftList[tokenId].buyer, tokenId); mintCount++; } } } function withdrawEth(address to_, uint256 amount_) external onlyOwner { Address.sendValue(payable(to_), amount_); } function batchMint(address[] memory tos_, uint256 sideId_) public onlyOwner { require( _tokenIdCounter.current() + tos_.length <= maxSupply, "OROCHI: Exceeds maximum supply" ); require(tos_.length > 0, "OROCHI: Invalid param length"); require( sideId_ >= sideIdMin && sideId_ <= sideIdMax, "OROCHI: Invalid side" ); for (uint256 i = 0; i < tos_.length; i++) { _tokenIdCounter.increment(); uint256 tokenId = _tokenIdCounter.current(); require(tokenId <= maxSupply, "OROCHI: Exceeds maximum supply"); nftList[tokenId] = NftInfo(tos_[i], 0, tokenId, sideId_, 999999); _mint(tos_[i], tokenId); emit BatchMint(tos_[i], sideId_, tokenId); } } function batchMint(uint256 count_, uint256 sideId_) external onlyOwner { require(count_ > 0, "OROCHI: Invalid count"); require( sideId_ >= sideIdMin && sideId_ <= sideIdMax, "OROCHI: Invalid side" ); address[] memory tos = new address[](count_); for (uint256 i = 0; i < count_; i++) { tos[i] = msg.sender; } batchMint(tos, sideId_); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"sideId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"BatchMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"sideId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"round","type":"uint256"}],"name":"BuyNft","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ClaimNft","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":[{"internalType":"uint256","name":"batchNum_","type":"uint256"},{"internalType":"uint256","name":"startIndex_","type":"uint256"},{"internalType":"uint256","name":"length_","type":"uint256"}],"name":"airdrop","outputs":[{"internalType":"uint256","name":"mintCount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"airdropList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count_","type":"uint256"},{"internalType":"uint256","name":"sideId_","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos_","type":"address[]"},{"internalType":"uint256","name":"sideId_","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"buyList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"sideId_","type":"uint256"},{"internalType":"uint256","name":"count_","type":"uint256"},{"internalType":"bytes32[]","name":"wlProof_","type":"bytes32[]"}],"name":"buyNft","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimNft","outputs":[{"internalType":"uint256","name":"mintCount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimNftEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedNfts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameRoundCycle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameRoundInc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllWinners","outputs":[{"components":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"sideId","type":"uint256"},{"internalType":"uint256","name":"roundNum","type":"uint256"}],"internalType":"struct SnakeNft.NftInfo[]","name":"winnerInfos","type":"tuple[]"},{"internalType":"uint256[]","name":"winnerRewards","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGameRound","outputs":[{"internalType":"uint256","name":"curRoundNum","type":"uint256"},{"internalType":"uint256","name":"curEndTime","type":"uint256"},{"internalType":"uint256","name":"curRewardPool","type":"uint256"},{"internalType":"uint256[]","name":"curSideCounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPeriod","outputs":[{"internalType":"uint256","name":"curPeriodNum","type":"uint256"},{"components":[{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"free","type":"uint256"},{"internalType":"bool","name":"useWhitelist","type":"bool"}],"internalType":"struct SnakeNft.Period","name":"curPeriodInfo","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTreasury","outputs":[{"internalType":"uint256","name":"treasury","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":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"buyer_","type":"address"}],"name":"myBought","outputs":[{"components":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"sideId","type":"uint256"},{"internalType":"uint256","name":"roundNum","type":"uint256"}],"internalType":"struct SnakeNft.NftInfo[]","name":"myNfts","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"buyer_","type":"address"}],"name":"myRewards","outputs":[{"internalType":"uint256","name":"accReward","type":"uint256"},{"internalType":"uint256","name":"pastRoundReward","type":"uint256"},{"components":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"sideId","type":"uint256"},{"internalType":"uint256","name":"roundNum","type":"uint256"}],"internalType":"struct SnakeNft.NftInfo","name":"pastRoundWinner","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftList","outputs":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"sideId","type":"uint256"},{"internalType":"uint256","name":"roundNum","type":"uint256"}],"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":[],"name":"periodCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"periodList","outputs":[{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"free","type":"uint256"},{"internalType":"bool","name":"useWhitelist","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"quotaUsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPoolAllocDef","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPoolIncDef","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"roundList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"roundNum","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameRoundCycle_","type":"uint256"},{"internalType":"uint256","name":"gameRoundInc_","type":"uint256"},{"internalType":"uint256[]","name":"rewardPoolIncDef_","type":"uint256[]"},{"internalType":"uint256[][]","name":"rewardPoolAllocDef_","type":"uint256[][]"}],"name":"setGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setNftClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime_","type":"uint256"},{"internalType":"uint256[]","name":"endTimes_","type":"uint256[]"},{"internalType":"uint256[]","name":"prices_","type":"uint256[]"},{"internalType":"uint256[]","name":"limits_","type":"uint256[]"},{"internalType":"uint256[]","name":"frees_","type":"uint256[]"},{"internalType":"bool[]","name":"useWhitelists_","type":"bool[]"}],"name":"setPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"periodNum_","type":"uint256"},{"internalType":"bytes32","name":"wlTreeRoot_","type":"bytes32"}],"name":"setWlTreeRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"sideCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sideIdMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sideIdMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"soldAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"soldCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","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":"totalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"periodNum_","type":"uint256"},{"internalType":"address","name":"buyer_","type":"address"},{"internalType":"bytes32[]","name":"wlProof_","type":"bytes32[]"}],"name":"validWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"winRounds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"winners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wlTreeRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052610d05600b5560016011556002601255610e106019556019601a556000601d553480156200003157600080fd5b506040518060400160405280600b81526020016a4f524f434849564552534560a81b815250604051806040016040528060038152602001624f524f60e81b81525081600090816200008391906200044f565b5060016200009282826200044f565b505050620000af620000a9620002e760201b60201c565b620002eb565b6040805160a0810182526402540be3ff8082526000602080840182815284860183815260608087018581526080808901878152878052600d875298517f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee5593517f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ef5591517f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29f05590517f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29f15594517f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29f2805460ff19169115159190911790557f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d4855939093556103e87f9fafca4c9c0d5c2cbf85f49fd8ab8212430ce78c2a0cb75b51e0f9c4f9ace003556104b07f1dd2f4b94a51cfb409e6e317a497f7cfd9013960a1c723f830c49c05a25f08a55584519283018552610ed88352610a8c838201526105dc948301949094526107d0928201929092526001909152601c9091526200027a907f6de76108811faf2f94afbe5ac6c98e8393206cd093932de1fbfd61bbeec43a029060046200033d565b506040805160808101825261119481526105dc6020808301919091526107d092820183905260608201929092526002600052601c909152620002e0907ff5b6e61a0c14f171ef1c86f003900ef0305e4159fff3317e4fb7c351f2050c879060046200033d565b506200051b565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562000381579160200282015b8281111562000381578251829061ffff169055916020019190600101906200035e565b506200038f92915062000393565b5090565b5b808211156200038f576000815560010162000394565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003d557607f821691505b602082108103620003f657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200044a57600081815260208120601f850160051c81016020861015620004255750805b601f850160051c820191505b81811015620004465782815560010162000431565b5050505b505050565b81516001600160401b038111156200046b576200046b620003aa565b62000483816200047c8454620003c0565b84620003fc565b602080601f831160018114620004bb5760008415620004a25750858301515b600019600386901b1c1916600185901b17855562000446565b600085815260208120601f198616915b82811015620004ec57888601518255948401946001909101908401620004cb565b50858210156200050b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61517e806200052b6000396000f3fe6080604052600436106103b85760003560e01c806370a08231116101f2578063b88d4fde1161010d578063d3ebe351116100a0578063e985e9c51161006f578063e985e9c514610c4d578063f2fde38b14610c96578063fa1a5f5914610cb6578063fca56d4014610ccc57600080fd5b8063d3ebe35114610bba578063d5abeb0114610be7578063d894454d14610bfd578063dc6b862714610c2a57600080fd5b8063cc4d9af5116100dc578063cc4d9af514610ae4578063cf764cd014610b09578063d1f78e9814610b29578063d29d02a414610ba057600080fd5b8063b88d4fde14610a4a578063bd83434514610a6a578063c4ef158f14610a97578063c87b56dd14610ac457600080fd5b806394b76cde11610185578063a22cb46511610154578063a22cb465146109a5578063a2fb1175146109c5578063aa2ae515146109f2578063ae6787a914610a1257600080fd5b806394b76cde1461090357806395d89b411461095a578063997d8cd91461096f5780639e21b8461461098557600080fd5b806383b74baa116101c157806383b74baa1461088f5780638c195122146108af5780638da5cb5b146108cf578063905830cf146108ed57600080fd5b806370a08231146107be578063715018a6146107de57806375bea166146107f35780637f1975191461087957600080fd5b80632f745c59116102e257806346abf3911161027557806358e3a5a01161024457806358e3a5a0146107535780635ae2afa4146107695780636352211e1461077e5780636cb8f9a01461079e57600080fd5b806346abf391146106d2578063488a470a146106fe5780634e71d92d1461071e5780634f6ccce71461073357600080fd5b80633e2d38d6116102b15780633e2d38d61461064f57806342842e0e1461066557806345a8cceb1461068557806345ead43c146106b257600080fd5b80632f745c59146105cc578063309835cd146105ec57806339f9c82c146106245780633b19e84a1461063a57600080fd5b806318160ddd1161035a57806323b872dd1161032957806323b872dd1461055957806326bad85f14610579578063299a7a2f146105995780632da82e16146105b957600080fd5b806318160ddd146104c85780631b9a91a4146104dd57806320b9588c146104fd57806323b7cc991461052c57600080fd5b8063095ea7b311610396578063095ea7b31461044c5780630e15561a1461046e5780630ed64eff14610492578063119b22b3146104b257600080fd5b806301ffc9a7146103bd57806306fdde03146103f2578063081812fc14610414575b600080fd5b3480156103c957600080fd5b506103dd6103d83660046145b7565b610cec565b60405190151581526020015b60405180910390f35b3480156103fe57600080fd5b50610407610d17565b6040516103e99190614624565b34801561042057600080fd5b5061043461042f366004614637565b610da9565b6040516001600160a01b0390911681526020016103e9565b34801561045857600080fd5b5061046c61046736600461466c565b610dd0565b005b34801561047a57600080fd5b5061048460185481565b6040519081526020016103e9565b34801561049e57600080fd5b5061046c6104ad366004614696565b610eea565b3480156104be57600080fd5b50610484601d5481565b3480156104d457600080fd5b50600854610484565b3480156104e957600080fd5b5061046c6104f836600461466c565b61102a565b34801561050957600080fd5b5061051d6105183660046146b8565b611040565b6040516103e9939291906146d3565b34801561053857600080fd5b5061054c6105473660046146b8565b61131d565b6040516103e99190614795565b34801561056557600080fd5b5061046c6105743660046147a8565b61145d565b34801561058557600080fd5b5061046c6105943660046148b8565b61148e565b3480156105a557600080fd5b506104846105b4366004614696565b611741565b61046c6105c73660046149eb565b611772565b3480156105d857600080fd5b506104846105e736600461466c565b61201f565b3480156105f857600080fd5b50610484610607366004614696565b602160209081526000928352604080842090915290825290205481565b34801561063057600080fd5b5061048460165481565b34801561064657600080fd5b506104846120b5565b34801561065b57600080fd5b5061048460125481565b34801561067157600080fd5b5061046c6106803660046147a8565b6121dd565b34801561069157600080fd5b506104846106a0366004614637565b601f6020526000908152604090205481565b3480156106be57600080fd5b5061046c6106cd366004614a4d565b6121f8565b3480156106de57600080fd5b506104846106ed366004614637565b602080526000908152604090205481565b34801561070a57600080fd5b5061046c610719366004614aca565b612213565b34801561072a57600080fd5b5061046c6124bb565b34801561073f57600080fd5b5061048461074e366004614637565b6125a0565b34801561075f57600080fd5b5061048460115481565b34801561077557600080fd5b50610484612633565b34801561078a57600080fd5b50610434610799366004614637565b6127df565b3480156107aa57600080fd5b506104846107b9366004614696565b61283f565b3480156107ca57600080fd5b506104846107d93660046146b8565b61285b565b3480156107ea57600080fd5b5061046c6128e1565b3480156107ff57600080fd5b5061084761080e366004614637565b601460205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016103e9565b34801561088557600080fd5b50610484600e5481565b34801561089b57600080fd5b5061046c6108aa366004614ba3565b6128f5565b3480156108bb57600080fd5b506104846108ca366004614c40565b612b45565b3480156108db57600080fd5b50600a546001600160a01b0316610434565b3480156108f957600080fd5b5061048460195481565b34801561090f57600080fd5b50610918612c18565b604080519283528151602080850191909152820151838201528101516060808401919091528101516080808401919091520151151560a082015260c0016103e9565b34801561096657600080fd5b50610407612cd8565b34801561097b57600080fd5b50610484601a5481565b34801561099157600080fd5b5061046c6109a0366004614696565b612ce7565b3480156109b157600080fd5b5061046c6109c0366004614c6c565b612db0565b3480156109d157600080fd5b506104846109e0366004614637565b60226020526000908152604090205481565b3480156109fe57600080fd5b50610484610a0d366004614637565b612dbb565b348015610a1e57600080fd5b50610484610a2d366004614c9f565b601060209081526000928352604080842090915290825290205481565b348015610a5657600080fd5b5061046c610a65366004614cc2565b612ddc565b348015610a7657600080fd5b50610484610a853660046146b8565b60236020526000908152604090205481565b348015610aa357600080fd5b50610484610ab2366004614637565b601b6020526000908152604090205481565b348015610ad057600080fd5b50610407610adf366004614637565b612e14565b348015610af057600080fd5b50610af9612e88565b6040516103e99493929190614db1565b348015610b1557600080fd5b506103dd610b24366004614de0565b613086565b348015610b3557600080fd5b50610b76610b44366004614637565b600d60205260009081526040902080546001820154600283015460038401546004909401549293919290919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a0016103e9565b348015610bac57600080fd5b506025546103dd9060ff1681565b348015610bc657600080fd5b50610484610bd5366004614637565b600f6020526000908152604090205481565b348015610bf357600080fd5b50610484600b5481565b348015610c0957600080fd5b50610484610c183660046146b8565b60246020526000908152604090205481565b348015610c3657600080fd5b50610c3f6131e6565b6040516103e9929190614e21565b348015610c5957600080fd5b506103dd610c68366004614e4f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610ca257600080fd5b5061046c610cb13660046146b8565b6136b9565b348015610cc257600080fd5b5061048460175481565b348015610cd857600080fd5b50610484610ce736600461466c565b613732565b60006001600160e01b0319821663780e9d6360e01b1480610d115750610d118261374e565b92915050565b606060008054610d2690614e79565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5290614e79565b8015610d9f5780601f10610d7457610100808354040283529160200191610d9f565b820191906000526020600020905b815481529060010190602001808311610d8257829003601f168201915b5050505050905090565b6000610db48261379e565b506000908152600460205260409020546001600160a01b031690565b6000610ddb826127df565b9050806001600160a01b0316836001600160a01b031603610e4d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610e695750610e698133610c68565b610edb5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610e44565b610ee583836137fd565b505050565b610ef261386b565b60008211610f3a5760405162461bcd60e51b815260206004820152601560248201527413d493d0d2124e88125b9d985b1a590818dbdd5b9d605a1b6044820152606401610e44565b6011548110158015610f4e57506012548111155b610f915760405162461bcd60e51b81526020600482015260146024820152734f524f4348493a20496e76616c6964207369646560601b6044820152606401610e44565b6000826001600160401b03811115610fab57610fab6147e4565b604051908082528060200260200182016040528015610fd4578160200160208202803683370190505b50905060005b8381101561101f5733828281518110610ff557610ff5614ead565b6001600160a01b03909216602092830291909101909101528061101781614ed9565b915050610fda565b50610ee581836128f5565b61103261386b565b61103c82826138c5565b5050565b60008061104b614512565b601d546000818152601f60205260409020545b80421061109c578161106f81614ed9565b925050601954816110809190614ef2565b600e546000908152600d6020526040902054909150811061105e575b81156110b0576110ad600183614f05565b91505b60005b6001600160a01b038716600090815260136020526040902054811015611313576001600160a01b0387166000908152601360205260408120805460149183918590811061110257611102614ead565b600091825260208083209091015483528281019390935260409182018120825160a08101845281546001600160a01b0316815260018201548186015260028201548185015260038201546060820152600490910154608082018190528252601f90935220549091504210156111775750611313565b60808082018051600090815260226020908152604080832054835260148252808320815160a08101835281546001600160a01b0316815260018201548185015260028201548184015260038201546060808301918252600490930154978201979097529451845260218352818420908701805185529083528184205495518452601c90925282209051815493949293612710929190811061121a5761121a614ead565b90600052602060002001546020600087608001518152602001908152602001600020546112479190614f18565b6112519190614f2f565b61125b9190614f2f565b905081604001518360400151036112d65760608201516000908152601c602052604081208054612710929061129257611292614ead565b90600052602060002001546020600086608001518152602001908152602001600020546112bf9190614f18565b6112c99190614f2f565b6112d39082614ef2565b90505b6112e0818a614ef2565b9850858360800151036112fd576112f78189614ef2565b97508196505b505050808061130b90614ed9565b9150506110b3565b5050509193909250565b6001600160a01b0381166000908152601360205260409020546060906001600160401b03811115611350576113506147e4565b60405190808252806020026020018201604052801561138957816020015b611376614512565b81526020019060019003908161136e5790505b50905060005b8151811015611457576001600160a01b038316600090815260136020526040812080546014929190849081106113c7576113c7614ead565b600091825260208083209091015483528281019390935260409182019020815160a08101835281546001600160a01b0316815260018201549381019390935260028101549183019190915260038101546060830152600401546080820152825183908390811061143957611439614ead565b6020026020010181905250808061144f90614ed9565b91505061138f565b50919050565b61146733826139de565b6114835760405162461bcd60e51b8152600401610e4490614f51565b610ee5838383613a5c565b61149661386b565b6000841180156114a65750600083115b80156114b457506012548251145b80156114c257506012548151145b6115265760405162461bcd60e51b815260206004820152602f60248201527f4f524f4348493a205a65726f2074696d6520706172616d206f7220696e76616c60448201526e0d2c840e0c2e4c2da40d8cadccee8d608b1b6064820152608401610e44565b60005b60125481101561168657601254611541906002614ef2565b82828151811061155357611553614ead565b602002602001015151146115a95760405162461bcd60e51b815260206004820181905260248201527f4f524f4348493a20496e76616c696420616c6c6f6320646566206c656e6774686044820152606401610e44565b6000805b8383815181106115bf576115bf614ead565b602002602001015151811015611621578383815181106115e1576115e1614ead565b602002602001015181815181106115fa576115fa614ead565b60200260200101518261160d9190614ef2565b91508061161981614ed9565b9150506115ad565b5061271081146116735760405162461bcd60e51b815260206004820152601f60248201527f4f524f4348493a20496e76616c696420616c6c6f63206465662076616c7565006044820152606401610e44565b508061167e81614ed9565b915050611529565b506019849055601a83905560005b60125481101561173a578281815181106116b0576116b0614ead565b6020026020010151601b60008360016116c99190614ef2565b8152602001908152602001600020819055508181815181106116ed576116ed614ead565b6020026020010151601c60008360016117069190614ef2565b8152602001908152602001600020908051906020019061172792919061454a565b508061173281614ed9565b915050611694565b5050505050565b601c602052816000526040600020818154811061175d57600080fd5b90600052602060002001600091509150505481565b600b548361177f600c5490565b6117899190614ef2565b11156117a75760405162461bcd60e51b8152600401610e4490614f9e565b60005b600e5481116117da576000818152600d602052604090205442106117da57806117d281614ed9565b9150506117aa565b600081116118235760405162461bcd60e51b815260206004820152601660248201527513d493d0d2124e88135a5b9d081b9bdd081cdd185c9d60521b6044820152606401610e44565b600e5481111561186e5760405162461bcd60e51b815260206004820152601660248201527513d493d0d2124e88135a5b9d081a185cc8195b99195960521b6044820152606401610e44565b6000818152600d602052604090206004015460ff161580611896575061189681338585613086565b6118e25760405162461bcd60e51b815260206004820152601860248201527f4f524f4348493a204e6f7420696e2077686974656c69737400000000000000006044820152606401610e44565b60115485101580156118f657506012548511155b6119425760405162461bcd60e51b815260206004820152601860248201527f4f524f4348493a2043686f6f736520796f7572207369646500000000000000006044820152606401610e44565b6000841161198a5760405162461bcd60e51b815260206004820152601560248201527413d493d0d2124e88125b9d985b1a590818dbdd5b9d605a1b6044820152606401610e44565b6000818152600d602090815260408083206002015460108352818420338552909252909120546119bb908690614ef2565b11156119d95760405162461bcd60e51b8152600401610e4490614fd5565b6000818152600d60209081526040808320600301546010835281842033855290925282205410611a0a576000611a46565b6000828152601060209081526040808320338452825280832054858452600d90925290912060030154611a4691611a4091614f05565b86613bcd565b90506000611a548287614f05565b6000848152600d6020526040902060010154909150611a74908290614f18565b341015611ac35760405162461bcd60e51b815260206004820152601b60248201527f4f524f4348493a2053686f7274616765206f662062616c616e636500000000006044820152606401610e44565b601d545b601d546000908152601f60205260409020544210611b4057601954601d546000908152601f6020526040902054611afe9190614ef2565b601f6000601d546001611b119190614ef2565b815260200190815260200160002081905550601d6000815480929190611b3690614ed9565b9190505550611ac7565b601e541580611b7a5750601d54601e8054611b5d90600190614f05565b81548110611b6d57611b6d614ead565b9060005260206000200154105b15611bb657601d54601e80546001810182556000919091527f50bb669a95c7b50b7e8a6f09454034b2b14cf2b85c730dca9a539ca82cb6e35001555b600084815260106020908152604080832033845290915281208054899290611bdf908490614ef2565b90915550506000848152600d602090815260408083206002015460108352818420338552909252909120541115611c285760405162461bcd60e51b8152600401610e4490614fd5565b601a54611c359088614f18565b601d546000908152601f602052604081208054909190611c56908490614ef2565b9091555050601d54600090815260226020526040902054158015611c7a5750600081115b15611d58576011545b6012548111611d565760008281526021602090815260408083208484529091528120549003611d4457600082815260226020908152604080832054835260148252808320600301548352601c90915290208054612710919083908110611ceb57611ceb614ead565b90600052602060002001546020600085815260200190815260200160002054611d149190614f18565b611d1e9190614f2f565b601d54600090815260208052604081208054909190611d3e908490614ef2565b90915550505b80611d4e81614ed9565b915050611c83565b505b6000888152601b6020908152604080832054878452600d9092528220600101546127109190611d879086614f18565b611d919190614f18565b611d9b9190614f2f565b90508060206000601d5481526020019081526020016000206000828254611dc29190614ef2565b925050819055508060186000828254611ddb9190614ef2565b9091555050601d5460009081526021602090815260408083208c8452909152812080548a9290611e0c908490614ef2565b925050819055508760166000828254611e259190614ef2565b925050819055503460176000828254611e3e9190614ef2565b90915550600090505b8881101561201357611e5d600c80546001019055565b6000611e68600c5490565b9050600b54811115611e8c5760405162461bcd60e51b8152600401610e4490614f9e565b6000868310611eac576000888152600d6020526040902060010154611eaf565b60005b90506040518060a00160405280336001600160a01b031681526020018281526020018381526020018d8152602001601d548152506014600084815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505060156000808311611f60576002611f63565b60015b60ff16815260208082019290925260409081016000908120805460018082018355918352848320018690553380835260138552838320805492830181558352848320909101869055601d805483526022855291839020869055905482518581529384018c905283830152905184928f92917f9c6a55258067ffcb8f3785a4b16d5894aab51deeb9e6935393d2410fdc5a0cbd9181900360600190a45050808061200b90614ed9565b915050611e47565b50505050505050505050565b600061202a8361285b565b821061208c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610e44565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600060015b601d5481116121d9576000818152601f602052604090205442108015906120ee575060008181526022602052604090205415155b156121c757600081815260226020908152604080832054835260148252808320600301548352601c82528083208054825181850281018501909352808352919290919083018282801561216057602002820191906000526020600020905b81548152602001906001019080831161214c575b5050505050905061271081600183516121799190614f05565b8151811061218957612189614ead565b602002602001015160206000858152602001908152602001600020546121af9190614f18565b6121b99190614f2f565b6121c39084614ef2565b9250505b806121d181614ed9565b9150506120ba565b5090565b610ee583838360405180602001604052806000815250612ddc565b61220061386b565b6025805460ff1916911515919091179055565b61221b61386b565b6000855111801561222d575083518551145b801561223a575082518551145b8015612247575081518551145b8015612254575080518551145b6122a05760405162461bcd60e51b815260206004820152601c60248201527f4f524f4348493a20496e76616c696420706172616d206c656e677468000000006044820152606401610e44565b8451600e556000808052600d6020527f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee8790555b600e548110156123f3576040518060a001604052808783815181106122fb576122fb614ead565b6020026020010151815260200186838151811061231a5761231a614ead565b6020026020010151815260200185838151811061233957612339614ead565b6020026020010151815260200184838151811061235857612358614ead565b6020026020010151815260200183838151811061237757612377614ead565b60200260200101511515815250600d60008360016123959190614ef2565b81526020808201929092526040908101600020835181559183015160018301558201516002820155606082015160038201556080909101516004909101805460ff1916911515919091179055806123eb81614ed9565b9150506122d4565b506040518060a001604052806402540be3ff815260200160008152602001600081526020016000815260200160001515815250600d6000600e5460016124399190614ef2565b81526020808201929092526040908101600090812084518155848401516001820155918401516002830155606084015160038301556080909301516004909101805460ff1916911515919091179055908052601f90525050507f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d4855929092555050565b60006124c633611040565b505033600090815260236020526040812054919250906124e69083614f05565b9050600081116125385760405162461bcd60e51b815260206004820181905260248201527f4f524f4348493a20526577617264732062616c616e636520697320656d7074796044820152606401610e44565b3360009081526023602052604081208054839290612557908490614ef2565b90915550612567905033826138c5565b60405181815233907f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d49060200160405180910390a25050565b60006125ab60085490565b821061260e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610e44565b6008828154811061262157612621614ead565b90600052602060002001549050919050565b60255460009060ff166126885760405162461bcd60e51b815260206004820152601b60248201527f4f524f4348493a204e465420636c61696d206e6f7420737461727400000000006044820152606401610e44565b33600090815260136020908152604080832054602490925290912054106126e85760405162461bcd60e51b815260206004820152601460248201527313d493d0d2124e8810db185a5b4819985a5b195960621b6044820152606401610e44565b60005b336000908152601360205260409020548110156127b55733600090815260136020526040812080548390811061272357612723614ead565b90600052602060002001549050612751816000908152600260205260409020546001600160a01b0316151590565b6127a25761275f3382613be3565b60405181815233907f30f4e2ff758c62d61bb151d75a67e6e282c1536c30d83481c7f0855937d2eae59060200160405180910390a28261279e81614ed9565b9350505b50806127ad81614ed9565b9150506126eb565b5033600090815260246020526040812080548392906127d5908490614ef2565b9250508190555090565b6000818152600260205260408120546001600160a01b031680610d115760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610e44565b6015602052816000526040600020818154811061175d57600080fd5b60006001600160a01b0382166128c55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610e44565b506001600160a01b031660009081526003602052604090205490565b6128e961386b565b6128f36000613d7c565b565b6128fd61386b565b600b548251600c5461290f9190614ef2565b111561292d5760405162461bcd60e51b8152600401610e4490614f9e565b600082511161297e5760405162461bcd60e51b815260206004820152601c60248201527f4f524f4348493a20496e76616c696420706172616d206c656e677468000000006044820152606401610e44565b601154811015801561299257506012548111155b6129d55760405162461bcd60e51b81526020600482015260146024820152734f524f4348493a20496e76616c6964207369646560601b6044820152606401610e44565b60005b8251811015610ee5576129ef600c80546001019055565b60006129fa600c5490565b9050600b54811115612a1e5760405162461bcd60e51b8152600401610e4490614f9e565b6040518060a00160405280858481518110612a3b57612a3b614ead565b6020908102919091018101516001600160a01b0390811683526000838301819052604080850187905260608086018a9052620f423f6080968701528783526014855291819020865181546001600160a01b03191694169390931783559285015160018301559184015160028201559083015160038201559101516004909101558351612ae190859084908110612ad357612ad3614ead565b602002602001015182613be3565b8083858481518110612af557612af5614ead565b60200260200101516001600160a01b03167f63232c37f2c1fdcb4fc657df1cef6cabc7181c5b604530242590ffe5fa91ab7460405160405180910390a45080612b3d81614ed9565b9150506129d8565b6000612b4f61386b565b825b612b5b8385614ef2565b81108015612b76575060008581526015602052604090205481105b15612c10576000858152601560205260408120805483908110612b9b57612b9b614ead565b90600052602060002001549050612bc9816000908152600260205260409020546001600160a01b0316151590565b612bfd57600081815260146020526040902054612bef906001600160a01b031682613be3565b82612bf981614ed9565b9350505b5080612c0881614ed9565b915050612b51565b509392505050565b6000612c4e6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b600091505b600e548211612c83576000828152600d60205260409020544210612c835781612c7b81614ed9565b925050612c53565b506000818152600d6020908152604091829020825160a081018452815481526001820154928101929092526002810154928201929092526003820154606082015260049091015460ff16151560808201529091565b606060018054610d2690614e79565b612cef61386b565b600082118015612d015750600e548211155b612d4d5760405162461bcd60e51b815260206004820152601d60248201527f4f524f4348493a20496e76616c696420706572696f64206e756d6265720000006044820152606401610e44565b6000819003612d9e5760405162461bcd60e51b815260206004820152601960248201527f4f524f4348493a20496e76616c6964207472656520726f6f74000000000000006044820152606401610e44565b6000918252600f602052604090912055565b61103c338383613dce565b601e8181548110612dcb57600080fd5b600091825260209091200154905081565b612de633836139de565b612e025760405162461bcd60e51b8152600401610e4490614f51565b612e0e84848484613e9c565b50505050565b6060612e1f8261379e565b6000612e3660408051602081019091526000815290565b90506000815111612e565760405180602001604052806000815250612e81565b80612e6084613ecf565b604051602001612e7192919061501c565b6040516020818303038152906040525b9392505050565b601d546000818152601f60205260408120549060605b824210612edc5783612eaf81614ed9565b94505060195483612ec09190614ef2565b600e546000908152600d60205260409020549093508310612e9e575b60008481526020808052604080832054602290925290912054909250158015612f0757506000601d54115b15612fd4576011545b6012548111612fd257601d5460009081526021602090815260408083208484529091528120549003612fc057601d54600090815260226020908152604080832054835260148252808320600301548352601c90915290208054612710919083908110612f7e57612f7e614ead565b906000526020600020015460206000601d54815260200190815260200160002054612fa99190614f18565b612fb39190614f2f565b612fbd9084614ef2565b92505b80612fca81614ed9565b915050612f10565b505b6012546001600160401b03811115612fee57612fee6147e4565b604051908082528060200260200182016040528015613017578160200160208202803683370190505b50905060005b60125481101561307f57600085815260216020526040812090613041836001614ef2565b81526020019081526020016000205482828151811061306257613062614ead565b60209081029190910101528061307781614ed9565b91505061301d565b5090919293565b600080851180156130995750600e548511155b6130de5760405162461bcd60e51b815260206004820152601660248201527513d493d0d2124e88125b9d985b1a59081c195c9a5bd960521b6044820152606401610e44565b6000858152600d602052604090206004015460ff166131525760405162461bcd60e51b815260206004820152602a60248201527f4f524f4348493a2057686974656c697374206e6f742076616c696420696e20746044820152691a1a5cc81c195c9a5bd960b21b6064820152608401610e44565b6131db83838080602002602001604051908101604052809392919081815260200183836020028082843760009201829052508a8152600f60209081526040918290205491519194506131c093508a92500160609190911b6bffffffffffffffffffffffff1916815260140190565b60405160208183030381529060405280519060200120613f61565b90505b949350505050565b601e54606090819080158015906132365750601f6000601e613209600185614f05565b8154811061321957613219614ead565b906000526020600020015481526020019081526020016000205442105b1561324957613246600182614f05565b90505b80156136b457806001600160401b03811115613267576132676147e4565b6040519080825280602002602001820160405280156132a057816020015b61328d614512565b8152602001906001900390816132855790505b509250806001600160401b038111156132bb576132bb6147e4565b6040519080825280602002602001820160405280156132e4578160200160208202803683370190505b50915060005b818110156136b2576014600060226000601e858154811061330d5761330d614ead565b906000526020600020015481526020019081526020016000205481526020019081526020016000206040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201548152602001600382015481526020016004820154815250508482815181106133a9576133a9614ead565b602002602001018190525060005b601360008684815181106133cd576133cd614ead565b602090810291909101810151516001600160a01b031682528101919091526040016000205481101561369f576000601460006013600089878151811061341557613415614ead565b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020848154811061345257613452614ead565b600091825260208083209091015483528281019390935260409182019020815160a08101835281546001600160a01b031681526001820154938101939093526002810154918301919091526003810154606083015260040154608082015286519091508690849081106134c7576134c7614ead565b60200260200101516080015181608001510361368c57602160008260800151815260200190815260200160002060008260600151815260200190815260200160002054612710601c600089878151811061352357613523614ead565b602002602001015160600151815260200190815260200160002083606001518154811061355257613552614ead565b906000526020600020015460206000856080015181526020019081526020016000205461357f9190614f18565b6135899190614f2f565b6135939190614f2f565b8584815181106135a5576135a5614ead565b602002602001018181516135b99190614ef2565b90525085518690849081106135d0576135d0614ead565b60200260200101516040015181604001510361368c57612710601c60008886815181106135ff576135ff614ead565b602002602001015160600151815260200190815260200160002060008154811061362b5761362b614ead565b90600052602060002001546020600084608001518152602001908152602001600020546136589190614f18565b6136629190614f2f565b85848151811061367457613674614ead565b602002602001018181516136889190614ef2565b9052505b508061369781614ed9565b9150506133b7565b50806136aa81614ed9565b9150506132ea565b505b509091565b6136c161386b565b6001600160a01b0381166137265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e44565b61372f81613d7c565b50565b6013602052816000526040600020818154811061175d57600080fd5b60006001600160e01b031982166380ac58cd60e01b148061377f57506001600160e01b03198216635b5e139f60e01b145b80610d1157506301ffc9a760e01b6001600160e01b0319831614610d11565b6000818152600260205260409020546001600160a01b031661372f5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610e44565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613832826127df565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600a546001600160a01b031633146128f35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e44565b804710156139155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e44565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613962576040519150601f19603f3d011682016040523d82523d6000602084013e613967565b606091505b5050905080610ee55760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e44565b6000806139ea836127df565b9050806001600160a01b0316846001600160a01b03161480613a3157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806131de5750836001600160a01b0316613a4a84610da9565b6001600160a01b031614949350505050565b826001600160a01b0316613a6f826127df565b6001600160a01b031614613a955760405162461bcd60e51b8152600401610e449061504b565b6001600160a01b038216613af75760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610e44565b613b048383836001613f77565b826001600160a01b0316613b17826127df565b6001600160a01b031614613b3d5760405162461bcd60e51b8152600401610e449061504b565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818310613bdc5781612e81565b5090919050565b6001600160a01b038216613c395760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610e44565b6000818152600260205260409020546001600160a01b031615613c9e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610e44565b613cac600083836001613f77565b6000818152600260205260409020546001600160a01b031615613d115760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610e44565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603613e2f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610e44565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613ea7848484613a5c565b613eb3848484846140b0565b612e0e5760405162461bcd60e51b8152600401610e4490615090565b60606000613edc836141ae565b60010190506000816001600160401b03811115613efb57613efb6147e4565b6040519080825280601f01601f191660200182016040528015613f25576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084613f2f57509392505050565b600082613f6e8584614286565b14949350505050565b613f83848484846142cb565b6001811115613ff25760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610e44565b816001600160a01b03851661404e5761404981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614071565b836001600160a01b0316856001600160a01b031614614071576140718582614353565b6001600160a01b03841661408d57614088816143f0565b61173a565b846001600160a01b0316846001600160a01b03161461173a5761173a848261449f565b60006001600160a01b0384163b156141a657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906140f49033908990889088906004016150e2565b6020604051808303816000875af192505050801561412f575060408051601f3d908101601f1916820190925261412c91810190615115565b60015b61418c573d80801561415d576040519150601f19603f3d011682016040523d82523d6000602084013e614162565b606091505b5080516000036141845760405162461bcd60e51b8152600401610e4490615090565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506131de565b5060016131de565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106141ed5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614219576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061423757662386f26fc10000830492506010015b6305f5e100831061424f576305f5e100830492506008015b612710831061426357612710830492506004015b60648310614275576064830492506002015b600a8310610d115760010192915050565b600081815b8451811015612c10576142b7828683815181106142aa576142aa614ead565b60200260200101516144e3565b9150806142c381614ed9565b91505061428b565b6001811115612e0e576001600160a01b03841615614311576001600160a01b0384166000908152600360205260408120805483929061430b908490614f05565b90915550505b6001600160a01b03831615612e0e576001600160a01b03831660009081526003602052604081208054839290614348908490614ef2565b909155505050505050565b600060016143608461285b565b61436a9190614f05565b6000838152600760205260409020549091508082146143bd576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061440290600190614f05565b6000838152600960205260408120546008805493945090928490811061442a5761442a614ead565b90600052602060002001549050806008838154811061444b5761444b614ead565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061448357614483615132565b6001900381819060005260206000200160009055905550505050565b60006144aa8361285b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60008183106144ff576000828152602084905260409020612e81565b6000838152602083905260409020612e81565b6040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b828054828255906000526020600020908101928215614585579160200282015b8281111561458557825182559160200191906001019061456a565b506121d99291505b808211156121d9576000815560010161458d565b6001600160e01b03198116811461372f57600080fd5b6000602082840312156145c957600080fd5b8135612e81816145a1565b60005b838110156145ef5781810151838201526020016145d7565b50506000910152565b600081518084526146108160208601602086016145d4565b601f01601f19169290920160200192915050565b602081526000612e8160208301846145f8565b60006020828403121561464957600080fd5b5035919050565b80356001600160a01b038116811461466757600080fd5b919050565b6000806040838503121561467f57600080fd5b61468883614650565b946020939093013593505050565b600080604083850312156146a957600080fd5b50508035926020909101359150565b6000602082840312156146ca57600080fd5b612e8182614650565b8381526020810183905260e081016131de604083018480516001600160a01b03168252602080820151908301526040808201519083015260608082015190830152608090810151910152565b600081518084526020808501945080840160005b8381101561478a5761477787835180516001600160a01b03168252602080820151908301526040808201519083015260608082015190830152608090810151910152565b60a0969096019590820190600101614733565b509495945050505050565b602081526000612e81602083018461471f565b6000806000606084860312156147bd57600080fd5b6147c684614650565b92506147d460208501614650565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614822576148226147e4565b604052919050565b60006001600160401b03821115614843576148436147e4565b5060051b60200190565b600082601f83011261485e57600080fd5b8135602061487361486e8361482a565b6147fa565b82815260059290921b8401810191818101908684111561489257600080fd5b8286015b848110156148ad5780358352918301918301614896565b509695505050505050565b600080600080608085870312156148ce57600080fd5b84359350602080860135935060408601356001600160401b03808211156148f457600080fd5b61490089838a0161484d565b9450606088013591508082111561491657600080fd5b818801915088601f83011261492a57600080fd5b813561493861486e8261482a565b81815260059190911b8301840190848101908b83111561495757600080fd5b8585015b8381101561498f578035858111156149735760008081fd5b6149818e89838a010161484d565b84525091860191860161495b565b50989b979a50959850505050505050565b60008083601f8401126149b257600080fd5b5081356001600160401b038111156149c957600080fd5b6020830191508360208260051b85010111156149e457600080fd5b9250929050565b60008060008060608587031215614a0157600080fd5b843593506020850135925060408501356001600160401b03811115614a2557600080fd5b614a31878288016149a0565b95989497509550505050565b8035801515811461466757600080fd5b600060208284031215614a5f57600080fd5b612e8182614a3d565b600082601f830112614a7957600080fd5b81356020614a8961486e8361482a565b82815260059290921b84018101918181019086841115614aa857600080fd5b8286015b848110156148ad57614abd81614a3d565b8352918301918301614aac565b60008060008060008060c08789031215614ae357600080fd5b8635955060208701356001600160401b0380821115614b0157600080fd5b614b0d8a838b0161484d565b96506040890135915080821115614b2357600080fd5b614b2f8a838b0161484d565b95506060890135915080821115614b4557600080fd5b614b518a838b0161484d565b94506080890135915080821115614b6757600080fd5b614b738a838b0161484d565b935060a0890135915080821115614b8957600080fd5b50614b9689828a01614a68565b9150509295509295509295565b60008060408385031215614bb657600080fd5b82356001600160401b03811115614bcc57600080fd5b8301601f81018513614bdd57600080fd5b80356020614bed61486e8361482a565b82815260059290921b83018101918181019088841115614c0c57600080fd5b938201935b83851015614c3157614c2285614650565b82529382019390820190614c11565b98969091013596505050505050565b600080600060608486031215614c5557600080fd5b505081359360208301359350604090920135919050565b60008060408385031215614c7f57600080fd5b614c8883614650565b9150614c9660208401614a3d565b90509250929050565b60008060408385031215614cb257600080fd5b82359150614c9660208401614650565b60008060008060808587031215614cd857600080fd5b614ce185614650565b93506020614cf0818701614650565b93506040860135925060608601356001600160401b0380821115614d1357600080fd5b818801915088601f830112614d2757600080fd5b813581811115614d3957614d396147e4565b614d4b601f8201601f191685016147fa565b91508082528984828501011115614d6157600080fd5b808484018584013760008482840101525080935050505092959194509250565b600081518084526020808501945080840160005b8381101561478a57815187529582019590820190600101614d95565b848152836020820152826040820152608060608201526000614dd66080830184614d81565b9695505050505050565b60008060008060608587031215614df657600080fd5b84359350614e0660208601614650565b925060408501356001600160401b03811115614a2557600080fd5b604081526000614e34604083018561471f565b8281036020840152614e468185614d81565b95945050505050565b60008060408385031215614e6257600080fd5b614e6b83614650565b9150614c9660208401614650565b600181811c90821680614e8d57607f821691505b60208210810361145757634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201614eeb57614eeb614ec3565b5060010190565b80820180821115610d1157610d11614ec3565b81810381811115610d1157610d11614ec3565b8082028115828204841417610d1157610d11614ec3565b600082614f4c57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252601e908201527f4f524f4348493a2045786365656473206d6178696d756d20737570706c790000604082015260600190565b60208082526027908201527f4f524f4348493a204578636565646564206d6178696d756d207075726368617360408201526619481b1a5b5a5d60ca1b606082015260800190565b6000835161502e8184602088016145d4565b8351908301906150428183602088016145d4565b01949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614dd6908301846145f8565b60006020828403121561512757600080fd5b8151612e81816145a1565b634e487b7160e01b600052603160045260246000fdfea264697066735822122009148e0646e6f31d1bb83659b528c9cd82762a21a525f8d8b94a5218eaf9207364736f6c63430008120033
Deployed Bytecode
0x6080604052600436106103b85760003560e01c806370a08231116101f2578063b88d4fde1161010d578063d3ebe351116100a0578063e985e9c51161006f578063e985e9c514610c4d578063f2fde38b14610c96578063fa1a5f5914610cb6578063fca56d4014610ccc57600080fd5b8063d3ebe35114610bba578063d5abeb0114610be7578063d894454d14610bfd578063dc6b862714610c2a57600080fd5b8063cc4d9af5116100dc578063cc4d9af514610ae4578063cf764cd014610b09578063d1f78e9814610b29578063d29d02a414610ba057600080fd5b8063b88d4fde14610a4a578063bd83434514610a6a578063c4ef158f14610a97578063c87b56dd14610ac457600080fd5b806394b76cde11610185578063a22cb46511610154578063a22cb465146109a5578063a2fb1175146109c5578063aa2ae515146109f2578063ae6787a914610a1257600080fd5b806394b76cde1461090357806395d89b411461095a578063997d8cd91461096f5780639e21b8461461098557600080fd5b806383b74baa116101c157806383b74baa1461088f5780638c195122146108af5780638da5cb5b146108cf578063905830cf146108ed57600080fd5b806370a08231146107be578063715018a6146107de57806375bea166146107f35780637f1975191461087957600080fd5b80632f745c59116102e257806346abf3911161027557806358e3a5a01161024457806358e3a5a0146107535780635ae2afa4146107695780636352211e1461077e5780636cb8f9a01461079e57600080fd5b806346abf391146106d2578063488a470a146106fe5780634e71d92d1461071e5780634f6ccce71461073357600080fd5b80633e2d38d6116102b15780633e2d38d61461064f57806342842e0e1461066557806345a8cceb1461068557806345ead43c146106b257600080fd5b80632f745c59146105cc578063309835cd146105ec57806339f9c82c146106245780633b19e84a1461063a57600080fd5b806318160ddd1161035a57806323b872dd1161032957806323b872dd1461055957806326bad85f14610579578063299a7a2f146105995780632da82e16146105b957600080fd5b806318160ddd146104c85780631b9a91a4146104dd57806320b9588c146104fd57806323b7cc991461052c57600080fd5b8063095ea7b311610396578063095ea7b31461044c5780630e15561a1461046e5780630ed64eff14610492578063119b22b3146104b257600080fd5b806301ffc9a7146103bd57806306fdde03146103f2578063081812fc14610414575b600080fd5b3480156103c957600080fd5b506103dd6103d83660046145b7565b610cec565b60405190151581526020015b60405180910390f35b3480156103fe57600080fd5b50610407610d17565b6040516103e99190614624565b34801561042057600080fd5b5061043461042f366004614637565b610da9565b6040516001600160a01b0390911681526020016103e9565b34801561045857600080fd5b5061046c61046736600461466c565b610dd0565b005b34801561047a57600080fd5b5061048460185481565b6040519081526020016103e9565b34801561049e57600080fd5b5061046c6104ad366004614696565b610eea565b3480156104be57600080fd5b50610484601d5481565b3480156104d457600080fd5b50600854610484565b3480156104e957600080fd5b5061046c6104f836600461466c565b61102a565b34801561050957600080fd5b5061051d6105183660046146b8565b611040565b6040516103e9939291906146d3565b34801561053857600080fd5b5061054c6105473660046146b8565b61131d565b6040516103e99190614795565b34801561056557600080fd5b5061046c6105743660046147a8565b61145d565b34801561058557600080fd5b5061046c6105943660046148b8565b61148e565b3480156105a557600080fd5b506104846105b4366004614696565b611741565b61046c6105c73660046149eb565b611772565b3480156105d857600080fd5b506104846105e736600461466c565b61201f565b3480156105f857600080fd5b50610484610607366004614696565b602160209081526000928352604080842090915290825290205481565b34801561063057600080fd5b5061048460165481565b34801561064657600080fd5b506104846120b5565b34801561065b57600080fd5b5061048460125481565b34801561067157600080fd5b5061046c6106803660046147a8565b6121dd565b34801561069157600080fd5b506104846106a0366004614637565b601f6020526000908152604090205481565b3480156106be57600080fd5b5061046c6106cd366004614a4d565b6121f8565b3480156106de57600080fd5b506104846106ed366004614637565b602080526000908152604090205481565b34801561070a57600080fd5b5061046c610719366004614aca565b612213565b34801561072a57600080fd5b5061046c6124bb565b34801561073f57600080fd5b5061048461074e366004614637565b6125a0565b34801561075f57600080fd5b5061048460115481565b34801561077557600080fd5b50610484612633565b34801561078a57600080fd5b50610434610799366004614637565b6127df565b3480156107aa57600080fd5b506104846107b9366004614696565b61283f565b3480156107ca57600080fd5b506104846107d93660046146b8565b61285b565b3480156107ea57600080fd5b5061046c6128e1565b3480156107ff57600080fd5b5061084761080e366004614637565b601460205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016103e9565b34801561088557600080fd5b50610484600e5481565b34801561089b57600080fd5b5061046c6108aa366004614ba3565b6128f5565b3480156108bb57600080fd5b506104846108ca366004614c40565b612b45565b3480156108db57600080fd5b50600a546001600160a01b0316610434565b3480156108f957600080fd5b5061048460195481565b34801561090f57600080fd5b50610918612c18565b604080519283528151602080850191909152820151838201528101516060808401919091528101516080808401919091520151151560a082015260c0016103e9565b34801561096657600080fd5b50610407612cd8565b34801561097b57600080fd5b50610484601a5481565b34801561099157600080fd5b5061046c6109a0366004614696565b612ce7565b3480156109b157600080fd5b5061046c6109c0366004614c6c565b612db0565b3480156109d157600080fd5b506104846109e0366004614637565b60226020526000908152604090205481565b3480156109fe57600080fd5b50610484610a0d366004614637565b612dbb565b348015610a1e57600080fd5b50610484610a2d366004614c9f565b601060209081526000928352604080842090915290825290205481565b348015610a5657600080fd5b5061046c610a65366004614cc2565b612ddc565b348015610a7657600080fd5b50610484610a853660046146b8565b60236020526000908152604090205481565b348015610aa357600080fd5b50610484610ab2366004614637565b601b6020526000908152604090205481565b348015610ad057600080fd5b50610407610adf366004614637565b612e14565b348015610af057600080fd5b50610af9612e88565b6040516103e99493929190614db1565b348015610b1557600080fd5b506103dd610b24366004614de0565b613086565b348015610b3557600080fd5b50610b76610b44366004614637565b600d60205260009081526040902080546001820154600283015460038401546004909401549293919290919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a0016103e9565b348015610bac57600080fd5b506025546103dd9060ff1681565b348015610bc657600080fd5b50610484610bd5366004614637565b600f6020526000908152604090205481565b348015610bf357600080fd5b50610484600b5481565b348015610c0957600080fd5b50610484610c183660046146b8565b60246020526000908152604090205481565b348015610c3657600080fd5b50610c3f6131e6565b6040516103e9929190614e21565b348015610c5957600080fd5b506103dd610c68366004614e4f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610ca257600080fd5b5061046c610cb13660046146b8565b6136b9565b348015610cc257600080fd5b5061048460175481565b348015610cd857600080fd5b50610484610ce736600461466c565b613732565b60006001600160e01b0319821663780e9d6360e01b1480610d115750610d118261374e565b92915050565b606060008054610d2690614e79565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5290614e79565b8015610d9f5780601f10610d7457610100808354040283529160200191610d9f565b820191906000526020600020905b815481529060010190602001808311610d8257829003601f168201915b5050505050905090565b6000610db48261379e565b506000908152600460205260409020546001600160a01b031690565b6000610ddb826127df565b9050806001600160a01b0316836001600160a01b031603610e4d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610e695750610e698133610c68565b610edb5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610e44565b610ee583836137fd565b505050565b610ef261386b565b60008211610f3a5760405162461bcd60e51b815260206004820152601560248201527413d493d0d2124e88125b9d985b1a590818dbdd5b9d605a1b6044820152606401610e44565b6011548110158015610f4e57506012548111155b610f915760405162461bcd60e51b81526020600482015260146024820152734f524f4348493a20496e76616c6964207369646560601b6044820152606401610e44565b6000826001600160401b03811115610fab57610fab6147e4565b604051908082528060200260200182016040528015610fd4578160200160208202803683370190505b50905060005b8381101561101f5733828281518110610ff557610ff5614ead565b6001600160a01b03909216602092830291909101909101528061101781614ed9565b915050610fda565b50610ee581836128f5565b61103261386b565b61103c82826138c5565b5050565b60008061104b614512565b601d546000818152601f60205260409020545b80421061109c578161106f81614ed9565b925050601954816110809190614ef2565b600e546000908152600d6020526040902054909150811061105e575b81156110b0576110ad600183614f05565b91505b60005b6001600160a01b038716600090815260136020526040902054811015611313576001600160a01b0387166000908152601360205260408120805460149183918590811061110257611102614ead565b600091825260208083209091015483528281019390935260409182018120825160a08101845281546001600160a01b0316815260018201548186015260028201548185015260038201546060820152600490910154608082018190528252601f90935220549091504210156111775750611313565b60808082018051600090815260226020908152604080832054835260148252808320815160a08101835281546001600160a01b0316815260018201548185015260028201548184015260038201546060808301918252600490930154978201979097529451845260218352818420908701805185529083528184205495518452601c90925282209051815493949293612710929190811061121a5761121a614ead565b90600052602060002001546020600087608001518152602001908152602001600020546112479190614f18565b6112519190614f2f565b61125b9190614f2f565b905081604001518360400151036112d65760608201516000908152601c602052604081208054612710929061129257611292614ead565b90600052602060002001546020600086608001518152602001908152602001600020546112bf9190614f18565b6112c99190614f2f565b6112d39082614ef2565b90505b6112e0818a614ef2565b9850858360800151036112fd576112f78189614ef2565b97508196505b505050808061130b90614ed9565b9150506110b3565b5050509193909250565b6001600160a01b0381166000908152601360205260409020546060906001600160401b03811115611350576113506147e4565b60405190808252806020026020018201604052801561138957816020015b611376614512565b81526020019060019003908161136e5790505b50905060005b8151811015611457576001600160a01b038316600090815260136020526040812080546014929190849081106113c7576113c7614ead565b600091825260208083209091015483528281019390935260409182019020815160a08101835281546001600160a01b0316815260018201549381019390935260028101549183019190915260038101546060830152600401546080820152825183908390811061143957611439614ead565b6020026020010181905250808061144f90614ed9565b91505061138f565b50919050565b61146733826139de565b6114835760405162461bcd60e51b8152600401610e4490614f51565b610ee5838383613a5c565b61149661386b565b6000841180156114a65750600083115b80156114b457506012548251145b80156114c257506012548151145b6115265760405162461bcd60e51b815260206004820152602f60248201527f4f524f4348493a205a65726f2074696d6520706172616d206f7220696e76616c60448201526e0d2c840e0c2e4c2da40d8cadccee8d608b1b6064820152608401610e44565b60005b60125481101561168657601254611541906002614ef2565b82828151811061155357611553614ead565b602002602001015151146115a95760405162461bcd60e51b815260206004820181905260248201527f4f524f4348493a20496e76616c696420616c6c6f6320646566206c656e6774686044820152606401610e44565b6000805b8383815181106115bf576115bf614ead565b602002602001015151811015611621578383815181106115e1576115e1614ead565b602002602001015181815181106115fa576115fa614ead565b60200260200101518261160d9190614ef2565b91508061161981614ed9565b9150506115ad565b5061271081146116735760405162461bcd60e51b815260206004820152601f60248201527f4f524f4348493a20496e76616c696420616c6c6f63206465662076616c7565006044820152606401610e44565b508061167e81614ed9565b915050611529565b506019849055601a83905560005b60125481101561173a578281815181106116b0576116b0614ead565b6020026020010151601b60008360016116c99190614ef2565b8152602001908152602001600020819055508181815181106116ed576116ed614ead565b6020026020010151601c60008360016117069190614ef2565b8152602001908152602001600020908051906020019061172792919061454a565b508061173281614ed9565b915050611694565b5050505050565b601c602052816000526040600020818154811061175d57600080fd5b90600052602060002001600091509150505481565b600b548361177f600c5490565b6117899190614ef2565b11156117a75760405162461bcd60e51b8152600401610e4490614f9e565b60005b600e5481116117da576000818152600d602052604090205442106117da57806117d281614ed9565b9150506117aa565b600081116118235760405162461bcd60e51b815260206004820152601660248201527513d493d0d2124e88135a5b9d081b9bdd081cdd185c9d60521b6044820152606401610e44565b600e5481111561186e5760405162461bcd60e51b815260206004820152601660248201527513d493d0d2124e88135a5b9d081a185cc8195b99195960521b6044820152606401610e44565b6000818152600d602052604090206004015460ff161580611896575061189681338585613086565b6118e25760405162461bcd60e51b815260206004820152601860248201527f4f524f4348493a204e6f7420696e2077686974656c69737400000000000000006044820152606401610e44565b60115485101580156118f657506012548511155b6119425760405162461bcd60e51b815260206004820152601860248201527f4f524f4348493a2043686f6f736520796f7572207369646500000000000000006044820152606401610e44565b6000841161198a5760405162461bcd60e51b815260206004820152601560248201527413d493d0d2124e88125b9d985b1a590818dbdd5b9d605a1b6044820152606401610e44565b6000818152600d602090815260408083206002015460108352818420338552909252909120546119bb908690614ef2565b11156119d95760405162461bcd60e51b8152600401610e4490614fd5565b6000818152600d60209081526040808320600301546010835281842033855290925282205410611a0a576000611a46565b6000828152601060209081526040808320338452825280832054858452600d90925290912060030154611a4691611a4091614f05565b86613bcd565b90506000611a548287614f05565b6000848152600d6020526040902060010154909150611a74908290614f18565b341015611ac35760405162461bcd60e51b815260206004820152601b60248201527f4f524f4348493a2053686f7274616765206f662062616c616e636500000000006044820152606401610e44565b601d545b601d546000908152601f60205260409020544210611b4057601954601d546000908152601f6020526040902054611afe9190614ef2565b601f6000601d546001611b119190614ef2565b815260200190815260200160002081905550601d6000815480929190611b3690614ed9565b9190505550611ac7565b601e541580611b7a5750601d54601e8054611b5d90600190614f05565b81548110611b6d57611b6d614ead565b9060005260206000200154105b15611bb657601d54601e80546001810182556000919091527f50bb669a95c7b50b7e8a6f09454034b2b14cf2b85c730dca9a539ca82cb6e35001555b600084815260106020908152604080832033845290915281208054899290611bdf908490614ef2565b90915550506000848152600d602090815260408083206002015460108352818420338552909252909120541115611c285760405162461bcd60e51b8152600401610e4490614fd5565b601a54611c359088614f18565b601d546000908152601f602052604081208054909190611c56908490614ef2565b9091555050601d54600090815260226020526040902054158015611c7a5750600081115b15611d58576011545b6012548111611d565760008281526021602090815260408083208484529091528120549003611d4457600082815260226020908152604080832054835260148252808320600301548352601c90915290208054612710919083908110611ceb57611ceb614ead565b90600052602060002001546020600085815260200190815260200160002054611d149190614f18565b611d1e9190614f2f565b601d54600090815260208052604081208054909190611d3e908490614ef2565b90915550505b80611d4e81614ed9565b915050611c83565b505b6000888152601b6020908152604080832054878452600d9092528220600101546127109190611d879086614f18565b611d919190614f18565b611d9b9190614f2f565b90508060206000601d5481526020019081526020016000206000828254611dc29190614ef2565b925050819055508060186000828254611ddb9190614ef2565b9091555050601d5460009081526021602090815260408083208c8452909152812080548a9290611e0c908490614ef2565b925050819055508760166000828254611e259190614ef2565b925050819055503460176000828254611e3e9190614ef2565b90915550600090505b8881101561201357611e5d600c80546001019055565b6000611e68600c5490565b9050600b54811115611e8c5760405162461bcd60e51b8152600401610e4490614f9e565b6000868310611eac576000888152600d6020526040902060010154611eaf565b60005b90506040518060a00160405280336001600160a01b031681526020018281526020018381526020018d8152602001601d548152506014600084815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505060156000808311611f60576002611f63565b60015b60ff16815260208082019290925260409081016000908120805460018082018355918352848320018690553380835260138552838320805492830181558352848320909101869055601d805483526022855291839020869055905482518581529384018c905283830152905184928f92917f9c6a55258067ffcb8f3785a4b16d5894aab51deeb9e6935393d2410fdc5a0cbd9181900360600190a45050808061200b90614ed9565b915050611e47565b50505050505050505050565b600061202a8361285b565b821061208c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610e44565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600060015b601d5481116121d9576000818152601f602052604090205442108015906120ee575060008181526022602052604090205415155b156121c757600081815260226020908152604080832054835260148252808320600301548352601c82528083208054825181850281018501909352808352919290919083018282801561216057602002820191906000526020600020905b81548152602001906001019080831161214c575b5050505050905061271081600183516121799190614f05565b8151811061218957612189614ead565b602002602001015160206000858152602001908152602001600020546121af9190614f18565b6121b99190614f2f565b6121c39084614ef2565b9250505b806121d181614ed9565b9150506120ba565b5090565b610ee583838360405180602001604052806000815250612ddc565b61220061386b565b6025805460ff1916911515919091179055565b61221b61386b565b6000855111801561222d575083518551145b801561223a575082518551145b8015612247575081518551145b8015612254575080518551145b6122a05760405162461bcd60e51b815260206004820152601c60248201527f4f524f4348493a20496e76616c696420706172616d206c656e677468000000006044820152606401610e44565b8451600e556000808052600d6020527f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee8790555b600e548110156123f3576040518060a001604052808783815181106122fb576122fb614ead565b6020026020010151815260200186838151811061231a5761231a614ead565b6020026020010151815260200185838151811061233957612339614ead565b6020026020010151815260200184838151811061235857612358614ead565b6020026020010151815260200183838151811061237757612377614ead565b60200260200101511515815250600d60008360016123959190614ef2565b81526020808201929092526040908101600020835181559183015160018301558201516002820155606082015160038201556080909101516004909101805460ff1916911515919091179055806123eb81614ed9565b9150506122d4565b506040518060a001604052806402540be3ff815260200160008152602001600081526020016000815260200160001515815250600d6000600e5460016124399190614ef2565b81526020808201929092526040908101600090812084518155848401516001820155918401516002830155606084015160038301556080909301516004909101805460ff1916911515919091179055908052601f90525050507f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d4855929092555050565b60006124c633611040565b505033600090815260236020526040812054919250906124e69083614f05565b9050600081116125385760405162461bcd60e51b815260206004820181905260248201527f4f524f4348493a20526577617264732062616c616e636520697320656d7074796044820152606401610e44565b3360009081526023602052604081208054839290612557908490614ef2565b90915550612567905033826138c5565b60405181815233907f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d49060200160405180910390a25050565b60006125ab60085490565b821061260e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610e44565b6008828154811061262157612621614ead565b90600052602060002001549050919050565b60255460009060ff166126885760405162461bcd60e51b815260206004820152601b60248201527f4f524f4348493a204e465420636c61696d206e6f7420737461727400000000006044820152606401610e44565b33600090815260136020908152604080832054602490925290912054106126e85760405162461bcd60e51b815260206004820152601460248201527313d493d0d2124e8810db185a5b4819985a5b195960621b6044820152606401610e44565b60005b336000908152601360205260409020548110156127b55733600090815260136020526040812080548390811061272357612723614ead565b90600052602060002001549050612751816000908152600260205260409020546001600160a01b0316151590565b6127a25761275f3382613be3565b60405181815233907f30f4e2ff758c62d61bb151d75a67e6e282c1536c30d83481c7f0855937d2eae59060200160405180910390a28261279e81614ed9565b9350505b50806127ad81614ed9565b9150506126eb565b5033600090815260246020526040812080548392906127d5908490614ef2565b9250508190555090565b6000818152600260205260408120546001600160a01b031680610d115760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610e44565b6015602052816000526040600020818154811061175d57600080fd5b60006001600160a01b0382166128c55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610e44565b506001600160a01b031660009081526003602052604090205490565b6128e961386b565b6128f36000613d7c565b565b6128fd61386b565b600b548251600c5461290f9190614ef2565b111561292d5760405162461bcd60e51b8152600401610e4490614f9e565b600082511161297e5760405162461bcd60e51b815260206004820152601c60248201527f4f524f4348493a20496e76616c696420706172616d206c656e677468000000006044820152606401610e44565b601154811015801561299257506012548111155b6129d55760405162461bcd60e51b81526020600482015260146024820152734f524f4348493a20496e76616c6964207369646560601b6044820152606401610e44565b60005b8251811015610ee5576129ef600c80546001019055565b60006129fa600c5490565b9050600b54811115612a1e5760405162461bcd60e51b8152600401610e4490614f9e565b6040518060a00160405280858481518110612a3b57612a3b614ead565b6020908102919091018101516001600160a01b0390811683526000838301819052604080850187905260608086018a9052620f423f6080968701528783526014855291819020865181546001600160a01b03191694169390931783559285015160018301559184015160028201559083015160038201559101516004909101558351612ae190859084908110612ad357612ad3614ead565b602002602001015182613be3565b8083858481518110612af557612af5614ead565b60200260200101516001600160a01b03167f63232c37f2c1fdcb4fc657df1cef6cabc7181c5b604530242590ffe5fa91ab7460405160405180910390a45080612b3d81614ed9565b9150506129d8565b6000612b4f61386b565b825b612b5b8385614ef2565b81108015612b76575060008581526015602052604090205481105b15612c10576000858152601560205260408120805483908110612b9b57612b9b614ead565b90600052602060002001549050612bc9816000908152600260205260409020546001600160a01b0316151590565b612bfd57600081815260146020526040902054612bef906001600160a01b031682613be3565b82612bf981614ed9565b9350505b5080612c0881614ed9565b915050612b51565b509392505050565b6000612c4e6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b600091505b600e548211612c83576000828152600d60205260409020544210612c835781612c7b81614ed9565b925050612c53565b506000818152600d6020908152604091829020825160a081018452815481526001820154928101929092526002810154928201929092526003820154606082015260049091015460ff16151560808201529091565b606060018054610d2690614e79565b612cef61386b565b600082118015612d015750600e548211155b612d4d5760405162461bcd60e51b815260206004820152601d60248201527f4f524f4348493a20496e76616c696420706572696f64206e756d6265720000006044820152606401610e44565b6000819003612d9e5760405162461bcd60e51b815260206004820152601960248201527f4f524f4348493a20496e76616c6964207472656520726f6f74000000000000006044820152606401610e44565b6000918252600f602052604090912055565b61103c338383613dce565b601e8181548110612dcb57600080fd5b600091825260209091200154905081565b612de633836139de565b612e025760405162461bcd60e51b8152600401610e4490614f51565b612e0e84848484613e9c565b50505050565b6060612e1f8261379e565b6000612e3660408051602081019091526000815290565b90506000815111612e565760405180602001604052806000815250612e81565b80612e6084613ecf565b604051602001612e7192919061501c565b6040516020818303038152906040525b9392505050565b601d546000818152601f60205260408120549060605b824210612edc5783612eaf81614ed9565b94505060195483612ec09190614ef2565b600e546000908152600d60205260409020549093508310612e9e575b60008481526020808052604080832054602290925290912054909250158015612f0757506000601d54115b15612fd4576011545b6012548111612fd257601d5460009081526021602090815260408083208484529091528120549003612fc057601d54600090815260226020908152604080832054835260148252808320600301548352601c90915290208054612710919083908110612f7e57612f7e614ead565b906000526020600020015460206000601d54815260200190815260200160002054612fa99190614f18565b612fb39190614f2f565b612fbd9084614ef2565b92505b80612fca81614ed9565b915050612f10565b505b6012546001600160401b03811115612fee57612fee6147e4565b604051908082528060200260200182016040528015613017578160200160208202803683370190505b50905060005b60125481101561307f57600085815260216020526040812090613041836001614ef2565b81526020019081526020016000205482828151811061306257613062614ead565b60209081029190910101528061307781614ed9565b91505061301d565b5090919293565b600080851180156130995750600e548511155b6130de5760405162461bcd60e51b815260206004820152601660248201527513d493d0d2124e88125b9d985b1a59081c195c9a5bd960521b6044820152606401610e44565b6000858152600d602052604090206004015460ff166131525760405162461bcd60e51b815260206004820152602a60248201527f4f524f4348493a2057686974656c697374206e6f742076616c696420696e20746044820152691a1a5cc81c195c9a5bd960b21b6064820152608401610e44565b6131db83838080602002602001604051908101604052809392919081815260200183836020028082843760009201829052508a8152600f60209081526040918290205491519194506131c093508a92500160609190911b6bffffffffffffffffffffffff1916815260140190565b60405160208183030381529060405280519060200120613f61565b90505b949350505050565b601e54606090819080158015906132365750601f6000601e613209600185614f05565b8154811061321957613219614ead565b906000526020600020015481526020019081526020016000205442105b1561324957613246600182614f05565b90505b80156136b457806001600160401b03811115613267576132676147e4565b6040519080825280602002602001820160405280156132a057816020015b61328d614512565b8152602001906001900390816132855790505b509250806001600160401b038111156132bb576132bb6147e4565b6040519080825280602002602001820160405280156132e4578160200160208202803683370190505b50915060005b818110156136b2576014600060226000601e858154811061330d5761330d614ead565b906000526020600020015481526020019081526020016000205481526020019081526020016000206040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201548152602001600382015481526020016004820154815250508482815181106133a9576133a9614ead565b602002602001018190525060005b601360008684815181106133cd576133cd614ead565b602090810291909101810151516001600160a01b031682528101919091526040016000205481101561369f576000601460006013600089878151811061341557613415614ead565b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020848154811061345257613452614ead565b600091825260208083209091015483528281019390935260409182019020815160a08101835281546001600160a01b031681526001820154938101939093526002810154918301919091526003810154606083015260040154608082015286519091508690849081106134c7576134c7614ead565b60200260200101516080015181608001510361368c57602160008260800151815260200190815260200160002060008260600151815260200190815260200160002054612710601c600089878151811061352357613523614ead565b602002602001015160600151815260200190815260200160002083606001518154811061355257613552614ead565b906000526020600020015460206000856080015181526020019081526020016000205461357f9190614f18565b6135899190614f2f565b6135939190614f2f565b8584815181106135a5576135a5614ead565b602002602001018181516135b99190614ef2565b90525085518690849081106135d0576135d0614ead565b60200260200101516040015181604001510361368c57612710601c60008886815181106135ff576135ff614ead565b602002602001015160600151815260200190815260200160002060008154811061362b5761362b614ead565b90600052602060002001546020600084608001518152602001908152602001600020546136589190614f18565b6136629190614f2f565b85848151811061367457613674614ead565b602002602001018181516136889190614ef2565b9052505b508061369781614ed9565b9150506133b7565b50806136aa81614ed9565b9150506132ea565b505b509091565b6136c161386b565b6001600160a01b0381166137265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e44565b61372f81613d7c565b50565b6013602052816000526040600020818154811061175d57600080fd5b60006001600160e01b031982166380ac58cd60e01b148061377f57506001600160e01b03198216635b5e139f60e01b145b80610d1157506301ffc9a760e01b6001600160e01b0319831614610d11565b6000818152600260205260409020546001600160a01b031661372f5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610e44565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613832826127df565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600a546001600160a01b031633146128f35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e44565b804710156139155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e44565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613962576040519150601f19603f3d011682016040523d82523d6000602084013e613967565b606091505b5050905080610ee55760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e44565b6000806139ea836127df565b9050806001600160a01b0316846001600160a01b03161480613a3157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806131de5750836001600160a01b0316613a4a84610da9565b6001600160a01b031614949350505050565b826001600160a01b0316613a6f826127df565b6001600160a01b031614613a955760405162461bcd60e51b8152600401610e449061504b565b6001600160a01b038216613af75760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610e44565b613b048383836001613f77565b826001600160a01b0316613b17826127df565b6001600160a01b031614613b3d5760405162461bcd60e51b8152600401610e449061504b565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818310613bdc5781612e81565b5090919050565b6001600160a01b038216613c395760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610e44565b6000818152600260205260409020546001600160a01b031615613c9e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610e44565b613cac600083836001613f77565b6000818152600260205260409020546001600160a01b031615613d115760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610e44565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603613e2f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610e44565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613ea7848484613a5c565b613eb3848484846140b0565b612e0e5760405162461bcd60e51b8152600401610e4490615090565b60606000613edc836141ae565b60010190506000816001600160401b03811115613efb57613efb6147e4565b6040519080825280601f01601f191660200182016040528015613f25576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084613f2f57509392505050565b600082613f6e8584614286565b14949350505050565b613f83848484846142cb565b6001811115613ff25760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610e44565b816001600160a01b03851661404e5761404981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614071565b836001600160a01b0316856001600160a01b031614614071576140718582614353565b6001600160a01b03841661408d57614088816143f0565b61173a565b846001600160a01b0316846001600160a01b03161461173a5761173a848261449f565b60006001600160a01b0384163b156141a657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906140f49033908990889088906004016150e2565b6020604051808303816000875af192505050801561412f575060408051601f3d908101601f1916820190925261412c91810190615115565b60015b61418c573d80801561415d576040519150601f19603f3d011682016040523d82523d6000602084013e614162565b606091505b5080516000036141845760405162461bcd60e51b8152600401610e4490615090565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506131de565b5060016131de565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106141ed5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614219576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061423757662386f26fc10000830492506010015b6305f5e100831061424f576305f5e100830492506008015b612710831061426357612710830492506004015b60648310614275576064830492506002015b600a8310610d115760010192915050565b600081815b8451811015612c10576142b7828683815181106142aa576142aa614ead565b60200260200101516144e3565b9150806142c381614ed9565b91505061428b565b6001811115612e0e576001600160a01b03841615614311576001600160a01b0384166000908152600360205260408120805483929061430b908490614f05565b90915550505b6001600160a01b03831615612e0e576001600160a01b03831660009081526003602052604081208054839290614348908490614ef2565b909155505050505050565b600060016143608461285b565b61436a9190614f05565b6000838152600760205260409020549091508082146143bd576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061440290600190614f05565b6000838152600960205260408120546008805493945090928490811061442a5761442a614ead565b90600052602060002001549050806008838154811061444b5761444b614ead565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061448357614483615132565b6001900381819060005260206000200160009055905550505050565b60006144aa8361285b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60008183106144ff576000828152602084905260409020612e81565b6000838152602083905260409020612e81565b6040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b828054828255906000526020600020908101928215614585579160200282015b8281111561458557825182559160200191906001019061456a565b506121d99291505b808211156121d9576000815560010161458d565b6001600160e01b03198116811461372f57600080fd5b6000602082840312156145c957600080fd5b8135612e81816145a1565b60005b838110156145ef5781810151838201526020016145d7565b50506000910152565b600081518084526146108160208601602086016145d4565b601f01601f19169290920160200192915050565b602081526000612e8160208301846145f8565b60006020828403121561464957600080fd5b5035919050565b80356001600160a01b038116811461466757600080fd5b919050565b6000806040838503121561467f57600080fd5b61468883614650565b946020939093013593505050565b600080604083850312156146a957600080fd5b50508035926020909101359150565b6000602082840312156146ca57600080fd5b612e8182614650565b8381526020810183905260e081016131de604083018480516001600160a01b03168252602080820151908301526040808201519083015260608082015190830152608090810151910152565b600081518084526020808501945080840160005b8381101561478a5761477787835180516001600160a01b03168252602080820151908301526040808201519083015260608082015190830152608090810151910152565b60a0969096019590820190600101614733565b509495945050505050565b602081526000612e81602083018461471f565b6000806000606084860312156147bd57600080fd5b6147c684614650565b92506147d460208501614650565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614822576148226147e4565b604052919050565b60006001600160401b03821115614843576148436147e4565b5060051b60200190565b600082601f83011261485e57600080fd5b8135602061487361486e8361482a565b6147fa565b82815260059290921b8401810191818101908684111561489257600080fd5b8286015b848110156148ad5780358352918301918301614896565b509695505050505050565b600080600080608085870312156148ce57600080fd5b84359350602080860135935060408601356001600160401b03808211156148f457600080fd5b61490089838a0161484d565b9450606088013591508082111561491657600080fd5b818801915088601f83011261492a57600080fd5b813561493861486e8261482a565b81815260059190911b8301840190848101908b83111561495757600080fd5b8585015b8381101561498f578035858111156149735760008081fd5b6149818e89838a010161484d565b84525091860191860161495b565b50989b979a50959850505050505050565b60008083601f8401126149b257600080fd5b5081356001600160401b038111156149c957600080fd5b6020830191508360208260051b85010111156149e457600080fd5b9250929050565b60008060008060608587031215614a0157600080fd5b843593506020850135925060408501356001600160401b03811115614a2557600080fd5b614a31878288016149a0565b95989497509550505050565b8035801515811461466757600080fd5b600060208284031215614a5f57600080fd5b612e8182614a3d565b600082601f830112614a7957600080fd5b81356020614a8961486e8361482a565b82815260059290921b84018101918181019086841115614aa857600080fd5b8286015b848110156148ad57614abd81614a3d565b8352918301918301614aac565b60008060008060008060c08789031215614ae357600080fd5b8635955060208701356001600160401b0380821115614b0157600080fd5b614b0d8a838b0161484d565b96506040890135915080821115614b2357600080fd5b614b2f8a838b0161484d565b95506060890135915080821115614b4557600080fd5b614b518a838b0161484d565b94506080890135915080821115614b6757600080fd5b614b738a838b0161484d565b935060a0890135915080821115614b8957600080fd5b50614b9689828a01614a68565b9150509295509295509295565b60008060408385031215614bb657600080fd5b82356001600160401b03811115614bcc57600080fd5b8301601f81018513614bdd57600080fd5b80356020614bed61486e8361482a565b82815260059290921b83018101918181019088841115614c0c57600080fd5b938201935b83851015614c3157614c2285614650565b82529382019390820190614c11565b98969091013596505050505050565b600080600060608486031215614c5557600080fd5b505081359360208301359350604090920135919050565b60008060408385031215614c7f57600080fd5b614c8883614650565b9150614c9660208401614a3d565b90509250929050565b60008060408385031215614cb257600080fd5b82359150614c9660208401614650565b60008060008060808587031215614cd857600080fd5b614ce185614650565b93506020614cf0818701614650565b93506040860135925060608601356001600160401b0380821115614d1357600080fd5b818801915088601f830112614d2757600080fd5b813581811115614d3957614d396147e4565b614d4b601f8201601f191685016147fa565b91508082528984828501011115614d6157600080fd5b808484018584013760008482840101525080935050505092959194509250565b600081518084526020808501945080840160005b8381101561478a57815187529582019590820190600101614d95565b848152836020820152826040820152608060608201526000614dd66080830184614d81565b9695505050505050565b60008060008060608587031215614df657600080fd5b84359350614e0660208601614650565b925060408501356001600160401b03811115614a2557600080fd5b604081526000614e34604083018561471f565b8281036020840152614e468185614d81565b95945050505050565b60008060408385031215614e6257600080fd5b614e6b83614650565b9150614c9660208401614650565b600181811c90821680614e8d57607f821691505b60208210810361145757634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201614eeb57614eeb614ec3565b5060010190565b80820180821115610d1157610d11614ec3565b81810381811115610d1157610d11614ec3565b8082028115828204841417610d1157610d11614ec3565b600082614f4c57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252601e908201527f4f524f4348493a2045786365656473206d6178696d756d20737570706c790000604082015260600190565b60208082526027908201527f4f524f4348493a204578636565646564206d6178696d756d207075726368617360408201526619481b1a5b5a5d60ca1b606082015260800190565b6000835161502e8184602088016145d4565b8351908301906150428183602088016145d4565b01949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614dd6908301846145f8565b60006020828403121561512757600080fd5b8151612e81816145a1565b634e487b7160e01b600052603160045260246000fdfea264697066735822122009148e0646e6f31d1bb83659b528c9cd82762a21a525f8d8b94a5218eaf9207364736f6c63430008120033
Deployed Bytecode Sourcemap
73552:19472:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67549:224;;;;;;;;;;-1:-1:-1;67549:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;67549:224:0;;;;;;;;51611:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;53123:171::-;;;;;;;;;;-1:-1:-1;53123:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;53123:171:0;1533:203:1;52641:416:0;;;;;;;;;;-1:-1:-1;52641:416:0;;;;;:::i;:::-;;:::i;:::-;;74590:27;;;;;;;;;;;;;;;;;;;2324:25:1;;;2312:2;2297:18;74590:27:0;2178:177:1;92580:441:0;;;;;;;;;;-1:-1:-1;92580:441:0;;;;;:::i;:::-;;:::i;74833:27::-;;;;;;;;;;;;;;;;68189:113;;;;;;;;;;-1:-1:-1;68277:10:0;:17;68189:113;;91578:129;;;;;;;;;;-1:-1:-1;91578:129:0;;;;;:::i;:::-;;:::i;84204:1635::-;;;;;;;;;;-1:-1:-1;84204:1635:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;83899:297::-;;;;;;;;;;-1:-1:-1;83899:297:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;53823:335::-;;;;;;;;;;-1:-1:-1;53823:335:0;;;;;:::i;:::-;;:::i;77507:1294::-;;;;;;;;;;-1:-1:-1;77507:1294:0;;;;;:::i;:::-;;:::i;74769:55::-;;;;;;;;;;-1:-1:-1;74769:55:0;;;;;:::i;:::-;;:::i;79532:4359::-;;;;;;:::i;:::-;;:::i;67857:256::-;;;;;;;;;;-1:-1:-1;67857:256:0;;;;;:::i;:::-;;:::i;75004:65::-;;;;;;;;;;-1:-1:-1;75004:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;74527:24;;;;;;;;;;;;;;;;89461:533;;;;;;;;;;;;;:::i;74181:28::-;;;;;;;;;;;;;;;;54229:185;;;;;;;;;;-1:-1:-1;54229:185:0;;;;;:::i;:::-;;:::i;74900:44::-;;;;;;;;;;-1:-1:-1;74900:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;78809:98;;;;;;;;;;-1:-1:-1;78809:98:0;;;;;:::i;:::-;;:::i;74951:46::-;;;;;;;;;;-1:-1:-1;74951:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;76064:1067;;;;;;;;;;-1:-1:-1;76064:1067:0;;;;;:::i;:::-;;:::i;90002:394::-;;;;;;;;;;;;;:::i;68379:233::-;;;;;;;;;;-1:-1:-1;68379:233:0;;;;;:::i;:::-;;:::i;74146:28::-;;;;;;;;;;;;;;;;90404:626;;;;;;;;;;;;;:::i;51321:223::-;;;;;;;;;;-1:-1:-1;51321:223:0;;;;;:::i;:::-;;:::i;74472:48::-;;;;;;;;;;-1:-1:-1;74472:48:0;;;;;:::i;:::-;;:::i;51052:207::-;;;;;;;;;;-1:-1:-1;51052:207:0;;;;;:::i;:::-;;:::i;29034:103::-;;;;;;;;;;;;;:::i;74423:42::-;;;;;;;;;;-1:-1:-1;74423:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74423:42:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;11050:32:1;;;11032:51;;11114:2;11099:18;;11092:34;;;;11142:18;;;11135:34;;;;11200:2;11185:18;;11178:34;11243:3;11228:19;;11221:35;11019:3;11004:19;74423:42:0;10773:489:1;73987:26:0;;;;;;;;;;;;;;;;91715:857;;;;;;;;;;-1:-1:-1;91715:857:0;;;;;:::i;:::-;;:::i;91038:532::-;;;;;;;;;;-1:-1:-1;91038:532:0;;;;;:::i;:::-;;:::i;28386:87::-;;;;;;;;;;-1:-1:-1;28459:6:0;;-1:-1:-1;;;;;28459:6:0;28386:87;;74626:39;;;;;;;;;;;;;;;;85847:388;;;;;;;;;;;;;:::i;:::-;;;;12783:25:1;;;12844:13;;12839:2;12824:18;;;12817:41;;;;12900:15;;12894:22;12874:18;;;12867:50;12959:15;;12953:22;12948:2;12933:18;;;12926:50;;;;13019:15;;13013:22;13007:3;12992:19;;;12985:51;;;;13093:16;13087:23;13080:31;13073:39;13067:3;13052:19;;13045:68;12770:3;12755:19;85847:388:0;12560:559:1;51780:104:0;;;;;;;;;;;;;:::i;74672:32::-;;;;;;;;;;;;;;;;77139:360;;;;;;;;;;-1:-1:-1;77139:360:0;;;;;:::i;:::-;;:::i;53366:155::-;;;;;;;;;;-1:-1:-1;53366:155:0;;;;;:::i;:::-;;:::i;75076:42::-;;;;;;;;;;-1:-1:-1;75076:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;74867:26;;;;;;;;;;-1:-1:-1;74867:26:0;;;;;:::i;:::-;;:::i;74073:64::-;;;;;;;;;;-1:-1:-1;74073:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;54485:322;;;;;;;;;;-1:-1:-1;54485:322:0;;;;;:::i;:::-;;:::i;75127:49::-;;;;;;;;;;-1:-1:-1;75127:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;74711:51;;;;;;;;;;-1:-1:-1;74711:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;51955:281;;;;;;;;;;-1:-1:-1;51955:281:0;;;;;:::i;:::-;;:::i;86243:1287::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;78915:609::-;;;;;;;;;;-1:-1:-1;78915:609:0;;;;;:::i;:::-;;:::i;73936:44::-;;;;;;;;;;-1:-1:-1;73936:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16638:25:1;;;16694:2;16679:18;;16672:34;;;;16722:18;;;16715:34;;;;16780:2;16765:18;;16758:34;16836:14;16829:22;16823:3;16808:19;;16801:51;16625:3;16610:19;73936:44:0;16385:473:1;75236:27:0;;;;;;;;;;-1:-1:-1;75236:27:0;;;;;;;;74020:46;;;;;;;;;;-1:-1:-1;74020:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;73650:31;;;;;;;;;;;;;;;;75183:46;;;;;;;;;;-1:-1:-1;75183:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;87538:1915;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;53592:164::-;;;;;;;;;;-1:-1:-1;53592:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;53713:25:0;;;53689:4;53713:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;53592:164;29292:201;;;;;;;;;;-1:-1:-1;29292:201:0;;;;;:::i;:::-;;:::i;74558:25::-;;;;;;;;;;;;;;;;74372:44;;;;;;;;;;-1:-1:-1;74372:44:0;;;;;:::i;:::-;;:::i;67549:224::-;67651:4;-1:-1:-1;;;;;;67675:50:0;;-1:-1:-1;;;67675:50:0;;:90;;;67729:36;67753:11;67729:23;:36::i;:::-;67668:97;67549:224;-1:-1:-1;;67549:224:0:o;51611:100::-;51665:13;51698:5;51691:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51611:100;:::o;53123:171::-;53199:7;53219:23;53234:7;53219:14;:23::i;:::-;-1:-1:-1;53262:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;53262:24:0;;53123:171::o;52641:416::-;52722:13;52738:23;52753:7;52738:14;:23::i;:::-;52722:39;;52786:5;-1:-1:-1;;;;;52780:11:0;:2;-1:-1:-1;;;;;52780:11:0;;52772:57;;;;-1:-1:-1;;;52772:57:0;;18424:2:1;52772:57:0;;;18406:21:1;18463:2;18443:18;;;18436:30;18502:34;18482:18;;;18475:62;-1:-1:-1;;;18553:18:1;;;18546:31;18594:19;;52772:57:0;;;;;;;;;27017:10;-1:-1:-1;;;;;52864:21:0;;;;:62;;-1:-1:-1;52889:37:0;52906:5;27017:10;53592:164;:::i;52889:37::-;52842:173;;;;-1:-1:-1;;;52842:173:0;;18826:2:1;52842:173:0;;;18808:21:1;18865:2;18845:18;;;18838:30;18904:34;18884:18;;;18877:62;18975:31;18955:18;;;18948:59;19024:19;;52842:173:0;18624:425:1;52842:173:0;53028:21;53037:2;53041:7;53028:8;:21::i;:::-;52711:346;52641:416;;:::o;92580:441::-;28272:13;:11;:13::i;:::-;92679:1:::1;92670:6;:10;92662:44;;;::::0;-1:-1:-1;;;92662:44:0;;19256:2:1;92662:44:0::1;::::0;::::1;19238:21:1::0;19295:2;19275:18;;;19268:30;-1:-1:-1;;;19314:18:1;;;19307:51;19375:18;;92662:44:0::1;19054:345:1::0;92662:44:0::1;92750:9;;92739:7;:20;;:44;;;;;92774:9;;92763:7;:20;;92739:44;92717:114;;;::::0;-1:-1:-1;;;92717:114:0;;19606:2:1;92717:114:0::1;::::0;::::1;19588:21:1::0;19645:2;19625:18;;;19618:30;-1:-1:-1;;;19664:18:1;;;19657:50;19724:18;;92717:114:0::1;19404:344:1::0;92717:114:0::1;92842:20;92879:6;-1:-1:-1::0;;;;;92865:21:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;92865:21:0::1;;92842:44;;92902:9;92897:83;92921:6;92917:1;:10;92897:83;;;92958:10;92949:3;92953:1;92949:6;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;92949:19:0;;::::1;:6;::::0;;::::1;::::0;;;;;;;:19;92929:3;::::1;::::0;::::1;:::i;:::-;;;;92897:83;;;;92990:23;93000:3;93005:7;92990:9;:23::i;91578:129::-:0;28272:13;:11;:13::i;:::-;91659:40:::1;91685:3;91691:7;91659:17;:40::i;:::-;91578:129:::0;;:::o;84204:1635::-;84301:17;84333:23;84371:30;;:::i;:::-;84452:8;;84429:20;84492:19;;;:9;:19;;;;;;84522:227;84548:10;84529:15;:29;84522:227;;84575:14;;;;:::i;:::-;;;;84618;;84604:28;;;;;:::i;:::-;84676:11;;84665:23;;;;:10;:23;;;;;:31;84604:28;;-1:-1:-1;84651:45:0;;84522:227;84647:91;84522:227;84763:16;;84759:66;;84796:17;84812:1;84796:17;;:::i;:::-;;;84759:66;84840:9;84835:997;-1:-1:-1;;;;;84859:15:0;;;;;;:7;:15;;;;;:22;84855:26;;84835:997;;;-1:-1:-1;;;;;84936:15:0;;84903:22;84936:15;;;:7;:15;;;;;:18;;84928:7;;84903:22;;84952:1;;84936:18;;;;;;:::i;:::-;;;;;;;;;;;;;84928:27;;;;;;;;;;;;;;;84903:52;;;;;;;;;-1:-1:-1;;;;;84903:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84992:27;;:9;:27;;;;;84903:52;;-1:-1:-1;84974:15:0;:45;84970:91;;;85040:5;;;84970:91;85119:16;;;;;;85075:25;85111;;;:7;:25;;;;;;;;;85103:34;;:7;:34;;;;;85075:62;;;;;;;;;-1:-1:-1;;;;;85075:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85336:16;;85325:28;;:10;:28;;;;;85354:14;;;;;85325:44;;;;;;;;;85238:17;;85219:37;;:18;:37;;;;;85257:14;;85219:53;;85075:62;;:25;;73769:5;;85219:37;85257:14;85219:53;;;;;;:::i;:::-;;;;;;;;;85170:11;:29;85182:7;:16;;;85170:29;;;;;;;;;;;;:102;;;;:::i;:::-;85169:136;;;;:::i;:::-;:200;;;;:::i;:::-;85152:217;;85407:10;:18;;;85388:7;:15;;;:37;85384:244;;85554:17;;;;85535:37;;;;:18;:37;;;;;:40;;73769:5;;85535:37;:40;;;;:::i;:::-;;;;;;;;;85478:11;:29;85490:7;:16;;;85478:29;;;;;;;;;;;;:97;;;;:::i;:::-;85477:135;;;;:::i;:::-;85446:166;;;;:::i;:::-;;;85384:244;85642:19;85655:6;85642:19;;:::i;:::-;;;85700:12;85680:7;:16;;;:32;85676:145;;85733:25;85752:6;85733:25;;:::i;:::-;;;85795:10;85777:28;;85676:145;84888:944;;;84883:3;;;;;:::i;:::-;;;;84835:997;;;;84418:1421;;84204:1635;;;;;:::o;83899:297::-;-1:-1:-1;;;;;84045:15:0;;;;;;:7;:15;;;;;:22;83981:23;;-1:-1:-1;;;;;84031:37:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;84022:46;;84084:9;84079:110;84103:6;:13;84099:1;:17;84079:110;;;-1:-1:-1;;;;;84158:15:0;;84150:27;84158:15;;;:7;:15;;;;;:18;;84150:7;;:27;84158:15;84174:1;;84158:18;;;;;;:::i;:::-;;;;;;;;;;;;;84150:27;;;;;;;;;;;;;;;84138:39;;;;;;;;;-1:-1:-1;;;;;84138:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;;:6;;84145:1;;84138:9;;;;;;:::i;:::-;;;;;;:39;;;;84118:3;;;;;:::i;:::-;;;;84079:110;;;;83899:297;;;:::o;53823:335::-;54018:41;27017:10;54051:7;54018:18;:41::i;:::-;54010:99;;;;-1:-1:-1;;;54010:99:0;;;;;;;:::i;:::-;54122:28;54132:4;54138:2;54142:7;54122:9;:28::i;77507:1294::-;28272:13;:11;:13::i;:::-;77761:1:::1;77743:15;:19;:57;;;;;77799:1;77783:13;:17;77743:57;:115;;;;;77849:9;;77821:17;:24;:37;77743:115;:175;;;;;77909:9;;77879:19;:26;:39;77743:175;77721:272;;;::::0;-1:-1:-1;;;77721:272:0;;21563:2:1;77721:272:0::1;::::0;::::1;21545:21:1::0;21602:2;21582:18;;;21575:30;21641:34;21621:18;;;21614:62;-1:-1:-1;;;21692:18:1;;;21685:45;21747:19;;77721:272:0::1;21361:411:1::0;77721:272:0::1;78009:9;78004:520;78028:9;;78024:1;:13;78004:520;;;78118:9;::::0;:13:::1;::::0;78130:1:::1;78118:13;:::i;:::-;78085:19;78105:1;78085:22;;;;;;;;:::i;:::-;;;;;;;:29;:46;78059:140;;;::::0;-1:-1:-1;;;78059:140:0;;21979:2:1;78059:140:0::1;::::0;::::1;21961:21:1::0;;;21998:18;;;21991:30;22057:34;22037:18;;;22030:62;22109:18;;78059:140:0::1;21777:356:1::0;78059:140:0::1;78214:16;78254:9:::0;78249:132:::1;78273:19;78293:1;78273:22;;;;;;;;:::i;:::-;;;;;;;:29;78269:1;:33;78249:132;;;78340:19;78360:1;78340:22;;;;;;;;:::i;:::-;;;;;;;78363:1;78340:25;;;;;;;;:::i;:::-;;;;;;;78328:37;;;;;:::i;:::-;::::0;-1:-1:-1;78304:3:0;::::1;::::0;::::1;:::i;:::-;;;;78249:132;;;;73769:5;78421:8;:24;78395:117;;;::::0;-1:-1:-1;;;78395:117:0;;22340:2:1;78395:117:0::1;::::0;::::1;22322:21:1::0;22379:2;22359:18;;;22352:30;22418:33;22398:18;;;22391:61;22469:18;;78395:117:0::1;22138:355:1::0;78395:117:0::1;-1:-1:-1::0;78039:3:0;::::1;::::0;::::1;:::i;:::-;;;;78004:520;;;-1:-1:-1::0;78534:14:0::1;:32:::0;;;78577:12:::1;:28:::0;;;-1:-1:-1;78616:178:0::1;78640:9;;78636:1;:13;78616:178;;;78697:17;78715:1;78697:20;;;;;;;;:::i;:::-;;;;;;;78671:16;:23;78688:1;78692;78688:5;;;;:::i;:::-;78671:23;;;;;;;;;;;:46;;;;78760:19;78780:1;78760:22;;;;;;;;:::i;:::-;;;;;;;78732:18;:25;78751:1;78755;78751:5;;;;:::i;:::-;78732:25;;;;;;;;;;;:50;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;78651:3:0;::::1;::::0;::::1;:::i;:::-;;;;78616:178;;;;77507:1294:::0;;;;:::o;74769:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;79532:4359::-;79732:9;;79722:6;79694:25;:15;10558:14;;10466:114;79694:25;:34;;;;:::i;:::-;:47;;79672:127;;;;-1:-1:-1;;;79672:127:0;;;;;;;:::i;:::-;79810:17;79842:165;79862:11;;79849:9;:24;79842:165;;79925:21;;;;:10;:21;;;;;:29;79907:15;:47;79975:5;79903:93;79875:11;;;;:::i;:::-;;;;79842:165;;;80037:1;80025:9;:13;80017:48;;;;-1:-1:-1;;;80017:48:0;;23059:2:1;80017:48:0;;;23041:21:1;23098:2;23078:18;;;23071:30;-1:-1:-1;;;23117:18:1;;;23110:52;23179:18;;80017:48:0;22857:346:1;80017:48:0;80097:11;;80084:9;:24;;80076:59;;;;-1:-1:-1;;;80076:59:0;;23410:2:1;80076:59:0;;;23392:21:1;23449:2;23429:18;;;23422:30;-1:-1:-1;;;23468:18:1;;;23461:52;23530:18;;80076:59:0;23208:346:1;80076:59:0;80169:21;;;;:10;:21;;;;;:34;;;;;80168:35;;:103;;;80224:47;80239:9;80250:10;80262:8;;80224:14;:47::i;:::-;80146:177;;;;-1:-1:-1;;;80146:177:0;;23761:2:1;80146:177:0;;;23743:21:1;23800:2;23780:18;;;23773:30;23839:26;23819:18;;;23812:54;23883:18;;80146:177:0;23559:348:1;80146:177:0;80367:9;;80356:7;:20;;:44;;;;;80391:9;;80380:7;:20;;80356:44;80334:118;;;;-1:-1:-1;;;80334:118:0;;24114:2:1;80334:118:0;;;24096:21:1;24153:2;24133:18;;;24126:30;24192:26;24172:18;;;24165:54;24236:18;;80334:118:0;23912:348:1;80334:118:0;80480:1;80471:6;:10;80463:44;;;;-1:-1:-1;;;80463:44:0;;19256:2:1;80463:44:0;;;19238:21:1;19295:2;19275:18;;;19268:30;-1:-1:-1;;;19314:18:1;;;19307:51;19375:18;;80463:44:0;19054:345:1;80463:44:0;80602:21;;;;:10;:21;;;;;;;;:27;;;80540:9;:20;;;;;80561:10;80540:32;;;;;;;;;:41;;80575:6;;80540:41;:::i;:::-;:89;;80518:178;;;;-1:-1:-1;;;80518:178:0;;;;;;;:::i;:::-;80707:17;80775:21;;;:10;:21;;;;;;;;:26;;;80727:9;:20;;;;;80748:10;80727:32;;;;;;;;:74;:235;;80961:1;80727:235;;;80873:20;;;;:9;:20;;;;;;;;80894:10;80873:32;;;;;;;;80844:21;;;:10;:21;;;;;;:26;;;80817:128;;80844:61;;;:::i;:::-;80924:6;80817:8;:128::i;:::-;80707:255;-1:-1:-1;80973:17:0;80993:18;80707:255;80993:6;:18;:::i;:::-;81440:21;;;;:10;:21;;;;;:27;;;80973:38;;-1:-1:-1;81440:39:0;;80973:38;;81440:39;:::i;:::-;81427:9;:52;;81405:129;;;;-1:-1:-1;;;81405:129:0;;24875:2:1;81405:129:0;;;24857:21:1;24914:2;24894:18;;;24887:30;24953:29;24933:18;;;24926:57;25000:18;;81405:129:0;24673:351:1;81405:129:0;81568:8;;81587:148;81623:8;;81613:19;;;;:9;:19;;;;;;81594:15;:38;81587:148;;81709:14;;81697:8;;81687:19;;;;:9;:19;;;;;;:36;;81709:14;81687:36;:::i;:::-;81661:9;:23;81671:8;;81682:1;81671:12;;;;:::i;:::-;81661:23;;;;;;;;;;;:62;;;;81634:8;;:10;;;;;;;;;:::i;:::-;;;;;;81587:148;;;81763:9;:16;:21;;:67;;-1:-1:-1;81822:8:0;;81788:9;81798:16;;:20;;81817:1;;81798:20;:::i;:::-;81788:31;;;;;;;;:::i;:::-;;;;;;;;;:42;81763:67;81745:148;;;81872:8;;81857:9;:24;;;;;;;-1:-1:-1;81857:24:0;;;;;;;81745:148;81903:20;;;;:9;:20;;;;;;;;81924:10;81903:32;;;;;;;:42;;81939:6;;81903:20;:42;;81939:6;;81903:42;:::i;:::-;;;;-1:-1:-1;;82014:21:0;;;;:10;:21;;;;;;;;:27;;;81978:9;:20;;;;;81999:10;81978:32;;;;;;;;;:63;;81956:152;;;;-1:-1:-1;;;81956:152:0;;;;;;;:::i;:::-;82151:12;;82142:21;;:6;:21;:::i;:::-;82129:8;;82119:19;;;;:9;:19;;;;;:44;;:19;;;:44;;;;;:::i;:::-;;;;-1:-1:-1;;82186:8:0;;82178:17;;;;:7;:17;;;;;;:22;:42;;;;;82219:1;82204:12;:16;82178:42;82174:511;;;82254:9;;82237:437;82270:9;;82265:1;:14;82237:437;;82309:24;;;;:10;:24;;;;;;;;:27;;;;;;;;;:32;;82305:354;;82474:121;82535:21;;;:7;:21;;;;;;;;;82527:30;;:7;:30;;;;;:37;;;82474:121;;:18;:121;;;;;:124;;73769:5;;82474:121;82596:1;;82474:124;;;;;;:::i;:::-;;;;;;;;;82417:11;:25;82429:12;82417:25;;;;;;;;;;;;:181;;;;:::i;:::-;82416:223;;;;:::i;:::-;82378:8;;82366:21;;;;:11;:21;;;;;:273;;:21;;;:273;;;;;:::i;:::-;;;;-1:-1:-1;;82305:354:0;82281:3;;;;:::i;:::-;;;;82237:437;;;;82174:511;82695:19;82786:25;;;:16;:25;;;;;;;;;82743:21;;;:10;:21;;;;;:27;;;73769:5;;82786:25;82718:52;;:9;:52;:::i;:::-;:93;;;;:::i;:::-;82717:110;;;;:::i;:::-;82695:132;;82863:11;82838;:21;82850:8;;82838:21;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;82901:11;82885:12;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;82934:8:0;;82923:20;;;;:10;:20;;;;;;;;:29;;;;;;;;:39;;82956:6;;82923:20;:39;;82956:6;;82923:39;:::i;:::-;;;;;;;;82986:6;82973:9;;:19;;;;;;;:::i;:::-;;;;;;;;83017:9;83003:10;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;83042:9:0;;-1:-1:-1;83037:847:0;83061:6;83057:1;:10;83037:847;;;83089:27;:15;10677:19;;10695:1;10677:19;;;10588:127;83089:27;83131:15;83149:25;:15;10558:14;;10466:114;83149:25;83131:43;;83208:9;;83197:7;:20;;83189:63;;;;-1:-1:-1;;;83189:63:0;;;;;;;:::i;:::-;83267:14;83288:9;83284:1;:13;:47;;83304:21;;;;:10;:21;;;;;:27;;;83284:47;;;83300:1;83284:47;83267:64;;83365:155;;;;;;;;83391:10;-1:-1:-1;;;;;83365:155:0;;;;;83420:6;83365:155;;;;83445:7;83365:155;;;;83471:7;83365:155;;;;83497:8;;83365:155;;;83346:7;:16;83354:7;83346:16;;;;;;;;;;;:174;;;;;;;;;;;;;-1:-1:-1;;;;;83346:174:0;;;;;-1:-1:-1;;;;;83346:174:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83535:11;:31;83556:1;83547:6;:10;:18;;83564:1;83547:18;;;83560:1;83547:18;83535:31;;;;;;;;;;;;;;;;-1:-1:-1;83535:31:0;;;:45;;;;;;;;;;;;;;;;;;83603:10;83595:19;;;:7;:19;;;;;:33;;;;;;;;;;;;;;;;;;83651:8;;;83643:17;;:7;:17;;;;;;:27;;;83849:8;;83690:182;;25231:25:1;;;25272:18;;;25265:34;;;25315:18;;;25308:34;83690:182:0;;83535:45;;83744:7;;83603:10;83690:182;;;;;25219:2:1;83690:182:0;;;83074:810;;83069:3;;;;;:::i;:::-;;;;83037:847;;;;79661:4230;;;;;79532:4359;;;;:::o;67857:256::-;67954:7;67990:23;68007:5;67990:16;:23::i;:::-;67982:5;:31;67974:87;;;;-1:-1:-1;;;67974:87:0;;25555:2:1;67974:87:0;;;25537:21:1;25594:2;25574:18;;;25567:30;25633:34;25613:18;;;25606:62;-1:-1:-1;;;25684:18:1;;;25677:41;25735:19;;67974:87:0;25353:407:1;67974:87:0;-1:-1:-1;;;;;;68079:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;67857:256::o;89461:533::-;89505:16;89551:1;89534:453;89559:8;;89554:1;:13;89534:453;;89612:12;;;;:9;:12;;;;;;89593:15;:31;;;;:50;;-1:-1:-1;89628:10:0;;;;:7;:10;;;;;;:15;;89593:50;89589:387;;;89664:32;89748:10;;;:7;:10;;;;;;;;;89740:19;;:7;:19;;;;;:26;;;89699:86;;:18;:86;;;;;89664:121;;;;;;;;;;;;;;;;;;;89699:86;;89664:121;;;89699:86;89664:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73769:5;89880:15;89921:1;89896:15;:22;:26;;;;:::i;:::-;89880:43;;;;;;;;:::i;:::-;;;;;;;89838:11;:14;89850:1;89838:14;;;;;;;;;;;;:85;;;;:::i;:::-;89837:123;;;;:::i;:::-;89804:156;;;;:::i;:::-;;;89645:331;89589:387;89569:3;;;;:::i;:::-;;;;89534:453;;;;89461:533;:::o;54229:185::-;54367:39;54384:4;54390:2;54394:7;54367:39;;;;;;;;;;;;:16;:39::i;78809:98::-;28272:13;:11;:13::i;:::-;78874:15:::1;:25:::0;;-1:-1:-1;;78874:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;78809:98::o;76064:1067::-;28272:13;:11;:13::i;:::-;76370:1:::1;76351:9;:16;:20;:75;;;;;76412:7;:14;76392:9;:16;:34;76351:75;:130;;;;;76467:7;:14;76447:9;:16;:34;76351:130;:184;;;;;76522:6;:13;76502:9;:16;:33;76351:184;:246;;;;;76576:14;:21;76556:9;:16;:41;76351:246;76329:324;;;::::0;-1:-1:-1;;;76329:324:0;;25967:2:1;76329:324:0::1;::::0;::::1;25949:21:1::0;26006:2;25986:18;;;25979:30;26045;26025:18;;;26018:58;26093:18;;76329:324:0::1;25765:352:1::0;76329:324:0::1;76678:16:::0;;76664:11:::1;:30:::0;76705:13:::1;::::0;;;:10:::1;:13;::::0;;:34;;;76750:263:::1;76774:11;;76770:1;:15;76750:263;;;76827:174;;;;;;;;76852:9;76862:1;76852:12;;;;;;;;:::i;:::-;;;;;;;76827:174;;;;76883:7;76891:1;76883:10;;;;;;;;:::i;:::-;;;;;;;76827:174;;;;76912:7;76920:1;76912:10;;;;;;;;:::i;:::-;;;;;;;76827:174;;;;76941:6;76948:1;76941:9;;;;;;;;:::i;:::-;;;;;;;76827:174;;;;76969:14;76984:1;76969:17;;;;;;;;:::i;:::-;;;;;;;76827:174;;;;::::0;76807:10:::1;:17;76818:1;76822;76818:5;;;;:::i;:::-;76807:17:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;76807:17:0;:194;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;76807:194:0::1;::::0;::::1;;::::0;;;::::1;::::0;;76787:3;::::1;::::0;::::1;:::i;:::-;;;;76750:263;;;;77053:34;;;;;;;;77060:10;77053:34;;;;77072:1;77053:34;;;;77075:1;77053:34;;;;77078:1;77053:34;;;;77081:5;77053:34;;;;::::0;77023:10:::1;:27;77034:11;;77048:1;77034:15;;;;:::i;:::-;77023:27:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;77023:27:0;;;:64;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;77023:64:0::1;::::0;::::1;;::::0;;;::::1;::::0;;77098:12;;;:9:::1;:12:::0;;-1:-1:-1;;;77098:12:0;:25;;;;-1:-1:-1;;76064:1067:0:o;90002:394::-;90040:17;90065:21;90075:10;90065:9;:21::i;:::-;-1:-1:-1;;90146:10:0;90097:19;90131:26;;;:14;:26;;;;;;90039:47;;-1:-1:-1;90097:19:0;90119:38;;90039:47;90119:38;:::i;:::-;90097:60;;90190:1;90176:11;:15;90168:60;;;;-1:-1:-1;;;90168:60:0;;26324:2:1;90168:60:0;;;26306:21:1;;;26343:18;;;26336:30;26402:34;26382:18;;;26375:62;26454:18;;90168:60:0;26122:356:1;90168:60:0;90254:10;90239:26;;;;:14;:26;;;;;:41;;90269:11;;90239:26;:41;;90269:11;;90239:41;:::i;:::-;;;;-1:-1:-1;90291:51:0;;-1:-1:-1;90317:10:0;90330:11;90291:17;:51::i;:::-;90358:30;;2324:25:1;;;90364:10:0;;90358:30;;2312:2:1;2297:18;90358:30:0;;;;;;;90028:368;;90002:394::o;68379:233::-;68454:7;68490:30;68277:10;:17;;68189:113;68490:30;68482:5;:38;68474:95;;;;-1:-1:-1;;;68474:95:0;;26685:2:1;68474:95:0;;;26667:21:1;26724:2;26704:18;;;26697:30;26763:34;26743:18;;;26736:62;-1:-1:-1;;;26814:18:1;;;26807:42;26866:19;;68474:95:0;26483:408:1;68474:95:0;68587:10;68598:5;68587:17;;;;;;;;:::i;:::-;;;;;;;;;68580:24;;68379:233;;;:::o;90404:626::-;90480:15;;90442:17;;90480:15;;90472:55;;;;-1:-1:-1;;;90472:55:0;;27098:2:1;90472:55:0;;;27080:21:1;27137:2;27117:18;;;27110:30;27176:29;27156:18;;;27149:57;27223:18;;90472:55:0;26896:351:1;90472:55:0;90594:10;90586:19;;;;:7;:19;;;;;;;;:26;90560:11;:23;;;;;;;:52;90538:122;;;;-1:-1:-1;;;90538:122:0;;27454:2:1;90538:122:0;;;27436:21:1;27493:2;27473:18;;;27466:30;-1:-1:-1;;;27512:18:1;;;27505:50;27572:18;;90538:122:0;27252:344:1;90538:122:0;90676:9;90671:305;90703:10;90695:19;;;;:7;:19;;;;;:26;90691:30;;90671:305;;;90769:10;90743:15;90761:19;;;:7;:19;;;;;:22;;90781:1;;90761:22;;;;;;:::i;:::-;;;;;;;;;90743:40;;90803:16;90811:7;56610:4;56208:16;;;:7;:16;;;;;;-1:-1:-1;;;;;56208:16:0;56634:31;;;56545:128;90803:16;90798:167;;90840:26;90846:10;90858:7;90840:5;:26::i;:::-;90890:29;;2324:25:1;;;90899:10:0;;90890:29;;2312:2:1;2297:18;90890:29:0;;;;;;;90938:11;;;;:::i;:::-;;;;90798:167;-1:-1:-1;90723:3:0;;;;:::i;:::-;;;;90671:305;;;-1:-1:-1;90998:10:0;90986:23;;;;:11;:23;;;;;:36;;91013:9;;90986:23;:36;;91013:9;;90986:36;:::i;:::-;;;;;;;;90404:626;:::o;51321:223::-;51393:7;56208:16;;;:7;:16;;;;;;-1:-1:-1;;;;;56208:16:0;;51457:56;;;;-1:-1:-1;;;51457:56:0;;27803:2:1;51457:56:0;;;27785:21:1;27842:2;27822:18;;;27815:30;-1:-1:-1;;;27861:18:1;;;27854:54;27925:18;;51457:56:0;27601:348:1;74472:48:0;;;;;;;;;;;;;;;;;;;;51052:207;51124:7;-1:-1:-1;;;;;51152:19:0;;51144:73;;;;-1:-1:-1;;;51144:73:0;;28156:2:1;51144:73:0;;;28138:21:1;28195:2;28175:18;;;28168:30;28234:34;28214:18;;;28207:62;-1:-1:-1;;;28285:18:1;;;28278:39;28334:19;;51144:73:0;27954:405:1;51144:73:0;-1:-1:-1;;;;;;51235:16:0;;;;;:9;:16;;;;;;;51052:207::o;29034:103::-;28272:13;:11;:13::i;:::-;29099:30:::1;29126:1;29099:18;:30::i;:::-;29034:103::o:0;91715:857::-;28272:13;:11;:13::i;:::-;91890:9:::1;::::0;91875:11;;91847:15:::1;10558:14:::0;91847:39:::1;;;;:::i;:::-;:52;;91825:132;;;;-1:-1:-1::0;;;91825:132:0::1;;;;;;;:::i;:::-;91990:1;91976:4;:11;:15;91968:56;;;::::0;-1:-1:-1;;;91968:56:0;;25967:2:1;91968:56:0::1;::::0;::::1;25949:21:1::0;26006:2;25986:18;;;25979:30;26045;26025:18;;;26018:58;26093:18;;91968:56:0::1;25765:352:1::0;91968:56:0::1;92068:9;;92057:7;:20;;:44;;;;;92092:9;;92081:7;:20;;92057:44;92035:114;;;::::0;-1:-1:-1;;;92035:114:0;;19606:2:1;92035:114:0::1;::::0;::::1;19588:21:1::0;19645:2;19625:18;;;19618:30;-1:-1:-1;;;19664:18:1;;;19657:50;19724:18;;92035:114:0::1;19404:344:1::0;92035:114:0::1;92165:9;92160:405;92184:4;:11;92180:1;:15;92160:405;;;92217:27;:15;10677:19:::0;;10695:1;10677:19;;;10588:127;92217:27:::1;92259:15;92277:25;:15;10558:14:::0;;10466:114;92277:25:::1;92259:43;;92336:9;;92325:7;:20;;92317:63;;;;-1:-1:-1::0;;;92317:63:0::1;;;;;;;:::i;:::-;92414:45;;;;;;;;92422:4;92427:1;92422:7;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;92414:45:0;;::::1;::::0;;92431:1:::1;92414:45:::0;;::::1;::::0;;;;;;;;;;;;;;;;;92452:6:::1;92414:45:::0;;;;;92395:16;;;:7:::1;:16:::0;;;;;;:64;;;;-1:-1:-1;;;;;;92395:64:0::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;-1:-1:-1;92395:64:0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;92480:7;;92474:23:::1;::::0;92480:7;;92485:1;;92480:7;::::1;;;;;:::i;:::-;;;;;;;92489;92474:5;:23::i;:::-;92545:7;92536;92527:4;92532:1;92527:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;92517:36:0::1;;;;;;;;;;;-1:-1:-1::0;92197:3:0;::::1;::::0;::::1;:::i;:::-;;;;92160:405;;91038:532:::0;91174:17;28272:13;:11;:13::i;:::-;91235:11;91204:359:::1;91265:21;91279:7:::0;91265:11;:21:::1;:::i;:::-;91261:1;:25;:62;;;;-1:-1:-1::0;91294:22:0::1;::::0;;;:11:::1;:22;::::0;;;;:29;91290:33;::::1;91261:62;91204:359;;;91368:15;91386:22:::0;;;:11:::1;:22;::::0;;;;:25;;91409:1;;91386:25;::::1;;;;;:::i;:::-;;;;;;;;;91368:43;;91431:16;91439:7;56610:4:::0;56208:16;;;:7;:16;;;;;;-1:-1:-1;;;;;56208:16:0;56634:31;;;56545:128;91431:16:::1;91426:126;;91474:16;::::0;;;:7:::1;:16;::::0;;;;:22;91468:38:::1;::::0;-1:-1:-1;;;;;91474:22:0::1;91482:7:::0;91468:5:::1;:38::i;:::-;91525:11:::0;::::1;::::0;::::1;:::i;:::-;;;;91426:126;-1:-1:-1::0;91338:3:0;::::1;::::0;::::1;:::i;:::-;;;;91204:359;;;;91038:532:::0;;;;;:::o;85847:388::-;85920:20;85942:27;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85942:27:0;86007:1;85992:16;;85987:190;86026:11;;86010:12;:27;85987:190;;86092:24;;;;:10;:24;;;;;:32;86074:15;:50;86145:5;86070:96;86039:14;;;;:::i;:::-;;;;85987:190;;;-1:-1:-1;86203:24:0;;;;:10;:24;;;;;;;;;86187:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86214:12;;85847:388::o;51780:104::-;51836:13;51869:7;51862:14;;;;;:::i;77139:360::-;28272:13;:11;:13::i;:::-;77291:1:::1;77278:10;:14;:43;;;;;77310:11;;77296:10;:25;;77278:43;77256:122;;;::::0;-1:-1:-1;;;77256:122:0;;28566:2:1;77256:122:0::1;::::0;::::1;28548:21:1::0;28605:2;28585:18;;;28578:30;28644:31;28624:18;;;28617:59;28693:18;;77256:122:0::1;28364:353:1::0;77256:122:0::1;77412:1;77397:16:::0;;;77389:54:::1;;;::::0;-1:-1:-1;;;77389:54:0;;28924:2:1;77389:54:0::1;::::0;::::1;28906:21:1::0;28963:2;28943:18;;;28936:30;29002:27;28982:18;;;28975:55;29047:18;;77389:54:0::1;28722:349:1::0;77389:54:0::1;77454:23;::::0;;;:11:::1;:23;::::0;;;;;:37;77139:360::o;53366:155::-;53461:52;27017:10;53494:8;53504;53461:18;:52::i;74867:26::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74867:26:0;:::o;54485:322::-;54659:41;27017:10;54692:7;54659:18;:41::i;:::-;54651:99;;;;-1:-1:-1;;;54651:99:0;;;;;;;:::i;:::-;54761:38;54775:4;54781:2;54785:7;54794:4;54761:13;:38::i;:::-;54485:322;;;;:::o;51955:281::-;52028:13;52054:23;52069:7;52054:14;:23::i;:::-;52090:21;52114:10;52562:9;;;;;;;;;-1:-1:-1;52562:9:0;;;52485:94;52114:10;52090:34;;52166:1;52148:7;52142:21;:25;:86;;;;;;;;;;;;;;;;;52194:7;52203:18;:7;:16;:18::i;:::-;52177:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52142:86;52135:93;51955:281;-1:-1:-1;;;51955:281:0:o;86243:1287::-;86504:8;;86329:19;86536:22;;;:9;:22;;;;;;;86432:30;86569:226;86595:10;86576:15;:29;86569:226;;86622:13;;;;:::i;:::-;;;;86664:14;;86650:28;;;;;:::i;:::-;86722:11;;86711:23;;;;:10;:23;;;;;:31;86650:28;;-1:-1:-1;86697:45:0;;86569:226;86693:91;86569:226;86821:24;;;;:11;:24;;;;;;;;86860:7;:20;;;;;;;86821:24;;-1:-1:-1;86860:25:0;:41;;;;;86900:1;86889:8;;:12;86860:41;86856:490;;;86935:9;;86918:417;86951:9;;86946:1;:14;86918:417;;87001:8;;86990:20;;;;:10;:20;;;;;;;;:23;;;;;;;;;:28;;86986:334;;87208:8;;87139:117;87200:17;;;:7;:17;;;;;;;;;87192:26;;:7;:26;;;;;:33;;;87139:117;;:18;:117;;;;;:120;;73769:5;;87139:117;87257:1;;87139:120;;;;;;:::i;:::-;;;;;;;;;87086:11;:21;87098:8;;87086:21;;;;;;;;;;;;:173;;;;:::i;:::-;87085:215;;;;:::i;:::-;87043:257;;;;:::i;:::-;;;86986:334;86962:3;;;;:::i;:::-;;;;86918:417;;;;86856:490;87386:9;;-1:-1:-1;;;;;87372:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;87372:24:0;;87356:40;;87412:9;87407:116;87431:9;;87427:1;:13;87407:116;;;87481:23;;;;:10;:23;;;;;;87505:5;:1;87509;87505:5;:::i;:::-;87481:30;;;;;;;;;;;;87462:13;87476:1;87462:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;87442:3;;;;:::i;:::-;;;;87407:116;;;;86243:1287;;;;:::o;78915:609::-;79059:4;79111:1;79098:10;:14;:43;;;;;79130:11;;79116:10;:25;;79098:43;79076:115;;;;-1:-1:-1;;;79076:115:0;;29779:2:1;79076:115:0;;;29761:21:1;29818:2;29798:18;;;29791:30;-1:-1:-1;;;29837:18:1;;;29830:52;29899:18;;79076:115:0;29577:346:1;79076:115:0;79224:22;;;;:10;:22;;;;;:35;;;;;79202:127;;;;-1:-1:-1;;;79202:127:0;;30130:2:1;79202:127:0;;;30112:21:1;30169:2;30149:18;;;30142:30;30208:34;30188:18;;;30181:62;-1:-1:-1;;;30259:18:1;;;30252:40;30309:19;;79202:127:0;29928:406:1;79202:127:0;79360:156;79397:8;;79360:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79424:23:0;;;:11;:23;;;;;;;;;;79476:24;;79424:23;;-1:-1:-1;79476:24:0;;-1:-1:-1;79493:6:0;;-1:-1:-1;79476:24:0;30488:2:1;30484:15;;;;-1:-1:-1;;30480:53:1;30468:66;;30559:2;30550:12;;30339:229;79476:24:0;;;;;;;;;;;;;79466:35;;;;;;79360:18;:156::i;:::-;79340:176;;78915:609;;;;;;;:::o;87538:1915::-;87713:9;:16;87611:28;;;;87758:17;;;;;:91;;-1:-1:-1;87810:9:0;:39;87820:9;87830:17;87846:1;87830:13;:17;:::i;:::-;87820:28;;;;;;;;:::i;:::-;;;;;;;;;87810:39;;;;;;;;;;;;87792:15;:57;87758:91;87740:166;;;87876:18;87893:1;87876:18;;:::i;:::-;;;87740:166;87920:17;;87916:1530;;87982:13;-1:-1:-1;;;;;87968:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;87954:42;;88041:13;-1:-1:-1;;;;;88027:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;88027:28:0;;88011:44;;88075:9;88070:1365;88094:13;88090:1;:17;88070:1365;;;88150:7;:30;88158:7;:21;88166:9;88176:1;88166:12;;;;;;;;:::i;:::-;;;;;;;;;88158:21;;;;;;;;;;;;88150:30;;;;;;;;;;;88133:47;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;88133:47:0;-1:-1:-1;;;;;88133:47:0;-1:-1:-1;;;;;88133:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;88145:1;88133:14;;;;;;;;:::i;:::-;;;;;;:47;;;;88226:9;88199:1221;88266:7;:29;88274:11;88286:1;88274:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:20;-1:-1:-1;;;;;88266:29:0;;;;;;;;;;;88274:20;88266:29;:36;88262:40;;88199:1221;;;88371:22;88396:7;:89;88430:7;:29;88438:11;88450:1;88438:14;;;;;;;;:::i;:::-;;;;;;;:20;;;-1:-1:-1;;;;;88430:29:0;-1:-1:-1;;;;;88430:29:0;;;;;;;;;;;;88460:1;88430:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;88396:89;;;;;;;;;;;;;;;88371:114;;;;;;;;;-1:-1:-1;;;;;88371:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88532:14;;88371:114;;-1:-1:-1;88532:11:0;;88544:1;;88532:14;;;;;;:::i;:::-;;;;;;;:23;;;88512:7;:16;;;:43;88508:893;;88905:10;:28;88916:7;:16;;;88905:28;;;;;;;;;;;:44;88934:7;:14;;;88905:44;;;;;;;;;;;;73769:5;88699:18;:41;88718:11;88730:1;88718:14;;;;;;;;:::i;:::-;;;;;;;:21;;;88699:41;;;;;;;;;;;88779:7;:14;;;88699:129;;;;;;;;:::i;:::-;;;;;;;;;88634:11;:29;88646:7;:16;;;88634:29;;;;;;;;;;;;:194;;;;:::i;:::-;88633:240;;;;:::i;:::-;:316;;;;:::i;:::-;88584:13;88598:1;88584:16;;;;;;;;:::i;:::-;;;;;;:365;;;;;;;:::i;:::-;;;-1:-1:-1;88999:14:0;;:11;;89011:1;;88999:14;;;;;;:::i;:::-;;;;;;;:22;;;88980:7;:15;;;:41;88976:402;;73769:5;89177:18;:41;89196:11;89208:1;89196:14;;;;;;;;:::i;:::-;;;;;;;:21;;;89177:41;;;;;;;;;;;89261:1;89177:124;;;;;;;;:::i;:::-;;;;;;;;;89108:11;:29;89120:7;:16;;;89108:29;;;;;;;;;;;;:193;;;;:::i;:::-;89107:243;;;;:::i;:::-;89054:13;89068:1;89054:16;;;;;;;;:::i;:::-;;;;;;:296;;;;;;;:::i;:::-;;;-1:-1:-1;88976:402:0;-1:-1:-1;88325:3:0;;;;:::i;:::-;;;;88199:1221;;;-1:-1:-1;88109:3:0;;;;:::i;:::-;;;;88070:1365;;;;87916:1530;87678:1775;87538:1915;;:::o;29292:201::-;28272:13;:11;:13::i;:::-;-1:-1:-1;;;;;29381:22:0;::::1;29373:73;;;::::0;-1:-1:-1;;;29373:73:0;;30775:2:1;29373:73:0::1;::::0;::::1;30757:21:1::0;30814:2;30794:18;;;30787:30;30853:34;30833:18;;;30826:62;-1:-1:-1;;;30904:18:1;;;30897:36;30950:19;;29373:73:0::1;30573:402:1::0;29373:73:0::1;29457:28;29476:8;29457:18;:28::i;:::-;29292:201:::0;:::o;74372:44::-;;;;;;;;;;;;;;;;;;;;50683:305;50785:4;-1:-1:-1;;;;;;50822:40:0;;-1:-1:-1;;;50822:40:0;;:105;;-1:-1:-1;;;;;;;50879:48:0;;-1:-1:-1;;;50879:48:0;50822:105;:158;;;-1:-1:-1;;;;;;;;;;42224:40:0;;;50944:36;42115:157;62942:135;56610:4;56208:16;;;:7;:16;;;;;;-1:-1:-1;;;;;56208:16:0;63016:53;;;;-1:-1:-1;;;63016:53:0;;27803:2:1;63016:53:0;;;27785:21:1;27842:2;27822:18;;;27815:30;-1:-1:-1;;;27861:18:1;;;27854:54;27925:18;;63016:53:0;27601:348:1;62221:174:0;62296:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;62296:29:0;-1:-1:-1;;;;;62296:29:0;;;;;;;;:24;;62350:23;62296:24;62350:14;:23::i;:::-;-1:-1:-1;;;;;62341:46:0;;;;;;;;;;;62221:174;;:::o;28551:132::-;28459:6;;-1:-1:-1;;;;;28459:6:0;27017:10;28615:23;28607:68;;;;-1:-1:-1;;;28607:68:0;;31182:2:1;28607:68:0;;;31164:21:1;;;31201:18;;;31194:30;31260:34;31240:18;;;31233:62;31312:18;;28607:68:0;30980:356:1;32345:317:0;32460:6;32435:21;:31;;32427:73;;;;-1:-1:-1;;;32427:73:0;;31543:2:1;32427:73:0;;;31525:21:1;31582:2;31562:18;;;31555:30;31621:31;31601:18;;;31594:59;31670:18;;32427:73:0;31341:353:1;32427:73:0;32514:12;32532:9;-1:-1:-1;;;;;32532:14:0;32554:6;32532:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32513:52;;;32584:7;32576:78;;;;-1:-1:-1;;;32576:78:0;;32111:2:1;32576:78:0;;;32093:21:1;32150:2;32130:18;;;32123:30;32189:34;32169:18;;;32162:62;32260:28;32240:18;;;32233:56;32306:19;;32576:78:0;31909:422:1;56840:264:0;56933:4;56950:13;56966:23;56981:7;56966:14;:23::i;:::-;56950:39;;57019:5;-1:-1:-1;;;;;57008:16:0;:7;-1:-1:-1;;;;;57008:16:0;;:52;;;-1:-1:-1;;;;;;53713:25:0;;;53689:4;53713:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;57028:32;57008:87;;;;57088:7;-1:-1:-1;;;;;57064:31:0;:20;57076:7;57064:11;:20::i;:::-;-1:-1:-1;;;;;57064:31:0;;57000:96;56840:264;-1:-1:-1;;;;56840:264:0:o;60839:1263::-;60998:4;-1:-1:-1;;;;;60971:31:0;:23;60986:7;60971:14;:23::i;:::-;-1:-1:-1;;;;;60971:31:0;;60963:81;;;;-1:-1:-1;;;60963:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61063:16:0;;61055:65;;;;-1:-1:-1;;;61055:65:0;;32944:2:1;61055:65:0;;;32926:21:1;32983:2;32963:18;;;32956:30;33022:34;33002:18;;;32995:62;-1:-1:-1;;;33073:18:1;;;33066:34;33117:19;;61055:65:0;32742:400:1;61055:65:0;61133:42;61154:4;61160:2;61164:7;61173:1;61133:20;:42::i;:::-;61305:4;-1:-1:-1;;;;;61278:31:0;:23;61293:7;61278:14;:23::i;:::-;-1:-1:-1;;;;;61278:31:0;;61270:81;;;;-1:-1:-1;;;61270:81:0;;;;;;;:::i;:::-;61423:24;;;;:15;:24;;;;;;;;61416:31;;-1:-1:-1;;;;;;61416:31:0;;;;;;-1:-1:-1;;;;;61899:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;61899:20:0;;;61934:13;;;;;;;;;:18;;61416:31;61934:18;;;61974:16;;;:7;:16;;;;;;:21;;;;;;;;;;62013:27;;61439:7;;62013:27;;;52711:346;52641:416;;:::o;11697:106::-;11755:7;11786:1;11782;:5;:13;;11794:1;11782:13;;;-1:-1:-1;11790:1:0;;11775:20;-1:-1:-1;11697:106:0:o;58438:942::-;-1:-1:-1;;;;;58518:16:0;;58510:61;;;;-1:-1:-1;;;58510:61:0;;33349:2:1;58510:61:0;;;33331:21:1;;;33368:18;;;33361:30;33427:34;33407:18;;;33400:62;33479:18;;58510:61:0;33147:356:1;58510:61:0;56610:4;56208:16;;;:7;:16;;;;;;-1:-1:-1;;;;;56208:16:0;56634:31;58582:58;;;;-1:-1:-1;;;58582:58:0;;33710:2:1;58582:58:0;;;33692:21:1;33749:2;33729:18;;;33722:30;33788;33768:18;;;33761:58;33836:18;;58582:58:0;33508:352:1;58582:58:0;58653:48;58682:1;58686:2;58690:7;58699:1;58653:20;:48::i;:::-;56610:4;56208:16;;;:7;:16;;;;;;-1:-1:-1;;;;;56208:16:0;56634:31;58791:58;;;;-1:-1:-1;;;58791:58:0;;33710:2:1;58791:58:0;;;33692:21:1;33749:2;33729:18;;;33722:30;33788;33768:18;;;33761:58;33836:18;;58791:58:0;33508:352:1;58791:58:0;-1:-1:-1;;;;;59198:13:0;;;;;;:9;:13;;;;;;;;:18;;59215:1;59198:18;;;59240:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;59240:21:0;;;;;59279:33;59248:7;;59198:13;;59279:33;;59198:13;;59279:33;91578:129;;:::o;29653:191::-;29746:6;;;-1:-1:-1;;;;;29763:17:0;;;-1:-1:-1;;;;;;29763:17:0;;;;;;;29796:40;;29746:6;;;29763:17;29746:6;;29796:40;;29727:16;;29796:40;29716:128;29653:191;:::o;62538:315::-;62693:8;-1:-1:-1;;;;;62684:17:0;:5;-1:-1:-1;;;;;62684:17:0;;62676:55;;;;-1:-1:-1;;;62676:55:0;;34067:2:1;62676:55:0;;;34049:21:1;34106:2;34086:18;;;34079:30;34145:27;34125:18;;;34118:55;34190:18;;62676:55:0;33865:349:1;62676:55:0;-1:-1:-1;;;;;62742:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;62742:46:0;;;;;;;;;;62804:41;;540::1;;;62804::0;;513:18:1;62804:41:0;;;;;;;62538:315;;;:::o;55688:313::-;55844:28;55854:4;55860:2;55864:7;55844:9;:28::i;:::-;55891:47;55914:4;55920:2;55924:7;55933:4;55891:22;:47::i;:::-;55883:110;;;;-1:-1:-1;;;55883:110:0;;;;;;;:::i;24364:716::-;24420:13;24471:14;24488:17;24499:5;24488:10;:17::i;:::-;24508:1;24488:21;24471:38;;24524:20;24558:6;-1:-1:-1;;;;;24547:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24547:18:0;-1:-1:-1;24524:41:0;-1:-1:-1;24689:28:0;;;24705:2;24689:28;24746:288;-1:-1:-1;;24778:5:0;-1:-1:-1;;;24915:2:0;24904:14;;24899:30;24778:5;24886:44;24976:2;24967:11;;;-1:-1:-1;24997:21:0;24746:288;24997:21;-1:-1:-1;25055:6:0;24364:716;-1:-1:-1;;;24364:716:0:o;1255:190::-;1380:4;1433;1404:25;1417:5;1424:4;1404:12;:25::i;:::-;:33;;1255:190;-1:-1:-1;;;;1255:190:0:o;68686:915::-;68863:61;68890:4;68896:2;68900:12;68914:9;68863:26;:61::i;:::-;68953:1;68941:9;:13;68937:222;;;69084:63;;-1:-1:-1;;;69084:63:0;;34840:2:1;69084:63:0;;;34822:21:1;34879:2;34859:18;;;34852:30;34918:34;34898:18;;;34891:62;-1:-1:-1;;;34969:18:1;;;34962:51;35030:19;;69084:63:0;34638:417:1;68937:222:0;69189:12;-1:-1:-1;;;;;69218:18:0;;69214:187;;69253:40;69285:7;70428:10;:17;;70401:24;;;;:15;:24;;;;;:44;;;70456:24;;;;;;;;;;;;70324:164;69253:40;69214:187;;;69323:2;-1:-1:-1;;;;;69315:10:0;:4;-1:-1:-1;;;;;69315:10:0;;69311:90;;69342:47;69375:4;69381:7;69342:32;:47::i;:::-;-1:-1:-1;;;;;69415:16:0;;69411:183;;69448:45;69485:7;69448:36;:45::i;:::-;69411:183;;;69521:4;-1:-1:-1;;;;;69515:10:0;:2;-1:-1:-1;;;;;69515:10:0;;69511:83;;69542:40;69570:2;69574:7;69542:27;:40::i;63641:853::-;63795:4;-1:-1:-1;;;;;63816:13:0;;31379:19;:23;63812:675;;63852:71;;-1:-1:-1;;;63852:71:0;;-1:-1:-1;;;;;63852:36:0;;;;;:71;;27017:10;;63903:4;;63909:7;;63918:4;;63852:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63852:71:0;;;;;;;;-1:-1:-1;;63852:71:0;;;;;;;;;;;;:::i;:::-;;;63848:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64093:6;:13;64110:1;64093:18;64089:328;;64136:60;;-1:-1:-1;;;64136:60:0;;;;;;;:::i;64089:328::-;64367:6;64361:13;64352:6;64348:2;64344:15;64337:38;63848:584;-1:-1:-1;;;;;;63974:51:0;-1:-1:-1;;;63974:51:0;;-1:-1:-1;63967:58:0;;63812:675;-1:-1:-1;64471:4:0;64464:11;;21230:922;21283:7;;-1:-1:-1;;;21361:15:0;;21357:102;;-1:-1:-1;;;21397:15:0;;;-1:-1:-1;21441:2:0;21431:12;21357:102;21486:6;21477:5;:15;21473:102;;21522:6;21513:15;;;-1:-1:-1;21557:2:0;21547:12;21473:102;21602:6;21593:5;:15;21589:102;;21638:6;21629:15;;;-1:-1:-1;21673:2:0;21663:12;21589:102;21718:5;21709;:14;21705:99;;21753:5;21744:14;;;-1:-1:-1;21787:1:0;21777:11;21705:99;21831:5;21822;:14;21818:99;;21866:5;21857:14;;;-1:-1:-1;21900:1:0;21890:11;21818:99;21944:5;21935;:14;21931:99;;21979:5;21970:14;;;-1:-1:-1;22013:1:0;22003:11;21931:99;22057:5;22048;:14;22044:66;;22093:1;22083:11;22138:6;21230:922;-1:-1:-1;;21230:922:0:o;2122:296::-;2205:7;2248:4;2205:7;2263:118;2287:5;:12;2283:1;:16;2263:118;;;2336:33;2346:12;2360:5;2366:1;2360:8;;;;;;;;:::i;:::-;;;;;;;2336:9;:33::i;:::-;2321:48;-1:-1:-1;2301:3:0;;;;:::i;:::-;;;;2263:118;;65226:410;65416:1;65404:9;:13;65400:229;;;-1:-1:-1;;;;;65438:18:0;;;65434:87;;-1:-1:-1;;;;;65477:15:0;;;;;;:9;:15;;;;;:28;;65496:9;;65477:15;:28;;65496:9;;65477:28;:::i;:::-;;;;-1:-1:-1;;65434:87:0;-1:-1:-1;;;;;65539:16:0;;;65535:83;;-1:-1:-1;;;;;65576:13:0;;;;;;:9;:13;;;;;:26;;65593:9;;65576:13;:26;;65593:9;;65576:26;:::i;:::-;;;;-1:-1:-1;;65226:410:0;;;;:::o;71115:988::-;71381:22;71431:1;71406:22;71423:4;71406:16;:22::i;:::-;:26;;;;:::i;:::-;71443:18;71464:26;;;:17;:26;;;;;;71381:51;;-1:-1:-1;71597:28:0;;;71593:328;;-1:-1:-1;;;;;71664:18:0;;71642:19;71664:18;;;:12;:18;;;;;;;;:34;;;;;;;;;71715:30;;;;;;:44;;;71832:30;;:17;:30;;;;;:43;;;71593:328;-1:-1:-1;72017:26:0;;;;:17;:26;;;;;;;;72010:33;;;-1:-1:-1;;;;;72061:18:0;;;;;:12;:18;;;;;:34;;;;;;;72054:41;71115:988::o;72398:1079::-;72676:10;:17;72651:22;;72676:21;;72696:1;;72676:21;:::i;:::-;72708:18;72729:24;;;:15;:24;;;;;;73102:10;:26;;72651:46;;-1:-1:-1;72729:24:0;;72651:46;;73102:26;;;;;;:::i;:::-;;;;;;;;;73080:48;;73166:11;73141:10;73152;73141:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;73246:28;;;:15;:28;;;;;;;:41;;;73418:24;;;;;73411:31;73453:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;72469:1008;;;72398:1079;:::o;69902:221::-;69987:14;70004:20;70021:2;70004:16;:20::i;:::-;-1:-1:-1;;;;;70035:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;70080:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;69902:221:0:o;9162:149::-;9225:7;9256:1;9252;:5;:51;;9387:13;9481:15;;;9517:4;9510:15;;;9564:4;9548:21;;9252:51;;;9387:13;9481:15;;;9517:4;9510:15;;;9564:4;9548:21;;9260:20;9319:268;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:248::-;2428:6;2436;2489:2;2477:9;2468:7;2464:23;2460:32;2457:52;;;2505:1;2502;2495:12;2457:52;-1:-1:-1;;2528:23:1;;;2598:2;2583:18;;;2570:32;;-1:-1:-1;2360:248:1:o;2613:186::-;2672:6;2725:2;2713:9;2704:7;2700:23;2696:32;2693:52;;;2741:1;2738;2731:12;2693:52;2764:29;2783:9;2764:29;:::i;3151:389::-;3404:25;;;3460:2;3445:18;;3438:34;;;3391:3;3376:19;;3481:53;3530:2;3515:18;;3507:6;2881:12;;-1:-1:-1;;;;;2877:38:1;2865:51;;2965:4;2954:16;;;2948:23;2932:14;;;2925:47;3021:4;3010:16;;;3004:23;2988:14;;;2981:47;3077:4;3066:16;;;3060:23;3044:14;;;3037:47;3133:4;3122:16;;;3116:23;3100:14;;3093:47;2804:342;3545:463;3605:3;3643:5;3637:12;3670:6;3665:3;3658:19;3696:4;3725:2;3720:3;3716:12;3709:19;;3762:2;3755:5;3751:14;3783:1;3793:190;3807:6;3804:1;3801:13;3793:190;;;3856:45;3897:3;3888:6;3882:13;2881:12;;-1:-1:-1;;;;;2877:38:1;2865:51;;2965:4;2954:16;;;2948:23;2932:14;;;2925:47;3021:4;3010:16;;;3004:23;2988:14;;;2981:47;3077:4;3066:16;;;3060:23;3044:14;;;3037:47;3133:4;3122:16;;;3116:23;3100:14;;3093:47;2804:342;3856:45;3930:4;3921:14;;;;;3958:15;;;;3829:1;3822:9;3793:190;;;-1:-1:-1;3999:3:1;;3545:463;-1:-1:-1;;;;;3545:463:1:o;4013:318::-;4242:2;4231:9;4224:21;4205:4;4262:63;4321:2;4310:9;4306:18;4298:6;4262:63;:::i;4336:328::-;4413:6;4421;4429;4482:2;4470:9;4461:7;4457:23;4453:32;4450:52;;;4498:1;4495;4488:12;4450:52;4521:29;4540:9;4521:29;:::i;:::-;4511:39;;4569:38;4603:2;4592:9;4588:18;4569:38;:::i;:::-;4559:48;;4654:2;4643:9;4639:18;4626:32;4616:42;;4336:328;;;;;:::o;4669:127::-;4730:10;4725:3;4721:20;4718:1;4711:31;4761:4;4758:1;4751:15;4785:4;4782:1;4775:15;4801:275;4872:2;4866:9;4937:2;4918:13;;-1:-1:-1;;4914:27:1;4902:40;;-1:-1:-1;;;;;4957:34:1;;4993:22;;;4954:62;4951:88;;;5019:18;;:::i;:::-;5055:2;5048:22;4801:275;;-1:-1:-1;4801:275:1:o;5081:183::-;5141:4;-1:-1:-1;;;;;5166:6:1;5163:30;5160:56;;;5196:18;;:::i;:::-;-1:-1:-1;5241:1:1;5237:14;5253:4;5233:25;;5081:183::o;5269:662::-;5323:5;5376:3;5369:4;5361:6;5357:17;5353:27;5343:55;;5394:1;5391;5384:12;5343:55;5430:6;5417:20;5456:4;5480:60;5496:43;5536:2;5496:43;:::i;:::-;5480:60;:::i;:::-;5574:15;;;5660:1;5656:10;;;;5644:23;;5640:32;;;5605:12;;;;5684:15;;;5681:35;;;5712:1;5709;5702:12;5681:35;5748:2;5740:6;5736:15;5760:142;5776:6;5771:3;5768:15;5760:142;;;5842:17;;5830:30;;5880:12;;;;5793;;5760:142;;;-1:-1:-1;5920:5:1;5269:662;-1:-1:-1;;;;;;5269:662:1:o;5936:1522::-;6097:6;6105;6113;6121;6174:3;6162:9;6153:7;6149:23;6145:33;6142:53;;;6191:1;6188;6181:12;6142:53;6227:9;6214:23;6204:33;;6256:2;6305;6294:9;6290:18;6277:32;6267:42;;6360:2;6349:9;6345:18;6332:32;-1:-1:-1;;;;;6424:2:1;6416:6;6413:14;6410:34;;;6440:1;6437;6430:12;6410:34;6463:61;6516:7;6507:6;6496:9;6492:22;6463:61;:::i;:::-;6453:71;;6577:2;6566:9;6562:18;6549:32;6533:48;;6606:2;6596:8;6593:16;6590:36;;;6622:1;6619;6612:12;6590:36;6660:8;6649:9;6645:24;6635:34;;6707:7;6700:4;6696:2;6692:13;6688:27;6678:55;;6729:1;6726;6719:12;6678:55;6765:2;6752:16;6788:60;6804:43;6844:2;6804:43;:::i;6788:60::-;6882:15;;;6964:1;6960:10;;;;6952:19;;6948:28;;;6913:12;;;;6988:19;;;6985:39;;;7020:1;7017;7010:12;6985:39;7052:2;7048;7044:11;7064:364;7080:6;7075:3;7072:15;7064:364;;;7166:3;7153:17;7202:2;7189:11;7186:19;7183:109;;;7246:1;7275:2;7271;7264:14;7183:109;7317:68;7377:7;7372:2;7358:11;7354:2;7350:20;7346:29;7317:68;:::i;:::-;7305:81;;-1:-1:-1;7406:12:1;;;;7097;;7064:364;;;-1:-1:-1;5936:1522:1;;;;-1:-1:-1;5936:1522:1;;-1:-1:-1;;;;;;;5936:1522:1:o;7463:367::-;7526:8;7536:6;7590:3;7583:4;7575:6;7571:17;7567:27;7557:55;;7608:1;7605;7598:12;7557:55;-1:-1:-1;7631:20:1;;-1:-1:-1;;;;;7663:30:1;;7660:50;;;7706:1;7703;7696:12;7660:50;7743:4;7735:6;7731:17;7719:29;;7803:3;7796:4;7786:6;7783:1;7779:14;7771:6;7767:27;7763:38;7760:47;7757:67;;;7820:1;7817;7810:12;7757:67;7463:367;;;;;:::o;7835:573::-;7939:6;7947;7955;7963;8016:2;8004:9;7995:7;7991:23;7987:32;7984:52;;;8032:1;8029;8022:12;7984:52;8068:9;8055:23;8045:33;;8125:2;8114:9;8110:18;8097:32;8087:42;;8180:2;8169:9;8165:18;8152:32;-1:-1:-1;;;;;8199:6:1;8196:30;8193:50;;;8239:1;8236;8229:12;8193:50;8278:70;8340:7;8331:6;8320:9;8316:22;8278:70;:::i;:::-;7835:573;;;;-1:-1:-1;8367:8:1;-1:-1:-1;;;;7835:573:1:o;8413:160::-;8478:20;;8534:13;;8527:21;8517:32;;8507:60;;8563:1;8560;8553:12;8578:180;8634:6;8687:2;8675:9;8666:7;8662:23;8658:32;8655:52;;;8703:1;8700;8693:12;8655:52;8726:26;8742:9;8726:26;:::i;8763:662::-;8814:5;8867:3;8860:4;8852:6;8848:17;8844:27;8834:55;;8885:1;8882;8875:12;8834:55;8921:6;8908:20;8947:4;8971:60;8987:43;9027:2;8987:43;:::i;8971:60::-;9065:15;;;9151:1;9147:10;;;;9135:23;;9131:32;;;9096:12;;;;9175:15;;;9172:35;;;9203:1;9200;9193:12;9172:35;9239:2;9231:6;9227:15;9251:145;9267:6;9262:3;9259:15;9251:145;;;9333:20;9349:3;9333:20;:::i;:::-;9321:33;;9374:12;;;;9284;;9251:145;;9430:1338;9656:6;9664;9672;9680;9688;9696;9749:3;9737:9;9728:7;9724:23;9720:33;9717:53;;;9766:1;9763;9756:12;9717:53;9802:9;9789:23;9779:33;;9863:2;9852:9;9848:18;9835:32;-1:-1:-1;;;;;9927:2:1;9919:6;9916:14;9913:34;;;9943:1;9940;9933:12;9913:34;9966:61;10019:7;10010:6;9999:9;9995:22;9966:61;:::i;:::-;9956:71;;10080:2;10069:9;10065:18;10052:32;10036:48;;10109:2;10099:8;10096:16;10093:36;;;10125:1;10122;10115:12;10093:36;10148:63;10203:7;10192:8;10181:9;10177:24;10148:63;:::i;:::-;10138:73;;10264:2;10253:9;10249:18;10236:32;10220:48;;10293:2;10283:8;10280:16;10277:36;;;10309:1;10306;10299:12;10277:36;10332:63;10387:7;10376:8;10365:9;10361:24;10332:63;:::i;:::-;10322:73;;10448:3;10437:9;10433:19;10420:33;10404:49;;10478:2;10468:8;10465:16;10462:36;;;10494:1;10491;10484:12;10462:36;10517:63;10572:7;10561:8;10550:9;10546:24;10517:63;:::i;:::-;10507:73;;10633:3;10622:9;10618:19;10605:33;10589:49;;10663:2;10653:8;10650:16;10647:36;;;10679:1;10676;10669:12;10647:36;;10702:60;10754:7;10743:8;10732:9;10728:24;10702:60;:::i;:::-;10692:70;;;9430:1338;;;;;;;;:::o;11267:967::-;11360:6;11368;11421:2;11409:9;11400:7;11396:23;11392:32;11389:52;;;11437:1;11434;11427:12;11389:52;11477:9;11464:23;-1:-1:-1;;;;;11502:6:1;11499:30;11496:50;;;11542:1;11539;11532:12;11496:50;11565:22;;11618:4;11610:13;;11606:27;-1:-1:-1;11596:55:1;;11647:1;11644;11637:12;11596:55;11683:2;11670:16;11705:4;11729:60;11745:43;11785:2;11745:43;:::i;11729:60::-;11823:15;;;11905:1;11901:10;;;;11893:19;;11889:28;;;11854:12;;;;11929:19;;;11926:39;;;11961:1;11958;11951:12;11926:39;11985:11;;;;12005:148;12021:6;12016:3;12013:15;12005:148;;;12087:23;12106:3;12087:23;:::i;:::-;12075:36;;12038:12;;;;12131;;;;12005:148;;;12172:5;12209:18;;;;12196:32;;-1:-1:-1;;;;;;11267:967:1:o;12239:316::-;12316:6;12324;12332;12385:2;12373:9;12364:7;12360:23;12356:32;12353:52;;;12401:1;12398;12391:12;12353:52;-1:-1:-1;;12424:23:1;;;12494:2;12479:18;;12466:32;;-1:-1:-1;12545:2:1;12530:18;;;12517:32;;12239:316;-1:-1:-1;12239:316:1:o;13377:254::-;13442:6;13450;13503:2;13491:9;13482:7;13478:23;13474:32;13471:52;;;13519:1;13516;13509:12;13471:52;13542:29;13561:9;13542:29;:::i;:::-;13532:39;;13590:35;13621:2;13610:9;13606:18;13590:35;:::i;:::-;13580:45;;13377:254;;;;;:::o;13636:::-;13704:6;13712;13765:2;13753:9;13744:7;13740:23;13736:32;13733:52;;;13781:1;13778;13771:12;13733:52;13817:9;13804:23;13794:33;;13846:38;13880:2;13869:9;13865:18;13846:38;:::i;13895:980::-;13990:6;13998;14006;14014;14067:3;14055:9;14046:7;14042:23;14038:33;14035:53;;;14084:1;14081;14074:12;14035:53;14107:29;14126:9;14107:29;:::i;:::-;14097:39;;14155:2;14176:38;14210:2;14199:9;14195:18;14176:38;:::i;:::-;14166:48;;14261:2;14250:9;14246:18;14233:32;14223:42;;14316:2;14305:9;14301:18;14288:32;-1:-1:-1;;;;;14380:2:1;14372:6;14369:14;14366:34;;;14396:1;14393;14386:12;14366:34;14434:6;14423:9;14419:22;14409:32;;14479:7;14472:4;14468:2;14464:13;14460:27;14450:55;;14501:1;14498;14491:12;14450:55;14537:2;14524:16;14559:2;14555;14552:10;14549:36;;;14565:18;;:::i;:::-;14607:53;14650:2;14631:13;;-1:-1:-1;;14627:27:1;14623:36;;14607:53;:::i;:::-;14594:66;;14683:2;14676:5;14669:17;14723:7;14718:2;14713;14709;14705:11;14701:20;14698:33;14695:53;;;14744:1;14741;14734:12;14695:53;14799:2;14794;14790;14786:11;14781:2;14774:5;14770:14;14757:45;14843:1;14838:2;14833;14826:5;14822:14;14818:23;14811:34;;14864:5;14854:15;;;;;13895:980;;;;;;;:::o;14880:435::-;14933:3;14971:5;14965:12;14998:6;14993:3;14986:19;15024:4;15053:2;15048:3;15044:12;15037:19;;15090:2;15083:5;15079:14;15111:1;15121:169;15135:6;15132:1;15129:13;15121:169;;;15196:13;;15184:26;;15230:12;;;;15265:15;;;;15157:1;15150:9;15121:169;;15320:476;15583:6;15572:9;15565:25;15626:6;15621:2;15610:9;15606:18;15599:34;15669:6;15664:2;15653:9;15649:18;15642:34;15712:3;15707:2;15696:9;15692:18;15685:31;15546:4;15733:57;15785:3;15774:9;15770:19;15762:6;15733:57;:::i;:::-;15725:65;15320:476;-1:-1:-1;;;;;;15320:476:1:o;15801:579::-;15905:6;15913;15921;15929;15982:2;15970:9;15961:7;15957:23;15953:32;15950:52;;;15998:1;15995;15988:12;15950:52;16034:9;16021:23;16011:33;;16063:38;16097:2;16086:9;16082:18;16063:38;:::i;:::-;16053:48;;16152:2;16141:9;16137:18;16124:32;-1:-1:-1;;;;;16171:6:1;16168:30;16165:50;;;16211:1;16208;16201:12;17045:522;17352:2;17341:9;17334:21;17315:4;17378:63;17437:2;17426:9;17422:18;17414:6;17378:63;:::i;:::-;17489:9;17481:6;17477:22;17472:2;17461:9;17457:18;17450:50;17517:44;17554:6;17546;17517:44;:::i;:::-;17509:52;17045:522;-1:-1:-1;;;;;17045:522:1:o;17572:260::-;17640:6;17648;17701:2;17689:9;17680:7;17676:23;17672:32;17669:52;;;17717:1;17714;17707:12;17669:52;17740:29;17759:9;17740:29;:::i;:::-;17730:39;;17788:38;17822:2;17811:9;17807:18;17788:38;:::i;17837:380::-;17916:1;17912:12;;;;17959;;;17980:61;;18034:4;18026:6;18022:17;18012:27;;17980:61;18087:2;18079:6;18076:14;18056:18;18053:38;18050:161;;18133:10;18128:3;18124:20;18121:1;18114:31;18168:4;18165:1;18158:15;18196:4;18193:1;18186:15;19753:127;19814:10;19809:3;19805:20;19802:1;19795:31;19845:4;19842:1;19835:15;19869:4;19866:1;19859:15;19885:127;19946:10;19941:3;19937:20;19934:1;19927:31;19977:4;19974:1;19967:15;20001:4;19998:1;19991:15;20017:135;20056:3;20077:17;;;20074:43;;20097:18;;:::i;:::-;-1:-1:-1;20144:1:1;20133:13;;20017:135::o;20157:125::-;20222:9;;;20243:10;;;20240:36;;;20256:18;;:::i;20287:128::-;20354:9;;;20375:11;;;20372:37;;;20389:18;;:::i;20420:168::-;20493:9;;;20524;;20541:15;;;20535:22;;20521:37;20511:71;;20562:18;;:::i;20725:217::-;20765:1;20791;20781:132;;20835:10;20830:3;20826:20;20823:1;20816:31;20870:4;20867:1;20860:15;20898:4;20895:1;20888:15;20781:132;-1:-1:-1;20927:9:1;;20725:217::o;20947:409::-;21149:2;21131:21;;;21188:2;21168:18;;;21161:30;21227:34;21222:2;21207:18;;21200:62;-1:-1:-1;;;21293:2:1;21278:18;;21271:43;21346:3;21331:19;;20947:409::o;22498:354::-;22700:2;22682:21;;;22739:2;22719:18;;;22712:30;22778:32;22773:2;22758:18;;22751:60;22843:2;22828:18;;22498:354::o;24265:403::-;24467:2;24449:21;;;24506:2;24486:18;;;24479:30;24545:34;24540:2;24525:18;;24518:62;-1:-1:-1;;;24611:2:1;24596:18;;24589:37;24658:3;24643:19;;24265:403::o;29076:496::-;29255:3;29293:6;29287:13;29309:66;29368:6;29363:3;29356:4;29348:6;29344:17;29309:66;:::i;:::-;29438:13;;29397:16;;;;29460:70;29438:13;29397:16;29507:4;29495:17;;29460:70;:::i;:::-;29546:20;;29076:496;-1:-1:-1;;;;29076:496:1:o;32336:401::-;32538:2;32520:21;;;32577:2;32557:18;;;32550:30;32616:34;32611:2;32596:18;;32589:62;-1:-1:-1;;;32682:2:1;32667:18;;32660:35;32727:3;32712:19;;32336:401::o;34219:414::-;34421:2;34403:21;;;34460:2;34440:18;;;34433:30;34499:34;34494:2;34479:18;;34472:62;-1:-1:-1;;;34565:2:1;34550:18;;34543:48;34623:3;34608:19;;34219:414::o;35060:489::-;-1:-1:-1;;;;;35329:15:1;;;35311:34;;35381:15;;35376:2;35361:18;;35354:43;35428:2;35413:18;;35406:34;;;35476:3;35471:2;35456:18;;35449:31;;;35254:4;;35497:46;;35523:19;;35515:6;35497:46;:::i;35554:249::-;35623:6;35676:2;35664:9;35655:7;35651:23;35647:32;35644:52;;;35692:1;35689;35682:12;35644:52;35724:9;35718:16;35743:30;35767:5;35743:30;:::i;35808:127::-;35869:10;35864:3;35860:20;35857:1;35850:31;35900:4;35897:1;35890:15;35924:4;35921:1;35914:15
Swarm Source
ipfs://09148e0646e6f31d1bb83659b528c9cd82762a21a525f8d8b94a5218eaf92073
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,192.04 | 0.00179 | $5.71 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.