Polygon Sponsored slots available. Book your slot here!
Overview
TokenID
61
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
HunnysClosetShop
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2023-12-13 */ // Sources flattened with hardhat v2.19.2 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @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-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // 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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // 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 IERC165Upgradeable { /** * @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-upgradeable/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // 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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File @openzeppelin/contracts-upgradeable/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMathUpgradeable { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { 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 = MathUpgradeable.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMathUpgradeable.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, MathUpgradeable.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File @openzeppelin/contracts-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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: * * ```solidity * 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}: * * ```solidity * 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. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal onlyInitializing { } function __AccessControl_init_unchained() internal onlyInitializing { } 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(IAccessControlUpgradeable).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 ", StringsUpgradeable.toHexString(account), " is missing role ", StringsUpgradeable.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()); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol) pragma solidity ^0.8.0; /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. * * _Available since v4.8.3._ */ interface IERC1967Upgradeable { /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); } // File @openzeppelin/contracts-upgradeable/proxy/beacon/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } } // File @openzeppelin/contracts-upgradeable/proxy/ERC1967/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ */ abstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeTo(address newImplementation) public virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC1155/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] calldata accounts, uint256[] calldata ids ) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File @openzeppelin/contracts-upgradeable/token/ERC1155/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURIUpgradeable is IERC1155Upgradeable { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File @openzeppelin/contracts-upgradeable/token/ERC1155/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File contracts/HunnysClosetShop.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /// @title HunnysClosetShop /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract HunnysClosetShop is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable, AccessControlUpgradeable, UUPSUpgradeable, OwnableUpgradeable { using AddressUpgradeable for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ // Define a new role identifier for the minter role bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); // The public initializer function that replaces the constructor function initialize(string memory uri_) public initializer { __ERC1155_init(uri_); __Ownable_init(); // Initialize the Ownable contract } // Override the _authorizeUpgrade function to include owner access control function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} // Internal initializer function that calls all unchained initializers function __ERC1155_init(string memory uri_) internal onlyInitializing { __Context_init_unchained(); __ERC165_init_unchained(); __AccessControl_init_unchained(); __ERC1155_init_unchained(uri_); // Grant the default admin role to the message sender _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); // Setup other roles as necessary _setupRole(MINTER_ROLE, _msgSender()); } function __ERC1155_init_unchained(string memory uri_) internal onlyInitializing { _setURI(uri_); } // Using DEFAULT_ADMIN_ROLE for URI updating function setURI(string memory newuri) public onlyRole(DEFAULT_ADMIN_ROLE) { _setURI(newuri); emit URIUpdated(newuri); } // New state variables for contract-level metadata string private _contractURI; string private _name; string private _symbol; // Function to set contract URI (only accessible by DEFAULT_ADMIN_ROLE) function setContractURI(string memory newContractURI) public onlyRole(DEFAULT_ADMIN_ROLE) { _contractURI = newContractURI; } // Function to set token name (only accessible by DEFAULT_ADMIN_ROLE) function setName(string memory newName) public onlyRole(DEFAULT_ADMIN_ROLE) { _name = newName; } // Function to set token symbol (only accessible by DEFAULT_ADMIN_ROLE) function setSymbol(string memory newSymbol) public onlyRole(DEFAULT_ADMIN_ROLE) { _symbol = newSymbol; } // Function to get contract URI function contractURI() public view returns (string memory) { return _contractURI; } // Function to get token name function name() public view returns (string memory) { return _name; } // Function to get token symbol function symbol() public view returns (string memory) { return _symbol; } event URIUpdated(string newuri); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable, AccessControlUpgradeable) returns (bool) { return interfaceId == type(IERC1155Upgradeable).interfaceId || interfaceId == type(IERC1155MetadataURIUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] memory accounts, uint256[] memory ids ) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ // Example of a function that requires the minter role function mint(address to, uint256 id, uint256 amount, bytes memory data) public virtual onlyRole(MINTER_ROLE) { _mint(to, id, amount, data); } function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn(address from, uint256 id, uint256 amount) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch(address from, uint256[] memory ids, uint256[] memory amounts) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @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, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155ReceiverUpgradeable.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155ReceiverUpgradeable.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[47] private __gap; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newuri","type":"string"}],"name":"URIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"string","name":"uri_","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newName","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newSymbol","type":"string"}],"name":"setSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801561004357600080fd5b5060805161532561007b60003960008181610ba601528181610c3401528181610e4701528181610ed50152610f8501526153256000f3fe6080604052600436106101cc5760003560e01c80638da5cb5b116100f7578063c47f002711610095578063e985e9c511610064578063e985e9c514610662578063f242432a1461069f578063f2fde38b146106c8578063f62d1888146106f1576101cc565b8063c47f0027146105ba578063d5391393146105e3578063d547741f1461060e578063e8a3d48514610637576101cc565b806395d89b41116100d157806395d89b4114610512578063a217fddf1461053d578063a22cb46514610568578063b84c824614610591576101cc565b80638da5cb5b1461048157806391d14854146104ac578063938e3d7b146104e9576101cc565b80632f2ff15d1161016f5780634f1ef2861161013e5780634f1ef286146103fa57806352d1902d14610416578063715018a614610441578063731133e914610458576101cc565b80632f2ff15d1461034257806336568abe1461036b5780633659cfe6146103945780634e1273f4146103bd576101cc565b806306fdde03116101ab57806306fdde03146102745780630e89341c1461029f578063248a9ca3146102dc5780632eb2c2d614610319576101cc565b8062fdd58e146101d157806301ffc9a71461020e57806302fe53051461024b575b600080fd5b3480156101dd57600080fd5b506101f860048036038101906101f39190613260565b61071a565b60405161020591906132af565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190613322565b6107e4565b604051610242919061336a565b60405180910390f35b34801561025757600080fd5b50610272600480360381019061026d91906134cb565b6108c6565b005b34801561028057600080fd5b50610289610917565b6040516102969190613593565b60405180910390f35b3480156102ab57600080fd5b506102c660048036038101906102c191906135b5565b6109aa565b6040516102d39190613593565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613618565b610a3f565b6040516103109190613654565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b91906137d8565b610a5f565b005b34801561034e57600080fd5b50610369600480360381019061036491906138a7565b610b00565b005b34801561037757600080fd5b50610392600480360381019061038d91906138a7565b610b21565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906138e7565b610ba4565b005b3480156103c957600080fd5b506103e460048036038101906103df91906139d7565b610d2c565b6040516103f19190613b0d565b60405180910390f35b610414600480360381019061040f9190613b2f565b610e45565b005b34801561042257600080fd5b5061042b610f81565b6040516104389190613654565b60405180910390f35b34801561044d57600080fd5b5061045661103a565b005b34801561046457600080fd5b5061047f600480360381019061047a9190613b8b565b61104e565b005b34801561048d57600080fd5b5061049661108b565b6040516104a39190613c1d565b60405180910390f35b3480156104b857600080fd5b506104d360048036038101906104ce91906138a7565b6110b5565b6040516104e0919061336a565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b91906134cb565b611120565b005b34801561051e57600080fd5b50610527611142565b6040516105349190613593565b60405180910390f35b34801561054957600080fd5b506105526111d5565b60405161055f9190613654565b60405180910390f35b34801561057457600080fd5b5061058f600480360381019061058a9190613c64565b6111dc565b005b34801561059d57600080fd5b506105b860048036038101906105b391906134cb565b6111f2565b005b3480156105c657600080fd5b506105e160048036038101906105dc91906134cb565b611214565b005b3480156105ef57600080fd5b506105f8611236565b6040516106059190613654565b60405180910390f35b34801561061a57600080fd5b50610635600480360381019061063091906138a7565b61125a565b005b34801561064357600080fd5b5061064c61127b565b6040516106599190613593565b60405180910390f35b34801561066e57600080fd5b5061068960048036038101906106849190613ca4565b61130e565b604051610696919061336a565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c19190613ce4565b6113a3565b005b3480156106d457600080fd5b506106ef60048036038101906106ea91906138e7565b611444565b005b3480156106fd57600080fd5b50610718600480360381019061071391906134cb565b6114c7565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361078a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078190613ded565b60405180910390fd5b61012d600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108af57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108bf57506108be8261160f565b5b9050919050565b6000801b6108d381611689565b6108dc8261169d565b7fe3afa94108b5f5e82e5f6e539d161ff4b5402a85f696c67b9768ec3ae54ce3668260405161090b9190613593565b60405180910390a15050565b6060610131805461092790613e3c565b80601f016020809104026020016040519081016040528092919081815260200182805461095390613e3c565b80156109a05780601f10610975576101008083540402835291602001916109a0565b820191906000526020600020905b81548152906001019060200180831161098357829003601f168201915b5050505050905090565b606061012f80546109ba90613e3c565b80601f01602080910402602001604051908101604052809291908181526020018280546109e690613e3c565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b50505050509050919050565b600060656000838152602001908152602001600020600101549050919050565b610a676116b1565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610aad5750610aac85610aa76116b1565b61130e565b5b610aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae390613edf565b60405180910390fd5b610af985858585856116b9565b5050505050565b610b0982610a3f565b610b1281611689565b610b1c83836119e0565b505050565b610b296116b1565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8d90613f71565b60405180910390fd5b610ba08282611ac1565b5050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2990614003565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610c71611ba3565b73ffffffffffffffffffffffffffffffffffffffff1614610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90614095565b60405180910390fd5b610cd081611bfa565b610d2981600067ffffffffffffffff811115610cef57610cee6133a0565b5b6040519080825280601f01601f191660200182016040528015610d215781602001600182028036833780820191505090505b506000611c05565b50565b60608151835114610d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6990614127565b60405180910390fd5b6000835167ffffffffffffffff811115610d8f57610d8e6133a0565b5b604051908082528060200260200182016040528015610dbd5781602001602082028036833780820191505090505b50905060005b8451811015610e3a57610e0a858281518110610de257610de1614147565b5b6020026020010151858381518110610dfd57610dfc614147565b5b602002602001015161071a565b828281518110610e1d57610e1c614147565b5b60200260200101818152505080610e33906141a5565b9050610dc3565b508091505092915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca90614003565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610f12611ba3565b73ffffffffffffffffffffffffffffffffffffffff1614610f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5f90614095565b60405180910390fd5b610f7182611bfa565b610f7d82826001611c05565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110089061425f565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905090565b611042611d73565b61104c6000611df1565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661107881611689565b61108485858585611eb7565b5050505050565b600060fb60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006065600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b61112d81611689565b81610130908161113d919061442b565b505050565b6060610132805461115290613e3c565b80601f016020809104026020016040519081016040528092919081815260200182805461117e90613e3c565b80156111cb5780601f106111a0576101008083540402835291602001916111cb565b820191906000526020600020905b8154815290600101906020018083116111ae57829003601f168201915b5050505050905090565b6000801b81565b6111ee6111e76116b1565b8383612069565b5050565b6000801b6111ff81611689565b81610132908161120f919061442b565b505050565b6000801b61122181611689565b816101319081611231919061442b565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61126382610a3f565b61126c81611689565b6112768383611ac1565b505050565b6060610130805461128b90613e3c565b80601f01602080910402602001604051908101604052809291908181526020018280546112b790613e3c565b80156113045780601f106112d957610100808354040283529160200191611304565b820191906000526020600020905b8154815290600101906020018083116112e757829003601f168201915b5050505050905090565b600061012e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113ab6116b1565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806113f157506113f0856113eb6116b1565b61130e565b5b611430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142790613edf565b60405180910390fd5b61143d85858585856121d6565b5050505050565b61144c611d73565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b29061456f565b60405180910390fd5b6114c481611df1565b50565b60008060019054906101000a900460ff161590508080156114f85750600160008054906101000a900460ff1660ff16105b80611525575061150730612477565b1580156115245750600160008054906101000a900460ff1660ff16145b5b611564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155b90614601565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156115a1576001600060016101000a81548160ff0219169083151502179055505b6115aa8261249a565b6115b2612552565b801561160b5760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516116029190614669565b60405180910390a15b5050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116825750611681826125ab565b5b9050919050565b61169a816116956116b1565b612615565b50565b8061012f90816116ad919061442b565b5050565b600033905090565b81518351146116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f4906146f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361176c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176390614788565b60405180910390fd5b60006117766116b1565b905061178681878787878761269a565b60005b845181101561193d5760008582815181106117a7576117a6614147565b5b6020026020010151905060008583815181106117c6576117c5614147565b5b60200260200101519050600061012d600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611869576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118609061481a565b60405180910390fd5b81810361012d600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508161012d600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611922919061483a565b9250508190555050505080611936906141a5565b9050611789565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119b492919061486e565b60405180910390a46119ca8187878787876126a2565b6119d88187878787876126aa565b505050505050565b6119ea82826110b5565b611abd5760016065600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a626116b1565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611acb82826110b5565b15611b9f5760006065600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b446116b1565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611bd17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b612881565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c02611d73565b50565b611c317f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914360001b61288b565b60000160009054906101000a900460ff1615611c5557611c5083612895565b611d6e565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611cbd57506040513d601f19601f82011682018060405250810190611cba91906148ba565b60015b611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf390614959565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b8114611d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d58906149eb565b60405180910390fd5b50611d6d83838361294e565b5b505050565b611d7b6116b1565b73ffffffffffffffffffffffffffffffffffffffff16611d9961108b565b73ffffffffffffffffffffffffffffffffffffffff1614611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de690614a57565b60405180910390fd5b565b600060fb60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160fb60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1d90614ae9565b60405180910390fd5b6000611f306116b1565b90506000611f3d8561297a565b90506000611f4a8561297a565b9050611f5b8360008985858961269a565b8461012d600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fbc919061483a565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161203a929190614b09565b60405180910390a4612051836000898585896126a2565b612060836000898989896129f4565b50505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ce90614ba4565b60405180910390fd5b8061012e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121c9919061336a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223c90614788565b60405180910390fd5b600061224f6116b1565b9050600061225c8561297a565b905060006122698561297a565b905061227983898985858961269a565b600061012d600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612312576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123099061481a565b60405180910390fd5b85810361012d600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508561012d600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123cb919061483a565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612448929190614b09565b60405180910390a461245e848a8a86868a6126a2565b61246c848a8a8a8a8a6129f4565b505050505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff166124e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e090614c36565b60405180910390fd5b6124f1612bcb565b6124f9612c1c565b612501612c6d565b61250a81612cbe565b61251e6000801b6125196116b1565b612d19565b61254f7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661254a6116b1565b612d19565b50565b600060019054906101000a900460ff166125a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259890614c36565b60405180910390fd5b6125a9612d27565b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61261f82826110b5565b6126965761262c81612d88565b61263a8360001c6020612db5565b60405160200161264b929190614d2a565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268d9190613593565b60405180910390fd5b5050565b505050505050565b505050505050565b6126c98473ffffffffffffffffffffffffffffffffffffffff16612477565b15612879578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161270f959493929190614db9565b6020604051808303816000875af192505050801561274b57506040513d601f19601f820116820180604052508101906127489190614e36565b60015b6127f057612757614e70565b806308c379a0036127b3575061276b614e92565b8061277657506127b5565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127aa9190613593565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e790614f94565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286e90615026565b60405180910390fd5b505b505050505050565b6000819050919050565b6000819050919050565b61289e81612477565b6128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d4906150b8565b60405180910390fd5b8061290a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b612881565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61295783612ff1565b6000825111806129645750805b15612975576129738383613040565b505b505050565b60606000600167ffffffffffffffff811115612999576129986133a0565b5b6040519080825280602002602001820160405280156129c75781602001602082028036833780820191505090505b50905082816000815181106129df576129de614147565b5b60200260200101818152505080915050919050565b612a138473ffffffffffffffffffffffffffffffffffffffff16612477565b15612bc3578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612a599594939291906150d8565b6020604051808303816000875af1925050508015612a9557506040513d601f19601f82011682018060405250810190612a929190614e36565b60015b612b3a57612aa1614e70565b806308c379a003612afd5750612ab5614e92565b80612ac05750612aff565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af49190613593565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3190614f94565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb890615026565b60405180910390fd5b505b505050505050565b600060019054906101000a900460ff16612c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1190614c36565b60405180910390fd5b565b600060019054906101000a900460ff16612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6290614c36565b60405180910390fd5b565b600060019054906101000a900460ff16612cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb390614c36565b60405180910390fd5b565b600060019054906101000a900460ff16612d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0490614c36565b60405180910390fd5b612d168161169d565b50565b612d2382826119e0565b5050565b600060019054906101000a900460ff16612d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6d90614c36565b60405180910390fd5b612d86612d816116b1565b611df1565b565b6060612dae8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612db5565b9050919050565b606060006002836002612dc89190615132565b612dd2919061483a565b67ffffffffffffffff811115612deb57612dea6133a0565b5b6040519080825280601f01601f191660200182016040528015612e1d5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612e5557612e54614147565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612eb957612eb8614147565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612ef99190615132565b612f03919061483a565b90505b6001811115612fa3577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612f4557612f44614147565b5b1a60f81b828281518110612f5c57612f5b614147565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f9c90615174565b9050612f06565b5060008414612fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fde906151e9565b60405180910390fd5b8091505092915050565b612ffa81612895565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b606061306583836040518060600160405280602781526020016152c96027913961306d565b905092915050565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516130979190615245565b600060405180830381855af49150503d80600081146130d2576040519150601f19603f3d011682016040523d82523d6000602084013e6130d7565b606091505b50915091506130e8868383876130f3565b925050509392505050565b6060831561315557600083510361314d5761310d85612477565b61314c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613143906152a8565b60405180910390fd5b5b829050613160565b61315f8383613168565b5b949350505050565b60008251111561317b5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131af9190613593565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131f7826131cc565b9050919050565b613207816131ec565b811461321257600080fd5b50565b600081359050613224816131fe565b92915050565b6000819050919050565b61323d8161322a565b811461324857600080fd5b50565b60008135905061325a81613234565b92915050565b60008060408385031215613277576132766131c2565b5b600061328585828601613215565b92505060206132968582860161324b565b9150509250929050565b6132a98161322a565b82525050565b60006020820190506132c460008301846132a0565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132ff816132ca565b811461330a57600080fd5b50565b60008135905061331c816132f6565b92915050565b600060208284031215613338576133376131c2565b5b60006133468482850161330d565b91505092915050565b60008115159050919050565b6133648161334f565b82525050565b600060208201905061337f600083018461335b565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133d88261338f565b810181811067ffffffffffffffff821117156133f7576133f66133a0565b5b80604052505050565b600061340a6131b8565b905061341682826133cf565b919050565b600067ffffffffffffffff821115613436576134356133a0565b5b61343f8261338f565b9050602081019050919050565b82818337600083830152505050565b600061346e6134698461341b565b613400565b90508281526020810184848401111561348a5761348961338a565b5b61349584828561344c565b509392505050565b600082601f8301126134b2576134b1613385565b5b81356134c284826020860161345b565b91505092915050565b6000602082840312156134e1576134e06131c2565b5b600082013567ffffffffffffffff8111156134ff576134fe6131c7565b5b61350b8482850161349d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561354e578082015181840152602081019050613533565b60008484015250505050565b600061356582613514565b61356f818561351f565b935061357f818560208601613530565b6135888161338f565b840191505092915050565b600060208201905081810360008301526135ad818461355a565b905092915050565b6000602082840312156135cb576135ca6131c2565b5b60006135d98482850161324b565b91505092915050565b6000819050919050565b6135f5816135e2565b811461360057600080fd5b50565b600081359050613612816135ec565b92915050565b60006020828403121561362e5761362d6131c2565b5b600061363c84828501613603565b91505092915050565b61364e816135e2565b82525050565b60006020820190506136696000830184613645565b92915050565b600067ffffffffffffffff82111561368a576136896133a0565b5b602082029050602081019050919050565b600080fd5b60006136b36136ae8461366f565b613400565b905080838252602082019050602084028301858111156136d6576136d561369b565b5b835b818110156136ff57806136eb888261324b565b8452602084019350506020810190506136d8565b5050509392505050565b600082601f83011261371e5761371d613385565b5b813561372e8482602086016136a0565b91505092915050565b600067ffffffffffffffff821115613752576137516133a0565b5b61375b8261338f565b9050602081019050919050565b600061377b61377684613737565b613400565b9050828152602081018484840111156137975761379661338a565b5b6137a284828561344c565b509392505050565b600082601f8301126137bf576137be613385565b5b81356137cf848260208601613768565b91505092915050565b600080600080600060a086880312156137f4576137f36131c2565b5b600061380288828901613215565b955050602061381388828901613215565b945050604086013567ffffffffffffffff811115613834576138336131c7565b5b61384088828901613709565b935050606086013567ffffffffffffffff811115613861576138606131c7565b5b61386d88828901613709565b925050608086013567ffffffffffffffff81111561388e5761388d6131c7565b5b61389a888289016137aa565b9150509295509295909350565b600080604083850312156138be576138bd6131c2565b5b60006138cc85828601613603565b92505060206138dd85828601613215565b9150509250929050565b6000602082840312156138fd576138fc6131c2565b5b600061390b84828501613215565b91505092915050565b600067ffffffffffffffff82111561392f5761392e6133a0565b5b602082029050602081019050919050565b600061395361394e84613914565b613400565b905080838252602082019050602084028301858111156139765761397561369b565b5b835b8181101561399f578061398b8882613215565b845260208401935050602081019050613978565b5050509392505050565b600082601f8301126139be576139bd613385565b5b81356139ce848260208601613940565b91505092915050565b600080604083850312156139ee576139ed6131c2565b5b600083013567ffffffffffffffff811115613a0c57613a0b6131c7565b5b613a18858286016139a9565b925050602083013567ffffffffffffffff811115613a3957613a386131c7565b5b613a4585828601613709565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a848161322a565b82525050565b6000613a968383613a7b565b60208301905092915050565b6000602082019050919050565b6000613aba82613a4f565b613ac48185613a5a565b9350613acf83613a6b565b8060005b83811015613b00578151613ae78882613a8a565b9750613af283613aa2565b925050600181019050613ad3565b5085935050505092915050565b60006020820190508181036000830152613b278184613aaf565b905092915050565b60008060408385031215613b4657613b456131c2565b5b6000613b5485828601613215565b925050602083013567ffffffffffffffff811115613b7557613b746131c7565b5b613b81858286016137aa565b9150509250929050565b60008060008060808587031215613ba557613ba46131c2565b5b6000613bb387828801613215565b9450506020613bc48782880161324b565b9350506040613bd58782880161324b565b925050606085013567ffffffffffffffff811115613bf657613bf56131c7565b5b613c02878288016137aa565b91505092959194509250565b613c17816131ec565b82525050565b6000602082019050613c326000830184613c0e565b92915050565b613c418161334f565b8114613c4c57600080fd5b50565b600081359050613c5e81613c38565b92915050565b60008060408385031215613c7b57613c7a6131c2565b5b6000613c8985828601613215565b9250506020613c9a85828601613c4f565b9150509250929050565b60008060408385031215613cbb57613cba6131c2565b5b6000613cc985828601613215565b9250506020613cda85828601613215565b9150509250929050565b600080600080600060a08688031215613d0057613cff6131c2565b5b6000613d0e88828901613215565b9550506020613d1f88828901613215565b9450506040613d308882890161324b565b9350506060613d418882890161324b565b925050608086013567ffffffffffffffff811115613d6257613d616131c7565b5b613d6e888289016137aa565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613dd7602a8361351f565b9150613de282613d7b565b604082019050919050565b60006020820190508181036000830152613e0681613dca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e5457607f821691505b602082108103613e6757613e66613e0d565b5b50919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613ec9602e8361351f565b9150613ed482613e6d565b604082019050919050565b60006020820190508181036000830152613ef881613ebc565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613f5b602f8361351f565b9150613f6682613eff565b604082019050919050565b60006020820190508181036000830152613f8a81613f4e565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b6000613fed602c8361351f565b9150613ff882613f91565b604082019050919050565b6000602082019050818103600083015261401c81613fe0565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b600061407f602c8361351f565b915061408a82614023565b604082019050919050565b600060208201905081810360008301526140ae81614072565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061411160298361351f565b915061411c826140b5565b604082019050919050565b6000602082019050818103600083015261414081614104565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141b08261322a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141e2576141e1614176565b5b600182019050919050565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c60008201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b600061424960388361351f565b9150614254826141ed565b604082019050919050565b600060208201905081810360008301526142788161423c565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142e17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826142a4565b6142eb86836142a4565b95508019841693508086168417925050509392505050565b6000819050919050565b600061432861432361431e8461322a565b614303565b61322a565b9050919050565b6000819050919050565b6143428361430d565b61435661434e8261432f565b8484546142b1565b825550505050565b600090565b61436b61435e565b614376818484614339565b505050565b5b8181101561439a5761438f600082614363565b60018101905061437c565b5050565b601f8211156143df576143b08161427f565b6143b984614294565b810160208510156143c8578190505b6143dc6143d485614294565b83018261437b565b50505b505050565b600082821c905092915050565b6000614402600019846008026143e4565b1980831691505092915050565b600061441b83836143f1565b9150826002028217905092915050565b61443482613514565b67ffffffffffffffff81111561444d5761444c6133a0565b5b6144578254613e3c565b61446282828561439e565b600060209050601f8311600181146144955760008415614483578287015190505b61448d858261440f565b8655506144f5565b601f1984166144a38661427f565b60005b828110156144cb578489015182556001820191506020850194506020810190506144a6565b868310156144e857848901516144e4601f8916826143f1565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061455960268361351f565b9150614564826144fd565b604082019050919050565b600060208201905081810360008301526145888161454c565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006145eb602e8361351f565b91506145f68261458f565b604082019050919050565b6000602082019050818103600083015261461a816145de565b9050919050565b6000819050919050565b600060ff82169050919050565b600061465361464e61464984614621565b614303565b61462b565b9050919050565b61466381614638565b82525050565b600060208201905061467e600083018461465a565b92915050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006146e060288361351f565b91506146eb82614684565b604082019050919050565b6000602082019050818103600083015261470f816146d3565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061477260258361351f565b915061477d82614716565b604082019050919050565b600060208201905081810360008301526147a181614765565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614804602a8361351f565b915061480f826147a8565b604082019050919050565b60006020820190508181036000830152614833816147f7565b9050919050565b60006148458261322a565b91506148508361322a565b925082820190508082111561486857614867614176565b5b92915050565b600060408201905081810360008301526148888185613aaf565b9050818103602083015261489c8184613aaf565b90509392505050565b6000815190506148b4816135ec565b92915050565b6000602082840312156148d0576148cf6131c2565b5b60006148de848285016148a5565b91505092915050565b7f45524331393637557067726164653a206e657720696d706c656d656e7461746960008201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b6000614943602e8361351f565b915061494e826148e7565b604082019050919050565b6000602082019050818103600083015261497281614936565b9050919050565b7f45524331393637557067726164653a20756e737570706f727465642070726f7860008201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b60006149d560298361351f565b91506149e082614979565b604082019050919050565b60006020820190508181036000830152614a04816149c8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a4160208361351f565b9150614a4c82614a0b565b602082019050919050565b60006020820190508181036000830152614a7081614a34565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ad360218361351f565b9150614ade82614a77565b604082019050919050565b60006020820190508181036000830152614b0281614ac6565b9050919050565b6000604082019050614b1e60008301856132a0565b614b2b60208301846132a0565b9392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614b8e60298361351f565b9150614b9982614b32565b604082019050919050565b60006020820190508181036000830152614bbd81614b81565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b6000614c20602b8361351f565b9150614c2b82614bc4565b604082019050919050565b60006020820190508181036000830152614c4f81614c13565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614c97601783614c56565b9150614ca282614c61565b601782019050919050565b6000614cb882613514565b614cc28185614c56565b9350614cd2818560208601613530565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614d14601183614c56565b9150614d1f82614cde565b601182019050919050565b6000614d3582614c8a565b9150614d418285614cad565b9150614d4c82614d07565b9150614d588284614cad565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000614d8b82614d64565b614d958185614d6f565b9350614da5818560208601613530565b614dae8161338f565b840191505092915050565b600060a082019050614dce6000830188613c0e565b614ddb6020830187613c0e565b8181036040830152614ded8186613aaf565b90508181036060830152614e018185613aaf565b90508181036080830152614e158184614d80565b90509695505050505050565b600081519050614e30816132f6565b92915050565b600060208284031215614e4c57614e4b6131c2565b5b6000614e5a84828501614e21565b91505092915050565b60008160e01c9050919050565b600060033d1115614e8f5760046000803e614e8c600051614e63565b90505b90565b600060443d10614f1f57614ea46131b8565b60043d036004823e80513d602482011167ffffffffffffffff82111715614ecc575050614f1f565b808201805167ffffffffffffffff811115614eea5750505050614f1f565b80602083010160043d038501811115614f07575050505050614f1f565b614f16826020018501866133cf565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000614f7e60348361351f565b9150614f8982614f22565b604082019050919050565b60006020820190508181036000830152614fad81614f71565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b600061501060288361351f565b915061501b82614fb4565b604082019050919050565b6000602082019050818103600083015261503f81615003565b9050919050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b60006150a2602d8361351f565b91506150ad82615046565b604082019050919050565b600060208201905081810360008301526150d181615095565b9050919050565b600060a0820190506150ed6000830188613c0e565b6150fa6020830187613c0e565b61510760408301866132a0565b61511460608301856132a0565b81810360808301526151268184614d80565b90509695505050505050565b600061513d8261322a565b91506151488361322a565b92508282026151568161322a565b9150828204841483151761516d5761516c614176565b5b5092915050565b600061517f8261322a565b91506000820361519257615191614176565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006151d360208361351f565b91506151de8261519d565b602082019050919050565b60006020820190508181036000830152615202816151c6565b9050919050565b600081905092915050565b600061521f82614d64565b6152298185615209565b9350615239818560208601613530565b80840191505092915050565b60006152518284615214565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615292601d8361351f565b915061529d8261525c565b602082019050919050565b600060208201905081810360008301526152c181615285565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202107c948e192207e9f0613e2dee7534eee68e1372dd2c91feec3b0ed20620cdf64736f6c63430008120033
Deployed Bytecode
0x6080604052600436106101cc5760003560e01c80638da5cb5b116100f7578063c47f002711610095578063e985e9c511610064578063e985e9c514610662578063f242432a1461069f578063f2fde38b146106c8578063f62d1888146106f1576101cc565b8063c47f0027146105ba578063d5391393146105e3578063d547741f1461060e578063e8a3d48514610637576101cc565b806395d89b41116100d157806395d89b4114610512578063a217fddf1461053d578063a22cb46514610568578063b84c824614610591576101cc565b80638da5cb5b1461048157806391d14854146104ac578063938e3d7b146104e9576101cc565b80632f2ff15d1161016f5780634f1ef2861161013e5780634f1ef286146103fa57806352d1902d14610416578063715018a614610441578063731133e914610458576101cc565b80632f2ff15d1461034257806336568abe1461036b5780633659cfe6146103945780634e1273f4146103bd576101cc565b806306fdde03116101ab57806306fdde03146102745780630e89341c1461029f578063248a9ca3146102dc5780632eb2c2d614610319576101cc565b8062fdd58e146101d157806301ffc9a71461020e57806302fe53051461024b575b600080fd5b3480156101dd57600080fd5b506101f860048036038101906101f39190613260565b61071a565b60405161020591906132af565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190613322565b6107e4565b604051610242919061336a565b60405180910390f35b34801561025757600080fd5b50610272600480360381019061026d91906134cb565b6108c6565b005b34801561028057600080fd5b50610289610917565b6040516102969190613593565b60405180910390f35b3480156102ab57600080fd5b506102c660048036038101906102c191906135b5565b6109aa565b6040516102d39190613593565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613618565b610a3f565b6040516103109190613654565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b91906137d8565b610a5f565b005b34801561034e57600080fd5b50610369600480360381019061036491906138a7565b610b00565b005b34801561037757600080fd5b50610392600480360381019061038d91906138a7565b610b21565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906138e7565b610ba4565b005b3480156103c957600080fd5b506103e460048036038101906103df91906139d7565b610d2c565b6040516103f19190613b0d565b60405180910390f35b610414600480360381019061040f9190613b2f565b610e45565b005b34801561042257600080fd5b5061042b610f81565b6040516104389190613654565b60405180910390f35b34801561044d57600080fd5b5061045661103a565b005b34801561046457600080fd5b5061047f600480360381019061047a9190613b8b565b61104e565b005b34801561048d57600080fd5b5061049661108b565b6040516104a39190613c1d565b60405180910390f35b3480156104b857600080fd5b506104d360048036038101906104ce91906138a7565b6110b5565b6040516104e0919061336a565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b91906134cb565b611120565b005b34801561051e57600080fd5b50610527611142565b6040516105349190613593565b60405180910390f35b34801561054957600080fd5b506105526111d5565b60405161055f9190613654565b60405180910390f35b34801561057457600080fd5b5061058f600480360381019061058a9190613c64565b6111dc565b005b34801561059d57600080fd5b506105b860048036038101906105b391906134cb565b6111f2565b005b3480156105c657600080fd5b506105e160048036038101906105dc91906134cb565b611214565b005b3480156105ef57600080fd5b506105f8611236565b6040516106059190613654565b60405180910390f35b34801561061a57600080fd5b50610635600480360381019061063091906138a7565b61125a565b005b34801561064357600080fd5b5061064c61127b565b6040516106599190613593565b60405180910390f35b34801561066e57600080fd5b5061068960048036038101906106849190613ca4565b61130e565b604051610696919061336a565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c19190613ce4565b6113a3565b005b3480156106d457600080fd5b506106ef60048036038101906106ea91906138e7565b611444565b005b3480156106fd57600080fd5b50610718600480360381019061071391906134cb565b6114c7565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361078a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078190613ded565b60405180910390fd5b61012d600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108af57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108bf57506108be8261160f565b5b9050919050565b6000801b6108d381611689565b6108dc8261169d565b7fe3afa94108b5f5e82e5f6e539d161ff4b5402a85f696c67b9768ec3ae54ce3668260405161090b9190613593565b60405180910390a15050565b6060610131805461092790613e3c565b80601f016020809104026020016040519081016040528092919081815260200182805461095390613e3c565b80156109a05780601f10610975576101008083540402835291602001916109a0565b820191906000526020600020905b81548152906001019060200180831161098357829003601f168201915b5050505050905090565b606061012f80546109ba90613e3c565b80601f01602080910402602001604051908101604052809291908181526020018280546109e690613e3c565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b50505050509050919050565b600060656000838152602001908152602001600020600101549050919050565b610a676116b1565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610aad5750610aac85610aa76116b1565b61130e565b5b610aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae390613edf565b60405180910390fd5b610af985858585856116b9565b5050505050565b610b0982610a3f565b610b1281611689565b610b1c83836119e0565b505050565b610b296116b1565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8d90613f71565b60405180910390fd5b610ba08282611ac1565b5050565b7f00000000000000000000000011bc733e719198e2b3746f6841d2818ca87af6da73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2990614003565b60405180910390fd5b7f00000000000000000000000011bc733e719198e2b3746f6841d2818ca87af6da73ffffffffffffffffffffffffffffffffffffffff16610c71611ba3565b73ffffffffffffffffffffffffffffffffffffffff1614610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90614095565b60405180910390fd5b610cd081611bfa565b610d2981600067ffffffffffffffff811115610cef57610cee6133a0565b5b6040519080825280601f01601f191660200182016040528015610d215781602001600182028036833780820191505090505b506000611c05565b50565b60608151835114610d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6990614127565b60405180910390fd5b6000835167ffffffffffffffff811115610d8f57610d8e6133a0565b5b604051908082528060200260200182016040528015610dbd5781602001602082028036833780820191505090505b50905060005b8451811015610e3a57610e0a858281518110610de257610de1614147565b5b6020026020010151858381518110610dfd57610dfc614147565b5b602002602001015161071a565b828281518110610e1d57610e1c614147565b5b60200260200101818152505080610e33906141a5565b9050610dc3565b508091505092915050565b7f00000000000000000000000011bc733e719198e2b3746f6841d2818ca87af6da73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca90614003565b60405180910390fd5b7f00000000000000000000000011bc733e719198e2b3746f6841d2818ca87af6da73ffffffffffffffffffffffffffffffffffffffff16610f12611ba3565b73ffffffffffffffffffffffffffffffffffffffff1614610f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5f90614095565b60405180910390fd5b610f7182611bfa565b610f7d82826001611c05565b5050565b60007f00000000000000000000000011bc733e719198e2b3746f6841d2818ca87af6da73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110089061425f565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905090565b611042611d73565b61104c6000611df1565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661107881611689565b61108485858585611eb7565b5050505050565b600060fb60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006065600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b61112d81611689565b81610130908161113d919061442b565b505050565b6060610132805461115290613e3c565b80601f016020809104026020016040519081016040528092919081815260200182805461117e90613e3c565b80156111cb5780601f106111a0576101008083540402835291602001916111cb565b820191906000526020600020905b8154815290600101906020018083116111ae57829003601f168201915b5050505050905090565b6000801b81565b6111ee6111e76116b1565b8383612069565b5050565b6000801b6111ff81611689565b81610132908161120f919061442b565b505050565b6000801b61122181611689565b816101319081611231919061442b565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61126382610a3f565b61126c81611689565b6112768383611ac1565b505050565b6060610130805461128b90613e3c565b80601f01602080910402602001604051908101604052809291908181526020018280546112b790613e3c565b80156113045780601f106112d957610100808354040283529160200191611304565b820191906000526020600020905b8154815290600101906020018083116112e757829003601f168201915b5050505050905090565b600061012e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113ab6116b1565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806113f157506113f0856113eb6116b1565b61130e565b5b611430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142790613edf565b60405180910390fd5b61143d85858585856121d6565b5050505050565b61144c611d73565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b29061456f565b60405180910390fd5b6114c481611df1565b50565b60008060019054906101000a900460ff161590508080156114f85750600160008054906101000a900460ff1660ff16105b80611525575061150730612477565b1580156115245750600160008054906101000a900460ff1660ff16145b5b611564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155b90614601565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156115a1576001600060016101000a81548160ff0219169083151502179055505b6115aa8261249a565b6115b2612552565b801561160b5760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516116029190614669565b60405180910390a15b5050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116825750611681826125ab565b5b9050919050565b61169a816116956116b1565b612615565b50565b8061012f90816116ad919061442b565b5050565b600033905090565b81518351146116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f4906146f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361176c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176390614788565b60405180910390fd5b60006117766116b1565b905061178681878787878761269a565b60005b845181101561193d5760008582815181106117a7576117a6614147565b5b6020026020010151905060008583815181106117c6576117c5614147565b5b60200260200101519050600061012d600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611869576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118609061481a565b60405180910390fd5b81810361012d600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508161012d600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611922919061483a565b9250508190555050505080611936906141a5565b9050611789565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119b492919061486e565b60405180910390a46119ca8187878787876126a2565b6119d88187878787876126aa565b505050505050565b6119ea82826110b5565b611abd5760016065600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a626116b1565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611acb82826110b5565b15611b9f5760006065600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b446116b1565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611bd17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b612881565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c02611d73565b50565b611c317f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914360001b61288b565b60000160009054906101000a900460ff1615611c5557611c5083612895565b611d6e565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611cbd57506040513d601f19601f82011682018060405250810190611cba91906148ba565b60015b611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf390614959565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b8114611d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d58906149eb565b60405180910390fd5b50611d6d83838361294e565b5b505050565b611d7b6116b1565b73ffffffffffffffffffffffffffffffffffffffff16611d9961108b565b73ffffffffffffffffffffffffffffffffffffffff1614611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de690614a57565b60405180910390fd5b565b600060fb60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160fb60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1d90614ae9565b60405180910390fd5b6000611f306116b1565b90506000611f3d8561297a565b90506000611f4a8561297a565b9050611f5b8360008985858961269a565b8461012d600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fbc919061483a565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161203a929190614b09565b60405180910390a4612051836000898585896126a2565b612060836000898989896129f4565b50505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ce90614ba4565b60405180910390fd5b8061012e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121c9919061336a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223c90614788565b60405180910390fd5b600061224f6116b1565b9050600061225c8561297a565b905060006122698561297a565b905061227983898985858961269a565b600061012d600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612312576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123099061481a565b60405180910390fd5b85810361012d600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508561012d600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123cb919061483a565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612448929190614b09565b60405180910390a461245e848a8a86868a6126a2565b61246c848a8a8a8a8a6129f4565b505050505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff166124e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e090614c36565b60405180910390fd5b6124f1612bcb565b6124f9612c1c565b612501612c6d565b61250a81612cbe565b61251e6000801b6125196116b1565b612d19565b61254f7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661254a6116b1565b612d19565b50565b600060019054906101000a900460ff166125a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259890614c36565b60405180910390fd5b6125a9612d27565b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61261f82826110b5565b6126965761262c81612d88565b61263a8360001c6020612db5565b60405160200161264b929190614d2a565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268d9190613593565b60405180910390fd5b5050565b505050505050565b505050505050565b6126c98473ffffffffffffffffffffffffffffffffffffffff16612477565b15612879578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161270f959493929190614db9565b6020604051808303816000875af192505050801561274b57506040513d601f19601f820116820180604052508101906127489190614e36565b60015b6127f057612757614e70565b806308c379a0036127b3575061276b614e92565b8061277657506127b5565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127aa9190613593565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e790614f94565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286e90615026565b60405180910390fd5b505b505050505050565b6000819050919050565b6000819050919050565b61289e81612477565b6128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d4906150b8565b60405180910390fd5b8061290a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b612881565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61295783612ff1565b6000825111806129645750805b15612975576129738383613040565b505b505050565b60606000600167ffffffffffffffff811115612999576129986133a0565b5b6040519080825280602002602001820160405280156129c75781602001602082028036833780820191505090505b50905082816000815181106129df576129de614147565b5b60200260200101818152505080915050919050565b612a138473ffffffffffffffffffffffffffffffffffffffff16612477565b15612bc3578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612a599594939291906150d8565b6020604051808303816000875af1925050508015612a9557506040513d601f19601f82011682018060405250810190612a929190614e36565b60015b612b3a57612aa1614e70565b806308c379a003612afd5750612ab5614e92565b80612ac05750612aff565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af49190613593565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3190614f94565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb890615026565b60405180910390fd5b505b505050505050565b600060019054906101000a900460ff16612c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1190614c36565b60405180910390fd5b565b600060019054906101000a900460ff16612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6290614c36565b60405180910390fd5b565b600060019054906101000a900460ff16612cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb390614c36565b60405180910390fd5b565b600060019054906101000a900460ff16612d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0490614c36565b60405180910390fd5b612d168161169d565b50565b612d2382826119e0565b5050565b600060019054906101000a900460ff16612d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6d90614c36565b60405180910390fd5b612d86612d816116b1565b611df1565b565b6060612dae8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612db5565b9050919050565b606060006002836002612dc89190615132565b612dd2919061483a565b67ffffffffffffffff811115612deb57612dea6133a0565b5b6040519080825280601f01601f191660200182016040528015612e1d5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612e5557612e54614147565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612eb957612eb8614147565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612ef99190615132565b612f03919061483a565b90505b6001811115612fa3577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612f4557612f44614147565b5b1a60f81b828281518110612f5c57612f5b614147565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f9c90615174565b9050612f06565b5060008414612fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fde906151e9565b60405180910390fd5b8091505092915050565b612ffa81612895565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b606061306583836040518060600160405280602781526020016152c96027913961306d565b905092915050565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516130979190615245565b600060405180830381855af49150503d80600081146130d2576040519150601f19603f3d011682016040523d82523d6000602084013e6130d7565b606091505b50915091506130e8868383876130f3565b925050509392505050565b6060831561315557600083510361314d5761310d85612477565b61314c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613143906152a8565b60405180910390fd5b5b829050613160565b61315f8383613168565b5b949350505050565b60008251111561317b5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131af9190613593565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131f7826131cc565b9050919050565b613207816131ec565b811461321257600080fd5b50565b600081359050613224816131fe565b92915050565b6000819050919050565b61323d8161322a565b811461324857600080fd5b50565b60008135905061325a81613234565b92915050565b60008060408385031215613277576132766131c2565b5b600061328585828601613215565b92505060206132968582860161324b565b9150509250929050565b6132a98161322a565b82525050565b60006020820190506132c460008301846132a0565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132ff816132ca565b811461330a57600080fd5b50565b60008135905061331c816132f6565b92915050565b600060208284031215613338576133376131c2565b5b60006133468482850161330d565b91505092915050565b60008115159050919050565b6133648161334f565b82525050565b600060208201905061337f600083018461335b565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133d88261338f565b810181811067ffffffffffffffff821117156133f7576133f66133a0565b5b80604052505050565b600061340a6131b8565b905061341682826133cf565b919050565b600067ffffffffffffffff821115613436576134356133a0565b5b61343f8261338f565b9050602081019050919050565b82818337600083830152505050565b600061346e6134698461341b565b613400565b90508281526020810184848401111561348a5761348961338a565b5b61349584828561344c565b509392505050565b600082601f8301126134b2576134b1613385565b5b81356134c284826020860161345b565b91505092915050565b6000602082840312156134e1576134e06131c2565b5b600082013567ffffffffffffffff8111156134ff576134fe6131c7565b5b61350b8482850161349d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561354e578082015181840152602081019050613533565b60008484015250505050565b600061356582613514565b61356f818561351f565b935061357f818560208601613530565b6135888161338f565b840191505092915050565b600060208201905081810360008301526135ad818461355a565b905092915050565b6000602082840312156135cb576135ca6131c2565b5b60006135d98482850161324b565b91505092915050565b6000819050919050565b6135f5816135e2565b811461360057600080fd5b50565b600081359050613612816135ec565b92915050565b60006020828403121561362e5761362d6131c2565b5b600061363c84828501613603565b91505092915050565b61364e816135e2565b82525050565b60006020820190506136696000830184613645565b92915050565b600067ffffffffffffffff82111561368a576136896133a0565b5b602082029050602081019050919050565b600080fd5b60006136b36136ae8461366f565b613400565b905080838252602082019050602084028301858111156136d6576136d561369b565b5b835b818110156136ff57806136eb888261324b565b8452602084019350506020810190506136d8565b5050509392505050565b600082601f83011261371e5761371d613385565b5b813561372e8482602086016136a0565b91505092915050565b600067ffffffffffffffff821115613752576137516133a0565b5b61375b8261338f565b9050602081019050919050565b600061377b61377684613737565b613400565b9050828152602081018484840111156137975761379661338a565b5b6137a284828561344c565b509392505050565b600082601f8301126137bf576137be613385565b5b81356137cf848260208601613768565b91505092915050565b600080600080600060a086880312156137f4576137f36131c2565b5b600061380288828901613215565b955050602061381388828901613215565b945050604086013567ffffffffffffffff811115613834576138336131c7565b5b61384088828901613709565b935050606086013567ffffffffffffffff811115613861576138606131c7565b5b61386d88828901613709565b925050608086013567ffffffffffffffff81111561388e5761388d6131c7565b5b61389a888289016137aa565b9150509295509295909350565b600080604083850312156138be576138bd6131c2565b5b60006138cc85828601613603565b92505060206138dd85828601613215565b9150509250929050565b6000602082840312156138fd576138fc6131c2565b5b600061390b84828501613215565b91505092915050565b600067ffffffffffffffff82111561392f5761392e6133a0565b5b602082029050602081019050919050565b600061395361394e84613914565b613400565b905080838252602082019050602084028301858111156139765761397561369b565b5b835b8181101561399f578061398b8882613215565b845260208401935050602081019050613978565b5050509392505050565b600082601f8301126139be576139bd613385565b5b81356139ce848260208601613940565b91505092915050565b600080604083850312156139ee576139ed6131c2565b5b600083013567ffffffffffffffff811115613a0c57613a0b6131c7565b5b613a18858286016139a9565b925050602083013567ffffffffffffffff811115613a3957613a386131c7565b5b613a4585828601613709565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a848161322a565b82525050565b6000613a968383613a7b565b60208301905092915050565b6000602082019050919050565b6000613aba82613a4f565b613ac48185613a5a565b9350613acf83613a6b565b8060005b83811015613b00578151613ae78882613a8a565b9750613af283613aa2565b925050600181019050613ad3565b5085935050505092915050565b60006020820190508181036000830152613b278184613aaf565b905092915050565b60008060408385031215613b4657613b456131c2565b5b6000613b5485828601613215565b925050602083013567ffffffffffffffff811115613b7557613b746131c7565b5b613b81858286016137aa565b9150509250929050565b60008060008060808587031215613ba557613ba46131c2565b5b6000613bb387828801613215565b9450506020613bc48782880161324b565b9350506040613bd58782880161324b565b925050606085013567ffffffffffffffff811115613bf657613bf56131c7565b5b613c02878288016137aa565b91505092959194509250565b613c17816131ec565b82525050565b6000602082019050613c326000830184613c0e565b92915050565b613c418161334f565b8114613c4c57600080fd5b50565b600081359050613c5e81613c38565b92915050565b60008060408385031215613c7b57613c7a6131c2565b5b6000613c8985828601613215565b9250506020613c9a85828601613c4f565b9150509250929050565b60008060408385031215613cbb57613cba6131c2565b5b6000613cc985828601613215565b9250506020613cda85828601613215565b9150509250929050565b600080600080600060a08688031215613d0057613cff6131c2565b5b6000613d0e88828901613215565b9550506020613d1f88828901613215565b9450506040613d308882890161324b565b9350506060613d418882890161324b565b925050608086013567ffffffffffffffff811115613d6257613d616131c7565b5b613d6e888289016137aa565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613dd7602a8361351f565b9150613de282613d7b565b604082019050919050565b60006020820190508181036000830152613e0681613dca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e5457607f821691505b602082108103613e6757613e66613e0d565b5b50919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613ec9602e8361351f565b9150613ed482613e6d565b604082019050919050565b60006020820190508181036000830152613ef881613ebc565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613f5b602f8361351f565b9150613f6682613eff565b604082019050919050565b60006020820190508181036000830152613f8a81613f4e565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b6000613fed602c8361351f565b9150613ff882613f91565b604082019050919050565b6000602082019050818103600083015261401c81613fe0565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b600061407f602c8361351f565b915061408a82614023565b604082019050919050565b600060208201905081810360008301526140ae81614072565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061411160298361351f565b915061411c826140b5565b604082019050919050565b6000602082019050818103600083015261414081614104565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141b08261322a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141e2576141e1614176565b5b600182019050919050565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c60008201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b600061424960388361351f565b9150614254826141ed565b604082019050919050565b600060208201905081810360008301526142788161423c565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142e17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826142a4565b6142eb86836142a4565b95508019841693508086168417925050509392505050565b6000819050919050565b600061432861432361431e8461322a565b614303565b61322a565b9050919050565b6000819050919050565b6143428361430d565b61435661434e8261432f565b8484546142b1565b825550505050565b600090565b61436b61435e565b614376818484614339565b505050565b5b8181101561439a5761438f600082614363565b60018101905061437c565b5050565b601f8211156143df576143b08161427f565b6143b984614294565b810160208510156143c8578190505b6143dc6143d485614294565b83018261437b565b50505b505050565b600082821c905092915050565b6000614402600019846008026143e4565b1980831691505092915050565b600061441b83836143f1565b9150826002028217905092915050565b61443482613514565b67ffffffffffffffff81111561444d5761444c6133a0565b5b6144578254613e3c565b61446282828561439e565b600060209050601f8311600181146144955760008415614483578287015190505b61448d858261440f565b8655506144f5565b601f1984166144a38661427f565b60005b828110156144cb578489015182556001820191506020850194506020810190506144a6565b868310156144e857848901516144e4601f8916826143f1565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061455960268361351f565b9150614564826144fd565b604082019050919050565b600060208201905081810360008301526145888161454c565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006145eb602e8361351f565b91506145f68261458f565b604082019050919050565b6000602082019050818103600083015261461a816145de565b9050919050565b6000819050919050565b600060ff82169050919050565b600061465361464e61464984614621565b614303565b61462b565b9050919050565b61466381614638565b82525050565b600060208201905061467e600083018461465a565b92915050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006146e060288361351f565b91506146eb82614684565b604082019050919050565b6000602082019050818103600083015261470f816146d3565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061477260258361351f565b915061477d82614716565b604082019050919050565b600060208201905081810360008301526147a181614765565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614804602a8361351f565b915061480f826147a8565b604082019050919050565b60006020820190508181036000830152614833816147f7565b9050919050565b60006148458261322a565b91506148508361322a565b925082820190508082111561486857614867614176565b5b92915050565b600060408201905081810360008301526148888185613aaf565b9050818103602083015261489c8184613aaf565b90509392505050565b6000815190506148b4816135ec565b92915050565b6000602082840312156148d0576148cf6131c2565b5b60006148de848285016148a5565b91505092915050565b7f45524331393637557067726164653a206e657720696d706c656d656e7461746960008201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b6000614943602e8361351f565b915061494e826148e7565b604082019050919050565b6000602082019050818103600083015261497281614936565b9050919050565b7f45524331393637557067726164653a20756e737570706f727465642070726f7860008201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b60006149d560298361351f565b91506149e082614979565b604082019050919050565b60006020820190508181036000830152614a04816149c8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a4160208361351f565b9150614a4c82614a0b565b602082019050919050565b60006020820190508181036000830152614a7081614a34565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ad360218361351f565b9150614ade82614a77565b604082019050919050565b60006020820190508181036000830152614b0281614ac6565b9050919050565b6000604082019050614b1e60008301856132a0565b614b2b60208301846132a0565b9392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614b8e60298361351f565b9150614b9982614b32565b604082019050919050565b60006020820190508181036000830152614bbd81614b81565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b6000614c20602b8361351f565b9150614c2b82614bc4565b604082019050919050565b60006020820190508181036000830152614c4f81614c13565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614c97601783614c56565b9150614ca282614c61565b601782019050919050565b6000614cb882613514565b614cc28185614c56565b9350614cd2818560208601613530565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614d14601183614c56565b9150614d1f82614cde565b601182019050919050565b6000614d3582614c8a565b9150614d418285614cad565b9150614d4c82614d07565b9150614d588284614cad565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000614d8b82614d64565b614d958185614d6f565b9350614da5818560208601613530565b614dae8161338f565b840191505092915050565b600060a082019050614dce6000830188613c0e565b614ddb6020830187613c0e565b8181036040830152614ded8186613aaf565b90508181036060830152614e018185613aaf565b90508181036080830152614e158184614d80565b90509695505050505050565b600081519050614e30816132f6565b92915050565b600060208284031215614e4c57614e4b6131c2565b5b6000614e5a84828501614e21565b91505092915050565b60008160e01c9050919050565b600060033d1115614e8f5760046000803e614e8c600051614e63565b90505b90565b600060443d10614f1f57614ea46131b8565b60043d036004823e80513d602482011167ffffffffffffffff82111715614ecc575050614f1f565b808201805167ffffffffffffffff811115614eea5750505050614f1f565b80602083010160043d038501811115614f07575050505050614f1f565b614f16826020018501866133cf565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000614f7e60348361351f565b9150614f8982614f22565b604082019050919050565b60006020820190508181036000830152614fad81614f71565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b600061501060288361351f565b915061501b82614fb4565b604082019050919050565b6000602082019050818103600083015261503f81615003565b9050919050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b60006150a2602d8361351f565b91506150ad82615046565b604082019050919050565b600060208201905081810360008301526150d181615095565b9050919050565b600060a0820190506150ed6000830188613c0e565b6150fa6020830187613c0e565b61510760408301866132a0565b61511460608301856132a0565b81810360808301526151268184614d80565b90509695505050505050565b600061513d8261322a565b91506151488361322a565b92508282026151568161322a565b9150828204841483151761516d5761516c614176565b5b5092915050565b600061517f8261322a565b91506000820361519257615191614176565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006151d360208361351f565b91506151de8261519d565b602082019050919050565b60006020820190508181036000830152615202816151c6565b9050919050565b600081905092915050565b600061521f82614d64565b6152298185615209565b9350615239818560208601613530565b80840191505092915050565b60006152518284615214565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615292601d8361351f565b915061529d8261525c565b602082019050919050565b600060208201905081810360008301526152c181615285565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202107c948e192207e9f0613e2dee7534eee68e1372dd2c91feec3b0ed20620cdf64736f6c63430008120033
Deployed Bytecode Sourcemap
80403:20350:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84831:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83784:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82383:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83461:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84575:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46354:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86749:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46795:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47939:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70773:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85227:499;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71302:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70379:133;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52644:103;;;;;;;;;;;;;:::i;:::-;;91512:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52003:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44805:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82742:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83589:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43899:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85799:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83158:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82963:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81204:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47235:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83321:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86026:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86266:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52902:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81345:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84831:230;84917:7;84964:1;84945:21;;:7;:21;;;84937:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;85031:9;:13;85041:2;85031:13;;;;;;;;;;;:22;85045:7;85031:22;;;;;;;;;;;;;;;;85024:29;;84831:230;;;;:::o;83784:380::-;83934:4;83986:37;83971:52;;;:11;:52;;;;:132;;;;84055:48;84040:63;;;:11;:63;;;;83971:132;:185;;;;84120:36;84144:11;84120:23;:36::i;:::-;83971:185;83951:205;;83784:380;;;:::o;82383:130::-;43944:4;82437:18;;44390:16;44401:4;44390:10;:16::i;:::-;82464:15:::1;82472:6;82464:7;:15::i;:::-;82491:18;82502:6;82491:18;;;;;;:::i;:::-;;;;;;;;82383:130:::0;;:::o;83461:83::-;83498:13;83531:5;83524:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83461:83;:::o;84575:105::-;84635:13;84668:4;84661:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84575:105;;;:::o;46354:131::-;46428:7;46455:6;:12;46462:4;46455:12;;;;;;;;;;;:22;;;46448:29;;46354:131;;;:::o;86749:438::-;86990:12;:10;:12::i;:::-;86982:20;;:4;:20;;;:60;;;;87006:36;87023:4;87029:12;:10;:12::i;:::-;87006:16;:36::i;:::-;86982:60;86960:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;87127:52;87150:4;87156:2;87160:3;87165:7;87174:4;87127:22;:52::i;:::-;86749:438;;;;;:::o;46795:147::-;46878:18;46891:4;46878:12;:18::i;:::-;44390:16;44401:4;44390:10;:16::i;:::-;46909:25:::1;46920:4;46926:7;46909:10;:25::i;:::-;46795:147:::0;;;:::o;47939:218::-;48046:12;:10;:12::i;:::-;48035:23;;:7;:23;;;48027:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;48123:26;48135:4;48141:7;48123:11;:26::i;:::-;47939:218;;:::o;70773:198::-;69249:6;69232:23;;69240:4;69232:23;;;69224:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;69347:6;69323:30;;:20;:18;:20::i;:::-;:30;;;69315:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;70855:36:::1;70873:17;70855;:36::i;:::-;70902:61;70924:17;70953:1;70943:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70957:5;70902:21;:61::i;:::-;70773:198:::0;:::o;85227:499::-;85363:16;85419:3;:10;85400:8;:15;:29;85392:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;85488:30;85535:8;:15;85521:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85488:63;;85569:9;85564:122;85588:8;:15;85584:1;:19;85564:122;;;85644:30;85654:8;85663:1;85654:11;;;;;;;;:::i;:::-;;;;;;;;85667:3;85671:1;85667:6;;;;;;;;:::i;:::-;;;;;;;;85644:9;:30::i;:::-;85625:13;85639:1;85625:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;85605:3;;;;:::i;:::-;;;85564:122;;;;85705:13;85698:20;;;85227:499;;;;:::o;71302:223::-;69249:6;69232:23;;69240:4;69232:23;;;69224:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;69347:6;69323:30;;:20;:18;:20::i;:::-;:30;;;69315:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;71418:36:::1;71436:17;71418;:36::i;:::-;71465:52;71487:17;71506:4;71512;71465:21;:52::i;:::-;71302:223:::0;;:::o;70379:133::-;70457:7;69694:6;69677:23;;69685:4;69677:23;;;69669:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;61736:66:::1;70484:20;;70477:27;;70379:133:::0;:::o;52644:103::-;51889:13;:11;:13::i;:::-;52709:30:::1;52736:1;52709:18;:30::i;:::-;52644:103::o:0;91512:156::-;81242:24;44390:16;44401:4;44390:10;:16::i;:::-;91633:27:::1;91639:2;91643;91647:6;91655:4;91633:5;:27::i;:::-;91512:156:::0;;;;;:::o;52003:87::-;52049:7;52076:6;;;;;;;;;;;52069:13;;52003:87;:::o;44805:147::-;44891:4;44915:6;:12;44922:4;44915:12;;;;;;;;;;;:20;;:29;44936:7;44915:29;;;;;;;;;;;;;;;;;;;;;;;;;44908:36;;44805:147;;;;:::o;82742:138::-;43944:4;82812:18;;44390:16;44401:4;44390:10;:16::i;:::-;82858:14:::1;82843:12;:29;;;;;;:::i;:::-;;82742:138:::0;;:::o;83589:87::-;83628:13;83661:7;83654:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83589:87;:::o;43899:49::-;43944:4;43899:49;;;:::o;85799:155::-;85894:52;85913:12;:10;:12::i;:::-;85927:8;85937;85894:18;:52::i;:::-;85799:155;;:::o;83158:118::-;43944:4;83218:18;;44390:16;44401:4;44390:10;:16::i;:::-;83259:9:::1;83249:7;:19;;;;;;:::i;:::-;;83158:118:::0;;:::o;82963:110::-;43944:4;83019:18;;44390:16;44401:4;44390:10;:16::i;:::-;83058:7:::1;83050:5;:15;;;;;;:::i;:::-;;82963:110:::0;;:::o;81204:62::-;81242:24;81204:62;:::o;47235:149::-;47319:18;47332:4;47319:12;:18::i;:::-;44390:16;44401:4;44390:10;:16::i;:::-;47350:26:::1;47362:4;47368:7;47350:11;:26::i;:::-;47235:149:::0;;;:::o;83321:97::-;83365:13;83398:12;83391:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83321:97;:::o;86026:168::-;86125:4;86149:18;:27;86168:7;86149:27;;;;;;;;;;;;;;;:37;86177:8;86149:37;;;;;;;;;;;;;;;;;;;;;;;;;86142:44;;86026:168;;;;:::o;86266:406::-;86482:12;:10;:12::i;:::-;86474:20;;:4;:20;;;:60;;;;86498:36;86515:4;86521:12;:10;:12::i;:::-;86498:16;:36::i;:::-;86474:60;86452:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;86619:45;86637:4;86643:2;86647;86651:6;86659:4;86619:17;:45::i;:::-;86266:406;;;;;:::o;52902:201::-;51889:13;:11;:13::i;:::-;53011:1:::1;52991:22;;:8;:22;;::::0;52983:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;53067:28;53086:8;53067:18;:28::i;:::-;52902:201:::0;:::o;81345:160::-;16373:19;16396:13;;;;;;;;;;;16395:14;16373:36;;16443:14;:34;;;;;16476:1;16461:12;;;;;;;;;;:16;;;16443:34;16442:108;;;;16484:44;16522:4;16484:29;:44::i;:::-;16483:45;:66;;;;;16548:1;16532:12;;;;;;;;;;:17;;;16483:66;16442:108;16420:204;;;;;;;;;;;;:::i;:::-;;;;;;;;;16650:1;16635:12;;:16;;;;;;;;;;;;;;;;;;16666:14;16662:67;;;16713:4;16697:13;;:20;;;;;;;;;;;;;;;;;;16662:67;81415:20:::1;81430:4;81415:14;:20::i;:::-;81446:16;:14;:16::i;:::-;16755:14:::0;16751:102;;;16802:5;16786:13;;:21;;;;;;;;;;;;;;;;;;16827:14;16839:1;16827:14;;;;;;:::i;:::-;;;;;;;;16751:102;16362:498;81345:160;:::o;44498:215::-;44583:4;44622:43;44607:58;;;:11;:58;;;;:98;;;;44669:36;44693:11;44669:23;:36::i;:::-;44607:98;44600:105;;44498:215;;;:::o;45256:105::-;45323:30;45334:4;45340:12;:10;:12::i;:::-;45323:10;:30::i;:::-;45256:105;:::o;90973:88::-;91047:6;91040:4;:13;;;;;;:::i;:::-;;90973:88;:::o;20750:98::-;20803:7;20830:10;20823:17;;20750:98;:::o;88983:1146::-;89210:7;:14;89196:3;:10;:28;89188:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;89302:1;89288:16;;:2;:16;;;89280:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;89359:16;89378:12;:10;:12::i;:::-;89359:31;;89403:60;89424:8;89434:4;89440:2;89444:3;89449:7;89458:4;89403:20;:60::i;:::-;89481:9;89476:421;89500:3;:10;89496:1;:14;89476:421;;;89532:10;89545:3;89549:1;89545:6;;;;;;;;:::i;:::-;;;;;;;;89532:19;;89566:14;89583:7;89591:1;89583:10;;;;;;;;:::i;:::-;;;;;;;;89566:27;;89610:19;89632:9;:13;89642:2;89632:13;;;;;;;;;;;:19;89646:4;89632:19;;;;;;;;;;;;;;;;89610:41;;89689:6;89674:11;:21;;89666:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;89822:6;89808:11;:20;89786:9;:13;89796:2;89786:13;;;;;;;;;;;:19;89800:4;89786:19;;;;;;;;;;;;;;;:42;;;;89879:6;89858:9;:13;89868:2;89858:13;;;;;;;;;;;:17;89872:2;89858:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;89517:380;;;89512:3;;;;:::i;:::-;;;89476:421;;;;89944:2;89914:47;;89938:4;89914:47;;89928:8;89914:47;;;89948:3;89953:7;89914:47;;;;;;;:::i;:::-;;;;;;;;89974:59;89994:8;90004:4;90010:2;90014:3;90019:7;90028:4;89974:19;:59::i;:::-;90046:75;90082:8;90092:4;90098:2;90102:3;90107:7;90116:4;90046:35;:75::i;:::-;89177:952;88983:1146;;;;;:::o;49536:238::-;49620:22;49628:4;49634:7;49620;:22::i;:::-;49615:152;;49691:4;49659:6;:12;49666:4;49659:12;;;;;;;;;;;:20;;:29;49680:7;49659:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;49742:12;:10;:12::i;:::-;49715:40;;49733:7;49715:40;;49727:4;49715:40;;;;;;;;;;49615:152;49536:238;;:::o;49954:239::-;50038:22;50046:4;50052:7;50038;:22::i;:::-;50034:152;;;50109:5;50077:6;:12;50084:4;50077:12;;;;;;;;;;;:20;;:29;50098:7;50077:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;50161:12;:10;:12::i;:::-;50134:40;;50152:7;50134:40;;50146:4;50134:40;;;;;;;;;;50034:152;49954:239;;:::o;61886:153::-;61939:7;61966:59;61736:66;62004:20;;61966:37;:59::i;:::-;:65;;;;;;;;;;;;61959:72;;61886:153;:::o;81593:84::-;51889:13;:11;:13::i;:::-;81593:84;:::o;63288:958::-;63708:53;61388:66;63746:14;;63708:37;:53::i;:::-;:59;;;;;;;;;;;;63704:535;;;63784:37;63803:17;63784:18;:37::i;:::-;63704:535;;;63887:17;63858:61;;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;63854:306;;64088:56;;;;;;;;;;:::i;:::-;;;;;;;;63854:306;61736:66;63980:20;;63972:4;:28;63964:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;63922:140;64174:53;64192:17;64211:4;64217:9;64174:17;:53::i;:::-;63704:535;63288:958;;;:::o;52168:132::-;52243:12;:10;:12::i;:::-;52232:23;;:7;:5;:7::i;:::-;:23;;;52224:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52168:132::o;53263:191::-;53337:16;53356:6;;;;;;;;;;;53337:25;;53382:8;53373:6;;:17;;;;;;;;;;;;;;;;;;53437:8;53406:40;;53427:8;53406:40;;;;;;;;;;;;53326:128;53263:191;:::o;91676:686::-;91800:1;91786:16;;:2;:16;;;91778:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;91853:16;91872:12;:10;:12::i;:::-;91853:31;;91895:20;91918:21;91936:2;91918:17;:21::i;:::-;91895:44;;91950:24;91977:25;91995:6;91977:17;:25::i;:::-;91950:52;;92015:66;92036:8;92054:1;92058:2;92062:3;92067:7;92076:4;92015:20;:66::i;:::-;92115:6;92094:9;:13;92104:2;92094:13;;;;;;;;;;;:17;92108:2;92094:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;92174:2;92137:52;;92170:1;92137:52;;92152:8;92137:52;;;92178:2;92182:6;92137:52;;;;;;;:::i;:::-;;;;;;;;92202:65;92222:8;92240:1;92244:2;92248:3;92253:7;92262:4;92202:19;:65::i;:::-;92280:74;92311:8;92329:1;92333:2;92337;92341:6;92349:4;92280:30;:74::i;:::-;91767:595;;;91676:686;;;;:::o;95978:297::-;96099:8;96090:17;;:5;:17;;;96082:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;96202:8;96164:18;:25;96183:5;96164:25;;;;;;;;;;;;;;;:35;96190:8;96164:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;96248:8;96226:41;;96241:5;96226:41;;;96258:8;96226:41;;;;;;:::i;:::-;;;;;;;;95978:297;;;:::o;87651:974::-;87853:1;87839:16;;:2;:16;;;87831:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;87910:16;87929:12;:10;:12::i;:::-;87910:31;;87952:20;87975:21;87993:2;87975:17;:21::i;:::-;87952:44;;88007:24;88034:25;88052:6;88034:17;:25::i;:::-;88007:52;;88072:60;88093:8;88103:4;88109:2;88113:3;88118:7;88127:4;88072:20;:60::i;:::-;88145:19;88167:9;:13;88177:2;88167:13;;;;;;;;;;;:19;88181:4;88167:19;;;;;;;;;;;;;;;;88145:41;;88220:6;88205:11;:21;;88197:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;88345:6;88331:11;:20;88309:9;:13;88319:2;88309:13;;;;;;;;;;;:19;88323:4;88309:19;;;;;;;;;;;;;;;:42;;;;88394:6;88373:9;:13;88383:2;88373:13;;;;;;;;;;;:17;88387:2;88373:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;88449:2;88418:46;;88443:4;88418:46;;88433:8;88418:46;;;88453:2;88457:6;88418:46;;;;;;;:::i;:::-;;;;;;;;88477:59;88497:8;88507:4;88513:2;88517:3;88522:7;88531:4;88477:19;:59::i;:::-;88549:68;88580:8;88590:4;88596:2;88600;88604:6;88612:4;88549:30;:68::i;:::-;87820:805;;;;87651:974;;;;;:::o;4795:326::-;4855:4;5112:1;5090:7;:19;;;:23;5083:30;;4795:326;;;:::o;81761:448::-;18516:13;;;;;;;;;;;18508:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;81842:26:::1;:24;:26::i;:::-;81879:25;:23;:25::i;:::-;81915:32;:30;:32::i;:::-;81958:30;81983:4;81958:24;:30::i;:::-;82064:44;43944:4;82075:18:::0;::::1;82095:12;:10;:12::i;:::-;82064:10;:44::i;:::-;82164:37;81242:24;82188:12;:10;:12::i;:::-;82164:10;:37::i;:::-;81761:448:::0;:::o;51546:97::-;18516:13;;;;;;;;;;;18508:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51609:26:::1;:24;:26::i;:::-;51546:97::o:0;23394:168::-;23479:4;23518:36;23503:51;;;:11;:51;;;;23496:58;;23394:168;;;:::o;45651:514::-;45740:22;45748:4;45754:7;45740;:22::i;:::-;45735:423;;45928:39;45959:7;45928:30;:39::i;:::-;46040:49;46079:4;46071:13;;46086:2;46040:30;:49::i;:::-;45833:279;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45779:367;;;;;;;;;;;:::i;:::-;;;;;;;;45735:423;45651:514;;:::o;97233:221::-;;;;;;;:::o;98409:220::-;;;;;;;:::o;99411:835::-;99651:15;:2;:13;;;:15::i;:::-;99647:592;;;99715:2;99687:54;;;99742:8;99752:4;99758:3;99763:7;99772:4;99687:90;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;99683:545;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;100101:6;100094:14;;;;;;;;;;;:::i;:::-;;;;;;;;99683:545;;;100150:62;;;;;;;;;;:::i;:::-;;;;;;;;99683:545;99871:59;;;99859:71;;;:8;:71;;;;99855:170;;99955:50;;;;;;;;;;:::i;:::-;;;;;;;;99855:170;99778:262;99647:592;99411:835;;;;;;:::o;58228:195::-;58289:21;58401:4;58391:14;;58228:195;;;:::o;58526:::-;58587:21;58699:4;58689:14;;58526:195;;;:::o;62135:284::-;62217:48;62247:17;62217:29;:48::i;:::-;62209:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;62394:17;62326:59;61736:66;62364:20;;62326:37;:59::i;:::-;:65;;;:85;;;;;;;;;;;;;;;;;;62135:284;:::o;62828:281::-;62937:29;62948:17;62937:10;:29::i;:::-;62995:1;62981:4;:11;:15;:28;;;;63000:9;62981:28;62977:125;;;63026:64;63066:17;63085:4;63026:39;:64::i;:::-;;62977:125;62828:281;;;:::o;100254:198::-;100320:16;100349:22;100388:1;100374:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100349:41;;100412:7;100401:5;100407:1;100401:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;100439:5;100432:12;;;100254:198;;;:::o;98637:766::-;98852:15;:2;:13;;;:15::i;:::-;98848:548;;;98916:2;98888:49;;;98938:8;98948:4;98954:2;98958:6;98966:4;98888:83;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;98884:501;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;99258:6;99251:14;;;;;;;;;;;:::i;:::-;;;;;;;;98884:501;;;99307:62;;;;;;;;;;:::i;:::-;;;;;;;;98884:501;99033:54;;;99021:66;;;:8;:66;;;;99017:165;;99112:50;;;;;;;;;;:::i;:::-;;;;;;;;99017:165;98972:225;98848:548;98637:766;;;;;;:::o;20674:70::-;18516:13;;;;;;;;;;;18508:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;20674:70::o;23255:69::-;18516:13;;;;;;;;;;;18508:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23255:::o;43662:76::-;18516:13;;;;;;;;;;;18508:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43662:76::o;82217:112::-;18516:13;;;;;;;;;;;18508:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;82308:13:::1;82316:4;82308:7;:13::i;:::-;82217:112:::0;:::o;48864:::-;48943:25;48954:4;48960:7;48943:10;:25::i;:::-;48864:112;;:::o;51651:113::-;18516:13;;;;;;;;;;;18508:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51724:32:::1;51743:12;:10;:12::i;:::-;51724:18;:32::i;:::-;51651:113::o:0;41113:151::-;41171:13;41204:52;41232:4;41216:22;;38955:2;41204:52;;:11;:52::i;:::-;41197:59;;41113:151;;;:::o;40509:447::-;40584:13;40610:19;40655:1;40646:6;40642:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;40632:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40610:47;;40668:15;:6;40675:1;40668:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;40694;:6;40701:1;40694:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;40725:9;40750:1;40741:6;40737:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;40725:26;;40720:131;40757:1;40753;:5;40720:131;;;40792:8;40809:3;40801:5;:11;40792:21;;;;;;;:::i;:::-;;;;;40780:6;40787:1;40780:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;40838:1;40828:11;;;;;40760:3;;;;:::i;:::-;;;40720:131;;;;40878:1;40869:5;:10;40861:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;40941:6;40927:21;;;40509:447;;;;:::o;62532:155::-;62599:37;62618:17;62599:18;:37::i;:::-;62661:17;62652:27;;;;;;;;;;;;62532:155;:::o;10187:200::-;10270:12;10302:77;10323:6;10331:4;10302:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;10295:84;;10187:200;;;;:::o;10581:332::-;10726:12;10752;10766:23;10793:6;:19;;10813:4;10793:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10751:67;;;;10836:69;10863:6;10871:7;10880:10;10892:12;10836:26;:69::i;:::-;10829:76;;;;10581:332;;;;;:::o;11209:644::-;11394:12;11423:7;11419:427;;;11472:1;11451:10;:17;:22;11447:290;;11669:18;11680:6;11669:10;:18::i;:::-;11661:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;11447:290;11758:10;11751:17;;;;11419:427;11801:33;11809:10;11821:12;11801:7;:33::i;:::-;11209:644;;;;;;;:::o;12395:552::-;12576:1;12556:10;:17;:21;12552:388;;;12788:10;12782:17;12845:15;12832:10;12828:2;12824:19;12817:44;12552:388;12915:12;12908:20;;;;;;;;;;;:::i;:::-;;;;;;;;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:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:102;3500:6;3551:2;3547:7;3542:2;3535:5;3531:14;3527:28;3517:38;;3459:102;;;:::o;3567:180::-;3615:77;3612:1;3605:88;3712:4;3709:1;3702:15;3736:4;3733:1;3726:15;3753:281;3836:27;3858:4;3836:27;:::i;:::-;3828:6;3824:40;3966:6;3954:10;3951:22;3930:18;3918:10;3915:34;3912:62;3909:88;;;3977:18;;:::i;:::-;3909:88;4017:10;4013:2;4006:22;3796:238;3753:281;;:::o;4040:129::-;4074:6;4101:20;;:::i;:::-;4091:30;;4130:33;4158:4;4150:6;4130:33;:::i;:::-;4040:129;;;:::o;4175:308::-;4237:4;4327:18;4319:6;4316:30;4313:56;;;4349:18;;:::i;:::-;4313:56;4387:29;4409:6;4387:29;:::i;:::-;4379:37;;4471:4;4465;4461:15;4453:23;;4175:308;;;:::o;4489:146::-;4586:6;4581:3;4576;4563:30;4627:1;4618:6;4613:3;4609:16;4602:27;4489:146;;;:::o;4641:425::-;4719:5;4744:66;4760:49;4802:6;4760:49;:::i;:::-;4744:66;:::i;:::-;4735:75;;4833:6;4826:5;4819:21;4871:4;4864:5;4860:16;4909:3;4900:6;4895:3;4891:16;4888:25;4885:112;;;4916:79;;:::i;:::-;4885:112;5006:54;5053:6;5048:3;5043;5006:54;:::i;:::-;4725:341;4641:425;;;;;:::o;5086:340::-;5142:5;5191:3;5184:4;5176:6;5172:17;5168:27;5158:122;;5199:79;;:::i;:::-;5158:122;5316:6;5303:20;5341:79;5416:3;5408:6;5401:4;5393:6;5389:17;5341:79;:::i;:::-;5332:88;;5148:278;5086:340;;;;:::o;5432:509::-;5501:6;5550:2;5538:9;5529:7;5525:23;5521:32;5518:119;;;5556:79;;:::i;:::-;5518:119;5704:1;5693:9;5689:17;5676:31;5734:18;5726:6;5723:30;5720:117;;;5756:79;;:::i;:::-;5720:117;5861:63;5916:7;5907:6;5896:9;5892:22;5861:63;:::i;:::-;5851:73;;5647:287;5432:509;;;;:::o;5947:99::-;5999:6;6033:5;6027:12;6017:22;;5947:99;;;:::o;6052:169::-;6136:11;6170:6;6165:3;6158:19;6210:4;6205:3;6201:14;6186:29;;6052:169;;;;:::o;6227:246::-;6308:1;6318:113;6332:6;6329:1;6326:13;6318:113;;;6417:1;6412:3;6408:11;6402:18;6398:1;6393:3;6389:11;6382:39;6354:2;6351:1;6347:10;6342:15;;6318:113;;;6465:1;6456:6;6451:3;6447:16;6440:27;6289:184;6227:246;;;:::o;6479:377::-;6567:3;6595:39;6628:5;6595:39;:::i;:::-;6650:71;6714:6;6709:3;6650:71;:::i;:::-;6643:78;;6730:65;6788:6;6783:3;6776:4;6769:5;6765:16;6730:65;:::i;:::-;6820:29;6842:6;6820:29;:::i;:::-;6815:3;6811:39;6804:46;;6571:285;6479:377;;;;:::o;6862:313::-;6975:4;7013:2;7002:9;6998:18;6990:26;;7062:9;7056:4;7052:20;7048:1;7037:9;7033:17;7026:47;7090:78;7163:4;7154:6;7090:78;:::i;:::-;7082:86;;6862:313;;;;:::o;7181:329::-;7240:6;7289:2;7277:9;7268:7;7264:23;7260:32;7257:119;;;7295:79;;:::i;:::-;7257:119;7415:1;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7386:117;7181:329;;;;:::o;7516:77::-;7553:7;7582:5;7571:16;;7516:77;;;:::o;7599:122::-;7672:24;7690:5;7672:24;:::i;:::-;7665:5;7662:35;7652:63;;7711:1;7708;7701:12;7652:63;7599:122;:::o;7727:139::-;7773:5;7811:6;7798:20;7789:29;;7827:33;7854:5;7827:33;:::i;:::-;7727:139;;;;:::o;7872:329::-;7931:6;7980:2;7968:9;7959:7;7955:23;7951:32;7948:119;;;7986:79;;:::i;:::-;7948:119;8106:1;8131:53;8176:7;8167:6;8156:9;8152:22;8131:53;:::i;:::-;8121:63;;8077:117;7872:329;;;;:::o;8207:118::-;8294:24;8312:5;8294:24;:::i;:::-;8289:3;8282:37;8207:118;;:::o;8331:222::-;8424:4;8462:2;8451:9;8447:18;8439:26;;8475:71;8543:1;8532:9;8528:17;8519:6;8475:71;:::i;:::-;8331:222;;;;:::o;8559:311::-;8636:4;8726:18;8718:6;8715:30;8712:56;;;8748:18;;:::i;:::-;8712:56;8798:4;8790:6;8786:17;8778:25;;8858:4;8852;8848:15;8840:23;;8559:311;;;:::o;8876:117::-;8985:1;8982;8975:12;9016:710;9112:5;9137:81;9153:64;9210:6;9153:64;:::i;:::-;9137:81;:::i;:::-;9128:90;;9238:5;9267:6;9260:5;9253:21;9301:4;9294:5;9290:16;9283:23;;9354:4;9346:6;9342:17;9334:6;9330:30;9383:3;9375:6;9372:15;9369:122;;;9402:79;;:::i;:::-;9369:122;9517:6;9500:220;9534:6;9529:3;9526:15;9500:220;;;9609:3;9638:37;9671:3;9659:10;9638:37;:::i;:::-;9633:3;9626:50;9705:4;9700:3;9696:14;9689:21;;9576:144;9560:4;9555:3;9551:14;9544:21;;9500:220;;;9504:21;9118:608;;9016:710;;;;;:::o;9749:370::-;9820:5;9869:3;9862:4;9854:6;9850:17;9846:27;9836:122;;9877:79;;:::i;:::-;9836:122;9994:6;9981:20;10019:94;10109:3;10101:6;10094:4;10086:6;10082:17;10019:94;:::i;:::-;10010:103;;9826:293;9749:370;;;;:::o;10125:307::-;10186:4;10276:18;10268:6;10265:30;10262:56;;;10298:18;;:::i;:::-;10262:56;10336:29;10358:6;10336:29;:::i;:::-;10328:37;;10420:4;10414;10410:15;10402:23;;10125:307;;;:::o;10438:423::-;10515:5;10540:65;10556:48;10597:6;10556:48;:::i;:::-;10540:65;:::i;:::-;10531:74;;10628:6;10621:5;10614:21;10666:4;10659:5;10655:16;10704:3;10695:6;10690:3;10686:16;10683:25;10680:112;;;10711:79;;:::i;:::-;10680:112;10801:54;10848:6;10843:3;10838;10801:54;:::i;:::-;10521:340;10438:423;;;;;:::o;10880:338::-;10935:5;10984:3;10977:4;10969:6;10965:17;10961:27;10951:122;;10992:79;;:::i;:::-;10951:122;11109:6;11096:20;11134:78;11208:3;11200:6;11193:4;11185:6;11181:17;11134:78;:::i;:::-;11125:87;;10941:277;10880:338;;;;:::o;11224:1509::-;11378:6;11386;11394;11402;11410;11459:3;11447:9;11438:7;11434:23;11430:33;11427:120;;;11466:79;;:::i;:::-;11427:120;11586:1;11611:53;11656:7;11647:6;11636:9;11632:22;11611:53;:::i;:::-;11601:63;;11557:117;11713:2;11739:53;11784:7;11775:6;11764:9;11760:22;11739:53;:::i;:::-;11729:63;;11684:118;11869:2;11858:9;11854:18;11841:32;11900:18;11892:6;11889:30;11886:117;;;11922:79;;:::i;:::-;11886:117;12027:78;12097:7;12088:6;12077:9;12073:22;12027:78;:::i;:::-;12017:88;;11812:303;12182:2;12171:9;12167:18;12154:32;12213:18;12205:6;12202:30;12199:117;;;12235:79;;:::i;:::-;12199:117;12340:78;12410:7;12401:6;12390:9;12386:22;12340:78;:::i;:::-;12330:88;;12125:303;12495:3;12484:9;12480:19;12467:33;12527:18;12519:6;12516:30;12513:117;;;12549:79;;:::i;:::-;12513:117;12654:62;12708:7;12699:6;12688:9;12684:22;12654:62;:::i;:::-;12644:72;;12438:288;11224:1509;;;;;;;;:::o;12739:474::-;12807:6;12815;12864:2;12852:9;12843:7;12839:23;12835:32;12832:119;;;12870:79;;:::i;:::-;12832:119;12990:1;13015:53;13060:7;13051:6;13040:9;13036:22;13015:53;:::i;:::-;13005:63;;12961:117;13117:2;13143:53;13188:7;13179:6;13168:9;13164:22;13143:53;:::i;:::-;13133:63;;13088:118;12739:474;;;;;:::o;13219:329::-;13278:6;13327:2;13315:9;13306:7;13302:23;13298:32;13295:119;;;13333:79;;:::i;:::-;13295:119;13453:1;13478:53;13523:7;13514:6;13503:9;13499:22;13478:53;:::i;:::-;13468:63;;13424:117;13219:329;;;;:::o;13554:311::-;13631:4;13721:18;13713:6;13710:30;13707:56;;;13743:18;;:::i;:::-;13707:56;13793:4;13785:6;13781:17;13773:25;;13853:4;13847;13843:15;13835:23;;13554:311;;;:::o;13888:710::-;13984:5;14009:81;14025:64;14082:6;14025:64;:::i;:::-;14009:81;:::i;:::-;14000:90;;14110:5;14139:6;14132:5;14125:21;14173:4;14166:5;14162:16;14155:23;;14226:4;14218:6;14214:17;14206:6;14202:30;14255:3;14247:6;14244:15;14241:122;;;14274:79;;:::i;:::-;14241:122;14389:6;14372:220;14406:6;14401:3;14398:15;14372:220;;;14481:3;14510:37;14543:3;14531:10;14510:37;:::i;:::-;14505:3;14498:50;14577:4;14572:3;14568:14;14561:21;;14448:144;14432:4;14427:3;14423:14;14416:21;;14372:220;;;14376:21;13990:608;;13888:710;;;;;:::o;14621:370::-;14692:5;14741:3;14734:4;14726:6;14722:17;14718:27;14708:122;;14749:79;;:::i;:::-;14708:122;14866:6;14853:20;14891:94;14981:3;14973:6;14966:4;14958:6;14954:17;14891:94;:::i;:::-;14882:103;;14698:293;14621:370;;;;:::o;14997:894::-;15115:6;15123;15172:2;15160:9;15151:7;15147:23;15143:32;15140:119;;;15178:79;;:::i;:::-;15140:119;15326:1;15315:9;15311:17;15298:31;15356:18;15348:6;15345:30;15342:117;;;15378:79;;:::i;:::-;15342:117;15483:78;15553:7;15544:6;15533:9;15529:22;15483:78;:::i;:::-;15473:88;;15269:302;15638:2;15627:9;15623:18;15610:32;15669:18;15661:6;15658:30;15655:117;;;15691:79;;:::i;:::-;15655:117;15796:78;15866:7;15857:6;15846:9;15842:22;15796:78;:::i;:::-;15786:88;;15581:303;14997:894;;;;;:::o;15897:114::-;15964:6;15998:5;15992:12;15982:22;;15897:114;;;:::o;16017:184::-;16116:11;16150:6;16145:3;16138:19;16190:4;16185:3;16181:14;16166:29;;16017:184;;;;:::o;16207:132::-;16274:4;16297:3;16289:11;;16327:4;16322:3;16318:14;16310:22;;16207:132;;;:::o;16345:108::-;16422:24;16440:5;16422:24;:::i;:::-;16417:3;16410:37;16345:108;;:::o;16459:179::-;16528:10;16549:46;16591:3;16583:6;16549:46;:::i;:::-;16627:4;16622:3;16618:14;16604:28;;16459:179;;;;:::o;16644:113::-;16714:4;16746;16741:3;16737:14;16729:22;;16644:113;;;:::o;16793:732::-;16912:3;16941:54;16989:5;16941:54;:::i;:::-;17011:86;17090:6;17085:3;17011:86;:::i;:::-;17004:93;;17121:56;17171:5;17121:56;:::i;:::-;17200:7;17231:1;17216:284;17241:6;17238:1;17235:13;17216:284;;;17317:6;17311:13;17344:63;17403:3;17388:13;17344:63;:::i;:::-;17337:70;;17430:60;17483:6;17430:60;:::i;:::-;17420:70;;17276:224;17263:1;17260;17256:9;17251:14;;17216:284;;;17220:14;17516:3;17509:10;;16917:608;;;16793:732;;;;:::o;17531:373::-;17674:4;17712:2;17701:9;17697:18;17689:26;;17761:9;17755:4;17751:20;17747:1;17736:9;17732:17;17725:47;17789:108;17892:4;17883:6;17789:108;:::i;:::-;17781:116;;17531:373;;;;:::o;17910:652::-;17987:6;17995;18044:2;18032:9;18023:7;18019:23;18015:32;18012:119;;;18050:79;;:::i;:::-;18012:119;18170:1;18195:53;18240:7;18231:6;18220:9;18216:22;18195:53;:::i;:::-;18185:63;;18141:117;18325:2;18314:9;18310:18;18297:32;18356:18;18348:6;18345:30;18342:117;;;18378:79;;:::i;:::-;18342:117;18483:62;18537:7;18528:6;18517:9;18513:22;18483:62;:::i;:::-;18473:72;;18268:287;17910:652;;;;;:::o;18568:943::-;18663:6;18671;18679;18687;18736:3;18724:9;18715:7;18711:23;18707:33;18704:120;;;18743:79;;:::i;:::-;18704:120;18863:1;18888:53;18933:7;18924:6;18913:9;18909:22;18888:53;:::i;:::-;18878:63;;18834:117;18990:2;19016:53;19061:7;19052:6;19041:9;19037:22;19016:53;:::i;:::-;19006:63;;18961:118;19118:2;19144:53;19189:7;19180:6;19169:9;19165:22;19144:53;:::i;:::-;19134:63;;19089:118;19274:2;19263:9;19259:18;19246:32;19305:18;19297:6;19294:30;19291:117;;;19327:79;;:::i;:::-;19291:117;19432:62;19486:7;19477:6;19466:9;19462:22;19432:62;:::i;:::-;19422:72;;19217:287;18568:943;;;;;;;:::o;19517:118::-;19604:24;19622:5;19604:24;:::i;:::-;19599:3;19592:37;19517:118;;:::o;19641:222::-;19734:4;19772:2;19761:9;19757:18;19749:26;;19785:71;19853:1;19842:9;19838:17;19829:6;19785:71;:::i;:::-;19641:222;;;;:::o;19869:116::-;19939:21;19954:5;19939:21;:::i;:::-;19932:5;19929:32;19919:60;;19975:1;19972;19965:12;19919:60;19869:116;:::o;19991:133::-;20034:5;20072:6;20059:20;20050:29;;20088:30;20112:5;20088:30;:::i;:::-;19991:133;;;;:::o;20130:468::-;20195:6;20203;20252:2;20240:9;20231:7;20227:23;20223:32;20220:119;;;20258:79;;:::i;:::-;20220:119;20378:1;20403:53;20448:7;20439:6;20428:9;20424:22;20403:53;:::i;:::-;20393:63;;20349:117;20505:2;20531:50;20573:7;20564:6;20553:9;20549:22;20531:50;:::i;:::-;20521:60;;20476:115;20130:468;;;;;:::o;20604:474::-;20672:6;20680;20729:2;20717:9;20708:7;20704:23;20700:32;20697:119;;;20735:79;;:::i;:::-;20697:119;20855:1;20880:53;20925:7;20916:6;20905:9;20901:22;20880:53;:::i;:::-;20870:63;;20826:117;20982:2;21008:53;21053:7;21044:6;21033:9;21029:22;21008:53;:::i;:::-;20998:63;;20953:118;20604:474;;;;;:::o;21084:1089::-;21188:6;21196;21204;21212;21220;21269:3;21257:9;21248:7;21244:23;21240:33;21237:120;;;21276:79;;:::i;:::-;21237:120;21396:1;21421:53;21466:7;21457:6;21446:9;21442:22;21421:53;:::i;:::-;21411:63;;21367:117;21523:2;21549:53;21594:7;21585:6;21574:9;21570:22;21549:53;:::i;:::-;21539:63;;21494:118;21651:2;21677:53;21722:7;21713:6;21702:9;21698:22;21677:53;:::i;:::-;21667:63;;21622:118;21779:2;21805:53;21850:7;21841:6;21830:9;21826:22;21805:53;:::i;:::-;21795:63;;21750:118;21935:3;21924:9;21920:19;21907:33;21967:18;21959:6;21956:30;21953:117;;;21989:79;;:::i;:::-;21953:117;22094:62;22148:7;22139:6;22128:9;22124:22;22094:62;:::i;:::-;22084:72;;21878:288;21084:1089;;;;;;;;:::o;22179:229::-;22319:34;22315:1;22307:6;22303:14;22296:58;22388:12;22383:2;22375:6;22371:15;22364:37;22179:229;:::o;22414:366::-;22556:3;22577:67;22641:2;22636:3;22577:67;:::i;:::-;22570:74;;22653:93;22742:3;22653:93;:::i;:::-;22771:2;22766:3;22762:12;22755:19;;22414:366;;;:::o;22786:419::-;22952:4;22990:2;22979:9;22975:18;22967:26;;23039:9;23033:4;23029:20;23025:1;23014:9;23010:17;23003:47;23067:131;23193:4;23067:131;:::i;:::-;23059:139;;22786:419;;;:::o;23211:180::-;23259:77;23256:1;23249:88;23356:4;23353:1;23346:15;23380:4;23377:1;23370:15;23397:320;23441:6;23478:1;23472:4;23468:12;23458:22;;23525:1;23519:4;23515:12;23546:18;23536:81;;23602:4;23594:6;23590:17;23580:27;;23536:81;23664:2;23656:6;23653:14;23633:18;23630:38;23627:84;;23683:18;;:::i;:::-;23627:84;23448:269;23397:320;;;:::o;23723:233::-;23863:34;23859:1;23851:6;23847:14;23840:58;23932:16;23927:2;23919:6;23915:15;23908:41;23723:233;:::o;23962:366::-;24104:3;24125:67;24189:2;24184:3;24125:67;:::i;:::-;24118:74;;24201:93;24290:3;24201:93;:::i;:::-;24319:2;24314:3;24310:12;24303:19;;23962:366;;;:::o;24334:419::-;24500:4;24538:2;24527:9;24523:18;24515:26;;24587:9;24581:4;24577:20;24573:1;24562:9;24558:17;24551:47;24615:131;24741:4;24615:131;:::i;:::-;24607:139;;24334:419;;;:::o;24759:234::-;24899:34;24895:1;24887:6;24883:14;24876:58;24968:17;24963:2;24955:6;24951:15;24944:42;24759:234;:::o;24999:366::-;25141:3;25162:67;25226:2;25221:3;25162:67;:::i;:::-;25155:74;;25238:93;25327:3;25238:93;:::i;:::-;25356:2;25351:3;25347:12;25340:19;;24999:366;;;:::o;25371:419::-;25537:4;25575:2;25564:9;25560:18;25552:26;;25624:9;25618:4;25614:20;25610:1;25599:9;25595:17;25588:47;25652:131;25778:4;25652:131;:::i;:::-;25644:139;;25371:419;;;:::o;25796:231::-;25936:34;25932:1;25924:6;25920:14;25913:58;26005:14;26000:2;25992:6;25988:15;25981:39;25796:231;:::o;26033:366::-;26175:3;26196:67;26260:2;26255:3;26196:67;:::i;:::-;26189:74;;26272:93;26361:3;26272:93;:::i;:::-;26390:2;26385:3;26381:12;26374:19;;26033:366;;;:::o;26405:419::-;26571:4;26609:2;26598:9;26594:18;26586:26;;26658:9;26652:4;26648:20;26644:1;26633:9;26629:17;26622:47;26686:131;26812:4;26686:131;:::i;:::-;26678:139;;26405:419;;;:::o;26830:231::-;26970:34;26966:1;26958:6;26954:14;26947:58;27039:14;27034:2;27026:6;27022:15;27015:39;26830:231;:::o;27067:366::-;27209:3;27230:67;27294:2;27289:3;27230:67;:::i;:::-;27223:74;;27306:93;27395:3;27306:93;:::i;:::-;27424:2;27419:3;27415:12;27408:19;;27067:366;;;:::o;27439:419::-;27605:4;27643:2;27632:9;27628:18;27620:26;;27692:9;27686:4;27682:20;27678:1;27667:9;27663:17;27656:47;27720:131;27846:4;27720:131;:::i;:::-;27712:139;;27439:419;;;:::o;27864:228::-;28004:34;28000:1;27992:6;27988:14;27981:58;28073:11;28068:2;28060:6;28056:15;28049:36;27864:228;:::o;28098:366::-;28240:3;28261:67;28325:2;28320:3;28261:67;:::i;:::-;28254:74;;28337:93;28426:3;28337:93;:::i;:::-;28455:2;28450:3;28446:12;28439:19;;28098:366;;;:::o;28470:419::-;28636:4;28674:2;28663:9;28659:18;28651:26;;28723:9;28717:4;28713:20;28709:1;28698:9;28694:17;28687:47;28751:131;28877:4;28751:131;:::i;:::-;28743:139;;28470:419;;;:::o;28895:180::-;28943:77;28940:1;28933:88;29040:4;29037:1;29030:15;29064:4;29061:1;29054:15;29081:180;29129:77;29126:1;29119:88;29226:4;29223:1;29216:15;29250:4;29247:1;29240:15;29267:233;29306:3;29329:24;29347:5;29329:24;:::i;:::-;29320:33;;29375:66;29368:5;29365:77;29362:103;;29445:18;;:::i;:::-;29362:103;29492:1;29485:5;29481:13;29474:20;;29267:233;;;:::o;29506:243::-;29646:34;29642:1;29634:6;29630:14;29623:58;29715:26;29710:2;29702:6;29698:15;29691:51;29506:243;:::o;29755:366::-;29897:3;29918:67;29982:2;29977:3;29918:67;:::i;:::-;29911:74;;29994:93;30083:3;29994:93;:::i;:::-;30112:2;30107:3;30103:12;30096:19;;29755:366;;;:::o;30127:419::-;30293:4;30331:2;30320:9;30316:18;30308:26;;30380:9;30374:4;30370:20;30366:1;30355:9;30351:17;30344:47;30408:131;30534:4;30408:131;:::i;:::-;30400:139;;30127:419;;;:::o;30552:141::-;30601:4;30624:3;30616:11;;30647:3;30644:1;30637:14;30681:4;30678:1;30668:18;30660:26;;30552:141;;;:::o;30699:93::-;30736:6;30783:2;30778;30771:5;30767:14;30763:23;30753:33;;30699:93;;;:::o;30798:107::-;30842:8;30892:5;30886:4;30882:16;30861:37;;30798:107;;;;:::o;30911:393::-;30980:6;31030:1;31018:10;31014:18;31053:97;31083:66;31072:9;31053:97;:::i;:::-;31171:39;31201:8;31190:9;31171:39;:::i;:::-;31159:51;;31243:4;31239:9;31232:5;31228:21;31219:30;;31292:4;31282:8;31278:19;31271:5;31268:30;31258:40;;30987:317;;30911:393;;;;;:::o;31310:60::-;31338:3;31359:5;31352:12;;31310:60;;;:::o;31376:142::-;31426:9;31459:53;31477:34;31486:24;31504:5;31486:24;:::i;:::-;31477:34;:::i;:::-;31459:53;:::i;:::-;31446:66;;31376:142;;;:::o;31524:75::-;31567:3;31588:5;31581:12;;31524:75;;;:::o;31605:269::-;31715:39;31746:7;31715:39;:::i;:::-;31776:91;31825:41;31849:16;31825:41;:::i;:::-;31817:6;31810:4;31804:11;31776:91;:::i;:::-;31770:4;31763:105;31681:193;31605:269;;;:::o;31880:73::-;31925:3;31880:73;:::o;31959:189::-;32036:32;;:::i;:::-;32077:65;32135:6;32127;32121:4;32077:65;:::i;:::-;32012:136;31959:189;;:::o;32154:186::-;32214:120;32231:3;32224:5;32221:14;32214:120;;;32285:39;32322:1;32315:5;32285:39;:::i;:::-;32258:1;32251:5;32247:13;32238:22;;32214:120;;;32154:186;;:::o;32346:543::-;32447:2;32442:3;32439:11;32436:446;;;32481:38;32513:5;32481:38;:::i;:::-;32565:29;32583:10;32565:29;:::i;:::-;32555:8;32551:44;32748:2;32736:10;32733:18;32730:49;;;32769:8;32754:23;;32730:49;32792:80;32848:22;32866:3;32848:22;:::i;:::-;32838:8;32834:37;32821:11;32792:80;:::i;:::-;32451:431;;32436:446;32346:543;;;:::o;32895:117::-;32949:8;32999:5;32993:4;32989:16;32968:37;;32895:117;;;;:::o;33018:169::-;33062:6;33095:51;33143:1;33139:6;33131:5;33128:1;33124:13;33095:51;:::i;:::-;33091:56;33176:4;33170;33166:15;33156:25;;33069:118;33018:169;;;;:::o;33192:295::-;33268:4;33414:29;33439:3;33433:4;33414:29;:::i;:::-;33406:37;;33476:3;33473:1;33469:11;33463:4;33460:21;33452:29;;33192:295;;;;:::o;33492:1395::-;33609:37;33642:3;33609:37;:::i;:::-;33711:18;33703:6;33700:30;33697:56;;;33733:18;;:::i;:::-;33697:56;33777:38;33809:4;33803:11;33777:38;:::i;:::-;33862:67;33922:6;33914;33908:4;33862:67;:::i;:::-;33956:1;33980:4;33967:17;;34012:2;34004:6;34001:14;34029:1;34024:618;;;;34686:1;34703:6;34700:77;;;34752:9;34747:3;34743:19;34737:26;34728:35;;34700:77;34803:67;34863:6;34856:5;34803:67;:::i;:::-;34797:4;34790:81;34659:222;33994:887;;34024:618;34076:4;34072:9;34064:6;34060:22;34110:37;34142:4;34110:37;:::i;:::-;34169:1;34183:208;34197:7;34194:1;34191:14;34183:208;;;34276:9;34271:3;34267:19;34261:26;34253:6;34246:42;34327:1;34319:6;34315:14;34305:24;;34374:2;34363:9;34359:18;34346:31;;34220:4;34217:1;34213:12;34208:17;;34183:208;;;34419:6;34410:7;34407:19;34404:179;;;34477:9;34472:3;34468:19;34462:26;34520:48;34562:4;34554:6;34550:17;34539:9;34520:48;:::i;:::-;34512:6;34505:64;34427:156;34404:179;34629:1;34625;34617:6;34613:14;34609:22;34603:4;34596:36;34031:611;;;33994:887;;33584:1303;;;33492:1395;;:::o;34893:225::-;35033:34;35029:1;35021:6;35017:14;35010:58;35102:8;35097:2;35089:6;35085:15;35078:33;34893:225;:::o;35124:366::-;35266:3;35287:67;35351:2;35346:3;35287:67;:::i;:::-;35280:74;;35363:93;35452:3;35363:93;:::i;:::-;35481:2;35476:3;35472:12;35465:19;;35124:366;;;:::o;35496:419::-;35662:4;35700:2;35689:9;35685:18;35677:26;;35749:9;35743:4;35739:20;35735:1;35724:9;35720:17;35713:47;35777:131;35903:4;35777:131;:::i;:::-;35769:139;;35496:419;;;:::o;35921:233::-;36061:34;36057:1;36049:6;36045:14;36038:58;36130:16;36125:2;36117:6;36113:15;36106:41;35921:233;:::o;36160:366::-;36302:3;36323:67;36387:2;36382:3;36323:67;:::i;:::-;36316:74;;36399:93;36488:3;36399:93;:::i;:::-;36517:2;36512:3;36508:12;36501:19;;36160:366;;;:::o;36532:419::-;36698:4;36736:2;36725:9;36721:18;36713:26;;36785:9;36779:4;36775:20;36771:1;36760:9;36756:17;36749:47;36813:131;36939:4;36813:131;:::i;:::-;36805:139;;36532:419;;;:::o;36957:85::-;37002:7;37031:5;37020:16;;36957:85;;;:::o;37048:86::-;37083:7;37123:4;37116:5;37112:16;37101:27;;37048:86;;;:::o;37140:154::-;37196:9;37229:59;37245:42;37254:32;37280:5;37254:32;:::i;:::-;37245:42;:::i;:::-;37229:59;:::i;:::-;37216:72;;37140:154;;;:::o;37300:143::-;37393:43;37430:5;37393:43;:::i;:::-;37388:3;37381:56;37300:143;;:::o;37449:234::-;37548:4;37586:2;37575:9;37571:18;37563:26;;37599:77;37673:1;37662:9;37658:17;37649:6;37599:77;:::i;:::-;37449:234;;;;:::o;37689:227::-;37829:34;37825:1;37817:6;37813:14;37806:58;37898:10;37893:2;37885:6;37881:15;37874:35;37689:227;:::o;37922:366::-;38064:3;38085:67;38149:2;38144:3;38085:67;:::i;:::-;38078:74;;38161:93;38250:3;38161:93;:::i;:::-;38279:2;38274:3;38270:12;38263:19;;37922:366;;;:::o;38294:419::-;38460:4;38498:2;38487:9;38483:18;38475:26;;38547:9;38541:4;38537:20;38533:1;38522:9;38518:17;38511:47;38575:131;38701:4;38575:131;:::i;:::-;38567:139;;38294:419;;;:::o;38719:224::-;38859:34;38855:1;38847:6;38843:14;38836:58;38928:7;38923:2;38915:6;38911:15;38904:32;38719:224;:::o;38949:366::-;39091:3;39112:67;39176:2;39171:3;39112:67;:::i;:::-;39105:74;;39188:93;39277:3;39188:93;:::i;:::-;39306:2;39301:3;39297:12;39290:19;;38949:366;;;:::o;39321:419::-;39487:4;39525:2;39514:9;39510:18;39502:26;;39574:9;39568:4;39564:20;39560:1;39549:9;39545:17;39538:47;39602:131;39728:4;39602:131;:::i;:::-;39594:139;;39321:419;;;:::o;39746:229::-;39886:34;39882:1;39874:6;39870:14;39863:58;39955:12;39950:2;39942:6;39938:15;39931:37;39746:229;:::o;39981:366::-;40123:3;40144:67;40208:2;40203:3;40144:67;:::i;:::-;40137:74;;40220:93;40309:3;40220:93;:::i;:::-;40338:2;40333:3;40329:12;40322:19;;39981:366;;;:::o;40353:419::-;40519:4;40557:2;40546:9;40542:18;40534:26;;40606:9;40600:4;40596:20;40592:1;40581:9;40577:17;40570:47;40634:131;40760:4;40634:131;:::i;:::-;40626:139;;40353:419;;;:::o;40778:191::-;40818:3;40837:20;40855:1;40837:20;:::i;:::-;40832:25;;40871:20;40889:1;40871:20;:::i;:::-;40866:25;;40914:1;40911;40907:9;40900:16;;40935:3;40932:1;40929:10;40926:36;;;40942:18;;:::i;:::-;40926:36;40778:191;;;;:::o;40975:634::-;41196:4;41234:2;41223:9;41219:18;41211:26;;41283:9;41277:4;41273:20;41269:1;41258:9;41254:17;41247:47;41311:108;41414:4;41405:6;41311:108;:::i;:::-;41303:116;;41466:9;41460:4;41456:20;41451:2;41440:9;41436:18;41429:48;41494:108;41597:4;41588:6;41494:108;:::i;:::-;41486:116;;40975:634;;;;;:::o;41615:143::-;41672:5;41703:6;41697:13;41688:22;;41719:33;41746:5;41719:33;:::i;:::-;41615:143;;;;:::o;41764:351::-;41834:6;41883:2;41871:9;41862:7;41858:23;41854:32;41851:119;;;41889:79;;:::i;:::-;41851:119;42009:1;42034:64;42090:7;42081:6;42070:9;42066:22;42034:64;:::i;:::-;42024:74;;41980:128;41764:351;;;;:::o;42121:233::-;42261:34;42257:1;42249:6;42245:14;42238:58;42330:16;42325:2;42317:6;42313:15;42306:41;42121:233;:::o;42360:366::-;42502:3;42523:67;42587:2;42582:3;42523:67;:::i;:::-;42516:74;;42599:93;42688:3;42599:93;:::i;:::-;42717:2;42712:3;42708:12;42701:19;;42360:366;;;:::o;42732:419::-;42898:4;42936:2;42925:9;42921:18;42913:26;;42985:9;42979:4;42975:20;42971:1;42960:9;42956:17;42949:47;43013:131;43139:4;43013:131;:::i;:::-;43005:139;;42732:419;;;:::o;43157:228::-;43297:34;43293:1;43285:6;43281:14;43274:58;43366:11;43361:2;43353:6;43349:15;43342:36;43157:228;:::o;43391:366::-;43533:3;43554:67;43618:2;43613:3;43554:67;:::i;:::-;43547:74;;43630:93;43719:3;43630:93;:::i;:::-;43748:2;43743:3;43739:12;43732:19;;43391:366;;;:::o;43763:419::-;43929:4;43967:2;43956:9;43952:18;43944:26;;44016:9;44010:4;44006:20;44002:1;43991:9;43987:17;43980:47;44044:131;44170:4;44044:131;:::i;:::-;44036:139;;43763:419;;;:::o;44188:182::-;44328:34;44324:1;44316:6;44312:14;44305:58;44188:182;:::o;44376:366::-;44518:3;44539:67;44603:2;44598:3;44539:67;:::i;:::-;44532:74;;44615:93;44704:3;44615:93;:::i;:::-;44733:2;44728:3;44724:12;44717:19;;44376:366;;;:::o;44748:419::-;44914:4;44952:2;44941:9;44937:18;44929:26;;45001:9;44995:4;44991:20;44987:1;44976:9;44972:17;44965:47;45029:131;45155:4;45029:131;:::i;:::-;45021:139;;44748:419;;;:::o;45173:220::-;45313:34;45309:1;45301:6;45297:14;45290:58;45382:3;45377:2;45369:6;45365:15;45358:28;45173:220;:::o;45399:366::-;45541:3;45562:67;45626:2;45621:3;45562:67;:::i;:::-;45555:74;;45638:93;45727:3;45638:93;:::i;:::-;45756:2;45751:3;45747:12;45740:19;;45399:366;;;:::o;45771:419::-;45937:4;45975:2;45964:9;45960:18;45952:26;;46024:9;46018:4;46014:20;46010:1;45999:9;45995:17;45988:47;46052:131;46178:4;46052:131;:::i;:::-;46044:139;;45771:419;;;:::o;46196:332::-;46317:4;46355:2;46344:9;46340:18;46332:26;;46368:71;46436:1;46425:9;46421:17;46412:6;46368:71;:::i;:::-;46449:72;46517:2;46506:9;46502:18;46493:6;46449:72;:::i;:::-;46196:332;;;;;:::o;46534:228::-;46674:34;46670:1;46662:6;46658:14;46651:58;46743:11;46738:2;46730:6;46726:15;46719:36;46534:228;:::o;46768:366::-;46910:3;46931:67;46995:2;46990:3;46931:67;:::i;:::-;46924:74;;47007:93;47096:3;47007:93;:::i;:::-;47125:2;47120:3;47116:12;47109:19;;46768:366;;;:::o;47140:419::-;47306:4;47344:2;47333:9;47329:18;47321:26;;47393:9;47387:4;47383:20;47379:1;47368:9;47364:17;47357:47;47421:131;47547:4;47421:131;:::i;:::-;47413:139;;47140:419;;;:::o;47565:230::-;47705:34;47701:1;47693:6;47689:14;47682:58;47774:13;47769:2;47761:6;47757:15;47750:38;47565:230;:::o;47801:366::-;47943:3;47964:67;48028:2;48023:3;47964:67;:::i;:::-;47957:74;;48040:93;48129:3;48040:93;:::i;:::-;48158:2;48153:3;48149:12;48142:19;;47801:366;;;:::o;48173:419::-;48339:4;48377:2;48366:9;48362:18;48354:26;;48426:9;48420:4;48416:20;48412:1;48401:9;48397:17;48390:47;48454:131;48580:4;48454:131;:::i;:::-;48446:139;;48173:419;;;:::o;48598:148::-;48700:11;48737:3;48722:18;;48598:148;;;;:::o;48752:173::-;48892:25;48888:1;48880:6;48876:14;48869:49;48752:173;:::o;48931:402::-;49091:3;49112:85;49194:2;49189:3;49112:85;:::i;:::-;49105:92;;49206:93;49295:3;49206:93;:::i;:::-;49324:2;49319:3;49315:12;49308:19;;48931:402;;;:::o;49339:390::-;49445:3;49473:39;49506:5;49473:39;:::i;:::-;49528:89;49610:6;49605:3;49528:89;:::i;:::-;49521:96;;49626:65;49684:6;49679:3;49672:4;49665:5;49661:16;49626:65;:::i;:::-;49716:6;49711:3;49707:16;49700:23;;49449:280;49339:390;;;;:::o;49735:167::-;49875:19;49871:1;49863:6;49859:14;49852:43;49735:167;:::o;49908:402::-;50068:3;50089:85;50171:2;50166:3;50089:85;:::i;:::-;50082:92;;50183:93;50272:3;50183:93;:::i;:::-;50301:2;50296:3;50292:12;50285:19;;49908:402;;;:::o;50316:967::-;50698:3;50720:148;50864:3;50720:148;:::i;:::-;50713:155;;50885:95;50976:3;50967:6;50885:95;:::i;:::-;50878:102;;50997:148;51141:3;50997:148;:::i;:::-;50990:155;;51162:95;51253:3;51244:6;51162:95;:::i;:::-;51155:102;;51274:3;51267:10;;50316:967;;;;;:::o;51289:98::-;51340:6;51374:5;51368:12;51358:22;;51289:98;;;:::o;51393:168::-;51476:11;51510:6;51505:3;51498:19;51550:4;51545:3;51541:14;51526:29;;51393:168;;;;:::o;51567:373::-;51653:3;51681:38;51713:5;51681:38;:::i;:::-;51735:70;51798:6;51793:3;51735:70;:::i;:::-;51728:77;;51814:65;51872:6;51867:3;51860:4;51853:5;51849:16;51814:65;:::i;:::-;51904:29;51926:6;51904:29;:::i;:::-;51899:3;51895:39;51888:46;;51657:283;51567:373;;;;:::o;51946:1053::-;52269:4;52307:3;52296:9;52292:19;52284:27;;52321:71;52389:1;52378:9;52374:17;52365:6;52321:71;:::i;:::-;52402:72;52470:2;52459:9;52455:18;52446:6;52402:72;:::i;:::-;52521:9;52515:4;52511:20;52506:2;52495:9;52491:18;52484:48;52549:108;52652:4;52643:6;52549:108;:::i;:::-;52541:116;;52704:9;52698:4;52694:20;52689:2;52678:9;52674:18;52667:48;52732:108;52835:4;52826:6;52732:108;:::i;:::-;52724:116;;52888:9;52882:4;52878:20;52872:3;52861:9;52857:19;52850:49;52916:76;52987:4;52978:6;52916:76;:::i;:::-;52908:84;;51946:1053;;;;;;;;:::o;53005:141::-;53061:5;53092:6;53086:13;53077:22;;53108:32;53134:5;53108:32;:::i;:::-;53005:141;;;;:::o;53152:349::-;53221:6;53270:2;53258:9;53249:7;53245:23;53241:32;53238:119;;;53276:79;;:::i;:::-;53238:119;53396:1;53421:63;53476:7;53467:6;53456:9;53452:22;53421:63;:::i;:::-;53411:73;;53367:127;53152:349;;;;:::o;53507:106::-;53551:8;53600:5;53595:3;53591:15;53570:36;;53507:106;;;:::o;53619:183::-;53654:3;53692:1;53674:16;53671:23;53668:128;;;53730:1;53727;53724;53709:23;53752:34;53783:1;53777:8;53752:34;:::i;:::-;53745:41;;53668:128;53619:183;:::o;53808:711::-;53847:3;53885:4;53867:16;53864:26;53893:5;53861:39;53922:20;;:::i;:::-;53997:1;53979:16;53975:24;53972:1;53966:4;53951:49;54030:4;54024:11;54129:16;54122:4;54114:6;54110:17;54107:39;54074:18;54066:6;54063:30;54047:113;54044:146;;;54175:5;;;;54044:146;54221:6;54215:4;54211:17;54257:3;54251:10;54284:18;54276:6;54273:30;54270:43;;;54306:5;;;;;;54270:43;54354:6;54347:4;54342:3;54338:14;54334:27;54413:1;54395:16;54391:24;54385:4;54381:35;54376:3;54373:44;54370:57;;;54420:5;;;;;;;54370:57;54437;54485:6;54479:4;54475:17;54467:6;54463:30;54457:4;54437:57;:::i;:::-;54510:3;54503:10;;53851:668;;;;;53808:711;;:::o;54525:239::-;54665:34;54661:1;54653:6;54649:14;54642:58;54734:22;54729:2;54721:6;54717:15;54710:47;54525:239;:::o;54770:366::-;54912:3;54933:67;54997:2;54992:3;54933:67;:::i;:::-;54926:74;;55009:93;55098:3;55009:93;:::i;:::-;55127:2;55122:3;55118:12;55111:19;;54770:366;;;:::o;55142:419::-;55308:4;55346:2;55335:9;55331:18;55323:26;;55395:9;55389:4;55385:20;55381:1;55370:9;55366:17;55359:47;55423:131;55549:4;55423:131;:::i;:::-;55415:139;;55142:419;;;:::o;55567:227::-;55707:34;55703:1;55695:6;55691:14;55684:58;55776:10;55771:2;55763:6;55759:15;55752:35;55567:227;:::o;55800:366::-;55942:3;55963:67;56027:2;56022:3;55963:67;:::i;:::-;55956:74;;56039:93;56128:3;56039:93;:::i;:::-;56157:2;56152:3;56148:12;56141:19;;55800:366;;;:::o;56172:419::-;56338:4;56376:2;56365:9;56361:18;56353:26;;56425:9;56419:4;56415:20;56411:1;56400:9;56396:17;56389:47;56453:131;56579:4;56453:131;:::i;:::-;56445:139;;56172:419;;;:::o;56597:232::-;56737:34;56733:1;56725:6;56721:14;56714:58;56806:15;56801:2;56793:6;56789:15;56782:40;56597:232;:::o;56835:366::-;56977:3;56998:67;57062:2;57057:3;56998:67;:::i;:::-;56991:74;;57074:93;57163:3;57074:93;:::i;:::-;57192:2;57187:3;57183:12;57176:19;;56835:366;;;:::o;57207:419::-;57373:4;57411:2;57400:9;57396:18;57388:26;;57460:9;57454:4;57450:20;57446:1;57435:9;57431:17;57424:47;57488:131;57614:4;57488:131;:::i;:::-;57480:139;;57207:419;;;:::o;57632:751::-;57855:4;57893:3;57882:9;57878:19;57870:27;;57907:71;57975:1;57964:9;57960:17;57951:6;57907:71;:::i;:::-;57988:72;58056:2;58045:9;58041:18;58032:6;57988:72;:::i;:::-;58070;58138:2;58127:9;58123:18;58114:6;58070:72;:::i;:::-;58152;58220:2;58209:9;58205:18;58196:6;58152:72;:::i;:::-;58272:9;58266:4;58262:20;58256:3;58245:9;58241:19;58234:49;58300:76;58371:4;58362:6;58300:76;:::i;:::-;58292:84;;57632:751;;;;;;;;:::o;58389:410::-;58429:7;58452:20;58470:1;58452:20;:::i;:::-;58447:25;;58486:20;58504:1;58486:20;:::i;:::-;58481:25;;58541:1;58538;58534:9;58563:30;58581:11;58563:30;:::i;:::-;58552:41;;58742:1;58733:7;58729:15;58726:1;58723:22;58703:1;58696:9;58676:83;58653:139;;58772:18;;:::i;:::-;58653:139;58437:362;58389:410;;;;:::o;58805:171::-;58844:3;58867:24;58885:5;58867:24;:::i;:::-;58858:33;;58913:4;58906:5;58903:15;58900:41;;58921:18;;:::i;:::-;58900:41;58968:1;58961:5;58957:13;58950:20;;58805:171;;;:::o;58982:182::-;59122:34;59118:1;59110:6;59106:14;59099:58;58982:182;:::o;59170:366::-;59312:3;59333:67;59397:2;59392:3;59333:67;:::i;:::-;59326:74;;59409:93;59498:3;59409:93;:::i;:::-;59527:2;59522:3;59518:12;59511:19;;59170:366;;;:::o;59542:419::-;59708:4;59746:2;59735:9;59731:18;59723:26;;59795:9;59789:4;59785:20;59781:1;59770:9;59766:17;59759:47;59823:131;59949:4;59823:131;:::i;:::-;59815:139;;59542:419;;;:::o;59967:147::-;60068:11;60105:3;60090:18;;59967:147;;;;:::o;60120:386::-;60224:3;60252:38;60284:5;60252:38;:::i;:::-;60306:88;60387:6;60382:3;60306:88;:::i;:::-;60299:95;;60403:65;60461:6;60456:3;60449:4;60442:5;60438:16;60403:65;:::i;:::-;60493:6;60488:3;60484:16;60477:23;;60228:278;60120:386;;;;:::o;60512:271::-;60642:3;60664:93;60753:3;60744:6;60664:93;:::i;:::-;60657:100;;60774:3;60767:10;;60512:271;;;;:::o;60789:179::-;60929:31;60925:1;60917:6;60913:14;60906:55;60789:179;:::o;60974:366::-;61116:3;61137:67;61201:2;61196:3;61137:67;:::i;:::-;61130:74;;61213:93;61302:3;61213:93;:::i;:::-;61331:2;61326:3;61322:12;61315:19;;60974:366;;;:::o;61346:419::-;61512:4;61550:2;61539:9;61535:18;61527:26;;61599:9;61593:4;61589:20;61585:1;61574:9;61570:17;61563:47;61627:131;61753:4;61627:131;:::i;:::-;61619:139;;61346:419;;;:::o
Swarm Source
ipfs://2107c948e192207e9f0613e2dee7534eee68e1372dd2c91feec3b0ed20620cdf
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.