More Info
Private Name Tags
ContractCreator:
TokenTracker
Sponsored
Latest 25 from a total of 109 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 74736842 | 63 days ago | IN | 0 FTM | 0.00397118 | ||||
Approve | 64410289 | 281 days ago | IN | 0 FTM | 0.00289462 | ||||
Mint | 63254494 | 304 days ago | IN | 0 FTM | 0.08367916 | ||||
Mint | 63254367 | 304 days ago | IN | 0 FTM | 0.27446144 | ||||
Mint | 63254235 | 304 days ago | IN | 0 FTM | 0.05864273 | ||||
Mint | 63253970 | 304 days ago | IN | 0 FTM | 0.05803497 | ||||
Set Approval For... | 63146712 | 306 days ago | IN | 0 FTM | 0.0051362 | ||||
Transfer From | 62978356 | 308 days ago | IN | 0 FTM | 0.1047588 | ||||
Transfer From | 62978331 | 308 days ago | IN | 0 FTM | 0.11388099 | ||||
Mint | 62978285 | 308 days ago | IN | 0 FTM | 0.96389713 | ||||
Set Approval For... | 62974973 | 308 days ago | IN | 0 FTM | 0.0512331 | ||||
Mint | 62785091 | 312 days ago | IN | 0 FTM | 0.71291633 | ||||
Mint | 62705157 | 313 days ago | IN | 0 FTM | 0.03659123 | ||||
Batch Add Free M... | 62704552 | 313 days ago | IN | 0 FTM | 0.00542985 | ||||
Mint | 62679836 | 313 days ago | IN | 0 FTM | 0.07133302 | ||||
Transfer From | 62645104 | 314 days ago | IN | 0 FTM | 0.0203579 | ||||
Transfer From | 62645046 | 314 days ago | IN | 0 FTM | 0.02259231 | ||||
Mint | 62565789 | 315 days ago | IN | 0 FTM | 0.04405742 | ||||
Mint | 62523525 | 315 days ago | IN | 0 FTM | 0.0571149 | ||||
Mint | 62523247 | 315 days ago | IN | 0 FTM | 0.056639 | ||||
Mint | 62522945 | 315 days ago | IN | 0 FTM | 0.05743976 | ||||
Mint | 62522190 | 315 days ago | IN | 0 FTM | 0.11368327 | ||||
Batch Add Free M... | 62466916 | 316 days ago | IN | 0 FTM | 0.01043649 | ||||
Mint | 62458218 | 316 days ago | IN | 0 FTM | 0.02286939 | ||||
Mint | 62447732 | 316 days ago | IN | 0 FTM | 0.09855261 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
61972298 | 322 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
Clonez
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2023-05-10 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _burn(tokenId); } } // File: contracts/CFAFz.sol pragma solidity ^0.8.9; contract Clonez is ERC721, ERC721Enumerable, Pausable, AccessControl, ERC721Burnable { using Strings for uint256; string private baseURI; address[] public freeMintAddresses; mapping(uint256 => string) public tokenURIMapping; mapping(address => uint256) public freeMintCount; bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); constructor(address initialAdmin) ERC721("Clonez", "CFAFz") { _setupRole(DEFAULT_ADMIN_ROLE, initialAdmin); _setupRole(ADMIN_ROLE, initialAdmin); } modifier onlyAdmin() { require(hasRole(ADMIN_ROLE, msg.sender), "Caller is not an admin"); _; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } function setBaseURI(string memory _newBaseURI) public onlyAdmin { baseURI = _newBaseURI; } function batchAddFreeMints(address[] memory addresses, uint256[] memory freeMints) public onlyAdmin { for (uint256 i = 0; i < addresses.length; i++) { freeMintCount[addresses[i]] = freeMints[i]; freeMintAddresses.push(addresses[i]); } } function addTokenMapping(uint256 _tokenID, string memory _ipfsHash) private { tokenURIMapping[_tokenID] = _ipfsHash; } function updateFreeMints(address _address, uint256 _amount) private { delete freeMintCount[_address]; freeMintCount[_address] = _amount; } function updateCredits(address _address, uint256 _amount) public onlyAdmin { delete freeMintCount[_address]; freeMintCount[_address] = _amount; } function overwriteMappingValue(uint256 tokenId, string memory newValue) public onlyAdmin { delete tokenURIMapping[tokenId]; tokenURIMapping[tokenId] = newValue; } function mint(string memory _ipfsHash)public { require(isfreeMinted(msg.sender), "User not in snapshot"); address _user = msg.sender; uint256 fmints = freeMintCount[_user]; require(fmints > 0, "No more mints avaiable"); uint256 tokenID = totalSupply() + 1; _safeMint(msg.sender, tokenID); addTokenMapping(tokenID, _ipfsHash); updateFreeMints(_user, fmints - 1); totalSupply()+ 1; } function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal whenNotPaused override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId, batchSize); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); string memory hash = tokenURIMapping[tokenId]; return bytes(baseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, "/", hash)) : ""; } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function isfreeMinted(address _user) public view returns (bool) { for (uint i = 0; i < freeMintAddresses.length; i++) { if (freeMintAddresses[i] == _user) { return true; } } return false; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function pause() public onlyAdmin { _pause(); } function unpause() public onlyAdmin { _unpause(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"initialAdmin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"freeMints","type":"uint256[]"}],"name":"batchAddFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"freeMintAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isfreeMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_ipfsHash","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newValue","type":"string"}],"name":"overwriteMappingValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenURIMapping","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateCredits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620057a6380380620057a6833981810160405281019062000037919062000317565b6040518060400160405280600681526020017f436c6f6e657a00000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f434641467a0000000000000000000000000000000000000000000000000000008152508160009081620000b49190620005c3565b508060019081620000c69190620005c3565b5050506000600a60006101000a81548160ff021916908315150217905550620000f96000801b826200013260201b60201c565b6200012b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775826200013260201b60201c565b50620006aa565b6200014482826200014860201b60201c565b5050565b6200015a82826200023a60201b60201c565b62000236576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001db620002a560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002df82620002b2565b9050919050565b620002f181620002d2565b8114620002fd57600080fd5b50565b6000815190506200031181620002e6565b92915050565b60006020828403121562000330576200032f620002ad565b5b6000620003408482850162000300565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003cb57607f821691505b602082108103620003e157620003e062000383565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200044b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200040c565b6200045786836200040c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004a46200049e62000498846200046f565b62000479565b6200046f565b9050919050565b6000819050919050565b620004c08362000483565b620004d8620004cf82620004ab565b84845462000419565b825550505050565b600090565b620004ef620004e0565b620004fc818484620004b5565b505050565b5b81811015620005245762000518600082620004e5565b60018101905062000502565b5050565b601f82111562000573576200053d81620003e7565b6200054884620003fc565b8101602085101562000558578190505b620005706200056785620003fc565b83018262000501565b50505b505050565b600082821c905092915050565b6000620005986000198460080262000578565b1980831691505092915050565b6000620005b3838362000585565b9150826002028217905092915050565b620005ce8262000349565b67ffffffffffffffff811115620005ea57620005e962000354565b5b620005f68254620003b2565b6200060382828562000528565b600060209050601f8311600181146200063b576000841562000626578287015190505b620006328582620005a5565b865550620006a2565b601f1984166200064b86620003e7565b60005b8281101562000675578489015182556001820191506020850194506020810190506200064e565b8683101562000695578489015162000691601f89168262000585565b8355505b6001600288020188555050505b505050505050565b6150ec80620006ba6000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80635c975abb11610130578063a217fddf116100b8578063d547741f1161007c578063d547741f14610698578063d85d3d27146106b4578063e985e9c5146106d0578063f01bc02914610700578063fc3aeb221461071c57610227565b8063a217fddf146105e2578063a22cb46514610600578063a45578941461061c578063b88d4fde1461064c578063c87b56dd1461066857610227565b806371e3ef9d116100ff57806371e3ef9d1461053c57806375b238fc1461056c5780638456cb591461058a57806391d148541461059457806395d89b41146105c457610227565b80635c975abb1461048e5780635ecf8a80146104ac5780636352211e146104dc57806370a082311461050c57610227565b80632f745c59116101b357806342966c681161018257806342966c68146103da578063438b6300146103f657806349ddaf9b146104265780634f6ccce71461044257806355f804b31461047257610227565b80632f745c591461036857806336568abe146103985780633f4ba83a146103b457806342842e0e146103be57610227565b80631006b841116101fa5780631006b841146102c657806318160ddd146102e257806323b872dd14610300578063248a9ca31461031c5780632f2ff15d1461034c57610227565b806301ffc9a71461022c57806306fdde031461025c578063081812fc1461027a578063095ea7b3146102aa575b600080fd5b61024660048036038101906102419190613470565b61074c565b60405161025391906134b8565b60405180910390f35b61026461075e565b6040516102719190613563565b60405180910390f35b610294600480360381019061028f91906135bb565b6107f0565b6040516102a19190613629565b60405180910390f35b6102c460048036038101906102bf9190613670565b610836565b005b6102e060048036038101906102db91906137e5565b61094d565b005b6102ea6109fa565b6040516102f79190613850565b60405180910390f35b61031a6004803603810190610315919061386b565b610a07565b005b610336600480360381019061033191906138f4565b610a67565b6040516103439190613930565b60405180910390f35b6103666004803603810190610361919061394b565b610a87565b005b610382600480360381019061037d9190613670565b610aa8565b60405161038f9190613850565b60405180910390f35b6103b260048036038101906103ad919061394b565b610b4d565b005b6103bc610bd0565b005b6103d860048036038101906103d3919061386b565b610c43565b005b6103f460048036038101906103ef91906135bb565b610c63565b005b610410600480360381019061040b919061398b565b610cbf565b60405161041d9190613a76565b60405180910390f35b610440600480360381019061043b9190613670565b610d6d565b005b61045c600480360381019061045791906135bb565b610e61565b6040516104699190613850565b60405180910390f35b61048c60048036038101906104879190613a98565b610ed2565b005b610496610f4e565b6040516104a391906134b8565b60405180910390f35b6104c660048036038101906104c1919061398b565b610f65565b6040516104d39190613850565b60405180910390f35b6104f660048036038101906104f191906135bb565b610f7d565b6040516105039190613629565b60405180910390f35b6105266004803603810190610521919061398b565b611003565b6040516105339190613850565b60405180910390f35b610556600480360381019061055191906135bb565b6110ba565b6040516105639190613629565b60405180910390f35b6105746110f9565b6040516105819190613930565b60405180910390f35b61059261111d565b005b6105ae60048036038101906105a9919061394b565b611190565b6040516105bb91906134b8565b60405180910390f35b6105cc6111fb565b6040516105d99190613563565b60405180910390f35b6105ea61128d565b6040516105f79190613930565b60405180910390f35b61061a60048036038101906106159190613b0d565b611294565b005b6106366004803603810190610631919061398b565b6112aa565b60405161064391906134b8565b60405180910390f35b61066660048036038101906106619190613bee565b611358565b005b610682600480360381019061067d91906135bb565b6113ba565b60405161068f9190613563565b60405180910390f35b6106b260048036038101906106ad919061394b565b611507565b005b6106ce60048036038101906106c99190613a98565b611528565b005b6106ea60048036038101906106e59190613c71565b611659565b6040516106f791906134b8565b60405180910390f35b61071a60048036038101906107159190613e3c565b6116ed565b005b610736600480360381019061073191906135bb565b61186f565b6040516107439190613563565b60405180910390f35b60006107578261190f565b9050919050565b60606000805461076d90613ee3565b80601f016020809104026020016040519081016040528092919081815260200182805461079990613ee3565b80156107e65780601f106107bb576101008083540402835291602001916107e6565b820191906000526020600020905b8154815290600101906020018083116107c957829003601f168201915b5050505050905090565b60006107fb82611989565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061084182610f7d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a890613f86565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108d06119d4565b73ffffffffffffffffffffffffffffffffffffffff1614806108ff57506108fe816108f96119d4565b611659565b5b61093e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093590614018565b60405180910390fd5b61094883836119dc565b505050565b6109777fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533611190565b6109b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ad90614084565b60405180910390fd5b600e600083815260200190815260200160002060006109d591906133a7565b80600e600084815260200190815260200160002090816109f59190614250565b505050565b6000600880549050905090565b610a18610a126119d4565b82611a95565b610a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4e90614394565b60405180910390fd5b610a62838383611b2a565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b610a9082610a67565b610a9981611e23565b610aa38383611e37565b505050565b6000610ab383611003565b8210610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb90614426565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b556119d4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb9906144b8565b60405180910390fd5b610bcc8282611f18565b5050565b610bfa7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533611190565b610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3090614084565b60405180910390fd5b610c41611ffa565b565b610c5e83838360405180602001604052806000815250611358565b505050565b610c74610c6e6119d4565b82611a95565b610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa90614394565b60405180910390fd5b610cbc8161205d565b50565b60606000610ccc83611003565b905060008167ffffffffffffffff811115610cea57610ce96136ba565b5b604051908082528060200260200182016040528015610d185781602001602082028036833780820191505090505b50905060005b82811015610d6257610d308582610aa8565b828281518110610d4357610d426144d8565b5b6020026020010181815250508080610d5a90614536565b915050610d1e565b508092505050919050565b610d977fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533611190565b610dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcd90614084565b60405180910390fd5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905580600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000610e6b6109fa565b8210610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea3906145f0565b60405180910390fd5b60088281548110610ec057610ebf6144d8565b5b90600052602060002001549050919050565b610efc7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533611190565b610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290614084565b60405180910390fd5b80600c9081610f4a9190614250565b5050565b6000600a60009054906101000a900460ff16905090565b600f6020528060005260406000206000915090505481565b600080610f89836121ab565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff19061465c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a906146ee565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d81815481106110ca57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6111477fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533611190565b611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117d90614084565b60405180910390fd5b61118e6121e8565b565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606001805461120a90613ee3565b80601f016020809104026020016040519081016040528092919081815260200182805461123690613ee3565b80156112835780601f1061125857610100808354040283529160200191611283565b820191906000526020600020905b81548152906001019060200180831161126657829003601f168201915b5050505050905090565b6000801b81565b6112a661129f6119d4565b838361224b565b5050565b600080600090505b600d8054905081101561134d578273ffffffffffffffffffffffffffffffffffffffff16600d82815481106112ea576112e96144d8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361133a576001915050611353565b808061134590614536565b9150506112b2565b50600090505b919050565b6113696113636119d4565b83611a95565b6113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f90614394565b60405180910390fd5b6113b4848484846123b7565b50505050565b60606113c582612413565b611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb90614780565b60405180910390fd5b600061140e612454565b90506000600e6000858152602001908152602001600020805461143090613ee3565b80601f016020809104026020016040519081016040528092919081815260200182805461145c90613ee3565b80156114a95780601f1061147e576101008083540402835291602001916114a9565b820191906000526020600020905b81548152906001019060200180831161148c57829003601f168201915b505050505090506000600c80546114bf90613ee3565b9050116114db57604051806020016040528060008152506114fe565b81816040516020016114ee929190614828565b6040516020818303038152906040525b92505050919050565b61151082610a67565b61151981611e23565b6115238383611f18565b505050565b611531336112aa565b611570576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611567906148a3565b60405180910390fd5b60003390506000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f39061490f565b60405180910390fd5b600060016116086109fa565b611612919061492f565b905061161e33826124e6565b6116288185612504565b61163e836001846116399190614963565b612529565b60016116486109fa565b611652919061492f565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117177fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533611190565b611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d90614084565b60405180910390fd5b60005b825181101561186a57818181518110611775576117746144d8565b5b6020026020010151600f6000858481518110611794576117936144d8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d8382815181106117ef576117ee6144d8565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061186290614536565b915050611759565b505050565b600e602052806000526040600020600091509050805461188e90613ee3565b80601f01602080910402602001604051908101604052809291908181526020018280546118ba90613ee3565b80156119075780601f106118dc57610100808354040283529160200191611907565b820191906000526020600020905b8154815290600101906020018083116118ea57829003601f168201915b505050505081565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119825750611981826125b4565b5b9050919050565b61199281612413565b6119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c89061465c565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a4f83610f7d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611aa183610f7d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ae35750611ae28185611659565b5b80611b2157508373ffffffffffffffffffffffffffffffffffffffff16611b09846107f0565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b4a82610f7d565b73ffffffffffffffffffffffffffffffffffffffff1614611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9790614a09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0690614a9b565b60405180910390fd5b611c1c838383600161262e565b8273ffffffffffffffffffffffffffffffffffffffff16611c3c82610f7d565b73ffffffffffffffffffffffffffffffffffffffff1614611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8990614a09565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e1e8383836001612648565b505050565b611e3481611e2f6119d4565b61264e565b50565b611e418282611190565b611f14576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611eb96119d4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611f228282611190565b15611ff6576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611f9b6119d4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6120026126d3565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6120466119d4565b6040516120539190613629565b60405180910390a1565b600061206882610f7d565b905061207881600084600161262e565b61208182610f7d565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121a7816000846001612648565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6121f061271c565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122346119d4565b6040516122419190613629565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b090614b07565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123aa91906134b8565b60405180910390a3505050565b6123c2848484611b2a565b6123ce84848484612766565b61240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240490614b99565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612435836121ab565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c805461246390613ee3565b80601f016020809104026020016040519081016040528092919081815260200182805461248f90613ee3565b80156124dc5780601f106124b1576101008083540402835291602001916124dc565b820191906000526020600020905b8154815290600101906020018083116124bf57829003601f168201915b5050505050905090565b6125008282604051806020016040528060008152506128ed565b5050565b80600e600084815260200190815260200160002090816125249190614250565b505050565b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905580600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612627575061262682612948565b5b9050919050565b61263661271c565b61264284848484612a2a565b50505050565b50505050565b6126588282611190565b6126cf5761266581612b88565b6126738360001c6020612bb5565b604051602001612684929190614c51565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c69190613563565b60405180910390fd5b5050565b6126db610f4e565b61271a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271190614cd7565b60405180910390fd5b565b612724610f4e565b15612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90614d43565b60405180910390fd5b565b60006127878473ffffffffffffffffffffffffffffffffffffffff16612df1565b156128e0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127b06119d4565b8786866040518563ffffffff1660e01b81526004016127d29493929190614db8565b6020604051808303816000875af192505050801561280e57506040513d601f19601f8201168201806040525081019061280b9190614e19565b60015b612890573d806000811461283e576040519150601f19603f3d011682016040523d82523d6000602084013e612843565b606091505b506000815103612888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287f90614b99565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128e5565b600190505b949350505050565b6128f78383612e14565b6129046000848484612766565b612943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293a90614b99565b60405180910390fd5b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a1357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a235750612a2282613031565b5b9050919050565b612a368484848461309b565b6001811115612a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7190614eb8565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612ac157612abc816130a1565b612b00565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612aff57612afe85826130ea565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612b4257612b3d81613257565b612b81565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612b8057612b7f8482613328565b5b5b5050505050565b6060612bae8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612bb5565b9050919050565b606060006002836002612bc89190614ed8565b612bd2919061492f565b67ffffffffffffffff811115612beb57612bea6136ba565b5b6040519080825280601f01601f191660200182016040528015612c1d5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612c5557612c546144d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612cb957612cb86144d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612cf99190614ed8565b612d03919061492f565b90505b6001811115612da3577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612d4557612d446144d8565b5b1a60f81b828281518110612d5c57612d5b6144d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612d9c90614f1a565b9050612d06565b5060008414612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde90614f8f565b60405180910390fd5b8091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7a90614ffb565b60405180910390fd5b612e8c81612413565b15612ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec390615067565b60405180910390fd5b612eda60008383600161262e565b612ee381612413565b15612f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1a90615067565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461302d600083836001612648565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130f784611003565b6131019190614963565b90506000600760008481526020019081526020016000205490508181146131e6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061326b9190614963565b905060006009600084815260200190815260200160002054905060006008838154811061329b5761329a6144d8565b5b9060005260206000200154905080600883815481106132bd576132bc6144d8565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061330c5761330b615087565b5b6001900381819060005260206000200160009055905550505050565b600061333383611003565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b5080546133b390613ee3565b6000825580601f106133c557506133e4565b601f0160209004906000526020600020908101906133e391906133e7565b5b50565b5b808211156134005760008160009055506001016133e8565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61344d81613418565b811461345857600080fd5b50565b60008135905061346a81613444565b92915050565b6000602082840312156134865761348561340e565b5b60006134948482850161345b565b91505092915050565b60008115159050919050565b6134b28161349d565b82525050565b60006020820190506134cd60008301846134a9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561350d5780820151818401526020810190506134f2565b60008484015250505050565b6000601f19601f8301169050919050565b6000613535826134d3565b61353f81856134de565b935061354f8185602086016134ef565b61355881613519565b840191505092915050565b6000602082019050818103600083015261357d818461352a565b905092915050565b6000819050919050565b61359881613585565b81146135a357600080fd5b50565b6000813590506135b58161358f565b92915050565b6000602082840312156135d1576135d061340e565b5b60006135df848285016135a6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613613826135e8565b9050919050565b61362381613608565b82525050565b600060208201905061363e600083018461361a565b92915050565b61364d81613608565b811461365857600080fd5b50565b60008135905061366a81613644565b92915050565b600080604083850312156136875761368661340e565b5b60006136958582860161365b565b92505060206136a6858286016135a6565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136f282613519565b810181811067ffffffffffffffff82111715613711576137106136ba565b5b80604052505050565b6000613724613404565b905061373082826136e9565b919050565b600067ffffffffffffffff8211156137505761374f6136ba565b5b61375982613519565b9050602081019050919050565b82818337600083830152505050565b600061378861378384613735565b61371a565b9050828152602081018484840111156137a4576137a36136b5565b5b6137af848285613766565b509392505050565b600082601f8301126137cc576137cb6136b0565b5b81356137dc848260208601613775565b91505092915050565b600080604083850312156137fc576137fb61340e565b5b600061380a858286016135a6565b925050602083013567ffffffffffffffff81111561382b5761382a613413565b5b613837858286016137b7565b9150509250929050565b61384a81613585565b82525050565b60006020820190506138656000830184613841565b92915050565b6000806000606084860312156138845761388361340e565b5b60006138928682870161365b565b93505060206138a38682870161365b565b92505060406138b4868287016135a6565b9150509250925092565b6000819050919050565b6138d1816138be565b81146138dc57600080fd5b50565b6000813590506138ee816138c8565b92915050565b60006020828403121561390a5761390961340e565b5b6000613918848285016138df565b91505092915050565b61392a816138be565b82525050565b60006020820190506139456000830184613921565b92915050565b600080604083850312156139625761396161340e565b5b6000613970858286016138df565b92505060206139818582860161365b565b9150509250929050565b6000602082840312156139a1576139a061340e565b5b60006139af8482850161365b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6139ed81613585565b82525050565b60006139ff83836139e4565b60208301905092915050565b6000602082019050919050565b6000613a23826139b8565b613a2d81856139c3565b9350613a38836139d4565b8060005b83811015613a69578151613a5088826139f3565b9750613a5b83613a0b565b925050600181019050613a3c565b5085935050505092915050565b60006020820190508181036000830152613a908184613a18565b905092915050565b600060208284031215613aae57613aad61340e565b5b600082013567ffffffffffffffff811115613acc57613acb613413565b5b613ad8848285016137b7565b91505092915050565b613aea8161349d565b8114613af557600080fd5b50565b600081359050613b0781613ae1565b92915050565b60008060408385031215613b2457613b2361340e565b5b6000613b328582860161365b565b9250506020613b4385828601613af8565b9150509250929050565b600067ffffffffffffffff821115613b6857613b676136ba565b5b613b7182613519565b9050602081019050919050565b6000613b91613b8c84613b4d565b61371a565b905082815260208101848484011115613bad57613bac6136b5565b5b613bb8848285613766565b509392505050565b600082601f830112613bd557613bd46136b0565b5b8135613be5848260208601613b7e565b91505092915050565b60008060008060808587031215613c0857613c0761340e565b5b6000613c168782880161365b565b9450506020613c278782880161365b565b9350506040613c38878288016135a6565b925050606085013567ffffffffffffffff811115613c5957613c58613413565b5b613c6587828801613bc0565b91505092959194509250565b60008060408385031215613c8857613c8761340e565b5b6000613c968582860161365b565b9250506020613ca78582860161365b565b9150509250929050565b600067ffffffffffffffff821115613ccc57613ccb6136ba565b5b602082029050602081019050919050565b600080fd5b6000613cf5613cf084613cb1565b61371a565b90508083825260208201905060208402830185811115613d1857613d17613cdd565b5b835b81811015613d415780613d2d888261365b565b845260208401935050602081019050613d1a565b5050509392505050565b600082601f830112613d6057613d5f6136b0565b5b8135613d70848260208601613ce2565b91505092915050565b600067ffffffffffffffff821115613d9457613d936136ba565b5b602082029050602081019050919050565b6000613db8613db384613d79565b61371a565b90508083825260208201905060208402830185811115613ddb57613dda613cdd565b5b835b81811015613e045780613df088826135a6565b845260208401935050602081019050613ddd565b5050509392505050565b600082601f830112613e2357613e226136b0565b5b8135613e33848260208601613da5565b91505092915050565b60008060408385031215613e5357613e5261340e565b5b600083013567ffffffffffffffff811115613e7157613e70613413565b5b613e7d85828601613d4b565b925050602083013567ffffffffffffffff811115613e9e57613e9d613413565b5b613eaa85828601613e0e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613efb57607f821691505b602082108103613f0e57613f0d613eb4565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f706021836134de565b9150613f7b82613f14565b604082019050919050565b60006020820190508181036000830152613f9f81613f63565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614002603d836134de565b915061400d82613fa6565b604082019050919050565b6000602082019050818103600083015261403181613ff5565b9050919050565b7f43616c6c6572206973206e6f7420616e2061646d696e00000000000000000000600082015250565b600061406e6016836134de565b915061407982614038565b602082019050919050565b6000602082019050818103600083015261409d81614061565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026141067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826140c9565b61411086836140c9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061414d61414861414384613585565b614128565b613585565b9050919050565b6000819050919050565b61416783614132565b61417b61417382614154565b8484546140d6565b825550505050565b600090565b614190614183565b61419b81848461415e565b505050565b5b818110156141bf576141b4600082614188565b6001810190506141a1565b5050565b601f821115614204576141d5816140a4565b6141de846140b9565b810160208510156141ed578190505b6142016141f9856140b9565b8301826141a0565b50505b505050565b600082821c905092915050565b600061422760001984600802614209565b1980831691505092915050565b60006142408383614216565b9150826002028217905092915050565b614259826134d3565b67ffffffffffffffff811115614272576142716136ba565b5b61427c8254613ee3565b6142878282856141c3565b600060209050601f8311600181146142ba57600084156142a8578287015190505b6142b28582614234565b86555061431a565b601f1984166142c8866140a4565b60005b828110156142f0578489015182556001820191506020850194506020810190506142cb565b8683101561430d5784890151614309601f891682614216565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061437e602d836134de565b915061438982614322565b604082019050919050565b600060208201905081810360008301526143ad81614371565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614410602b836134de565b915061441b826143b4565b604082019050919050565b6000602082019050818103600083015261443f81614403565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006144a2602f836134de565b91506144ad82614446565b604082019050919050565b600060208201905081810360008301526144d181614495565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061454182613585565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361457357614572614507565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006145da602c836134de565b91506145e58261457e565b604082019050919050565b60006020820190508181036000830152614609816145cd565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006146466018836134de565b915061465182614610565b602082019050919050565b6000602082019050818103600083015261467581614639565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006146d86029836134de565b91506146e38261467c565b604082019050919050565b60006020820190508181036000830152614707816146cb565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061476a602f836134de565b91506147758261470e565b604082019050919050565b600060208201905081810360008301526147998161475d565b9050919050565b600081905092915050565b60006147b6826134d3565b6147c081856147a0565b93506147d08185602086016134ef565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006148126001836147a0565b915061481d826147dc565b600182019050919050565b600061483482856147ab565b915061483f82614805565b915061484b82846147ab565b91508190509392505050565b7f55736572206e6f7420696e20736e617073686f74000000000000000000000000600082015250565b600061488d6014836134de565b915061489882614857565b602082019050919050565b600060208201905081810360008301526148bc81614880565b9050919050565b7f4e6f206d6f7265206d696e7473206176616961626c6500000000000000000000600082015250565b60006148f96016836134de565b9150614904826148c3565b602082019050919050565b60006020820190508181036000830152614928816148ec565b9050919050565b600061493a82613585565b915061494583613585565b925082820190508082111561495d5761495c614507565b5b92915050565b600061496e82613585565b915061497983613585565b925082820390508181111561499157614990614507565b5b92915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006149f36025836134de565b91506149fe82614997565b604082019050919050565b60006020820190508181036000830152614a22816149e6565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a856024836134de565b9150614a9082614a29565b604082019050919050565b60006020820190508181036000830152614ab481614a78565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614af16019836134de565b9150614afc82614abb565b602082019050919050565b60006020820190508181036000830152614b2081614ae4565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614b836032836134de565b9150614b8e82614b27565b604082019050919050565b60006020820190508181036000830152614bb281614b76565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614bef6017836147a0565b9150614bfa82614bb9565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614c3b6011836147a0565b9150614c4682614c05565b601182019050919050565b6000614c5c82614be2565b9150614c6882856147ab565b9150614c7382614c2e565b9150614c7f82846147ab565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614cc16014836134de565b9150614ccc82614c8b565b602082019050919050565b60006020820190508181036000830152614cf081614cb4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614d2d6010836134de565b9150614d3882614cf7565b602082019050919050565b60006020820190508181036000830152614d5c81614d20565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614d8a82614d63565b614d948185614d6e565b9350614da48185602086016134ef565b614dad81613519565b840191505092915050565b6000608082019050614dcd600083018761361a565b614dda602083018661361a565b614de76040830185613841565b8181036060830152614df98184614d7f565b905095945050505050565b600081519050614e1381613444565b92915050565b600060208284031215614e2f57614e2e61340e565b5b6000614e3d84828501614e04565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614ea26035836134de565b9150614ead82614e46565b604082019050919050565b60006020820190508181036000830152614ed181614e95565b9050919050565b6000614ee382613585565b9150614eee83613585565b9250828202614efc81613585565b91508282048414831517614f1357614f12614507565b5b5092915050565b6000614f2582613585565b915060008203614f3857614f37614507565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614f796020836134de565b9150614f8482614f43565b602082019050919050565b60006020820190508181036000830152614fa881614f6c565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614fe56020836134de565b9150614ff082614faf565b602082019050919050565b6000602082019050818103600083015261501481614fd8565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615051601c836134de565b915061505c8261501b565b602082019050919050565b6000602082019050818103600083015261508081615044565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202b09216547e26e4899be33a9c4d0dd366d40d64d0a9a49c08e3cbb47347ac4dc64736f6c63430008120033000000000000000000000000d51b681526ba8ec9f54b07c3274a9e5bf0c10111
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c80635c975abb11610130578063a217fddf116100b8578063d547741f1161007c578063d547741f14610698578063d85d3d27146106b4578063e985e9c5146106d0578063f01bc02914610700578063fc3aeb221461071c57610227565b8063a217fddf146105e2578063a22cb46514610600578063a45578941461061c578063b88d4fde1461064c578063c87b56dd1461066857610227565b806371e3ef9d116100ff57806371e3ef9d1461053c57806375b238fc1461056c5780638456cb591461058a57806391d148541461059457806395d89b41146105c457610227565b80635c975abb1461048e5780635ecf8a80146104ac5780636352211e146104dc57806370a082311461050c57610227565b80632f745c59116101b357806342966c681161018257806342966c68146103da578063438b6300146103f657806349ddaf9b146104265780634f6ccce71461044257806355f804b31461047257610227565b80632f745c591461036857806336568abe146103985780633f4ba83a146103b457806342842e0e146103be57610227565b80631006b841116101fa5780631006b841146102c657806318160ddd146102e257806323b872dd14610300578063248a9ca31461031c5780632f2ff15d1461034c57610227565b806301ffc9a71461022c57806306fdde031461025c578063081812fc1461027a578063095ea7b3146102aa575b600080fd5b61024660048036038101906102419190613470565b61074c565b60405161025391906134b8565b60405180910390f35b61026461075e565b6040516102719190613563565b60405180910390f35b610294600480360381019061028f91906135bb565b6107f0565b6040516102a19190613629565b60405180910390f35b6102c460048036038101906102bf9190613670565b610836565b005b6102e060048036038101906102db91906137e5565b61094d565b005b6102ea6109fa565b6040516102f79190613850565b60405180910390f35b61031a6004803603810190610315919061386b565b610a07565b005b610336600480360381019061033191906138f4565b610a67565b6040516103439190613930565b60405180910390f35b6103666004803603810190610361919061394b565b610a87565b005b610382600480360381019061037d9190613670565b610aa8565b60405161038f9190613850565b60405180910390f35b6103b260048036038101906103ad919061394b565b610b4d565b005b6103bc610bd0565b005b6103d860048036038101906103d3919061386b565b610c43565b005b6103f460048036038101906103ef91906135bb565b610c63565b005b610410600480360381019061040b919061398b565b610cbf565b60405161041d9190613a76565b60405180910390f35b610440600480360381019061043b9190613670565b610d6d565b005b61045c600480360381019061045791906135bb565b610e61565b6040516104699190613850565b60405180910390f35b61048c60048036038101906104879190613a98565b610ed2565b005b610496610f4e565b6040516104a391906134b8565b60405180910390f35b6104c660048036038101906104c1919061398b565b610f65565b6040516104d39190613850565b60405180910390f35b6104f660048036038101906104f191906135bb565b610f7d565b6040516105039190613629565b60405180910390f35b6105266004803603810190610521919061398b565b611003565b6040516105339190613850565b60405180910390f35b610556600480360381019061055191906135bb565b6110ba565b6040516105639190613629565b60405180910390f35b6105746110f9565b6040516105819190613930565b60405180910390f35b61059261111d565b005b6105ae60048036038101906105a9919061394b565b611190565b6040516105bb91906134b8565b60405180910390f35b6105cc6111fb565b6040516105d99190613563565b60405180910390f35b6105ea61128d565b6040516105f79190613930565b60405180910390f35b61061a60048036038101906106159190613b0d565b611294565b005b6106366004803603810190610631919061398b565b6112aa565b60405161064391906134b8565b60405180910390f35b61066660048036038101906106619190613bee565b611358565b005b610682600480360381019061067d91906135bb565b6113ba565b60405161068f9190613563565b60405180910390f35b6106b260048036038101906106ad919061394b565b611507565b005b6106ce60048036038101906106c99190613a98565b611528565b005b6106ea60048036038101906106e59190613c71565b611659565b6040516106f791906134b8565b60405180910390f35b61071a60048036038101906107159190613e3c565b6116ed565b005b610736600480360381019061073191906135bb565b61186f565b6040516107439190613563565b60405180910390f35b60006107578261190f565b9050919050565b60606000805461076d90613ee3565b80601f016020809104026020016040519081016040528092919081815260200182805461079990613ee3565b80156107e65780601f106107bb576101008083540402835291602001916107e6565b820191906000526020600020905b8154815290600101906020018083116107c957829003601f168201915b5050505050905090565b60006107fb82611989565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061084182610f7d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a890613f86565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108d06119d4565b73ffffffffffffffffffffffffffffffffffffffff1614806108ff57506108fe816108f96119d4565b611659565b5b61093e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093590614018565b60405180910390fd5b61094883836119dc565b505050565b6109777fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533611190565b6109b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ad90614084565b60405180910390fd5b600e600083815260200190815260200160002060006109d591906133a7565b80600e600084815260200190815260200160002090816109f59190614250565b505050565b6000600880549050905090565b610a18610a126119d4565b82611a95565b610a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4e90614394565b60405180910390fd5b610a62838383611b2a565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b610a9082610a67565b610a9981611e23565b610aa38383611e37565b505050565b6000610ab383611003565b8210610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb90614426565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b556119d4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb9906144b8565b60405180910390fd5b610bcc8282611f18565b5050565b610bfa7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533611190565b610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3090614084565b60405180910390fd5b610c41611ffa565b565b610c5e83838360405180602001604052806000815250611358565b505050565b610c74610c6e6119d4565b82611a95565b610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa90614394565b60405180910390fd5b610cbc8161205d565b50565b60606000610ccc83611003565b905060008167ffffffffffffffff811115610cea57610ce96136ba565b5b604051908082528060200260200182016040528015610d185781602001602082028036833780820191505090505b50905060005b82811015610d6257610d308582610aa8565b828281518110610d4357610d426144d8565b5b6020026020010181815250508080610d5a90614536565b915050610d1e565b508092505050919050565b610d977fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533611190565b610dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcd90614084565b60405180910390fd5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905580600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000610e6b6109fa565b8210610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea3906145f0565b60405180910390fd5b60088281548110610ec057610ebf6144d8565b5b90600052602060002001549050919050565b610efc7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533611190565b610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290614084565b60405180910390fd5b80600c9081610f4a9190614250565b5050565b6000600a60009054906101000a900460ff16905090565b600f6020528060005260406000206000915090505481565b600080610f89836121ab565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff19061465c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a906146ee565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d81815481106110ca57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6111477fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533611190565b611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117d90614084565b60405180910390fd5b61118e6121e8565b565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606001805461120a90613ee3565b80601f016020809104026020016040519081016040528092919081815260200182805461123690613ee3565b80156112835780601f1061125857610100808354040283529160200191611283565b820191906000526020600020905b81548152906001019060200180831161126657829003601f168201915b5050505050905090565b6000801b81565b6112a661129f6119d4565b838361224b565b5050565b600080600090505b600d8054905081101561134d578273ffffffffffffffffffffffffffffffffffffffff16600d82815481106112ea576112e96144d8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361133a576001915050611353565b808061134590614536565b9150506112b2565b50600090505b919050565b6113696113636119d4565b83611a95565b6113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f90614394565b60405180910390fd5b6113b4848484846123b7565b50505050565b60606113c582612413565b611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb90614780565b60405180910390fd5b600061140e612454565b90506000600e6000858152602001908152602001600020805461143090613ee3565b80601f016020809104026020016040519081016040528092919081815260200182805461145c90613ee3565b80156114a95780601f1061147e576101008083540402835291602001916114a9565b820191906000526020600020905b81548152906001019060200180831161148c57829003601f168201915b505050505090506000600c80546114bf90613ee3565b9050116114db57604051806020016040528060008152506114fe565b81816040516020016114ee929190614828565b6040516020818303038152906040525b92505050919050565b61151082610a67565b61151981611e23565b6115238383611f18565b505050565b611531336112aa565b611570576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611567906148a3565b60405180910390fd5b60003390506000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f39061490f565b60405180910390fd5b600060016116086109fa565b611612919061492f565b905061161e33826124e6565b6116288185612504565b61163e836001846116399190614963565b612529565b60016116486109fa565b611652919061492f565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117177fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533611190565b611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d90614084565b60405180910390fd5b60005b825181101561186a57818181518110611775576117746144d8565b5b6020026020010151600f6000858481518110611794576117936144d8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d8382815181106117ef576117ee6144d8565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061186290614536565b915050611759565b505050565b600e602052806000526040600020600091509050805461188e90613ee3565b80601f01602080910402602001604051908101604052809291908181526020018280546118ba90613ee3565b80156119075780601f106118dc57610100808354040283529160200191611907565b820191906000526020600020905b8154815290600101906020018083116118ea57829003601f168201915b505050505081565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119825750611981826125b4565b5b9050919050565b61199281612413565b6119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c89061465c565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a4f83610f7d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611aa183610f7d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ae35750611ae28185611659565b5b80611b2157508373ffffffffffffffffffffffffffffffffffffffff16611b09846107f0565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b4a82610f7d565b73ffffffffffffffffffffffffffffffffffffffff1614611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9790614a09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0690614a9b565b60405180910390fd5b611c1c838383600161262e565b8273ffffffffffffffffffffffffffffffffffffffff16611c3c82610f7d565b73ffffffffffffffffffffffffffffffffffffffff1614611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8990614a09565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e1e8383836001612648565b505050565b611e3481611e2f6119d4565b61264e565b50565b611e418282611190565b611f14576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611eb96119d4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611f228282611190565b15611ff6576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611f9b6119d4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6120026126d3565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6120466119d4565b6040516120539190613629565b60405180910390a1565b600061206882610f7d565b905061207881600084600161262e565b61208182610f7d565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121a7816000846001612648565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6121f061271c565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122346119d4565b6040516122419190613629565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b090614b07565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123aa91906134b8565b60405180910390a3505050565b6123c2848484611b2a565b6123ce84848484612766565b61240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240490614b99565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612435836121ab565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c805461246390613ee3565b80601f016020809104026020016040519081016040528092919081815260200182805461248f90613ee3565b80156124dc5780601f106124b1576101008083540402835291602001916124dc565b820191906000526020600020905b8154815290600101906020018083116124bf57829003601f168201915b5050505050905090565b6125008282604051806020016040528060008152506128ed565b5050565b80600e600084815260200190815260200160002090816125249190614250565b505050565b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905580600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612627575061262682612948565b5b9050919050565b61263661271c565b61264284848484612a2a565b50505050565b50505050565b6126588282611190565b6126cf5761266581612b88565b6126738360001c6020612bb5565b604051602001612684929190614c51565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c69190613563565b60405180910390fd5b5050565b6126db610f4e565b61271a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271190614cd7565b60405180910390fd5b565b612724610f4e565b15612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90614d43565b60405180910390fd5b565b60006127878473ffffffffffffffffffffffffffffffffffffffff16612df1565b156128e0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127b06119d4565b8786866040518563ffffffff1660e01b81526004016127d29493929190614db8565b6020604051808303816000875af192505050801561280e57506040513d601f19601f8201168201806040525081019061280b9190614e19565b60015b612890573d806000811461283e576040519150601f19603f3d011682016040523d82523d6000602084013e612843565b606091505b506000815103612888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287f90614b99565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128e5565b600190505b949350505050565b6128f78383612e14565b6129046000848484612766565b612943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293a90614b99565b60405180910390fd5b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a1357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a235750612a2282613031565b5b9050919050565b612a368484848461309b565b6001811115612a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7190614eb8565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612ac157612abc816130a1565b612b00565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612aff57612afe85826130ea565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612b4257612b3d81613257565b612b81565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612b8057612b7f8482613328565b5b5b5050505050565b6060612bae8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612bb5565b9050919050565b606060006002836002612bc89190614ed8565b612bd2919061492f565b67ffffffffffffffff811115612beb57612bea6136ba565b5b6040519080825280601f01601f191660200182016040528015612c1d5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612c5557612c546144d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612cb957612cb86144d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612cf99190614ed8565b612d03919061492f565b90505b6001811115612da3577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612d4557612d446144d8565b5b1a60f81b828281518110612d5c57612d5b6144d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612d9c90614f1a565b9050612d06565b5060008414612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde90614f8f565b60405180910390fd5b8091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7a90614ffb565b60405180910390fd5b612e8c81612413565b15612ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec390615067565b60405180910390fd5b612eda60008383600161262e565b612ee381612413565b15612f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1a90615067565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461302d600083836001612648565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130f784611003565b6131019190614963565b90506000600760008481526020019081526020016000205490508181146131e6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061326b9190614963565b905060006009600084815260200190815260200160002054905060006008838154811061329b5761329a6144d8565b5b9060005260206000200154905080600883815481106132bd576132bc6144d8565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061330c5761330b615087565b5b6001900381819060005260206000200160009055905550505050565b600061333383611003565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b5080546133b390613ee3565b6000825580601f106133c557506133e4565b601f0160209004906000526020600020908101906133e391906133e7565b5b50565b5b808211156134005760008160009055506001016133e8565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61344d81613418565b811461345857600080fd5b50565b60008135905061346a81613444565b92915050565b6000602082840312156134865761348561340e565b5b60006134948482850161345b565b91505092915050565b60008115159050919050565b6134b28161349d565b82525050565b60006020820190506134cd60008301846134a9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561350d5780820151818401526020810190506134f2565b60008484015250505050565b6000601f19601f8301169050919050565b6000613535826134d3565b61353f81856134de565b935061354f8185602086016134ef565b61355881613519565b840191505092915050565b6000602082019050818103600083015261357d818461352a565b905092915050565b6000819050919050565b61359881613585565b81146135a357600080fd5b50565b6000813590506135b58161358f565b92915050565b6000602082840312156135d1576135d061340e565b5b60006135df848285016135a6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613613826135e8565b9050919050565b61362381613608565b82525050565b600060208201905061363e600083018461361a565b92915050565b61364d81613608565b811461365857600080fd5b50565b60008135905061366a81613644565b92915050565b600080604083850312156136875761368661340e565b5b60006136958582860161365b565b92505060206136a6858286016135a6565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136f282613519565b810181811067ffffffffffffffff82111715613711576137106136ba565b5b80604052505050565b6000613724613404565b905061373082826136e9565b919050565b600067ffffffffffffffff8211156137505761374f6136ba565b5b61375982613519565b9050602081019050919050565b82818337600083830152505050565b600061378861378384613735565b61371a565b9050828152602081018484840111156137a4576137a36136b5565b5b6137af848285613766565b509392505050565b600082601f8301126137cc576137cb6136b0565b5b81356137dc848260208601613775565b91505092915050565b600080604083850312156137fc576137fb61340e565b5b600061380a858286016135a6565b925050602083013567ffffffffffffffff81111561382b5761382a613413565b5b613837858286016137b7565b9150509250929050565b61384a81613585565b82525050565b60006020820190506138656000830184613841565b92915050565b6000806000606084860312156138845761388361340e565b5b60006138928682870161365b565b93505060206138a38682870161365b565b92505060406138b4868287016135a6565b9150509250925092565b6000819050919050565b6138d1816138be565b81146138dc57600080fd5b50565b6000813590506138ee816138c8565b92915050565b60006020828403121561390a5761390961340e565b5b6000613918848285016138df565b91505092915050565b61392a816138be565b82525050565b60006020820190506139456000830184613921565b92915050565b600080604083850312156139625761396161340e565b5b6000613970858286016138df565b92505060206139818582860161365b565b9150509250929050565b6000602082840312156139a1576139a061340e565b5b60006139af8482850161365b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6139ed81613585565b82525050565b60006139ff83836139e4565b60208301905092915050565b6000602082019050919050565b6000613a23826139b8565b613a2d81856139c3565b9350613a38836139d4565b8060005b83811015613a69578151613a5088826139f3565b9750613a5b83613a0b565b925050600181019050613a3c565b5085935050505092915050565b60006020820190508181036000830152613a908184613a18565b905092915050565b600060208284031215613aae57613aad61340e565b5b600082013567ffffffffffffffff811115613acc57613acb613413565b5b613ad8848285016137b7565b91505092915050565b613aea8161349d565b8114613af557600080fd5b50565b600081359050613b0781613ae1565b92915050565b60008060408385031215613b2457613b2361340e565b5b6000613b328582860161365b565b9250506020613b4385828601613af8565b9150509250929050565b600067ffffffffffffffff821115613b6857613b676136ba565b5b613b7182613519565b9050602081019050919050565b6000613b91613b8c84613b4d565b61371a565b905082815260208101848484011115613bad57613bac6136b5565b5b613bb8848285613766565b509392505050565b600082601f830112613bd557613bd46136b0565b5b8135613be5848260208601613b7e565b91505092915050565b60008060008060808587031215613c0857613c0761340e565b5b6000613c168782880161365b565b9450506020613c278782880161365b565b9350506040613c38878288016135a6565b925050606085013567ffffffffffffffff811115613c5957613c58613413565b5b613c6587828801613bc0565b91505092959194509250565b60008060408385031215613c8857613c8761340e565b5b6000613c968582860161365b565b9250506020613ca78582860161365b565b9150509250929050565b600067ffffffffffffffff821115613ccc57613ccb6136ba565b5b602082029050602081019050919050565b600080fd5b6000613cf5613cf084613cb1565b61371a565b90508083825260208201905060208402830185811115613d1857613d17613cdd565b5b835b81811015613d415780613d2d888261365b565b845260208401935050602081019050613d1a565b5050509392505050565b600082601f830112613d6057613d5f6136b0565b5b8135613d70848260208601613ce2565b91505092915050565b600067ffffffffffffffff821115613d9457613d936136ba565b5b602082029050602081019050919050565b6000613db8613db384613d79565b61371a565b90508083825260208201905060208402830185811115613ddb57613dda613cdd565b5b835b81811015613e045780613df088826135a6565b845260208401935050602081019050613ddd565b5050509392505050565b600082601f830112613e2357613e226136b0565b5b8135613e33848260208601613da5565b91505092915050565b60008060408385031215613e5357613e5261340e565b5b600083013567ffffffffffffffff811115613e7157613e70613413565b5b613e7d85828601613d4b565b925050602083013567ffffffffffffffff811115613e9e57613e9d613413565b5b613eaa85828601613e0e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613efb57607f821691505b602082108103613f0e57613f0d613eb4565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f706021836134de565b9150613f7b82613f14565b604082019050919050565b60006020820190508181036000830152613f9f81613f63565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614002603d836134de565b915061400d82613fa6565b604082019050919050565b6000602082019050818103600083015261403181613ff5565b9050919050565b7f43616c6c6572206973206e6f7420616e2061646d696e00000000000000000000600082015250565b600061406e6016836134de565b915061407982614038565b602082019050919050565b6000602082019050818103600083015261409d81614061565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026141067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826140c9565b61411086836140c9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061414d61414861414384613585565b614128565b613585565b9050919050565b6000819050919050565b61416783614132565b61417b61417382614154565b8484546140d6565b825550505050565b600090565b614190614183565b61419b81848461415e565b505050565b5b818110156141bf576141b4600082614188565b6001810190506141a1565b5050565b601f821115614204576141d5816140a4565b6141de846140b9565b810160208510156141ed578190505b6142016141f9856140b9565b8301826141a0565b50505b505050565b600082821c905092915050565b600061422760001984600802614209565b1980831691505092915050565b60006142408383614216565b9150826002028217905092915050565b614259826134d3565b67ffffffffffffffff811115614272576142716136ba565b5b61427c8254613ee3565b6142878282856141c3565b600060209050601f8311600181146142ba57600084156142a8578287015190505b6142b28582614234565b86555061431a565b601f1984166142c8866140a4565b60005b828110156142f0578489015182556001820191506020850194506020810190506142cb565b8683101561430d5784890151614309601f891682614216565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061437e602d836134de565b915061438982614322565b604082019050919050565b600060208201905081810360008301526143ad81614371565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614410602b836134de565b915061441b826143b4565b604082019050919050565b6000602082019050818103600083015261443f81614403565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006144a2602f836134de565b91506144ad82614446565b604082019050919050565b600060208201905081810360008301526144d181614495565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061454182613585565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361457357614572614507565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006145da602c836134de565b91506145e58261457e565b604082019050919050565b60006020820190508181036000830152614609816145cd565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006146466018836134de565b915061465182614610565b602082019050919050565b6000602082019050818103600083015261467581614639565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006146d86029836134de565b91506146e38261467c565b604082019050919050565b60006020820190508181036000830152614707816146cb565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061476a602f836134de565b91506147758261470e565b604082019050919050565b600060208201905081810360008301526147998161475d565b9050919050565b600081905092915050565b60006147b6826134d3565b6147c081856147a0565b93506147d08185602086016134ef565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006148126001836147a0565b915061481d826147dc565b600182019050919050565b600061483482856147ab565b915061483f82614805565b915061484b82846147ab565b91508190509392505050565b7f55736572206e6f7420696e20736e617073686f74000000000000000000000000600082015250565b600061488d6014836134de565b915061489882614857565b602082019050919050565b600060208201905081810360008301526148bc81614880565b9050919050565b7f4e6f206d6f7265206d696e7473206176616961626c6500000000000000000000600082015250565b60006148f96016836134de565b9150614904826148c3565b602082019050919050565b60006020820190508181036000830152614928816148ec565b9050919050565b600061493a82613585565b915061494583613585565b925082820190508082111561495d5761495c614507565b5b92915050565b600061496e82613585565b915061497983613585565b925082820390508181111561499157614990614507565b5b92915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006149f36025836134de565b91506149fe82614997565b604082019050919050565b60006020820190508181036000830152614a22816149e6565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a856024836134de565b9150614a9082614a29565b604082019050919050565b60006020820190508181036000830152614ab481614a78565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614af16019836134de565b9150614afc82614abb565b602082019050919050565b60006020820190508181036000830152614b2081614ae4565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614b836032836134de565b9150614b8e82614b27565b604082019050919050565b60006020820190508181036000830152614bb281614b76565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614bef6017836147a0565b9150614bfa82614bb9565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614c3b6011836147a0565b9150614c4682614c05565b601182019050919050565b6000614c5c82614be2565b9150614c6882856147ab565b9150614c7382614c2e565b9150614c7f82846147ab565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614cc16014836134de565b9150614ccc82614c8b565b602082019050919050565b60006020820190508181036000830152614cf081614cb4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614d2d6010836134de565b9150614d3882614cf7565b602082019050919050565b60006020820190508181036000830152614d5c81614d20565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614d8a82614d63565b614d948185614d6e565b9350614da48185602086016134ef565b614dad81613519565b840191505092915050565b6000608082019050614dcd600083018761361a565b614dda602083018661361a565b614de76040830185613841565b8181036060830152614df98184614d7f565b905095945050505050565b600081519050614e1381613444565b92915050565b600060208284031215614e2f57614e2e61340e565b5b6000614e3d84828501614e04565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614ea26035836134de565b9150614ead82614e46565b604082019050919050565b60006020820190508181036000830152614ed181614e95565b9050919050565b6000614ee382613585565b9150614eee83613585565b9250828202614efc81613585565b91508282048414831517614f1357614f12614507565b5b5092915050565b6000614f2582613585565b915060008203614f3857614f37614507565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614f796020836134de565b9150614f8482614f43565b602082019050919050565b60006020820190508181036000830152614fa881614f6c565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614fe56020836134de565b9150614ff082614faf565b602082019050919050565b6000602082019050818103600083015261501481614fd8565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615051601c836134de565b915061505c8261501b565b602082019050919050565b6000602082019050818103600083015261508081615044565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202b09216547e26e4899be33a9c4d0dd366d40d64d0a9a49c08e3cbb47347ac4dc64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d51b681526ba8ec9f54b07c3274a9e5bf0c10111
-----Decoded View---------------
Arg [0] : initialAdmin (address): 0xd51B681526Ba8ec9F54b07c3274a9E5Bf0C10111
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d51b681526ba8ec9f54b07c3274a9e5bf0c10111
Deployed Bytecode Sourcemap
88274:4140:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88958:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65196:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66708:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66226:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90050:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82129:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67408:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52018:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52459:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81797:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53603:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92346:65;;;:::i;:::-;;67814:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87962:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91491:390;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89874:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82319:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89160:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34208:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88528:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64906:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64637:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88429:34;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88585:60;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92277:61;;;:::i;:::-;;50491:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65365:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49596:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66951:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91889:264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68070:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90975:508;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52899:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90243:467;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67177:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89272:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88472:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88958:194;89084:4;89108:36;89132:11;89108:23;:36::i;:::-;89101:43;;88958:194;;;:::o;65196:100::-;65250:13;65283:5;65276:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65196:100;:::o;66708:171::-;66784:7;66804:23;66819:7;66804:14;:23::i;:::-;66847:15;:24;66863:7;66847:24;;;;;;;;;;;;;;;;;;;;;66840:31;;66708:171;;;:::o;66226:416::-;66307:13;66323:23;66338:7;66323:14;:23::i;:::-;66307:39;;66371:5;66365:11;;:2;:11;;;66357:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;66465:5;66449:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;66474:37;66491:5;66498:12;:10;:12::i;:::-;66474:16;:37::i;:::-;66449:62;66427:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;66613:21;66622:2;66626:7;66613:8;:21::i;:::-;66296:346;66226:416;;:::o;90050:185::-;88872:31;88622:23;88892:10;88872:7;:31::i;:::-;88864:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;90157:15:::1;:24;90173:7;90157:24;;;;;;;;;;;;90150:31;;;;:::i;:::-;90219:8;90192:15;:24;90208:7;90192:24;;;;;;;;;;;:35;;;;;;:::i;:::-;;90050:185:::0;;:::o;82129:113::-;82190:7;82217:10;:17;;;;82210:24;;82129:113;:::o;67408:335::-;67603:41;67622:12;:10;:12::i;:::-;67636:7;67603:18;:41::i;:::-;67595:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;67707:28;67717:4;67723:2;67727:7;67707:9;:28::i;:::-;67408:335;;;:::o;52018:131::-;52092:7;52119:6;:12;52126:4;52119:12;;;;;;;;;;;:22;;;52112:29;;52018:131;;;:::o;52459:147::-;52542:18;52555:4;52542:12;:18::i;:::-;50087:16;50098:4;50087:10;:16::i;:::-;52573:25:::1;52584:4;52590:7;52573:10;:25::i;:::-;52459:147:::0;;;:::o;81797:256::-;81894:7;81930:23;81947:5;81930:16;:23::i;:::-;81922:5;:31;81914:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;82019:12;:19;82032:5;82019:19;;;;;;;;;;;;;;;:26;82039:5;82019:26;;;;;;;;;;;;82012:33;;81797:256;;;;:::o;53603:218::-;53710:12;:10;:12::i;:::-;53699:23;;:7;:23;;;53691:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;53787:26;53799:4;53805:7;53787:11;:26::i;:::-;53603:218;;:::o;92346:65::-;88872:31;88622:23;88892:10;88872:7;:31::i;:::-;88864:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;92393:10:::1;:8;:10::i;:::-;92346:65::o:0;67814:185::-;67952:39;67969:4;67975:2;67979:7;67952:39;;;;;;;;;;;;:16;:39::i;:::-;67814:185;;;:::o;87962:242::-;88080:41;88099:12;:10;:12::i;:::-;88113:7;88080:18;:41::i;:::-;88072:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;88182:14;88188:7;88182:5;:14::i;:::-;87962:242;:::o;91491:390::-;91578:16;91612:23;91638:17;91648:6;91638:9;:17::i;:::-;91612:43;;91666:25;91708:15;91694:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91666:58;;91740:9;91735:113;91755:15;91751:1;:19;91735:113;;;91806:30;91826:6;91834:1;91806:19;:30::i;:::-;91792:8;91801:1;91792:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;91772:3;;;;;:::i;:::-;;;;91735:113;;;;91865:8;91858:15;;;;91491:390;;;:::o;89874:168::-;88872:31;88622:23;88892:10;88872:7;:31::i;:::-;88864:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;89967:13:::1;:23;89981:8;89967:23;;;;;;;;;;;;;;;89960:30;;;90027:7;90001:13;:23;90015:8;90001:23;;;;;;;;;;;;;;;:33;;;;89874:168:::0;;:::o;82319:233::-;82394:7;82430:30;:28;:30::i;:::-;82422:5;:38;82414:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;82527:10;82538:5;82527:17;;;;;;;;:::i;:::-;;;;;;;;;;82520:24;;82319:233;;;:::o;89160:104::-;88872:31;88622:23;88892:10;88872:7;:31::i;:::-;88864:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;89245:11:::1;89235:7;:21;;;;;;:::i;:::-;;89160:104:::0;:::o;34208:86::-;34255:4;34279:7;;;;;;;;;;;34272:14;;34208:86;:::o;88528:48::-;;;;;;;;;;;;;;;;;:::o;64906:223::-;64978:7;64998:13;65014:17;65023:7;65014:8;:17::i;:::-;64998:33;;65067:1;65050:19;;:5;:19;;;65042:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;65116:5;65109:12;;;64906:223;;;:::o;64637:207::-;64709:7;64754:1;64737:19;;:5;:19;;;64729:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;64820:9;:16;64830:5;64820:16;;;;;;;;;;;;;;;;64813:23;;64637:207;;;:::o;88429:34::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;88585:60::-;88622:23;88585:60;:::o;92277:61::-;88872:31;88622:23;88892:10;88872:7;:31::i;:::-;88864:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;92322:8:::1;:6;:8::i;:::-;92277:61::o:0;50491:147::-;50577:4;50601:6;:12;50608:4;50601:12;;;;;;;;;;;:20;;:29;50622:7;50601:29;;;;;;;;;;;;;;;;;;;;;;;;;50594:36;;50491:147;;;;:::o;65365:104::-;65421:13;65454:7;65447:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65365:104;:::o;49596:49::-;49641:4;49596:49;;;:::o;66951:155::-;67046:52;67065:12;:10;:12::i;:::-;67079:8;67089;67046:18;:52::i;:::-;66951:155;;:::o;91889:264::-;91947:4;91969:6;91978:1;91969:10;;91964:159;91985:17;:24;;;;91981:1;:28;91964:159;;;92059:5;92035:29;;:17;92053:1;92035:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:29;;;92031:81;;92092:4;92085:11;;;;;92031:81;92011:3;;;;;:::i;:::-;;;;91964:159;;;;92140:5;92133:12;;91889:264;;;;:::o;68070:322::-;68244:41;68263:12;:10;:12::i;:::-;68277:7;68244:18;:41::i;:::-;68236:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;68346:38;68360:4;68366:2;68370:7;68379:4;68346:13;:38::i;:::-;68070:322;;;;:::o;90975:508::-;91093:13;91146:16;91154:7;91146;:16::i;:::-;91124:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;91250:28;91281:10;:8;:10::i;:::-;91250:41;;91302:18;91323:15;:24;91339:7;91323:24;;;;;;;;;;;91302:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91389:1;91371:7;91365:21;;;;;:::i;:::-;;;:25;:110;;;;;;;;;;;;;;;;;91430:14;91451:4;91413:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;91365:110;91358:117;;;;90975:508;;;:::o;52899:149::-;52983:18;52996:4;52983:12;:18::i;:::-;50087:16;50098:4;50087:10;:16::i;:::-;53014:26:::1;53026:4;53032:7;53014:11;:26::i;:::-;52899:149:::0;;;:::o;90243:467::-;90307:24;90320:10;90307:12;:24::i;:::-;90299:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;90367:13;90383:10;90367:26;;90404:14;90421:13;:20;90435:5;90421:20;;;;;;;;;;;;;;;;90404:37;;90469:1;90460:6;:10;90452:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;90508:15;90542:1;90526:13;:11;:13::i;:::-;:17;;;;:::i;:::-;90508:35;;90554:30;90564:10;90576:7;90554:9;:30::i;:::-;90595:35;90611:7;90620:9;90595:15;:35::i;:::-;90641:34;90657:5;90673:1;90664:6;:10;;;;:::i;:::-;90641:15;:34::i;:::-;90701:1;90686:13;:11;:13::i;:::-;:16;;;;:::i;:::-;;90288:422;;;90243:467;:::o;67177:164::-;67274:4;67298:18;:25;67317:5;67298:25;;;;;;;;;;;;;;;:35;67324:8;67298:35;;;;;;;;;;;;;;;;;;;;;;;;;67291:42;;67177:164;;;;:::o;89272:285::-;88872:31;88622:23;88892:10;88872:7;:31::i;:::-;88864:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;89388:9:::1;89383:167;89407:9;:16;89403:1;:20;89383:167;;;89475:9;89485:1;89475:12;;;;;;;;:::i;:::-;;;;;;;;89445:13;:27;89459:9;89469:1;89459:12;;;;;;;;:::i;:::-;;;;;;;;89445:27;;;;;;;;;;;;;;;:42;;;;89502:17;89525:9;89535:1;89525:12;;;;;;;;:::i;:::-;;;;;;;;89502:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89425:3;;;;;:::i;:::-;;;;89383:167;;;;89272:285:::0;;:::o;88472:49::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50195:204::-;50280:4;50319:32;50304:47;;;:11;:47;;;;:87;;;;50355:36;50379:11;50355:23;:36::i;:::-;50304:87;50297:94;;50195:204;;;:::o;76527:135::-;76609:16;76617:7;76609;:16::i;:::-;76601:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;76527:135;:::o;32321:98::-;32374:7;32401:10;32394:17;;32321:98;:::o;75806:174::-;75908:2;75881:15;:24;75897:7;75881:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;75964:7;75960:2;75926:46;;75935:23;75950:7;75935:14;:23::i;:::-;75926:46;;;;;;;;;;;;75806:174;;:::o;70425:264::-;70518:4;70535:13;70551:23;70566:7;70551:14;:23::i;:::-;70535:39;;70604:5;70593:16;;:7;:16;;;:52;;;;70613:32;70630:5;70637:7;70613:16;:32::i;:::-;70593:52;:87;;;;70673:7;70649:31;;:20;70661:7;70649:11;:20::i;:::-;:31;;;70593:87;70585:96;;;70425:264;;;;:::o;74424:1263::-;74583:4;74556:31;;:23;74571:7;74556:14;:23::i;:::-;:31;;;74548:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;74662:1;74648:16;;:2;:16;;;74640:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;74718:42;74739:4;74745:2;74749:7;74758:1;74718:20;:42::i;:::-;74890:4;74863:31;;:23;74878:7;74863:14;:23::i;:::-;:31;;;74855:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;75008:15;:24;75024:7;75008:24;;;;;;;;;;;;75001:31;;;;;;;;;;;75503:1;75484:9;:15;75494:4;75484:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;75536:1;75519:9;:13;75529:2;75519:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;75578:2;75559:7;:16;75567:7;75559:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;75617:7;75613:2;75598:27;;75607:4;75598:27;;;;;;;;;;;;75638:41;75658:4;75664:2;75668:7;75677:1;75638:19;:41::i;:::-;74424:1263;;;:::o;50942:105::-;51009:30;51020:4;51026:12;:10;:12::i;:::-;51009:10;:30::i;:::-;50942:105;:::o;55200:238::-;55284:22;55292:4;55298:7;55284;:22::i;:::-;55279:152;;55355:4;55323:6;:12;55330:4;55323:12;;;;;;;;;;;:20;;:29;55344:7;55323:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;55406:12;:10;:12::i;:::-;55379:40;;55397:7;55379:40;;55391:4;55379:40;;;;;;;;;;55279:152;55200:238;;:::o;55618:239::-;55702:22;55710:4;55716:7;55702;:22::i;:::-;55698:152;;;55773:5;55741:6;:12;55748:4;55741:12;;;;;;;;;;;:20;;:29;55762:7;55741:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;55825:12;:10;:12::i;:::-;55798:40;;55816:7;55798:40;;55810:4;55798:40;;;;;;;;;;55698:152;55618:239;;:::o;35063:120::-;34072:16;:14;:16::i;:::-;35132:5:::1;35122:7;;:15;;;;;;;;;;;;;;;;;;35153:22;35162:12;:10;:12::i;:::-;35153:22;;;;;;:::i;:::-;;;;;;;;35063:120::o:0;73304:783::-;73364:13;73380:23;73395:7;73380:14;:23::i;:::-;73364:39;;73416:51;73437:5;73452:1;73456:7;73465:1;73416:20;:51::i;:::-;73580:23;73595:7;73580:14;:23::i;:::-;73572:31;;73651:15;:24;73667:7;73651:24;;;;;;;;;;;;73644:31;;;;;;;;;;;73916:1;73896:9;:16;73906:5;73896:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;73946:7;:16;73954:7;73946:16;;;;;;;;;;;;73939:23;;;;;;;;;;;74008:7;74004:1;73980:36;;73989:5;73980:36;;;;;;;;;;;;74029:50;74049:5;74064:1;74068:7;74077:1;74029:19;:50::i;:::-;73353:734;73304:783;:::o;69700:117::-;69766:7;69793;:16;69801:7;69793:16;;;;;;;;;;;;;;;;;;;;;69786:23;;69700:117;;;:::o;34804:118::-;33813:19;:17;:19::i;:::-;34874:4:::1;34864:7;;:14;;;;;;;;;;;;;;;;;;34894:20;34901:12;:10;:12::i;:::-;34894:20;;;;;;:::i;:::-;;;;;;;;34804:118::o:0;76123:315::-;76278:8;76269:17;;:5;:17;;;76261:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;76365:8;76327:18;:25;76346:5;76327:25;;;;;;;;;;;;;;;:35;76353:8;76327:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;76411:8;76389:41;;76404:5;76389:41;;;76421:8;76389:41;;;;;;:::i;:::-;;;;;;;;76123:315;;;:::o;69273:313::-;69429:28;69439:4;69445:2;69449:7;69429:9;:28::i;:::-;69476:47;69499:4;69505:2;69509:7;69518:4;69476:22;:47::i;:::-;69468:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;69273:313;;;;:::o;70130:128::-;70195:4;70248:1;70219:31;;:17;70228:7;70219:8;:17::i;:::-;:31;;;;70212:38;;70130:128;;;:::o;92161:108::-;92221:13;92254:7;92247:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92161:108;:::o;71031:110::-;71107:26;71117:2;71121:7;71107:26;;;;;;;;;;;;:9;:26::i;:::-;71031:110;;:::o;89565:132::-;89680:9;89652:15;:25;89668:8;89652:25;;;;;;;;;;;:37;;;;;;:::i;:::-;;89565:132;;:::o;89705:161::-;89791:13;:23;89805:8;89791:23;;;;;;;;;;;;;;;89784:30;;;89851:7;89825:13;:23;89839:8;89825:23;;;;;;;;;;;;;;;:33;;;;89705:161;;:::o;81489:224::-;81591:4;81630:35;81615:50;;;:11;:50;;;;:90;;;;81669:36;81693:11;81669:23;:36::i;:::-;81615:90;81608:97;;81489:224;;;:::o;90718:249::-;33813:19;:17;:19::i;:::-;90903:56:::1;90930:4;90936:2;90940:7;90949:9;90903:26;:56::i;:::-;90718:249:::0;;;;:::o;79692:158::-;;;;;:::o;51337:492::-;51426:22;51434:4;51440:7;51426;:22::i;:::-;51421:401;;51614:28;51634:7;51614:19;:28::i;:::-;51715:38;51743:4;51735:13;;51750:2;51715:19;:38::i;:::-;51519:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51465:345;;;;;;;;;;;:::i;:::-;;;;;;;;51421:401;51337:492;;:::o;34552:108::-;34619:8;:6;:8::i;:::-;34611:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;34552:108::o;34367:::-;34438:8;:6;:8::i;:::-;34437:9;34429:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;34367:108::o;77226:853::-;77380:4;77401:15;:2;:13;;;:15::i;:::-;77397:675;;;77453:2;77437:36;;;77474:12;:10;:12::i;:::-;77488:4;77494:7;77503:4;77437:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;77433:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77695:1;77678:6;:13;:18;77674:328;;77721:60;;;;;;;;;;:::i;:::-;;;;;;;;77674:328;77952:6;77946:13;77937:6;77933:2;77929:15;77922:38;77433:584;77569:41;;;77559:51;;;:6;:51;;;;77552:58;;;;;77397:675;78056:4;78049:11;;77226:853;;;;;;;:::o;71368:319::-;71497:18;71503:2;71507:7;71497:5;:18::i;:::-;71548:53;71579:1;71583:2;71587:7;71596:4;71548:22;:53::i;:::-;71526:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;71368:319;;;:::o;64268:305::-;64370:4;64422:25;64407:40;;;:11;:40;;;;:105;;;;64479:33;64464:48;;;:11;:48;;;;64407:105;:158;;;;64529:36;64553:11;64529:23;:36::i;:::-;64407:158;64387:178;;64268:305;;;:::o;82626:915::-;82803:61;82830:4;82836:2;82840:12;82854:9;82803:26;:61::i;:::-;82893:1;82881:9;:13;82877:222;;;83024:63;;;;;;;;;;:::i;:::-;;;;;;;;82877:222;83111:15;83129:12;83111:30;;83174:1;83158:18;;:4;:18;;;83154:187;;83193:40;83225:7;83193:31;:40::i;:::-;83154:187;;;83263:2;83255:10;;:4;:10;;;83251:90;;83282:47;83315:4;83321:7;83282:32;:47::i;:::-;83251:90;83154:187;83369:1;83355:16;;:2;:16;;;83351:183;;83388:45;83425:7;83388:36;:45::i;:::-;83351:183;;;83461:4;83455:10;;:2;:10;;;83451:83;;83482:40;83510:2;83514:7;83482:27;:40::i;:::-;83451:83;83351:183;82792:749;82626:915;;;;:::o;31484:151::-;31542:13;31575:52;31603:4;31587:22;;29639:2;31575:52;;:11;:52::i;:::-;31568:59;;31484:151;;;:::o;30880:447::-;30955:13;30981:19;31026:1;31017:6;31013:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;31003:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30981:47;;31039:15;:6;31046:1;31039:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;31065;:6;31072:1;31065:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;31096:9;31121:1;31112:6;31108:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;31096:26;;31091:131;31128:1;31124;:5;31091:131;;;31163:8;31180:3;31172:5;:11;31163:21;;;;;;;:::i;:::-;;;;;31151:6;31158:1;31151:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;31209:1;31199:11;;;;;31131:3;;;;:::i;:::-;;;31091:131;;;;31249:1;31240:5;:10;31232:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31312:6;31298:21;;;30880:447;;;;:::o;36423:326::-;36483:4;36740:1;36718:7;:19;;;:23;36711:30;;36423:326;;;:::o;72023:942::-;72117:1;72103:16;;:2;:16;;;72095:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;72176:16;72184:7;72176;:16::i;:::-;72175:17;72167:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;72238:48;72267:1;72271:2;72275:7;72284:1;72238:20;:48::i;:::-;72385:16;72393:7;72385;:16::i;:::-;72384:17;72376:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;72800:1;72783:9;:13;72793:2;72783:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;72844:2;72825:7;:16;72833:7;72825:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;72889:7;72885:2;72864:33;;72881:1;72864:33;;;;;;;;;;;;72910:47;72938:1;72942:2;72946:7;72955:1;72910:19;:47::i;:::-;72023:942;;:::o;47454:157::-;47539:4;47578:25;47563:40;;;:11;:40;;;;47556:47;;47454:157;;;:::o;78811:159::-;;;;;:::o;84264:164::-;84368:10;:17;;;;84341:15;:24;84357:7;84341:24;;;;;;;;;;;:44;;;;84396:10;84412:7;84396:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84264:164;:::o;85055:988::-;85321:22;85371:1;85346:22;85363:4;85346:16;:22::i;:::-;:26;;;;:::i;:::-;85321:51;;85383:18;85404:17;:26;85422:7;85404:26;;;;;;;;;;;;85383:47;;85551:14;85537:10;:28;85533:328;;85582:19;85604:12;:18;85617:4;85604:18;;;;;;;;;;;;;;;:34;85623:14;85604:34;;;;;;;;;;;;85582:56;;85688:11;85655:12;:18;85668:4;85655:18;;;;;;;;;;;;;;;:30;85674:10;85655:30;;;;;;;;;;;:44;;;;85805:10;85772:17;:30;85790:11;85772:30;;;;;;;;;;;:43;;;;85567:294;85533:328;85957:17;:26;85975:7;85957:26;;;;;;;;;;;85950:33;;;86001:12;:18;86014:4;86001:18;;;;;;;;;;;;;;;:34;86020:14;86001:34;;;;;;;;;;;85994:41;;;85136:907;;85055:988;;:::o;86338:1079::-;86591:22;86636:1;86616:10;:17;;;;:21;;;;:::i;:::-;86591:46;;86648:18;86669:15;:24;86685:7;86669:24;;;;;;;;;;;;86648:45;;87020:19;87042:10;87053:14;87042:26;;;;;;;;:::i;:::-;;;;;;;;;;87020:48;;87106:11;87081:10;87092;87081:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;87217:10;87186:15;:28;87202:11;87186:28;;;;;;;;;;;:41;;;;87358:15;:24;87374:7;87358:24;;;;;;;;;;;87351:31;;;87393:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;86409:1008;;;86338:1079;:::o;83842:221::-;83927:14;83944:20;83961:2;83944:16;:20::i;:::-;83927:37;;84002:7;83975:12;:16;83988:2;83975:16;;;;;;;;;;;;;;;:24;83992:6;83975:24;;;;;;;;;;;:34;;;;84049:6;84020:17;:26;84038:7;84020:26;;;;;;;;;;;:35;;;;83916:147;83842:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:180;5184:77;5181:1;5174:88;5281:4;5278:1;5271:15;5305:4;5302:1;5295:15;5322:281;5405:27;5427:4;5405:27;:::i;:::-;5397:6;5393:40;5535:6;5523:10;5520:22;5499:18;5487:10;5484:34;5481:62;5478:88;;;5546:18;;:::i;:::-;5478:88;5586:10;5582:2;5575:22;5365:238;5322:281;;:::o;5609:129::-;5643:6;5670:20;;:::i;:::-;5660:30;;5699:33;5727:4;5719:6;5699:33;:::i;:::-;5609:129;;;:::o;5744:308::-;5806:4;5896:18;5888:6;5885:30;5882:56;;;5918:18;;:::i;:::-;5882:56;5956:29;5978:6;5956:29;:::i;:::-;5948:37;;6040:4;6034;6030:15;6022:23;;5744:308;;;:::o;6058:146::-;6155:6;6150:3;6145;6132:30;6196:1;6187:6;6182:3;6178:16;6171:27;6058:146;;;:::o;6210:425::-;6288:5;6313:66;6329:49;6371:6;6329:49;:::i;:::-;6313:66;:::i;:::-;6304:75;;6402:6;6395:5;6388:21;6440:4;6433:5;6429:16;6478:3;6469:6;6464:3;6460:16;6457:25;6454:112;;;6485:79;;:::i;:::-;6454:112;6575:54;6622:6;6617:3;6612;6575:54;:::i;:::-;6294:341;6210:425;;;;;:::o;6655:340::-;6711:5;6760:3;6753:4;6745:6;6741:17;6737:27;6727:122;;6768:79;;:::i;:::-;6727:122;6885:6;6872:20;6910:79;6985:3;6977:6;6970:4;6962:6;6958:17;6910:79;:::i;:::-;6901:88;;6717:278;6655:340;;;;:::o;7001:654::-;7079:6;7087;7136:2;7124:9;7115:7;7111:23;7107:32;7104:119;;;7142:79;;:::i;:::-;7104:119;7262:1;7287:53;7332:7;7323:6;7312:9;7308:22;7287:53;:::i;:::-;7277:63;;7233:117;7417:2;7406:9;7402:18;7389:32;7448:18;7440:6;7437:30;7434:117;;;7470:79;;:::i;:::-;7434:117;7575:63;7630:7;7621:6;7610:9;7606:22;7575:63;:::i;:::-;7565:73;;7360:288;7001:654;;;;;:::o;7661:118::-;7748:24;7766:5;7748:24;:::i;:::-;7743:3;7736:37;7661:118;;:::o;7785:222::-;7878:4;7916:2;7905:9;7901:18;7893:26;;7929:71;7997:1;7986:9;7982:17;7973:6;7929:71;:::i;:::-;7785:222;;;;:::o;8013:619::-;8090:6;8098;8106;8155:2;8143:9;8134:7;8130:23;8126:32;8123:119;;;8161:79;;:::i;:::-;8123:119;8281:1;8306:53;8351:7;8342:6;8331:9;8327:22;8306:53;:::i;:::-;8296:63;;8252:117;8408:2;8434:53;8479:7;8470:6;8459:9;8455:22;8434:53;:::i;:::-;8424:63;;8379:118;8536:2;8562:53;8607:7;8598:6;8587:9;8583:22;8562:53;:::i;:::-;8552:63;;8507:118;8013:619;;;;;:::o;8638:77::-;8675:7;8704:5;8693:16;;8638:77;;;:::o;8721:122::-;8794:24;8812:5;8794:24;:::i;:::-;8787:5;8784:35;8774:63;;8833:1;8830;8823:12;8774:63;8721:122;:::o;8849:139::-;8895:5;8933:6;8920:20;8911:29;;8949:33;8976:5;8949:33;:::i;:::-;8849:139;;;;:::o;8994:329::-;9053:6;9102:2;9090:9;9081:7;9077:23;9073:32;9070:119;;;9108:79;;:::i;:::-;9070:119;9228:1;9253:53;9298:7;9289:6;9278:9;9274:22;9253:53;:::i;:::-;9243:63;;9199:117;8994:329;;;;:::o;9329:118::-;9416:24;9434:5;9416:24;:::i;:::-;9411:3;9404:37;9329:118;;:::o;9453:222::-;9546:4;9584:2;9573:9;9569:18;9561:26;;9597:71;9665:1;9654:9;9650:17;9641:6;9597:71;:::i;:::-;9453:222;;;;:::o;9681:474::-;9749:6;9757;9806:2;9794:9;9785:7;9781:23;9777:32;9774:119;;;9812:79;;:::i;:::-;9774:119;9932:1;9957:53;10002:7;9993:6;9982:9;9978:22;9957:53;:::i;:::-;9947:63;;9903:117;10059:2;10085:53;10130:7;10121:6;10110:9;10106:22;10085:53;:::i;:::-;10075:63;;10030:118;9681:474;;;;;:::o;10161:329::-;10220:6;10269:2;10257:9;10248:7;10244:23;10240:32;10237:119;;;10275:79;;:::i;:::-;10237:119;10395:1;10420:53;10465:7;10456:6;10445:9;10441:22;10420:53;:::i;:::-;10410:63;;10366:117;10161:329;;;;:::o;10496:114::-;10563:6;10597:5;10591:12;10581:22;;10496:114;;;:::o;10616:184::-;10715:11;10749:6;10744:3;10737:19;10789:4;10784:3;10780:14;10765:29;;10616:184;;;;:::o;10806:132::-;10873:4;10896:3;10888:11;;10926:4;10921:3;10917:14;10909:22;;10806:132;;;:::o;10944:108::-;11021:24;11039:5;11021:24;:::i;:::-;11016:3;11009:37;10944:108;;:::o;11058:179::-;11127:10;11148:46;11190:3;11182:6;11148:46;:::i;:::-;11226:4;11221:3;11217:14;11203:28;;11058:179;;;;:::o;11243:113::-;11313:4;11345;11340:3;11336:14;11328:22;;11243:113;;;:::o;11392:732::-;11511:3;11540:54;11588:5;11540:54;:::i;:::-;11610:86;11689:6;11684:3;11610:86;:::i;:::-;11603:93;;11720:56;11770:5;11720:56;:::i;:::-;11799:7;11830:1;11815:284;11840:6;11837:1;11834:13;11815:284;;;11916:6;11910:13;11943:63;12002:3;11987:13;11943:63;:::i;:::-;11936:70;;12029:60;12082:6;12029:60;:::i;:::-;12019:70;;11875:224;11862:1;11859;11855:9;11850:14;;11815:284;;;11819:14;12115:3;12108:10;;11516:608;;;11392:732;;;;:::o;12130:373::-;12273:4;12311:2;12300:9;12296:18;12288:26;;12360:9;12354:4;12350:20;12346:1;12335:9;12331:17;12324:47;12388:108;12491:4;12482:6;12388:108;:::i;:::-;12380:116;;12130:373;;;;:::o;12509:509::-;12578:6;12627:2;12615:9;12606:7;12602:23;12598:32;12595:119;;;12633:79;;:::i;:::-;12595:119;12781:1;12770:9;12766:17;12753:31;12811:18;12803:6;12800:30;12797:117;;;12833:79;;:::i;:::-;12797:117;12938:63;12993:7;12984:6;12973:9;12969:22;12938:63;:::i;:::-;12928:73;;12724:287;12509:509;;;;:::o;13024:116::-;13094:21;13109:5;13094:21;:::i;:::-;13087:5;13084:32;13074:60;;13130:1;13127;13120:12;13074:60;13024:116;:::o;13146:133::-;13189:5;13227:6;13214:20;13205:29;;13243:30;13267:5;13243:30;:::i;:::-;13146:133;;;;:::o;13285:468::-;13350:6;13358;13407:2;13395:9;13386:7;13382:23;13378:32;13375:119;;;13413:79;;:::i;:::-;13375:119;13533:1;13558:53;13603:7;13594:6;13583:9;13579:22;13558:53;:::i;:::-;13548:63;;13504:117;13660:2;13686:50;13728:7;13719:6;13708:9;13704:22;13686:50;:::i;:::-;13676:60;;13631:115;13285:468;;;;;:::o;13759:307::-;13820:4;13910:18;13902:6;13899:30;13896:56;;;13932:18;;:::i;:::-;13896:56;13970:29;13992:6;13970:29;:::i;:::-;13962:37;;14054:4;14048;14044:15;14036:23;;13759:307;;;:::o;14072:423::-;14149:5;14174:65;14190:48;14231:6;14190:48;:::i;:::-;14174:65;:::i;:::-;14165:74;;14262:6;14255:5;14248:21;14300:4;14293:5;14289:16;14338:3;14329:6;14324:3;14320:16;14317:25;14314:112;;;14345:79;;:::i;:::-;14314:112;14435:54;14482:6;14477:3;14472;14435:54;:::i;:::-;14155:340;14072:423;;;;;:::o;14514:338::-;14569:5;14618:3;14611:4;14603:6;14599:17;14595:27;14585:122;;14626:79;;:::i;:::-;14585:122;14743:6;14730:20;14768:78;14842:3;14834:6;14827:4;14819:6;14815:17;14768:78;:::i;:::-;14759:87;;14575:277;14514:338;;;;:::o;14858:943::-;14953:6;14961;14969;14977;15026:3;15014:9;15005:7;15001:23;14997:33;14994:120;;;15033:79;;:::i;:::-;14994:120;15153:1;15178:53;15223:7;15214:6;15203:9;15199:22;15178:53;:::i;:::-;15168:63;;15124:117;15280:2;15306:53;15351:7;15342:6;15331:9;15327:22;15306:53;:::i;:::-;15296:63;;15251:118;15408:2;15434:53;15479:7;15470:6;15459:9;15455:22;15434:53;:::i;:::-;15424:63;;15379:118;15564:2;15553:9;15549:18;15536:32;15595:18;15587:6;15584:30;15581:117;;;15617:79;;:::i;:::-;15581:117;15722:62;15776:7;15767:6;15756:9;15752:22;15722:62;:::i;:::-;15712:72;;15507:287;14858:943;;;;;;;:::o;15807:474::-;15875:6;15883;15932:2;15920:9;15911:7;15907:23;15903:32;15900:119;;;15938:79;;:::i;:::-;15900:119;16058:1;16083:53;16128:7;16119:6;16108:9;16104:22;16083:53;:::i;:::-;16073:63;;16029:117;16185:2;16211:53;16256:7;16247:6;16236:9;16232:22;16211:53;:::i;:::-;16201:63;;16156:118;15807:474;;;;;:::o;16287:311::-;16364:4;16454:18;16446:6;16443:30;16440:56;;;16476:18;;:::i;:::-;16440:56;16526:4;16518:6;16514:17;16506:25;;16586:4;16580;16576:15;16568:23;;16287:311;;;:::o;16604:117::-;16713:1;16710;16703:12;16744:710;16840:5;16865:81;16881:64;16938:6;16881:64;:::i;:::-;16865:81;:::i;:::-;16856:90;;16966:5;16995:6;16988:5;16981:21;17029:4;17022:5;17018:16;17011:23;;17082:4;17074:6;17070:17;17062:6;17058:30;17111:3;17103:6;17100:15;17097:122;;;17130:79;;:::i;:::-;17097:122;17245:6;17228:220;17262:6;17257:3;17254:15;17228:220;;;17337:3;17366:37;17399:3;17387:10;17366:37;:::i;:::-;17361:3;17354:50;17433:4;17428:3;17424:14;17417:21;;17304:144;17288:4;17283:3;17279:14;17272:21;;17228:220;;;17232:21;16846:608;;16744:710;;;;;:::o;17477:370::-;17548:5;17597:3;17590:4;17582:6;17578:17;17574:27;17564:122;;17605:79;;:::i;:::-;17564:122;17722:6;17709:20;17747:94;17837:3;17829:6;17822:4;17814:6;17810:17;17747:94;:::i;:::-;17738:103;;17554:293;17477:370;;;;:::o;17853:311::-;17930:4;18020:18;18012:6;18009:30;18006:56;;;18042:18;;:::i;:::-;18006:56;18092:4;18084:6;18080:17;18072:25;;18152:4;18146;18142:15;18134:23;;17853:311;;;:::o;18187:710::-;18283:5;18308:81;18324:64;18381:6;18324:64;:::i;:::-;18308:81;:::i;:::-;18299:90;;18409:5;18438:6;18431:5;18424:21;18472:4;18465:5;18461:16;18454:23;;18525:4;18517:6;18513:17;18505:6;18501:30;18554:3;18546:6;18543:15;18540:122;;;18573:79;;:::i;:::-;18540:122;18688:6;18671:220;18705:6;18700:3;18697:15;18671:220;;;18780:3;18809:37;18842:3;18830:10;18809:37;:::i;:::-;18804:3;18797:50;18876:4;18871:3;18867:14;18860:21;;18747:144;18731:4;18726:3;18722:14;18715:21;;18671:220;;;18675:21;18289:608;;18187:710;;;;;:::o;18920:370::-;18991:5;19040:3;19033:4;19025:6;19021:17;19017:27;19007:122;;19048:79;;:::i;:::-;19007:122;19165:6;19152:20;19190:94;19280:3;19272:6;19265:4;19257:6;19253:17;19190:94;:::i;:::-;19181:103;;18997:293;18920:370;;;;:::o;19296:894::-;19414:6;19422;19471:2;19459:9;19450:7;19446:23;19442:32;19439:119;;;19477:79;;:::i;:::-;19439:119;19625:1;19614:9;19610:17;19597:31;19655:18;19647:6;19644:30;19641:117;;;19677:79;;:::i;:::-;19641:117;19782:78;19852:7;19843:6;19832:9;19828:22;19782:78;:::i;:::-;19772:88;;19568:302;19937:2;19926:9;19922:18;19909:32;19968:18;19960:6;19957:30;19954:117;;;19990:79;;:::i;:::-;19954:117;20095:78;20165:7;20156:6;20145:9;20141:22;20095:78;:::i;:::-;20085:88;;19880:303;19296:894;;;;;:::o;20196:180::-;20244:77;20241:1;20234:88;20341:4;20338:1;20331:15;20365:4;20362:1;20355:15;20382:320;20426:6;20463:1;20457:4;20453:12;20443:22;;20510:1;20504:4;20500:12;20531:18;20521:81;;20587:4;20579:6;20575:17;20565:27;;20521:81;20649:2;20641:6;20638:14;20618:18;20615:38;20612:84;;20668:18;;:::i;:::-;20612:84;20433:269;20382:320;;;:::o;20708:220::-;20848:34;20844:1;20836:6;20832:14;20825:58;20917:3;20912:2;20904:6;20900:15;20893:28;20708:220;:::o;20934:366::-;21076:3;21097:67;21161:2;21156:3;21097:67;:::i;:::-;21090:74;;21173:93;21262:3;21173:93;:::i;:::-;21291:2;21286:3;21282:12;21275:19;;20934:366;;;:::o;21306:419::-;21472:4;21510:2;21499:9;21495:18;21487:26;;21559:9;21553:4;21549:20;21545:1;21534:9;21530:17;21523:47;21587:131;21713:4;21587:131;:::i;:::-;21579:139;;21306:419;;;:::o;21731:248::-;21871:34;21867:1;21859:6;21855:14;21848:58;21940:31;21935:2;21927:6;21923:15;21916:56;21731:248;:::o;21985:366::-;22127:3;22148:67;22212:2;22207:3;22148:67;:::i;:::-;22141:74;;22224:93;22313:3;22224:93;:::i;:::-;22342:2;22337:3;22333:12;22326:19;;21985:366;;;:::o;22357:419::-;22523:4;22561:2;22550:9;22546:18;22538:26;;22610:9;22604:4;22600:20;22596:1;22585:9;22581:17;22574:47;22638:131;22764:4;22638:131;:::i;:::-;22630:139;;22357:419;;;:::o;22782:172::-;22922:24;22918:1;22910:6;22906:14;22899:48;22782:172;:::o;22960:366::-;23102:3;23123:67;23187:2;23182:3;23123:67;:::i;:::-;23116:74;;23199:93;23288:3;23199:93;:::i;:::-;23317:2;23312:3;23308:12;23301:19;;22960:366;;;:::o;23332:419::-;23498:4;23536:2;23525:9;23521:18;23513:26;;23585:9;23579:4;23575:20;23571:1;23560:9;23556:17;23549:47;23613:131;23739:4;23613:131;:::i;:::-;23605:139;;23332:419;;;:::o;23757:141::-;23806:4;23829:3;23821:11;;23852:3;23849:1;23842:14;23886:4;23883:1;23873:18;23865:26;;23757:141;;;:::o;23904:93::-;23941:6;23988:2;23983;23976:5;23972:14;23968:23;23958:33;;23904:93;;;:::o;24003:107::-;24047:8;24097:5;24091:4;24087:16;24066:37;;24003:107;;;;:::o;24116:393::-;24185:6;24235:1;24223:10;24219:18;24258:97;24288:66;24277:9;24258:97;:::i;:::-;24376:39;24406:8;24395:9;24376:39;:::i;:::-;24364:51;;24448:4;24444:9;24437:5;24433:21;24424:30;;24497:4;24487:8;24483:19;24476:5;24473:30;24463:40;;24192:317;;24116:393;;;;;:::o;24515:60::-;24543:3;24564:5;24557:12;;24515:60;;;:::o;24581:142::-;24631:9;24664:53;24682:34;24691:24;24709:5;24691:24;:::i;:::-;24682:34;:::i;:::-;24664:53;:::i;:::-;24651:66;;24581:142;;;:::o;24729:75::-;24772:3;24793:5;24786:12;;24729:75;;;:::o;24810:269::-;24920:39;24951:7;24920:39;:::i;:::-;24981:91;25030:41;25054:16;25030:41;:::i;:::-;25022:6;25015:4;25009:11;24981:91;:::i;:::-;24975:4;24968:105;24886:193;24810:269;;;:::o;25085:73::-;25130:3;25085:73;:::o;25164:189::-;25241:32;;:::i;:::-;25282:65;25340:6;25332;25326:4;25282:65;:::i;:::-;25217:136;25164:189;;:::o;25359:186::-;25419:120;25436:3;25429:5;25426:14;25419:120;;;25490:39;25527:1;25520:5;25490:39;:::i;:::-;25463:1;25456:5;25452:13;25443:22;;25419:120;;;25359:186;;:::o;25551:543::-;25652:2;25647:3;25644:11;25641:446;;;25686:38;25718:5;25686:38;:::i;:::-;25770:29;25788:10;25770:29;:::i;:::-;25760:8;25756:44;25953:2;25941:10;25938:18;25935:49;;;25974:8;25959:23;;25935:49;25997:80;26053:22;26071:3;26053:22;:::i;:::-;26043:8;26039:37;26026:11;25997:80;:::i;:::-;25656:431;;25641:446;25551:543;;;:::o;26100:117::-;26154:8;26204:5;26198:4;26194:16;26173:37;;26100:117;;;;:::o;26223:169::-;26267:6;26300:51;26348:1;26344:6;26336:5;26333:1;26329:13;26300:51;:::i;:::-;26296:56;26381:4;26375;26371:15;26361:25;;26274:118;26223:169;;;;:::o;26397:295::-;26473:4;26619:29;26644:3;26638:4;26619:29;:::i;:::-;26611:37;;26681:3;26678:1;26674:11;26668:4;26665:21;26657:29;;26397:295;;;;:::o;26697:1395::-;26814:37;26847:3;26814:37;:::i;:::-;26916:18;26908:6;26905:30;26902:56;;;26938:18;;:::i;:::-;26902:56;26982:38;27014:4;27008:11;26982:38;:::i;:::-;27067:67;27127:6;27119;27113:4;27067:67;:::i;:::-;27161:1;27185:4;27172:17;;27217:2;27209:6;27206:14;27234:1;27229:618;;;;27891:1;27908:6;27905:77;;;27957:9;27952:3;27948:19;27942:26;27933:35;;27905:77;28008:67;28068:6;28061:5;28008:67;:::i;:::-;28002:4;27995:81;27864:222;27199:887;;27229:618;27281:4;27277:9;27269:6;27265:22;27315:37;27347:4;27315:37;:::i;:::-;27374:1;27388:208;27402:7;27399:1;27396:14;27388:208;;;27481:9;27476:3;27472:19;27466:26;27458:6;27451:42;27532:1;27524:6;27520:14;27510:24;;27579:2;27568:9;27564:18;27551:31;;27425:4;27422:1;27418:12;27413:17;;27388:208;;;27624:6;27615:7;27612:19;27609:179;;;27682:9;27677:3;27673:19;27667:26;27725:48;27767:4;27759:6;27755:17;27744:9;27725:48;:::i;:::-;27717:6;27710:64;27632:156;27609:179;27834:1;27830;27822:6;27818:14;27814:22;27808:4;27801:36;27236:611;;;27199:887;;26789:1303;;;26697:1395;;:::o;28098:232::-;28238:34;28234:1;28226:6;28222:14;28215:58;28307:15;28302:2;28294:6;28290:15;28283:40;28098:232;:::o;28336:366::-;28478:3;28499:67;28563:2;28558:3;28499:67;:::i;:::-;28492:74;;28575:93;28664:3;28575:93;:::i;:::-;28693:2;28688:3;28684:12;28677:19;;28336:366;;;:::o;28708:419::-;28874:4;28912:2;28901:9;28897:18;28889:26;;28961:9;28955:4;28951:20;28947:1;28936:9;28932:17;28925:47;28989:131;29115:4;28989:131;:::i;:::-;28981:139;;28708:419;;;:::o;29133:230::-;29273:34;29269:1;29261:6;29257:14;29250:58;29342:13;29337:2;29329:6;29325:15;29318:38;29133:230;:::o;29369:366::-;29511:3;29532:67;29596:2;29591:3;29532:67;:::i;:::-;29525:74;;29608:93;29697:3;29608:93;:::i;:::-;29726:2;29721:3;29717:12;29710:19;;29369:366;;;:::o;29741:419::-;29907:4;29945:2;29934:9;29930:18;29922:26;;29994:9;29988:4;29984:20;29980:1;29969:9;29965:17;29958:47;30022:131;30148:4;30022:131;:::i;:::-;30014:139;;29741:419;;;:::o;30166:234::-;30306:34;30302:1;30294:6;30290:14;30283:58;30375:17;30370:2;30362:6;30358:15;30351:42;30166:234;:::o;30406:366::-;30548:3;30569:67;30633:2;30628:3;30569:67;:::i;:::-;30562:74;;30645:93;30734:3;30645:93;:::i;:::-;30763:2;30758:3;30754:12;30747:19;;30406:366;;;:::o;30778:419::-;30944:4;30982:2;30971:9;30967:18;30959:26;;31031:9;31025:4;31021:20;31017:1;31006:9;31002:17;30995:47;31059:131;31185:4;31059:131;:::i;:::-;31051:139;;30778:419;;;:::o;31203:180::-;31251:77;31248:1;31241:88;31348:4;31345:1;31338:15;31372:4;31369:1;31362:15;31389:180;31437:77;31434:1;31427:88;31534:4;31531:1;31524:15;31558:4;31555:1;31548:15;31575:233;31614:3;31637:24;31655:5;31637:24;:::i;:::-;31628:33;;31683:66;31676:5;31673:77;31670:103;;31753:18;;:::i;:::-;31670:103;31800:1;31793:5;31789:13;31782:20;;31575:233;;;:::o;31814:231::-;31954:34;31950:1;31942:6;31938:14;31931:58;32023:14;32018:2;32010:6;32006:15;31999:39;31814:231;:::o;32051:366::-;32193:3;32214:67;32278:2;32273:3;32214:67;:::i;:::-;32207:74;;32290:93;32379:3;32290:93;:::i;:::-;32408:2;32403:3;32399:12;32392:19;;32051:366;;;:::o;32423:419::-;32589:4;32627:2;32616:9;32612:18;32604:26;;32676:9;32670:4;32666:20;32662:1;32651:9;32647:17;32640:47;32704:131;32830:4;32704:131;:::i;:::-;32696:139;;32423:419;;;:::o;32848:174::-;32988:26;32984:1;32976:6;32972:14;32965:50;32848:174;:::o;33028:366::-;33170:3;33191:67;33255:2;33250:3;33191:67;:::i;:::-;33184:74;;33267:93;33356:3;33267:93;:::i;:::-;33385:2;33380:3;33376:12;33369:19;;33028:366;;;:::o;33400:419::-;33566:4;33604:2;33593:9;33589:18;33581:26;;33653:9;33647:4;33643:20;33639:1;33628:9;33624:17;33617:47;33681:131;33807:4;33681:131;:::i;:::-;33673:139;;33400:419;;;:::o;33825:228::-;33965:34;33961:1;33953:6;33949:14;33942:58;34034:11;34029:2;34021:6;34017:15;34010:36;33825:228;:::o;34059:366::-;34201:3;34222:67;34286:2;34281:3;34222:67;:::i;:::-;34215:74;;34298:93;34387:3;34298:93;:::i;:::-;34416:2;34411:3;34407:12;34400:19;;34059:366;;;:::o;34431:419::-;34597:4;34635:2;34624:9;34620:18;34612:26;;34684:9;34678:4;34674:20;34670:1;34659:9;34655:17;34648:47;34712:131;34838:4;34712:131;:::i;:::-;34704:139;;34431:419;;;:::o;34856:234::-;34996:34;34992:1;34984:6;34980:14;34973:58;35065:17;35060:2;35052:6;35048:15;35041:42;34856:234;:::o;35096:366::-;35238:3;35259:67;35323:2;35318:3;35259:67;:::i;:::-;35252:74;;35335:93;35424:3;35335:93;:::i;:::-;35453:2;35448:3;35444:12;35437:19;;35096:366;;;:::o;35468:419::-;35634:4;35672:2;35661:9;35657:18;35649:26;;35721:9;35715:4;35711:20;35707:1;35696:9;35692:17;35685:47;35749:131;35875:4;35749:131;:::i;:::-;35741:139;;35468:419;;;:::o;35893:148::-;35995:11;36032:3;36017:18;;35893:148;;;;:::o;36047:390::-;36153:3;36181:39;36214:5;36181:39;:::i;:::-;36236:89;36318:6;36313:3;36236:89;:::i;:::-;36229:96;;36334:65;36392:6;36387:3;36380:4;36373:5;36369:16;36334:65;:::i;:::-;36424:6;36419:3;36415:16;36408:23;;36157:280;36047:390;;;;:::o;36443:151::-;36583:3;36579:1;36571:6;36567:14;36560:27;36443:151;:::o;36600:400::-;36760:3;36781:84;36863:1;36858:3;36781:84;:::i;:::-;36774:91;;36874:93;36963:3;36874:93;:::i;:::-;36992:1;36987:3;36983:11;36976:18;;36600:400;;;:::o;37006:701::-;37287:3;37309:95;37400:3;37391:6;37309:95;:::i;:::-;37302:102;;37421:148;37565:3;37421:148;:::i;:::-;37414:155;;37586:95;37677:3;37668:6;37586:95;:::i;:::-;37579:102;;37698:3;37691:10;;37006:701;;;;;:::o;37713:170::-;37853:22;37849:1;37841:6;37837:14;37830:46;37713:170;:::o;37889:366::-;38031:3;38052:67;38116:2;38111:3;38052:67;:::i;:::-;38045:74;;38128:93;38217:3;38128:93;:::i;:::-;38246:2;38241:3;38237:12;38230:19;;37889:366;;;:::o;38261:419::-;38427:4;38465:2;38454:9;38450:18;38442:26;;38514:9;38508:4;38504:20;38500:1;38489:9;38485:17;38478:47;38542:131;38668:4;38542:131;:::i;:::-;38534:139;;38261:419;;;:::o;38686:172::-;38826:24;38822:1;38814:6;38810:14;38803:48;38686:172;:::o;38864:366::-;39006:3;39027:67;39091:2;39086:3;39027:67;:::i;:::-;39020:74;;39103:93;39192:3;39103:93;:::i;:::-;39221:2;39216:3;39212:12;39205:19;;38864:366;;;:::o;39236:419::-;39402:4;39440:2;39429:9;39425:18;39417:26;;39489:9;39483:4;39479:20;39475:1;39464:9;39460:17;39453:47;39517:131;39643:4;39517:131;:::i;:::-;39509:139;;39236:419;;;:::o;39661:191::-;39701:3;39720:20;39738:1;39720:20;:::i;:::-;39715:25;;39754:20;39772:1;39754:20;:::i;:::-;39749:25;;39797:1;39794;39790:9;39783:16;;39818:3;39815:1;39812:10;39809:36;;;39825:18;;:::i;:::-;39809:36;39661:191;;;;:::o;39858:194::-;39898:4;39918:20;39936:1;39918:20;:::i;:::-;39913:25;;39952:20;39970:1;39952:20;:::i;:::-;39947:25;;39996:1;39993;39989:9;39981:17;;40020:1;40014:4;40011:11;40008:37;;;40025:18;;:::i;:::-;40008:37;39858:194;;;;:::o;40058:224::-;40198:34;40194:1;40186:6;40182:14;40175:58;40267:7;40262:2;40254:6;40250:15;40243:32;40058:224;:::o;40288:366::-;40430:3;40451:67;40515:2;40510:3;40451:67;:::i;:::-;40444:74;;40527:93;40616:3;40527:93;:::i;:::-;40645:2;40640:3;40636:12;40629:19;;40288:366;;;:::o;40660:419::-;40826:4;40864:2;40853:9;40849:18;40841:26;;40913:9;40907:4;40903:20;40899:1;40888:9;40884:17;40877:47;40941:131;41067:4;40941:131;:::i;:::-;40933:139;;40660:419;;;:::o;41085:223::-;41225:34;41221:1;41213:6;41209:14;41202:58;41294:6;41289:2;41281:6;41277:15;41270:31;41085:223;:::o;41314:366::-;41456:3;41477:67;41541:2;41536:3;41477:67;:::i;:::-;41470:74;;41553:93;41642:3;41553:93;:::i;:::-;41671:2;41666:3;41662:12;41655:19;;41314:366;;;:::o;41686:419::-;41852:4;41890:2;41879:9;41875:18;41867:26;;41939:9;41933:4;41929:20;41925:1;41914:9;41910:17;41903:47;41967:131;42093:4;41967:131;:::i;:::-;41959:139;;41686:419;;;:::o;42111:175::-;42251:27;42247:1;42239:6;42235:14;42228:51;42111:175;:::o;42292:366::-;42434:3;42455:67;42519:2;42514:3;42455:67;:::i;:::-;42448:74;;42531:93;42620:3;42531:93;:::i;:::-;42649:2;42644:3;42640:12;42633:19;;42292:366;;;:::o;42664:419::-;42830:4;42868:2;42857:9;42853:18;42845:26;;42917:9;42911:4;42907:20;42903:1;42892:9;42888:17;42881:47;42945:131;43071:4;42945:131;:::i;:::-;42937:139;;42664:419;;;:::o;43089:237::-;43229:34;43225:1;43217:6;43213:14;43206:58;43298:20;43293:2;43285:6;43281:15;43274:45;43089:237;:::o;43332:366::-;43474:3;43495:67;43559:2;43554:3;43495:67;:::i;:::-;43488:74;;43571:93;43660:3;43571:93;:::i;:::-;43689:2;43684:3;43680:12;43673:19;;43332:366;;;:::o;43704:419::-;43870:4;43908:2;43897:9;43893:18;43885:26;;43957:9;43951:4;43947:20;43943:1;43932:9;43928:17;43921:47;43985:131;44111:4;43985:131;:::i;:::-;43977:139;;43704:419;;;:::o;44129:173::-;44269:25;44265:1;44257:6;44253:14;44246:49;44129:173;:::o;44308:402::-;44468:3;44489:85;44571:2;44566:3;44489:85;:::i;:::-;44482:92;;44583:93;44672:3;44583:93;:::i;:::-;44701:2;44696:3;44692:12;44685:19;;44308:402;;;:::o;44716:167::-;44856:19;44852:1;44844:6;44840:14;44833:43;44716:167;:::o;44889:402::-;45049:3;45070:85;45152:2;45147:3;45070:85;:::i;:::-;45063:92;;45164:93;45253:3;45164:93;:::i;:::-;45282:2;45277:3;45273:12;45266:19;;44889:402;;;:::o;45297:967::-;45679:3;45701:148;45845:3;45701:148;:::i;:::-;45694:155;;45866:95;45957:3;45948:6;45866:95;:::i;:::-;45859:102;;45978:148;46122:3;45978:148;:::i;:::-;45971:155;;46143:95;46234:3;46225:6;46143:95;:::i;:::-;46136:102;;46255:3;46248:10;;45297:967;;;;;:::o;46270:170::-;46410:22;46406:1;46398:6;46394:14;46387:46;46270:170;:::o;46446:366::-;46588:3;46609:67;46673:2;46668:3;46609:67;:::i;:::-;46602:74;;46685:93;46774:3;46685:93;:::i;:::-;46803:2;46798:3;46794:12;46787:19;;46446:366;;;:::o;46818:419::-;46984:4;47022:2;47011:9;47007:18;46999:26;;47071:9;47065:4;47061:20;47057:1;47046:9;47042:17;47035:47;47099:131;47225:4;47099:131;:::i;:::-;47091:139;;46818:419;;;:::o;47243:166::-;47383:18;47379:1;47371:6;47367:14;47360:42;47243:166;:::o;47415:366::-;47557:3;47578:67;47642:2;47637:3;47578:67;:::i;:::-;47571:74;;47654:93;47743:3;47654:93;:::i;:::-;47772:2;47767:3;47763:12;47756:19;;47415:366;;;:::o;47787:419::-;47953:4;47991:2;47980:9;47976:18;47968:26;;48040:9;48034:4;48030:20;48026:1;48015:9;48011:17;48004:47;48068:131;48194:4;48068:131;:::i;:::-;48060:139;;47787:419;;;:::o;48212:98::-;48263:6;48297:5;48291:12;48281:22;;48212:98;;;:::o;48316:168::-;48399:11;48433:6;48428:3;48421:19;48473:4;48468:3;48464:14;48449:29;;48316:168;;;;:::o;48490:373::-;48576:3;48604:38;48636:5;48604:38;:::i;:::-;48658:70;48721:6;48716:3;48658:70;:::i;:::-;48651:77;;48737:65;48795:6;48790:3;48783:4;48776:5;48772:16;48737:65;:::i;:::-;48827:29;48849:6;48827:29;:::i;:::-;48822:3;48818:39;48811:46;;48580:283;48490:373;;;;:::o;48869:640::-;49064:4;49102:3;49091:9;49087:19;49079:27;;49116:71;49184:1;49173:9;49169:17;49160:6;49116:71;:::i;:::-;49197:72;49265:2;49254:9;49250:18;49241:6;49197:72;:::i;:::-;49279;49347:2;49336:9;49332:18;49323:6;49279:72;:::i;:::-;49398:9;49392:4;49388:20;49383:2;49372:9;49368:18;49361:48;49426:76;49497:4;49488:6;49426:76;:::i;:::-;49418:84;;48869:640;;;;;;;:::o;49515:141::-;49571:5;49602:6;49596:13;49587:22;;49618:32;49644:5;49618:32;:::i;:::-;49515:141;;;;:::o;49662:349::-;49731:6;49780:2;49768:9;49759:7;49755:23;49751:32;49748:119;;;49786:79;;:::i;:::-;49748:119;49906:1;49931:63;49986:7;49977:6;49966:9;49962:22;49931:63;:::i;:::-;49921:73;;49877:127;49662:349;;;;:::o;50017:240::-;50157:34;50153:1;50145:6;50141:14;50134:58;50226:23;50221:2;50213:6;50209:15;50202:48;50017:240;:::o;50263:366::-;50405:3;50426:67;50490:2;50485:3;50426:67;:::i;:::-;50419:74;;50502:93;50591:3;50502:93;:::i;:::-;50620:2;50615:3;50611:12;50604:19;;50263:366;;;:::o;50635:419::-;50801:4;50839:2;50828:9;50824:18;50816:26;;50888:9;50882:4;50878:20;50874:1;50863:9;50859:17;50852:47;50916:131;51042:4;50916:131;:::i;:::-;50908:139;;50635:419;;;:::o;51060:410::-;51100:7;51123:20;51141:1;51123:20;:::i;:::-;51118:25;;51157:20;51175:1;51157:20;:::i;:::-;51152:25;;51212:1;51209;51205:9;51234:30;51252:11;51234:30;:::i;:::-;51223:41;;51413:1;51404:7;51400:15;51397:1;51394:22;51374:1;51367:9;51347:83;51324:139;;51443:18;;:::i;:::-;51324:139;51108:362;51060:410;;;;:::o;51476:171::-;51515:3;51538:24;51556:5;51538:24;:::i;:::-;51529:33;;51584:4;51577:5;51574:15;51571:41;;51592:18;;:::i;:::-;51571:41;51639:1;51632:5;51628:13;51621:20;;51476:171;;;:::o;51653:182::-;51793:34;51789:1;51781:6;51777:14;51770:58;51653:182;:::o;51841:366::-;51983:3;52004:67;52068:2;52063:3;52004:67;:::i;:::-;51997:74;;52080:93;52169:3;52080:93;:::i;:::-;52198:2;52193:3;52189:12;52182:19;;51841:366;;;:::o;52213:419::-;52379:4;52417:2;52406:9;52402:18;52394:26;;52466:9;52460:4;52456:20;52452:1;52441:9;52437:17;52430:47;52494:131;52620:4;52494:131;:::i;:::-;52486:139;;52213:419;;;:::o;52638:182::-;52778:34;52774:1;52766:6;52762:14;52755:58;52638:182;:::o;52826:366::-;52968:3;52989:67;53053:2;53048:3;52989:67;:::i;:::-;52982:74;;53065:93;53154:3;53065:93;:::i;:::-;53183:2;53178:3;53174:12;53167:19;;52826:366;;;:::o;53198:419::-;53364:4;53402:2;53391:9;53387:18;53379:26;;53451:9;53445:4;53441:20;53437:1;53426:9;53422:17;53415:47;53479:131;53605:4;53479:131;:::i;:::-;53471:139;;53198:419;;;:::o;53623:178::-;53763:30;53759:1;53751:6;53747:14;53740:54;53623:178;:::o;53807:366::-;53949:3;53970:67;54034:2;54029:3;53970:67;:::i;:::-;53963:74;;54046:93;54135:3;54046:93;:::i;:::-;54164:2;54159:3;54155:12;54148:19;;53807:366;;;:::o;54179:419::-;54345:4;54383:2;54372:9;54368:18;54360:26;;54432:9;54426:4;54422:20;54418:1;54407:9;54403:17;54396:47;54460:131;54586:4;54460:131;:::i;:::-;54452:139;;54179:419;;;:::o;54604:180::-;54652:77;54649:1;54642:88;54749:4;54746:1;54739:15;54773:4;54770:1;54763:15
Swarm Source
ipfs://2b09216547e26e4899be33a9c4d0dd366d40d64d0a9a49c08e3cbb47347ac4dc
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.