Source Code
Overview
AVAX Balance
More Info
ContractCreator
Multichain Info
N/A
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
37766674 | 18 days ago | 0 AVAX | ||||
37766583 | 18 days ago | 0 AVAX | ||||
37766499 | 18 days ago | 0 AVAX | ||||
37766440 | 18 days ago | 0 AVAX | ||||
37766420 | 18 days ago | 0 AVAX | ||||
37766320 | 18 days ago | 0 AVAX | ||||
37766302 | 18 days ago | 0 AVAX | ||||
37766250 | 18 days ago | 0 AVAX | ||||
37766235 | 18 days ago | 0 AVAX | ||||
37766184 | 18 days ago | 0 AVAX | ||||
37766170 | 18 days ago | 0 AVAX | ||||
37766115 | 18 days ago | 0 AVAX | ||||
37766102 | 18 days ago | 0 AVAX | ||||
37766052 | 18 days ago | 0 AVAX | ||||
37766039 | 18 days ago | 0 AVAX | ||||
37766004 | 18 days ago | 0 AVAX | ||||
37765984 | 18 days ago | 0 AVAX | ||||
37765900 | 18 days ago | 0 AVAX | ||||
37765884 | 18 days ago | 0 AVAX | ||||
37765768 | 18 days ago | 0 AVAX | ||||
37765746 | 18 days ago | 0 AVAX | ||||
37765654 | 18 days ago | 0 AVAX | ||||
37765626 | 18 days ago | 0 AVAX | ||||
37765568 | 18 days ago | 0 AVAX | ||||
37765558 | 18 days ago | 0 AVAX |
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 Source Code Verified (Exact Match)
Contract Name:
Lottery
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at testnet.snowscan.xyz on 2024-12-16 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/[email protected]/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.20; /** * @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 Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 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 in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._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 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._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() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @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 { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } } } // File: @openzeppelin/[email protected]/utils/ContextUpgradeable.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/[email protected]/access/OwnableUpgradeable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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 { /// @custom:storage-location erc7201:openzeppelin.storage.Ownable struct OwnableStorage { address _owner; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300; function _getOwnableStorage() private pure returns (OwnableStorage storage $) { assembly { $.slot := OwnableStorageLocation } } /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ function __Ownable_init(address initialOwner) internal onlyInitializing { __Ownable_init_unchained(initialOwner); } function __Ownable_init_unchained(address initialOwner) internal onlyInitializing { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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) { OwnableStorage storage $ = _getOwnableStorage(); return $._owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { OwnableStorage storage $ = _getOwnableStorage(); address oldOwner = $._owner; $._owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/interfaces/draft-IERC1822.sol // OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.20; /** * @dev ERC-1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822Proxiable { /** * @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/proxy/beacon/IBeacon.sol // OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.20; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {UpgradeableBeacon} will check that this address is a contract. */ function implementation() external view returns (address); } // File: @openzeppelin/contracts/interfaces/IERC1967.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol) pragma solidity ^0.8.20; /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. */ interface IERC1967 { /** * @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/utils/Errors.sol // OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol) pragma solidity ^0.8.20; /** * @dev Collection of common custom errors used in multiple contracts * * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library. * It is recommended to avoid relying on the error API for critical functionality. * * _Available since v5.1._ */ library Errors { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error InsufficientBalance(uint256 balance, uint256 needed); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedCall(); /** * @dev The deployment failed. */ error FailedDeployment(); /** * @dev A necessary precompile is missing. */ error MissingPrecompile(address); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.1.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert Errors.InsufficientBalance(address(this).balance, amount); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert Errors.FailedCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {Errors.FailedCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert Errors.InsufficientBalance(address(this).balance, value); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case * of an unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {Errors.FailedCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}. */ function _revert(bytes memory returndata) 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 assembly ("memory-safe") { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert Errors.FailedCall(); } } } // File: @openzeppelin/contracts/utils/StorageSlot.sol // OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.20; /** * @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 ERC-1967 implementation slot: * ```solidity * contract ERC1967 { * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot. * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(newImplementation.code.length > 0); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * TIP: Consider using this library along with {SlotDerivation}. */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct Int256Slot { int256 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) { assembly ("memory-safe") { r.slot := slot } } /** * @dev Returns a `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { assembly ("memory-safe") { r.slot := slot } } /** * @dev Returns a `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { assembly ("memory-safe") { r.slot := slot } } /** * @dev Returns a `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { assembly ("memory-safe") { r.slot := slot } } /** * @dev Returns a `Int256Slot` with member `value` located at `slot`. */ function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) { assembly ("memory-safe") { r.slot := slot } } /** * @dev Returns a `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { assembly ("memory-safe") { 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) { assembly ("memory-safe") { r.slot := store.slot } } /** * @dev Returns a `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { assembly ("memory-safe") { 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) { assembly ("memory-safe") { r.slot := store.slot } } } // File: @openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol // OpenZeppelin Contracts (last updated v5.1.0) (proxy/ERC1967/ERC1967Utils.sol) pragma solidity ^0.8.21; /** * @dev This library provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots. */ library ERC1967Utils { /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev The `implementation` of the proxy is invalid. */ error ERC1967InvalidImplementation(address implementation); /** * @dev The `admin` of the proxy is invalid. */ error ERC1967InvalidAdmin(address admin); /** * @dev The `beacon` of the proxy is invalid. */ error ERC1967InvalidBeacon(address beacon); /** * @dev An upgrade function sees `msg.value > 0` that may be lost. */ error ERC1967NonPayable(); /** * @dev Returns the current implementation address. */ function getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the ERC-1967 implementation slot. */ function _setImplementation(address newImplementation) private { if (newImplementation.code.length == 0) { revert ERC1967InvalidImplementation(newImplementation); } StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Performs implementation upgrade with additional setup call if data is nonempty. * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected * to avoid stuck value in the contract. * * Emits an {IERC1967-Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) internal { _setImplementation(newImplementation); emit IERC1967.Upgraded(newImplementation); if (data.length > 0) { Address.functionDelegateCall(newImplementation, data); } else { _checkNonPayable(); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` */ function getAdmin() internal view returns (address) { return StorageSlot.getAddressSlot(ADMIN_SLOT).value; } /** * @dev Stores a new address in the ERC-1967 admin slot. */ function _setAdmin(address newAdmin) private { if (newAdmin == address(0)) { revert ERC1967InvalidAdmin(address(0)); } StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {IERC1967-AdminChanged} event. */ function changeAdmin(address newAdmin) internal { emit IERC1967.AdminChanged(getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is the keccak-256 hash of "eip1967.proxy.beacon" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function getBeacon() internal view returns (address) { return StorageSlot.getAddressSlot(BEACON_SLOT).value; } /** * @dev Stores a new beacon in the ERC-1967 beacon slot. */ function _setBeacon(address newBeacon) private { if (newBeacon.code.length == 0) { revert ERC1967InvalidBeacon(newBeacon); } StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon; address beaconImplementation = IBeacon(newBeacon).implementation(); if (beaconImplementation.code.length == 0) { revert ERC1967InvalidImplementation(beaconImplementation); } } /** * @dev Change the beacon and trigger a setup call if data is nonempty. * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected * to avoid stuck value in the contract. * * Emits an {IERC1967-BeaconUpgraded} event. * * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for * efficiency. */ function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal { _setBeacon(newBeacon); emit IERC1967.BeaconUpgraded(newBeacon); if (data.length > 0) { Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data); } else { _checkNonPayable(); } } /** * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract * if an upgrade doesn't perform an initialization call. */ function _checkNonPayable() private { if (msg.value > 0) { revert ERC1967NonPayable(); } } } // File: @openzeppelin/[email protected]/proxy/utils/UUPSUpgradeable.sol // OpenZeppelin Contracts (last updated v5.1.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.20; /** * @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. */ abstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable { /// @custom:oz-upgrades-unsafe-allow state-variable-immutable address private immutable __self = address(this); /** * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)` * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called, * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string. * If the getter returns `"5.0.0"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function * during an upgrade. */ string public constant UPGRADE_INTERFACE_VERSION = "5.0.0"; /** * @dev The call is from an unauthorized context. */ error UUPSUnauthorizedCallContext(); /** * @dev The storage `slot` is unsupported as a UUID. */ error UUPSUnsupportedProxiableUUID(bytes32 slot); /** * @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 ERC-1967) 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 ERC-1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { _checkProxy(); _; } /** * @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() { _checkNotDelegated(); _; } function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /** * @dev Implementation of the ERC-1822 {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 notDelegated returns (bytes32) { return ERC1967Utils.IMPLEMENTATION_SLOT; } /** * @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); } /** * @dev Reverts if the execution is not performed via delegatecall or the execution * context is not of a proxy with an ERC-1967 compliant implementation pointing to self. * See {_onlyProxy}. */ function _checkProxy() internal view virtual { if ( address(this) == __self || // Must be called through delegatecall ERC1967Utils.getImplementation() != __self // Must be called through an active proxy ) { revert UUPSUnauthorizedCallContext(); } } /** * @dev Reverts if the execution is performed via delegatecall. * See {notDelegated}. */ function _checkNotDelegated() internal view virtual { if (address(this) != __self) { // Must not be called through delegatecall revert UUPSUnauthorizedCallContext(); } } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call. * * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value * is expected to be the implementation slot in ERC-1967. * * Emits an {IERC1967-Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private { try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) { if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) { revert UUPSUnsupportedProxiableUUID(slot); } ERC1967Utils.upgradeToAndCall(newImplementation, data); } catch { // The implementation is not UUPS revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation); } } } // File: contracts/Lottery.sol // Compatible with OpenZeppelin Contracts ^5.0.0 pragma solidity ^0.8.22; contract Lottery is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); // setDefault(); operators[msg.sender] = true; } function initialize(address initialOwner) public initializer { __Ownable_init(initialOwner); __UUPSUpgradeable_init(); } function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} mapping(address => bool) operators; // lottery info struct LotteryCycle { bytes previousId; bytes id; uint256 index; bool isActive; uint256 totalBalances; uint256 remains; uint8[] result; uint256 expired; uint8 types; } struct LotteryInfo { uint256 totalBalances; mapping(uint256 => LotteryCycle) cycles; mapping(bytes => uint256) ids; uint256 totalCylces; } LotteryInfo public lotteries; // ticket info struct LotteryTicket { uint8[] numbers; address buyer; bool isClaimed; } struct LotteryTickets { mapping(bytes => LotteryTicket) tickets; mapping(bytes32 => uint8) amountPerDraw; } mapping(bytes => LotteryTickets) lotteryTickets; // bet info struct Bet { bool isClaimed; uint256 balance; } struct BetSide { uint256 totalBalance; uint256 totalBets; mapping(address => Bet) bets; } struct LotteryBet { mapping(uint8 => BetSide) betSide; uint256 totalBalance; uint256 remains; uint8 _sideWon; uint8 _sideLost; } mapping(bytes => LotteryBet) lotteryBets; // lottery setting struct LotterySetting { uint8 numberSetting; uint8 maximunSetting; uint256 price; mapping(uint8 => uint8) rates; } mapping(bytes => LotterySetting) public lotterySettings; mapping(uint8 => LotterySetting) public settingDefault; uint8 public betPoint; uint8 public betRate; event BuyTicketEvent( bytes _idLottery, bytes _idTicket, uint256 amount, address buyer ); event ClaimRewardEvent( bytes _idLottery, bytes _idTicket, uint256 amount, address buyer ); event PlaceBetEvent( bytes _idLottery, uint8 betSide, uint256 amount, address buyer ); event ClaimBetEvent( bytes _idLottery, uint8 betSide, uint256 amount, address buyer ); event LotteryResultEvent(bytes _idLottery); event ActiveLotteryEvent(bytes _idLottery); function placeBet(bytes memory _idLottery, uint8 _betSide) public payable { LotteryCycle memory currentLottery = getLotteryInfo(_idLottery); require(_betSide == 1 || _betSide == 2, "Not support side"); require( msg.value >= lotterySettings[_idLottery].price, "Price is wrong" ); require(currentLottery.isActive == true, "Must bet in active lottery"); require(currentLottery.types == 2, "Invalid lottery type"); require( block.timestamp <= currentLottery.expired - 60 * 15, "Lottery is closed." ); lotteryBets[_idLottery].totalBalance += msg.value; lotteryBets[_idLottery].betSide[_betSide].totalBalance += msg.value; lotteryBets[_idLottery].betSide[_betSide].totalBets++; lotteryBets[_idLottery] .betSide[_betSide] .bets[msg.sender] .balance += msg.value; lotteries.cycles[lotteries.ids[_idLottery]].totalBalances += msg.value; lotteries.totalBalances += msg.value; emit PlaceBetEvent(_idLottery, _betSide, msg.value, msg.sender); } function setDefaultMaximunSetting(uint8 types, uint8 maximunSetting) public { settingDefault[types].maximunSetting = maximunSetting; } function setDefaultPrice(uint8 types, uint256 price) public { settingDefault[types].price = price; } function setDefaultNumberSetting(uint8 types, uint8 numberSetting) public { settingDefault[types].numberSetting = numberSetting; } function claimBet(bytes memory _idLottery) public { if (lotteries.cycles[lotteries.ids[_idLottery]].types == 2) { uint8 _betSide = lotteryBets[_idLottery]._sideWon; uint8 _lostSide = lotteryBets[_idLottery]._sideLost; require( lotteryBets[_idLottery] .betSide[_betSide] .bets[msg.sender] .balance > 0, "Did not bet" ); require( lotteryBets[_idLottery] .betSide[_betSide] .bets[msg.sender] .isClaimed == false, "Already claimed" ); uint256 totalWin = lotteryBets[_idLottery] .betSide[_betSide] .totalBalance; uint256 totalLost = lotteryBets[_idLottery] .betSide[_lostSide] .totalBalance; uint256 userAmount = lotteryBets[_idLottery] .betSide[_betSide] .bets[msg.sender] .balance; uint256 prize = (((totalLost * uint256(betRate)) / 100) * userAmount) / totalWin + userAmount; lotteries.cycles[lotteries.ids[_idLottery]].remains -= prize; lotteryBets[_idLottery].remains -= prize; lotteryBets[_idLottery] .betSide[_betSide] .bets[msg.sender] .isClaimed = true; payable(msg.sender).transfer(prize); emit ClaimBetEvent(_idLottery, _betSide, prize, msg.sender); } else { revert("Not support types"); } } function getBet(bytes memory _idLottery, address addr) public view returns (uint256, uint256) { return ( lotteryBets[_idLottery].betSide[1].bets[addr].balance, lotteryBets[_idLottery].betSide[2].bets[addr].balance ); } function getLotteryBetBalance(bytes memory _idLottery) public view returns (uint256, uint256) { return ( lotteryBets[_idLottery].totalBalance, lotteryBets[_idLottery].remains ); } function getLatestLottery() public view returns (LotteryCycle memory) { require(lotteries.totalCylces > 0, "Haven't had any lottery, yet"); return lotteries.cycles[lotteries.totalCylces - 1]; } function setDefault() public { settingDefault[uint8(1)].numberSetting = 5; settingDefault[uint8(1)].maximunSetting = 50; settingDefault[uint8(1)].price = 1000000000000000; settingDefault[uint8(1)].rates[uint8(1)] = 60; settingDefault[uint8(1)].rates[uint8(2)] = 20; settingDefault[uint8(1)].rates[uint8(3)] = 10; settingDefault[uint8(2)].numberSetting = 3; settingDefault[uint8(2)].maximunSetting = 6; settingDefault[uint8(2)].price = 1000000000000000; operators[msg.sender] = true; betPoint = 9; betRate = 90; } function getLotteryResult(bytes memory _id) public view returns (uint8[] memory) { return lotteries.cycles[lotteries.ids[_id]].result; } function getLotteryInfo(bytes memory _id) public view returns (LotteryCycle memory) { return lotteries.cycles[lotteries.ids[_id]]; } function inactiveLottery(bytes memory _id) public { require(operators[msg.sender] == true, "Permission required"); if ( lotteries.cycles[lotteries.ids[_id]].isActive == true && lotteries.cycles[lotteries.ids[_id]].types == 1 ) { getRandomNumbers(_id); } if ( lotteries.cycles[lotteries.ids[_id]].isActive == true && lotteries.cycles[lotteries.ids[_id]].types == 2 ) { getRandomNumbers(_id); lotteryBets[_id].remains = lotteryBets[_id].totalBalance; uint8 result = 0; for (uint8 i = 0; i < lotterySettings[_id].numberSetting; i++) { result += lotteries.cycles[lotteries.ids[_id]].result[i]; } if (result > betPoint) { lotteryBets[_id]._sideWon = 2; lotteryBets[_id]._sideLost = 1; } else { lotteryBets[_id]._sideWon = 1; lotteryBets[_id]._sideLost = 2; } } lotteries.cycles[lotteries.ids[_id]].remains = lotteries .cycles[lotteries.ids[_id]] .totalBalances; lotteries.cycles[lotteries.ids[_id]].isActive = false; emit LotteryResultEvent(_id); } function testLottery(bytes memory _id) public onlyOwner { uint8[] memory result = new uint8[](lotterySettings[_id].numberSetting); for (uint8 i = 0; i < lotterySettings[_id].numberSetting; i++) { result[i] = (i + 2) * (i + 2); } if ( lotteries.cycles[lotteries.ids[_id]].isActive == true && lotteries.cycles[lotteries.ids[_id]].types == 2 ) { lotteryBets[_id].remains = lotteryBets[_id].totalBalance; } lotteries.cycles[lotteries.ids[_id]].result = result; lotteries.cycles[lotteries.ids[_id]].isActive = false; lotteries.cycles[lotteries.ids[_id]].remains = lotteries .cycles[lotteries.ids[_id]] .totalBalances; emit LotteryResultEvent(_id); } function activeNewLottery( bytes memory _idNew, bytes memory _idOld, uint256 expired, uint8 types ) public { require(operators[msg.sender] == true, "Permission required"); require(lotteries.ids[_idNew] == 0, "Id exists"); inactiveLottery(_idOld); uint8[] memory result; LotteryCycle memory cycle = LotteryCycle( _idOld, _idNew, lotteries.totalCylces, true, 0, 0, result, expired, types ); lotteries.cycles[lotteries.totalCylces] = cycle; lotteries.ids[_idNew] = lotteries.totalCylces; lotteries.totalCylces++; setLotterySetting(_idNew, types); emit ActiveLotteryEvent(_idNew); } function setLotterySetting(bytes memory _idLottery, uint8 types) internal { for (uint8 i = 1; i <= 3; i++) { lotterySettings[_idLottery].rates[i] = settingDefault[types].rates[ i ]; } lotterySettings[_idLottery].numberSetting = settingDefault[types] .numberSetting; lotterySettings[_idLottery].maximunSetting = settingDefault[types] .maximunSetting; lotterySettings[_idLottery].price = settingDefault[types].price; } function getLotteryRate(bytes memory _idLottery) public view returns ( uint8, uint8, uint8 ) { return ( lotterySettings[_idLottery].rates[1], lotterySettings[_idLottery].rates[2], lotterySettings[_idLottery].rates[3] ); } function getDefaultLotteryRate(uint8 types) public view returns ( uint8, uint8, uint8 ) { return ( settingDefault[types].rates[1], settingDefault[types].rates[2], settingDefault[types].rates[3] ); } function claimReward( bytes memory _idLottery, bytes memory _idTicket, uint8 total ) public { require( lotteryTickets[_idLottery].tickets[_idTicket].buyer == msg.sender, "Not buyer" ); require( lotteryTickets[_idLottery].tickets[_idTicket].isClaimed == false, "Already claimed" ); uint8[] memory numbers = lotteryTickets[_idLottery] .tickets[_idTicket] .numbers; if (lotteries.cycles[lotteries.ids[_idLottery]].types == 1) { uint8[] memory result = lotteries .cycles[lotteries.ids[_idLottery]] .result; uint8 numberMatched = compare2Arrays(result, numbers); require(numberMatched > 3, "Incapable of claiming"); uint8 rate = lotterySettings[_idLottery].rates[ uint8(result.length) - numberMatched + 1 ]; require(rate > 0, "Incapable of claiming reward"); uint256 numberPerDraw = getQuantityOfDrawPerLottery( _idLottery, numbers ); require(numberPerDraw <= total, "Wrong total won"); uint256 prize = ((uint256( lotteries.cycles[lotteries.ids[_idLottery]].totalBalances ) * uint256(rate)) / 100) / uint256(total); lotteries.cycles[lotteries.ids[_idLottery]].remains -= prize; lotteries.totalBalances -= prize; lotteryTickets[_idLottery].tickets[_idTicket].isClaimed = true; payable(msg.sender).transfer(prize); emit ClaimRewardEvent(_idLottery, _idTicket, prize, msg.sender); } else { revert("Not support lottery type"); } } function buyTicket( bytes memory _idLottery, bytes memory _idTicket, uint8[] memory numbers ) public payable { LotteryCycle memory currentLottery = getLotteryInfo(_idLottery); require( msg.value == lotterySettings[_idLottery].price, "Price is wrong" ); require(currentLottery.isActive == true, "Must buy in active lottery"); require(currentLottery.types == 1, "Invalid lottery type"); require( block.timestamp <= currentLottery.expired - 60 * 15, "Lottery is closed." ); require( numbers.length == lotterySettings[_idLottery].numberSetting, "Number in ticket is invalid" ); require( checkDuplicate(numbers, uint8(numbers.length)) == false, "Number in ticket must not duplicated" ); LotteryTicket memory ticket = LotteryTicket(numbers, msg.sender, false); bytes32 numberPerDraw = keccak256(abi.encodePacked(numbers)); lotteryTickets[_idLottery].amountPerDraw[numberPerDraw]++; lotteryTickets[_idLottery].tickets[_idTicket] = ticket; lotteries.cycles[lotteries.ids[_idLottery]].totalBalances += msg.value; // lotteries.cycles[lotteries.ids[_idLottery]].remains += msg.value; lotteries.totalBalances += msg.value; emit BuyTicketEvent(_idLottery, _idTicket, msg.value, msg.sender); } function getQuantityOfDrawPerLottery( bytes memory _id, uint8[] memory numbers ) internal view returns (uint8) { require( numbers.length == lotterySettings[_id].numberSetting, "Number in ticket is invalid" ); bytes32 numberPerDraw = keccak256(abi.encodePacked(numbers)); return lotteryTickets[_id].amountPerDraw[numberPerDraw]; } function getLotteryTicket(bytes memory _idLottery, bytes memory _idTicket) public view returns (LotteryTicket memory) { return lotteryTickets[_idLottery].tickets[_idTicket]; } function getRandomNumbers(bytes memory _id) internal returns (uint8[] memory) { LotteryCycle memory currentLottery = getLotteryInfo(_id); // require(currentLottery.isActive == true); uint8[] memory result = new uint8[](lotterySettings[_id].numberSetting); // uint8 tmp; for (uint8 i = 0; i < lotterySettings[_id].numberSetting; i++) { result[i] = uint8( random( currentLottery.id, i, lotterySettings[_id].maximunSetting ) ); if (currentLottery.types == 1) { while (checkDuplicate(result, i + 1) == true) { result[i] = uint8( random( currentLottery.id, i, lotterySettings[_id].maximunSetting ) ); } } } quickSort(result, uint8(0), uint8(result.length - 1)); lotteries.cycles[lotteries.ids[currentLottery.id]].result = result; return result; } function random( bytes memory _id, uint256 ind, uint8 maximunNumber ) internal view returns (uint256) { return ((uint256( keccak256( abi.encodePacked( block.prevrandao, _id, block.timestamp, ind ) ) ) % uint256( keccak256( abi.encodePacked( _id, block.prevrandao, block.timestamp, ind++ ) ) )) % uint256(maximunNumber)) + uint256(1); } function quickSort( uint8[] memory arr, uint8 left, uint8 right ) internal pure { uint8 i = left; uint8 j = right; if (i == j) return; uint8 pivot = arr[uint8(left + (right - left) / 2)]; while (i <= j) { while (arr[uint8(i)] < pivot) i++; while (pivot < arr[uint8(j)]) j--; if (i <= j) { (arr[uint8(i)], arr[uint8(j)]) = (arr[uint8(j)], arr[uint8(i)]); i++; j--; } } if (left < j) quickSort(arr, left, j); if (i < right) quickSort(arr, i, right); } function checkDuplicate(uint8[] memory arr, uint8 length) internal pure returns (bool) { for (uint8 i = 0; i < length - 1; i++) { for (uint8 j = i + 1; j < length; j++) { if (arr[i] == arr[j] && arr[j] > 0) return true; } } return false; } function compare2Arrays(uint8[] memory arr1, uint8[] memory arr2) internal pure returns (uint8) { uint8 amount = 0; for (uint8 i = 0; i < arr1.length; i++) { for (uint8 j = 0; j < arr2.length; j++) { if (arr1[i] == arr2[j]) { amount++; break; } } } return amount; } receive() external payable {} fallback() external payable {} }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_idLottery","type":"bytes"}],"name":"ActiveLotteryEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_idLottery","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_idTicket","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"BuyTicketEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_idLottery","type":"bytes"},{"indexed":false,"internalType":"uint8","name":"betSide","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"ClaimBetEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_idLottery","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_idTicket","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"ClaimRewardEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_idLottery","type":"bytes"}],"name":"LotteryResultEvent","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":false,"internalType":"bytes","name":"_idLottery","type":"bytes"},{"indexed":false,"internalType":"uint8","name":"betSide","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"PlaceBetEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_idNew","type":"bytes"},{"internalType":"bytes","name":"_idOld","type":"bytes"},{"internalType":"uint256","name":"expired","type":"uint256"},{"internalType":"uint8","name":"types","type":"uint8"}],"name":"activeNewLottery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"betPoint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"betRate","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_idLottery","type":"bytes"},{"internalType":"bytes","name":"_idTicket","type":"bytes"},{"internalType":"uint8[]","name":"numbers","type":"uint8[]"}],"name":"buyTicket","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_idLottery","type":"bytes"}],"name":"claimBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_idLottery","type":"bytes"},{"internalType":"bytes","name":"_idTicket","type":"bytes"},{"internalType":"uint8","name":"total","type":"uint8"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_idLottery","type":"bytes"},{"internalType":"address","name":"addr","type":"address"}],"name":"getBet","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"types","type":"uint8"}],"name":"getDefaultLotteryRate","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestLottery","outputs":[{"components":[{"internalType":"bytes","name":"previousId","type":"bytes"},{"internalType":"bytes","name":"id","type":"bytes"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"totalBalances","type":"uint256"},{"internalType":"uint256","name":"remains","type":"uint256"},{"internalType":"uint8[]","name":"result","type":"uint8[]"},{"internalType":"uint256","name":"expired","type":"uint256"},{"internalType":"uint8","name":"types","type":"uint8"}],"internalType":"struct Lottery.LotteryCycle","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_idLottery","type":"bytes"}],"name":"getLotteryBetBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_id","type":"bytes"}],"name":"getLotteryInfo","outputs":[{"components":[{"internalType":"bytes","name":"previousId","type":"bytes"},{"internalType":"bytes","name":"id","type":"bytes"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"totalBalances","type":"uint256"},{"internalType":"uint256","name":"remains","type":"uint256"},{"internalType":"uint8[]","name":"result","type":"uint8[]"},{"internalType":"uint256","name":"expired","type":"uint256"},{"internalType":"uint8","name":"types","type":"uint8"}],"internalType":"struct Lottery.LotteryCycle","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_idLottery","type":"bytes"}],"name":"getLotteryRate","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_id","type":"bytes"}],"name":"getLotteryResult","outputs":[{"internalType":"uint8[]","name":"","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_idLottery","type":"bytes"},{"internalType":"bytes","name":"_idTicket","type":"bytes"}],"name":"getLotteryTicket","outputs":[{"components":[{"internalType":"uint8[]","name":"numbers","type":"uint8[]"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"bool","name":"isClaimed","type":"bool"}],"internalType":"struct Lottery.LotteryTicket","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_id","type":"bytes"}],"name":"inactiveLottery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lotteries","outputs":[{"internalType":"uint256","name":"totalBalances","type":"uint256"},{"internalType":"uint256","name":"totalCylces","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"lotterySettings","outputs":[{"internalType":"uint8","name":"numberSetting","type":"uint8"},{"internalType":"uint8","name":"maximunSetting","type":"uint8"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_idLottery","type":"bytes"},{"internalType":"uint8","name":"_betSide","type":"uint8"}],"name":"placeBet","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setDefault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"types","type":"uint8"},{"internalType":"uint8","name":"maximunSetting","type":"uint8"}],"name":"setDefaultMaximunSetting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"types","type":"uint8"},{"internalType":"uint8","name":"numberSetting","type":"uint8"}],"name":"setDefaultNumberSetting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"types","type":"uint8"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setDefaultPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"settingDefault","outputs":[{"internalType":"uint8","name":"numberSetting","type":"uint8"},{"internalType":"uint8","name":"maximunSetting","type":"uint8"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_id","type":"bytes"}],"name":"testLottery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","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"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a060405230608052348015610013575f80fd5b5061001c61003a565b335f908152602081905260409020805460ff191660011790556100ec565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561008a5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100e95780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b60805161436a6101125f395f8181612a6201528181612a8b0152612bc6015261436a5ff3fe608060405260043610610168575f3560e01c806307f90e5d146101715780630c3081a0146101a55780630ecd4db4146101d0578063104429d2146101fc57806318ef333e14610228578063237af4f61461038d5780632752ea0f146103bf5780634d14ae0b1461041e5780634f1ef2861461043d57806352d1902d14610450578063540cee47146104725780635439d383146104b55780636a574857146104d45780636ac46541146104f55780636decafdd14610513578063715018a6146105325780637773c263146105465780638792a6b7146105815780638da5cb5b146105a05780638fc9e5d6146105c157806391c798ad1461060c578063a954f3a31461061f578063ad353ad014610678578063ad3cb1cc1461068b578063bd4b2778146106c8578063c4d66de8146106e7578063c6b13a1d14610706578063eb9bd93014610725578063f26dbaf21461076a578063f2fde38b14610789578063f915dd03146107a857005b3661016f57005b005b34801561017c575f80fd5b5060015460045461018b919082565b604080519283526020830191909152015b60405180910390f35b3480156101b0575f80fd5b506009546101be9060ff1681565b60405160ff909116815260200161019c565b3480156101db575f80fd5b506101ef6101ea366004613847565b6107c7565b60405161019c9190613880565b348015610207575f80fd5b5061021b6102163660046138c5565b610871565b60405161019c9190613965565b348015610233575f80fd5b507fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f805461ffff199081166132051790915566038d7ea4c680007fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac5608190557f62c36c7b9eb92de142b453b3be754ee82962e75b4be0f148d64d0d97ce01b4388054603c60ff19918216179091557f3400cc00b85a211cd66d8a267994a001c893410d0a9bc0178c2a697d8f854fb8805460149083161790557fcf9c632b6a08f245cd49c144783e845d1275ed45bd7fba6a86d55688c4fb15dd8054600a9083161790557f6add646517a5b0f6793cd5891b7937d28a5b2981a5d88ebc7cd776088fea9041805484166106031790557f6add646517a5b0f6793cd5891b7937d28a5b2981a5d88ebc7cd776088fea904291909155335f9081526020819052604090208054909116600117905560098054909116615a09179055005b348015610398575f80fd5b5061016f6103a73660046139c2565b60ff9091165f90815260086020526040902060010155565b3480156103ca575f80fd5b506103fe6103d93660046139ea565b60086020525f90815260409020805460019091015460ff808316926101009004169083565b6040805160ff94851681529390921660208401529082015260600161019c565b348015610429575f80fd5b5061018b610438366004613a19565b610966565b61016f61044b366004613a63565b6109fe565b34801561045b575f80fd5b50610464610a1d565b60405190815260200161019c565b34801561047d575f80fd5b5061049161048c366004613847565b610a38565b6040805160ff9485168152928416602084015292169181019190915260600161019c565b3480156104c0575f80fd5b5061016f6104cf366004613a97565b610ae3565b3480156104df575f80fd5b506104e8611087565b60405161019c9190613b37565b348015610500575f80fd5b506009546101be90610100900460ff1681565b34801561051e575f80fd5b5061016f61052d366004613847565b6112f1565b34801561053d575f80fd5b5061016f611731565b348015610551575f80fd5b5061016f610560366004613be5565b60ff9182165f908152600860205260409020805460ff191691909216179055565b34801561058c575f80fd5b5061016f61059b366004613847565b611744565b3480156105ab575f80fd5b506105b4611a3b565b60405161019c9190613c0d565b3480156105cc575f80fd5b506103fe6105db366004613847565b80516020818301810180516007825292820191909301209152805460019091015460ff808316926101009004169083565b61016f61061a366004613c21565b611a55565b34801561062a575f80fd5b506104916106393660046139ea565b60ff9081165f90815260086020908152604080832060018452600290810190925280832054918352808320546003845292205490831693918316921690565b61016f610686366004613d22565b611dca565b348015610696575f80fd5b506106bb604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161019c9190613d63565b3480156106d3575f80fd5b5061018b6106e2366004613847565b6120cc565b3480156106f2575f80fd5b5061016f610701366004613d75565b61211b565b348015610711575f80fd5b5061016f610720366004613d8e565b612215565b348015610730575f80fd5b5061016f61073f366004613be5565b60ff9182165f9081526008602052604090208054929091166101000261ff0019909216919091179055565b348015610775575f80fd5b506104e8610784366004613847565b612419565b348015610794575f80fd5b5061016f6107a3366004613d75565b612647565b3480156107b3575f80fd5b5061016f6107c2366004613847565b612684565b6060600180015f6001600201846040516107e19190613e21565b90815260200160405180910390205481526020019081526020015f2060060180548060200260200160405190810160405280929190818152602001828054801561086557602002820191905f5260205f20905f905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116108365790505b50505050509050919050565b604080516060808201835281525f6020820181905281830152905160059061089a908590613e21565b908152604051908190036020018120906108b5908490613e21565b9081526040805191829003602090810183208054608092810285018301909352606084018381529092849284919084018282801561092d57602002820191905f5260205f20905f905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116108fe5790505b5050509183525050600191909101546001600160a01b0381166020830152600160a01b900460ff16151560409091015290505b92915050565b5f806006846040516109789190613e21565b90815260408051918290036020908101832060015f8181529183528382206001600160a01b0389168352600201909252919091200154906006906109bd908790613e21565b9081526040805191829003602090810190922060025f8181529184528282206001600160a01b03891683520190925290206001015490925090509250929050565b610a06612a57565b610a0f82612afb565b610a198282612b03565b5050565b5f610a26612bbb565b505f8051602061431583398151915290565b5f805f600784604051610a4b9190613e21565b90815260408051918290036020908101832060015f9081526002909101909152205460ff1690600790610a7f908790613e21565b90815260408051918290036020908101832060025f8181529101909152205460ff1690600790610ab0908890613e21565b908152604080516020928190038301902060035f9081526002909101909252902054919690955060ff9091169350915050565b336001600160a01b0316600584604051610afd9190613e21565b90815260405190819003602001812090610b18908590613e21565b908152604051908190036020019020600101546001600160a01b031614610b725760405162461bcd60e51b81526020600482015260096024820152682737ba10313abcb2b960b91b60448201526064015b60405180910390fd5b600583604051610b829190613e21565b90815260405190819003602001812090610b9d908490613e21565b9081526040519081900360200190206001015460ff600160a01b9091041615610bd85760405162461bcd60e51b8152600401610b6990613e2c565b5f600584604051610be99190613e21565b90815260405190819003602001812090610c04908590613e21565b9081526040805191829003602090810183208054808302850183019093528284529190830182828015610c7157602002820191905f5260205f20905f905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610c425790505b50505050509050600180015f600160020186604051610c909190613e21565b908152604080516020928190038301902054835290820192909252015f206008015460ff1660010361103e575f600180015f600160020187604051610cd59190613e21565b90815260200160405180910390205481526020019081526020015f20600601805480602002602001604051908101604052809291908181526020018280548015610d5957602002820191905f5260205f20905f905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610d2a5790505b505050505090505f610d6b8284612c04565b905060038160ff1611610db85760405162461bcd60e51b8152602060048201526015602482015274496e63617061626c65206f6620636c61696d696e6760581b6044820152606401610b69565b5f600787604051610dc99190613e21565b90815260200160405180910390206002015f838551610de89190613e69565b610df3906001613e82565b60ff908116825260208201929092526040015f205416905080610e575760405162461bcd60e51b815260206004820152601c60248201527b125b98d85c18589b19481bd98818db185a5b5a5b99c81c995dd85c9960221b6044820152606401610b69565b5f610e628886612ca6565b60ff1690508560ff16811115610eac5760405162461bcd60e51b815260206004820152600f60248201526e2bb937b733903a37ba30b6103bb7b760891b6044820152606401610b69565b5f8660ff1660648460ff16600180015f60016002018e604051610ecf9190613e21565b90815260200160405180910390205481526020019081526020015f2060040154610ef99190613e9b565b610f039190613ec6565b610f0d9190613ec6565b905080600180015f60016002018c604051610f289190613e21565b90815260200160405180910390205481526020019081526020015f206005015f828254610f559190613ed9565b9091555050600180548291905f90610f6e908490613ed9565b92505081905550600160058a604051610f879190613e21565b90815260405190819003602001812090610fa2908b90613e21565b9081526040519081900360200181206001018054921515600160a01b0260ff60a01b1990931692909217909155339082156108fc029083905f818181858888f19350505050158015610ff6573d5f803e3d5ffd5b507f7a27c602d162c4b709ce3482164f6ba3bfd7189dfd71aa828b2970ce1466b7988989833360405161102c9493929190613eec565b60405180910390a15050505050611081565b60405162461bcd60e51b81526020600482015260186024820152774e6f7420737570706f7274206c6f7474657279207479706560401b6044820152606401610b69565b50505050565b61108f613698565b6004546110dd5760405162461bcd60e51b815260206004820152601c60248201527b12185d995b89dd081a185908185b9e481b1bdd1d195c9e4b081e595d60221b6044820152606401610b69565b6004546002905f906110f190600190613ed9565b81526020019081526020015f20604051806101200160405290815f8201805461111990613f32565b80601f016020809104026020016040519081016040528092919081815260200182805461114590613f32565b80156111905780601f1061116757610100808354040283529160200191611190565b820191905f5260205f20905b81548152906001019060200180831161117357829003601f168201915b505050505081526020016001820180546111a990613f32565b80601f01602080910402602001604051908101604052809291908181526020018280546111d590613f32565b80156112205780601f106111f757610100808354040283529160200191611220565b820191905f5260205f20905b81548152906001019060200180831161120357829003601f168201915b5050505050815260200160028201548152602001600382015f9054906101000a900460ff161515151581526020016004820154815260200160058201548152602001600682018054806020026020016040519081016040528092919081815260200182805480156112cb57602002820191905f5260205f20905f905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161129c5790505b50505091835250506007820154602082015260089091015460ff16604090910152919050565b335f9081526020819052604090205460ff1615156001146113245760405162461bcd60e51b8152600401610b6990613f6a565b6040516002905f9060039061133a908590613e21565b9081526040805191829003602090810190922054835290820192909252015f206003015460ff16151560011480156113ae57506040516002905f90600390611383908590613e21565b9081526040805191829003602090810190922054835290820192909252015f206008015460ff166001145b156113be576113bc81612d4d565b505b6040516002905f906003906113d4908590613e21565b9081526040805191829003602090810190922054835290820192909252015f206003015460ff161515600114801561144657506040516002905f9060039061141d908590613e21565b908152604080516020928190038301902054835290820192909252015f206008015460ff166002145b1561164b5761145481612d4d565b506006816040516114659190613e21565b9081526020016040518091039020600101546006826040516114879190613e21565b908152604051908190036020019020600201555f805b6007836040516114ad9190613e21565b9081526040519081900360200190205460ff9081169082161015611547576040516002905f906003906114e1908790613e21565b90815260200160405180910390205481526020019081526020015f206006018160ff168154811061151457611514613f97565b905f5260205f2090602091828204019190069054906101000a900460ff168261153d9190613e82565b915060010161149d565b5060095460ff90811690821611156115d357600260068360405161156b9190613e21565b90815260200160405180910390206003015f6101000a81548160ff021916908360ff16021790555060016006836040516115a59190613e21565b908152602001604051809103902060030160016101000a81548160ff021916908360ff160217905550611649565b60016006836040516115e59190613e21565b90815260200160405180910390206003015f6101000a81548160ff021916908360ff160217905550600260068360405161161f9190613e21565b908152602001604051809103902060030160016101000a81548160ff021916908360ff1602179055505b505b6040516002905f90600390611661908590613e21565b90815260200160405180910390205481526020019081526020015f2060040154600180015f6001600201846040516116999190613e21565b90815260200160405180910390205481526020019081526020015f20600501819055505f600180015f6001600201846040516116d59190613e21565b90815260200160405180910390205481526020019081526020015f206003015f6101000a81548160ff0219169083151502179055505f805160206142f5833981519152816040516117269190613d63565b60405180910390a150565b611739612f37565b6117425f612f69565b565b61174c612f37565b5f60078260405161175d9190613e21565b9081526040519081900360200190205460ff166001600160401b0381111561178757611787613798565b6040519080825280602002602001820160405280156117b0578160200160208202803683370190505b5090505f5b6007836040516117c59190613e21565b9081526040519081900360200190205460ff9081169082161015611832576117ee816002613e82565b6117f9826002613e82565b6118039190613fab565b828260ff168151811061181857611818613f97565b60ff909216602092830291909101909101526001016117b5565b506040516002905f90600390611849908690613e21565b9081526040805191829003602090810190922054835290820192909252015f206003015460ff16151560011480156118bb57506040516002905f90600390611892908690613e21565b908152604080516020928190038301902054835290820192909252015f206008015460ff166002145b15611906576006826040516118d09190613e21565b9081526020016040518091039020600101546006836040516118f29190613e21565b908152604051908190036020019020600201555b80600180015f60016002018560405161191f9190613e21565b90815260200160405180910390205481526020019081526020015f2060060190805190602001906119519291906136e3565b505f600180015f60016002018560405161196b9190613e21565b90815260200160405180910390205481526020019081526020015f206003015f6101000a81548160ff021916908315150217905550600180015f6001600201846040516119b89190613e21565b90815260200160405180910390205481526020019081526020015f2060040154600180015f6001600201856040516119f09190613e21565b90815260200160405180910390205481526020019081526020015f20600501819055505f805160206142f583398151915282604051611a2f9190613d63565b60405180910390a15050565b5f80611a45612fc3565b546001600160a01b031692915050565b5f611a5f84612419565b9050600784604051611a719190613e21565b9081526020016040518091039020600101543414611aa15760405162461bcd60e51b8152600401610b6990613fce565b60608101511515600114611af45760405162461bcd60e51b815260206004820152601a6024820152794d7573742062757920696e20616374697665206c6f747465727960301b6044820152606401610b69565b80610100015160ff16600114611b1c5760405162461bcd60e51b8152600401610b6990613ff6565b6103848160e00151611b2e9190613ed9565b421115611b4d5760405162461bcd60e51b8152600401610b6990614024565b600784604051611b5d9190613e21565b90815260405190819003602001902054825160ff90911614611b915760405162461bcd60e51b8152600401610b6990614050565b611b9c828351612fe7565b15611bf55760405162461bcd60e51b8152602060048201526024808201527f4e756d62657220696e207469636b6574206d757374206e6f74206475706c6963604482015263185d195960e21b6064820152608401610b69565b60408051606081018252838152336020808301919091525f8284018190529251919291611c2491869101614085565b604051602081830303815290604052805190602001209050600586604051611c4c9190613e21565b90815260408051602092819003830190205f84815260019091019092528120805460ff1691611c7a836140bd565b91906101000a81548160ff021916908360ff1602179055505081600587604051611ca49190613e21565b90815260405190819003602001812090611cbf908890613e21565b90815260200160405180910390205f820151815f019080519060200190611ce79291906136e3565b506020820151600190910180546040938401511515600160a01b026001600160a81b03199091166001600160a01b03909316929092179190911790555134906002905f90600390611d39908b90613e21565b90815260200160405180910390205481526020019081526020015f206004015f828254611d6691906140db565b9091555050600180543491905f90611d7f9084906140db565b90915550506040517f685d93f4f12667f354fbd6ae71a219c489dfc9dc1b150cdf284b20c169107b6590611dba908890889034903390613eec565b60405180910390a1505050505050565b5f611dd483612419565b90508160ff1660011480611deb57508160ff166002145b611e2a5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420737570706f7274207369646560801b6044820152606401610b69565b600783604051611e3a9190613e21565b908152602001604051809103902060010154341015611e6b5760405162461bcd60e51b8152600401610b6990613fce565b60608101511515600114611ebe5760405162461bcd60e51b815260206004820152601a6024820152794d7573742062657420696e20616374697665206c6f747465727960301b6044820152606401610b69565b80610100015160ff16600214611ee65760405162461bcd60e51b8152600401610b6990613ff6565b6103848160e00151611ef89190613ed9565b421115611f175760405162461bcd60e51b8152600401610b6990614024565b34600684604051611f289190613e21565b90815260200160405180910390206001015f828254611f4791906140db565b9250508190555034600684604051611f5f9190613e21565b908152604080516020928190038301902060ff86165f908152925281208054909190611f8c9084906140db565b9091555050604051600690611fa2908590613e21565b908152604080516020928190038301902060ff85165f90815292528120600101805491611fce836140ee565b919050555034600684604051611fe49190613e21565b908152604080516020928190038301902060ff86165f908152908352818120338252600201909252812060010180549091906120219084906140db565b909155505060405134906002905f9060039061203e908890613e21565b90815260200160405180910390205481526020019081526020015f206004015f82825461206b91906140db565b9091555050600180543491905f906120849084906140db565b90915550506040517f927410d4983cb656119cee7e53725ad723beaa5f0869443db71e37877b5ba750906120bf908590859034903390614106565b60405180910390a1505050565b5f806006836040516120de9190613e21565b9081526020016040518091039020600101546006846040516121009190613e21565b90815260200160405180910390206002015491509150915091565b5f6121246130b4565b805490915060ff600160401b82041615906001600160401b03165f8115801561214a5750825b90505f826001600160401b031660011480156121655750303b155b905081158015612173575080155b156121915760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b031916600117855583156121ba57845460ff60401b1916600160401b1785555b6121c3866130d8565b6121cb6130e9565b831561220d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602001611dba565b505050505050565b335f9081526020819052604090205460ff1615156001146122485760405162461bcd60e51b8152600401610b6990613f6a565b604051600390612259908690613e21565b9081526020016040518091039020545f146122a25760405162461bcd60e51b815260206004820152600960248201526849642065786973747360b81b6044820152606401610b69565b6122ab836112f1565b6040805161012081018252848152602080820187905260045482840181905260016060848101919091525f6080850181905260a0850181905260c0850182905260e0850188905260ff871661010086015291825260029092529290922081518291908190612319908261418b565b506020820151600182019061232e908261418b565b5060408201516002820155606082015160038201805460ff19169115159190911790556080820151600482015560a0820151600582015560c082015180516123809160068401916020909101906136e3565b5060e08201516007820155610100909101516008909101805460ff191660ff9092169190911790556004546040516003906123bc908990613e21565b9081526040519081900360200190205560048054905f6123db836140ee565b91905055506123ea86846130f1565b7f2acba6155688eb695b1421897ed186bdf25c26584651199a0258c98969b1a2e186604051611dba9190613d63565b612421613698565b6040516002905f90600390612437908690613e21565b90815260200160405180910390205481526020019081526020015f20604051806101200160405290815f8201805461246e90613f32565b80601f016020809104026020016040519081016040528092919081815260200182805461249a90613f32565b80156124e55780601f106124bc576101008083540402835291602001916124e5565b820191905f5260205f20905b8154815290600101906020018083116124c857829003601f168201915b505050505081526020016001820180546124fe90613f32565b80601f016020809104026020016040519081016040528092919081815260200182805461252a90613f32565b80156125755780601f1061254c57610100808354040283529160200191612575565b820191905f5260205f20905b81548152906001019060200180831161255857829003601f168201915b5050505050815260200160028201548152602001600382015f9054906101000a900460ff1615151515815260200160048201548152602001600582015481526020016006820180548060200260200160405190810160405280929190818152602001828054801561262057602002820191905f5260205f20905f905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116125f15790505b50505091835250506007820154602082015260089091015460ff1660409091015292915050565b61264f612f37565b6001600160a01b038116612678575f604051631e4fbdf760e01b8152600401610b699190613c0d565b61268181612f69565b50565b6040516002905f9060039061269a908590613e21565b908152604080516020928190038301902054835290820192909252015f206008015460ff16600203612a1b575f6006826040516126d79190613e21565b9081526040519081900360200181206003015460ff1691505f906006906126ff908590613e21565b9081526040519081900360200181206003015460ff6101009091041691505f9060069061272d908690613e21565b908152604080516020928190038301902060ff86165f908152908352818120338252600201909252902060010154116127965760405162461bcd60e51b815260206004820152600b60248201526a111a59081b9bdd0818995d60aa1b6044820152606401610b69565b6006836040516127a69190613e21565b908152604080516020928190038301902060ff8581165f908152918452828220338352600201909352205416156127ef5760405162461bcd60e51b8152600401610b6990613e2c565b5f6006846040516128009190613e21565b908152604080516020928190038301812060ff87165f908152935290822054925060069061282f908790613e21565b908152604080516020928190038301812060ff87165f908152935290822054925060069061285e908890613e21565b908152604080516020928190038301902060ff8881165f9081529184528282203383526002019093529081206001015460095490935090918391869183916064916128af9161010090041688613e9b565b6128b99190613ec6565b6128c39190613e9b565b6128cd9190613ec6565b6128d791906140db565b905080600180015f60016002018a6040516128f29190613e21565b90815260200160405180910390205481526020019081526020015f206005015f82825461291f9190613ed9565b92505081905550806006886040516129379190613e21565b90815260200160405180910390206002015f8282546129569190613ed9565b92505081905550600160068860405161296f9190613e21565b90815260408051918290036020908101832060ff8b165f908152908252828120338083526002909101909252918220805494151560ff199095169490941790935583156108fc02918491818181858888f193505050501580156129d4573d5f803e3d5ffd5b507f485ab67dc7e970d83bab57928925ea2c43b32b23b974ae0715f1b3b74b21d06687878333604051612a0a9493929190614106565b60405180910390a150505050505050565b60405162461bcd60e51b81526020600482015260116024820152704e6f7420737570706f727420747970657360781b6044820152606401610b69565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480612add57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612ad15f80516020614315833981519152546001600160a01b031690565b6001600160a01b031614155b156117425760405163703e46dd60e11b815260040160405180910390fd5b612681612f37565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612b5d575060408051601f3d908101601f19168201909252612b5a91810190614245565b60015b612b7c5781604051634c9c8ce360e01b8152600401610b699190613c0d565b5f805160206143158339815191528114612bac57604051632a87526960e21b815260048101829052602401610b69565b612bb68383613246565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146117425760405163703e46dd60e11b815260040160405180910390fd5b5f80805b84518160ff161015612c9e575f5b84518160ff161015612c8b57848160ff1681518110612c3757612c37613f97565b602002602001015160ff16868360ff1681518110612c5757612c57613f97565b602002602001015160ff1603612c795782612c71816140bd565b935050612c8b565b80612c83816140bd565b915050612c16565b5080612c96816140bd565b915050612c08565b509392505050565b5f600783604051612cb79190613e21565b90815260405190819003602001902054825160ff90911614612ceb5760405162461bcd60e51b8152600401610b6990614050565b5f82604051602001612cfd9190614085565b604051602081830303815290604052805190602001209050600584604051612d259190613e21565b90815260408051602092819003830190205f93845260010190915290205460ff169392505050565b60605f612d5983612419565b90505f600784604051612d6c9190613e21565b9081526040519081900360200190205460ff166001600160401b03811115612d9657612d96613798565b604051908082528060200260200182016040528015612dbf578160200160208202803683370190505b5090505f5b600785604051612dd49190613e21565b9081526040519081900360200190205460ff9081169082161015612ecf57612e2c83602001518260ff16600788604051612e0e9190613e21565b9081526040519081900360200190205460ff6101009091041661329b565b828260ff1681518110612e4157612e41613f97565b60ff928316602091820292909201015261010084015116600103612ec7575b612e7482612e6f836001613e82565b612fe7565b1515600103612ec757612e9983602001518260ff16600788604051612e0e9190613e21565b828260ff1681518110612eae57612eae613f97565b602002602001019060ff16908160ff1681525050612e60565b600101612dc4565b50612ee8815f60018451612ee39190613ed9565b613330565b80600180015f60016002018560200151604051612f059190613e21565b90815260200160405180910390205481526020019081526020015f206006019080519060200190612c9e9291906136e3565b33612f40611a3b565b6001600160a01b031614611742573360405163118cdaa760e01b8152600401610b699190613c0d565b5f612f72612fc3565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b5f805b612ff5600184613e69565b60ff168160ff1610156130ab575f61300e826001613e82565b90505b8360ff168160ff1610156130a257848160ff168151811061303457613034613f97565b602002602001015160ff16858360ff168151811061305457613054613f97565b602002602001015160ff1614801561308a57505f858260ff168151811061307d5761307d613f97565b602002602001015160ff16115b1561309a57600192505050610960565b600101613011565b50600101612fea565b505f9392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0090565b6130e06134eb565b61268181613510565b6117426134eb565b60015b60038160ff161161317c5760ff8083165f908152600860209081526040808320858516845260020190915290819020549051911690600790613137908690613e21565b908152604080516020928190038301902060ff8581165f908152600290920190935220805460ff19169290911691909117905580613174816140bd565b9150506130f4565b5060ff8082165f90815260086020526040908190205490519116906007906131a5908590613e21565b9081526040805160209281900383018120805460ff191660ff9586161790558484165f90815260089093529120546101009004909116906007906131ea908590613e21565b9081526040805160209281900383018120805461ff00191661010060ff968716021790559284165f90815260089092529020600101549060079061322f908590613e21565b908152604051908190036020019020600101555050565b61324f82613518565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561329357612bb68282613572565b610a196135e4565b5f600160ff8316854442876132af816140ee565b98506040516020016132c4949392919061425c565b60408051601f19818403018152908290528051602091820120916132f09144918a9142918b9101614281565b604051602081830303815290604052805190602001205f1c61331291906142a5565b61331c91906142a5565b61332691906140db565b90505b9392505050565b818160ff80821690831603613346575050505050565b5f8560026133548787613e69565b61335e91906142b8565b6133689087613e82565b60ff168151811061337b5761337b613f97565b602002602001015190505b8160ff168360ff16116134b9575b8060ff16868460ff16815181106133ad576133ad613f97565b602002602001015160ff1610156133d057826133c8816140bd565b935050613394565b858260ff16815181106133e5576133e5613f97565b602002602001015160ff168160ff16101561340c5781613404816142d9565b9250506133d0565b8160ff168360ff16116134b457858260ff168151811061342e5761342e613f97565b6020026020010151868460ff168151811061344b5761344b613f97565b6020026020010151878560ff168151811061346857613468613f97565b60200260200101888560ff168151811061348457613484613f97565b60ff938416602091820292909201015291169052826134a2816140bd565b93505081806134b0906142d9565b9250505b613386565b8160ff168560ff1610156134d2576134d2868684613330565b8360ff168360ff16101561220d5761220d868486613330565b6134f3613603565b61174257604051631afcd79f60e31b815260040160405180910390fd5b61264f6134eb565b806001600160a01b03163b5f036135445780604051634c9c8ce360e01b8152600401610b699190613c0d565b5f8051602061431583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b03168460405161358e9190613e21565b5f60405180830381855af49150503d805f81146135c6576040519150601f19603f3d011682016040523d82523d5f602084013e6135cb565b606091505b50915091506135db85838361361c565b95945050505050565b34156117425760405163b398979f60e01b815260040160405180910390fd5b5f61360c6130b4565b54600160401b900460ff16919050565b6060826136315761362c8261366f565b613329565b815115801561364857506001600160a01b0384163b155b156136685783604051639996b31560e01b8152600401610b699190613c0d565b5080613329565b80511561367f5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b60405180610120016040528060608152602001606081526020015f81526020015f151581526020015f81526020015f8152602001606081526020015f81526020015f60ff1681525090565b828054828255905f5260205f2090601f01602090048101928215613774579160200282015f5b8382111561374657835183826101000a81548160ff021916908360ff16021790555092602001926001016020815f01049283019260010302613709565b80156137725782816101000a81549060ff02191690556001016020815f01049283019260010302613746565b505b50613780929150613784565b5090565b5b80821115613780575f8155600101613785565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156137d4576137d4613798565b604052919050565b5f82601f8301126137eb575f80fd5b81356001600160401b0381111561380457613804613798565b613817601f8201601f19166020016137ac565b81815284602083860101111561382b575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215613857575f80fd5b81356001600160401b0381111561386c575f80fd5b613878848285016137dc565b949350505050565b602080825282518282018190525f918401906040840190835b818110156138ba57835160ff16835260209384019390920191600101613899565b509095945050505050565b5f80604083850312156138d6575f80fd5b82356001600160401b038111156138eb575f80fd5b6138f7858286016137dc565b92505060208301356001600160401b03811115613912575f80fd5b61391e858286016137dc565b9150509250929050565b5f8151808452602084019350602083015f5b8281101561395b57815160ff1686526020958601959091019060010161393a565b5093949350505050565b602081525f8251606060208401526139806080840182613928565b60208501516001600160a01b03166040858101919091529094015115156060909301929092525090919050565b803560ff811681146139bd575f80fd5b919050565b5f80604083850312156139d3575f80fd5b6139dc836139ad565b946020939093013593505050565b5f602082840312156139fa575f80fd5b613329826139ad565b80356001600160a01b03811681146139bd575f80fd5b5f8060408385031215613a2a575f80fd5b82356001600160401b03811115613a3f575f80fd5b613a4b858286016137dc565b925050613a5a60208401613a03565b90509250929050565b5f8060408385031215613a74575f80fd5b613a7d83613a03565b915060208301356001600160401b03811115613912575f80fd5b5f805f60608486031215613aa9575f80fd5b83356001600160401b03811115613abe575f80fd5b613aca868287016137dc565b93505060208401356001600160401b03811115613ae5575f80fd5b613af1868287016137dc565b925050613b00604085016139ad565b90509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f82516101206020840152613b54610140840182613b09565b90506020840151601f19848303016040850152613b718282613b09565b915050604084015160608401526060840151613b91608085018215159052565b50608084015160a084015260a084015160c084015260c0840151601f198483030160e0850152613bc18282613928565b91505060e0840151610100840152610100840151612c9e61012085018260ff169052565b5f8060408385031215613bf6575f80fd5b613bff836139ad565b9150613a5a602084016139ad565b6001600160a01b0391909116815260200190565b5f805f60608486031215613c33575f80fd5b83356001600160401b03811115613c48575f80fd5b613c54868287016137dc565b93505060208401356001600160401b03811115613c6f575f80fd5b613c7b868287016137dc565b92505060408401356001600160401b03811115613c96575f80fd5b8401601f81018613613ca6575f80fd5b80356001600160401b03811115613cbf57613cbf613798565b8060051b613ccf602082016137ac565b91825260208184018101929081019089841115613cea575f80fd5b6020850194505b83851015613d1357613d02856139ad565b825260209485019490910190613cf1565b80955050505050509250925092565b5f8060408385031215613d33575f80fd5b82356001600160401b03811115613d48575f80fd5b613d54858286016137dc565b925050613a5a602084016139ad565b602081525f6133296020830184613b09565b5f60208284031215613d85575f80fd5b61332982613a03565b5f805f8060808587031215613da1575f80fd5b84356001600160401b03811115613db6575f80fd5b613dc2878288016137dc565b94505060208501356001600160401b03811115613ddd575f80fd5b613de9878288016137dc565b93505060408501359150613dff606086016139ad565b905092959194509250565b5f81518060208401855e5f93019283525090919050565b5f6133298284613e0a565b6020808252600f908201526e105b1c9958591e4818db185a5b5959608a1b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561096057610960613e55565b60ff818116838216019081111561096057610960613e55565b808202811582820484141761096057610960613e55565b634e487b7160e01b5f52601260045260245ffd5b5f82613ed457613ed4613eb2565b500490565b8181038181111561096057610960613e55565b608081525f613efe6080830187613b09565b8281036020840152613f108187613b09565b604084019590955250506001600160a01b039190911660609091015292915050565b600181811c90821680613f4657607f821691505b602082108103613f6457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526013908201527214195c9b5a5cdcda5bdb881c995c5d5a5c9959606a1b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b60ff8181168382160290811690818114613fc757613fc7613e55565b5092915050565b6020808252600e908201526d50726963652069732077726f6e6760901b604082015260600190565b602080825260149082015273496e76616c6964206c6f7474657279207479706560601b604082015260600190565b6020808252601290820152712637ba3a32b93c9034b99031b637b9b2b21760711b604082015260600190565b6020808252601b908201527a139d5b58995c881a5b881d1a58dad95d081a5cc81a5b9d985b1a59602a1b604082015260600190565b81515f90829060208501835b828110156140b257815160ff16845260209384019390910190600101614091565b509195945050505050565b5f60ff821660ff81036140d2576140d2613e55565b60010192915050565b8082018082111561096057610960613e55565b5f600182016140ff576140ff613e55565b5060010190565b608081525f6141186080830187613b09565b60ff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b601f821115612bb657805f5260205f20601f840160051c810160208510156141655750805b601f840160051c820191505b81811015614184575f8155600101614171565b5050505050565b81516001600160401b038111156141a4576141a4613798565b6141b8816141b28454613f32565b84614140565b6020601f8211600181146141ea575f83156141d35750848201515b5f19600385901b1c1916600184901b178455614184565b5f84815260208120601f198516915b8281101561421957878501518255602094850194600190920191016141f9565b508482101561423657868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215614255575f80fd5b5051919050565b5f6142678287613e0a565b948552505060208301919091526040820152606001919050565b8481525f6142926020830186613e0a565b9384525050602082015260400192915050565b5f826142b3576142b3613eb2565b500690565b5f60ff8316806142ca576142ca613eb2565b8060ff84160491505092915050565b5f60ff8216806142eb576142eb613e55565b5f19019291505056fe70a146cba1750dbacfc11eae97c28b71ac2f5e2b49b32b687961ced237c5abca360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220c41e8e1e1b7088af41520fb301930003eb38dd0fe32504108158b62f36f2b22964736f6c634300081a0033
Deployed Bytecode
0x608060405260043610610168575f3560e01c806307f90e5d146101715780630c3081a0146101a55780630ecd4db4146101d0578063104429d2146101fc57806318ef333e14610228578063237af4f61461038d5780632752ea0f146103bf5780634d14ae0b1461041e5780634f1ef2861461043d57806352d1902d14610450578063540cee47146104725780635439d383146104b55780636a574857146104d45780636ac46541146104f55780636decafdd14610513578063715018a6146105325780637773c263146105465780638792a6b7146105815780638da5cb5b146105a05780638fc9e5d6146105c157806391c798ad1461060c578063a954f3a31461061f578063ad353ad014610678578063ad3cb1cc1461068b578063bd4b2778146106c8578063c4d66de8146106e7578063c6b13a1d14610706578063eb9bd93014610725578063f26dbaf21461076a578063f2fde38b14610789578063f915dd03146107a857005b3661016f57005b005b34801561017c575f80fd5b5060015460045461018b919082565b604080519283526020830191909152015b60405180910390f35b3480156101b0575f80fd5b506009546101be9060ff1681565b60405160ff909116815260200161019c565b3480156101db575f80fd5b506101ef6101ea366004613847565b6107c7565b60405161019c9190613880565b348015610207575f80fd5b5061021b6102163660046138c5565b610871565b60405161019c9190613965565b348015610233575f80fd5b507fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f805461ffff199081166132051790915566038d7ea4c680007fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac5608190557f62c36c7b9eb92de142b453b3be754ee82962e75b4be0f148d64d0d97ce01b4388054603c60ff19918216179091557f3400cc00b85a211cd66d8a267994a001c893410d0a9bc0178c2a697d8f854fb8805460149083161790557fcf9c632b6a08f245cd49c144783e845d1275ed45bd7fba6a86d55688c4fb15dd8054600a9083161790557f6add646517a5b0f6793cd5891b7937d28a5b2981a5d88ebc7cd776088fea9041805484166106031790557f6add646517a5b0f6793cd5891b7937d28a5b2981a5d88ebc7cd776088fea904291909155335f9081526020819052604090208054909116600117905560098054909116615a09179055005b348015610398575f80fd5b5061016f6103a73660046139c2565b60ff9091165f90815260086020526040902060010155565b3480156103ca575f80fd5b506103fe6103d93660046139ea565b60086020525f90815260409020805460019091015460ff808316926101009004169083565b6040805160ff94851681529390921660208401529082015260600161019c565b348015610429575f80fd5b5061018b610438366004613a19565b610966565b61016f61044b366004613a63565b6109fe565b34801561045b575f80fd5b50610464610a1d565b60405190815260200161019c565b34801561047d575f80fd5b5061049161048c366004613847565b610a38565b6040805160ff9485168152928416602084015292169181019190915260600161019c565b3480156104c0575f80fd5b5061016f6104cf366004613a97565b610ae3565b3480156104df575f80fd5b506104e8611087565b60405161019c9190613b37565b348015610500575f80fd5b506009546101be90610100900460ff1681565b34801561051e575f80fd5b5061016f61052d366004613847565b6112f1565b34801561053d575f80fd5b5061016f611731565b348015610551575f80fd5b5061016f610560366004613be5565b60ff9182165f908152600860205260409020805460ff191691909216179055565b34801561058c575f80fd5b5061016f61059b366004613847565b611744565b3480156105ab575f80fd5b506105b4611a3b565b60405161019c9190613c0d565b3480156105cc575f80fd5b506103fe6105db366004613847565b80516020818301810180516007825292820191909301209152805460019091015460ff808316926101009004169083565b61016f61061a366004613c21565b611a55565b34801561062a575f80fd5b506104916106393660046139ea565b60ff9081165f90815260086020908152604080832060018452600290810190925280832054918352808320546003845292205490831693918316921690565b61016f610686366004613d22565b611dca565b348015610696575f80fd5b506106bb604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161019c9190613d63565b3480156106d3575f80fd5b5061018b6106e2366004613847565b6120cc565b3480156106f2575f80fd5b5061016f610701366004613d75565b61211b565b348015610711575f80fd5b5061016f610720366004613d8e565b612215565b348015610730575f80fd5b5061016f61073f366004613be5565b60ff9182165f9081526008602052604090208054929091166101000261ff0019909216919091179055565b348015610775575f80fd5b506104e8610784366004613847565b612419565b348015610794575f80fd5b5061016f6107a3366004613d75565b612647565b3480156107b3575f80fd5b5061016f6107c2366004613847565b612684565b6060600180015f6001600201846040516107e19190613e21565b90815260200160405180910390205481526020019081526020015f2060060180548060200260200160405190810160405280929190818152602001828054801561086557602002820191905f5260205f20905f905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116108365790505b50505050509050919050565b604080516060808201835281525f6020820181905281830152905160059061089a908590613e21565b908152604051908190036020018120906108b5908490613e21565b9081526040805191829003602090810183208054608092810285018301909352606084018381529092849284919084018282801561092d57602002820191905f5260205f20905f905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116108fe5790505b5050509183525050600191909101546001600160a01b0381166020830152600160a01b900460ff16151560409091015290505b92915050565b5f806006846040516109789190613e21565b90815260408051918290036020908101832060015f8181529183528382206001600160a01b0389168352600201909252919091200154906006906109bd908790613e21565b9081526040805191829003602090810190922060025f8181529184528282206001600160a01b03891683520190925290206001015490925090509250929050565b610a06612a57565b610a0f82612afb565b610a198282612b03565b5050565b5f610a26612bbb565b505f8051602061431583398151915290565b5f805f600784604051610a4b9190613e21565b90815260408051918290036020908101832060015f9081526002909101909152205460ff1690600790610a7f908790613e21565b90815260408051918290036020908101832060025f8181529101909152205460ff1690600790610ab0908890613e21565b908152604080516020928190038301902060035f9081526002909101909252902054919690955060ff9091169350915050565b336001600160a01b0316600584604051610afd9190613e21565b90815260405190819003602001812090610b18908590613e21565b908152604051908190036020019020600101546001600160a01b031614610b725760405162461bcd60e51b81526020600482015260096024820152682737ba10313abcb2b960b91b60448201526064015b60405180910390fd5b600583604051610b829190613e21565b90815260405190819003602001812090610b9d908490613e21565b9081526040519081900360200190206001015460ff600160a01b9091041615610bd85760405162461bcd60e51b8152600401610b6990613e2c565b5f600584604051610be99190613e21565b90815260405190819003602001812090610c04908590613e21565b9081526040805191829003602090810183208054808302850183019093528284529190830182828015610c7157602002820191905f5260205f20905f905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610c425790505b50505050509050600180015f600160020186604051610c909190613e21565b908152604080516020928190038301902054835290820192909252015f206008015460ff1660010361103e575f600180015f600160020187604051610cd59190613e21565b90815260200160405180910390205481526020019081526020015f20600601805480602002602001604051908101604052809291908181526020018280548015610d5957602002820191905f5260205f20905f905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610d2a5790505b505050505090505f610d6b8284612c04565b905060038160ff1611610db85760405162461bcd60e51b8152602060048201526015602482015274496e63617061626c65206f6620636c61696d696e6760581b6044820152606401610b69565b5f600787604051610dc99190613e21565b90815260200160405180910390206002015f838551610de89190613e69565b610df3906001613e82565b60ff908116825260208201929092526040015f205416905080610e575760405162461bcd60e51b815260206004820152601c60248201527b125b98d85c18589b19481bd98818db185a5b5a5b99c81c995dd85c9960221b6044820152606401610b69565b5f610e628886612ca6565b60ff1690508560ff16811115610eac5760405162461bcd60e51b815260206004820152600f60248201526e2bb937b733903a37ba30b6103bb7b760891b6044820152606401610b69565b5f8660ff1660648460ff16600180015f60016002018e604051610ecf9190613e21565b90815260200160405180910390205481526020019081526020015f2060040154610ef99190613e9b565b610f039190613ec6565b610f0d9190613ec6565b905080600180015f60016002018c604051610f289190613e21565b90815260200160405180910390205481526020019081526020015f206005015f828254610f559190613ed9565b9091555050600180548291905f90610f6e908490613ed9565b92505081905550600160058a604051610f879190613e21565b90815260405190819003602001812090610fa2908b90613e21565b9081526040519081900360200181206001018054921515600160a01b0260ff60a01b1990931692909217909155339082156108fc029083905f818181858888f19350505050158015610ff6573d5f803e3d5ffd5b507f7a27c602d162c4b709ce3482164f6ba3bfd7189dfd71aa828b2970ce1466b7988989833360405161102c9493929190613eec565b60405180910390a15050505050611081565b60405162461bcd60e51b81526020600482015260186024820152774e6f7420737570706f7274206c6f7474657279207479706560401b6044820152606401610b69565b50505050565b61108f613698565b6004546110dd5760405162461bcd60e51b815260206004820152601c60248201527b12185d995b89dd081a185908185b9e481b1bdd1d195c9e4b081e595d60221b6044820152606401610b69565b6004546002905f906110f190600190613ed9565b81526020019081526020015f20604051806101200160405290815f8201805461111990613f32565b80601f016020809104026020016040519081016040528092919081815260200182805461114590613f32565b80156111905780601f1061116757610100808354040283529160200191611190565b820191905f5260205f20905b81548152906001019060200180831161117357829003601f168201915b505050505081526020016001820180546111a990613f32565b80601f01602080910402602001604051908101604052809291908181526020018280546111d590613f32565b80156112205780601f106111f757610100808354040283529160200191611220565b820191905f5260205f20905b81548152906001019060200180831161120357829003601f168201915b5050505050815260200160028201548152602001600382015f9054906101000a900460ff161515151581526020016004820154815260200160058201548152602001600682018054806020026020016040519081016040528092919081815260200182805480156112cb57602002820191905f5260205f20905f905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161129c5790505b50505091835250506007820154602082015260089091015460ff16604090910152919050565b335f9081526020819052604090205460ff1615156001146113245760405162461bcd60e51b8152600401610b6990613f6a565b6040516002905f9060039061133a908590613e21565b9081526040805191829003602090810190922054835290820192909252015f206003015460ff16151560011480156113ae57506040516002905f90600390611383908590613e21565b9081526040805191829003602090810190922054835290820192909252015f206008015460ff166001145b156113be576113bc81612d4d565b505b6040516002905f906003906113d4908590613e21565b9081526040805191829003602090810190922054835290820192909252015f206003015460ff161515600114801561144657506040516002905f9060039061141d908590613e21565b908152604080516020928190038301902054835290820192909252015f206008015460ff166002145b1561164b5761145481612d4d565b506006816040516114659190613e21565b9081526020016040518091039020600101546006826040516114879190613e21565b908152604051908190036020019020600201555f805b6007836040516114ad9190613e21565b9081526040519081900360200190205460ff9081169082161015611547576040516002905f906003906114e1908790613e21565b90815260200160405180910390205481526020019081526020015f206006018160ff168154811061151457611514613f97565b905f5260205f2090602091828204019190069054906101000a900460ff168261153d9190613e82565b915060010161149d565b5060095460ff90811690821611156115d357600260068360405161156b9190613e21565b90815260200160405180910390206003015f6101000a81548160ff021916908360ff16021790555060016006836040516115a59190613e21565b908152602001604051809103902060030160016101000a81548160ff021916908360ff160217905550611649565b60016006836040516115e59190613e21565b90815260200160405180910390206003015f6101000a81548160ff021916908360ff160217905550600260068360405161161f9190613e21565b908152602001604051809103902060030160016101000a81548160ff021916908360ff1602179055505b505b6040516002905f90600390611661908590613e21565b90815260200160405180910390205481526020019081526020015f2060040154600180015f6001600201846040516116999190613e21565b90815260200160405180910390205481526020019081526020015f20600501819055505f600180015f6001600201846040516116d59190613e21565b90815260200160405180910390205481526020019081526020015f206003015f6101000a81548160ff0219169083151502179055505f805160206142f5833981519152816040516117269190613d63565b60405180910390a150565b611739612f37565b6117425f612f69565b565b61174c612f37565b5f60078260405161175d9190613e21565b9081526040519081900360200190205460ff166001600160401b0381111561178757611787613798565b6040519080825280602002602001820160405280156117b0578160200160208202803683370190505b5090505f5b6007836040516117c59190613e21565b9081526040519081900360200190205460ff9081169082161015611832576117ee816002613e82565b6117f9826002613e82565b6118039190613fab565b828260ff168151811061181857611818613f97565b60ff909216602092830291909101909101526001016117b5565b506040516002905f90600390611849908690613e21565b9081526040805191829003602090810190922054835290820192909252015f206003015460ff16151560011480156118bb57506040516002905f90600390611892908690613e21565b908152604080516020928190038301902054835290820192909252015f206008015460ff166002145b15611906576006826040516118d09190613e21565b9081526020016040518091039020600101546006836040516118f29190613e21565b908152604051908190036020019020600201555b80600180015f60016002018560405161191f9190613e21565b90815260200160405180910390205481526020019081526020015f2060060190805190602001906119519291906136e3565b505f600180015f60016002018560405161196b9190613e21565b90815260200160405180910390205481526020019081526020015f206003015f6101000a81548160ff021916908315150217905550600180015f6001600201846040516119b89190613e21565b90815260200160405180910390205481526020019081526020015f2060040154600180015f6001600201856040516119f09190613e21565b90815260200160405180910390205481526020019081526020015f20600501819055505f805160206142f583398151915282604051611a2f9190613d63565b60405180910390a15050565b5f80611a45612fc3565b546001600160a01b031692915050565b5f611a5f84612419565b9050600784604051611a719190613e21565b9081526020016040518091039020600101543414611aa15760405162461bcd60e51b8152600401610b6990613fce565b60608101511515600114611af45760405162461bcd60e51b815260206004820152601a6024820152794d7573742062757920696e20616374697665206c6f747465727960301b6044820152606401610b69565b80610100015160ff16600114611b1c5760405162461bcd60e51b8152600401610b6990613ff6565b6103848160e00151611b2e9190613ed9565b421115611b4d5760405162461bcd60e51b8152600401610b6990614024565b600784604051611b5d9190613e21565b90815260405190819003602001902054825160ff90911614611b915760405162461bcd60e51b8152600401610b6990614050565b611b9c828351612fe7565b15611bf55760405162461bcd60e51b8152602060048201526024808201527f4e756d62657220696e207469636b6574206d757374206e6f74206475706c6963604482015263185d195960e21b6064820152608401610b69565b60408051606081018252838152336020808301919091525f8284018190529251919291611c2491869101614085565b604051602081830303815290604052805190602001209050600586604051611c4c9190613e21565b90815260408051602092819003830190205f84815260019091019092528120805460ff1691611c7a836140bd565b91906101000a81548160ff021916908360ff1602179055505081600587604051611ca49190613e21565b90815260405190819003602001812090611cbf908890613e21565b90815260200160405180910390205f820151815f019080519060200190611ce79291906136e3565b506020820151600190910180546040938401511515600160a01b026001600160a81b03199091166001600160a01b03909316929092179190911790555134906002905f90600390611d39908b90613e21565b90815260200160405180910390205481526020019081526020015f206004015f828254611d6691906140db565b9091555050600180543491905f90611d7f9084906140db565b90915550506040517f685d93f4f12667f354fbd6ae71a219c489dfc9dc1b150cdf284b20c169107b6590611dba908890889034903390613eec565b60405180910390a1505050505050565b5f611dd483612419565b90508160ff1660011480611deb57508160ff166002145b611e2a5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420737570706f7274207369646560801b6044820152606401610b69565b600783604051611e3a9190613e21565b908152602001604051809103902060010154341015611e6b5760405162461bcd60e51b8152600401610b6990613fce565b60608101511515600114611ebe5760405162461bcd60e51b815260206004820152601a6024820152794d7573742062657420696e20616374697665206c6f747465727960301b6044820152606401610b69565b80610100015160ff16600214611ee65760405162461bcd60e51b8152600401610b6990613ff6565b6103848160e00151611ef89190613ed9565b421115611f175760405162461bcd60e51b8152600401610b6990614024565b34600684604051611f289190613e21565b90815260200160405180910390206001015f828254611f4791906140db565b9250508190555034600684604051611f5f9190613e21565b908152604080516020928190038301902060ff86165f908152925281208054909190611f8c9084906140db565b9091555050604051600690611fa2908590613e21565b908152604080516020928190038301902060ff85165f90815292528120600101805491611fce836140ee565b919050555034600684604051611fe49190613e21565b908152604080516020928190038301902060ff86165f908152908352818120338252600201909252812060010180549091906120219084906140db565b909155505060405134906002905f9060039061203e908890613e21565b90815260200160405180910390205481526020019081526020015f206004015f82825461206b91906140db565b9091555050600180543491905f906120849084906140db565b90915550506040517f927410d4983cb656119cee7e53725ad723beaa5f0869443db71e37877b5ba750906120bf908590859034903390614106565b60405180910390a1505050565b5f806006836040516120de9190613e21565b9081526020016040518091039020600101546006846040516121009190613e21565b90815260200160405180910390206002015491509150915091565b5f6121246130b4565b805490915060ff600160401b82041615906001600160401b03165f8115801561214a5750825b90505f826001600160401b031660011480156121655750303b155b905081158015612173575080155b156121915760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b031916600117855583156121ba57845460ff60401b1916600160401b1785555b6121c3866130d8565b6121cb6130e9565b831561220d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602001611dba565b505050505050565b335f9081526020819052604090205460ff1615156001146122485760405162461bcd60e51b8152600401610b6990613f6a565b604051600390612259908690613e21565b9081526020016040518091039020545f146122a25760405162461bcd60e51b815260206004820152600960248201526849642065786973747360b81b6044820152606401610b69565b6122ab836112f1565b6040805161012081018252848152602080820187905260045482840181905260016060848101919091525f6080850181905260a0850181905260c0850182905260e0850188905260ff871661010086015291825260029092529290922081518291908190612319908261418b565b506020820151600182019061232e908261418b565b5060408201516002820155606082015160038201805460ff19169115159190911790556080820151600482015560a0820151600582015560c082015180516123809160068401916020909101906136e3565b5060e08201516007820155610100909101516008909101805460ff191660ff9092169190911790556004546040516003906123bc908990613e21565b9081526040519081900360200190205560048054905f6123db836140ee565b91905055506123ea86846130f1565b7f2acba6155688eb695b1421897ed186bdf25c26584651199a0258c98969b1a2e186604051611dba9190613d63565b612421613698565b6040516002905f90600390612437908690613e21565b90815260200160405180910390205481526020019081526020015f20604051806101200160405290815f8201805461246e90613f32565b80601f016020809104026020016040519081016040528092919081815260200182805461249a90613f32565b80156124e55780601f106124bc576101008083540402835291602001916124e5565b820191905f5260205f20905b8154815290600101906020018083116124c857829003601f168201915b505050505081526020016001820180546124fe90613f32565b80601f016020809104026020016040519081016040528092919081815260200182805461252a90613f32565b80156125755780601f1061254c57610100808354040283529160200191612575565b820191905f5260205f20905b81548152906001019060200180831161255857829003601f168201915b5050505050815260200160028201548152602001600382015f9054906101000a900460ff1615151515815260200160048201548152602001600582015481526020016006820180548060200260200160405190810160405280929190818152602001828054801561262057602002820191905f5260205f20905f905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116125f15790505b50505091835250506007820154602082015260089091015460ff1660409091015292915050565b61264f612f37565b6001600160a01b038116612678575f604051631e4fbdf760e01b8152600401610b699190613c0d565b61268181612f69565b50565b6040516002905f9060039061269a908590613e21565b908152604080516020928190038301902054835290820192909252015f206008015460ff16600203612a1b575f6006826040516126d79190613e21565b9081526040519081900360200181206003015460ff1691505f906006906126ff908590613e21565b9081526040519081900360200181206003015460ff6101009091041691505f9060069061272d908690613e21565b908152604080516020928190038301902060ff86165f908152908352818120338252600201909252902060010154116127965760405162461bcd60e51b815260206004820152600b60248201526a111a59081b9bdd0818995d60aa1b6044820152606401610b69565b6006836040516127a69190613e21565b908152604080516020928190038301902060ff8581165f908152918452828220338352600201909352205416156127ef5760405162461bcd60e51b8152600401610b6990613e2c565b5f6006846040516128009190613e21565b908152604080516020928190038301812060ff87165f908152935290822054925060069061282f908790613e21565b908152604080516020928190038301812060ff87165f908152935290822054925060069061285e908890613e21565b908152604080516020928190038301902060ff8881165f9081529184528282203383526002019093529081206001015460095490935090918391869183916064916128af9161010090041688613e9b565b6128b99190613ec6565b6128c39190613e9b565b6128cd9190613ec6565b6128d791906140db565b905080600180015f60016002018a6040516128f29190613e21565b90815260200160405180910390205481526020019081526020015f206005015f82825461291f9190613ed9565b92505081905550806006886040516129379190613e21565b90815260200160405180910390206002015f8282546129569190613ed9565b92505081905550600160068860405161296f9190613e21565b90815260408051918290036020908101832060ff8b165f908152908252828120338083526002909101909252918220805494151560ff199095169490941790935583156108fc02918491818181858888f193505050501580156129d4573d5f803e3d5ffd5b507f485ab67dc7e970d83bab57928925ea2c43b32b23b974ae0715f1b3b74b21d06687878333604051612a0a9493929190614106565b60405180910390a150505050505050565b60405162461bcd60e51b81526020600482015260116024820152704e6f7420737570706f727420747970657360781b6044820152606401610b69565b306001600160a01b037f0000000000000000000000003ec79adc327977f4f95c99d2026a39e9fdccd49f161480612add57507f0000000000000000000000003ec79adc327977f4f95c99d2026a39e9fdccd49f6001600160a01b0316612ad15f80516020614315833981519152546001600160a01b031690565b6001600160a01b031614155b156117425760405163703e46dd60e11b815260040160405180910390fd5b612681612f37565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612b5d575060408051601f3d908101601f19168201909252612b5a91810190614245565b60015b612b7c5781604051634c9c8ce360e01b8152600401610b699190613c0d565b5f805160206143158339815191528114612bac57604051632a87526960e21b815260048101829052602401610b69565b612bb68383613246565b505050565b306001600160a01b037f0000000000000000000000003ec79adc327977f4f95c99d2026a39e9fdccd49f16146117425760405163703e46dd60e11b815260040160405180910390fd5b5f80805b84518160ff161015612c9e575f5b84518160ff161015612c8b57848160ff1681518110612c3757612c37613f97565b602002602001015160ff16868360ff1681518110612c5757612c57613f97565b602002602001015160ff1603612c795782612c71816140bd565b935050612c8b565b80612c83816140bd565b915050612c16565b5080612c96816140bd565b915050612c08565b509392505050565b5f600783604051612cb79190613e21565b90815260405190819003602001902054825160ff90911614612ceb5760405162461bcd60e51b8152600401610b6990614050565b5f82604051602001612cfd9190614085565b604051602081830303815290604052805190602001209050600584604051612d259190613e21565b90815260408051602092819003830190205f93845260010190915290205460ff169392505050565b60605f612d5983612419565b90505f600784604051612d6c9190613e21565b9081526040519081900360200190205460ff166001600160401b03811115612d9657612d96613798565b604051908082528060200260200182016040528015612dbf578160200160208202803683370190505b5090505f5b600785604051612dd49190613e21565b9081526040519081900360200190205460ff9081169082161015612ecf57612e2c83602001518260ff16600788604051612e0e9190613e21565b9081526040519081900360200190205460ff6101009091041661329b565b828260ff1681518110612e4157612e41613f97565b60ff928316602091820292909201015261010084015116600103612ec7575b612e7482612e6f836001613e82565b612fe7565b1515600103612ec757612e9983602001518260ff16600788604051612e0e9190613e21565b828260ff1681518110612eae57612eae613f97565b602002602001019060ff16908160ff1681525050612e60565b600101612dc4565b50612ee8815f60018451612ee39190613ed9565b613330565b80600180015f60016002018560200151604051612f059190613e21565b90815260200160405180910390205481526020019081526020015f206006019080519060200190612c9e9291906136e3565b33612f40611a3b565b6001600160a01b031614611742573360405163118cdaa760e01b8152600401610b699190613c0d565b5f612f72612fc3565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b5f805b612ff5600184613e69565b60ff168160ff1610156130ab575f61300e826001613e82565b90505b8360ff168160ff1610156130a257848160ff168151811061303457613034613f97565b602002602001015160ff16858360ff168151811061305457613054613f97565b602002602001015160ff1614801561308a57505f858260ff168151811061307d5761307d613f97565b602002602001015160ff16115b1561309a57600192505050610960565b600101613011565b50600101612fea565b505f9392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0090565b6130e06134eb565b61268181613510565b6117426134eb565b60015b60038160ff161161317c5760ff8083165f908152600860209081526040808320858516845260020190915290819020549051911690600790613137908690613e21565b908152604080516020928190038301902060ff8581165f908152600290920190935220805460ff19169290911691909117905580613174816140bd565b9150506130f4565b5060ff8082165f90815260086020526040908190205490519116906007906131a5908590613e21565b9081526040805160209281900383018120805460ff191660ff9586161790558484165f90815260089093529120546101009004909116906007906131ea908590613e21565b9081526040805160209281900383018120805461ff00191661010060ff968716021790559284165f90815260089092529020600101549060079061322f908590613e21565b908152604051908190036020019020600101555050565b61324f82613518565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561329357612bb68282613572565b610a196135e4565b5f600160ff8316854442876132af816140ee565b98506040516020016132c4949392919061425c565b60408051601f19818403018152908290528051602091820120916132f09144918a9142918b9101614281565b604051602081830303815290604052805190602001205f1c61331291906142a5565b61331c91906142a5565b61332691906140db565b90505b9392505050565b818160ff80821690831603613346575050505050565b5f8560026133548787613e69565b61335e91906142b8565b6133689087613e82565b60ff168151811061337b5761337b613f97565b602002602001015190505b8160ff168360ff16116134b9575b8060ff16868460ff16815181106133ad576133ad613f97565b602002602001015160ff1610156133d057826133c8816140bd565b935050613394565b858260ff16815181106133e5576133e5613f97565b602002602001015160ff168160ff16101561340c5781613404816142d9565b9250506133d0565b8160ff168360ff16116134b457858260ff168151811061342e5761342e613f97565b6020026020010151868460ff168151811061344b5761344b613f97565b6020026020010151878560ff168151811061346857613468613f97565b60200260200101888560ff168151811061348457613484613f97565b60ff938416602091820292909201015291169052826134a2816140bd565b93505081806134b0906142d9565b9250505b613386565b8160ff168560ff1610156134d2576134d2868684613330565b8360ff168360ff16101561220d5761220d868486613330565b6134f3613603565b61174257604051631afcd79f60e31b815260040160405180910390fd5b61264f6134eb565b806001600160a01b03163b5f036135445780604051634c9c8ce360e01b8152600401610b699190613c0d565b5f8051602061431583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b03168460405161358e9190613e21565b5f60405180830381855af49150503d805f81146135c6576040519150601f19603f3d011682016040523d82523d5f602084013e6135cb565b606091505b50915091506135db85838361361c565b95945050505050565b34156117425760405163b398979f60e01b815260040160405180910390fd5b5f61360c6130b4565b54600160401b900460ff16919050565b6060826136315761362c8261366f565b613329565b815115801561364857506001600160a01b0384163b155b156136685783604051639996b31560e01b8152600401610b699190613c0d565b5080613329565b80511561367f5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b60405180610120016040528060608152602001606081526020015f81526020015f151581526020015f81526020015f8152602001606081526020015f81526020015f60ff1681525090565b828054828255905f5260205f2090601f01602090048101928215613774579160200282015f5b8382111561374657835183826101000a81548160ff021916908360ff16021790555092602001926001016020815f01049283019260010302613709565b80156137725782816101000a81549060ff02191690556001016020815f01049283019260010302613746565b505b50613780929150613784565b5090565b5b80821115613780575f8155600101613785565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156137d4576137d4613798565b604052919050565b5f82601f8301126137eb575f80fd5b81356001600160401b0381111561380457613804613798565b613817601f8201601f19166020016137ac565b81815284602083860101111561382b575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215613857575f80fd5b81356001600160401b0381111561386c575f80fd5b613878848285016137dc565b949350505050565b602080825282518282018190525f918401906040840190835b818110156138ba57835160ff16835260209384019390920191600101613899565b509095945050505050565b5f80604083850312156138d6575f80fd5b82356001600160401b038111156138eb575f80fd5b6138f7858286016137dc565b92505060208301356001600160401b03811115613912575f80fd5b61391e858286016137dc565b9150509250929050565b5f8151808452602084019350602083015f5b8281101561395b57815160ff1686526020958601959091019060010161393a565b5093949350505050565b602081525f8251606060208401526139806080840182613928565b60208501516001600160a01b03166040858101919091529094015115156060909301929092525090919050565b803560ff811681146139bd575f80fd5b919050565b5f80604083850312156139d3575f80fd5b6139dc836139ad565b946020939093013593505050565b5f602082840312156139fa575f80fd5b613329826139ad565b80356001600160a01b03811681146139bd575f80fd5b5f8060408385031215613a2a575f80fd5b82356001600160401b03811115613a3f575f80fd5b613a4b858286016137dc565b925050613a5a60208401613a03565b90509250929050565b5f8060408385031215613a74575f80fd5b613a7d83613a03565b915060208301356001600160401b03811115613912575f80fd5b5f805f60608486031215613aa9575f80fd5b83356001600160401b03811115613abe575f80fd5b613aca868287016137dc565b93505060208401356001600160401b03811115613ae5575f80fd5b613af1868287016137dc565b925050613b00604085016139ad565b90509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f82516101206020840152613b54610140840182613b09565b90506020840151601f19848303016040850152613b718282613b09565b915050604084015160608401526060840151613b91608085018215159052565b50608084015160a084015260a084015160c084015260c0840151601f198483030160e0850152613bc18282613928565b91505060e0840151610100840152610100840151612c9e61012085018260ff169052565b5f8060408385031215613bf6575f80fd5b613bff836139ad565b9150613a5a602084016139ad565b6001600160a01b0391909116815260200190565b5f805f60608486031215613c33575f80fd5b83356001600160401b03811115613c48575f80fd5b613c54868287016137dc565b93505060208401356001600160401b03811115613c6f575f80fd5b613c7b868287016137dc565b92505060408401356001600160401b03811115613c96575f80fd5b8401601f81018613613ca6575f80fd5b80356001600160401b03811115613cbf57613cbf613798565b8060051b613ccf602082016137ac565b91825260208184018101929081019089841115613cea575f80fd5b6020850194505b83851015613d1357613d02856139ad565b825260209485019490910190613cf1565b80955050505050509250925092565b5f8060408385031215613d33575f80fd5b82356001600160401b03811115613d48575f80fd5b613d54858286016137dc565b925050613a5a602084016139ad565b602081525f6133296020830184613b09565b5f60208284031215613d85575f80fd5b61332982613a03565b5f805f8060808587031215613da1575f80fd5b84356001600160401b03811115613db6575f80fd5b613dc2878288016137dc565b94505060208501356001600160401b03811115613ddd575f80fd5b613de9878288016137dc565b93505060408501359150613dff606086016139ad565b905092959194509250565b5f81518060208401855e5f93019283525090919050565b5f6133298284613e0a565b6020808252600f908201526e105b1c9958591e4818db185a5b5959608a1b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561096057610960613e55565b60ff818116838216019081111561096057610960613e55565b808202811582820484141761096057610960613e55565b634e487b7160e01b5f52601260045260245ffd5b5f82613ed457613ed4613eb2565b500490565b8181038181111561096057610960613e55565b608081525f613efe6080830187613b09565b8281036020840152613f108187613b09565b604084019590955250506001600160a01b039190911660609091015292915050565b600181811c90821680613f4657607f821691505b602082108103613f6457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526013908201527214195c9b5a5cdcda5bdb881c995c5d5a5c9959606a1b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b60ff8181168382160290811690818114613fc757613fc7613e55565b5092915050565b6020808252600e908201526d50726963652069732077726f6e6760901b604082015260600190565b602080825260149082015273496e76616c6964206c6f7474657279207479706560601b604082015260600190565b6020808252601290820152712637ba3a32b93c9034b99031b637b9b2b21760711b604082015260600190565b6020808252601b908201527a139d5b58995c881a5b881d1a58dad95d081a5cc81a5b9d985b1a59602a1b604082015260600190565b81515f90829060208501835b828110156140b257815160ff16845260209384019390910190600101614091565b509195945050505050565b5f60ff821660ff81036140d2576140d2613e55565b60010192915050565b8082018082111561096057610960613e55565b5f600182016140ff576140ff613e55565b5060010190565b608081525f6141186080830187613b09565b60ff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b601f821115612bb657805f5260205f20601f840160051c810160208510156141655750805b601f840160051c820191505b81811015614184575f8155600101614171565b5050505050565b81516001600160401b038111156141a4576141a4613798565b6141b8816141b28454613f32565b84614140565b6020601f8211600181146141ea575f83156141d35750848201515b5f19600385901b1c1916600184901b178455614184565b5f84815260208120601f198516915b8281101561421957878501518255602094850194600190920191016141f9565b508482101561423657868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215614255575f80fd5b5051919050565b5f6142678287613e0a565b948552505060208301919091526040820152606001919050565b8481525f6142926020830186613e0a565b9384525050602082015260400192915050565b5f826142b3576142b3613eb2565b500690565b5f60ff8316806142ca576142ca613eb2565b8060ff84160491505092915050565b5f60ff8216806142eb576142eb613e55565b5f19019291505056fe70a146cba1750dbacfc11eae97c28b71ac2f5e2b49b32b687961ced237c5abca360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220c41e8e1e1b7088af41520fb301930003eb38dd0fe32504108158b62f36f2b22964736f6c634300081a0033
Deployed Bytecode Sourcemap
41089:19938:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42136:28;;;;;;;;;;-1:-1:-1;42136:28:0;;;;;;;;;;;;;188:25:1;;;244:2;229:18;;222:34;;;;161:18;42136:28:0;;;;;;;;43266:21;;;;;;;;;;-1:-1:-1;43266:21:0;;;;;;;;;;;519:4:1;507:17;;;489:36;;477:2;462:18;43266:21:0;347:184:1;48790:182:0;;;;;;;;;;-1:-1:-1;48790:182:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57202:221::-;;;;;;;;;;-1:-1:-1;57202:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48153:629::-;;;;;;;;;;-1:-1:-1;48193:24:0;:42;;-1:-1:-1;;48246:44:0;;;;;;;;48334:16;48301:30;:49;;;48361:40;:45;;48404:2;-1:-1:-1;;48361:45:0;;;;;;;48417:40;:45;;48460:2;48417:45;;;;;;48473:40;:45;;48516:2;48473:45;;;;;;48531:24;:42;;48584:43;;;;;;48638:30;:49;;;;48710:10;-1:-1:-1;48700:21:0;;;48193:24;48700:21;;;48193:24;48700:21;;:28;;;;;-1:-1:-1;48700:28:0;;;48750:1;48739:12;;48762;;;;;;;41089:19938;45318:114;;;;;;;;;;-1:-1:-1;45318:114:0;;;;;:::i;:::-;45389:21;;;;;;;;:14;:21;;;;;:27;;:35;45318:114;43205:54;;;;;;;;;;-1:-1:-1;43205:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4958:4:1;4946:17;;;4928:36;;5000:17;;;;4995:2;4980:18;;4973:45;5034:18;;;5027:34;4916:2;4901:18;43205:54:0;4734:333:1;47354:299:0;;;;;;;;;;-1:-1:-1;47354:299:0;;;;;:::i;:::-;;:::i;38468:217::-;;;;;;:::i;:::-;;:::i;38001:136::-;;;;;;;;;;;;;:::i;:::-;;;6194:25:1;;;6182:2;6167:18;38001:136:0;6048:177:1;52710:363:0;;;;;;;;;;-1:-1:-1;52710:363:0;;;;;:::i;:::-;;:::i;:::-;;;;6450:4:1;6438:17;;;6420:36;;6492:17;;;6487:2;6472:18;;6465:45;6546:17;;6526:18;;;6519:45;;;;6408:2;6393:18;52710:363:0;6230:340:1;53429:1835:0;;;;;;;;;;-1:-1:-1;53429:1835:0;;;;;:::i;:::-;;:::i;47929:216::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43294:20::-;;;;;;;;;;-1:-1:-1;43294:20:0;;;;;;;;;;;49166:1318;;;;;;;;;;-1:-1:-1;49166:1318:0;;;;;:::i;:::-;;:::i;13614:103::-;;;;;;;;;;;;;:::i;45440:144::-;;;;;;;;;;-1:-1:-1;45440:144:0;;;;;:::i;:::-;45525:21;;;;;;;;:14;:21;;;;;:51;;-1:-1:-1;;45525:51:0;;;;;;;;45440:144;50492:817;;;;;;;;;;-1:-1:-1;50492:817:0;;;;;:::i;:::-;;:::i;12879:147::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43143:55::-;;;;;;;;;;-1:-1:-1;43143:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55272:1495;;;;;;:::i;:::-;;:::i;53081:340::-;;;;;;;;;;-1:-1:-1;53081:340:0;;;;;:::i;:::-;53282:21;;;;53187:5;53282:21;;;:14;:21;;;;;;;;53310:1;53282:30;;:27;;;;:30;;;;;;;53327;;;;;;;53400:1;53372:30;;;;;53282;;;;53327;;;;53372;;53081:340;43973:1167;;;;;;:::i;:::-;;:::i;36066:58::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36066:58:0;;;;;;;;;;;;:::i;47661:260::-;;;;;;;;;;-1:-1:-1;47661:260:0;;;;;:::i;:::-;;:::i;41349:143::-;;;;;;;;;;-1:-1:-1;41349:143:0;;;;;:::i;:::-;;:::i;51317:842::-;;;;;;;;;;-1:-1:-1;51317:842:0;;;;;:::i;:::-;;:::i;45148:162::-;;;;;;;;;;-1:-1:-1;45148:162:0;;;;;:::i;:::-;45249:21;;;;;;;;:14;:21;;;;;:53;;;;;;;;-1:-1:-1;;45249:53:0;;;;;;;;;45148:162;48980:178;;;;;;;;;;-1:-1:-1;48980:178:0;;;;;:::i;:::-;;:::i;13872:220::-;;;;;;;;;;-1:-1:-1;13872:220:0;;;;;:::i;:::-;;:::i;45592:1754::-;;;;;;;;;;-1:-1:-1;45592:1754:0;;;;;:::i;:::-;;:::i;48790:182::-;48882:14;48921:9;:16;;:36;48938:9;:13;;48952:3;48938:18;;;;;;:::i;:::-;;;;;;;;;;;;;;48921:36;;;;;;;;;;;:43;;48914:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48790:182;;;:::o;57202:221::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;57370:26:0;;:14;;:26;;57385:10;;57370:26;:::i;:::-;;;;;;;;;;;;;;;:45;;57405:9;;57370:45;:::i;:::-;;;;;;;;;;;;;;;;;57363:52;;;;;;;;;;;;;;;;;;;57370:45;;;;;;57363:52;;;57370:45;57363:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57363:52:0;;;-1:-1:-1;;57363:52:0;;;;;;-1:-1:-1;;;;;57363:52:0;;;;;;-1:-1:-1;;;57363:52:0;;;;;;;;;;;;-1:-1:-1;57202:221:0;;;;;:::o;47354:299::-;47457:7;47466;47513:11;47525:10;47513:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;47545:1;47513:31;:34;;;;;;;;;-1:-1:-1;;;;;47513:45:0;;;;:39;;:45;;;;;;;:53;;;47581:11;;:23;;47593:10;;47581:23;:::i;:::-;;;;;;;;;;;;;;;;;;47613:1;47581:31;:34;;;;;;;;;-1:-1:-1;;;;;47581:45:0;;;;:39;:45;;;;;:53;;;47491:154;;-1:-1:-1;47581:53:0;-1:-1:-1;47354:299:0;;;;;:::o;38468:217::-;36922:13;:11;:13::i;:::-;38584:36:::1;38602:17;38584;:36::i;:::-;38631:46;38653:17;38672:4;38631:21;:46::i;:::-;38468:217:::0;;:::o;38001:136::-;38070:7;37202:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;;38001:136:0;:::o;52710:363::-;52821:5;52841;52861;52916:15;52932:10;52916:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;52950:1;52916:36;;;;:33;;;;:36;;;;;;;;52967:15;;:27;;52983:10;;52967:27;:::i;:::-;;;;;;;;;;;;;;;;;:33;:36;;;;:33;;:36;;;;;;;;53018:15;;:27;;53034:10;;53018:27;:::i;:::-;;;;;;;;;;;;;;;;53052:1;53018:36;;;;:33;;;;:36;;;;;;52894:171;;;;-1:-1:-1;53018:36:0;;;;;-1:-1:-1;52710:363:0;-1:-1:-1;;52710:363:0:o;53429:1835::-;53641:10;-1:-1:-1;;;;;53586:65:0;:14;53601:10;53586:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;:45;;53621:9;;53586:45;:::i;:::-;;;;;;;;;;;;;;:51;;;-1:-1:-1;;;;;53586:51:0;:65;53564:124;;;;-1:-1:-1;;;53564:124:0;;12745:2:1;53564:124:0;;;12727:21:1;12784:1;12764:18;;;12757:29;-1:-1:-1;;;12802:18:1;;;12795:39;12851:18;;53564:124:0;;;;;;;;;53721:14;53736:10;53721:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;:45;;53756:9;;53721:45;:::i;:::-;;;;;;;;;;;;;;:55;;;;-1:-1:-1;;;53721:55:0;;;;:64;53699:129;;;;-1:-1:-1;;;53699:129:0;;;;;;;:::i;:::-;53839:22;53864:14;53879:10;53864:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;:59;;53913:9;;53864:59;:::i;:::-;;;;;;;;;;;;;;;;;53839:106;;;;;;;;;;;;;;;53864:59;53839:106;;;53864:59;53839:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53962:9;:16;;:43;53979:9;:13;;53993:10;53979:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;53962:43;;;;;;;;;;-1:-1:-1;53962:43:0;:49;;;;;;:54;53958:1299;;54033:21;54057:9;:34;;:61;54092:9;:13;;54106:10;54092:25;;;;;;:::i;:::-;;;;;;;;;;;;;;54057:61;;;;;;;;;;;:86;;54033:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54158:19;54180:31;54195:6;54203:7;54180:14;:31::i;:::-;54158:53;;54250:1;54234:13;:17;;;54226:51;;;;-1:-1:-1;;;54226:51:0;;13426:2:1;54226:51:0;;;13408:21:1;13465:2;13445:18;;;13438:30;-1:-1:-1;;;13484:18:1;;;13477:51;13545:18;;54226:51:0;13224:345:1;54226:51:0;54292:10;54305:15;54321:10;54305:27;;;;;;:::i;:::-;;;;;;;;;;;;;:33;;:107;54380:13;54363:6;:13;54357:36;;;;:::i;:::-;:40;;54396:1;54357:40;:::i;:::-;54305:107;;;;;;;;;;;;;;;-1:-1:-1;54305:107:0;;;;-1:-1:-1;54435:8:0;54427:49;;;;-1:-1:-1;;;54427:49:0;;14217:2:1;54427:49:0;;;14199:21:1;14256:2;14236:18;;;14229:30;-1:-1:-1;;;14275:18:1;;;14268:58;14343:18;;54427:49:0;14015:352:1;54427:49:0;54491:21;54515:97;54561:10;54590:7;54515:27;:97::i;:::-;54491:121;;;;54652:5;54635:22;;:13;:22;;54627:50;;;;-1:-1:-1;;;54627:50:0;;14574:2:1;54627:50:0;;;14556:21:1;14613:2;14593:18;;;14586:30;-1:-1:-1;;;14632:18:1;;;14625:45;14687:18;;54627:50:0;14372:339:1;54627:50:0;54692:13;54843:5;54835:14;;54828:3;54819:4;54811:13;;54736:9;:16;;:43;54753:9;:13;;54767:10;54753:25;;;;;;:::i;:::-;;;;;;;;;;;;;;54736:43;;;;;;;;;;;:57;;;54710:114;;;;:::i;:::-;54709:122;;;;:::i;:::-;54708:141;;;;:::i;:::-;54692:157;;54921:5;54866:9;:16;;:43;54883:9;:13;;54897:10;54883:25;;;;;;:::i;:::-;;;;;;;;;;;;;;54866:43;;;;;;;;;;;:51;;;:60;;;;;;;:::i;:::-;;;;-1:-1:-1;;54941:9:0;:32;;54968:5;;54941:9;:23;;:32;;54968:5;;54941:32;:::i;:::-;;;;;;;;55046:4;54988:14;55003:10;54988:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;:45;;55023:9;;54988:45;:::i;:::-;;;;;;;;;;;;;;:55;;:62;;;;;-1:-1:-1;;;54988:62:0;-1:-1:-1;;;;54988:62:0;;;;;;;;;;55073:10;;55065:35;;;;;55094:5;;-1:-1:-1;54988:45:0;-1:-1:-1;54988:45:0;55094:5;55073:10;55065:35;;;;;;;;;;;;;;;;;;;;;55120:58;55137:10;55149:9;55160:5;55167:10;55120:58;;;;;;;;;:::i;:::-;;;;;;;;54018:1172;;;;;53958:1299;;;55211:34;;-1:-1:-1;;;55211:34:0;;16051:2:1;55211:34:0;;;16033:21:1;16090:2;16070:18;;;16063:30;-1:-1:-1;;;16109:18:1;;;16102:54;16173:18;;55211:34:0;15849:348:1;53958:1299:0;53553:1711;53429:1835;;;:::o;47929:216::-;47978:19;;:::i;:::-;48018:21;;48010:66;;;;-1:-1:-1;;;48010:66:0;;16404:2:1;48010:66:0;;;16386:21:1;16443:2;16423:18;;;16416:30;-1:-1:-1;;;16462:18:1;;;16455:58;16530:18;;48010:66:0;16202:352:1;48010:66:0;48111:21;;48094:16;;:43;;48111:25;;48094:9;;48111:25;:::i;:::-;48094:43;;;;;;;;;;;48087:50;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48087:50:0;;;-1:-1:-1;;48087:50:0;;;;;;;;;;;;;;;;;;;;;47929:216;-1:-1:-1;47929:216:0:o;49166:1318::-;49245:10;49235:9;:21;;;;;;;;;;;;;:29;;:21;:29;49227:61;;;;-1:-1:-1;;;49227:61:0;;;;;;;:::i;:::-;49334:18;;49317:16;;:36;;49334:13;;:18;;49348:3;;49334:18;:::i;:::-;;;;;;;;;;;;;;;;;;;49317:36;;;;;;;;;;-1:-1:-1;49317:36:0;:45;;;;;:53;;:45;:53;:117;;;;-1:-1:-1;49404:18:0;;49387:16;;:36;;49404:13;;:18;;49418:3;;49404:18;:::i;:::-;;;;;;;;;;;;;;;;;;;49387:36;;;;;;;;;;-1:-1:-1;49387:36:0;:42;;;;;;:47;49317:117;49299:195;;;49461:21;49478:3;49461:16;:21::i;:::-;;49299:195;49539:18;;49522:16;;:36;;49539:13;;:18;;49553:3;;49539:18;:::i;:::-;;;;;;;;;;;;;;;;;;;49522:36;;;;;;;;;;-1:-1:-1;49522:36:0;:45;;;;;:53;;:45;:53;:117;;;;-1:-1:-1;49609:18:0;;49592:16;;:36;;49609:13;;:18;;49623:3;;49609:18;:::i;:::-;;;;;;;;;;;;;;;;;49592:36;;;;;;;;;;-1:-1:-1;49592:36:0;:42;;;;;49638:1;49592:47;49522:117;49504:734;;;49666:21;49683:3;49666:16;:21::i;:::-;;49729:11;49741:3;49729:16;;;;;;:::i;:::-;;;;;;;;;;;;;:29;;;49702:11;49714:3;49702:16;;;;;;:::i;:::-;;;;;;;;;;;;;;:24;;:56;49773:12;;49804:154;49826:15;49842:3;49826:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:34;;;;;49822:38;;;;49804:154;;;49913:18;;49896:16;;:36;;49913:13;;:18;;49927:3;;49913:18;:::i;:::-;;;;;;;;;;;;;;49896:36;;;;;;;;;;;:43;;49940:1;49896:46;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;49886:56;;;;;:::i;:::-;;-1:-1:-1;49862:3:0;;49804:154;;;-1:-1:-1;49985:8:0;;;;;;49976:17;;;;49972:255;;;50042:1;50014:11;50026:3;50014:16;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:29;;;;;;;;;;;;;;;;;;50091:1;50062:11;50074:3;50062:16;;;;;;:::i;:::-;;;;;;;;;;;;;:26;;;:30;;;;;;;;;;;;;;;;;;49972:255;;;50161:1;50133:11;50145:3;50133:16;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:29;;;;;;;;;;;;;;;;;;50210:1;50181:11;50193:3;50181:16;;;;;;:::i;:::-;;;;;;;;;;;;;:26;;;:30;;;;;;;;;;;;;;;;;;49972:255;49651:587;49504:734;50326:18;;50295:30;;:50;;50326:13;;:18;;50340:3;;50326:18;:::i;:::-;;;;;;;;;;;;;;50295:50;;;;;;;;;;;:78;;;50248:9;:16;;:36;50265:9;:13;;50279:3;50265:18;;;;;;:::i;:::-;;;;;;;;;;;;;;50248:36;;;;;;;;;;;:44;;:125;;;;50432:5;50384:9;:16;;:36;50401:9;:13;;50415:3;50401:18;;;;;;:::i;:::-;;;;;;;;;;;;;;50384:36;;;;;;;;;;;:45;;;:53;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;50472:3:0;50453:23;;;;;;:::i;:::-;;;;;;;;49166:1318;:::o;13614:103::-;12765:13;:11;:13::i;:::-;13679:30:::1;13706:1;13679:18;:30::i;:::-;13614:103::o:0;50492:817::-;12765:13;:11;:13::i;:::-;50559:21:::1;50595:15;50611:3;50595:20;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:34;::::1;;-1:-1:-1::0;;;;;50583:47:0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;50583:47:0::1;;50559:71;;50646:7;50641:119;50663:15;50679:3;50663:20;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:34;::::1;::::0;;::::1;50659:38:::0;;::::1;;50641:119;;;50742:5;:1:::0;50746::::1;50742:5;:::i;:::-;50732;:1:::0;50736::::1;50732:5;:::i;:::-;50731:17;;;;:::i;:::-;50719:6;50726:1;50719:9;;;;;;;;;;:::i;:::-;:29;::::0;;::::1;:9;::::0;;::::1;::::0;;;;;;;:29;50699:3:::1;;50641:119;;;-1:-1:-1::0;50805:18:0::1;::::0;50788:16;;:36:::1;::::0;50805:13;;:18:::1;::::0;50819:3;;50805:18:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;50788:36;;;;::::1;::::0;;;;;-1:-1:-1;50788:36:0;:45:::1;;::::0;::::1;;:53;;:45:::0;:53:::1;:117:::0;::::1;;;-1:-1:-1::0;50875:18:0::1;::::0;50858:16;;:36:::1;::::0;50875:13;;:18:::1;::::0;50889:3;;50875:18:::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;;50858:36;;;;::::1;::::0;;;;;-1:-1:-1;50858:36:0;:42:::1;;::::0;::::1;;50904:1;50858:47;50788:117;50770:230;;;50959:11;50971:3;50959:16;;;;;;:::i;:::-;;;;;;;;;;;;;:29;;;50932:11;50944:3;50932:16;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:24:::1;;:56:::0;50770:230:::1;51056:6;51010:9;:16:::0;::::1;:36;51027:9;:13;;51041:3;51027:18;;;;;;:::i;:::-;;;;;;;;;;;;;;51010:36;;;;;;;;;;;:43;;:52;;;;;;;;;;;;:::i;:::-;;51121:5;51073:9;:16:::0;::::1;:36;51090:9;:13;;51104:3;51090:18;;;;;;:::i;:::-;;;;;;;;;;;;;;51073:36;;;;;;;;;;;:45;;;:53;;;;;;;;;;;;;;;;;;51184:9;:30:::0;::::1;:50;51215:9;:13;;51229:3;51215:18;;;;;;:::i;:::-;;;;;;;;;;;;;;51184:50;;;;;;;;;;;:78;;;51137:9;:16:::0;::::1;:36;51154:9;:13;;51168:3;51154:18;;;;;;:::i;:::-;;;;;;;;;;;;;;51137:36;;;;;;;;;;;:44;;:125;;;;-1:-1:-1::0;;;;;;;;;;;51297:3:0::1;51278:23;;;;;;:::i;:::-;;;;;;;;50548:761;50492:817:::0;:::o;12879:147::-;12925:7;12945:24;12972:20;:18;:20::i;:::-;13010:8;-1:-1:-1;;;;;13010:8:0;;12879:147;-1:-1:-1;;12879:147:0:o;55272:1495::-;55424:34;55461:26;55476:10;55461:14;:26::i;:::-;55424:63;;55533:15;55549:10;55533:27;;;;;;:::i;:::-;;;;;;;;;;;;;:33;;;55520:9;:46;55498:110;;;;-1:-1:-1;;;55498:110:0;;;;;;;:::i;:::-;55627:23;;;;:31;;55654:4;55627:31;55619:70;;;;-1:-1:-1;;;55619:70:0;;18430:2:1;55619:70:0;;;18412:21:1;18469:2;18449:18;;;18442:30;-1:-1:-1;;;18488:18:1;;;18481:56;18554:18;;55619:70:0;18228:350:1;55619:70:0;55708:14;:20;;;:25;;55732:1;55708:25;55700:58;;;;-1:-1:-1;;;55700:58:0;;;;;;;:::i;:::-;55835:7;55810:14;:22;;;:32;;;;:::i;:::-;55791:15;:51;;55769:119;;;;-1:-1:-1;;;55769:119:0;;;;;;;:::i;:::-;55939:15;55955:10;55939:27;;;;;;:::i;:::-;;;;;;;;;;;;;;:41;55921:14;;55939:41;;;;55921:59;55899:136;;;;-1:-1:-1;;;55899:136:0;;;;;;;:::i;:::-;56068:46;56083:7;56098;:14;56068;:46::i;:::-;:55;56046:141;;;;-1:-1:-1;;;56046:141:0;;19837:2:1;56046:141:0;;;19819:21:1;19876:2;19856:18;;;19849:30;19915:34;19895:18;;;19888:62;-1:-1:-1;;;19966:18:1;;;19959:34;20010:19;;56046:141:0;19635:400:1;56046:141:0;56230:41;;;;;;;;;;;56253:10;56230:41;;;;;;;;56200:27;56230:41;;;;;;56316:25;;56230:41;;56200:27;56316:25;;56244:7;;56316:25;;:::i;:::-;;;;;;;;;;;;;56306:36;;;;;;56282:60;;56353:14;56368:10;56353:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:55;;;;:40;;;;:55;;;;;:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;56469:6;56421:14;56436:10;56421:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;:45;;56456:9;;56421:45;:::i;:::-;;;;;;;;;;;;;:54;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;56421:54:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;56421:54:0;-1:-1:-1;;;;;;56421:54:0;;;-1:-1:-1;;;;;56421:54:0;;;;;;;;;;;;;56505:25;56549:9;;56488:16;;56421:54;;56505:13;;:25;;56519:10;;56505:25;:::i;:::-;;;;;;;;;;;;;;56488:43;;;;;;;;;;;:57;;;:70;;;;;;;:::i;:::-;;;;-1:-1:-1;;56647:9:0;:36;;56674:9;;56647;:23;;:36;;56674:9;;56647:36;:::i;:::-;;;;-1:-1:-1;;56699:60:0;;;;;;56714:10;;56726:9;;56737;;56748:10;;56699:60;:::i;:::-;;;;;;;;55413:1354;;;55272:1495;;;:::o;43973:1167::-;44058:34;44095:26;44110:10;44095:14;:26::i;:::-;44058:63;;44140:8;:13;;44152:1;44140:13;:30;;;;44157:8;:13;;44169:1;44157:13;44140:30;44132:59;;;;-1:-1:-1;;;44132:59:0;;21090:2:1;44132:59:0;;;21072:21:1;21129:2;21109:18;;;21102:30;-1:-1:-1;;;21148:18:1;;;21141:46;21204:18;;44132:59:0;20888:340:1;44132:59:0;44237:15;44253:10;44237:27;;;;;;:::i;:::-;;;;;;;;;;;;;:33;;;44224:9;:46;;44202:110;;;;-1:-1:-1;;;44202:110:0;;;;;;;:::i;:::-;44331:23;;;;:31;;44358:4;44331:31;44323:70;;;;-1:-1:-1;;;44323:70:0;;21435:2:1;44323:70:0;;;21417:21:1;21474:2;21454:18;;;21447:30;-1:-1:-1;;;21493:18:1;;;21486:56;21559:18;;44323:70:0;21233:350:1;44323:70:0;44412:14;:20;;;:25;;44436:1;44412:25;44404:58;;;;-1:-1:-1;;;44404:58:0;;;;;;;:::i;:::-;44539:7;44514:14;:22;;;:32;;;;:::i;:::-;44495:15;:51;;44473:119;;;;-1:-1:-1;;;44473:119:0;;;;;;;:::i;:::-;44643:9;44603:11;44615:10;44603:23;;;;;;:::i;:::-;;;;;;;;;;;;;:36;;;:49;;;;;;;:::i;:::-;;;;;;;;44721:9;44663:11;44675:10;44663:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:41;;;:31;:41;;;;;;;:67;;:41;;:31;:67;;;;;:::i;:::-;;;;-1:-1:-1;;44741:23:0;;:11;;:23;;44753:10;;44741:23;:::i;:::-;;;;;;;;;;;;;;;;:41;;;:31;:41;;;;;;;:51;;:53;;;;;;:::i;:::-;;;;;;44917:9;44805:11;44817:10;44805:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:55;;;:45;:55;;;;;;;;;44880:10;44805:86;;:74;;:86;;;;;:108;;:121;;:108;;:45;:121;;;;;:::i;:::-;;;;-1:-1:-1;;44956:25:0;;45000:9;;44939:16;;:43;;44956:13;;:25;;44970:10;;44956:25;:::i;:::-;;;;;;;;;;;;;;44939:43;;;;;;;;;;;:57;;;:70;;;;;;;:::i;:::-;;;;-1:-1:-1;;45020:9:0;:36;;45047:9;;45020;:23;;:36;;45047:9;;45020:36;:::i;:::-;;;;-1:-1:-1;;45074:58:0;;;;;;45088:10;;45100:8;;45110:9;;45121:10;;45074:58;:::i;:::-;;;;;;;;44047:1093;43973:1167;;:::o;47661:260::-;47764:7;47773;47820:11;47832:10;47820:23;;;;;;:::i;:::-;;;;;;;;;;;;;:36;;;47871:11;47883:10;47871:23;;;;;;:::i;:::-;;;;;;;;;;;;;:31;;;47798:115;;;;47661:260;;;:::o;41349:143::-;4349:30;4382:26;:24;:26::i;:::-;4496:15;;4349:59;;-1:-1:-1;4496:15:0;-1:-1:-1;;;4496:15:0;;;4495:16;;-1:-1:-1;;;;;4543:14:0;4473:19;4928:16;;:34;;;;;4948:14;4928:34;4908:54;;4973:17;4993:11;-1:-1:-1;;;;;4993:16:0;5008:1;4993:16;:50;;;;-1:-1:-1;5021:4:0;5013:25;:30;4993:50;4973:70;;5061:12;5060:13;:30;;;;;5078:12;5077:13;5060:30;5056:93;;;5114:23;;-1:-1:-1;;;5114:23:0;;;;;;;;;;;5056:93;5159:18;;-1:-1:-1;;;;;;5159:18:0;5176:1;5159:18;;;5188:69;;;;5223:22;;-1:-1:-1;;;;5223:22:0;-1:-1:-1;;;5223:22:0;;;5188:69;41421:28:::1;41436:12;41421:14;:28::i;:::-;41460:24;:22;:24::i;:::-;5283:14:::0;5279:104;;;5314:23;;-1:-1:-1;;;;5314:23:0;;;5357:14;;-1:-1:-1;22360:50:1;;5357:14:0;;22348:2:1;22333:18;5357:14:0;22207:209:1;5279:104:0;4281:1109;;;;;41349:143;:::o;51317:842::-;51494:10;51484:9;:21;;;;;;;;;;;;;:29;;:21;:29;51476:61;;;;-1:-1:-1;;;51476:61:0;;;;;;;:::i;:::-;51556:21;;:13;;:21;;51570:6;;51556:21;:::i;:::-;;;;;;;;;;;;;;51581:1;51556:26;51548:48;;;;-1:-1:-1;;;51548:48:0;;22623:2:1;51548:48:0;;;22605:21:1;22662:1;22642:18;;;22635:29;-1:-1:-1;;;22680:18:1;;;22673:39;22729:18;;51548:48:0;22421:332:1;51548:48:0;51607:23;51623:6;51607:15;:23::i;:::-;51701:215;;;;;;;;;;;;;;;;;;51770:21;;51701:215;;;;;;51770:9;51641:21;51701:215;;;;;;;51673:25;51701:215;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51929:39;;;:16;:39;;;;;;;:47;;51701:215;;51929:39;;;:47;;:39;:47;:::i;:::-;-1:-1:-1;51929:47:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51929:47:0;;;;;;;;;;;;;;;;;-1:-1:-1;;51929:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51929:47:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51929:47:0;;;;;;;;;;;52011:21;;51987;;52011;;51987;;52001:6;;51987:21;:::i;:::-;;;;;;;;;;;;;;:45;52043:21;:23;;;:21;:23;;;:::i;:::-;;;;;;52077:32;52095:6;52103:5;52077:17;:32::i;:::-;52125:26;52144:6;52125:26;;;;;;:::i;48980:178::-;49070:19;;:::i;:::-;49131:18;;49114:16;;:36;;49131:13;;:18;;49145:3;;49131:18;:::i;:::-;;;;;;;;;;;;;;49114:36;;;;;;;;;;;49107:43;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49107:43:0;;;-1:-1:-1;;49107:43:0;;;;;;;;;;;;;;;;;;;;;48980:178;-1:-1:-1;;48980:178:0:o;13872:220::-;12765:13;:11;:13::i;:::-;-1:-1:-1;;;;;13957:22:0;::::1;13953:93;;14031:1;14003:31;;-1:-1:-1::0;;;14003:31:0::1;;;;;;;;:::i;13953:93::-;14056:28;14075:8;14056:18;:28::i;:::-;13872:220:::0;:::o;45592:1754::-;45674:25;;45657:16;;:43;;45674:13;;:25;;45688:10;;45674:25;:::i;:::-;;;;;;;;;;;;;;;;;45657:43;;;;;;;;;;-1:-1:-1;45657:43:0;:49;;;;;45710:1;45657:54;45653:1686;;45728:14;45745:11;45757:10;45745:23;;;;;;:::i;:::-;;;;;;;;;;;;;;:32;;;;;;-1:-1:-1;45745:32:0;;45810:11;;:23;;45822:10;;45810:23;:::i;:::-;;;;;;;;;;;;;;:33;;;;;;;;;;-1:-1:-1;46019:1:0;;45884:11;;:23;;45896:10;;45884:23;:::i;:::-;;;;;;;;;;;;;;;;:63;;;:53;:63;;;;;;;;;45975:10;45884:102;;:90;;:102;;;;;:132;;;:136;45858:209;;;;-1:-1:-1;;;45858:209:0;;25078:2:1;45858:209:0;;;25060:21:1;25117:2;25097:18;;;25090:30;-1:-1:-1;;;25136:18:1;;;25129:41;25187:18;;45858:209:0;24876:335:1;45858:209:0;46108:11;46120:10;46108:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:63;;;;:53;:63;;;;;;;;;46199:10;46108:102;;:90;;:102;;;;:134;;:143;46082:220;;;;-1:-1:-1;;;46082:220:0;;;;;;;:::i;:::-;46317:16;46336:11;46348:10;46336:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:59;;;:49;:59;;;;;;;;:90;;-1:-1:-1;46461:11:0;;:23;;46473:10;;46461:23;:::i;:::-;;;;;;;;;;;;;;;;:60;;;:49;:60;;;;;;;;:91;;-1:-1:-1;46588:11:0;;:23;;46600:10;;46588:23;:::i;:::-;;;;;;;;;;;;;;;;:59;;;;:49;:59;;;;;;;;;46671:10;46588:94;;:82;;:94;;;;;;:120;;;46762:7;;46588:120;;-1:-1:-1;46588:49:0;;:120;;46829:8;;46588:120;;46774:3;;46742:28;;46762:7;;;;46742:9;:28;:::i;:::-;46741:36;;;;:::i;:::-;46740:68;;;;:::i;:::-;46739:98;;;;:::i;:::-;:128;;;;:::i;:::-;46723:144;;46937:5;46882:9;:16;;:43;46899:9;:13;;46913:10;46899:25;;;;;;:::i;:::-;;;;;;;;;;;;;;46882:43;;;;;;;;;;;:51;;;:60;;;;;;;:::i;:::-;;;;;;;;46992:5;46957:11;46969:10;46957:23;;;;;;:::i;:::-;;;;;;;;;;;;;:31;;;:40;;;;;;;:::i;:::-;;;;;;;;47137:4;47012:11;47024:10;47012:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:59;;;:49;:59;;;;;;;;;47095:10;47012:94;;;:82;;;;:94;;;;;;:129;;;;;-1:-1:-1;;47012:129:0;;;;;;;;;;47156:35;;;;;47185:5;;47012:23;:49;:23;47185:5;47095:10;47156:35;;;;;;;;;;;;;;;;;;;;;47213:54;47227:10;47239:8;47249:5;47256:10;47213:54;;;;;;;;;:::i;:::-;;;;;;;;45713:1566;;;;;;13872:220;:::o;45653:1686::-;47300:27;;-1:-1:-1;;;47300:27:0;;25418:2:1;47300:27:0;;;25400:21:1;25457:2;25437:18;;;25430:30;-1:-1:-1;;;25476:18:1;;;25469:47;25533:18;;47300:27:0;25216:341:1;38920:319:0;39002:4;-1:-1:-1;;;;;39011:6:0;38994:23;;;:121;;;39109:6;-1:-1:-1;;;;;39073:42:0;:32;-1:-1:-1;;;;;;;;;;;29533:53:0;-1:-1:-1;;;;;29533:53:0;;29454:140;39073:32;-1:-1:-1;;;;;39073:42:0;;;38994:121;38976:256;;;39191:29;;-1:-1:-1;;;39191:29:0;;;;;;;;;;;41500:116;12765:13;:11;:13::i;40414:548::-;40532:17;-1:-1:-1;;;;;40514:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40514:52:0;;;;;;;;-1:-1:-1;;40514:52:0;;;;;;;;;;;;:::i;:::-;;;40510:445;;40925:17;40883:60;;-1:-1:-1;;;40883:60:0;;;;;;;;:::i;40510:445::-;-1:-1:-1;;;;;;;;;;;40609:40:0;;40605:122;;40677:34;;-1:-1:-1;;;40677:34:0;;;;;6194:25:1;;;6167:18;;40677:34:0;6048:177:1;40605:122:0;40741:54;40771:17;40790:4;40741:29;:54::i;:::-;40567:240;40414:548;;:::o;39362:218::-;39437:4;-1:-1:-1;;;;;39446:6:0;39429:23;;39425:148;;39532:29;;-1:-1:-1;;;39532:29:0;;;;;;;;;;;60509:440;60625:5;;;60675:243;60697:4;:11;60693:1;:15;;;60675:243;;;60735:7;60730:177;60752:4;:11;60748:1;:15;;;60730:177;;;60804:4;60809:1;60804:7;;;;;;;;;;:::i;:::-;;;;;;;60793:18;;:4;60798:1;60793:7;;;;;;;;;;:::i;:::-;;;;;;;:18;;;60789:103;;60836:8;;;;:::i;:::-;;;;60867:5;;60789:103;60765:3;;;;:::i;:::-;;;;60730:177;;;-1:-1:-1;60710:3:0;;;;:::i;:::-;;;;60675:243;;;-1:-1:-1;60935:6:0;60509:440;-1:-1:-1;;;60509:440:0:o;56775:419::-;56902:5;56960:15;56976:3;56960:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:34;56942:14;;56960:34;;;;56942:52;56920:129;;;;-1:-1:-1;;;56920:129:0;;;;;;;:::i;:::-;57060:21;57111:7;57094:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;57084:36;;;;;;57060:60;;57138:14;57153:3;57138:19;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:48;;;;:33;;:48;;;;;;;;;56775:419;-1:-1:-1;;;56775:419:0:o;57431:1214::-;57511:14;57543:34;57580:19;57595:3;57580:14;:19::i;:::-;57543:56;;57664:21;57700:15;57716:3;57700:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:34;;;-1:-1:-1;;;;;57688:47:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57688:47:0;;57664:71;;57774:7;57769:702;57791:15;57807:3;57791:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:34;;;;;57787:38;;;;57769:702;;;57883:147;57912:14;:17;;;57952:1;57883:147;;57976:15;57992:3;57976:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:35;;;;;;;57883:6;:147::i;:::-;57847:6;57854:1;57847:9;;;;;;;;;;:::i;:::-;:198;;;;:9;;;;;;;;;:198;58064:20;;;;:25;58088:1;58064:25;58060:400;;58110:335;58117:29;58132:6;58140:5;:1;58144;58140:5;:::i;:::-;58117:14;:29::i;:::-;:37;;58150:4;58117:37;58110:335;;58223:179;58260:14;:17;;;58308:1;58223:179;;58340:15;58356:3;58340:20;;;;;;:::i;58223:179::-;58179:6;58186:1;58179:9;;;;;;;;;;:::i;:::-;;;;;;:246;;;;;;;;;;;58110:335;;;57827:3;;57769:702;;;;58483:53;58493:6;58507:1;58533;58517:6;:13;:17;;;;:::i;:::-;58483:9;:53::i;:::-;58607:6;58547:9;:16;;:50;58564:9;:13;;58578:14;:17;;;58564:32;;;;;;:::i;:::-;;;;;;;;;;;;;;58547:50;;;;;;;;;;;:57;;:66;;;;;;;;;;;;:::i;13104:166::-;10204:10;13164:7;:5;:7::i;:::-;-1:-1:-1;;;;;13164:23:0;;13160:103;;10204:10;13211:40;;-1:-1:-1;;;13211:40:0;;;;;;;;:::i;14252:253::-;14326:24;14353:20;:18;:20::i;:::-;14403:8;;-1:-1:-1;;;;;14422:19:0;;;-1:-1:-1;;;;;;14422:19:0;;;;;;14457:40;;14326:47;;-1:-1:-1;14403:8:0;;;;;14457:40;;14384:16;;14457:40;14315:190;;14252:253;:::o;11587:163::-;11710:22;;11587:163::o;60155:346::-;60263:4;;60285:186;60307:10;60316:1;60307:6;:10;:::i;:::-;60303:14;;:1;:14;;;60285:186;;;60344:7;60354:5;:1;60358;60354:5;:::i;:::-;60344:15;;60339:121;60365:6;60361:10;;:1;:10;;;60339:121;;;60411:3;60415:1;60411:6;;;;;;;;;;:::i;:::-;;;;;;;60401:16;;:3;60405:1;60401:6;;;;;;;;;;:::i;:::-;;;;;;;:16;;;:30;;;;;60430:1;60421:3;60425:1;60421:6;;;;;;;;;;:::i;:::-;;;;;;;:10;;;60401:30;60397:47;;;60440:4;60433:11;;;;;;60397:47;60373:3;;60339:121;;;-1:-1:-1;60319:3:0;;60285:186;;;-1:-1:-1;60488:5:0;;60155:346;-1:-1:-1;;;60155:346:0:o;9045:174::-;9180:21;;9045:174::o;12263:129::-;7187:20;:18;:20::i;:::-;12346:38:::1;12371:12;12346:24;:38::i;37250:68::-:0;7187:20;:18;:20::i;52167:535::-;52267:1;52252:159;52275:1;52270;:6;;;52252:159;;52337:21;;;;;;;;:14;:21;;;;;;;;:62;;;;;:27;;:62;;;;;;;;52298:27;;52337:62;;;52298:15;;:27;;52314:10;;52298:27;:::i;:::-;;;;;;;;;;;;;;;;:36;;;;;;;;:33;;;;:36;;;;:101;;-1:-1:-1;;52298:101:0;;;;;;;;;;;:36;52278:3;52298:36;52278:3;:::i;:::-;;;;52252:159;;;-1:-1:-1;52465:21:0;;;;;;;;:14;:21;;;;;;;:49;52421:27;;52465:49;;;52421:15;;:27;;52437:10;;52421:27;:::i;:::-;;;;;;;;;;;;;;;;:93;;-1:-1:-1;;52421:93:0;;;;;;;;52570:21;;;-1:-1:-1;52570:21:0;;;:14;:21;;;;;:50;52421:93;52570:50;;;;;;52525:15;;:27;;52541:10;;52525:27;:::i;:::-;;;;;;;;;;;;;;;;:95;;-1:-1:-1;;52525:95:0;;;;;;;;;;52667:21;;;-1:-1:-1;52667:21:0;;;:14;:21;;;;;-1:-1:-1;52667:27:0;;;52631:15;;:27;;52647:10;;52631:27;:::i;:::-;;;;;;;;;;;;;;:33;;:63;-1:-1:-1;;52167:535:0:o;30298:353::-;30390:37;30409:17;30390:18;:37::i;:::-;30443:36;;-1:-1:-1;;;;;30443:36:0;;;;;;;;30496:11;;:15;30492:152;;30528:53;30557:17;30576:4;30528:28;:53::i;30492:152::-;30614:18;:16;:18::i;58653:825::-;58778:7;59468:1;59434:22;;;59229:3;59263:16;59310:15;59356:5;;;;:::i;:::-;;;59182:206;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;59182:206:0;;;;;;;;;;59146:265;;59182:206;59146:265;;;;;58878:184;;58921:16;;58964:3;;58994:15;;59036:3;;58878:184;;:::i;:::-;;;;;;;;;;;;;58846:235;;;;;;58820:276;;:610;;;;:::i;:::-;58819:637;;;;:::i;:::-;58818:652;;;;:::i;:::-;58798:672;;58653:825;;;;;;:::o;59486:661::-;59619:4;59644:5;59664:6;;;;;;;;59660:19;;59672:7;;59486:661;;;:::o;59660:19::-;59689:11;59703:3;59737:1;59721:12;59729:4;59721:5;:12;:::i;:::-;59720:18;;;;:::i;:::-;59713:25;;:4;:25;:::i;:::-;59703:37;;;;;;;;;;:::i;:::-;;;;;;;59689:51;;59751:291;59763:1;59758:6;;:1;:6;;;59751:291;;59781:33;59804:5;59788:21;;:3;59798:1;59788:13;;;;;;;;;;:::i;:::-;;;;;;;:21;;;59781:33;;;59811:3;;;;:::i;:::-;;;;59781:33;;;59844:3;59854:1;59844:13;;;;;;;;;;:::i;:::-;;;;;;;59836:21;;:5;:21;;;59829:33;;;59859:3;;;;:::i;:::-;;;;59829:33;;;59886:1;59881:6;;:1;:6;;;59877:154;;59942:3;59952:1;59942:13;;;;;;;;;;:::i;:::-;;;;;;;59957:3;59967:1;59957:13;;;;;;;;;;:::i;:::-;;;;;;;59909:3;59919:1;59909:13;;;;;;;;;;:::i;:::-;;;;;;59924:3;59934:1;59924:13;;;;;;;;;;:::i;:::-;59908:63;;;;59924:13;;;;;;;;;59908:63;;;;;59990:3;;;;:::i;:::-;;;;60012;;;;;:::i;:::-;;;;59877:154;59751:291;;;60063:1;60056:8;;:4;:8;;;60052:37;;;60066:23;60076:3;60081:4;60087:1;60066:9;:23::i;:::-;60108:5;60104:9;;:1;:9;;;60100:39;;;60115:24;60125:3;60130:1;60133:5;60115:9;:24::i;7347:145::-;7415:17;:15;:17::i;:::-;7410:75;;7456:17;;-1:-1:-1;;;7456:17:0;;;;;;;;;;;12400:240;7187:20;:18;:20::i;29691:286::-;29769:17;-1:-1:-1;;;;;29769:29:0;;29802:1;29769:34;29765:121;;29856:17;29827:47;;-1:-1:-1;;;29827:47:0;;;;;;;;:::i;29765:121::-;-1:-1:-1;;;;;;;;;;;29896:73:0;;-1:-1:-1;;;;;;29896:73:0;-1:-1:-1;;;;;29896:73:0;;;;;;;;;;29691:286::o;21595:256::-;21678:12;21704;21718:23;21745:6;-1:-1:-1;;;;;21745:19:0;21765:4;21745:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21703:67;;;;21788:55;21815:6;21823:7;21832:10;21788:26;:55::i;:::-;21781:62;21595:256;-1:-1:-1;;;;;21595:256:0:o;34252:126::-;34303:9;:13;34299:72;;34340:19;;-1:-1:-1;;;34340:19:0;;;;;;;;;;;8787:122;8837:4;8861:26;:24;:26::i;:::-;:40;-1:-1:-1;;;8861:40:0;;;;;;-1:-1:-1;8787:122:0:o;22126:597::-;22274:12;22304:7;22299:417;;22328:19;22336:10;22328:7;:19::i;:::-;22299:417;;;22556:17;;:22;:49;;;;-1:-1:-1;;;;;;22582:18:0;;;:23;22556:49;22552:121;;;22650:6;22633:24;;-1:-1:-1;;;22633:24:0;;;;;;;;:::i;22552:121::-;-1:-1:-1;22694:10:0;22687:17;;23280:498;23413:17;;:21;23409:362;;23613:10;23607:17;23670:15;23657:10;23653:2;23649:19;23642:44;23409:362;23740:19;;-1:-1:-1;;;23740:19:0;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;536:127:1;597:10;592:3;588:20;585:1;578:31;628:4;625:1;618:15;652:4;649:1;642:15;668:275;739:2;733:9;804:2;785:13;;-1:-1:-1;;781:27:1;769:40;;-1:-1:-1;;;;;824:34:1;;860:22;;;821:62;818:88;;;886:18;;:::i;:::-;922:2;915:22;668:275;;-1:-1:-1;668:275:1:o;948:558::-;990:5;1043:3;1036:4;1028:6;1024:17;1020:27;1010:55;;1061:1;1058;1051:12;1010:55;1088:20;;-1:-1:-1;;;;;1120:30:1;;1117:56;;;1153:18;;:::i;:::-;1197:59;1244:2;1221:17;;-1:-1:-1;;1217:31:1;1250:4;1213:42;1197:59;:::i;:::-;1281:6;1272:7;1265:23;1335:3;1328:4;1319:6;1311;1307:19;1303:30;1300:39;1297:59;;;1352:1;1349;1342:12;1297:59;1417:6;1410:4;1402:6;1398:17;1391:4;1382:7;1378:18;1365:59;1473:1;1444:20;;;1466:4;1440:31;1433:42;;;;1448:7;948:558;-1:-1:-1;;;948:558:1:o;1511:320::-;1579:6;1632:2;1620:9;1611:7;1607:23;1603:32;1600:52;;;1648:1;1645;1638:12;1600:52;1675:23;;-1:-1:-1;;;;;1710:30:1;;1707:50;;;1753:1;1750;1743:12;1707:50;1776:49;1817:7;1808:6;1797:9;1793:22;1776:49;:::i;:::-;1766:59;1511:320;-1:-1:-1;;;;1511:320:1:o;1836:618::-;2022:2;2034:21;;;2104:13;;2007:18;;;2126:22;;;1974:4;;2205:15;;;2179:2;2164:18;;;1974:4;2248:180;2262:6;2259:1;2256:13;2248:180;;;2327:13;;2342:4;2323:24;2311:37;;2377:2;2403:15;;;;2368:12;;;;2284:1;2277:9;2248:180;;;-1:-1:-1;2445:3:1;;1836:618;-1:-1:-1;;;;;1836:618:1:o;2459:534::-;2545:6;2553;2606:2;2594:9;2585:7;2581:23;2577:32;2574:52;;;2622:1;2619;2612:12;2574:52;2649:23;;-1:-1:-1;;;;;2684:30:1;;2681:50;;;2727:1;2724;2717:12;2681:50;2750:49;2791:7;2782:6;2771:9;2767:22;2750:49;:::i;:::-;2740:59;-1:-1:-1;;2852:2:1;2837:18;;2824:32;-1:-1:-1;;;;;2868:32:1;;2865:52;;;2913:1;2910;2903:12;2865:52;2936:51;2979:7;2968:8;2957:9;2953:24;2936:51;:::i;:::-;2926:61;;;2459:534;;;;;:::o;2998:429::-;3049:3;3087:5;3081:12;3114:6;3109:3;3102:19;3146:4;3141:3;3137:14;3130:21;;3185:4;3178:5;3174:16;3208:1;3218:184;3232:6;3229:1;3226:13;3218:184;;;3297:13;;3312:4;3293:24;3281:37;;3347:4;3338:14;;;;3375:17;;;;3254:1;3247:9;3218:184;;;-1:-1:-1;3418:3:1;;2998:429;-1:-1:-1;;;;2998:429:1:o;3528:552::-;3719:2;3708:9;3701:21;3682:4;3757:6;3751:13;3800:4;3795:2;3784:9;3780:18;3773:32;3828:61;3884:3;3873:9;3869:19;3855:12;3828:61;:::i;:::-;3947:2;3935:15;;3929:22;-1:-1:-1;;;;;3925:48:1;3920:2;3905:18;;;3898:76;;;;4032:15;;;4026:22;4019:30;4012:38;4005:4;3990:20;;;3983:68;;;;-1:-1:-1;3814:75:1;;3528:552;-1:-1:-1;3528:552:1:o;4085:156::-;4151:20;;4211:4;4200:16;;4190:27;;4180:55;;4231:1;4228;4221:12;4180:55;4085:156;;;:::o;4246:296::-;4312:6;4320;4373:2;4361:9;4352:7;4348:23;4344:32;4341:52;;;4389:1;4386;4379:12;4341:52;4412:27;4429:9;4412:27;:::i;:::-;4402:37;4508:2;4493:18;;;;4480:32;;-1:-1:-1;;;4246:296:1:o;4547:182::-;4604:6;4657:2;4645:9;4636:7;4632:23;4628:32;4625:52;;;4673:1;4670;4663:12;4625:52;4696:27;4713:9;4696:27;:::i;5072:173::-;5140:20;;-1:-1:-1;;;;;5189:31:1;;5179:42;;5169:70;;5235:1;5232;5225:12;5250:394;5327:6;5335;5388:2;5376:9;5367:7;5363:23;5359:32;5356:52;;;5404:1;5401;5394:12;5356:52;5431:23;;-1:-1:-1;;;;;5466:30:1;;5463:50;;;5509:1;5506;5499:12;5463:50;5532:49;5573:7;5564:6;5553:9;5549:22;5532:49;:::i;:::-;5522:59;;;5600:38;5634:2;5623:9;5619:18;5600:38;:::i;:::-;5590:48;;5250:394;;;;;:::o;5649:::-;5726:6;5734;5787:2;5775:9;5766:7;5762:23;5758:32;5755:52;;;5803:1;5800;5793:12;5755:52;5826:29;5845:9;5826:29;:::i;:::-;5816:39;-1:-1:-1;5906:2:1;5891:18;;5878:32;-1:-1:-1;;;;;5922:30:1;;5919:50;;;5965:1;5962;5955:12;6575:604;6668:6;6676;6684;6737:2;6725:9;6716:7;6712:23;6708:32;6705:52;;;6753:1;6750;6743:12;6705:52;6780:23;;-1:-1:-1;;;;;6815:30:1;;6812:50;;;6858:1;6855;6848:12;6812:50;6881:49;6922:7;6913:6;6902:9;6898:22;6881:49;:::i;:::-;6871:59;-1:-1:-1;;6983:2:1;6968:18;;6955:32;-1:-1:-1;;;;;6999:32:1;;6996:52;;;7044:1;7041;7034:12;6996:52;7067:51;7110:7;7099:8;7088:9;7084:24;7067:51;:::i;:::-;7057:61;;;7137:36;7169:2;7158:9;7154:18;7137:36;:::i;:::-;7127:46;;6575:604;;;;;:::o;7184:297::-;7234:3;7272:5;7266:12;7299:6;7294:3;7287:19;7355:6;7348:4;7341:5;7337:16;7330:4;7325:3;7321:14;7315:47;7407:1;7400:4;7391:6;7386:3;7382:16;7378:27;7371:38;7470:4;7463:2;7459:7;7454:2;7446:6;7442:15;7438:29;7433:3;7429:39;7425:50;7418:57;;;7184:297;;;;:::o;7486:1263::-;7675:2;7664:9;7657:21;7638:4;7713:6;7707:13;7756:6;7751:2;7740:9;7736:18;7729:34;7786:60;7841:3;7830:9;7826:19;7812:12;7786:60;:::i;:::-;7772:74;;7895:2;7887:6;7883:15;7877:22;7967:2;7963:7;7951:9;7943:6;7939:22;7935:36;7930:2;7919:9;7915:18;7908:64;7995:49;8037:6;8021:14;7995:49;:::i;:::-;7981:63;;;8098:2;8090:6;8086:15;8080:22;8075:2;8064:9;8060:18;8053:50;8152:2;8144:6;8140:15;8134:22;8165:52;8212:3;8201:9;8197:19;8181:14;3502:13;3495:21;3483:34;;3432:91;8165:52;;8272:3;8264:6;8260:16;8254:23;8248:3;8237:9;8233:19;8226:52;8333:3;8325:6;8321:16;8315:23;8309:3;8298:9;8294:19;8287:52;8388:3;8380:6;8376:16;8370:23;8462:2;8458:7;8446:9;8438:6;8434:22;8430:36;8424:3;8413:9;8409:19;8402:65;8490:50;8533:6;8517:14;8490:50;:::i;:::-;8476:64;;;8595:3;8587:6;8583:16;8577:23;8571:3;8560:9;8556:19;8549:52;8650:3;8642:6;8638:16;8632:23;8664:56;8712:6;8701:9;8697:22;8681:14;334:4;323:16;311:29;;267:75;8754:252;8818:6;8826;8879:2;8867:9;8858:7;8854:23;8850:32;8847:52;;;8895:1;8892;8885:12;8847:52;8918:27;8935:9;8918:27;:::i;:::-;8908:37;;8964:36;8996:2;8985:9;8981:18;8964:36;:::i;9011:203::-;-1:-1:-1;;;;;9175:32:1;;;;9157:51;;9145:2;9130:18;;9011:203::o;9219:1366::-;9337:6;9345;9353;9406:2;9394:9;9385:7;9381:23;9377:32;9374:52;;;9422:1;9419;9412:12;9374:52;9449:23;;-1:-1:-1;;;;;9484:30:1;;9481:50;;;9527:1;9524;9517:12;9481:50;9550:49;9591:7;9582:6;9571:9;9567:22;9550:49;:::i;:::-;9540:59;-1:-1:-1;;9652:2:1;9637:18;;9624:32;-1:-1:-1;;;;;9668:32:1;;9665:52;;;9713:1;9710;9703:12;9665:52;9736:51;9779:7;9768:8;9757:9;9753:24;9736:51;:::i;:::-;9726:61;-1:-1:-1;;9840:2:1;9825:18;;9812:32;-1:-1:-1;;;;;9856:32:1;;9853:52;;;9901:1;9898;9891:12;9853:52;9924:24;;9979:4;9971:13;;9967:27;-1:-1:-1;9957:55:1;;10008:1;10005;9998:12;9957:55;10035:16;;-1:-1:-1;;;;;10063:30:1;;10060:56;;;10096:18;;:::i;:::-;10142:6;10139:1;10135:14;10169:28;10193:2;10189;10185:11;10169:28;:::i;:::-;10231:19;;;10275:2;10305:11;;;10301:20;;;10266:12;;;;10333:19;;;10330:39;;;10365:1;10362;10355:12;10330:39;10397:2;10393;10389:11;10378:22;;10409:146;10425:6;10420:3;10417:15;10409:146;;;10491:21;10508:3;10491:21;:::i;:::-;10479:34;;10542:2;10442:12;;;;10533;;;;10409:146;;;10574:5;10564:15;;;;;;;9219:1366;;;;;:::o;10590:390::-;10665:6;10673;10726:2;10714:9;10705:7;10701:23;10697:32;10694:52;;;10742:1;10739;10732:12;10694:52;10769:23;;-1:-1:-1;;;;;10804:30:1;;10801:50;;;10847:1;10844;10837:12;10801:50;10870:49;10911:7;10902:6;10891:9;10887:22;10870:49;:::i;:::-;10860:59;;;10938:36;10970:2;10959:9;10955:18;10938:36;:::i;10985:228::-;11134:2;11123:9;11116:21;11097:4;11154:53;11203:2;11192:9;11188:18;11180:6;11154:53;:::i;11218:186::-;11277:6;11330:2;11318:9;11309:7;11305:23;11301:32;11298:52;;;11346:1;11343;11336:12;11298:52;11369:29;11388:9;11369:29;:::i;11409:719::-;11511:6;11519;11527;11535;11588:3;11576:9;11567:7;11563:23;11559:33;11556:53;;;11605:1;11602;11595:12;11556:53;11632:23;;-1:-1:-1;;;;;11667:30:1;;11664:50;;;11710:1;11707;11700:12;11664:50;11733:49;11774:7;11765:6;11754:9;11750:22;11733:49;:::i;:::-;11723:59;-1:-1:-1;;11835:2:1;11820:18;;11807:32;-1:-1:-1;;;;;11851:32:1;;11848:52;;;11896:1;11893;11886:12;11848:52;11919:51;11962:7;11951:8;11940:9;11936:24;11919:51;:::i;:::-;11909:61;-1:-1:-1;;12039:2:1;12024:18;;12011:32;;-1:-1:-1;12086:36:1;12118:2;12103:18;;12086:36;:::i;:::-;12076:46;;11409:719;;;;;;;:::o;12133:211::-;12174:3;12212:5;12206:12;12256:6;12249:4;12242:5;12238:16;12233:3;12227:36;12318:1;12282:16;;12307:13;;;-1:-1:-1;12282:16:1;;12133:211;-1:-1:-1;12133:211:1:o;12349:189::-;12478:3;12503:29;12528:3;12520:6;12503:29;:::i;12880:339::-;13082:2;13064:21;;;13121:2;13101:18;;;13094:30;-1:-1:-1;;;13155:2:1;13140:18;;13133:45;13210:2;13195:18;;12880:339::o;13574:127::-;13635:10;13630:3;13626:20;13623:1;13616:31;13666:4;13663:1;13656:15;13690:4;13687:1;13680:15;13706:151;13796:4;13789:12;;;13775;;;13771:31;;13814:14;;13811:40;;;13831:18;;:::i;13862:148::-;13950:4;13929:12;;;13943;;;13925:31;;13968:13;;13965:39;;;13984:18;;:::i;14716:168::-;14789:9;;;14820;;14837:15;;;14831:22;;14817:37;14807:71;;14858:18;;:::i;14889:127::-;14950:10;14945:3;14941:20;14938:1;14931:31;14981:4;14978:1;14971:15;15005:4;15002:1;14995:15;15021:120;15061:1;15087;15077:35;;15092:18;;:::i;:::-;-1:-1:-1;15126:9:1;;15021:120::o;15146:128::-;15213:9;;;15234:11;;;15231:37;;;15248:18;;:::i;15279:565::-;15528:3;15517:9;15510:22;15491:4;15555:54;15604:3;15593:9;15589:19;15581:6;15555:54;:::i;:::-;15657:9;15649:6;15645:22;15640:2;15629:9;15625:18;15618:50;15685:41;15719:6;15711;15685:41;:::i;:::-;15757:2;15742:18;;15735:34;;;;-1:-1:-1;;;;;;;15805:32:1;;;;15800:2;15785:18;;;15778:60;15677:49;15279:565;-1:-1:-1;;15279:565:1:o;16559:380::-;16638:1;16634:12;;;;16681;;;16702:61;;16756:4;16748:6;16744:17;16734:27;;16702:61;16809:2;16801:6;16798:14;16778:18;16775:38;16772:161;;16855:10;16850:3;16846:20;16843:1;16836:31;16890:4;16887:1;16880:15;16918:4;16915:1;16908:15;16772:161;;16559:380;;;:::o;16944:343::-;17146:2;17128:21;;;17185:2;17165:18;;;17158:30;-1:-1:-1;;;17219:2:1;17204:18;;17197:49;17278:2;17263:18;;16944:343::o;17292:127::-;17353:10;17348:3;17344:20;17341:1;17334:31;17384:4;17381:1;17374:15;17408:4;17405:1;17398:15;17655:225;17759:4;17738:12;;;17752;;;17734:31;17785:22;;;;17826:24;;;17816:58;;17854:18;;:::i;:::-;17816:58;17655:225;;;;:::o;17885:338::-;18087:2;18069:21;;;18126:2;18106:18;;;18099:30;-1:-1:-1;;;18160:2:1;18145:18;;18138:44;18214:2;18199:18;;17885:338::o;18583:344::-;18785:2;18767:21;;;18824:2;18804:18;;;18797:30;-1:-1:-1;;;18858:2:1;18843:18;;18836:50;18918:2;18903:18;;18583:344::o;18932:342::-;19134:2;19116:21;;;19173:2;19153:18;;;19146:30;-1:-1:-1;;;19207:2:1;19192:18;;19185:48;19265:2;19250:18;;18932:342::o;19279:351::-;19481:2;19463:21;;;19520:2;19500:18;;;19493:30;-1:-1:-1;;;19554:2:1;19539:18;;19532:57;19621:2;19606:18;;19279:351::o;20040:533::-;20254:13;;20197:3;;20228;;20323:4;20311:17;;20197:3;20356:190;20370:6;20367:1;20364:13;20356:190;;;20437:13;;20452:4;20433:24;20419:39;;20491:4;20480:16;;;;20519:17;;;;20392:1;20385:9;20356:190;;;-1:-1:-1;20562:5:1;;20040:533;-1:-1:-1;;;;;20040:533:1:o;20578:175::-;20615:3;20659:4;20652:5;20648:16;20688:4;20679:7;20676:17;20673:43;;20696:18;;:::i;:::-;20745:1;20732:15;;20578:175;-1:-1:-1;;20578:175:1:o;20758:125::-;20823:9;;;20844:10;;;20841:36;;;20857:18;;:::i;21588:135::-;21627:3;21648:17;;;21645:43;;21668:18;;:::i;:::-;-1:-1:-1;21715:1:1;21704:13;;21588:135::o;21728:474::-;21955:3;21944:9;21937:22;21918:4;21976:54;22025:3;22014:9;22010:19;22002:6;21976:54;:::i;:::-;22078:4;22066:17;;;;22061:2;22046:18;;22039:45;-1:-1:-1;22115:2:1;22100:18;;22093:34;;;;-1:-1:-1;;;;;22163:32:1;22158:2;22143:18;;;22136:60;21968:62;21728:474;-1:-1:-1;21728:474:1:o;22883:517::-;22984:2;22979:3;22976:11;22973:421;;;23020:5;23017:1;23010:16;23064:4;23061:1;23051:18;23134:2;23122:10;23118:19;23115:1;23111:27;23105:4;23101:38;23170:4;23158:10;23155:20;23152:47;;;-1:-1:-1;23193:4:1;23152:47;23248:2;23243:3;23239:12;23236:1;23232:20;23226:4;23222:31;23212:41;;23303:81;23321:2;23314:5;23311:13;23303:81;;;23380:1;23366:16;;23347:1;23336:13;23303:81;;;23307:3;;22883:517;;;:::o;23576:1295::-;23694:10;;-1:-1:-1;;;;;23716:30:1;;23713:56;;;23749:18;;:::i;:::-;23778:96;23867:6;23827:38;23859:4;23853:11;23827:38;:::i;:::-;23821:4;23778:96;:::i;:::-;23923:4;23954:2;23943:14;;23971:1;23966:648;;;;24658:1;24675:6;24672:89;;;-1:-1:-1;24727:19:1;;;24721:26;24672:89;-1:-1:-1;;23533:1:1;23529:11;;;23525:24;23521:29;23511:40;23557:1;23553:11;;;23508:57;24774:81;;23936:929;;23966:648;22830:1;22823:14;;;22867:4;22854:18;;-1:-1:-1;;24002:20:1;;;24119:222;24133:7;24130:1;24127:14;24119:222;;;24215:19;;;24209:26;24194:42;;24322:4;24307:20;;;;24275:1;24263:14;;;;24149:12;24119:222;;;24123:3;24369:6;24360:7;24357:19;24354:201;;;24430:19;;;24424:26;-1:-1:-1;;24513:1:1;24509:14;;;24525:3;24505:24;24501:37;24497:42;24482:58;24467:74;;24354:201;-1:-1:-1;;;;24601:1:1;24585:14;;;24581:22;24568:36;;-1:-1:-1;23576:1295:1:o;25562:184::-;25632:6;25685:2;25673:9;25664:7;25660:23;25656:32;25653:52;;;25701:1;25698;25691:12;25653:52;-1:-1:-1;25724:16:1;;25562:184;-1:-1:-1;25562:184:1:o;25751:417::-;25964:3;25995:29;26020:3;26012:6;25995:29;:::i;:::-;26033:21;;;-1:-1:-1;;26081:2:1;26070:14;;26063:30;;;;26120:2;26109:14;;26102:30;26159:2;26148:14;;25751:417;-1:-1:-1;25751:417:1:o;26173:415::-;26416:6;26411:3;26404:19;26386:3;26445:38;26479:2;26474:3;26470:12;26462:6;26445:38;:::i;:::-;26492:21;;;-1:-1:-1;;26540:2:1;26529:14;;26522:30;26579:2;26568:14;;26173:415;-1:-1:-1;;26173:415:1:o;26593:112::-;26625:1;26651;26641:35;;26656:18;;:::i;:::-;-1:-1:-1;26690:9:1;;26593:112::o;26710:165::-;26748:1;26782:4;26779:1;26775:12;26806:3;26796:37;;26813:18;;:::i;:::-;26865:3;26858:4;26855:1;26851:12;26847:22;26842:27;;;26710:165;;;;:::o;26880:178::-;26917:3;26961:4;26954:5;26950:16;26985:7;26975:41;;26996:18;;:::i;:::-;-1:-1:-1;;27032:20:1;;26880:178;-1:-1:-1;;26880:178:1:o
Swarm Source
ipfs://c41e8e1e1b7088af41520fb301930003eb38dd0fe32504108158b62f36f2b229
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.