Overview
ETH Balance
0.05395861374325892 ETH
Eth Value
$184.46 (@ $3,418.47/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 8 from a total of 8 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 19620038 | 227 days ago | IN | 0 ETH | 0.00085541 | ||||
Set Investor | 19619996 | 227 days ago | IN | 0 ETH | 0.00074381 | ||||
Set DAO | 19619992 | 227 days ago | IN | 0 ETH | 0.00079098 | ||||
Set S | 19619987 | 227 days ago | IN | 0 ETH | 0.00077537 | ||||
Set M | 19619985 | 227 days ago | IN | 0 ETH | 0.00078372 | ||||
Set Luxent | 19619983 | 227 days ago | IN | 0 ETH | 0.00071198 | ||||
Mint PRE | 19592329 | 231 days ago | IN | 0.05395861 ETH | 0.0035856 | ||||
0x60806040 | 19592099 | 231 days ago | IN | 0 ETH | 0.12982244 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LXNTPerfumes
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-04-05 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); function getRoundData( uint80 _roundId ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); } /** * @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) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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 256, 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 << 3) < value ? 1 : 0); } } } /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } /** * @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; } } /** * @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 rebuilds 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 from 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) { unchecked { 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 rebuilds 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 from 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) { unchecked { 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) } } } /** * @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 `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } /** * @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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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); } } /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); /** * `_sequentialUpTo()` must be greater than `_startTokenId()`. */ error SequentialUpToTooSmall(); /** * The `tokenId` of a sequential mint exceeds `_sequentialUpTo()`. */ error SequentialMintExceedsLimit(); /** * Spot minting requires a `tokenId` greater than `_sequentialUpTo()`. */ error SpotMintTokenIdTooSmall(); /** * Cannot mint over a token that already exists. */ error TokenAlreadyExists(); /** * The feature is not compatible with spot mints. */ error NotCompatibleWithSpotMints(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @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 payable; /** * @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); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * The `_sequentialUpTo()` function can be overriden to enable spot mints * (i.e. non-consecutive mints) for `tokenId`s greater than `_sequentialUpTo()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // The amount of tokens minted above `_sequentialUpTo()`. // We call these spot mints (i.e. non-sequential mints). uint256 private _spotMinted; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); if (_sequentialUpTo() < _startTokenId()) _revert(SequentialUpToTooSmall.selector); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID for sequential mints. * * Override this function to change the starting token ID for sequential mints. * * Note: The value returned must never change after any tokens have been minted. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the maximum token ID (inclusive) for sequential mints. * * Override this function to return a value less than 2**256 - 1, * but greater than `_startTokenId()`, to enable spot (non-sequential) mints. * * Note: The value returned must never change after any tokens have been minted. */ function _sequentialUpTo() internal view virtual returns (uint256) { return type(uint256).max; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256 result) { // Counter underflow is impossible as `_burnCounter` cannot be incremented // more than `_currentIndex + _spotMinted - _startTokenId()` times. unchecked { // With spot minting, the intermediate `result` can be temporarily negative, // and the computation must be unchecked. result = _currentIndex - _burnCounter - _startTokenId(); if (_sequentialUpTo() != type(uint256).max) result += _spotMinted; } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256 result) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { result = _currentIndex - _startTokenId(); if (_sequentialUpTo() != type(uint256).max) result += _spotMinted; } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } /** * @dev Returns the total number of tokens that are spot-minted. */ function _totalSpotMinted() internal view virtual returns (uint256) { return _spotMinted; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) _revert(BalanceQueryForZeroAddress.selector); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) _revert(URIQueryForNonexistentToken.selector); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Returns whether the ownership slot at `index` is initialized. * An uninitialized slot does not necessarily mean that the slot has no owner. */ function _ownershipIsInitialized(uint256 index) internal view virtual returns (bool) { return _packedOwnerships[index] != 0; } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * @dev Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) { if (_startTokenId() <= tokenId) { packed = _packedOwnerships[tokenId]; if (tokenId > _sequentialUpTo()) { if (_packedOwnershipExists(packed)) return packed; _revert(OwnerQueryForNonexistentToken.selector); } // If the data at the starting slot does not exist, start the scan. if (packed == 0) { if (tokenId >= _currentIndex) _revert(OwnerQueryForNonexistentToken.selector); // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `tokenId` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. for (;;) { unchecked { packed = _packedOwnerships[--tokenId]; } if (packed == 0) continue; if (packed & _BITMASK_BURNED == 0) return packed; // Otherwise, the token is burned, and we must revert. // This handles the case of batch burned tokens, where only the burned bit // of the starting slot is set, and remaining slots are left uninitialized. _revert(OwnerQueryForNonexistentToken.selector); } } // Otherwise, the data exists and we can skip the scan. // This is possible because we have already achieved the target condition. // This saves 2143 gas on transfers of initialized tokens. // If the token is not burned, return `packed`. Otherwise, revert. if (packed & _BITMASK_BURNED == 0) return packed; } _revert(OwnerQueryForNonexistentToken.selector); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. * * Requirements: * * - The caller must own the token or be an approved operator. */ function approve(address to, uint256 tokenId) public payable virtual override { _approve(to, tokenId, true); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) _revert(ApprovalQueryForNonexistentToken.selector); return _tokenApprovals[tokenId].value; } function _getApproved(uint256 tokenId) internal view virtual returns (address) { return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool result) { if (_startTokenId() <= tokenId) { if (tokenId > _sequentialUpTo()) return _packedOwnershipExists(_packedOwnerships[tokenId]); if (tokenId < _currentIndex) { uint256 packed; while ((packed = _packedOwnerships[tokenId]) == 0) --tokenId; result = packed & _BITMASK_BURNED == 0; } } } /** * @dev Returns whether `packed` represents a token that exists. */ function _packedOwnershipExists(uint256 packed) private pure returns (bool result) { assembly { // The following is equivalent to `owner != address(0) && burned == false`. // Symbolically tested. result := gt(and(packed, _BITMASK_ADDRESS), and(packed, _BITMASK_BURNED)) } } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS)); if (address(uint160(prevOwnershipPacked)) != from) _revert(TransferFromIncorrectOwner.selector); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. from, // `from`. toMasked, // `to`. tokenId // `tokenId`. ) } if (toMasked == 0) _revert(TransferToZeroAddress.selector); _afterTokenTransfers(from, to, tokenId, 1); } function _transferFrom( address from, address to, uint256 tokenId, uint256 baseTokenId ) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS)); if (address(uint160(prevOwnershipPacked)) != from) _revert(TransferFromIncorrectOwner.selector); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. from, // `from`. toMasked, // `to`. baseTokenId // `tokenId`. ) } if (toMasked == 0) _revert(TransferToZeroAddress.selector); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } } function _safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data, uint256 baseTokenId ) internal virtual { _transferFrom(from, to, tokenId, baseTokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, baseTokenId, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { _revert(TransferToNonERC721ReceiverImplementer.selector); } assembly { revert(add(32, reason), mload(reason)) } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) _revert(MintZeroQuantity.selector); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; if (toMasked == 0) _revert(MintToZeroAddress.selector); uint256 end = startTokenId + quantity; uint256 tokenId = startTokenId; if (end - 1 > _sequentialUpTo()) _revert(SequentialMintExceedsLimit.selector); do { assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. tokenId // `tokenId`. ) } // The `!=` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. } while (++tokenId != end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) _revert(MintToZeroAddress.selector); if (quantity == 0) _revert(MintZeroQuantity.selector); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) _revert(MintERC2309QuantityExceedsLimit.selector); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); if (startTokenId + quantity - 1 > _sequentialUpTo()) _revert(SequentialMintExceedsLimit.selector); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } } while (index < end); // This prevents reentrancy to `_safeMint`. // It does not prevent reentrancy to `_safeMintSpot`. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } /** * @dev Mints a single token at `tokenId`. * * Note: A spot-minted `tokenId` that has been burned can be re-minted again. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` must be greater than `_sequentialUpTo()`. * - `tokenId` must not exist. * * Emits a {Transfer} event for each mint. */ function _mintSpot(address to, uint256 tokenId) internal virtual { if (tokenId <= _sequentialUpTo()) _revert(SpotMintTokenIdTooSmall.selector); uint256 prevOwnershipPacked = _packedOwnerships[tokenId]; if (_packedOwnershipExists(prevOwnershipPacked)) _revert(TokenAlreadyExists.selector); _beforeTokenTransfers(address(0), to, tokenId, 1); // Overflows are incredibly unrealistic. // The `numberMinted` for `to` is incremented by 1, and has a max limit of 2**64 - 1. // `_spotMinted` is incremented by 1, and has a max limit of 2**256 - 1. unchecked { // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `true` (as `quantity == 1`). _packedOwnerships[tokenId] = _packOwnershipData( to, _nextInitializedFlag(1) | _nextExtraData(address(0), to, prevOwnershipPacked) ); // Updates: // - `balance += 1`. // - `numberMinted += 1`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += (1 << _BITPOS_NUMBER_MINTED) | 1; // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; if (toMasked == 0) _revert(MintToZeroAddress.selector); assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. tokenId // `tokenId`. ) } ++_spotMinted; } _afterTokenTransfers(address(0), to, tokenId, 1); } /** * @dev Safely mints a single token at `tokenId`. * * Note: A spot-minted `tokenId` that has been burned can be re-minted again. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}. * - `tokenId` must be greater than `_sequentialUpTo()`. * - `tokenId` must not exist. * * See {_mintSpot}. * * Emits a {Transfer} event. */ function _safeMintSpot( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mintSpot(to, tokenId); unchecked { if (to.code.length != 0) { uint256 currentSpotMinted = _spotMinted; if (!_checkContractOnERC721Received(address(0), to, tokenId, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } // This prevents reentrancy to `_safeMintSpot`. // It does not prevent reentrancy to `_safeMint`. if (_spotMinted != currentSpotMinted) revert(); } } } /** * @dev Equivalent to `_safeMintSpot(to, tokenId, '')`. */ function _safeMintSpot(address to, uint256 tokenId) internal virtual { _safeMintSpot(to, tokenId, ''); } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Equivalent to `_approve(to, tokenId, false)`. */ function _approve(address to, uint256 tokenId) internal virtual { _approve(to, tokenId, false); } /** * @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: * * - `tokenId` must exist. * * Emits an {Approval} event. */ function _approve( address to, uint256 tokenId, bool approvalCheck ) internal virtual { address owner = ownerOf(tokenId); if (approvalCheck && _msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { _revert(ApprovalCallerNotOwnerNorApproved.selector); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as `_burnCounter` cannot be exceed `_currentIndex + _spotMinted` times. unchecked { _burnCounter++; } } function _burn(uint256 tokenId, bool approvalCheck, uint256 baseTokenId) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), baseTokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as `_burnCounter` cannot be exceed `_currentIndex + _spotMinted` times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) _revert(OwnershipNotInitializedForExtraData.selector); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } /** * @dev For more efficient reverts. */ function _revert(bytes4 errorSelector) internal pure { assembly { mstore(0x00, errorSelector) revert(0x00, 0x04) } } function getCurrentIndex() internal virtual returns (uint256) { return _currentIndex; } function _ownerOf(uint256 tokenId) internal view virtual returns (address) { if (tokenId < 0) _revert(OwnerQueryForNonexistentToken.selector); return address(uint160(_packedOwnershipOf(tokenId))); } function safeMint(uint256 tokenID, uint256 quantity, address to) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) _revert(MintZeroQuantity.selector); uint256 end = tokenID + quantity; bytes memory _data = ''; // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; if (toMasked == 0) _revert(MintToZeroAddress.selector); uint256 tokenId = tokenID; if (end - 1 > _sequentialUpTo()) _revert(SequentialMintExceedsLimit.selector); do { assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. tokenId // `tokenId`. ) } // The `!=` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. } while (++tokenId != end); _currentIndex = _currentIndex + quantity; } unchecked { if (to.code.length != 0) { uint256 index = 0; do { if (!_checkContractOnERC721Received(address(0), to, tokenID + index, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } } while (index < quantity); // This prevents reentrancy to `_safeMint`. // It does not prevent reentrancy to `_safeMintSpot`. if (_currentIndex != end) revert(); } } } } /** * @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); } /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } /** * @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; } } /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } /** * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment * information. * * Royalty information can be specified globally for all token ids via {ERC2981-_setDefaultRoyalty}, and/or individually for * specific token ids via {ERC2981-_setTokenRoyalty}. The latter takes precedence over the first. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC721Royalty is ERC2981, ERC721A { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); _resetTokenRoyalty(tokenId); } } enum SalePhase { PRE_SALES, WL_SALES, PUBLIC_SALES } contract LXNTPerfumes is ERC721A, ERC721Royalty, Ownable { using Strings for uint256; mapping(uint256 => uint256) private tokenIDMap; SalePhase public currentSalePhase; AggregatorV3Interface internal priceFeed; address public Luxent; address public Investor; address public Artlanta; address public S; address public M; address public DAO; address public VAT; address public Misc; address public UNITE; uint256 public constant MAX_SUPPLY_LUXURY = 99; uint256 public constant MAX_SUPPLY_PREMIUM = 2999; uint256 public constant MAX_SUPPLY_STANDARD = 9999; uint256 public priceLuxury = 4999; uint256 public pricePremium = 2999; uint256 public priceStandard = 199; uint256 public totalSupplyLuxury = 0; uint256 public totalSupplyPremium = 0; uint256 public totalSupplyStandard = 0; uint96 public royaltyFirstBuyer; uint96 public royaltyLuxent; uint96 public royaltyS; uint96 public royaltyM; bytes32 public merkleRoot; string public baseLuxuryTokenURI = "https://nftstorage.link/ipfs/bafybeibw7ff3hn4uaou4yo3wmzmkagmehm4fjw2gwqh42al7xxpjdrbai4/"; string public basePremiumTokenURI = "https://nftstorage.link/ipfs/bafybeiacom3gtk5s5ambbgkdlpbdyuhxyzbor57hkujayfkc6hzko2jg5a/"; string public baseStandardTokenURI = "https://nftstorage.link/ipfs/bafybeibk3y2tpkestcdbedfwq7fjz6pmdk7sfgyvhvwqgiozkxxiha3pga/"; constructor() ERC721A("LXNT Perfumes", "LXNT") { merkleRoot = 0xe535e2d6fa68a79aaae22f2245a7826c06e69185a3347903c5b0f8ad9f7022fa; Luxent = 0x7E7eAd180512651B5999A7B4eBA03fF2fE2219D7; Investor = 0x640531531a95d274f8AAFf0FC970a692DE0898dB; Artlanta = 0x4E57735B0326E2048D0eA72242420FCFc5A1feE6; S = 0xb4646b16C6A5f1e38823B87F3C8E57E95d68897d; M = 0x9de9253F4691C59faBb743A51dE374C2AdA384fD; DAO = 0xF69E88beDB691Bb300836A7d8151af5175589Ec9; VAT = 0x88893Bf7b44741C22C2d75287f909E9008986CCF; Misc = 0x1243A924426A319c311410727ae6cDCD8a94473c; UNITE = 0xB79568F57d31b7B4C6D62971b121E6b85531D022; priceFeed = AggregatorV3Interface(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419); royaltyFirstBuyer = 3; royaltyLuxent = 3; royaltyS = 2; royaltyM = 2; } event Mint(address owner, uint256 value); function _burn(uint256 tokenId) internal override(ERC721A, ERC721Royalty) { uint256 baseTokenId = tokenIDMap[tokenId]; _burn(tokenId, false, baseTokenId); } function supportsInterface( bytes4 interfaceId ) public view override(ERC721A, ERC721Royalty) returns (bool) { return super.supportsInterface(interfaceId); } function getPriceRate(uint _amount) public view returns (uint) { (, int256 price, , , ) = priceFeed.latestRoundData(); uint adjust_price = uint(price) * 1e10; uint usd = _amount * 1e18; uint rate = (usd * 1e18) / adjust_price; return rate; } function _withdraw(address target, uint256 balance) internal onlyOwner { payable(target).transfer(balance); } function withdraw() external onlyOwner { uint256 balance = address(this).balance; // Transfer 28% of the balance to Luxent _withdraw(Luxent, (balance * 28) / 100); // Transfer 10% of the balance to Investor _withdraw(Investor, balance / 10); // Transfer 5% of the balance to Artlanta _withdraw(Artlanta, balance / 20); // Transfer 14% of the balance to S _withdraw(S, (balance * 14) / 100); // Transfer 14% of the balance to M _withdraw(M, (balance * 14) / 100); // Transfer 6% of the balance to DAO _withdraw(DAO, (balance * 6) / 100); // Transfer 9% of the balance to VAT _withdraw(VAT, (balance * 9) / 100); // Transfer 12% of the balance to Misc _withdraw(Misc, (balance * 12) / 100); // Transfer 2% of the balance to UNITE _withdraw(UNITE, balance / 50); } function startPresale() external onlyOwner { currentSalePhase = SalePhase.PRE_SALES; } function startWLsale() external onlyOwner { currentSalePhase = SalePhase.WL_SALES; } function startPublicSale() external onlyOwner { currentSalePhase = SalePhase.PUBLIC_SALES; } function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } function setLuxent(address addr) external onlyOwner { Luxent = addr; } function setInvestor(address addr) external onlyOwner { Investor = addr; } function setArtlanta(address addr) external onlyOwner { Artlanta = addr; } function setS(address addr) external onlyOwner { S = addr; } function setM(address addr) external onlyOwner { M = addr; } function setDAO(address addr) external onlyOwner { DAO = addr; } function setVAT(address addr) external onlyOwner { VAT = addr; } function setMisc(address addr) external onlyOwner { Misc = addr; } function exists(uint256 tokenId) internal view virtual returns (bool result) { tokenId = getTokenIDByMap(tokenId); return _exists(tokenId); } function tokenURI(uint256 tokenId) public view override returns (string memory) { if (!exists(tokenId)) _revert(URIQueryForNonexistentToken.selector); if (tokenId <= 100) { return string(abi.encodePacked(baseLuxuryTokenURI, tokenId.toString(), ".json")); } else if (tokenId <= 3099) { return string(abi.encodePacked(basePremiumTokenURI, tokenId.toString(), ".json")); } else { return string(abi.encodePacked(baseStandardTokenURI, tokenId.toString(), ".json")); } } function _getNextTokenId(uint256 collectionId) private view returns (uint256) { if (collectionId == 3) { return 1 + totalSupplyLuxury; } else if (collectionId == 2) { return 100 + totalSupplyPremium; } else if (collectionId == 1) { return 3099 + totalSupplyStandard; } else { revert("Invalid collection ID"); } } function _mintNFTsByCollection(uint256 collectionId, uint256 quantity) internal { uint256 tokenID = _getNextTokenId(collectionId); uint256 currentIndex = getCurrentIndex(); for (uint256 i = 0; i < quantity; i++) { tokenIDMap[tokenID + i] = currentIndex + i + 1; } safeMint(tokenID, quantity, msg.sender); for (uint256 i = 0; i < quantity; i++) { _setTokenRoyalty(tokenID + i, msg.sender, royaltyFirstBuyer); _setTokenRoyalty(tokenID + i, Luxent, royaltyLuxent); _setTokenRoyalty(tokenID + i, S, royaltyS); _setTokenRoyalty(tokenID + i, M, royaltyM); } } function mintPRE(uint256 collectionId, uint256 quantity, bool discount, bool referred, bytes32[] memory) external payable { require(currentSalePhase == SalePhase.PRE_SALES, "PRE_SALES is not active"); require(quantity > 0, "Invalid Parameter!"); uint256 frag = 100; if (discount) frag = 80; if (referred) frag -= 10; if (collectionId == 3) { require(msg.value >= getPriceRate(priceLuxury) * quantity * frag / 100, "Ether sent is not correct"); require((totalSupplyLuxury + quantity) <= ((MAX_SUPPLY_LUXURY * 15) / 100), "Max supply reached for this phase"); totalSupplyLuxury += quantity; } else if (collectionId == 2) { require(msg.value >= getPriceRate(pricePremium) * quantity * frag / 100, "Ether sent is not correct"); require((totalSupplyPremium + quantity) <= ((MAX_SUPPLY_PREMIUM * 15) / 100), "Max supply reached for this phase"); totalSupplyPremium += quantity; } else if (collectionId == 1) { require(msg.value >= getPriceRate(priceStandard) * quantity * frag / 100, "Ether sent is not correct"); require((totalSupplyStandard + quantity) <= ((MAX_SUPPLY_STANDARD * 15) / 100), "Max supply reached for this phase"); totalSupplyStandard += quantity; } else { revert("Invalid collection ID"); } _mintNFTsByCollection(collectionId, quantity); emit Mint(msg.sender, msg.value); } function mintWL(bytes32[] calldata _merkleProof, uint256 collectionId, uint256 quantity, bool discount, bool referred, bytes32[] memory) external payable { require(currentSalePhase == SalePhase.WL_SALES, "WL_SALES is not active"); require(quantity > 0, "Invalid Parameter!"); uint256 frag = 100; if (discount) frag = 80; if (referred) frag -= 10; bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Invalid proof"); if (collectionId == 3) { require(msg.value >= getPriceRate(priceLuxury) * quantity * frag / 100, "Ether sent is not correct"); require((totalSupplyLuxury + quantity) <= ((MAX_SUPPLY_LUXURY * 50) / 100), "Max supply reached for this phase"); totalSupplyLuxury += quantity; } else if (collectionId == 2) { require(msg.value >= getPriceRate(pricePremium) * quantity * frag / 100, "Ether sent is not correct"); require((totalSupplyPremium + quantity) <= ((MAX_SUPPLY_PREMIUM * 50) / 100), "Max supply reached for this phase"); totalSupplyPremium += quantity; } else if (collectionId == 1) { require(msg.value >= getPriceRate(priceStandard) * quantity * frag / 100, "Ether sent is not correct"); require((totalSupplyStandard + quantity) <= ((MAX_SUPPLY_STANDARD * 50) / 100), "Max supply reached for this phase"); totalSupplyStandard += quantity; } else { revert("Invalid collection ID"); } _mintNFTsByCollection(collectionId, quantity); emit Mint(msg.sender, msg.value); } function mintPUBLIC(uint256 collectionId, uint256 quantity, bool discount, bool referred, bytes32[] memory) external payable { require(currentSalePhase == SalePhase.PUBLIC_SALES, "PUBLIC_SALES is not active"); require(quantity > 0, "Invalid Parameter!"); uint256 frag = 100; if (discount) frag = 80; if (referred) frag -= 10; if (collectionId == 3) { require(msg.value >= getPriceRate(priceLuxury) * quantity * frag / 100, "Ether sent is not correct"); require((totalSupplyLuxury + quantity) <= MAX_SUPPLY_LUXURY, "Max supply reached for this phase"); totalSupplyLuxury += quantity; } else if (collectionId == 2) { require(msg.value >= getPriceRate(pricePremium) * quantity * frag / 100, "Ether sent is not correct"); require((totalSupplyPremium + quantity) <= MAX_SUPPLY_PREMIUM, "Max supply reached for this phase"); totalSupplyPremium += quantity; } else if (collectionId == 1) { require(msg.value >= getPriceRate(priceStandard) * quantity * frag / 100, "Ether sent is not correct"); require((totalSupplyStandard + quantity) <= MAX_SUPPLY_STANDARD, "Max supply reached for this phase"); totalSupplyStandard += quantity; } else { revert("Invalid collection ID"); } _mintNFTsByCollection(collectionId, quantity); emit Mint(msg.sender, msg.value); } function freeMint(uint256 collectionId, uint256 quantity) external onlyOwner { require(quantity > 0, "Invalid Parameter!"); if (collectionId == 3) { require((totalSupplyLuxury + quantity) <= MAX_SUPPLY_LUXURY, "Max supply reached for this phase"); totalSupplyLuxury += quantity; } else if (collectionId == 2) { require((totalSupplyPremium + quantity) <= MAX_SUPPLY_PREMIUM, "Max supply reached for this phase"); totalSupplyPremium += quantity; } else if (collectionId == 1) { require((totalSupplyStandard + quantity) <= MAX_SUPPLY_STANDARD, "Max supply reached for this phase"); totalSupplyStandard += quantity; } else { revert("Invalid collection ID"); } _mintNFTsByCollection(collectionId, quantity); } function setBaseTokenURI(string calldata _tokenURIStandard, string calldata _tokenURIPremium, string calldata _tokenURILuxury) external onlyOwner { baseLuxuryTokenURI = _tokenURILuxury; basePremiumTokenURI = _tokenURIPremium; baseStandardTokenURI = _tokenURIStandard; } function ownerOf(uint256 tokenId) public view virtual override returns (address) { tokenId = getTokenIDByMap(tokenId); return _ownerOf(tokenId); } function getTokenIDByMap(uint256 tokenId) public view returns (uint256) { return tokenIDMap[tokenId] - 1; } function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!exists(tokenId)) _revert(ApprovalQueryForNonexistentToken.selector); return _getApproved(tokenId); } function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 baseTokenId = tokenId; tokenId = getTokenIDByMap(tokenId); _transferFrom(from, to, tokenId, baseTokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { uint256 baseTokenId = tokenId; tokenId = getTokenIDByMap(tokenId); _safeTransferFrom(from, to, tokenId, _data, baseTokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NotCompatibleWithSpotMints","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"SequentialMintExceedsLimit","type":"error"},{"inputs":[],"name":"SequentialUpToTooSmall","type":"error"},{"inputs":[],"name":"SpotMintTokenIdTooSmall","type":"error"},{"inputs":[],"name":"TokenAlreadyExists","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"Artlanta","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Investor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Luxent","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"M","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_LUXURY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_PREMIUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_STANDARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Misc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"S","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNITE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseLuxuryTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basePremiumTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseStandardTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSalePhase","outputs":[{"internalType":"enum SalePhase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getPriceRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenIDByMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bool","name":"discount","type":"bool"},{"internalType":"bool","name":"referred","type":"bool"},{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"name":"mintPRE","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bool","name":"discount","type":"bool"},{"internalType":"bool","name":"referred","type":"bool"},{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"name":"mintPUBLIC","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bool","name":"discount","type":"bool"},{"internalType":"bool","name":"referred","type":"bool"},{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"name":"mintWL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceLuxury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePremium","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceStandard","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyFirstBuyer","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyLuxent","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyM","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyS","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"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":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setArtlanta","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURIStandard","type":"string"},{"internalType":"string","name":"_tokenURIPremium","type":"string"},{"internalType":"string","name":"_tokenURILuxury","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setDAO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setInvestor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setLuxent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setMisc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setVAT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startWLsale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyLuxury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyPremium","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyStandard","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052611387601755610bb760185560c76019556000601a556000601b556000601c55604051806080016040528060598152602001620066eb6059913960209080519060200190620000559291906200072d565b506040518060800160405280605981526020016200679d6059913960219080519060200190620000879291906200072d565b50604051806080016040528060598152602001620067446059913960229080519060200190620000b99291906200072d565b50348015620000c757600080fd5b506040518060400160405280600d81526020017f4c584e542050657266756d6573000000000000000000000000000000000000008152506040518060400160405280600481526020017f4c584e540000000000000000000000000000000000000000000000000000000081525081600490805190602001906200014c9291906200072d565b508060059080519060200190620001659291906200072d565b50620001766200062860201b60201c565b6002819055506200018c6200062860201b60201c565b6200019c6200062d60201b60201c565b1015620001bc57620001bb63fed8210f60e01b6200065560201b60201c565b5b5050620001de620001d26200065f60201b60201c565b6200066760201b60201c565b7fe535e2d6fa68a79aaae22f2245a7826c06e69185a3347903c5b0f8ad9f7022fa60001b601f81905550737e7ead180512651b5999a7b4eba03ff2fe2219d7600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073640531531a95d274f8aaff0fc970a692de0898db600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734e57735b0326e2048d0ea72242420fcfc5a1fee6601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b4646b16c6a5f1e38823b87f3c8e57e95d68897d601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550739de9253f4691c59fabb743a51de374c2ada384fd601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073f69e88bedb691bb300836a7d8151af5175589ec9601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507388893bf7b44741c22c2d75287f909e9008986ccf601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731243a924426a319c311410727ae6cdcd8a94473c601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b79568f57d31b7b4c6d62971b121e6b85531d022601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735f4ec3df9cbd43714fe2740f5e3616155c5b8419600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003601d60006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506003601d600c6101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506002601e60006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506002601e600c6101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555062000842565b600090565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b8060005260046000fd5b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200073b90620007dd565b90600052602060002090601f0160209004810192826200075f5760008555620007ab565b82601f106200077a57805160ff1916838001178555620007ab565b82800160010185558215620007ab579182015b82811115620007aa5782518255916020019190600101906200078d565b5b509050620007ba9190620007be565b5090565b5b80821115620007d9576000816000905550600101620007bf565b5090565b60006002820490506001821680620007f657607f821691505b602082108114156200080d576200080c62000813565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615e9980620008526000396000f3fe6080604052600436106103ce5760003560e01c80637cb64759116101fd578063bb98c47811610118578063e73a914c116100ab578063ec602efb1161007a578063ec602efb14610da5578063eece169c14610dd0578063f27d3e3614610dfb578063f2fde38b14610e26578063f53da97e14610e4f576103ce565b8063e73a914c14610ce9578063e985e9c514610d12578063e9d1762f14610d4f578063e9dc138f14610d7a576103ce565b8063d6f4496a116100e7578063d6f4496a14610c2f578063dcc1168914610c58578063dd761f1b14610c81578063e33824a214610cac576103ce565b8063bb98c47814610b75578063c87b56dd14610b9e578063d46e058a14610bdb578063d645985e14610c06576103ce565b80639b8cefc611610190578063b127e6801161015f578063b127e68014610ad8578063b2e34cee14610b03578063b6807c7714610b2e578063b88d4fde14610b59576103ce565b80639b8cefc614610a51578063a22cb46514610a6d578063aaf351cc14610a96578063b04ba50c14610ac1576103ce565b80638da5cb5b116101cc5780638da5cb5b146109a757806391c09d52146109d257806395d89b41146109fb57806398fabd3a14610a26576103ce565b80637cb64759146108ff5780637ec947071461092857806384b0927e146109515780638832c21d1461097c576103ce565b8063370fd056116102ed57806361d782621161028057806370a082311161024f57806370a0823114610866578063715018a6146108a357806371eaeeea146108ba578063773041ce146108d6576103ce565b806361d78262146107a85780636352211e146107d3578063673335f114610810578063693f917e1461083b576103ce565b80634b280937116102bc5780634b280937146106fc5780634be1c7961461072757806359e9c1421461075257806360ca5b651461077d576103ce565b8063370fd056146106735780633ccfd60b1461069e57806342842e0e146106b55780634426ebb7146106d1576103ce565b806316ec7cd3116103655780632a55205a116103345780632a55205a146105b45780632eb4a7ab146105f25780632fb00d151461061d578063317cb3a114610648576103ce565b806316ec7cd31461050757806318160ddd146105305780631f73d8d41461055b57806323b872dd14610598576103ce565b8063081812fc116103a1578063081812fc1461046e578063095ea7b3146104ab5780630c1c972a146104c757806310a1182a146104de576103ce565b806301b1f574146103d357806301ffc9a7146103ef57806304c98b2b1461042c57806306fdde0314610443575b600080fd5b6103ed60048036038101906103e89190614eb5565b610e7a565b005b3480156103fb57600080fd5b5061041660048036038101906104119190614d5a565b61132d565b60405161042391906153ef565b60405180910390f35b34801561043857600080fd5b5061044161133f565b005b34801561044f57600080fd5b5061045861139a565b6040516104659190615440565b60405180910390f35b34801561047a57600080fd5b5061049560048036038101906104909190614e50565b61142c565b6040516104a2919061535f565b60405180910390f35b6104c560048036038101906104c09190614c36565b61145c565b005b3480156104d357600080fd5b506104dc61146c565b005b3480156104ea57600080fd5b5061050560048036038101906105009190614acb565b6114c7565b005b34801561051357600080fd5b5061052e60048036038101906105299190614acb565b611513565b005b34801561053c57600080fd5b5061054561155f565b60405161055291906155e2565b60405180910390f35b34801561056757600080fd5b50610582600480360381019061057d9190614e50565b6115ac565b60405161058f91906155e2565b60405180910390f35b6105b260048036038101906105ad9190614b30565b6116b1565b005b3480156105c057600080fd5b506105db60048036038101906105d69190614e79565b6116d3565b6040516105e99291906153c6565b60405180910390f35b3480156105fe57600080fd5b506106076118be565b604051610614919061540a565b60405180910390f35b34801561062957600080fd5b506106326118c4565b60405161063f9190615440565b60405180910390f35b34801561065457600080fd5b5061065d611952565b60405161066a919061535f565b60405180910390f35b34801561067f57600080fd5b50610688611978565b60405161069591906155e2565b60405180910390f35b3480156106aa57600080fd5b506106b361197e565b005b6106cf60048036038101906106ca9190614b30565b611bce565b005b3480156106dd57600080fd5b506106e6611bee565b6040516106f391906155e2565b60405180910390f35b34801561070857600080fd5b50610711611bf3565b60405161071e919061535f565b60405180910390f35b34801561073357600080fd5b5061073c611c19565b604051610749919061535f565b60405180910390f35b34801561075e57600080fd5b50610767611c3f565b60405161077491906155fd565b60405180910390f35b34801561078957600080fd5b50610792611c5d565b60405161079f91906155e2565b60405180910390f35b3480156107b457600080fd5b506107bd611c63565b6040516107ca919061535f565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f59190614e50565b611c89565b604051610807919061535f565b60405180910390f35b34801561081c57600080fd5b50610825611ca6565b6040516108329190615440565b60405180910390f35b34801561084757600080fd5b50610850611d34565b60405161085d919061535f565b60405180910390f35b34801561087257600080fd5b5061088d60048036038101906108889190614acb565b611d5a565b60405161089a91906155e2565b60405180910390f35b3480156108af57600080fd5b506108b8611df2565b005b6108d460048036038101906108cf9190614eb5565b611e06565b005b3480156108e257600080fd5b506108fd60048036038101906108f89190614acb565b612270565b005b34801561090b57600080fd5b5061092660048036038101906109219190614d31565b6122bc565b005b34801561093457600080fd5b5061094f600480360381019061094a9190614dac565b6122ce565b005b34801561095d57600080fd5b50610966612314565b604051610973919061535f565b60405180910390f35b34801561098857600080fd5b5061099161233a565b60405161099e91906155e2565b60405180910390f35b3480156109b357600080fd5b506109bc612340565b6040516109c9919061535f565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f49190614e79565b61236a565b005b348015610a0757600080fd5b50610a1061256a565b604051610a1d9190615440565b60405180910390f35b348015610a3257600080fd5b50610a3b6125fc565b604051610a48919061535f565b60405180910390f35b610a6b6004803603810190610a669190614c72565b612622565b005b348015610a7957600080fd5b50610a946004803603810190610a8f9190614bfa565b612b90565b005b348015610aa257600080fd5b50610aab612c9b565b604051610ab891906155e2565b60405180910390f35b348015610acd57600080fd5b50610ad6612ca1565b005b348015610ae457600080fd5b50610aed612cfc565b604051610afa91906155e2565b60405180910390f35b348015610b0f57600080fd5b50610b18612d02565b604051610b2591906155e2565b60405180910390f35b348015610b3a57600080fd5b50610b43612d08565b604051610b5091906155fd565b60405180910390f35b610b736004803603810190610b6e9190614b7f565b612d26565b005b348015610b8157600080fd5b50610b9c6004803603810190610b979190614acb565b612d4a565b005b348015610baa57600080fd5b50610bc56004803603810190610bc09190614e50565b612d96565b604051610bd29190615440565b60405180910390f35b348015610be757600080fd5b50610bf0612e5e565b604051610bfd91906155fd565b60405180910390f35b348015610c1257600080fd5b50610c2d6004803603810190610c289190614acb565b612e7c565b005b348015610c3b57600080fd5b50610c566004803603810190610c519190614acb565b612ec8565b005b348015610c6457600080fd5b50610c7f6004803603810190610c7a9190614acb565b612f14565b005b348015610c8d57600080fd5b50610c96612f60565b604051610ca3919061535f565b60405180910390f35b348015610cb857600080fd5b50610cd36004803603810190610cce9190614e50565b612f86565b604051610ce091906155e2565b60405180910390f35b348015610cf557600080fd5b50610d106004803603810190610d0b9190614acb565b612faf565b005b348015610d1e57600080fd5b50610d396004803603810190610d349190614af4565b612ffb565b604051610d4691906153ef565b60405180910390f35b348015610d5b57600080fd5b50610d6461308f565b604051610d71919061535f565b60405180910390f35b348015610d8657600080fd5b50610d8f6130b5565b604051610d9c91906155fd565b60405180910390f35b348015610db157600080fd5b50610dba6130d3565b604051610dc791906155e2565b60405180910390f35b348015610ddc57600080fd5b50610de56130d9565b604051610df291906155e2565b60405180910390f35b348015610e0757600080fd5b50610e106130df565b604051610e1d9190615440565b60405180910390f35b348015610e3257600080fd5b50610e4d6004803603810190610e489190614acb565b61316d565b005b348015610e5b57600080fd5b50610e646131f1565b604051610e719190615425565b60405180910390f35b60006002811115610eb4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600d60009054906101000a900460ff166002811115610efc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3390615482565b60405180910390fd5b60008411610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f76906155c2565b60405180910390fd5b6000606490508315610f9057605090505b8215610fa657600a81610fa391906157d3565b90505b60038614156110a55760648186610fbe6017546115ac565b610fc89190615779565b610fd29190615779565b610fdc9190615748565b34101561101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590615522565b60405180910390fd5b6064600f606361102e9190615779565b6110389190615748565b85601a5461104691906156f2565b1115611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107e90615562565b60405180910390fd5b84601a600082825461109991906156f2565b925050819055506112e2565b60028614156111a557606481866110bd6018546115ac565b6110c79190615779565b6110d19190615779565b6110db9190615748565b34101561111d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111490615522565b60405180910390fd5b6064600f610bb761112e9190615779565b6111389190615748565b85601b5461114691906156f2565b1115611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e90615562565b60405180910390fd5b84601b600082825461119991906156f2565b925050819055506112e1565b60018614156112a557606481866111bd6019546115ac565b6111c79190615779565b6111d19190615779565b6111db9190615748565b34101561121d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121490615522565b60405180910390fd5b6064600f61270f61122e9190615779565b6112389190615748565b85601c5461124691906156f2565b1115611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e90615562565b60405180910390fd5b84601c600082825461129991906156f2565b925050819055506112e0565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d7906154e2565b60405180910390fd5b5b5b6112ec8686613204565b7f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885333460405161131d9291906153c6565b60405180910390a1505050505050565b6000611338826133cc565b9050919050565b6113476133de565b6000600d60006101000a81548160ff02191690836002811115611393577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550565b6060600480546113a99061594e565b80601f01602080910402602001604051908101604052809291908181526020018280546113d59061594e565b80156114225780601f106113f757610100808354040283529160200191611422565b820191906000526020600020905b81548152906001019060200180831161140557829003601f168201915b5050505050905090565b60006114378261345c565b61144c5761144b63cf4700e460e01b613479565b5b61145582613483565b9050919050565b611468828260016134c3565b5050565b6114746133de565b6002600d60006101000a81548160ff021916908360028111156114c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550565b6114cf6133de565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61151b6133de565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006115696135f2565b600354600254030390507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61159c6135f7565b146115a957600a54810190505b90565b600080600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561161757600080fd5b505afa15801561162b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164f9190614f44565b50505091505060006402540be400826116689190615779565b90506000670de0b6b3a7640000856116809190615779565b9050600082670de0b6b3a7640000836116999190615779565b6116a39190615748565b905080945050505050919050565b60008190506116bf82612f86565b91506116cd8484848461361f565b50505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156118695760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006118736138e4565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661189f9190615779565b6118a99190615748565b90508160000151819350935050509250929050565b601f5481565b602180546118d19061594e565b80601f01602080910402602001604051908101604052809291908181526020018280546118fd9061594e565b801561194a5780601f1061191f5761010080835404028352916020019161194a565b820191906000526020600020905b81548152906001019060200180831161192d57829003601f168201915b505050505081565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610bb781565b6119866133de565b60004790506119cf600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064601c846119c09190615779565b6119ca9190615748565b6138ee565b611a07600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a83611a029190615748565b6138ee565b611a3f601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601483611a3a9190615748565b6138ee565b611a83601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064600e84611a749190615779565b611a7e9190615748565b6138ee565b611ac7601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064600e84611ab89190615779565b611ac29190615748565b6138ee565b611b0b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064600684611afc9190615779565b611b069190615748565b6138ee565b611b4f601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064600984611b409190615779565b611b4a9190615748565b6138ee565b611b93601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064600c84611b849190615779565b611b8e9190615748565b6138ee565b611bcb601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16603283611bc69190615748565b6138ee565b50565b611be983838360405180602001604052806000815250612d26565b505050565b606381565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601d60009054906101000a90046bffffffffffffffffffffffff1681565b60195481565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611c9482612f86565b9150611c9f82613941565b9050919050565b60228054611cb39061594e565b80601f0160208091040260200160405190810160405280929190818152602001828054611cdf9061594e565b8015611d2c5780601f10611d0157610100808354040283529160200191611d2c565b820191906000526020600020905b815481529060010190602001808311611d0f57829003601f168201915b505050505081565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611da157611da0638f4eb60460e01b613479565b5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611dfa6133de565b611e04600061396c565b565b600280811115611e3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600d60009054906101000a900460ff166002811115611e87577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe906154a2565b60405180910390fd5b60008411611f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f01906155c2565b60405180910390fd5b6000606490508315611f1b57605090505b8215611f3157600a81611f2e91906157d3565b90505b60038614156120185760648186611f496017546115ac565b611f539190615779565b611f5d9190615779565b611f679190615748565b341015611fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa090615522565b60405180910390fd5b606385601a54611fb991906156f2565b1115611ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff190615562565b60405180910390fd5b84601a600082825461200c91906156f2565b92505081905550612225565b600286141561210057606481866120306018546115ac565b61203a9190615779565b6120449190615779565b61204e9190615748565b341015612090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208790615522565b60405180910390fd5b610bb785601b546120a191906156f2565b11156120e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d990615562565b60405180910390fd5b84601b60008282546120f491906156f2565b92505081905550612224565b60018614156121e857606481866121186019546115ac565b6121229190615779565b61212c9190615779565b6121369190615748565b341015612178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216f90615522565b60405180910390fd5b61270f85601c5461218991906156f2565b11156121ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c190615562565b60405180910390fd5b84601c60008282546121dc91906156f2565b92505081905550612223565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221a906154e2565b60405180910390fd5b5b5b61222f8686613204565b7f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688533346040516122609291906153c6565b60405180910390a1505050505050565b6122786133de565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6122c46133de565b80601f8190555050565b6122d66133de565b8181602091906122e79291906147d9565b508383602191906122f99291906147d9565b5085856022919061230b9291906147d9565b50505050505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601c5481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6123726133de565b600081116123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac906155c2565b60405180910390fd5b600382141561242d57606381601a546123ce91906156f2565b111561240f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240690615562565b60405180910390fd5b80601a600082825461242191906156f2565b9250508190555061255c565b60028214156124a657610bb781601b5461244791906156f2565b1115612488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247f90615562565b60405180910390fd5b80601b600082825461249a91906156f2565b9250508190555061255b565b600182141561251f5761270f81601c546124c091906156f2565b1115612501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f890615562565b60405180910390fd5b80601c600082825461251391906156f2565b9250508190555061255a565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612551906154e2565b60405180910390fd5b5b5b6125668282613204565b5050565b6060600580546125799061594e565b80601f01602080910402602001604051908101604052809291908181526020018280546125a59061594e565b80156125f25780601f106125c7576101008083540402835291602001916125f2565b820191906000526020600020905b8154815290600101906020018083116125d557829003601f168201915b5050505050905090565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6001600281111561265c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600d60009054906101000a900460ff1660028111156126a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146126e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126db906154c2565b60405180910390fd5b60008411612727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271e906155c2565b60405180910390fd5b600060649050831561273857605090505b821561274e57600a8161274b91906157d3565b90505b6000336040516020016127619190615315565b6040516020818303038152906040528051906020012090506127c7898980806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601f5483613a32565b612806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fd90615582565b60405180910390fd5b6003871415612905576064828761281e6017546115ac565b6128289190615779565b6128329190615779565b61283c9190615748565b34101561287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287590615522565b60405180910390fd5b60646032606361288e9190615779565b6128989190615748565b86601a546128a691906156f2565b11156128e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128de90615562565b60405180910390fd5b85601a60008282546128f991906156f2565b92505081905550612b42565b6002871415612a05576064828761291d6018546115ac565b6129279190615779565b6129319190615779565b61293b9190615748565b34101561297d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297490615522565b60405180910390fd5b60646032610bb761298e9190615779565b6129989190615748565b86601b546129a691906156f2565b11156129e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129de90615562565b60405180910390fd5b85601b60008282546129f991906156f2565b92505081905550612b41565b6001871415612b055760648287612a1d6019546115ac565b612a279190615779565b612a319190615779565b612a3b9190615748565b341015612a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7490615522565b60405180910390fd5b6064603261270f612a8e9190615779565b612a989190615748565b86601c54612aa691906156f2565b1115612ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ade90615562565b60405180910390fd5b85601c6000828254612af991906156f2565b92505081905550612b40565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b37906154e2565b60405180910390fd5b5b5b612b4c8787613204565b7f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968853334604051612b7d9291906153c6565b60405180910390a1505050505050505050565b8060096000612b9d613a49565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612c4a613a49565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c8f91906153ef565b60405180910390a35050565b61270f81565b612ca96133de565b6001600d60006101000a81548160ff02191690836002811115612cf5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550565b601a5481565b601b5481565b601d600c9054906101000a90046bffffffffffffffffffffffff1681565b6000829050612d3483612f86565b9250612d438585858585613a51565b5050505050565b612d526133de565b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060612da18261345c565b612db657612db563a14c4b5060e01b613479565b5b60648211612df0576020612dc983613aa5565b604051602001612dda929190615330565b6040516020818303038152906040529050612e59565b610c1b8211612e2b576021612e0483613aa5565b604051602001612e15929190615330565b6040516020818303038152906040529050612e59565b6022612e3683613aa5565b604051602001612e47929190615330565b60405160208183030381529060405290505b919050565b601e600c9054906101000a90046bffffffffffffffffffffffff1681565b612e846133de565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612ed06133de565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612f1c6133de565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006001600c600084815260200190815260200160002054612fa891906157d3565b9050919050565b612fb76133de565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601e60009054906101000a90046bffffffffffffffffffffffff1681565b60175481565b60185481565b602080546130ec9061594e565b80601f01602080910402602001604051908101604052809291908181526020018280546131189061594e565b80156131655780601f1061313a57610100808354040283529160200191613165565b820191906000526020600020905b81548152906001019060200180831161314857829003601f168201915b505050505081565b6131756133de565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156131e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131dc90615462565b60405180910390fd5b6131ee8161396c565b50565b600d60009054906101000a900460ff1681565b600061320f83613bc9565b9050600061321b613c69565b905060005b83811015613275576001818361323691906156f2565b61324091906156f2565b600c6000838661325091906156f2565b815260200190815260200160002081905550808061326d906159b1565b915050613220565b50613281828433613c73565b60005b838110156133c5576132bc818461329b91906156f2565b33601d60009054906101000a90046bffffffffffffffffffffffff16613e63565b61330e81846132cb91906156f2565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601d600c9054906101000a90046bffffffffffffffffffffffff16613e63565b613360818461331d91906156f2565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601e60009054906101000a90046bffffffffffffffffffffffff16613e63565b6133b2818461336f91906156f2565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601e600c9054906101000a90046bffffffffffffffffffffffff16613e63565b80806133bd906159b1565b915050613284565b5050505050565b60006133d78261400b565b9050919050565b6133e661409d565b73ffffffffffffffffffffffffffffffffffffffff16613404612340565b73ffffffffffffffffffffffffffffffffffffffff161461345a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345190615502565b60405180910390fd5b565b600061346782612f86565b9150613472826140a5565b9050919050565b8060005260046000fd5b60006008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006134ce83611c89565b905081801561351057508073ffffffffffffffffffffffffffffffffffffffff166134f7613a49565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561353c5761352681613521613a49565b612ffb565b61353b5761353a63cfb3b94260e01b613479565b5b5b836008600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b600090565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b600061362a83614152565b905073ffffffffffffffffffffffffffffffffffffffff8573ffffffffffffffffffffffffffffffffffffffff161694508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461369f5761369e63a114810060e01b613479565b5b6000806136ab85614281565b915091506136c181886136bc613a49565b6142a8565b6136ec576136d6876136d1613a49565b612ffb565b6136eb576136ea6359c896be60e01b613479565b5b5b6136f987878760016142ec565b801561370457600082555b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506137d2866137ae8989876142f2565b7c02000000000000000000000000000000000000000000000000000000001761431a565b600660008781526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561385a576000600186019050600060066000838152602001908152602001600020541415613858576002548114613857578360066000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff8773ffffffffffffffffffffffffffffffffffffffff161690508481897fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460008114156138cd576138cc63ea553b3460e01b613479565b5b6138da8888886001614345565b5050505050505050565b6000612710905090565b6138f66133de565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561393c573d6000803e3d6000fd5b505050565b60008082101561395c5761395b63df2d9b4260e01b613479565b5b61396582614152565b9050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082613a3f858461434b565b1490509392505050565b600033905090565b613a5d8585858461361f565b60008473ffffffffffffffffffffffffffffffffffffffff163b14613a9e57613a88858583856143c7565b613a9d57613a9c63d1a57ed660e01b613479565b5b5b5050505050565b606060006001613ab484614506565b01905060008167ffffffffffffffff811115613af9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613b2b5781602001600182028036833780820191505090505b509050600082602001820190505b600115613bbe578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581613ba8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0494506000851415613bb957613bbe565b613b39565b819350505050919050565b60006003821415613bea57601a546001613be391906156f2565b9050613c64565b6002821415613c0957601b546064613c0291906156f2565b9050613c64565b6001821415613c2957601c54610c1b613c2291906156f2565b9050613c64565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c5b906154e2565b60405180910390fd5b919050565b6000600254905090565b600060025490506000831415613c9457613c9363b562e8dd60e01b613479565b5b60008385613ca291906156f2565b90506000604051806020016040528060008152509050613cd884613cc960008760006142f2565b613cd28861473d565b1761431a565b6006600085815260200190815260200160002081905550600160406001901b178502600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600073ffffffffffffffffffffffffffffffffffffffff8573ffffffffffffffffffffffffffffffffffffffff161690506000811415613d9157613d90632e07630060e01b613479565b5b6000879050613d9e6135f7565b600185031115613db957613db86381647e3a60e01b613479565b5b5b808260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a483816001019150811415613dba578660025401600281905550505060008473ffffffffffffffffffffffffffffffffffffffff163b14613e5b5760005b613e2f600086838a01856143c7565b613e4457613e4363d1a57ed660e01b613479565b5b858110613e20578260025414613e5957600080fd5b505b505050505050565b613e6b6138e4565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115613ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ec0906155a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f3090615542565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506001600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061406657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806140965750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600033905090565b6000816140b06135f2565b1161414c576140bd6135f7565b8211156140e7576140e0600660008481526020019081526020016000205461474d565b905061414d565b60025482101561414b5760005b600060066000858152602001908152602001600020549150811415614124578261411d90615924565b92506140f4565b60007c01000000000000000000000000000000000000000000000000000000008216149150505b5b5b919050565b60008161415d6135f2565b1161426b57600660008381526020019081526020016000205490506141806135f7565b8211156141ab576141908161474d565b1561419a5761427c565b6141aa63df2d9b4260e01b613479565b5b600081141561423d5760025482106141ce576141cd63df2d9b4260e01b613479565b5b5b600660008360019003935083815260200190815260200160002054905060008114156141fa57614238565b60007c0100000000000000000000000000000000000000000000000000000000821614156142275761427c565b61423763df2d9b4260e01b613479565b5b6141cf565b60007c01000000000000000000000000000000000000000000000000000000008216141561426a5761427c565b5b61427b63df2d9b4260e01b613479565b5b919050565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861430986868461478e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008082905060005b84518110156143bc576143a78286838151811061439a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151614797565b915080806143b4906159b1565b915050614354565b508091505092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026143ed613a49565b8786866040518563ffffffff1660e01b815260040161440f949392919061537a565b602060405180830381600087803b15801561442957600080fd5b505af192505050801561445a57506040513d601f19601f820116820180604052508101906144579190614d83565b60015b6144b3573d806000811461448a576040519150601f19603f3d011682016040523d82523d6000602084013e61448f565b606091505b506000815114156144ab576144aa63d1a57ed660e01b613479565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061458a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381614580577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506040810190505b6d04ee2d6d415b85acef810000000083106145ed576d04ee2d6d415b85acef810000000083816145e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506020810190505b662386f26fc10000831061464257662386f26fc100008381614638577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506010810190505b6305f5e1008310614691576305f5e1008381614687577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506008810190505b61271083106146dc5761271083816146d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506004810190505b60648310614725576064838161471b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506002810190505b600a8310614734576001810190505b80915050919050565b60006001821460e11b9050919050565b60007c0100000000000000000000000000000000000000000000000000000000821673ffffffffffffffffffffffffffffffffffffffff8316119050919050565b60009392505050565b60008183106147af576147aa82846147c2565b6147ba565b6147b983836147c2565b5b905092915050565b600082600052816020526040600020905092915050565b8280546147e59061594e565b90600052602060002090601f016020900481019282614807576000855561484e565b82601f1061482057803560ff191683800117855561484e565b8280016001018555821561484e579182015b8281111561484d578235825591602001919060010190614832565b5b50905061485b919061485f565b5090565b5b80821115614878576000816000905550600101614860565b5090565b600061488f61488a8461563d565b615618565b905080838252602082019050828560208602820111156148ae57600080fd5b60005b858110156148de57816148c488826149c4565b8452602084019350602083019250506001810190506148b1565b5050509392505050565b60006148fb6148f684615669565b615618565b90508281526020810184848401111561491357600080fd5b61491e8482856158e2565b509392505050565b60008135905061493581615dc2565b92915050565b60008083601f84011261494d57600080fd5b8235905067ffffffffffffffff81111561496657600080fd5b60208301915083602082028301111561497e57600080fd5b9250929050565b600082601f83011261499657600080fd5b81356149a684826020860161487c565b91505092915050565b6000813590506149be81615dd9565b92915050565b6000813590506149d381615df0565b92915050565b6000813590506149e881615e07565b92915050565b6000815190506149fd81615e07565b92915050565b600082601f830112614a1457600080fd5b8135614a248482602086016148e8565b91505092915050565b600081519050614a3c81615e1e565b92915050565b60008083601f840112614a5457600080fd5b8235905067ffffffffffffffff811115614a6d57600080fd5b602083019150836001820283011115614a8557600080fd5b9250929050565b600081359050614a9b81615e35565b92915050565b600081519050614ab081615e35565b92915050565b600081519050614ac581615e4c565b92915050565b600060208284031215614add57600080fd5b6000614aeb84828501614926565b91505092915050565b60008060408385031215614b0757600080fd5b6000614b1585828601614926565b9250506020614b2685828601614926565b9150509250929050565b600080600060608486031215614b4557600080fd5b6000614b5386828701614926565b9350506020614b6486828701614926565b9250506040614b7586828701614a8c565b9150509250925092565b60008060008060808587031215614b9557600080fd5b6000614ba387828801614926565b9450506020614bb487828801614926565b9350506040614bc587828801614a8c565b925050606085013567ffffffffffffffff811115614be257600080fd5b614bee87828801614a03565b91505092959194509250565b60008060408385031215614c0d57600080fd5b6000614c1b85828601614926565b9250506020614c2c858286016149af565b9150509250929050565b60008060408385031215614c4957600080fd5b6000614c5785828601614926565b9250506020614c6885828601614a8c565b9150509250929050565b600080600080600080600060c0888a031215614c8d57600080fd5b600088013567ffffffffffffffff811115614ca757600080fd5b614cb38a828b0161493b565b97509750506020614cc68a828b01614a8c565b9550506040614cd78a828b01614a8c565b9450506060614ce88a828b016149af565b9350506080614cf98a828b016149af565b92505060a088013567ffffffffffffffff811115614d1657600080fd5b614d228a828b01614985565b91505092959891949750929550565b600060208284031215614d4357600080fd5b6000614d51848285016149c4565b91505092915050565b600060208284031215614d6c57600080fd5b6000614d7a848285016149d9565b91505092915050565b600060208284031215614d9557600080fd5b6000614da3848285016149ee565b91505092915050565b60008060008060008060608789031215614dc557600080fd5b600087013567ffffffffffffffff811115614ddf57600080fd5b614deb89828a01614a42565b9650965050602087013567ffffffffffffffff811115614e0a57600080fd5b614e1689828a01614a42565b9450945050604087013567ffffffffffffffff811115614e3557600080fd5b614e4189828a01614a42565b92509250509295509295509295565b600060208284031215614e6257600080fd5b6000614e7084828501614a8c565b91505092915050565b60008060408385031215614e8c57600080fd5b6000614e9a85828601614a8c565b9250506020614eab85828601614a8c565b9150509250929050565b600080600080600060a08688031215614ecd57600080fd5b6000614edb88828901614a8c565b9550506020614eec88828901614a8c565b9450506040614efd888289016149af565b9350506060614f0e888289016149af565b925050608086013567ffffffffffffffff811115614f2b57600080fd5b614f3788828901614985565b9150509295509295909350565b600080600080600060a08688031215614f5c57600080fd5b6000614f6a88828901614ab6565b9550506020614f7b88828901614a2d565b9450506040614f8c88828901614aa1565b9350506060614f9d88828901614aa1565b9250506080614fae88828901614ab6565b9150509295509295909350565b614fc481615807565b82525050565b614fdb614fd682615807565b6159fa565b82525050565b614fea81615819565b82525050565b614ff981615825565b82525050565b600061500a826156af565b61501481856156c5565b93506150248185602086016158f1565b61502d81615b09565b840191505092915050565b615041816158d0565b82525050565b6000615052826156ba565b61505c81856156d6565b935061506c8185602086016158f1565b61507581615b09565b840191505092915050565b600061508b826156ba565b61509581856156e7565b93506150a58185602086016158f1565b80840191505092915050565b600081546150be8161594e565b6150c881866156e7565b945060018216600081146150e357600181146150f457615127565b60ff19831686528186019350615127565b6150fd8561569a565b60005b8381101561511f57815481890152600182019150602081019050615100565b838801955050505b50505092915050565b600061513d6026836156d6565b915061514882615b27565b604082019050919050565b60006151606017836156d6565b915061516b82615b76565b602082019050919050565b6000615183601a836156d6565b915061518e82615b9f565b602082019050919050565b60006151a66016836156d6565b91506151b182615bc8565b602082019050919050565b60006151c96015836156d6565b91506151d482615bf1565b602082019050919050565b60006151ec6005836156e7565b91506151f782615c1a565b600582019050919050565b600061520f6020836156d6565b915061521a82615c43565b602082019050919050565b60006152326019836156d6565b915061523d82615c6c565b602082019050919050565b6000615255601b836156d6565b915061526082615c95565b602082019050919050565b60006152786021836156d6565b915061528382615cbe565b604082019050919050565b600061529b600d836156d6565b91506152a682615d0d565b602082019050919050565b60006152be602a836156d6565b91506152c982615d36565b604082019050919050565b60006152e16012836156d6565b91506152ec82615d85565b602082019050919050565b61530081615898565b82525050565b61530f816158b8565b82525050565b60006153218284614fca565b60148201915081905092915050565b600061533c82856150b1565b91506153488284615080565b9150615353826151df565b91508190509392505050565b60006020820190506153746000830184614fbb565b92915050565b600060808201905061538f6000830187614fbb565b61539c6020830186614fbb565b6153a960408301856152f7565b81810360608301526153bb8184614fff565b905095945050505050565b60006040820190506153db6000830185614fbb565b6153e860208301846152f7565b9392505050565b60006020820190506154046000830184614fe1565b92915050565b600060208201905061541f6000830184614ff0565b92915050565b600060208201905061543a6000830184615038565b92915050565b6000602082019050818103600083015261545a8184615047565b905092915050565b6000602082019050818103600083015261547b81615130565b9050919050565b6000602082019050818103600083015261549b81615153565b9050919050565b600060208201905081810360008301526154bb81615176565b9050919050565b600060208201905081810360008301526154db81615199565b9050919050565b600060208201905081810360008301526154fb816151bc565b9050919050565b6000602082019050818103600083015261551b81615202565b9050919050565b6000602082019050818103600083015261553b81615225565b9050919050565b6000602082019050818103600083015261555b81615248565b9050919050565b6000602082019050818103600083015261557b8161526b565b9050919050565b6000602082019050818103600083015261559b8161528e565b9050919050565b600060208201905081810360008301526155bb816152b1565b9050919050565b600060208201905081810360008301526155db816152d4565b9050919050565b60006020820190506155f760008301846152f7565b92915050565b60006020820190506156126000830184615306565b92915050565b6000615622615633565b905061562e8282615980565b919050565b6000604051905090565b600067ffffffffffffffff82111561565857615657615ada565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561568457615683615ada565b5b61568d82615b09565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006156fd82615898565b915061570883615898565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561573d5761573c615a1e565b5b828201905092915050565b600061575382615898565b915061575e83615898565b92508261576e5761576d615a4d565b5b828204905092915050565b600061578482615898565b915061578f83615898565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156157c8576157c7615a1e565b5b828202905092915050565b60006157de82615898565b91506157e983615898565b9250828210156157fc576157fb615a1e565b5b828203905092915050565b600061581282615878565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061586982615dae565b919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600069ffffffffffffffffffff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b60006158db8261585b565b9050919050565b82818337600083830152505050565b60005b8381101561590f5780820151818401526020810190506158f4565b8381111561591e576000848401525b50505050565b600061592f82615898565b9150600082141561594357615942615a1e565b5b600182039050919050565b6000600282049050600182168061596657607f821691505b6020821081141561597a57615979615aab565b5b50919050565b61598982615b09565b810181811067ffffffffffffffff821117156159a8576159a7615ada565b5b80604052505050565b60006159bc82615898565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156159ef576159ee615a1e565b5b600182019050919050565b6000615a0582615a0c565b9050919050565b6000615a1782615b1a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5052455f53414c4553206973206e6f7420616374697665000000000000000000600082015250565b7f5055424c49435f53414c4553206973206e6f7420616374697665000000000000600082015250565b7f574c5f53414c4553206973206e6f742061637469766500000000000000000000600082015250565b7f496e76616c696420636f6c6c656374696f6e2049440000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f455243323938313a20496e76616c696420706172616d65746572730000000000600082015250565b7f4d617820737570706c79207265616368656420666f722074686973207068617360008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f496e76616c696420506172616d65746572210000000000000000000000000000600082015250565b60038110615dbf57615dbe615a7c565b5b50565b615dcb81615807565b8114615dd657600080fd5b50565b615de281615819565b8114615ded57600080fd5b50565b615df981615825565b8114615e0457600080fd5b50565b615e108161582f565b8114615e1b57600080fd5b50565b615e278161586e565b8114615e3257600080fd5b50565b615e3e81615898565b8114615e4957600080fd5b50565b615e55816158a2565b8114615e6057600080fd5b5056fea2646970667358221220c8f8ee7067dcaf212d85fba48e10f594d7b187bb4d80eabc9d9cb09f6d2c30cc64736f6c6343000804003368747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f62616679626569627737666633686e3475616f7534796f33776d7a6d6b61676d65686d34666a7732677771683432616c377878706a6472626169342f68747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f62616679626569626b33793274706b657374636462656466777137666a7a36706d646b3773666779766876777167696f7a6b7878696861337067612f68747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f6261667962656961636f6d3367746b357335616d6262676b646c70626479756878797a626f723537686b756a6179666b6336687a6b6f326a6735612f
Deployed Bytecode
0x6080604052600436106103ce5760003560e01c80637cb64759116101fd578063bb98c47811610118578063e73a914c116100ab578063ec602efb1161007a578063ec602efb14610da5578063eece169c14610dd0578063f27d3e3614610dfb578063f2fde38b14610e26578063f53da97e14610e4f576103ce565b8063e73a914c14610ce9578063e985e9c514610d12578063e9d1762f14610d4f578063e9dc138f14610d7a576103ce565b8063d6f4496a116100e7578063d6f4496a14610c2f578063dcc1168914610c58578063dd761f1b14610c81578063e33824a214610cac576103ce565b8063bb98c47814610b75578063c87b56dd14610b9e578063d46e058a14610bdb578063d645985e14610c06576103ce565b80639b8cefc611610190578063b127e6801161015f578063b127e68014610ad8578063b2e34cee14610b03578063b6807c7714610b2e578063b88d4fde14610b59576103ce565b80639b8cefc614610a51578063a22cb46514610a6d578063aaf351cc14610a96578063b04ba50c14610ac1576103ce565b80638da5cb5b116101cc5780638da5cb5b146109a757806391c09d52146109d257806395d89b41146109fb57806398fabd3a14610a26576103ce565b80637cb64759146108ff5780637ec947071461092857806384b0927e146109515780638832c21d1461097c576103ce565b8063370fd056116102ed57806361d782621161028057806370a082311161024f57806370a0823114610866578063715018a6146108a357806371eaeeea146108ba578063773041ce146108d6576103ce565b806361d78262146107a85780636352211e146107d3578063673335f114610810578063693f917e1461083b576103ce565b80634b280937116102bc5780634b280937146106fc5780634be1c7961461072757806359e9c1421461075257806360ca5b651461077d576103ce565b8063370fd056146106735780633ccfd60b1461069e57806342842e0e146106b55780634426ebb7146106d1576103ce565b806316ec7cd3116103655780632a55205a116103345780632a55205a146105b45780632eb4a7ab146105f25780632fb00d151461061d578063317cb3a114610648576103ce565b806316ec7cd31461050757806318160ddd146105305780631f73d8d41461055b57806323b872dd14610598576103ce565b8063081812fc116103a1578063081812fc1461046e578063095ea7b3146104ab5780630c1c972a146104c757806310a1182a146104de576103ce565b806301b1f574146103d357806301ffc9a7146103ef57806304c98b2b1461042c57806306fdde0314610443575b600080fd5b6103ed60048036038101906103e89190614eb5565b610e7a565b005b3480156103fb57600080fd5b5061041660048036038101906104119190614d5a565b61132d565b60405161042391906153ef565b60405180910390f35b34801561043857600080fd5b5061044161133f565b005b34801561044f57600080fd5b5061045861139a565b6040516104659190615440565b60405180910390f35b34801561047a57600080fd5b5061049560048036038101906104909190614e50565b61142c565b6040516104a2919061535f565b60405180910390f35b6104c560048036038101906104c09190614c36565b61145c565b005b3480156104d357600080fd5b506104dc61146c565b005b3480156104ea57600080fd5b5061050560048036038101906105009190614acb565b6114c7565b005b34801561051357600080fd5b5061052e60048036038101906105299190614acb565b611513565b005b34801561053c57600080fd5b5061054561155f565b60405161055291906155e2565b60405180910390f35b34801561056757600080fd5b50610582600480360381019061057d9190614e50565b6115ac565b60405161058f91906155e2565b60405180910390f35b6105b260048036038101906105ad9190614b30565b6116b1565b005b3480156105c057600080fd5b506105db60048036038101906105d69190614e79565b6116d3565b6040516105e99291906153c6565b60405180910390f35b3480156105fe57600080fd5b506106076118be565b604051610614919061540a565b60405180910390f35b34801561062957600080fd5b506106326118c4565b60405161063f9190615440565b60405180910390f35b34801561065457600080fd5b5061065d611952565b60405161066a919061535f565b60405180910390f35b34801561067f57600080fd5b50610688611978565b60405161069591906155e2565b60405180910390f35b3480156106aa57600080fd5b506106b361197e565b005b6106cf60048036038101906106ca9190614b30565b611bce565b005b3480156106dd57600080fd5b506106e6611bee565b6040516106f391906155e2565b60405180910390f35b34801561070857600080fd5b50610711611bf3565b60405161071e919061535f565b60405180910390f35b34801561073357600080fd5b5061073c611c19565b604051610749919061535f565b60405180910390f35b34801561075e57600080fd5b50610767611c3f565b60405161077491906155fd565b60405180910390f35b34801561078957600080fd5b50610792611c5d565b60405161079f91906155e2565b60405180910390f35b3480156107b457600080fd5b506107bd611c63565b6040516107ca919061535f565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f59190614e50565b611c89565b604051610807919061535f565b60405180910390f35b34801561081c57600080fd5b50610825611ca6565b6040516108329190615440565b60405180910390f35b34801561084757600080fd5b50610850611d34565b60405161085d919061535f565b60405180910390f35b34801561087257600080fd5b5061088d60048036038101906108889190614acb565b611d5a565b60405161089a91906155e2565b60405180910390f35b3480156108af57600080fd5b506108b8611df2565b005b6108d460048036038101906108cf9190614eb5565b611e06565b005b3480156108e257600080fd5b506108fd60048036038101906108f89190614acb565b612270565b005b34801561090b57600080fd5b5061092660048036038101906109219190614d31565b6122bc565b005b34801561093457600080fd5b5061094f600480360381019061094a9190614dac565b6122ce565b005b34801561095d57600080fd5b50610966612314565b604051610973919061535f565b60405180910390f35b34801561098857600080fd5b5061099161233a565b60405161099e91906155e2565b60405180910390f35b3480156109b357600080fd5b506109bc612340565b6040516109c9919061535f565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f49190614e79565b61236a565b005b348015610a0757600080fd5b50610a1061256a565b604051610a1d9190615440565b60405180910390f35b348015610a3257600080fd5b50610a3b6125fc565b604051610a48919061535f565b60405180910390f35b610a6b6004803603810190610a669190614c72565b612622565b005b348015610a7957600080fd5b50610a946004803603810190610a8f9190614bfa565b612b90565b005b348015610aa257600080fd5b50610aab612c9b565b604051610ab891906155e2565b60405180910390f35b348015610acd57600080fd5b50610ad6612ca1565b005b348015610ae457600080fd5b50610aed612cfc565b604051610afa91906155e2565b60405180910390f35b348015610b0f57600080fd5b50610b18612d02565b604051610b2591906155e2565b60405180910390f35b348015610b3a57600080fd5b50610b43612d08565b604051610b5091906155fd565b60405180910390f35b610b736004803603810190610b6e9190614b7f565b612d26565b005b348015610b8157600080fd5b50610b9c6004803603810190610b979190614acb565b612d4a565b005b348015610baa57600080fd5b50610bc56004803603810190610bc09190614e50565b612d96565b604051610bd29190615440565b60405180910390f35b348015610be757600080fd5b50610bf0612e5e565b604051610bfd91906155fd565b60405180910390f35b348015610c1257600080fd5b50610c2d6004803603810190610c289190614acb565b612e7c565b005b348015610c3b57600080fd5b50610c566004803603810190610c519190614acb565b612ec8565b005b348015610c6457600080fd5b50610c7f6004803603810190610c7a9190614acb565b612f14565b005b348015610c8d57600080fd5b50610c96612f60565b604051610ca3919061535f565b60405180910390f35b348015610cb857600080fd5b50610cd36004803603810190610cce9190614e50565b612f86565b604051610ce091906155e2565b60405180910390f35b348015610cf557600080fd5b50610d106004803603810190610d0b9190614acb565b612faf565b005b348015610d1e57600080fd5b50610d396004803603810190610d349190614af4565b612ffb565b604051610d4691906153ef565b60405180910390f35b348015610d5b57600080fd5b50610d6461308f565b604051610d71919061535f565b60405180910390f35b348015610d8657600080fd5b50610d8f6130b5565b604051610d9c91906155fd565b60405180910390f35b348015610db157600080fd5b50610dba6130d3565b604051610dc791906155e2565b60405180910390f35b348015610ddc57600080fd5b50610de56130d9565b604051610df291906155e2565b60405180910390f35b348015610e0757600080fd5b50610e106130df565b604051610e1d9190615440565b60405180910390f35b348015610e3257600080fd5b50610e4d6004803603810190610e489190614acb565b61316d565b005b348015610e5b57600080fd5b50610e646131f1565b604051610e719190615425565b60405180910390f35b60006002811115610eb4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600d60009054906101000a900460ff166002811115610efc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3390615482565b60405180910390fd5b60008411610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f76906155c2565b60405180910390fd5b6000606490508315610f9057605090505b8215610fa657600a81610fa391906157d3565b90505b60038614156110a55760648186610fbe6017546115ac565b610fc89190615779565b610fd29190615779565b610fdc9190615748565b34101561101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590615522565b60405180910390fd5b6064600f606361102e9190615779565b6110389190615748565b85601a5461104691906156f2565b1115611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107e90615562565b60405180910390fd5b84601a600082825461109991906156f2565b925050819055506112e2565b60028614156111a557606481866110bd6018546115ac565b6110c79190615779565b6110d19190615779565b6110db9190615748565b34101561111d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111490615522565b60405180910390fd5b6064600f610bb761112e9190615779565b6111389190615748565b85601b5461114691906156f2565b1115611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e90615562565b60405180910390fd5b84601b600082825461119991906156f2565b925050819055506112e1565b60018614156112a557606481866111bd6019546115ac565b6111c79190615779565b6111d19190615779565b6111db9190615748565b34101561121d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121490615522565b60405180910390fd5b6064600f61270f61122e9190615779565b6112389190615748565b85601c5461124691906156f2565b1115611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e90615562565b60405180910390fd5b84601c600082825461129991906156f2565b925050819055506112e0565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d7906154e2565b60405180910390fd5b5b5b6112ec8686613204565b7f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885333460405161131d9291906153c6565b60405180910390a1505050505050565b6000611338826133cc565b9050919050565b6113476133de565b6000600d60006101000a81548160ff02191690836002811115611393577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550565b6060600480546113a99061594e565b80601f01602080910402602001604051908101604052809291908181526020018280546113d59061594e565b80156114225780601f106113f757610100808354040283529160200191611422565b820191906000526020600020905b81548152906001019060200180831161140557829003601f168201915b5050505050905090565b60006114378261345c565b61144c5761144b63cf4700e460e01b613479565b5b61145582613483565b9050919050565b611468828260016134c3565b5050565b6114746133de565b6002600d60006101000a81548160ff021916908360028111156114c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550565b6114cf6133de565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61151b6133de565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006115696135f2565b600354600254030390507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61159c6135f7565b146115a957600a54810190505b90565b600080600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561161757600080fd5b505afa15801561162b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164f9190614f44565b50505091505060006402540be400826116689190615779565b90506000670de0b6b3a7640000856116809190615779565b9050600082670de0b6b3a7640000836116999190615779565b6116a39190615748565b905080945050505050919050565b60008190506116bf82612f86565b91506116cd8484848461361f565b50505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156118695760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006118736138e4565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661189f9190615779565b6118a99190615748565b90508160000151819350935050509250929050565b601f5481565b602180546118d19061594e565b80601f01602080910402602001604051908101604052809291908181526020018280546118fd9061594e565b801561194a5780601f1061191f5761010080835404028352916020019161194a565b820191906000526020600020905b81548152906001019060200180831161192d57829003601f168201915b505050505081565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610bb781565b6119866133de565b60004790506119cf600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064601c846119c09190615779565b6119ca9190615748565b6138ee565b611a07600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a83611a029190615748565b6138ee565b611a3f601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601483611a3a9190615748565b6138ee565b611a83601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064600e84611a749190615779565b611a7e9190615748565b6138ee565b611ac7601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064600e84611ab89190615779565b611ac29190615748565b6138ee565b611b0b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064600684611afc9190615779565b611b069190615748565b6138ee565b611b4f601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064600984611b409190615779565b611b4a9190615748565b6138ee565b611b93601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064600c84611b849190615779565b611b8e9190615748565b6138ee565b611bcb601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16603283611bc69190615748565b6138ee565b50565b611be983838360405180602001604052806000815250612d26565b505050565b606381565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601d60009054906101000a90046bffffffffffffffffffffffff1681565b60195481565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611c9482612f86565b9150611c9f82613941565b9050919050565b60228054611cb39061594e565b80601f0160208091040260200160405190810160405280929190818152602001828054611cdf9061594e565b8015611d2c5780601f10611d0157610100808354040283529160200191611d2c565b820191906000526020600020905b815481529060010190602001808311611d0f57829003601f168201915b505050505081565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611da157611da0638f4eb60460e01b613479565b5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611dfa6133de565b611e04600061396c565b565b600280811115611e3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600d60009054906101000a900460ff166002811115611e87577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe906154a2565b60405180910390fd5b60008411611f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f01906155c2565b60405180910390fd5b6000606490508315611f1b57605090505b8215611f3157600a81611f2e91906157d3565b90505b60038614156120185760648186611f496017546115ac565b611f539190615779565b611f5d9190615779565b611f679190615748565b341015611fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa090615522565b60405180910390fd5b606385601a54611fb991906156f2565b1115611ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff190615562565b60405180910390fd5b84601a600082825461200c91906156f2565b92505081905550612225565b600286141561210057606481866120306018546115ac565b61203a9190615779565b6120449190615779565b61204e9190615748565b341015612090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208790615522565b60405180910390fd5b610bb785601b546120a191906156f2565b11156120e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d990615562565b60405180910390fd5b84601b60008282546120f491906156f2565b92505081905550612224565b60018614156121e857606481866121186019546115ac565b6121229190615779565b61212c9190615779565b6121369190615748565b341015612178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216f90615522565b60405180910390fd5b61270f85601c5461218991906156f2565b11156121ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c190615562565b60405180910390fd5b84601c60008282546121dc91906156f2565b92505081905550612223565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221a906154e2565b60405180910390fd5b5b5b61222f8686613204565b7f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688533346040516122609291906153c6565b60405180910390a1505050505050565b6122786133de565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6122c46133de565b80601f8190555050565b6122d66133de565b8181602091906122e79291906147d9565b508383602191906122f99291906147d9565b5085856022919061230b9291906147d9565b50505050505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601c5481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6123726133de565b600081116123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac906155c2565b60405180910390fd5b600382141561242d57606381601a546123ce91906156f2565b111561240f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240690615562565b60405180910390fd5b80601a600082825461242191906156f2565b9250508190555061255c565b60028214156124a657610bb781601b5461244791906156f2565b1115612488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247f90615562565b60405180910390fd5b80601b600082825461249a91906156f2565b9250508190555061255b565b600182141561251f5761270f81601c546124c091906156f2565b1115612501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f890615562565b60405180910390fd5b80601c600082825461251391906156f2565b9250508190555061255a565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612551906154e2565b60405180910390fd5b5b5b6125668282613204565b5050565b6060600580546125799061594e565b80601f01602080910402602001604051908101604052809291908181526020018280546125a59061594e565b80156125f25780601f106125c7576101008083540402835291602001916125f2565b820191906000526020600020905b8154815290600101906020018083116125d557829003601f168201915b5050505050905090565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6001600281111561265c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600d60009054906101000a900460ff1660028111156126a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146126e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126db906154c2565b60405180910390fd5b60008411612727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271e906155c2565b60405180910390fd5b600060649050831561273857605090505b821561274e57600a8161274b91906157d3565b90505b6000336040516020016127619190615315565b6040516020818303038152906040528051906020012090506127c7898980806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601f5483613a32565b612806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fd90615582565b60405180910390fd5b6003871415612905576064828761281e6017546115ac565b6128289190615779565b6128329190615779565b61283c9190615748565b34101561287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287590615522565b60405180910390fd5b60646032606361288e9190615779565b6128989190615748565b86601a546128a691906156f2565b11156128e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128de90615562565b60405180910390fd5b85601a60008282546128f991906156f2565b92505081905550612b42565b6002871415612a05576064828761291d6018546115ac565b6129279190615779565b6129319190615779565b61293b9190615748565b34101561297d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297490615522565b60405180910390fd5b60646032610bb761298e9190615779565b6129989190615748565b86601b546129a691906156f2565b11156129e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129de90615562565b60405180910390fd5b85601b60008282546129f991906156f2565b92505081905550612b41565b6001871415612b055760648287612a1d6019546115ac565b612a279190615779565b612a319190615779565b612a3b9190615748565b341015612a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7490615522565b60405180910390fd5b6064603261270f612a8e9190615779565b612a989190615748565b86601c54612aa691906156f2565b1115612ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ade90615562565b60405180910390fd5b85601c6000828254612af991906156f2565b92505081905550612b40565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b37906154e2565b60405180910390fd5b5b5b612b4c8787613204565b7f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968853334604051612b7d9291906153c6565b60405180910390a1505050505050505050565b8060096000612b9d613a49565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612c4a613a49565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c8f91906153ef565b60405180910390a35050565b61270f81565b612ca96133de565b6001600d60006101000a81548160ff02191690836002811115612cf5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550565b601a5481565b601b5481565b601d600c9054906101000a90046bffffffffffffffffffffffff1681565b6000829050612d3483612f86565b9250612d438585858585613a51565b5050505050565b612d526133de565b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060612da18261345c565b612db657612db563a14c4b5060e01b613479565b5b60648211612df0576020612dc983613aa5565b604051602001612dda929190615330565b6040516020818303038152906040529050612e59565b610c1b8211612e2b576021612e0483613aa5565b604051602001612e15929190615330565b6040516020818303038152906040529050612e59565b6022612e3683613aa5565b604051602001612e47929190615330565b60405160208183030381529060405290505b919050565b601e600c9054906101000a90046bffffffffffffffffffffffff1681565b612e846133de565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612ed06133de565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612f1c6133de565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006001600c600084815260200190815260200160002054612fa891906157d3565b9050919050565b612fb76133de565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601e60009054906101000a90046bffffffffffffffffffffffff1681565b60175481565b60185481565b602080546130ec9061594e565b80601f01602080910402602001604051908101604052809291908181526020018280546131189061594e565b80156131655780601f1061313a57610100808354040283529160200191613165565b820191906000526020600020905b81548152906001019060200180831161314857829003601f168201915b505050505081565b6131756133de565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156131e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131dc90615462565b60405180910390fd5b6131ee8161396c565b50565b600d60009054906101000a900460ff1681565b600061320f83613bc9565b9050600061321b613c69565b905060005b83811015613275576001818361323691906156f2565b61324091906156f2565b600c6000838661325091906156f2565b815260200190815260200160002081905550808061326d906159b1565b915050613220565b50613281828433613c73565b60005b838110156133c5576132bc818461329b91906156f2565b33601d60009054906101000a90046bffffffffffffffffffffffff16613e63565b61330e81846132cb91906156f2565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601d600c9054906101000a90046bffffffffffffffffffffffff16613e63565b613360818461331d91906156f2565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601e60009054906101000a90046bffffffffffffffffffffffff16613e63565b6133b2818461336f91906156f2565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601e600c9054906101000a90046bffffffffffffffffffffffff16613e63565b80806133bd906159b1565b915050613284565b5050505050565b60006133d78261400b565b9050919050565b6133e661409d565b73ffffffffffffffffffffffffffffffffffffffff16613404612340565b73ffffffffffffffffffffffffffffffffffffffff161461345a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345190615502565b60405180910390fd5b565b600061346782612f86565b9150613472826140a5565b9050919050565b8060005260046000fd5b60006008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006134ce83611c89565b905081801561351057508073ffffffffffffffffffffffffffffffffffffffff166134f7613a49565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561353c5761352681613521613a49565b612ffb565b61353b5761353a63cfb3b94260e01b613479565b5b5b836008600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b600090565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b600061362a83614152565b905073ffffffffffffffffffffffffffffffffffffffff8573ffffffffffffffffffffffffffffffffffffffff161694508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461369f5761369e63a114810060e01b613479565b5b6000806136ab85614281565b915091506136c181886136bc613a49565b6142a8565b6136ec576136d6876136d1613a49565b612ffb565b6136eb576136ea6359c896be60e01b613479565b5b5b6136f987878760016142ec565b801561370457600082555b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506137d2866137ae8989876142f2565b7c02000000000000000000000000000000000000000000000000000000001761431a565b600660008781526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561385a576000600186019050600060066000838152602001908152602001600020541415613858576002548114613857578360066000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff8773ffffffffffffffffffffffffffffffffffffffff161690508481897fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460008114156138cd576138cc63ea553b3460e01b613479565b5b6138da8888886001614345565b5050505050505050565b6000612710905090565b6138f66133de565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561393c573d6000803e3d6000fd5b505050565b60008082101561395c5761395b63df2d9b4260e01b613479565b5b61396582614152565b9050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082613a3f858461434b565b1490509392505050565b600033905090565b613a5d8585858461361f565b60008473ffffffffffffffffffffffffffffffffffffffff163b14613a9e57613a88858583856143c7565b613a9d57613a9c63d1a57ed660e01b613479565b5b5b5050505050565b606060006001613ab484614506565b01905060008167ffffffffffffffff811115613af9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613b2b5781602001600182028036833780820191505090505b509050600082602001820190505b600115613bbe578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581613ba8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0494506000851415613bb957613bbe565b613b39565b819350505050919050565b60006003821415613bea57601a546001613be391906156f2565b9050613c64565b6002821415613c0957601b546064613c0291906156f2565b9050613c64565b6001821415613c2957601c54610c1b613c2291906156f2565b9050613c64565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c5b906154e2565b60405180910390fd5b919050565b6000600254905090565b600060025490506000831415613c9457613c9363b562e8dd60e01b613479565b5b60008385613ca291906156f2565b90506000604051806020016040528060008152509050613cd884613cc960008760006142f2565b613cd28861473d565b1761431a565b6006600085815260200190815260200160002081905550600160406001901b178502600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600073ffffffffffffffffffffffffffffffffffffffff8573ffffffffffffffffffffffffffffffffffffffff161690506000811415613d9157613d90632e07630060e01b613479565b5b6000879050613d9e6135f7565b600185031115613db957613db86381647e3a60e01b613479565b5b5b808260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a483816001019150811415613dba578660025401600281905550505060008473ffffffffffffffffffffffffffffffffffffffff163b14613e5b5760005b613e2f600086838a01856143c7565b613e4457613e4363d1a57ed660e01b613479565b5b858110613e20578260025414613e5957600080fd5b505b505050505050565b613e6b6138e4565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115613ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ec0906155a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f3090615542565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506001600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061406657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806140965750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600033905090565b6000816140b06135f2565b1161414c576140bd6135f7565b8211156140e7576140e0600660008481526020019081526020016000205461474d565b905061414d565b60025482101561414b5760005b600060066000858152602001908152602001600020549150811415614124578261411d90615924565b92506140f4565b60007c01000000000000000000000000000000000000000000000000000000008216149150505b5b5b919050565b60008161415d6135f2565b1161426b57600660008381526020019081526020016000205490506141806135f7565b8211156141ab576141908161474d565b1561419a5761427c565b6141aa63df2d9b4260e01b613479565b5b600081141561423d5760025482106141ce576141cd63df2d9b4260e01b613479565b5b5b600660008360019003935083815260200190815260200160002054905060008114156141fa57614238565b60007c0100000000000000000000000000000000000000000000000000000000821614156142275761427c565b61423763df2d9b4260e01b613479565b5b6141cf565b60007c01000000000000000000000000000000000000000000000000000000008216141561426a5761427c565b5b61427b63df2d9b4260e01b613479565b5b919050565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861430986868461478e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008082905060005b84518110156143bc576143a78286838151811061439a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151614797565b915080806143b4906159b1565b915050614354565b508091505092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026143ed613a49565b8786866040518563ffffffff1660e01b815260040161440f949392919061537a565b602060405180830381600087803b15801561442957600080fd5b505af192505050801561445a57506040513d601f19601f820116820180604052508101906144579190614d83565b60015b6144b3573d806000811461448a576040519150601f19603f3d011682016040523d82523d6000602084013e61448f565b606091505b506000815114156144ab576144aa63d1a57ed660e01b613479565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061458a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381614580577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506040810190505b6d04ee2d6d415b85acef810000000083106145ed576d04ee2d6d415b85acef810000000083816145e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506020810190505b662386f26fc10000831061464257662386f26fc100008381614638577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506010810190505b6305f5e1008310614691576305f5e1008381614687577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506008810190505b61271083106146dc5761271083816146d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506004810190505b60648310614725576064838161471b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506002810190505b600a8310614734576001810190505b80915050919050565b60006001821460e11b9050919050565b60007c0100000000000000000000000000000000000000000000000000000000821673ffffffffffffffffffffffffffffffffffffffff8316119050919050565b60009392505050565b60008183106147af576147aa82846147c2565b6147ba565b6147b983836147c2565b5b905092915050565b600082600052816020526040600020905092915050565b8280546147e59061594e565b90600052602060002090601f016020900481019282614807576000855561484e565b82601f1061482057803560ff191683800117855561484e565b8280016001018555821561484e579182015b8281111561484d578235825591602001919060010190614832565b5b50905061485b919061485f565b5090565b5b80821115614878576000816000905550600101614860565b5090565b600061488f61488a8461563d565b615618565b905080838252602082019050828560208602820111156148ae57600080fd5b60005b858110156148de57816148c488826149c4565b8452602084019350602083019250506001810190506148b1565b5050509392505050565b60006148fb6148f684615669565b615618565b90508281526020810184848401111561491357600080fd5b61491e8482856158e2565b509392505050565b60008135905061493581615dc2565b92915050565b60008083601f84011261494d57600080fd5b8235905067ffffffffffffffff81111561496657600080fd5b60208301915083602082028301111561497e57600080fd5b9250929050565b600082601f83011261499657600080fd5b81356149a684826020860161487c565b91505092915050565b6000813590506149be81615dd9565b92915050565b6000813590506149d381615df0565b92915050565b6000813590506149e881615e07565b92915050565b6000815190506149fd81615e07565b92915050565b600082601f830112614a1457600080fd5b8135614a248482602086016148e8565b91505092915050565b600081519050614a3c81615e1e565b92915050565b60008083601f840112614a5457600080fd5b8235905067ffffffffffffffff811115614a6d57600080fd5b602083019150836001820283011115614a8557600080fd5b9250929050565b600081359050614a9b81615e35565b92915050565b600081519050614ab081615e35565b92915050565b600081519050614ac581615e4c565b92915050565b600060208284031215614add57600080fd5b6000614aeb84828501614926565b91505092915050565b60008060408385031215614b0757600080fd5b6000614b1585828601614926565b9250506020614b2685828601614926565b9150509250929050565b600080600060608486031215614b4557600080fd5b6000614b5386828701614926565b9350506020614b6486828701614926565b9250506040614b7586828701614a8c565b9150509250925092565b60008060008060808587031215614b9557600080fd5b6000614ba387828801614926565b9450506020614bb487828801614926565b9350506040614bc587828801614a8c565b925050606085013567ffffffffffffffff811115614be257600080fd5b614bee87828801614a03565b91505092959194509250565b60008060408385031215614c0d57600080fd5b6000614c1b85828601614926565b9250506020614c2c858286016149af565b9150509250929050565b60008060408385031215614c4957600080fd5b6000614c5785828601614926565b9250506020614c6885828601614a8c565b9150509250929050565b600080600080600080600060c0888a031215614c8d57600080fd5b600088013567ffffffffffffffff811115614ca757600080fd5b614cb38a828b0161493b565b97509750506020614cc68a828b01614a8c565b9550506040614cd78a828b01614a8c565b9450506060614ce88a828b016149af565b9350506080614cf98a828b016149af565b92505060a088013567ffffffffffffffff811115614d1657600080fd5b614d228a828b01614985565b91505092959891949750929550565b600060208284031215614d4357600080fd5b6000614d51848285016149c4565b91505092915050565b600060208284031215614d6c57600080fd5b6000614d7a848285016149d9565b91505092915050565b600060208284031215614d9557600080fd5b6000614da3848285016149ee565b91505092915050565b60008060008060008060608789031215614dc557600080fd5b600087013567ffffffffffffffff811115614ddf57600080fd5b614deb89828a01614a42565b9650965050602087013567ffffffffffffffff811115614e0a57600080fd5b614e1689828a01614a42565b9450945050604087013567ffffffffffffffff811115614e3557600080fd5b614e4189828a01614a42565b92509250509295509295509295565b600060208284031215614e6257600080fd5b6000614e7084828501614a8c565b91505092915050565b60008060408385031215614e8c57600080fd5b6000614e9a85828601614a8c565b9250506020614eab85828601614a8c565b9150509250929050565b600080600080600060a08688031215614ecd57600080fd5b6000614edb88828901614a8c565b9550506020614eec88828901614a8c565b9450506040614efd888289016149af565b9350506060614f0e888289016149af565b925050608086013567ffffffffffffffff811115614f2b57600080fd5b614f3788828901614985565b9150509295509295909350565b600080600080600060a08688031215614f5c57600080fd5b6000614f6a88828901614ab6565b9550506020614f7b88828901614a2d565b9450506040614f8c88828901614aa1565b9350506060614f9d88828901614aa1565b9250506080614fae88828901614ab6565b9150509295509295909350565b614fc481615807565b82525050565b614fdb614fd682615807565b6159fa565b82525050565b614fea81615819565b82525050565b614ff981615825565b82525050565b600061500a826156af565b61501481856156c5565b93506150248185602086016158f1565b61502d81615b09565b840191505092915050565b615041816158d0565b82525050565b6000615052826156ba565b61505c81856156d6565b935061506c8185602086016158f1565b61507581615b09565b840191505092915050565b600061508b826156ba565b61509581856156e7565b93506150a58185602086016158f1565b80840191505092915050565b600081546150be8161594e565b6150c881866156e7565b945060018216600081146150e357600181146150f457615127565b60ff19831686528186019350615127565b6150fd8561569a565b60005b8381101561511f57815481890152600182019150602081019050615100565b838801955050505b50505092915050565b600061513d6026836156d6565b915061514882615b27565b604082019050919050565b60006151606017836156d6565b915061516b82615b76565b602082019050919050565b6000615183601a836156d6565b915061518e82615b9f565b602082019050919050565b60006151a66016836156d6565b91506151b182615bc8565b602082019050919050565b60006151c96015836156d6565b91506151d482615bf1565b602082019050919050565b60006151ec6005836156e7565b91506151f782615c1a565b600582019050919050565b600061520f6020836156d6565b915061521a82615c43565b602082019050919050565b60006152326019836156d6565b915061523d82615c6c565b602082019050919050565b6000615255601b836156d6565b915061526082615c95565b602082019050919050565b60006152786021836156d6565b915061528382615cbe565b604082019050919050565b600061529b600d836156d6565b91506152a682615d0d565b602082019050919050565b60006152be602a836156d6565b91506152c982615d36565b604082019050919050565b60006152e16012836156d6565b91506152ec82615d85565b602082019050919050565b61530081615898565b82525050565b61530f816158b8565b82525050565b60006153218284614fca565b60148201915081905092915050565b600061533c82856150b1565b91506153488284615080565b9150615353826151df565b91508190509392505050565b60006020820190506153746000830184614fbb565b92915050565b600060808201905061538f6000830187614fbb565b61539c6020830186614fbb565b6153a960408301856152f7565b81810360608301526153bb8184614fff565b905095945050505050565b60006040820190506153db6000830185614fbb565b6153e860208301846152f7565b9392505050565b60006020820190506154046000830184614fe1565b92915050565b600060208201905061541f6000830184614ff0565b92915050565b600060208201905061543a6000830184615038565b92915050565b6000602082019050818103600083015261545a8184615047565b905092915050565b6000602082019050818103600083015261547b81615130565b9050919050565b6000602082019050818103600083015261549b81615153565b9050919050565b600060208201905081810360008301526154bb81615176565b9050919050565b600060208201905081810360008301526154db81615199565b9050919050565b600060208201905081810360008301526154fb816151bc565b9050919050565b6000602082019050818103600083015261551b81615202565b9050919050565b6000602082019050818103600083015261553b81615225565b9050919050565b6000602082019050818103600083015261555b81615248565b9050919050565b6000602082019050818103600083015261557b8161526b565b9050919050565b6000602082019050818103600083015261559b8161528e565b9050919050565b600060208201905081810360008301526155bb816152b1565b9050919050565b600060208201905081810360008301526155db816152d4565b9050919050565b60006020820190506155f760008301846152f7565b92915050565b60006020820190506156126000830184615306565b92915050565b6000615622615633565b905061562e8282615980565b919050565b6000604051905090565b600067ffffffffffffffff82111561565857615657615ada565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561568457615683615ada565b5b61568d82615b09565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006156fd82615898565b915061570883615898565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561573d5761573c615a1e565b5b828201905092915050565b600061575382615898565b915061575e83615898565b92508261576e5761576d615a4d565b5b828204905092915050565b600061578482615898565b915061578f83615898565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156157c8576157c7615a1e565b5b828202905092915050565b60006157de82615898565b91506157e983615898565b9250828210156157fc576157fb615a1e565b5b828203905092915050565b600061581282615878565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061586982615dae565b919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600069ffffffffffffffffffff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b60006158db8261585b565b9050919050565b82818337600083830152505050565b60005b8381101561590f5780820151818401526020810190506158f4565b8381111561591e576000848401525b50505050565b600061592f82615898565b9150600082141561594357615942615a1e565b5b600182039050919050565b6000600282049050600182168061596657607f821691505b6020821081141561597a57615979615aab565b5b50919050565b61598982615b09565b810181811067ffffffffffffffff821117156159a8576159a7615ada565b5b80604052505050565b60006159bc82615898565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156159ef576159ee615a1e565b5b600182019050919050565b6000615a0582615a0c565b9050919050565b6000615a1782615b1a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5052455f53414c4553206973206e6f7420616374697665000000000000000000600082015250565b7f5055424c49435f53414c4553206973206e6f7420616374697665000000000000600082015250565b7f574c5f53414c4553206973206e6f742061637469766500000000000000000000600082015250565b7f496e76616c696420636f6c6c656374696f6e2049440000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f455243323938313a20496e76616c696420706172616d65746572730000000000600082015250565b7f4d617820737570706c79207265616368656420666f722074686973207068617360008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f496e76616c696420506172616d65746572210000000000000000000000000000600082015250565b60038110615dbf57615dbe615a7c565b5b50565b615dcb81615807565b8114615dd657600080fd5b50565b615de281615819565b8114615ded57600080fd5b50565b615df981615825565b8114615e0457600080fd5b50565b615e108161582f565b8114615e1b57600080fd5b50565b615e278161586e565b8114615e3257600080fd5b50565b615e3e81615898565b8114615e4957600080fd5b50565b615e55816158a2565b8114615e6057600080fd5b5056fea2646970667358221220c8f8ee7067dcaf212d85fba48e10f594d7b187bb4d80eabc9d9cb09f6d2c30cc64736f6c63430008040033
Deployed Bytecode Sourcemap
109016:14572:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;116258:1536;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111655:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113241:100;;;;;;;;;;;;;:::i;:::-;;51499;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;122547:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58456:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113455:106;;;;;;;;;;;;;:::i;:::-;;113871:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113683:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46701:573;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;111848:291;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;122772:280;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;105167:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;110057:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110233:136;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109470:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109552:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;112278:955;;;;;;;;;;;;;:::i;:::-;;123392:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109499:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109260:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109348:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109925:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109748:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109419:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;122241:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110376:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109371:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48425:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29447:103;;;;;;;;;;;;;:::i;:::-;;119530:1508;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113775:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113569:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;121929:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109318:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109878:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28806:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;121046:875;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51675:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109394:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;117802:1720;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59449:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109608:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113349:98;;;;;;;;;;;;;:::i;:::-;;109791:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109834:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109963:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;123060:324;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;114217:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;114563:563;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110026:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113967:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;114049;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;114303:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109288:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;122418:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;114131:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59840:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109444:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109997:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109667:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109707:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110091:135;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29705:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109169:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;116258:1536;116419:19;116399:39;;;;;;;;;;;;;;;;:16;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;116391:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;116496:1;116485:8;:12;116477:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;116533:12;116548:3;116533:18;;116568:8;116564:23;;;116585:2;116578:9;;116564:23;116602:8;116598:24;;;116620:2;116612:10;;;;;:::i;:::-;;;116598:24;116655:1;116639:12;:17;116635:1051;;;116740:3;116733:4;116722:8;116694:25;116707:11;;116694:12;:25::i;:::-;:36;;;;:::i;:::-;:43;;;;:::i;:::-;:49;;;;:::i;:::-;116681:9;:62;;116673:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;116858:3;116852:2;109543;116832:22;;;;:::i;:::-;116831:30;;;;:::i;:::-;116817:8;116797:17;;:28;;;;:::i;:::-;116796:66;;116788:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;116936:8;116915:17;;:29;;;;;;;:::i;:::-;;;;;;;;116635:1051;;;116982:1;116966:12;:17;116962:724;;;117068:3;117061:4;117050:8;117021:26;117034:12;;117021;:26::i;:::-;:37;;;;:::i;:::-;:44;;;;:::i;:::-;:50;;;;:::i;:::-;117008:9;:63;;117000:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;117188:3;117182:2;109597:4;117161:23;;;;:::i;:::-;117160:31;;;;:::i;:::-;117146:8;117125:18;;:29;;;;:::i;:::-;117124:68;;117116:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;117267:8;117245:18;;:30;;;;;;;:::i;:::-;;;;;;;;116962:724;;;117313:1;117297:12;:17;117293:393;;;117400:3;117393:4;117382:8;117352:27;117365:13;;117352:12;:27::i;:::-;:38;;;;:::i;:::-;:45;;;;:::i;:::-;:51;;;;:::i;:::-;117339:9;:64;;117331:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;117522:3;117516:2;109654:4;117494:24;;;;:::i;:::-;117493:32;;;;:::i;:::-;117479:8;117457:19;;:30;;;;:::i;:::-;117456:70;;117448:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;117602:8;117579:19;;:31;;;;;;;:::i;:::-;;;;;;;;117293:393;;;117643:31;;;;;;;;;;:::i;:::-;;;;;;;;117293:393;116962:724;116635:1051;117698:45;117720:12;117734:8;117698:21;:45::i;:::-;117759:27;117764:10;117776:9;117759:27;;;;;;;:::i;:::-;;;;;;;;116258:1536;;;;;;:::o;111655:185::-;111772:4;111796:36;111820:11;111796:23;:36::i;:::-;111789:43;;111655:185;;;:::o;113241:100::-;28692:13;:11;:13::i;:::-;113314:19:::1;113295:16;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113241:100::o:0;51499:::-;51553:13;51586:5;51579:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51499:100;:::o;122547:217::-;122623:7;122648:15;122655:7;122648:6;:15::i;:::-;122643:72;;122665:50;122673:41;;;122665:7;:50::i;:::-;122643:72;122735:21;122748:7;122735:12;:21::i;:::-;122728:28;;122547:217;;;:::o;58456:124::-;58545:27;58554:2;58558:7;58567:4;58545:8;:27::i;:::-;58456:124;;:::o;113455:106::-;28692:13;:11;:13::i;:::-;113531:22:::1;113512:16;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113455:106::o:0;113871:88::-;28692:13;:11;:13::i;:::-;113947:4:::1;113936:8;;:15;;;;;;;;;;;;;;;;;;113871:88:::0;:::o;113683:84::-;28692:13;:11;:13::i;:::-;113755:4:::1;113746:6;;:13;;;;;;;;;;;;;;;;;;113683:84:::0;:::o;46701:573::-;46762:14;47160:15;:13;:15::i;:::-;47145:12;;47129:13;;:28;:46;47120:55;;47215:17;47194;:15;:17::i;:::-;:38;47190:65;;47244:11;;47234:21;;;;47190:65;46701:573;:::o;111848:291::-;111905:4;111925:12;111947:9;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;111922:52;;;;;;111985:17;112019:4;112010:5;112005:18;;;;:::i;:::-;111985:38;;112034:8;112055:4;112045:7;:14;;;;:::i;:::-;112034:25;;112070:9;112097:12;112089:4;112083:3;:10;;;;:::i;:::-;112082:27;;;;:::i;:::-;112070:39;;112127:4;112120:11;;;;;;111848:291;;;:::o;122772:280::-;122914:19;122936:7;122914:29;;122964:24;122980:7;122964:15;:24::i;:::-;122954:34;;122999:45;123013:4;123019:2;123023:7;123032:11;122999:13;:45::i;:::-;122772:280;;;;:::o;105167:438::-;105262:7;105271;105291:26;105320:17;:26;105338:7;105320:26;;;;;;;;;;;105291:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105391:1;105363:30;;:7;:16;;;:30;;;105359:92;;;105420:19;105410:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105359:92;105463:21;105527:17;:15;:17::i;:::-;105487:57;;105500:7;:23;;;105488:35;;:9;:35;;;;:::i;:::-;105487:57;;;;:::i;:::-;105463:81;;105565:7;:16;;;105583:13;105557:40;;;;;;105167:438;;;;;:::o;110057:25::-;;;;:::o;110233:136::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;109470:20::-;;;;;;;;;;;;;:::o;109552:49::-;109597:4;109552:49;:::o;112278:955::-;28692:13;:11;:13::i;:::-;112328:15:::1;112346:21;112328:39;;112430;112440:6;;;;;;;;;;;112465:3;112459:2;112449:7;:12;;;;:::i;:::-;112448:20;;;;:::i;:::-;112430:9;:39::i;:::-;112534:33;112544:8;;;;;;;;;;;112564:2;112554:7;:12;;;;:::i;:::-;112534:9;:33::i;:::-;112631;112641:8;;;;;;;;;;;112661:2;112651:7;:12;;;;:::i;:::-;112631:9;:33::i;:::-;112722:34;112732:1;;;;;;;;;;;112752:3;112746:2;112736:7;:12;;;;:::i;:::-;112735:20;;;;:::i;:::-;112722:9;:34::i;:::-;112814;112824:1;;;;;;;;;;;112844:3;112838:2;112828:7;:12;;;;:::i;:::-;112827:20;;;;:::i;:::-;112814:9;:34::i;:::-;112907:35;112917:3;;;;;;;;;;;112938;112933:1;112923:7;:11;;;;:::i;:::-;112922:19;;;;:::i;:::-;112907:9;:35::i;:::-;113001;113011:3;;;;;;;;;;;113032;113027:1;113017:7;:11;;;;:::i;:::-;113016:19;;;;:::i;:::-;113001:9;:35::i;:::-;113097:37;113107:4;;;;;;;;;;;113130:3;113124:2;113114:7;:12;;;;:::i;:::-;113113:20;;;;:::i;:::-;113097:9;:37::i;:::-;113195:30;113205:5;;;;;;;;;;;113222:2;113212:7;:12;;;;:::i;:::-;113195:9;:30::i;:::-;28716:1;112278:955::o:0;123392:193::-;123538:39;123555:4;123561:2;123565:7;123538:39;;;;;;;;;;;;:16;:39::i;:::-;123392:193;;;:::o;109499:46::-;109543:2;109499:46;:::o;109260:21::-;;;;;;;;;;;;;:::o;109348:16::-;;;;;;;;;;;;;:::o;109925:31::-;;;;;;;;;;;;;:::o;109748:34::-;;;;:::o;109419:18::-;;;;;;;;;;;;;:::o;122241:169::-;122313:7;122343:24;122359:7;122343:15;:24::i;:::-;122333:34;;122385:17;122394:7;122385:8;:17::i;:::-;122378:24;;122241:169;;;:::o;110376:137::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;109371:16::-;;;;;;;;;;;;;:::o;48425:242::-;48497:7;48538:1;48521:19;;:5;:19;;;48517:69;;;48542:44;48550:35;;;48542:7;:44::i;:::-;48517:69;41185:13;48604:18;:25;48623:5;48604:25;;;;;;;;;;;;;;;;:55;48597:62;;48425:242;;;:::o;29447:103::-;28692:13;:11;:13::i;:::-;29512:30:::1;29539:1;29512:18;:30::i;:::-;29447:103::o:0;119530:1508::-;119694:22;119674:42;;;;;;;;;;;;;;;;:16;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;119666:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;119777:1;119766:8;:12;119758:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;119814:12;119829:3;119814:18;;119849:8;119845:23;;;119866:2;119859:9;;119845:23;119883:8;119879:24;;;119901:2;119893:10;;;;;:::i;:::-;;;119879:24;119936:1;119920:12;:17;119916:1006;;;120021:3;120014:4;120003:8;119975:25;119988:11;;119975:12;:25::i;:::-;:36;;;;:::i;:::-;:43;;;;:::i;:::-;:49;;;;:::i;:::-;119962:9;:62;;119954:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;109543:2;120098:8;120078:17;;:28;;;;:::i;:::-;120077:51;;120069:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;120202:8;120181:17;;:29;;;;;;;:::i;:::-;;;;;;;;119916:1006;;;120248:1;120232:12;:17;120228:694;;;120334:3;120327:4;120316:8;120287:26;120300:12;;120287;:26::i;:::-;:37;;;;:::i;:::-;:44;;;;:::i;:::-;:50;;;;:::i;:::-;120274:9;:63;;120266:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;109597:4;120412:8;120391:18;;:29;;;;:::i;:::-;120390:53;;120382:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;120518:8;120496:18;;:30;;;;;;;:::i;:::-;;;;;;;;120228:694;;;120564:1;120548:12;:17;120544:378;;;120651:3;120644:4;120633:8;120603:27;120616:13;;120603:12;:27::i;:::-;:38;;;;:::i;:::-;:45;;;;:::i;:::-;:51;;;;:::i;:::-;120590:9;:64;;120582:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;109654:4;120730:8;120708:19;;:30;;;;:::i;:::-;120707:55;;120699:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;120838:8;120815:19;;:31;;;;;;;:::i;:::-;;;;;;;;120544:378;;;120879:31;;;;;;;;;;:::i;:::-;;;;;;;;120544:378;120228:694;119916:1006;120942:45;120964:12;120978:8;120942:21;:45::i;:::-;121003:27;121008:10;121020:9;121003:27;;;;;;;:::i;:::-;;;;;;;;119530:1508;;;;;;:::o;113775:88::-;28692:13;:11;:13::i;:::-;113851:4:::1;113840:8;;:15;;;;;;;;;;;;;;;;;;113775:88:::0;:::o;113569:106::-;28692:13;:11;:13::i;:::-;113656:11:::1;113643:10;:24;;;;113569:106:::0;:::o;121929:304::-;28692:13;:11;:13::i;:::-;122108:15:::1;;122086:18;:37;;;;;;;:::i;:::-;;122157:16;;122134:19;:39;;;;;;;:::i;:::-;;122208:17;;122184:20;:41;;;;;;;:::i;:::-;;121929:304:::0;;;;;;:::o;109318:23::-;;;;;;;;;;;;;:::o;109878:38::-;;;;:::o;28806:87::-;28852:7;28879:6;;;;;;;;;;;28872:13;;28806:87;:::o;121046:875::-;28692:13;:11;:13::i;:::-;121153:1:::1;121142:8;:12;121134:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;121210:1;121194:12;:17;121190:658;;;109543:2;121257:8;121237:17;;:28;;;;:::i;:::-;121236:51;;121228:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;121361:8;121340:17;;:29;;;;;;;:::i;:::-;;;;;;;;121190:658;;;121407:1;121391:12;:17;121387:461;;;109597:4;121455:8;121434:18;;:29;;;;:::i;:::-;121433:53;;121425:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;121561:8;121539:18;;:30;;;;;;;:::i;:::-;;;;;;;;121387:461;;;121607:1;121591:12;:17;121587:261;;;109654:4;121656:8;121634:19;;:30;;;;:::i;:::-;121633:55;;121625:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;121764:8;121741:19;;:31;;;;;;;:::i;:::-;;;;;;;;121587:261;;;121805:31;;;;;;;;;;:::i;:::-;;;;;;;;121587:261;121387:461;121190:658;121868:45;121890:12;121904:8;121868:21;:45::i;:::-;121046:875:::0;;:::o;51675:104::-;51731:13;51764:7;51757:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51675:104;:::o;109394:18::-;;;;;;;;;;;;;:::o;117802:1720::-;117995:18;117975:38;;;;;;;;;;;;;;;;:16;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;117967:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;118070:1;118059:8;:12;118051:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;118107:12;118122:3;118107:18;;118142:8;118138:23;;;118159:2;118152:9;;118138:23;118176:8;118172:24;;;118194:2;118186:10;;;;;:::i;:::-;;;118172:24;118209:12;118251:10;118234:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;118224:39;;;;;;118209:54;;118282:50;118301:12;;118282:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118315:10;;118327:4;118282:18;:50::i;:::-;118274:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;118383:1;118367:12;:17;118363:1051;;;118468:3;118461:4;118450:8;118422:25;118435:11;;118422:12;:25::i;:::-;:36;;;;:::i;:::-;:43;;;;:::i;:::-;:49;;;;:::i;:::-;118409:9;:62;;118401:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;118586:3;118580:2;109543;118560:22;;;;:::i;:::-;118559:30;;;;:::i;:::-;118545:8;118525:17;;:28;;;;:::i;:::-;118524:66;;118516:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;118664:8;118643:17;;:29;;;;;;;:::i;:::-;;;;;;;;118363:1051;;;118710:1;118694:12;:17;118690:724;;;118796:3;118789:4;118778:8;118749:26;118762:12;;118749;:26::i;:::-;:37;;;;:::i;:::-;:44;;;;:::i;:::-;:50;;;;:::i;:::-;118736:9;:63;;118728:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;118916:3;118910:2;109597:4;118889:23;;;;:::i;:::-;118888:31;;;;:::i;:::-;118874:8;118853:18;;:29;;;;:::i;:::-;118852:68;;118844:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;118995:8;118973:18;;:30;;;;;;;:::i;:::-;;;;;;;;118690:724;;;119041:1;119025:12;:17;119021:393;;;119128:3;119121:4;119110:8;119080:27;119093:13;;119080:12;:27::i;:::-;:38;;;;:::i;:::-;:45;;;;:::i;:::-;:51;;;;:::i;:::-;119067:9;:64;;119059:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;119250:3;119244:2;109654:4;119222:24;;;;:::i;:::-;119221:32;;;;:::i;:::-;119207:8;119185:19;;:30;;;;:::i;:::-;119184:70;;119176:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;119330:8;119307:19;;:31;;;;;;;:::i;:::-;;;;;;;;119021:393;;;119371:31;;;;;;;;;;:::i;:::-;;;;;;;;119021:393;118690:724;118363:1051;119426:45;119448:12;119462:8;119426:21;:45::i;:::-;119487:27;119492:10;119504:9;119487:27;;;;;;;:::i;:::-;;;;;;;;117802:1720;;;;;;;;;:::o;59449:234::-;59596:8;59544:18;:39;59563:19;:17;:19::i;:::-;59544:39;;;;;;;;;;;;;;;:49;59584:8;59544:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;59656:8;59620:55;;59635:19;:17;:19::i;:::-;59620:55;;;59666:8;59620:55;;;;;;:::i;:::-;;;;;;;;59449:234;;:::o;109608:50::-;109654:4;109608:50;:::o;113349:98::-;28692:13;:11;:13::i;:::-;113421:18:::1;113402:16;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113349:98::o:0;109791:36::-;;;;:::o;109834:37::-;;;;:::o;109963:27::-;;;;;;;;;;;;;:::o;123060:324::-;123235:19;123257:7;123235:29;;123285:24;123301:7;123285:15;:24::i;:::-;123275:34;;123320:56;123338:4;123344:2;123348:7;123357:5;123364:11;123320:17;:56::i;:::-;123060:324;;;;;:::o;114217:78::-;28692:13;:11;:13::i;:::-;114283:4:::1;114277:3;;:10;;;;;;;;;;;;;;;;;;114217:78:::0;:::o;114563:563::-;114628:13;114659:15;114666:7;114659:6;:15::i;:::-;114654:67;;114676:45;114684:36;;;114676:7;:45::i;:::-;114654:67;114757:3;114746:7;:14;114742:377;;114808:18;114828;:7;:16;:18::i;:::-;114791:65;;;;;;;;;:::i;:::-;;;;;;;;;;;;;114777:80;;;;114742:377;114890:4;114879:7;:15;114875:244;;114942:19;114963:18;:7;:16;:18::i;:::-;114925:66;;;;;;;;;:::i;:::-;;;;;;;;;;;;;114911:81;;;;114875:244;115056:20;115078:18;:7;:16;:18::i;:::-;115039:67;;;;;;;;;:::i;:::-;;;;;;;;;;;;;115025:82;;114563:563;;;;:::o;110026:22::-;;;;;;;;;;;;;:::o;113967:74::-;28692:13;:11;:13::i;:::-;114029:4:::1;114025:1;;:8;;;;;;;;;;;;;;;;;;113967:74:::0;:::o;114049:::-;28692:13;:11;:13::i;:::-;114111:4:::1;114107:1;;:8;;;;;;;;;;;;;;;;;;114049:74:::0;:::o;114303:80::-;28692:13;:11;:13::i;:::-;114371:4:::1;114364;;:11;;;;;;;;;;;;;;;;;;114303:80:::0;:::o;109288:23::-;;;;;;;;;;;;;:::o;122418:121::-;122481:7;122530:1;122508:10;:19;122519:7;122508:19;;;;;;;;;;;;:23;;;;:::i;:::-;122501:30;;122418:121;;;:::o;114131:78::-;28692:13;:11;:13::i;:::-;114197:4:::1;114191:3;;:10;;;;;;;;;;;;;;;;;;114131:78:::0;:::o;59840:164::-;59937:4;59961:18;:25;59980:5;59961:25;;;;;;;;;;;;;;;:35;59987:8;59961:35;;;;;;;;;;;;;;;;;;;;;;;;;59954:42;;59840:164;;;;:::o;109444:19::-;;;;;;;;;;;;;:::o;109997:22::-;;;;;;;;;;;;;:::o;109667:33::-;;;;:::o;109707:34::-;;;;:::o;110091:135::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29705:201::-;28692:13;:11;:13::i;:::-;29814:1:::1;29794:22;;:8;:22;;;;29786:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29870:28;29889:8;29870:18;:28::i;:::-;29705:201:::0;:::o;109169:33::-;;;;;;;;;;;;;:::o;115556:694::-;115647:15;115665:29;115681:12;115665:15;:29::i;:::-;115647:47;;115705:20;115728:17;:15;:17::i;:::-;115705:40;;115763:9;115758:112;115782:8;115778:1;:12;115758:112;;;115857:1;115853;115838:12;:16;;;;:::i;:::-;:20;;;;:::i;:::-;115812:10;:23;115833:1;115823:7;:11;;;;:::i;:::-;115812:23;;;;;;;;;;;:46;;;;115792:3;;;;;:::i;:::-;;;;115758:112;;;;115882:39;115891:7;115900:8;115910:10;115882:8;:39::i;:::-;115941:9;115936:307;115960:8;115956:1;:12;115936:307;;;115990:60;116017:1;116007:7;:11;;;;:::i;:::-;116020:10;116032:17;;;;;;;;;;;115990:16;:60::i;:::-;116065:52;116092:1;116082:7;:11;;;;:::i;:::-;116095:6;;;;;;;;;;;116103:13;;;;;;;;;;;116065:16;:52::i;:::-;116132:42;116159:1;116149:7;:11;;;;:::i;:::-;116162:1;;;;;;;;;;;116165:8;;;;;;;;;;;116132:16;:42::i;:::-;116189;116216:1;116206:7;:11;;;;:::i;:::-;116219:1;;;;;;;;;;;116222:8;;;;;;;;;;;116189:16;:42::i;:::-;115970:3;;;;;:::i;:::-;;;;115936:307;;;;115556:694;;;;:::o;108499:171::-;108602:4;108626:36;108650:11;108626:23;:36::i;:::-;108619:43;;108499:171;;;:::o;28971:132::-;29046:12;:10;:12::i;:::-;29035:23;;:7;:5;:7::i;:::-;:23;;;29027:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28971:132::o;114391:164::-;114455:11;114489:24;114505:7;114489:15;:24::i;:::-;114479:34;;114531:16;114539:7;114531;:16::i;:::-;114524:23;;114391:164;;;:::o;97925:165::-;98026:13;98020:4;98013:27;98067:4;98061;98054:18;58974:135;59044:7;59071:15;:24;59087:7;59071:24;;;;;;;;;;;:30;;;;;;;;;;;;59064:37;;58974:135;;;:::o;86199:474::-;86328:13;86344:16;86352:7;86344;:16::i;:::-;86328:32;;86377:13;:45;;;;;86417:5;86394:28;;:19;:17;:19::i;:::-;:28;;;;86377:45;86373:201;;;86442:44;86459:5;86466:19;:17;:19::i;:::-;86442:16;:44::i;:::-;86437:137;;86507:51;86515:42;;;86507:7;:51::i;:::-;86437:137;86373:201;86619:2;86586:15;:24;86602:7;86586:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;86657:7;86653:2;86637:28;;86646:5;86637:28;;;;;;;;;;;;86199:474;;;;:::o;45749:92::-;45805:7;45749:92;:::o;46199:110::-;46257:7;46284:17;46277:24;;46199:110;:::o;66685:3543::-;66843:27;66873;66892:7;66873:18;:27::i;:::-;66843:57;;42643:14;67044:4;67028:22;;:41;67005:66;;67129:4;67088:45;;67104:19;67088:45;;;67084:95;;67135:44;67143:35;;;67135:7;:44::i;:::-;67084:95;67193:27;67222:23;67249:35;67276:7;67249:26;:35::i;:::-;67192:92;;;;67384:68;67409:15;67426:4;67432:19;:17;:19::i;:::-;67384:24;:68::i;:::-;67379:189;;67472:43;67489:4;67495:19;:17;:19::i;:::-;67472:16;:43::i;:::-;67467:101;;67517:51;67525:42;;;67517:7;:51::i;:::-;67467:101;67379:189;67581:43;67603:4;67609:2;67613:7;67622:1;67581:21;:43::i;:::-;67717:15;67714:2;;;67857:1;67836:19;67829:30;67714:2;68254:18;:24;68273:4;68254:24;;;;;;;;;;;;;;;;68252:26;;;;;;;;;;;;68323:18;:22;68342:2;68323:22;;;;;;;;;;;;;;;;68321:24;;;;;;;;;;;68645:146;68682:2;68731:45;68746:4;68752:2;68756:19;68731:14;:45::i;:::-;42241:8;68703:73;68645:18;:146::i;:::-;68616:17;:26;68634:7;68616:26;;;;;;;;;;;:175;;;;68962:1;42241:8;68911:19;:47;:52;68907:627;;;68984:19;69016:1;69006:7;:11;68984:33;;69173:1;69139:17;:30;69157:11;69139:30;;;;;;;;;;;;:35;69135:384;;;69277:13;;69262:11;:28;69258:242;;69457:19;69424:17;:30;69442:11;69424:30;;;;;;;;;;;:52;;;;69258:242;69135:384;68907:627;;69647:16;42643:14;69682:2;69666:20;;:39;69647:58;;70046:11;70010:8;69976:4;69918:25;69863:1;69806;69783:303;70123:1;70111:8;:13;70107:58;;;70126:39;70134:30;;;70126:7;:39::i;:::-;70107:58;70178:42;70199:4;70205:2;70209:7;70218:1;70178:20;:42::i;:::-;66685:3543;;;;;;;;:::o;105887:97::-;105945:6;105971:5;105964:12;;105887:97;:::o;112147:123::-;28692:13;:11;:13::i;:::-;112237:6:::1;112229:24;;:33;112254:7;112229:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;112147:123:::0;;:::o;98207:221::-;98273:7;98307:1;98297:7;:11;98293:64;;;98310:47;98318:38;;;98310:7;:47::i;:::-;98293:64;98391:27;98410:7;98391:18;:27::i;:::-;98368:52;;98207:221;;;:::o;30066:191::-;30140:16;30159:6;;;;;;;;;;;30140:25;;30185:8;30176:6;;:17;;;;;;;;;;;;;;;;;;30240:8;30209:40;;30230:8;30209:40;;;;;;;;;;;;30066:191;;:::o;16620:156::-;16711:4;16764;16735:25;16748:5;16755:4;16735:12;:25::i;:::-;:33;16728:40;;16620:156;;;;;:::o;95906:105::-;95966:7;95993:10;95986:17;;95906:105;:::o;71539:450::-;71730:45;71744:4;71750:2;71754:7;71763:11;71730:13;:45::i;:::-;71808:1;71790:2;:14;;;:19;71786:196;;71829:60;71860:4;71866:2;71870:11;71883:5;71829:30;:60::i;:::-;71824:158;;71910:56;71918:47;;;71910:7;:56::i;:::-;71824:158;71786:196;71539:450;;;;;:::o;25327:716::-;25383:13;25434:14;25471:1;25451:17;25462:5;25451:10;:17::i;:::-;:21;25434:38;;25487:20;25521:6;25510:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25487:41;;25543:11;25672:6;25668:2;25664:15;25656:6;25652:28;25645:35;;25709:288;25716:4;25709:288;;;25741:5;;;;;;;;25883:8;25878:2;25871:5;25867:14;25862:30;25857:3;25849:44;25939:2;25930:11;;;;;;;;;;;;;;;;;25973:1;25964:5;:10;25960:21;;;25976:5;;25960:21;25709:288;;;26018:6;26011:13;;;;;25327:716;;;:::o;115134:414::-;115203:7;115243:1;115227:12;:17;115223:318;;;115272:17;;115268:1;:21;;;;:::i;:::-;115261:28;;;;115223:318;115327:1;115311:12;:17;115307:234;;;115358:18;;115352:3;:24;;;;:::i;:::-;115345:31;;;;115307:234;115414:1;115398:12;:17;115394:147;;;115446:19;;115439:4;:26;;;;:::i;:::-;115432:33;;;;115394:147;115498:31;;;;;;;;;;:::i;:::-;;;;;;;;115134:414;;;;:::o;98098:101::-;98151:7;98178:13;;98171:20;;98098:101;:::o;98436:2900::-;98529:20;98552:13;;98529:36;;98592:1;98580:8;:13;98576:53;;;98595:34;98603:25;;;98595:7;:34::i;:::-;98576:53;98642:11;98666:8;98656:7;:18;;;;:::i;:::-;98642:32;;98685:18;:23;;;;;;;;;;;;;;99179:139;99216:2;99270:33;99293:1;99297:2;99301:1;99270:14;:33::i;:::-;99237:30;99258:8;99237:20;:30::i;:::-;:66;99179:18;:139::i;:::-;99145:17;:31;99163:12;99145:31;;;;;;;;;;;:173;;;;99605:1;41323:2;99575:1;:26;;99574:32;99562:8;:45;99536:18;:22;99555:2;99536:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;99718:16;42643:14;99753:2;99737:20;;:39;99718:58;;99809:1;99797:8;:13;99793:54;;;99812:35;99820:26;;;99812:7;:35::i;:::-;99793:54;99864:15;99882:7;99864:25;;99920:17;:15;:17::i;:::-;99916:1;99910:3;:7;:27;99906:77;;;99939:44;99947:35;;;99939:7;:44::i;:::-;99906:77;100000:678;100421:7;100377:8;100332:1;100266:25;100203:1;100138;100107:358;100673:3;100660:9;;;;;;:16;;100000:678;;100726:8;100710:13;;:24;100694:13;:40;;;;98436:2900;;100805:1;100787:2;:14;;;:19;100783:535;;100827:13;100863:255;100894:70;100933:1;100937:2;100951:5;100941:7;:15;100958:5;100894:30;:70::i;:::-;100889:184;;100993:56;101001:47;;;100993:7;:56::i;:::-;100889:184;101108:8;101100:5;:16;100863:255;;101289:3;101272:13;;:20;101268:34;;101294:8;;;101268:34;100783:535;;98436:2900;;;;;;:::o;107038:356::-;107172:17;:15;:17::i;:::-;107156:33;;:12;:33;;;;107148:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;107275:1;107255:22;;:8;:22;;;;107247:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;107351:35;;;;;;;;107363:8;107351:35;;;;;;107373:12;107351:35;;;;;107322:17;:26;107340:7;107322:26;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107038:356;;;:::o;50597:639::-;50682:4;51021:10;51006:25;;:11;:25;;;;:102;;;;51098:10;51083:25;;:11;:25;;;;51006:102;:179;;;;51175:10;51160:25;;:11;:25;;;;51006:179;50986:199;;50597:639;;;:::o;15372:98::-;15425:7;15452:10;15445:17;;15372:98;:::o;60262:475::-;60327:11;60374:7;60355:15;:13;:15::i;:::-;:26;60351:379;;60412:17;:15;:17::i;:::-;60402:7;:27;60398:90;;;60438:50;60461:17;:26;60479:7;60461:26;;;;;;;;;;;;60438:22;:50::i;:::-;60431:57;;;;60398:90;60519:13;;60509:7;:23;60505:214;;;60553:14;60586:60;60634:1;60603:17;:26;60621:7;60603:26;;;;;;;;;;;;60594:35;;;60593:42;60586:60;;;60637:9;;;;:::i;:::-;;;60586:60;;;60702:1;41961:8;60674:6;:24;:29;60665:38;;60505:214;;60351:379;60262:475;;;;:::o;54386:2213::-;54453:14;54503:7;54484:15;:13;:15::i;:::-;:26;54480:2054;;54536:17;:26;54554:7;54536:26;;;;;;;;;;;;54527:35;;54593:17;:15;:17::i;:::-;54583:7;:27;54579:183;;;54635:30;54658:6;54635:22;:30::i;:::-;54631:49;;;54667:13;;54631:49;54699:47;54707:38;;;54699:7;:47::i;:::-;54579:183;54873:1;54863:6;:11;54859:1292;;;54910:13;;54899:7;:24;54895:77;;54925:47;54933:38;;;54925:7;:47::i;:::-;54895:77;55529:607;55607:17;:28;55625:9;;;;;;;55607:28;;;;;;;;;;;;55598:37;;55695:1;55685:6;:11;55681:25;;;55698:8;;55681:25;55761:1;41961:8;55733:6;:24;:29;55729:48;;;55764:13;;55729:48;56069:47;56077:38;;;56069:7;:47::i;:::-;55529:607;;;54859:1292;56506:1;41961:8;56478:6;:24;:29;56474:48;;;56509:13;;56474:48;54480:2054;56544:47;56552:38;;;56544:7;:47::i;:::-;54386:2213;;;;:::o;62049:485::-;62151:27;62180:23;62221:38;62262:15;:24;62278:7;62262:24;;;;;;;;;;;62221:65;;62439:18;62416:41;;62496:19;62490:26;62471:45;;62401:126;;;;:::o;61277:659::-;61426:11;61591:16;61584:5;61580:28;61571:37;;61751:16;61740:9;61736:32;61723:45;;61901:15;61890:9;61887:30;61879:5;61868:9;61865:20;61862:56;61852:66;;61459:470;;;;;:::o;72655:159::-;;;;;:::o;95215:311::-;95350:7;95370:16;42365:3;95396:19;:41;;95370:68;;42365:3;95464:31;95475:4;95481:2;95485:9;95464:10;:31::i;:::-;95456:40;;:62;;95449:69;;;95215:311;;;;;:::o;57147:450::-;57227:14;57395:16;57388:5;57384:28;57375:37;;57572:5;57558:11;57533:23;57529:41;57526:52;57519:5;57516:63;57506:73;;57263:327;;;;:::o;73479:158::-;;;;;:::o;17419:296::-;17502:7;17522:20;17545:4;17522:27;;17565:9;17560:118;17584:5;:12;17580:1;:16;17560:118;;;17633:33;17643:12;17657:5;17663:1;17657:8;;;;;;;;;;;;;;;;;;;;;;17633:9;:33::i;:::-;17618:48;;17598:3;;;;;:::i;:::-;;;;17560:118;;;;17695:12;17688:19;;;17419:296;;;;:::o;74077:691::-;74240:4;74286:2;74261:45;;;74307:19;:17;:19::i;:::-;74328:4;74334:7;74343:5;74261:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;74257:504;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74561:1;74544:6;:13;:18;74540:115;;;74583:56;74591:47;;;74583:7;:56::i;:::-;74540:115;74727:6;74721:13;74712:6;74708:2;74704:15;74697:38;74257:504;74430:54;;;74420:64;;;:6;:64;;;;74413:71;;;74077:691;;;;;;:::o;10927:948::-;10980:7;11000:14;11017:1;11000:18;;11067:8;11058:5;:17;11054:106;;11105:8;11096:17;;;;;;;;;;;;;;;;;11142:2;11132:12;;;;11054:106;11187:8;11178:5;:17;11174:106;;11225:8;11216:17;;;;;;;;;;;;;;;;;11262:2;11252:12;;;;11174:106;11307:8;11298:5;:17;11294:106;;11345:8;11336:17;;;;;;;;;;;;;;;;;11382:2;11372:12;;;;11294:106;11427:7;11418:5;:16;11414:103;;11464:7;11455:16;;;;;;;;;;;;;;;;;11500:1;11490:11;;;;11414:103;11544:7;11535:5;:16;11531:103;;11581:7;11572:16;;;;;;;;;;;;;;;;;11617:1;11607:11;;;;11531:103;11661:7;11652:5;:16;11648:103;;11698:7;11689:16;;;;;;;;;;;;;;;;;11734:1;11724:11;;;;11648:103;11778:7;11769:5;:16;11765:68;;11816:1;11806:11;;;;11765:68;11861:6;11854:13;;;10927:948;;;:::o;57699:324::-;57769:14;58002:1;57992:8;57989:15;57963:24;57959:46;57949:56;;57871:145;;;:::o;60833:335::-;60903:11;61133:15;61125:6;61121:28;61102:16;61094:6;61090:29;61087:63;61077:73;;60936:225;;;:::o;94916:147::-;95053:6;94916:147;;;;;:::o;24623:149::-;24686:7;24717:1;24713;:5;:51;;24744:20;24759:1;24762;24744:14;:20::i;:::-;24713:51;;;24721:20;24736:1;24739;24721:14;:20::i;:::-;24713:51;24706:58;;24623:149;;;;:::o;24780:268::-;24848:13;24955:1;24949:4;24942:15;24984:1;24978:4;24971:15;25025:4;25019;25009:21;25000:30;;24927:114;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:139::-;1080:5;1118:6;1105:20;1096:29;;1134:33;1161:5;1134:33;:::i;:::-;1086:87;;;;:::o;1196:367::-;1269:8;1279:6;1329:3;1322:4;1314:6;1310:17;1306:27;1296:2;;1347:1;1344;1337:12;1296:2;1383:6;1370:20;1360:30;;1413:18;1405:6;1402:30;1399:2;;;1445:1;1442;1435:12;1399:2;1482:4;1474:6;1470:17;1458:29;;1536:3;1528:4;1520:6;1516:17;1506:8;1502:32;1499:41;1496:2;;;1553:1;1550;1543:12;1496:2;1286:277;;;;;:::o;1586:303::-;1657:5;1706:3;1699:4;1691:6;1687:17;1683:27;1673:2;;1724:1;1721;1714:12;1673:2;1764:6;1751:20;1789:94;1879:3;1871:6;1864:4;1856:6;1852:17;1789:94;:::i;:::-;1780:103;;1663:226;;;;;:::o;1895:133::-;1938:5;1976:6;1963:20;1954:29;;1992:30;2016:5;1992:30;:::i;:::-;1944:84;;;;:::o;2034:139::-;2080:5;2118:6;2105:20;2096:29;;2134:33;2161:5;2134:33;:::i;:::-;2086:87;;;;:::o;2179:137::-;2224:5;2262:6;2249:20;2240:29;;2278:32;2304:5;2278:32;:::i;:::-;2230:86;;;;:::o;2322:141::-;2378:5;2409:6;2403:13;2394:22;;2425:32;2451:5;2425:32;:::i;:::-;2384:79;;;;:::o;2482:271::-;2537:5;2586:3;2579:4;2571:6;2567:17;2563:27;2553:2;;2604:1;2601;2594:12;2553:2;2644:6;2631:20;2669:78;2743:3;2735:6;2728:4;2720:6;2716:17;2669:78;:::i;:::-;2660:87;;2543:210;;;;;:::o;2759:141::-;2815:5;2846:6;2840:13;2831:22;;2862:32;2888:5;2862:32;:::i;:::-;2821:79;;;;:::o;2920:352::-;2978:8;2988:6;3038:3;3031:4;3023:6;3019:17;3015:27;3005:2;;3056:1;3053;3046:12;3005:2;3092:6;3079:20;3069:30;;3122:18;3114:6;3111:30;3108:2;;;3154:1;3151;3144:12;3108:2;3191:4;3183:6;3179:17;3167:29;;3245:3;3237:4;3229:6;3225:17;3215:8;3211:32;3208:41;3205:2;;;3262:1;3259;3252:12;3205:2;2995:277;;;;;:::o;3278:139::-;3324:5;3362:6;3349:20;3340:29;;3378:33;3405:5;3378:33;:::i;:::-;3330:87;;;;:::o;3423:143::-;3480:5;3511:6;3505:13;3496:22;;3527:33;3554:5;3527:33;:::i;:::-;3486:80;;;;:::o;3572:141::-;3628:5;3659:6;3653:13;3644:22;;3675:32;3701:5;3675:32;:::i;:::-;3634:79;;;;:::o;3719:262::-;3778:6;3827:2;3815:9;3806:7;3802:23;3798:32;3795:2;;;3843:1;3840;3833:12;3795:2;3886:1;3911:53;3956:7;3947:6;3936:9;3932:22;3911:53;:::i;:::-;3901:63;;3857:117;3785:196;;;;:::o;3987:407::-;4055:6;4063;4112:2;4100:9;4091:7;4087:23;4083:32;4080:2;;;4128:1;4125;4118:12;4080:2;4171:1;4196:53;4241:7;4232:6;4221:9;4217:22;4196:53;:::i;:::-;4186:63;;4142:117;4298:2;4324:53;4369:7;4360:6;4349:9;4345:22;4324:53;:::i;:::-;4314:63;;4269:118;4070:324;;;;;:::o;4400:552::-;4477:6;4485;4493;4542:2;4530:9;4521:7;4517:23;4513:32;4510:2;;;4558:1;4555;4548:12;4510:2;4601:1;4626:53;4671:7;4662:6;4651:9;4647:22;4626:53;:::i;:::-;4616:63;;4572:117;4728:2;4754:53;4799:7;4790:6;4779:9;4775:22;4754:53;:::i;:::-;4744:63;;4699:118;4856:2;4882:53;4927:7;4918:6;4907:9;4903:22;4882:53;:::i;:::-;4872:63;;4827:118;4500:452;;;;;:::o;4958:809::-;5053:6;5061;5069;5077;5126:3;5114:9;5105:7;5101:23;5097:33;5094:2;;;5143:1;5140;5133:12;5094:2;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;5441:2;5467:53;5512:7;5503:6;5492:9;5488:22;5467:53;:::i;:::-;5457:63;;5412:118;5597:2;5586:9;5582:18;5569:32;5628:18;5620:6;5617:30;5614:2;;;5660:1;5657;5650:12;5614:2;5688:62;5742:7;5733:6;5722:9;5718:22;5688:62;:::i;:::-;5678:72;;5540:220;5084:683;;;;;;;:::o;5773:401::-;5838:6;5846;5895:2;5883:9;5874:7;5870:23;5866:32;5863:2;;;5911:1;5908;5901:12;5863:2;5954:1;5979:53;6024:7;6015:6;6004:9;6000:22;5979:53;:::i;:::-;5969:63;;5925:117;6081:2;6107:50;6149:7;6140:6;6129:9;6125:22;6107:50;:::i;:::-;6097:60;;6052:115;5853:321;;;;;:::o;6180:407::-;6248:6;6256;6305:2;6293:9;6284:7;6280:23;6276:32;6273:2;;;6321:1;6318;6311:12;6273:2;6364:1;6389:53;6434:7;6425:6;6414:9;6410:22;6389:53;:::i;:::-;6379:63;;6335:117;6491:2;6517:53;6562:7;6553:6;6542:9;6538:22;6517:53;:::i;:::-;6507:63;;6462:118;6263:324;;;;;:::o;6593:1284::-;6743:6;6751;6759;6767;6775;6783;6791;6840:3;6828:9;6819:7;6815:23;6811:33;6808:2;;;6857:1;6854;6847:12;6808:2;6928:1;6917:9;6913:17;6900:31;6958:18;6950:6;6947:30;6944:2;;;6990:1;6987;6980:12;6944:2;7026:80;7098:7;7089:6;7078:9;7074:22;7026:80;:::i;:::-;7008:98;;;;6871:245;7155:2;7181:53;7226:7;7217:6;7206:9;7202:22;7181:53;:::i;:::-;7171:63;;7126:118;7283:2;7309:53;7354:7;7345:6;7334:9;7330:22;7309:53;:::i;:::-;7299:63;;7254:118;7411:2;7437:50;7479:7;7470:6;7459:9;7455:22;7437:50;:::i;:::-;7427:60;;7382:115;7536:3;7563:50;7605:7;7596:6;7585:9;7581:22;7563:50;:::i;:::-;7553:60;;7507:116;7690:3;7679:9;7675:19;7662:33;7722:18;7714:6;7711:30;7708:2;;;7754:1;7751;7744:12;7708:2;7782:78;7852:7;7843:6;7832:9;7828:22;7782:78;:::i;:::-;7772:88;;7633:237;6798:1079;;;;;;;;;;:::o;7883:262::-;7942:6;7991:2;7979:9;7970:7;7966:23;7962:32;7959:2;;;8007:1;8004;7997:12;7959:2;8050:1;8075:53;8120:7;8111:6;8100:9;8096:22;8075:53;:::i;:::-;8065:63;;8021:117;7949:196;;;;:::o;8151:260::-;8209:6;8258:2;8246:9;8237:7;8233:23;8229:32;8226:2;;;8274:1;8271;8264:12;8226:2;8317:1;8342:52;8386:7;8377:6;8366:9;8362:22;8342:52;:::i;:::-;8332:62;;8288:116;8216:195;;;;:::o;8417:282::-;8486:6;8535:2;8523:9;8514:7;8510:23;8506:32;8503:2;;;8551:1;8548;8541:12;8503:2;8594:1;8619:63;8674:7;8665:6;8654:9;8650:22;8619:63;:::i;:::-;8609:73;;8565:127;8493:206;;;;:::o;8705:951::-;8818:6;8826;8834;8842;8850;8858;8907:2;8895:9;8886:7;8882:23;8878:32;8875:2;;;8923:1;8920;8913:12;8875:2;8994:1;8983:9;8979:17;8966:31;9024:18;9016:6;9013:30;9010:2;;;9056:1;9053;9046:12;9010:2;9092:65;9149:7;9140:6;9129:9;9125:22;9092:65;:::i;:::-;9074:83;;;;8937:230;9234:2;9223:9;9219:18;9206:32;9265:18;9257:6;9254:30;9251:2;;;9297:1;9294;9287:12;9251:2;9333:65;9390:7;9381:6;9370:9;9366:22;9333:65;:::i;:::-;9315:83;;;;9177:231;9475:2;9464:9;9460:18;9447:32;9506:18;9498:6;9495:30;9492:2;;;9538:1;9535;9528:12;9492:2;9574:65;9631:7;9622:6;9611:9;9607:22;9574:65;:::i;:::-;9556:83;;;;9418:231;8865:791;;;;;;;;:::o;9662:262::-;9721:6;9770:2;9758:9;9749:7;9745:23;9741:32;9738:2;;;9786:1;9783;9776:12;9738:2;9829:1;9854:53;9899:7;9890:6;9879:9;9875:22;9854:53;:::i;:::-;9844:63;;9800:117;9728:196;;;;:::o;9930:407::-;9998:6;10006;10055:2;10043:9;10034:7;10030:23;10026:32;10023:2;;;10071:1;10068;10061:12;10023:2;10114:1;10139:53;10184:7;10175:6;10164:9;10160:22;10139:53;:::i;:::-;10129:63;;10085:117;10241:2;10267:53;10312:7;10303:6;10292:9;10288:22;10267:53;:::i;:::-;10257:63;;10212:118;10013:324;;;;;:::o;10343:975::-;10457:6;10465;10473;10481;10489;10538:3;10526:9;10517:7;10513:23;10509:33;10506:2;;;10555:1;10552;10545:12;10506:2;10598:1;10623:53;10668:7;10659:6;10648:9;10644:22;10623:53;:::i;:::-;10613:63;;10569:117;10725:2;10751:53;10796:7;10787:6;10776:9;10772:22;10751:53;:::i;:::-;10741:63;;10696:118;10853:2;10879:50;10921:7;10912:6;10901:9;10897:22;10879:50;:::i;:::-;10869:60;;10824:115;10978:2;11004:50;11046:7;11037:6;11026:9;11022:22;11004:50;:::i;:::-;10994:60;;10949:115;11131:3;11120:9;11116:19;11103:33;11163:18;11155:6;11152:30;11149:2;;;11195:1;11192;11185:12;11149:2;11223:78;11293:7;11284:6;11273:9;11269:22;11223:78;:::i;:::-;11213:88;;11074:237;10496:822;;;;;;;;:::o;11324:904::-;11427:6;11435;11443;11451;11459;11508:3;11496:9;11487:7;11483:23;11479:33;11476:2;;;11525:1;11522;11515:12;11476:2;11568:1;11593:63;11648:7;11639:6;11628:9;11624:22;11593:63;:::i;:::-;11583:73;;11539:127;11705:2;11731:63;11786:7;11777:6;11766:9;11762:22;11731:63;:::i;:::-;11721:73;;11676:128;11843:2;11869:64;11925:7;11916:6;11905:9;11901:22;11869:64;:::i;:::-;11859:74;;11814:129;11982:2;12008:64;12064:7;12055:6;12044:9;12040:22;12008:64;:::i;:::-;11998:74;;11953:129;12121:3;12148:63;12203:7;12194:6;12183:9;12179:22;12148:63;:::i;:::-;12138:73;;12092:129;11466:762;;;;;;;;:::o;12234:118::-;12321:24;12339:5;12321:24;:::i;:::-;12316:3;12309:37;12299:53;;:::o;12358:157::-;12463:45;12483:24;12501:5;12483:24;:::i;:::-;12463:45;:::i;:::-;12458:3;12451:58;12441:74;;:::o;12521:109::-;12602:21;12617:5;12602:21;:::i;:::-;12597:3;12590:34;12580:50;;:::o;12636:118::-;12723:24;12741:5;12723:24;:::i;:::-;12718:3;12711:37;12701:53;;:::o;12760:360::-;12846:3;12874:38;12906:5;12874:38;:::i;:::-;12928:70;12991:6;12986:3;12928:70;:::i;:::-;12921:77;;13007:52;13052:6;13047:3;13040:4;13033:5;13029:16;13007:52;:::i;:::-;13084:29;13106:6;13084:29;:::i;:::-;13079:3;13075:39;13068:46;;12850:270;;;;;:::o;13126:155::-;13225:49;13268:5;13225:49;:::i;:::-;13220:3;13213:62;13203:78;;:::o;13287:364::-;13375:3;13403:39;13436:5;13403:39;:::i;:::-;13458:71;13522:6;13517:3;13458:71;:::i;:::-;13451:78;;13538:52;13583:6;13578:3;13571:4;13564:5;13560:16;13538:52;:::i;:::-;13615:29;13637:6;13615:29;:::i;:::-;13610:3;13606:39;13599:46;;13379:272;;;;;:::o;13657:377::-;13763:3;13791:39;13824:5;13791:39;:::i;:::-;13846:89;13928:6;13923:3;13846:89;:::i;:::-;13839:96;;13944:52;13989:6;13984:3;13977:4;13970:5;13966:16;13944:52;:::i;:::-;14021:6;14016:3;14012:16;14005:23;;13767:267;;;;;:::o;14064:845::-;14167:3;14204:5;14198:12;14233:36;14259:9;14233:36;:::i;:::-;14285:89;14367:6;14362:3;14285:89;:::i;:::-;14278:96;;14405:1;14394:9;14390:17;14421:1;14416:137;;;;14567:1;14562:341;;;;14383:520;;14416:137;14500:4;14496:9;14485;14481:25;14476:3;14469:38;14536:6;14531:3;14527:16;14520:23;;14416:137;;14562:341;14629:38;14661:5;14629:38;:::i;:::-;14689:1;14703:154;14717:6;14714:1;14711:13;14703:154;;;14791:7;14785:14;14781:1;14776:3;14772:11;14765:35;14841:1;14832:7;14828:15;14817:26;;14739:4;14736:1;14732:12;14727:17;;14703:154;;;14886:6;14881:3;14877:16;14870:23;;14569:334;;14383:520;;14171:738;;;;;;:::o;14915:366::-;15057:3;15078:67;15142:2;15137:3;15078:67;:::i;:::-;15071:74;;15154:93;15243:3;15154:93;:::i;:::-;15272:2;15267:3;15263:12;15256:19;;15061:220;;;:::o;15287:366::-;15429:3;15450:67;15514:2;15509:3;15450:67;:::i;:::-;15443:74;;15526:93;15615:3;15526:93;:::i;:::-;15644:2;15639:3;15635:12;15628:19;;15433:220;;;:::o;15659:366::-;15801:3;15822:67;15886:2;15881:3;15822:67;:::i;:::-;15815:74;;15898:93;15987:3;15898:93;:::i;:::-;16016:2;16011:3;16007:12;16000:19;;15805:220;;;:::o;16031:366::-;16173:3;16194:67;16258:2;16253:3;16194:67;:::i;:::-;16187:74;;16270:93;16359:3;16270:93;:::i;:::-;16388:2;16383:3;16379:12;16372:19;;16177:220;;;:::o;16403:366::-;16545:3;16566:67;16630:2;16625:3;16566:67;:::i;:::-;16559:74;;16642:93;16731:3;16642:93;:::i;:::-;16760:2;16755:3;16751:12;16744:19;;16549:220;;;:::o;16775:400::-;16935:3;16956:84;17038:1;17033:3;16956:84;:::i;:::-;16949:91;;17049:93;17138:3;17049:93;:::i;:::-;17167:1;17162:3;17158:11;17151:18;;16939:236;;;:::o;17181:366::-;17323:3;17344:67;17408:2;17403:3;17344:67;:::i;:::-;17337:74;;17420:93;17509:3;17420:93;:::i;:::-;17538:2;17533:3;17529:12;17522:19;;17327:220;;;:::o;17553:366::-;17695:3;17716:67;17780:2;17775:3;17716:67;:::i;:::-;17709:74;;17792:93;17881:3;17792:93;:::i;:::-;17910:2;17905:3;17901:12;17894:19;;17699:220;;;:::o;17925:366::-;18067:3;18088:67;18152:2;18147:3;18088:67;:::i;:::-;18081:74;;18164:93;18253:3;18164:93;:::i;:::-;18282:2;18277:3;18273:12;18266:19;;18071:220;;;:::o;18297:366::-;18439:3;18460:67;18524:2;18519:3;18460:67;:::i;:::-;18453:74;;18536:93;18625:3;18536:93;:::i;:::-;18654:2;18649:3;18645:12;18638:19;;18443:220;;;:::o;18669:366::-;18811:3;18832:67;18896:2;18891:3;18832:67;:::i;:::-;18825:74;;18908:93;18997:3;18908:93;:::i;:::-;19026:2;19021:3;19017:12;19010:19;;18815:220;;;:::o;19041:366::-;19183:3;19204:67;19268:2;19263:3;19204:67;:::i;:::-;19197:74;;19280:93;19369:3;19280:93;:::i;:::-;19398:2;19393:3;19389:12;19382:19;;19187:220;;;:::o;19413:366::-;19555:3;19576:67;19640:2;19635:3;19576:67;:::i;:::-;19569:74;;19652:93;19741:3;19652:93;:::i;:::-;19770:2;19765:3;19761:12;19754:19;;19559:220;;;:::o;19785:118::-;19872:24;19890:5;19872:24;:::i;:::-;19867:3;19860:37;19850:53;;:::o;19909:115::-;19994:23;20011:5;19994:23;:::i;:::-;19989:3;19982:36;19972:52;;:::o;20030:256::-;20142:3;20157:75;20228:3;20219:6;20157:75;:::i;:::-;20257:2;20252:3;20248:12;20241:19;;20277:3;20270:10;;20146:140;;;;:::o;20292:695::-;20570:3;20592:92;20680:3;20671:6;20592:92;:::i;:::-;20585:99;;20701:95;20792:3;20783:6;20701:95;:::i;:::-;20694:102;;20813:148;20957:3;20813:148;:::i;:::-;20806:155;;20978:3;20971:10;;20574:413;;;;;:::o;20993:222::-;21086:4;21124:2;21113:9;21109:18;21101:26;;21137:71;21205:1;21194:9;21190:17;21181:6;21137:71;:::i;:::-;21091:124;;;;:::o;21221:640::-;21416:4;21454:3;21443:9;21439:19;21431:27;;21468:71;21536:1;21525:9;21521:17;21512:6;21468:71;:::i;:::-;21549:72;21617:2;21606:9;21602:18;21593:6;21549:72;:::i;:::-;21631;21699:2;21688:9;21684:18;21675:6;21631:72;:::i;:::-;21750:9;21744:4;21740:20;21735:2;21724:9;21720:18;21713:48;21778:76;21849:4;21840:6;21778:76;:::i;:::-;21770:84;;21421:440;;;;;;;:::o;21867:332::-;21988:4;22026:2;22015:9;22011:18;22003:26;;22039:71;22107:1;22096:9;22092:17;22083:6;22039:71;:::i;:::-;22120:72;22188:2;22177:9;22173:18;22164:6;22120:72;:::i;:::-;21993:206;;;;;:::o;22205:210::-;22292:4;22330:2;22319:9;22315:18;22307:26;;22343:65;22405:1;22394:9;22390:17;22381:6;22343:65;:::i;:::-;22297:118;;;;:::o;22421:222::-;22514:4;22552:2;22541:9;22537:18;22529:26;;22565:71;22633:1;22622:9;22618:17;22609:6;22565:71;:::i;:::-;22519:124;;;;:::o;22649:246::-;22754:4;22792:2;22781:9;22777:18;22769:26;;22805:83;22885:1;22874:9;22870:17;22861:6;22805:83;:::i;:::-;22759:136;;;;:::o;22901:313::-;23014:4;23052:2;23041:9;23037:18;23029:26;;23101:9;23095:4;23091:20;23087:1;23076:9;23072:17;23065:47;23129:78;23202:4;23193:6;23129:78;:::i;:::-;23121:86;;23019:195;;;;:::o;23220:419::-;23386:4;23424:2;23413:9;23409:18;23401:26;;23473:9;23467:4;23463:20;23459:1;23448:9;23444:17;23437:47;23501:131;23627:4;23501:131;:::i;:::-;23493:139;;23391:248;;;:::o;23645:419::-;23811:4;23849:2;23838:9;23834:18;23826:26;;23898:9;23892:4;23888:20;23884:1;23873:9;23869:17;23862:47;23926:131;24052:4;23926:131;:::i;:::-;23918:139;;23816:248;;;:::o;24070:419::-;24236:4;24274:2;24263:9;24259:18;24251:26;;24323:9;24317:4;24313:20;24309:1;24298:9;24294:17;24287:47;24351:131;24477:4;24351:131;:::i;:::-;24343:139;;24241:248;;;:::o;24495:419::-;24661:4;24699:2;24688:9;24684:18;24676:26;;24748:9;24742:4;24738:20;24734:1;24723:9;24719:17;24712:47;24776:131;24902:4;24776:131;:::i;:::-;24768:139;;24666:248;;;:::o;24920:419::-;25086:4;25124:2;25113:9;25109:18;25101:26;;25173:9;25167:4;25163:20;25159:1;25148:9;25144:17;25137:47;25201:131;25327:4;25201:131;:::i;:::-;25193:139;;25091:248;;;:::o;25345:419::-;25511:4;25549:2;25538:9;25534:18;25526:26;;25598:9;25592:4;25588:20;25584:1;25573:9;25569:17;25562:47;25626:131;25752:4;25626:131;:::i;:::-;25618:139;;25516:248;;;:::o;25770:419::-;25936:4;25974:2;25963:9;25959:18;25951:26;;26023:9;26017:4;26013:20;26009:1;25998:9;25994:17;25987:47;26051:131;26177:4;26051:131;:::i;:::-;26043:139;;25941:248;;;:::o;26195:419::-;26361:4;26399:2;26388:9;26384:18;26376:26;;26448:9;26442:4;26438:20;26434:1;26423:9;26419:17;26412:47;26476:131;26602:4;26476:131;:::i;:::-;26468:139;;26366:248;;;:::o;26620:419::-;26786:4;26824:2;26813:9;26809:18;26801:26;;26873:9;26867:4;26863:20;26859:1;26848:9;26844:17;26837:47;26901:131;27027:4;26901:131;:::i;:::-;26893:139;;26791:248;;;:::o;27045:419::-;27211:4;27249:2;27238:9;27234:18;27226:26;;27298:9;27292:4;27288:20;27284:1;27273:9;27269:17;27262:47;27326:131;27452:4;27326:131;:::i;:::-;27318:139;;27216:248;;;:::o;27470:419::-;27636:4;27674:2;27663:9;27659:18;27651:26;;27723:9;27717:4;27713:20;27709:1;27698:9;27694:17;27687:47;27751:131;27877:4;27751:131;:::i;:::-;27743:139;;27641:248;;;:::o;27895:419::-;28061:4;28099:2;28088:9;28084:18;28076:26;;28148:9;28142:4;28138:20;28134:1;28123:9;28119:17;28112:47;28176:131;28302:4;28176:131;:::i;:::-;28168:139;;28066:248;;;:::o;28320:222::-;28413:4;28451:2;28440:9;28436:18;28428:26;;28464:71;28532:1;28521:9;28517:17;28508:6;28464:71;:::i;:::-;28418:124;;;;:::o;28548:218::-;28639:4;28677:2;28666:9;28662:18;28654:26;;28690:69;28756:1;28745:9;28741:17;28732:6;28690:69;:::i;:::-;28644:122;;;;:::o;28772:129::-;28806:6;28833:20;;:::i;:::-;28823:30;;28862:33;28890:4;28882:6;28862:33;:::i;:::-;28813:88;;;:::o;28907:75::-;28940:6;28973:2;28967:9;28957:19;;28947:35;:::o;28988:311::-;29065:4;29155:18;29147:6;29144:30;29141:2;;;29177:18;;:::i;:::-;29141:2;29227:4;29219:6;29215:17;29207:25;;29287:4;29281;29277:15;29269:23;;29070:229;;;:::o;29305:307::-;29366:4;29456:18;29448:6;29445:30;29442:2;;;29478:18;;:::i;:::-;29442:2;29516:29;29538:6;29516:29;:::i;:::-;29508:37;;29600:4;29594;29590:15;29582:23;;29371:241;;;:::o;29618:141::-;29667:4;29690:3;29682:11;;29713:3;29710:1;29703:14;29747:4;29744:1;29734:18;29726:26;;29672:87;;;:::o;29765:98::-;29816:6;29850:5;29844:12;29834:22;;29823:40;;;:::o;29869:99::-;29921:6;29955:5;29949:12;29939:22;;29928:40;;;:::o;29974:168::-;30057:11;30091:6;30086:3;30079:19;30131:4;30126:3;30122:14;30107:29;;30069:73;;;;:::o;30148:169::-;30232:11;30266:6;30261:3;30254:19;30306:4;30301:3;30297:14;30282:29;;30244:73;;;;:::o;30323:148::-;30425:11;30462:3;30447:18;;30437:34;;;;:::o;30477:305::-;30517:3;30536:20;30554:1;30536:20;:::i;:::-;30531:25;;30570:20;30588:1;30570:20;:::i;:::-;30565:25;;30724:1;30656:66;30652:74;30649:1;30646:81;30643:2;;;30730:18;;:::i;:::-;30643:2;30774:1;30771;30767:9;30760:16;;30521:261;;;;:::o;30788:185::-;30828:1;30845:20;30863:1;30845:20;:::i;:::-;30840:25;;30879:20;30897:1;30879:20;:::i;:::-;30874:25;;30918:1;30908:2;;30923:18;;:::i;:::-;30908:2;30965:1;30962;30958:9;30953:14;;30830:143;;;;:::o;30979:348::-;31019:7;31042:20;31060:1;31042:20;:::i;:::-;31037:25;;31076:20;31094:1;31076:20;:::i;:::-;31071:25;;31264:1;31196:66;31192:74;31189:1;31186:81;31181:1;31174:9;31167:17;31163:105;31160:2;;;31271:18;;:::i;:::-;31160:2;31319:1;31316;31312:9;31301:20;;31027:300;;;;:::o;31333:191::-;31373:4;31393:20;31411:1;31393:20;:::i;:::-;31388:25;;31427:20;31445:1;31427:20;:::i;:::-;31422:25;;31466:1;31463;31460:8;31457:2;;;31471:18;;:::i;:::-;31457:2;31516:1;31513;31509:9;31501:17;;31378:146;;;;:::o;31530:96::-;31567:7;31596:24;31614:5;31596:24;:::i;:::-;31585:35;;31575:51;;;:::o;31632:90::-;31666:7;31709:5;31702:13;31695:21;31684:32;;31674:48;;;:::o;31728:77::-;31765:7;31794:5;31783:16;;31773:32;;;:::o;31811:149::-;31847:7;31887:66;31880:5;31876:78;31865:89;;31855:105;;;:::o;31966:139::-;32017:7;32046:5;32035:16;;32052:47;32093:5;32052:47;:::i;:::-;32025:80;;;:::o;32111:76::-;32147:7;32176:5;32165:16;;32155:32;;;:::o;32193:126::-;32230:7;32270:42;32263:5;32259:54;32248:65;;32238:81;;;:::o;32325:77::-;32362:7;32391:5;32380:16;;32370:32;;;:::o;32408:105::-;32444:7;32484:22;32477:5;32473:34;32462:45;;32452:61;;;:::o;32519:109::-;32555:7;32595:26;32588:5;32584:38;32573:49;;32563:65;;;:::o;32634:139::-;32696:9;32729:38;32761:5;32729:38;:::i;:::-;32716:51;;32706:67;;;:::o;32779:154::-;32863:6;32858:3;32853;32840:30;32925:1;32916:6;32911:3;32907:16;32900:27;32830:103;;;:::o;32939:307::-;33007:1;33017:113;33031:6;33028:1;33025:13;33017:113;;;33116:1;33111:3;33107:11;33101:18;33097:1;33092:3;33088:11;33081:39;33053:2;33050:1;33046:10;33041:15;;33017:113;;;33148:6;33145:1;33142:13;33139:2;;;33228:1;33219:6;33214:3;33210:16;33203:27;33139:2;32988:258;;;;:::o;33252:171::-;33291:3;33314:24;33332:5;33314:24;:::i;:::-;33305:33;;33360:4;33353:5;33350:15;33347:2;;;33368:18;;:::i;:::-;33347:2;33415:1;33408:5;33404:13;33397:20;;33295:128;;;:::o;33429:320::-;33473:6;33510:1;33504:4;33500:12;33490:22;;33557:1;33551:4;33547:12;33578:18;33568:2;;33634:4;33626:6;33622:17;33612:27;;33568:2;33696;33688:6;33685:14;33665:18;33662:38;33659:2;;;33715:18;;:::i;:::-;33659:2;33480:269;;;;:::o;33755:281::-;33838:27;33860:4;33838:27;:::i;:::-;33830:6;33826:40;33968:6;33956:10;33953:22;33932:18;33920:10;33917:34;33914:62;33911:2;;;33979:18;;:::i;:::-;33911:2;34019:10;34015:2;34008:22;33798:238;;;:::o;34042:233::-;34081:3;34104:24;34122:5;34104:24;:::i;:::-;34095:33;;34150:66;34143:5;34140:77;34137:2;;;34220:18;;:::i;:::-;34137:2;34267:1;34260:5;34256:13;34249:20;;34085:190;;;:::o;34281:100::-;34320:7;34349:26;34369:5;34349:26;:::i;:::-;34338:37;;34328:53;;;:::o;34387:94::-;34426:7;34455:20;34469:5;34455:20;:::i;:::-;34444:31;;34434:47;;;:::o;34487:180::-;34535:77;34532:1;34525:88;34632:4;34629:1;34622:15;34656:4;34653:1;34646:15;34673:180;34721:77;34718:1;34711:88;34818:4;34815:1;34808:15;34842:4;34839:1;34832:15;34859:180;34907:77;34904:1;34897:88;35004:4;35001:1;34994:15;35028:4;35025:1;35018:15;35045:180;35093:77;35090:1;35083:88;35190:4;35187:1;35180:15;35214:4;35211:1;35204:15;35231:180;35279:77;35276:1;35269:88;35376:4;35373:1;35366:15;35400:4;35397:1;35390:15;35417:102;35458:6;35509:2;35505:7;35500:2;35493:5;35489:14;35485:28;35475:38;;35465:54;;;:::o;35525:94::-;35558:8;35606:5;35602:2;35598:14;35577:35;;35567:52;;;:::o;35625:225::-;35765:34;35761:1;35753:6;35749:14;35742:58;35834:8;35829:2;35821:6;35817:15;35810:33;35731:119;:::o;35856:173::-;35996:25;35992:1;35984:6;35980:14;35973:49;35962:67;:::o;36035:176::-;36175:28;36171:1;36163:6;36159:14;36152:52;36141:70;:::o;36217:172::-;36357:24;36353:1;36345:6;36341:14;36334:48;36323:66;:::o;36395:171::-;36535:23;36531:1;36523:6;36519:14;36512:47;36501:65;:::o;36572:155::-;36712:7;36708:1;36700:6;36696:14;36689:31;36678:49;:::o;36733:182::-;36873:34;36869:1;36861:6;36857:14;36850:58;36839:76;:::o;36921:175::-;37061:27;37057:1;37049:6;37045:14;37038:51;37027:69;:::o;37102:177::-;37242:29;37238:1;37230:6;37226:14;37219:53;37208:71;:::o;37285:220::-;37425:34;37421:1;37413:6;37409:14;37402:58;37494:3;37489:2;37481:6;37477:15;37470:28;37391:114;:::o;37511:163::-;37651:15;37647:1;37639:6;37635:14;37628:39;37617:57;:::o;37680:229::-;37820:34;37816:1;37808:6;37804:14;37797:58;37889:12;37884:2;37876:6;37872:15;37865:37;37786:123;:::o;37915:168::-;38055:20;38051:1;38043:6;38039:14;38032:44;38021:62;:::o;38089:119::-;38176:1;38169:5;38166:12;38156:2;;38182:18;;:::i;:::-;38156:2;38146:62;:::o;38214:122::-;38287:24;38305:5;38287:24;:::i;:::-;38280:5;38277:35;38267:2;;38326:1;38323;38316:12;38267:2;38257:79;:::o;38342:116::-;38412:21;38427:5;38412:21;:::i;:::-;38405:5;38402:32;38392:2;;38448:1;38445;38438:12;38392:2;38382:76;:::o;38464:122::-;38537:24;38555:5;38537:24;:::i;:::-;38530:5;38527:35;38517:2;;38576:1;38573;38566:12;38517:2;38507:79;:::o;38592:120::-;38664:23;38681:5;38664:23;:::i;:::-;38657:5;38654:34;38644:2;;38702:1;38699;38692:12;38644:2;38634:78;:::o;38718:120::-;38790:23;38807:5;38790:23;:::i;:::-;38783:5;38780:34;38770:2;;38828:1;38825;38818:12;38770:2;38760:78;:::o;38844:122::-;38917:24;38935:5;38917:24;:::i;:::-;38910:5;38907:35;38897:2;;38956:1;38953;38946:12;38897:2;38887:79;:::o;38972:120::-;39044:23;39061:5;39044:23;:::i;:::-;39037:5;39034:34;39024:2;;39082:1;39079;39072:12;39024:2;39014:78;:::o
Swarm Source
ipfs://c8f8ee7067dcaf212d85fba48e10f594d7b187bb4d80eabc9d9cb09f6d2c30cc
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,410.02 | 0.054 | $184 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.