Source Code
Latest 25 from a total of 3,814 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Place Bet | 12053231 | 423 days ago | IN | 0 ETH | 0.00000125 | ||||
| Place Bet | 12053224 | 423 days ago | IN | 0 ETH | 0.0000011 | ||||
| Place Bet | 12022302 | 423 days ago | IN | 0 ETH | 0.00000132 | ||||
| Place Bet | 11481244 | 436 days ago | IN | 0 ETH | 0.00000192 | ||||
| Place Bet | 11351414 | 439 days ago | IN | 0 ETH | 0.00000221 | ||||
| Place Bet | 11351408 | 439 days ago | IN | 0 ETH | 0.0000019 | ||||
| Place Bet | 11351400 | 439 days ago | IN | 0 ETH | 0.00000201 | ||||
| Place Bet | 11318715 | 440 days ago | IN | 0 ETH | 0.00000154 | ||||
| Place Bet | 11185872 | 443 days ago | IN | 0 ETH | 0.00000089 | ||||
| Place Bet | 11185865 | 443 days ago | IN | 0 ETH | 0.00000079 | ||||
| Place Bet | 11185860 | 443 days ago | IN | 0 ETH | 0.00000087 | ||||
| Place Bet | 11185852 | 443 days ago | IN | 0 ETH | 0.0000009 | ||||
| Place Bet | 11066207 | 446 days ago | IN | 0 ETH | 0.00000171 | ||||
| Place Bet | 11066202 | 446 days ago | IN | 0 ETH | 0.00000189 | ||||
| Place Bet | 11066148 | 446 days ago | IN | 0 ETH | 0.00000187 | ||||
| Place Bet | 11066138 | 446 days ago | IN | 0 ETH | 0.0000019 | ||||
| Place Bet | 11066131 | 446 days ago | IN | 0 ETH | 0.00000167 | ||||
| Place Bet | 11066126 | 446 days ago | IN | 0 ETH | 0.00000181 | ||||
| Place Bet | 11066120 | 446 days ago | IN | 0 ETH | 0.00000182 | ||||
| Place Bet | 10991277 | 447 days ago | IN | 0 ETH | 0.00000065 | ||||
| Place Bet | 10991270 | 447 days ago | IN | 0 ETH | 0.00000053 | ||||
| Place Bet | 10929432 | 449 days ago | IN | 0 ETH | 0.0000007 | ||||
| Place Bet | 10929424 | 449 days ago | IN | 0 ETH | 0.00000072 | ||||
| Place Bet | 10929417 | 449 days ago | IN | 0 ETH | 0.00000064 | ||||
| Place Bet | 10901151 | 449 days ago | IN | 0 ETH | 0.00000084 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Roulette
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/**
*Submitted for verification at blastscan.io on 2024-09-24
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*
* ==== Security Considerations
*
* There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
* expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
* considered as an intention to spend the allowance in any specific way. The second is that because permits have
* built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
* take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
* generally recommended is:
*
* ```solidity
* function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
* try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
* doThing(..., value);
* }
*
* function doThing(..., uint256 value) public {
* token.safeTransferFrom(msg.sender, address(this), value);
* ...
* }
* ```
*
* Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
* `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
* {SafeERC20-safeTransferFrom}).
*
* Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
* contracts should have entry points that don't rely on permit.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*
* CAUTION: See Security Considerations above.
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error AddressInsufficientBalance(address account);
/**
* @dev There's no code at `target` (it is not a contract).
*/
error AddressEmptyCode(address target);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedInnerCall();
/**
* @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 AddressInsufficientBalance(address(this));
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert FailedInnerCall();
}
}
/**
* @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
* {FailedInnerCall} 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 AddressInsufficientBalance(address(this));
}
(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 {FailedInnerCall}) 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 {FailedInnerCall} 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 {FailedInnerCall}.
*/
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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert FailedInnerCall();
}
}
}
// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.20;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
/**
* @dev An operation with an ERC20 token failed.
*/
error SafeERC20FailedOperation(address token);
/**
* @dev Indicates a failed `decreaseAllowance` request.
*/
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
* value, non-reverting calls are assumed to be successful.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
unchecked {
uint256 currentAllowance = token.allowance(address(this), spender);
if (currentAllowance < requestedDecrease) {
revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
forceApprove(token, spender, currentAllowance - requestedDecrease);
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data);
if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;
}
}
// File: @openzeppelin/contracts/utils/Context.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 Context {
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/contracts/access/Ownable.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 Ownable is Context {
address private _owner;
/**
* @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.
*/
constructor(address initialOwner) {
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) {
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 {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
* ```
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.20;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or
* {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol
// OpenZeppelin Contracts (last updated v5.0.1) (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.20;
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the value of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(
address[] calldata accounts,
uint256[] calldata ids
) external view returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`.
*
* WARNING: This function can potentially allow a reentrancy attack when transferring tokens
* to an untrusted contract, when invoking {onERC1155Received} on the receiver.
* Ensure to follow the checks-effects-interactions pattern and consider employing
* reentrancy guards when interacting with untrusted contracts.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `value` amount.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* WARNING: This function can potentially allow a reentrancy attack when transferring tokens
* to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver.
* Ensure to follow the checks-effects-interactions pattern and consider employing
* reentrancy guards when interacting with untrusted contracts.
*
* Emits either a {TransferSingle} or a {TransferBatch} event, depending on the length of the array arguments.
*
* Requirements:
*
* - `ids` and `values` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external;
}
// File: @openzeppelin/contracts/security/Pausable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
// File: game.sol
pragma solidity ^0.8.0;
enum Environment {
TESTNET,
MAINNET
}
enum YieldMode {
AUTOMATIC,
VOID,
CLAIMABLE
}
enum GasMode {
VOID,
CLAIMABLE
}
interface IERC20Rebasing {
function configure(YieldMode) external returns (uint256);
function claim(address recipient, uint256 amount)
external
returns (uint256);
function getClaimableAmount(address account)
external
view
returns (uint256);
}
interface IBlastPoints {
function configurePointsOperator(address operator) external;
function configurePointsOperatorOnBehalf(
address contractAddress,
address operator
) external;
}
interface IBlast {
// configure
function configureContract(
address contractAddress,
YieldMode _yield,
GasMode gasMode,
address governor
) external;
function configure(
YieldMode _yield,
GasMode gasMode,
address governor
) external;
// base configuration options
function configureClaimableYield() external;
function configureClaimableYieldOnBehalf(address contractAddress) external;
function configureAutomaticYield() external;
function configureAutomaticYieldOnBehalf(address contractAddress) external;
function configureVoidYield() external;
function configureVoidYieldOnBehalf(address contractAddress) external;
function configureClaimableGas() external;
function configureClaimableGasOnBehalf(address contractAddress) external;
function configureVoidGas() external;
function configureVoidGasOnBehalf(address contractAddress) external;
function configureGovernor(address _governor) external;
function configureGovernorOnBehalf(
address _newGovernor,
address contractAddress
) external;
// claim yield
function claimYield(
address contractAddress,
address recipientOfYield,
uint256 amount
) external returns (uint256);
function claimAllYield(address contractAddress, address recipientOfYield)
external
returns (uint256);
// claim gas
function claimAllGas(address contractAddress, address recipientOfGas)
external
returns (uint256);
function claimGasAtMinClaimRate(
address contractAddress,
address recipientOfGas,
uint256 minClaimRateBips
) external returns (uint256);
function claimMaxGas(address contractAddress, address recipientOfGas)
external
returns (uint256);
function claimGas(
address contractAddress,
address recipientOfGas,
uint256 gasToClaim,
uint256 gasSecondsToConsume
) external returns (uint256);
// read functions
function readClaimableYield(address contractAddress)
external
view
returns (uint256);
function readYieldConfiguration(address contractAddress)
external
view
returns (uint8);
function readGasParams(address contractAddress)
external
view
returns (
uint256 etherSeconds,
uint256 etherBalance,
uint256 lastUpdated,
GasMode
);
}
contract Roulette is Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
IBlast public constant BLAST =
IBlast(0x4300000000000000000000000000000000000002);
uint8[37] public NUMBERS = [
32,
15,
19,
4,
21,
2,
25,
17,
34,
6,
27,
13,
36,
11,
30,
8,
23,
10,
5,
24,
16,
33,
1,
20,
14,
31,
9,
22,
18,
29,
7,
28,
12,
35,
3,
26,
0
];
uint8[18] public redNumbers = [
32,
19,
21,
25,
34,
27,
36,
30,
23,
5,
16,
1,
14,
9,
18,
7,
12,
3
];
mapping(uint256 => bool) public isRedNumber;
uint256 public totalBets;
uint256 public rewardGreen = 36;
uint256 public rewardBonus = 1;
struct Player {
address playerAddress;
uint256 totalBet;
}
Player[10] public topPlayers;
uint256 public lowestBetIndex;
enum BetColor {
Red,
Black,
Green
}
struct Bet {
uint256 amount;
BetColor color;
address bettor;
}
struct Bets {
uint256 amount;
string yourBet;
uint256 winningNumber;
string winningColor;
bool won;
uint256 reward;
uint256 timestamp;
}
event BetPlaced(address indexed bettor, uint256 amount, string color);
event BetResolved(
address indexed bettor,
bool won,
uint256 winningNumber,
string winningColor
);
event ERC20Recovered(address indexed token, uint256 amount);
event NFTRecovered(address indexed nftContract, uint256 tokenId);
mapping(address => uint256) public userWins;
mapping(address => bool) private userAdded;
mapping(BetColor => string) public colorNames;
mapping(address => Bets[]) public bets;
mapping(address => uint256) public playerPoints;
address[] public userAddresses;
address BLAST_POINTS_ADDRESS = 0x2fc95838c71e76ec69ff817983BFf17c710F34E0;
address public USDB_ADDRESS = 0x4200000000000000000000000000000000000022;
address public WETH_ADDDRES = 0x4200000000000000000000000000000000000023;
address public BONUS_ADDDRES = 0x398fEB9B91aEd468b1F5A3FA593830BF02DFb793;
constructor() Ownable(msg.sender) {
for (uint256 i = 0; i < redNumbers.length; i++) {
isRedNumber[redNumbers[i]] = true;
}
colorNames[BetColor.Red] = "Red";
colorNames[BetColor.Black] = "Black";
colorNames[BetColor.Green] = "Green";
Environment _environment = Environment.MAINNET;
if (_environment == Environment.MAINNET) {
BLAST_POINTS_ADDRESS = 0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800;
USDB_ADDRESS = 0x4300000000000000000000000000000000000003;
WETH_ADDDRES = 0x4300000000000000000000000000000000000004;
}
IERC20Rebasing(USDB_ADDRESS).configure(YieldMode.CLAIMABLE);
IERC20Rebasing(WETH_ADDDRES).configure(YieldMode.CLAIMABLE);
IBlastPoints(BLAST_POINTS_ADDRESS).configurePointsOperator(msg.sender);
BLAST.configureClaimableYield();
BLAST.configureClaimableGas();
}
function updateTopPlayers(address player, uint256 totalBet) internal {
topPlayers[lowestBetIndex] = Player({
playerAddress: player,
totalBet: totalBet
});
findLowestBetIndex();
}
function findLowestBetIndex() internal {
uint256 minBet = topPlayers[0].totalBet;
uint256 minIndex = 0;
for (uint256 i = 1; i < topPlayers.length; i++) {
if (topPlayers[i].totalBet < minBet) {
minBet = topPlayers[i].totalBet;
minIndex = i;
}
}
lowestBetIndex = minIndex;
}
function placeBet(
address _contract,
uint256 amount,
BetColor color
) public nonReentrant {
require(amount > 0, "Bet amount must be greater than zero");
IERC20 _token = IERC20(_contract);
_token.safeTransferFrom(msg.sender, address(this), amount);
uint256 randomIndex = uint256(
keccak256(abi.encodePacked(totalBets, block.timestamp, msg.sender))
) % NUMBERS.length;
uint256 winningNumber = NUMBERS[randomIndex];
BetColor winningColor = getColor(winningNumber);
bool won = (color == winningColor);
uint256 reward = 0;
if (won) {
uint256 balance = _token.balanceOf(address(this));
reward = (winningColor == BetColor.Green)
? (rewardGreen * amount)
: (2 * amount);
if (balance >= reward) {
_token.safeTransfer(msg.sender, reward);
} else {
if (balance > 0) {
_token.safeTransfer(msg.sender, balance);
}
}
userWins[msg.sender] += reward;
}
if (!userAdded[msg.sender]) {
userAdded[msg.sender] = true;
userAddresses.push(msg.sender);
}
totalBets++;
playerPoints[msg.sender] += amount;
IERC20 _bonus = IERC20(BONUS_ADDDRES);
uint256 balance_bonus = _bonus.balanceOf(address(this));
if (balance_bonus > rewardBonus) {
_bonus.safeTransfer(msg.sender, rewardBonus);
}
string memory winningColorName = colorNames[winningColor];
string memory colorName = colorNames[color];
bets[msg.sender].push(
Bets({
amount: amount,
yourBet: colorName,
winningNumber: winningNumber,
winningColor: winningColorName,
won: won,
reward: reward,
timestamp: block.timestamp
})
);
emit BetPlaced(msg.sender, amount, colorName);
emit BetResolved(msg.sender, won, winningNumber, winningColorName);
}
function getColor(uint256 number) public view returns (BetColor) {
if (number == 0) return BetColor.Green;
return isRedNumber[number] ? BetColor.Red : BetColor.Black;
}
function getColorName(BetColor color) public view returns (string memory) {
return colorNames[color];
}
function getTotalBets() public view returns (uint256) {
return totalBets;
}
function getUserWins(address user) public view returns (uint256) {
return userWins[user];
}
function getBetsByUser(address user) public view returns (Bets[] memory) {
return bets[user];
}
function getTopUsers(uint256 count)
public
view
returns (address[] memory topUsers, uint256[] memory topWins)
{
require(count > 0 && count <= 10, "Count must be between 1 and 10");
uint256 userCount = userAddresses.length;
require(userCount > 0, "No users to list");
topUsers = new address[](count);
topWins = new uint256[](count);
for (uint256 i = 0; i < count; i++) {
topWins[i] = 0;
}
for (uint256 i = 0; i < userCount; i++) {
address user = userAddresses[i];
uint256 userWin = userWins[user];
for (uint256 j = 0; j < count; j++) {
if (userWin > topWins[j]) {
for (uint256 k = count - 1; k > j; k--) {
topWins[k] = topWins[k - 1];
topUsers[k] = topUsers[k - 1];
}
topWins[j] = userWin;
topUsers[j] = user;
break;
}
}
}
}
function updateRewardGreen(uint256 amount) public onlyOwner {
rewardGreen = amount;
}
function updateRewardBonus(uint256 amount) public onlyOwner {
rewardBonus = amount;
}
function updateAdressBonus(address _address) public onlyOwner {
BONUS_ADDDRES = _address;
}
// Blast functions
function claimAllGas() external nonReentrant onlyOwner {
BLAST.claimAllGas(address(this), msg.sender);
}
function claimYieldTokens(address _recipient, uint256 _amount)
external
nonReentrant
onlyOwner
returns (uint256, uint256)
{
return (
IERC20Rebasing(USDB_ADDRESS).claim(_recipient, _amount),
IERC20Rebasing(WETH_ADDDRES).claim(_recipient, _amount)
);
}
function getClaimableAmount(address _account)
external
view
returns (uint256, uint256)
{
return (
IERC20Rebasing(USDB_ADDRESS).getClaimableAmount(_account),
IERC20Rebasing(WETH_ADDDRES).getClaimableAmount(_account)
);
}
function updatePointsOperator(address _newOperator) external onlyOwner {
IBlastPoints(0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800)
.configurePointsOperatorOnBehalf(address(this), _newOperator);
}
function configureClaimableYieldOnBehalf() external onlyOwner {
BLAST.configureClaimableYieldOnBehalf(address(this));
}
function configureAutomaticYieldOnBehalf() external onlyOwner {
BLAST.configureAutomaticYieldOnBehalf(address(this));
}
function configureVoidYield() external onlyOwner {
BLAST.configureVoidYield();
}
function configureVoidYieldOnBehalf() external onlyOwner {
BLAST.configureVoidYieldOnBehalf(address(this));
}
function configureClaimableGasOnBehalf() external onlyOwner {
BLAST.configureClaimableGasOnBehalf(address(this));
}
function configureVoidGas() external onlyOwner {
BLAST.configureVoidGas();
}
function configureVoidGasOnBehalf() external onlyOwner {
BLAST.configureVoidGasOnBehalf(address(this));
}
function claimYield(address recipient, uint256 amount) external onlyOwner {
BLAST.claimYield(address(this), recipient, amount);
}
function claimAllYield(address recipient) external onlyOwner {
BLAST.claimAllYield(address(this), recipient);
}
function claimGasAtMinClaimRate(
address recipientOfGas,
uint256 minClaimRateBips
) external onlyOwner {
BLAST.claimGasAtMinClaimRate(
address(this),
recipientOfGas,
minClaimRateBips
);
}
function claimMaxGas(address recipientOfGas) external onlyOwner {
BLAST.claimMaxGas(address(this), recipientOfGas);
}
function claimGas(
address recipientOfGas,
uint256 gasToClaim,
uint256 gasSecondsToConsume
) external onlyOwner {
BLAST.claimGas(
address(this),
recipientOfGas,
gasToClaim,
gasSecondsToConsume
);
}
function readClaimableYield() external view returns (uint256) {
return BLAST.readClaimableYield(address(this));
}
function readYieldConfiguration() external view returns (uint8) {
return BLAST.readYieldConfiguration(address(this));
}
function readGasParams()
external
view
returns (
uint256 etherSeconds,
uint256 etherBalance,
uint256 lastUpdated,
GasMode
)
{
return BLAST.readGasParams(address(this));
}
function recoverERC20(
address tokenAddress,
address _adress,
uint256 tokenAmount
) external onlyOwner {
require(tokenAddress != address(this), "Cannot recover own tokens");
IERC20(tokenAddress).transfer(_adress, tokenAmount);
emit ERC20Recovered(tokenAddress, tokenAmount);
}
function recoverERC721(
address nftAddress,
address _adress,
uint256 tokenId
) external onlyOwner {
IERC721(nftAddress).safeTransferFrom(address(this), _adress, tokenId);
emit NFTRecovered(nftAddress, tokenId);
}
function recoverERC1155(
address nftAddress,
uint256 tokenId,
uint256 amount,
address _adress,
bytes calldata data
) external onlyOwner {
IERC1155(nftAddress).safeTransferFrom(
address(this),
_adress,
tokenId,
amount,
data
);
emit NFTRecovered(nftAddress, tokenId);
}
function recoverETH(address _adress) external onlyOwner {
payable(_adress).transfer(address(this).balance);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","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":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bettor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"color","type":"string"}],"name":"BetPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bettor","type":"address"},{"indexed":false,"internalType":"bool","name":"won","type":"bool"},{"indexed":false,"internalType":"uint256","name":"winningNumber","type":"uint256"},{"indexed":false,"internalType":"string","name":"winningColor","type":"string"}],"name":"BetResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nftContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NFTRecovered","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"},{"inputs":[],"name":"BLAST","outputs":[{"internalType":"contract IBlast","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BONUS_ADDDRES","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"NUMBERS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDB_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH_ADDDRES","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bets","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"yourBet","type":"string"},{"internalType":"uint256","name":"winningNumber","type":"uint256"},{"internalType":"string","name":"winningColor","type":"string"},{"internalType":"bool","name":"won","type":"bool"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAllGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"claimAllYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipientOfGas","type":"address"},{"internalType":"uint256","name":"gasToClaim","type":"uint256"},{"internalType":"uint256","name":"gasSecondsToConsume","type":"uint256"}],"name":"claimGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipientOfGas","type":"address"},{"internalType":"uint256","name":"minClaimRateBips","type":"uint256"}],"name":"claimGasAtMinClaimRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipientOfGas","type":"address"}],"name":"claimMaxGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"claimYieldTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Roulette.BetColor","name":"","type":"uint8"}],"name":"colorNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"configureAutomaticYieldOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configureClaimableGasOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configureClaimableYieldOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configureVoidGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configureVoidGasOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configureVoidYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configureVoidYieldOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getBetsByUser","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"yourBet","type":"string"},{"internalType":"uint256","name":"winningNumber","type":"uint256"},{"internalType":"string","name":"winningColor","type":"string"},{"internalType":"bool","name":"won","type":"bool"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct Roulette.Bets[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getClaimableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"getColor","outputs":[{"internalType":"enum Roulette.BetColor","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Roulette.BetColor","name":"color","type":"uint8"}],"name":"getColorName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getTopUsers","outputs":[{"internalType":"address[]","name":"topUsers","type":"address[]"},{"internalType":"uint256[]","name":"topWins","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserWins","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isRedNumber","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lowestBetIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum Roulette.BetColor","name":"color","type":"uint8"}],"name":"placeBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readClaimableYield","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readGasParams","outputs":[{"internalType":"uint256","name":"etherSeconds","type":"uint256"},{"internalType":"uint256","name":"etherBalance","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"},{"internalType":"enum GasMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readYieldConfiguration","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_adress","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"recoverERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"_adress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"address","name":"_adress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"recoverERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adress","type":"address"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redNumbers","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardGreen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"topPlayers","outputs":[{"internalType":"address","name":"playerAddress","type":"address"},{"internalType":"uint256","name":"totalBet","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateAdressBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOperator","type":"address"}],"name":"updatePointsOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateRewardBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateRewardGreen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"userAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userWins","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6080604052604051806104a00160405280602060ff168152602001600f60ff168152602001601360ff168152602001600460ff168152602001601560ff168152602001600260ff168152602001601960ff168152602001601160ff168152602001602260ff168152602001600660ff168152602001601b60ff168152602001600d60ff168152602001602460ff168152602001600b60ff168152602001601e60ff168152602001600860ff168152602001601760ff168152602001600a60ff168152602001600560ff168152602001601860ff168152602001601060ff168152602001602160ff168152602001600160ff168152602001601460ff168152602001600e60ff168152602001601f60ff168152602001600960ff168152602001601660ff168152602001601260ff168152602001601d60ff168152602001600760ff168152602001601c60ff168152602001600c60ff168152602001602360ff168152602001600360ff168152602001601a60ff1681526020015f60ff16815250600290602561018f929190610ab5565b50604051806102400160405280602060ff168152602001601360ff168152602001601560ff168152602001601960ff168152602001602260ff168152602001601b60ff168152602001602460ff168152602001601e60ff168152602001601760ff168152602001600560ff168152602001601060ff168152602001600160ff168152602001600e60ff168152602001600960ff168152602001601260ff168152602001600760ff168152602001600c60ff168152602001600360ff16815250600490601261025e929190610b4c565b5060246007556001600855732fc95838c71e76ec69ff817983bff17c710f34e060245f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073420000000000000000000000000000000000002260255f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073420000000000000000000000000000000000002360265f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073398feb9b91aed468b1f5a3fa593830bf02dfb79360275f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156103c4575f80fd5b50335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610436575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161042d9190610c3d565b60405180910390fd5b610445816109f460201b60201c565b50600180819055505f5b60128110156104ba57600160055f6004846012811061047157610470610c56565b5b602091828204019190069054906101000a900460ff1660ff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550808060010191505061044f565b506040518060400160405280600381526020017f526564000000000000000000000000000000000000000000000000000000000081525060205f80600281111561050757610506610c83565b5b600281111561051957610518610c83565b5b81526020019081526020015f2090816105329190610eea565b506040518060400160405280600581526020017f426c61636b00000000000000000000000000000000000000000000000000000081525060205f600160028111156105805761057f610c83565b5b600281111561059257610591610c83565b5b81526020019081526020015f2090816105ab9190610eea565b506040518060400160405280600581526020017f477265656e00000000000000000000000000000000000000000000000000000081525060205f6002808111156105f8576105f7610c83565b5b600281111561060a57610609610c83565b5b81526020019081526020015f2090816106239190610eea565b505f6001905060018081111561063c5761063b610c83565b5b81600181111561064f5761064e610c83565b5b0361075157732536fe9ab3f511540f2f9e2ec2a805005c3dd80060245f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073430000000000000000000000000000000000000360255f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073430000000000000000000000000000000000000460265f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60255f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631a33757d60026040518263ffffffff1660e01b81526004016107ac9190610fff565b6020604051808303815f875af11580156107c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ec9190611046565b5060265f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631a33757d60026040518263ffffffff1660e01b81526004016108489190610fff565b6020604051808303815f875af1158015610864573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108889190611046565b5060245f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166336b91f2b336040518263ffffffff1660e01b81526004016108e39190610c3d565b5f604051808303815f87803b1580156108fa575f80fd5b505af115801561090c573d5f803e3d5ffd5b5050505073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663f098767a6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610969575f80fd5b505af115801561097b573d5f803e3d5ffd5b5050505073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16634e606c476040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156109d8575f80fd5b505af11580156109ea573d5f803e3d5ffd5b5050505050611071565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b826025601f01602090048101928215610b3b579160200282015f5b83821115610b0d57835183826101000a81548160ff021916908360ff16021790555092602001926001016020815f01049283019260010302610ad0565b8015610b395782816101000a81549060ff02191690556001016020815f01049283019260010302610b0d565b505b509050610b489190610be3565b5090565b826012601f01602090048101928215610bd2579160200282015f5b83821115610ba457835183826101000a81548160ff021916908360ff16021790555092602001926001016020815f01049283019260010302610b67565b8015610bd05782816101000a81549060ff02191690556001016020815f01049283019260010302610ba4565b505b509050610bdf9190610be3565b5090565b5b80821115610bfa575f815f905550600101610be4565b5090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610c2782610bfe565b9050919050565b610c3781610c1d565b82525050565b5f602082019050610c505f830184610c2e565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610d2b57607f821691505b602082108103610d3e57610d3d610ce7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302610da07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610d65565b610daa8683610d65565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f610dee610de9610de484610dc2565b610dcb565b610dc2565b9050919050565b5f819050919050565b610e0783610dd4565b610e1b610e1382610df5565b848454610d71565b825550505050565b5f90565b610e2f610e23565b610e3a818484610dfe565b505050565b5b81811015610e5d57610e525f82610e27565b600181019050610e40565b5050565b601f821115610ea257610e7381610d44565b610e7c84610d56565b81016020851015610e8b578190505b610e9f610e9785610d56565b830182610e3f565b50505b505050565b5f82821c905092915050565b5f610ec25f1984600802610ea7565b1980831691505092915050565b5f610eda8383610eb3565b9150826002028217905092915050565b610ef382610cb0565b67ffffffffffffffff811115610f0c57610f0b610cba565b5b610f168254610d14565b610f21828285610e61565b5f60209050601f831160018114610f52575f8415610f40578287015190505b610f4a8582610ecf565b865550610fb1565b601f198416610f6086610d44565b5f5b82811015610f8757848901518255600182019150602085019450602081019050610f62565b86831015610fa45784890151610fa0601f891682610eb3565b8355505b6001600288020188555050505b505050505050565b60038110610fca57610fc9610c83565b5b50565b5f819050610fda82610fb9565b919050565b5f610fe982610fcd565b9050919050565b610ff981610fdf565b82525050565b5f6020820190506110125f830184610ff0565b92915050565b5f80fd5b61102581610dc2565b811461102f575f80fd5b50565b5f815190506110408161101c565b92915050565b5f6020828403121561105b5761105a611018565b5b5f61106884828501611032565b91505092915050565b6147ad8061107e5f395ff3fe608060405234801561000f575f80fd5b5060043610610325575f3560e01c80639b211fc4116101b6578063c2d94aec11610102578063de75aa6c116100a0578063e72328ce1161007a578063e72328ce14610946578063f2fde38b14610962578063fb7c12251461097e578063fdf553cf1461099c57610325565b8063de75aa6c146108b4578063e0909389146108e5578063e12f3a611461091557610325565b8063cd2002f5116100dc578063cd2002f51461082b578063cdf736dc14610847578063d39dd68414610865578063d851b1581461088357610325565b8063c2d94aec146107e7578063c4b81f2414610803578063c950c6041461082157610325565b8063aa857d981161016f578063b09a7c0b11610149578063b09a7c0b1461075f578063bcd2bf251461078f578063befa1e2f146107ab578063c022ad43146107c957610325565b8063aa857d9814610708578063ad6589d414610712578063af137ca81461072e57610325565b80639b211fc414610620578063a1c3272514610650578063a3cb679d1461066c578063a4a1245b1461068a578063a75118ca146106a8578063a9b7a7c2146106d857610325565b80636082e3a2116102755780637895399b1161022e5780638da5cb5b116102085780638da5cb5b146105ac5780638f4224a9146105ca5780638f8f1b7c146105e657806397d757761461060257610325565b80637895399b146105565780637992af441461057257806380057b9a1461057c57610325565b80636082e3a21461049457806362372cad146104c4578063645dd1fa146104f4578063683fc95e146104fe578063715018a61461051c5780637651313a1461052657610325565b806322987599116102e25780633eb947da116102bc5780633eb947da14610403578063491ae3481461040d5780634a39ec901461042e578063502c9bd51461046457610325565b8063229875991461039b5780632ba4664d146103b75780632cdf2c35146103e757610325565b80631171bda914610329578063134dfcd8146103455780631869ebda146103615780631c270d3c1461037d57806321a79421146103875780632210dfb114610391575b5f80fd5b610343600480360381019061033e91906132a1565b6109ba565b005b61035f600480360381019061035a91906132f1565b610aff565b005b61037b6004803603810190610376919061331c565b610b4e565b005b610385610bec565b005b61038f610c70565b005b610399610cf4565b005b6103b560048036038101906103b091906132f1565b610d6d565b005b6103d160048036038101906103cc919061335a565b610db8565b6040516103de919061339f565b60405180910390f35b61040160048036038101906103fc91906132a1565b610dd5565b005b61040b610e9a565b005b610415610f1e565b604051610425949392919061343a565b60405180910390f35b6104486004803603810190610443919061331c565b610fbc565b60405161045b97969594939291906134ed565b60405180910390f35b61047e6004803603810190610479919061335a565b61112c565b60405161048b9190613577565b60405180910390f35b6104ae60048036038101906104a991906135b3565b611167565b6040516104bb91906135de565b60405180910390f35b6104de60048036038101906104d9919061335a565b61122c565b6040516104eb9190613619565b60405180910390f35b6104fc611255565b005b6105066112ff565b6040516105139190613577565b60405180910390f35b610524611324565b005b610540600480360381019061053b91906132f1565b611337565b60405161054d9190613632565b60405180910390f35b610570600480360381019061056b91906136ac565b61134c565b005b61057a61141a565b005b6105966004803603810190610591919061335a565b61149e565b6040516105a39190613788565b60405180910390f35b6105b46114e2565b6040516105c19190613577565b60405180910390f35b6105e460048036038101906105df919061335a565b611509565b005b61060060048036038101906105fb91906137a1565b61151b565b005b61060a611d53565b604051610617919061384c565b60405180910390f35b61063a600480360381019061063591906132f1565b611d6b565b6040516106479190613632565b60405180910390f35b61066a60048036038101906106659190613865565b611d80565b005b610674611e21565b6040516106819190613632565b60405180910390f35b610692611e2a565b60405161069f9190613577565b60405180910390f35b6106c260048036038101906106bd91906135b3565b611e4f565b6040516106cf91906135de565b60405180910390f35b6106f260048036038101906106ed919061335a565b611ee9565b6040516106ff9190613619565b60405180910390f35b610710611f12565b005b61072c6004803603810190610727919061335a565b611f8b565b005b6107486004803603810190610743919061335a565b611f9d565b6040516107569291906138b5565b60405180910390f35b610779600480360381019061077491906132f1565b611fe3565b6040516107869190613a9d565b60405180910390f35b6107a960048036038101906107a4919061331c565b6121dd565b005b6107b361227b565b6040516107c09190613632565b60405180910390f35b6107d1612281565b6040516107de9190613632565b60405180910390f35b61080160048036038101906107fc91906132f1565b612287565b005b61080b612322565b6040516108189190613577565b60405180910390f35b610829612347565b005b610845600480360381019061084091906132f1565b6123cb565b005b61084f612466565b60405161085c9190613632565b60405180910390f35b61086d61246c565b60405161087a9190613632565b60405180910390f35b61089d6004803603810190610898919061331c565b6124fe565b6040516108ab929190613abd565b60405180910390f35b6108ce60048036038101906108c9919061335a565b61265b565b6040516108dc929190613c43565b60405180910390f35b6108ff60048036038101906108fa91906132f1565b6129fa565b60405161090c9190613632565b60405180910390f35b61092f600480360381019061092a91906132f1565b612a40565b60405161093d929190613abd565b60405180910390f35b610960600480360381019061095b91906132f1565b612b7d565b005b61097c600480360381019061097791906132f1565b612c04565b005b610986612c88565b6040516109939190613619565b60405180910390f35b6109a4612d1a565b6040516109b19190613632565b60405180910390f35b6109c2612d20565b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2790613cc2565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610a6b9291906138b5565b6020604051808303815f875af1158015610a87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aab9190613d0a565b508273ffffffffffffffffffffffffffffffffffffffff167f505b28e6941631badc363841ecbf8e1214b9379c643936458e87be718e15799982604051610af29190613632565b60405180910390a2505050565b610b07612d20565b8073ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015610b4a573d5f803e3d5ffd5b5050565b610b56612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663f97196623084846040518463ffffffff1660e01b8152600401610ba793929190613d35565b6020604051808303815f875af1158015610bc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be79190613d7e565b505050565b610bf4612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff166337ebe3a8306040518263ffffffff1660e01b8152600401610c419190613577565b5f604051808303815f87803b158015610c58575f80fd5b505af1158015610c6a573d5f803e3d5ffd5b50505050565b610c78612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663eb59acdc306040518263ffffffff1660e01b8152600401610cc59190613577565b5f604051808303815f87803b158015610cdc575f80fd5b505af1158015610cee573d5f803e3d5ffd5b50505050565b610cfc612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16632210dfb16040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610d55575f80fd5b505af1158015610d67573d5f803e3d5ffd5b50505050565b610d75612d20565b8060275f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6005602052805f5260405f205f915054906101000a900460ff1681565b610ddd612d20565b8273ffffffffffffffffffffffffffffffffffffffff166342842e0e3084846040518463ffffffff1660e01b8152600401610e1a93929190613d35565b5f604051808303815f87803b158015610e31575f80fd5b505af1158015610e43573d5f803e3d5ffd5b505050508273ffffffffffffffffffffffffffffffffffffffff167ff0e12da6b257be18ce026650cff8b178975c77440ae67662ac380d78d784ffaa82604051610e8d9190613632565b60405180910390a2505050565b610ea2612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663908c8502306040518263ffffffff1660e01b8152600401610eef9190613577565b5f604051808303815f87803b158015610f06575f80fd5b505af1158015610f18573d5f803e3d5ffd5b50505050565b5f805f8073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663dde798a4306040518263ffffffff1660e01b8152600401610f6f9190613577565b608060405180830381865afa158015610f8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fae9190613dcc565b935093509350935090919293565b6021602052815f5260405f208181548110610fd5575f80fd5b905f5260205f2090600702015f9150915050805f015490806001018054610ffb90613e5d565b80601f016020809104026020016040519081016040528092919081815260200182805461102790613e5d565b80156110725780601f1061104957610100808354040283529160200191611072565b820191905f5260205f20905b81548152906001019060200180831161105557829003601f168201915b50505050509080600201549080600301805461108d90613e5d565b80601f01602080910402602001604051908101604052809291908181526020018280546110b990613e5d565b80156111045780601f106110db57610100808354040283529160200191611104565b820191905f5260205f20905b8154815290600101906020018083116110e757829003601f168201915b505050505090806004015f9054906101000a900460ff16908060050154908060060154905087565b6023818154811061113b575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060205f83600281111561117f5761117e6133c7565b5b6002811115611191576111906133c7565b5b81526020019081526020015f2080546111a990613e5d565b80601f01602080910402602001604051908101604052809291908181526020018280546111d590613e5d565b80156112205780601f106111f757610100808354040283529160200191611220565b820191905f5260205f20905b81548152906001019060200180831161120357829003601f168201915b50505050509050919050565b6002816025811061123b575f80fd5b60209182820401919006915054906101000a900460ff1681565b61125d612da7565b611265612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663954fa5ee30336040518363ffffffff1660e01b81526004016112b4929190613e8d565b6020604051808303815f875af11580156112d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f49190613d7e565b506112fd612df6565b565b60275f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61132c612d20565b6113355f612dff565b565b601e602052805f5260405f205f915090505481565b611354612d20565b8573ffffffffffffffffffffffffffffffffffffffff1663f242432a3085888887876040518763ffffffff1660e01b815260040161139796959493929190613efe565b5f604051808303815f87803b1580156113ae575f80fd5b505af11580156113c0573d5f803e3d5ffd5b505050508573ffffffffffffffffffffffffffffffffffffffff167ff0e12da6b257be18ce026650cff8b178975c77440ae67662ac380d78d784ffaa8660405161140a9190613632565b60405180910390a2505050505050565b611422612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16633ba5713e306040518263ffffffff1660e01b815260040161146f9190613577565b5f604051808303815f87803b158015611486575f80fd5b505af1158015611498573d5f803e3d5ffd5b50505050565b5f8082036114af57600290506114dd565b60055f8381526020019081526020015f205f9054906101000a900460ff166114d85760016114da565b5f5b90505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611511612d20565b8060078190555050565b611523612da7565b5f8211611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c90613fc8565b60405180910390fd5b5f8390506115963330858473ffffffffffffffffffffffffffffffffffffffff16612ec0909392919063ffffffff16565b5f602560065442336040516020016115b09392919061404b565b604051602081830303815290604052805190602001205f1c6115d291906140b4565b90505f600282602581106115e9576115e86140e4565b5b602091828204019190069054906101000a900460ff1660ff1690505f61160e8261149e565b90505f816002811115611624576116236133c7565b5b866002811115611637576116366133c7565b5b1490505f81156117cb575f8673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161167b9190613577565b602060405180830381865afa158015611696573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ba9190613d7e565b90506002808111156116cf576116ce6133c7565b5b8460028111156116e2576116e16133c7565b5b146116f9578860026116f4919061413e565b611708565b88600754611707919061413e565b5b91508181106117415761173c33838973ffffffffffffffffffffffffffffffffffffffff16612f429092919063ffffffff16565b611776565b5f8111156117755761177433828973ffffffffffffffffffffffffffffffffffffffff16612f429092919063ffffffff16565b5b5b81601e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117c2919061417f565b92505081905550505b601f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166118cf576001601f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550602333908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60065f8154809291906118e1906141b2565b91905055508760225f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611932919061417f565b925050819055505f60275f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119989190613577565b602060405180830381865afa1580156119b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d79190613d7e565b9050600854811115611a1157611a10336008548473ffffffffffffffffffffffffffffffffffffffff16612f429092919063ffffffff16565b5b5f60205f876002811115611a2857611a276133c7565b5b6002811115611a3a57611a396133c7565b5b81526020019081526020015f208054611a5290613e5d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7e90613e5d565b8015611ac95780601f10611aa057610100808354040283529160200191611ac9565b820191905f5260205f20905b815481529060010190602001808311611aac57829003601f168201915b505050505090505f60205f8c6002811115611ae757611ae66133c7565b5b6002811115611af957611af86133c7565b5b81526020019081526020015f208054611b1190613e5d565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3d90613e5d565b8015611b885780601f10611b5f57610100808354040283529160200191611b88565b820191905f5260205f20905b815481529060010190602001808311611b6b57829003601f168201915b5050505050905060215f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060e001604052808e81526020018381526020018a8152602001848152602001881515815260200187815260200142815250908060018154018082558091505060019003905f5260205f2090600702015f909190919091505f820151815f01556020820151816001019081611c4491906143ba565b50604082015181600201556060820151816003019081611c6491906143ba565b506080820151816004015f6101000a81548160ff02191690831515021790555060a0820151816005015560c0820151816006015550503373ffffffffffffffffffffffffffffffffffffffff167ff14919ff92658c8b721faa944957b48dedaee13316a12a2635add911929e91708d83604051611ce2929190614489565b60405180910390a23373ffffffffffffffffffffffffffffffffffffffff167f9866c7d534ee19214efceb6d9f1de5ef8625b0e3b92cdeca4f78ba3baed31044878a85604051611d34939291906144b7565b60405180910390a250505050505050505050611d4e612df6565b505050565b73430000000000000000000000000000000000000281565b6022602052805f5260405f205f915090505481565b611d88612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663fafce39e308585856040518563ffffffff1660e01b8152600401611ddb94939291906144f3565b6020604051808303815f875af1158015611df7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e1b9190613d7e565b50505050565b5f600654905090565b60265f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60208052805f5260405f205f915090508054611e6a90613e5d565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9690613e5d565b8015611ee15780601f10611eb857610100808354040283529160200191611ee1565b820191905f5260205f20905b815481529060010190602001808311611ec457829003601f168201915b505050505081565b60048160128110611ef8575f80fd5b60209182820401919006915054906101000a900460ff1681565b611f1a612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663aa857d986040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611f73575f80fd5b505af1158015611f85573d5f803e3d5ffd5b50505050565b611f93612d20565b8060088190555050565b600981600a8110611fac575f80fd5b600202015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b606060215f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b828210156121d2578382905f5260205f2090600702016040518060e00160405290815f820154815260200160018201805461207b90613e5d565b80601f01602080910402602001604051908101604052809291908181526020018280546120a790613e5d565b80156120f25780601f106120c9576101008083540402835291602001916120f2565b820191905f5260205f20905b8154815290600101906020018083116120d557829003601f168201915b505050505081526020016002820154815260200160038201805461211590613e5d565b80601f016020809104026020016040519081016040528092919081815260200182805461214190613e5d565b801561218c5780601f106121635761010080835404028352916020019161218c565b820191905f5260205f20905b81548152906001019060200180831161216f57829003601f168201915b50505050508152602001600482015f9054906101000a900460ff161515151581526020016005820154815260200160068201548152505081526020019060010190612041565b505050509050919050565b6121e5612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16630951888f3084846040518463ffffffff1660e01b815260040161223693929190613d35565b6020604051808303815f875af1158015612252573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122769190613d7e565b505050565b60065481565b601d5481565b61228f612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663860043b630836040518363ffffffff1660e01b81526004016122de929190613e8d565b6020604051808303815f875af11580156122fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061231e9190613d7e565b5050565b60255f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61234f612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663b71d6dd4306040518263ffffffff1660e01b815260040161239c9190613577565b5f604051808303815f87803b1580156123b3575f80fd5b505af11580156123c5573d5f803e3d5ffd5b50505050565b6123d3612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663662aa11d30836040518363ffffffff1660e01b8152600401612422929190613e8d565b6020604051808303815f875af115801561243e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124629190613d7e565b5050565b60075481565b5f73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663ec3278e8306040518263ffffffff1660e01b81526004016124ba9190613577565b602060405180830381865afa1580156124d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124f99190613d7e565b905090565b5f80612508612da7565b612510612d20565b60255f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aad3ec9685856040518363ffffffff1660e01b815260040161256c9291906138b5565b6020604051808303815f875af1158015612588573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125ac9190613d7e565b60265f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aad3ec9686866040518363ffffffff1660e01b81526004016126089291906138b5565b6020604051808303815f875af1158015612624573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126489190613d7e565b91509150612654612df6565b9250929050565b6060805f8311801561266e5750600a8311155b6126ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a490614580565b60405180910390fd5b5f60238054905090505f81116126f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ef906145e8565b60405180910390fd5b8367ffffffffffffffff811115612712576127116141f9565b5b6040519080825280602002602001820160405280156127405781602001602082028036833780820191505090505b5092508367ffffffffffffffff81111561275d5761275c6141f9565b5b60405190808252806020026020018201604052801561278b5781602001602082028036833780820191505090505b5091505f5b848110156127c5575f8382815181106127ac576127ab6140e4565b5b6020026020010181815250508080600101915050612790565b505f5b818110156129f3575f602382815481106127e5576127e46140e4565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f601e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f5b878110156129e35785818151811061286d5761286c6140e4565b5b60200260200101518211156129d6575f60018961288a9190614606565b90505b8181111561296257866001826128a39190614606565b815181106128b4576128b36140e4565b5b60200260200101518782815181106128cf576128ce6140e4565b5b602002602001018181525050876001826128e99190614606565b815181106128fa576128f96140e4565b5b6020026020010151888281518110612915576129146140e4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808061295a90614639565b91505061288d565b5081868281518110612977576129766140e4565b5b60200260200101818152505082878281518110612997576129966140e4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506129e3565b8080600101915050612852565b50505080806001019150506127c8565b5050915091565b5f601e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f8060255f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e12f3a61846040518263ffffffff1660e01b8152600401612a9c9190613577565b602060405180830381865afa158015612ab7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612adb9190613d7e565b60265f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e12f3a61856040518263ffffffff1660e01b8152600401612b359190613577565b602060405180830381865afa158015612b50573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b749190613d7e565b91509150915091565b612b85612d20565b732536fe9ab3f511540f2f9e2ec2a805005c3dd80073ffffffffffffffffffffffffffffffffffffffff1663b30080ac30836040518363ffffffff1660e01b8152600401612bd4929190613e8d565b5f604051808303815f87803b158015612beb575f80fd5b505af1158015612bfd573d5f803e3d5ffd5b5050505050565b612c0c612d20565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c7c575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612c739190613577565b60405180910390fd5b612c8581612dff565b50565b5f73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663fd8c4b9d306040518263ffffffff1660e01b8152600401612cd69190613577565b602060405180830381865afa158015612cf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d15919061468a565b905090565b60085481565b612d28612fc1565b73ffffffffffffffffffffffffffffffffffffffff16612d466114e2565b73ffffffffffffffffffffffffffffffffffffffff1614612da557612d69612fc1565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401612d9c9190613577565b60405180910390fd5b565b600260015403612dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de3906146ff565b60405180910390fd5b6002600181905550565b60018081905550565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f3c848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401612ef593929190613d35565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612fc8565b50505050565b612fbc838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612f759291906138b5565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612fc8565b505050565b5f33905090565b5f612ff2828473ffffffffffffffffffffffffffffffffffffffff1661305d90919063ffffffff16565b90505f8151141580156130165750808060200190518101906130149190613d0a565b155b1561305857826040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161304f9190613577565b60405180910390fd5b505050565b606061306a83835f613072565b905092915050565b6060814710156130b957306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016130b09190613577565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff1684866040516130e19190614761565b5f6040518083038185875af1925050503d805f811461311b576040519150601f19603f3d011682016040523d82523d5f602084013e613120565b606091505b509150915061313086838361313b565b925050509392505050565b6060826131505761314b826131c8565b6131c0565b5f825114801561317657505f8473ffffffffffffffffffffffffffffffffffffffff163b145b156131b857836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016131af9190613577565b60405180910390fd5b8190506131c1565b5b9392505050565b5f815111156131da5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61323d82613214565b9050919050565b61324d81613233565b8114613257575f80fd5b50565b5f8135905061326881613244565b92915050565b5f819050919050565b6132808161326e565b811461328a575f80fd5b50565b5f8135905061329b81613277565b92915050565b5f805f606084860312156132b8576132b761320c565b5b5f6132c58682870161325a565b93505060206132d68682870161325a565b92505060406132e78682870161328d565b9150509250925092565b5f602082840312156133065761330561320c565b5b5f6133138482850161325a565b91505092915050565b5f80604083850312156133325761333161320c565b5b5f61333f8582860161325a565b92505060206133508582860161328d565b9150509250929050565b5f6020828403121561336f5761336e61320c565b5b5f61337c8482850161328d565b91505092915050565b5f8115159050919050565b61339981613385565b82525050565b5f6020820190506133b25f830184613390565b92915050565b6133c18161326e565b82525050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110613405576134046133c7565b5b50565b5f819050613415826133f4565b919050565b5f61342482613408565b9050919050565b6134348161341a565b82525050565b5f60808201905061344d5f8301876133b8565b61345a60208301866133b8565b61346760408301856133b8565b613474606083018461342b565b95945050505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6134bf8261347d565b6134c98185613487565b93506134d9818560208601613497565b6134e2816134a5565b840191505092915050565b5f60e0820190506135005f83018a6133b8565b818103602083015261351281896134b5565b905061352160408301886133b8565b818103606083015261353381876134b5565b90506135426080830186613390565b61354f60a08301856133b8565b61355c60c08301846133b8565b98975050505050505050565b61357181613233565b82525050565b5f60208201905061358a5f830184613568565b92915050565b6003811061359c575f80fd5b50565b5f813590506135ad81613590565b92915050565b5f602082840312156135c8576135c761320c565b5b5f6135d58482850161359f565b91505092915050565b5f6020820190508181035f8301526135f681846134b5565b905092915050565b5f60ff82169050919050565b613613816135fe565b82525050565b5f60208201905061362c5f83018461360a565b92915050565b5f6020820190506136455f8301846133b8565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261366c5761366b61364b565b5b8235905067ffffffffffffffff8111156136895761368861364f565b5b6020830191508360018202830111156136a5576136a4613653565b5b9250929050565b5f805f805f8060a087890312156136c6576136c561320c565b5b5f6136d389828a0161325a565b96505060206136e489828a0161328d565b95505060406136f589828a0161328d565b945050606061370689828a0161325a565b935050608087013567ffffffffffffffff81111561372757613726613210565b5b61373389828a01613657565b92509250509295509295509295565b60038110613753576137526133c7565b5b50565b5f81905061376382613742565b919050565b5f61377282613756565b9050919050565b61378281613768565b82525050565b5f60208201905061379b5f830184613779565b92915050565b5f805f606084860312156137b8576137b761320c565b5b5f6137c58682870161325a565b93505060206137d68682870161328d565b92505060406137e78682870161359f565b9150509250925092565b5f819050919050565b5f61381461380f61380a84613214565b6137f1565b613214565b9050919050565b5f613825826137fa565b9050919050565b5f6138368261381b565b9050919050565b6138468161382c565b82525050565b5f60208201905061385f5f83018461383d565b92915050565b5f805f6060848603121561387c5761387b61320c565b5b5f6138898682870161325a565b935050602061389a8682870161328d565b92505060406138ab8682870161328d565b9150509250925092565b5f6040820190506138c85f830185613568565b6138d560208301846133b8565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61390e8161326e565b82525050565b5f82825260208201905092915050565b5f61392e8261347d565b6139388185613914565b9350613948818560208601613497565b613951816134a5565b840191505092915050565b61396581613385565b82525050565b5f60e083015f8301516139805f860182613905565b50602083015184820360208601526139988282613924565b91505060408301516139ad6040860182613905565b50606083015184820360608601526139c58282613924565b91505060808301516139da608086018261395c565b5060a08301516139ed60a0860182613905565b5060c0830151613a0060c0860182613905565b508091505092915050565b5f613a16838361396b565b905092915050565b5f602082019050919050565b5f613a34826138dc565b613a3e81856138e6565b935083602082028501613a50856138f6565b805f5b85811015613a8b5784840389528151613a6c8582613a0b565b9450613a7783613a1e565b925060208a01995050600181019050613a53565b50829750879550505050505092915050565b5f6020820190508181035f830152613ab58184613a2a565b905092915050565b5f604082019050613ad05f8301856133b8565b613add60208301846133b8565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613b1681613233565b82525050565b5f613b278383613b0d565b60208301905092915050565b5f602082019050919050565b5f613b4982613ae4565b613b538185613aee565b9350613b5e83613afe565b805f5b83811015613b8e578151613b758882613b1c565b9750613b8083613b33565b925050600181019050613b61565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f613bcf8383613905565b60208301905092915050565b5f602082019050919050565b5f613bf182613b9b565b613bfb8185613ba5565b9350613c0683613bb5565b805f5b83811015613c36578151613c1d8882613bc4565b9750613c2883613bdb565b925050600181019050613c09565b5085935050505092915050565b5f6040820190508181035f830152613c5b8185613b3f565b90508181036020830152613c6f8184613be7565b90509392505050565b7f43616e6e6f74207265636f766572206f776e20746f6b656e73000000000000005f82015250565b5f613cac601983613487565b9150613cb782613c78565b602082019050919050565b5f6020820190508181035f830152613cd981613ca0565b9050919050565b613ce981613385565b8114613cf3575f80fd5b50565b5f81519050613d0481613ce0565b92915050565b5f60208284031215613d1f57613d1e61320c565b5b5f613d2c84828501613cf6565b91505092915050565b5f606082019050613d485f830186613568565b613d556020830185613568565b613d6260408301846133b8565b949350505050565b5f81519050613d7881613277565b92915050565b5f60208284031215613d9357613d9261320c565b5b5f613da084828501613d6a565b91505092915050565b60028110613db5575f80fd5b50565b5f81519050613dc681613da9565b92915050565b5f805f8060808587031215613de457613de361320c565b5b5f613df187828801613d6a565b9450506020613e0287828801613d6a565b9350506040613e1387828801613d6a565b9250506060613e2487828801613db8565b91505092959194509250565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613e7457607f821691505b602082108103613e8757613e86613e30565b5b50919050565b5f604082019050613ea05f830185613568565b613ead6020830184613568565b9392505050565b5f82825260208201905092915050565b828183375f83830152505050565b5f613edd8385613eb4565b9350613eea838584613ec4565b613ef3836134a5565b840190509392505050565b5f60a082019050613f115f830189613568565b613f1e6020830188613568565b613f2b60408301876133b8565b613f3860608301866133b8565b8181036080830152613f4b818486613ed2565b9050979650505050505050565b7f42657420616d6f756e74206d7573742062652067726561746572207468616e205f8201527f7a65726f00000000000000000000000000000000000000000000000000000000602082015250565b5f613fb2602483613487565b9150613fbd82613f58565b604082019050919050565b5f6020820190508181035f830152613fdf81613fa6565b9050919050565b5f819050919050565b614000613ffb8261326e565b613fe6565b82525050565b5f8160601b9050919050565b5f61401c82614006565b9050919050565b5f61402d82614012565b9050919050565b61404561404082613233565b614023565b82525050565b5f6140568286613fef565b6020820191506140668285613fef565b6020820191506140768284614034565b601482019150819050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6140be8261326e565b91506140c98361326e565b9250826140d9576140d8614087565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6141488261326e565b91506141538361326e565b92508282026141618161326e565b9150828204841483151761417857614177614111565b5b5092915050565b5f6141898261326e565b91506141948361326e565b92508282019050808211156141ac576141ab614111565b5b92915050565b5f6141bc8261326e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141ee576141ed614111565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026142827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614247565b61428c8683614247565b95508019841693508086168417925050509392505050565b5f6142be6142b96142b48461326e565b6137f1565b61326e565b9050919050565b5f819050919050565b6142d7836142a4565b6142eb6142e3826142c5565b848454614253565b825550505050565b5f90565b6142ff6142f3565b61430a8184846142ce565b505050565b5b8181101561432d576143225f826142f7565b600181019050614310565b5050565b601f8211156143725761434381614226565b61434c84614238565b8101602085101561435b578190505b61436f61436785614238565b83018261430f565b50505b505050565b5f82821c905092915050565b5f6143925f1984600802614377565b1980831691505092915050565b5f6143aa8383614383565b9150826002028217905092915050565b6143c38261347d565b67ffffffffffffffff8111156143dc576143db6141f9565b5b6143e68254613e5d565b6143f1828285614331565b5f60209050601f831160018114614422575f8415614410578287015190505b61441a858261439f565b865550614481565b601f19841661443086614226565b5f5b8281101561445757848901518255600182019150602085019450602081019050614432565b868310156144745784890151614470601f891682614383565b8355505b6001600288020188555050505b505050505050565b5f60408201905061449c5f8301856133b8565b81810360208301526144ae81846134b5565b90509392505050565b5f6060820190506144ca5f830186613390565b6144d760208301856133b8565b81810360408301526144e981846134b5565b9050949350505050565b5f6080820190506145065f830187613568565b6145136020830186613568565b61452060408301856133b8565b61452d60608301846133b8565b95945050505050565b7f436f756e74206d757374206265206265747765656e203120616e6420313000005f82015250565b5f61456a601e83613487565b915061457582614536565b602082019050919050565b5f6020820190508181035f8301526145978161455e565b9050919050565b7f4e6f20757365727320746f206c697374000000000000000000000000000000005f82015250565b5f6145d2601083613487565b91506145dd8261459e565b602082019050919050565b5f6020820190508181035f8301526145ff816145c6565b9050919050565b5f6146108261326e565b915061461b8361326e565b925082820390508181111561463357614632614111565b5b92915050565b5f6146438261326e565b91505f820361465557614654614111565b5b600182039050919050565b614669816135fe565b8114614673575f80fd5b50565b5f8151905061468481614660565b92915050565b5f6020828403121561469f5761469e61320c565b5b5f6146ac84828501614676565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6146e9601f83613487565b91506146f4826146b5565b602082019050919050565b5f6020820190508181035f830152614716816146dd565b9050919050565b5f81519050919050565b5f81905092915050565b5f61473b8261471d565b6147458185614727565b9350614755818560208601613497565b80840191505092915050565b5f61476c8284614731565b91508190509291505056fea264697066735822122012a1c4ca3ba775f75954b78bb604ff0a9966ec1d3bd18abd45dc85d2d005b96564736f6c634300081a0033
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610325575f3560e01c80639b211fc4116101b6578063c2d94aec11610102578063de75aa6c116100a0578063e72328ce1161007a578063e72328ce14610946578063f2fde38b14610962578063fb7c12251461097e578063fdf553cf1461099c57610325565b8063de75aa6c146108b4578063e0909389146108e5578063e12f3a611461091557610325565b8063cd2002f5116100dc578063cd2002f51461082b578063cdf736dc14610847578063d39dd68414610865578063d851b1581461088357610325565b8063c2d94aec146107e7578063c4b81f2414610803578063c950c6041461082157610325565b8063aa857d981161016f578063b09a7c0b11610149578063b09a7c0b1461075f578063bcd2bf251461078f578063befa1e2f146107ab578063c022ad43146107c957610325565b8063aa857d9814610708578063ad6589d414610712578063af137ca81461072e57610325565b80639b211fc414610620578063a1c3272514610650578063a3cb679d1461066c578063a4a1245b1461068a578063a75118ca146106a8578063a9b7a7c2146106d857610325565b80636082e3a2116102755780637895399b1161022e5780638da5cb5b116102085780638da5cb5b146105ac5780638f4224a9146105ca5780638f8f1b7c146105e657806397d757761461060257610325565b80637895399b146105565780637992af441461057257806380057b9a1461057c57610325565b80636082e3a21461049457806362372cad146104c4578063645dd1fa146104f4578063683fc95e146104fe578063715018a61461051c5780637651313a1461052657610325565b806322987599116102e25780633eb947da116102bc5780633eb947da14610403578063491ae3481461040d5780634a39ec901461042e578063502c9bd51461046457610325565b8063229875991461039b5780632ba4664d146103b75780632cdf2c35146103e757610325565b80631171bda914610329578063134dfcd8146103455780631869ebda146103615780631c270d3c1461037d57806321a79421146103875780632210dfb114610391575b5f80fd5b610343600480360381019061033e91906132a1565b6109ba565b005b61035f600480360381019061035a91906132f1565b610aff565b005b61037b6004803603810190610376919061331c565b610b4e565b005b610385610bec565b005b61038f610c70565b005b610399610cf4565b005b6103b560048036038101906103b091906132f1565b610d6d565b005b6103d160048036038101906103cc919061335a565b610db8565b6040516103de919061339f565b60405180910390f35b61040160048036038101906103fc91906132a1565b610dd5565b005b61040b610e9a565b005b610415610f1e565b604051610425949392919061343a565b60405180910390f35b6104486004803603810190610443919061331c565b610fbc565b60405161045b97969594939291906134ed565b60405180910390f35b61047e6004803603810190610479919061335a565b61112c565b60405161048b9190613577565b60405180910390f35b6104ae60048036038101906104a991906135b3565b611167565b6040516104bb91906135de565b60405180910390f35b6104de60048036038101906104d9919061335a565b61122c565b6040516104eb9190613619565b60405180910390f35b6104fc611255565b005b6105066112ff565b6040516105139190613577565b60405180910390f35b610524611324565b005b610540600480360381019061053b91906132f1565b611337565b60405161054d9190613632565b60405180910390f35b610570600480360381019061056b91906136ac565b61134c565b005b61057a61141a565b005b6105966004803603810190610591919061335a565b61149e565b6040516105a39190613788565b60405180910390f35b6105b46114e2565b6040516105c19190613577565b60405180910390f35b6105e460048036038101906105df919061335a565b611509565b005b61060060048036038101906105fb91906137a1565b61151b565b005b61060a611d53565b604051610617919061384c565b60405180910390f35b61063a600480360381019061063591906132f1565b611d6b565b6040516106479190613632565b60405180910390f35b61066a60048036038101906106659190613865565b611d80565b005b610674611e21565b6040516106819190613632565b60405180910390f35b610692611e2a565b60405161069f9190613577565b60405180910390f35b6106c260048036038101906106bd91906135b3565b611e4f565b6040516106cf91906135de565b60405180910390f35b6106f260048036038101906106ed919061335a565b611ee9565b6040516106ff9190613619565b60405180910390f35b610710611f12565b005b61072c6004803603810190610727919061335a565b611f8b565b005b6107486004803603810190610743919061335a565b611f9d565b6040516107569291906138b5565b60405180910390f35b610779600480360381019061077491906132f1565b611fe3565b6040516107869190613a9d565b60405180910390f35b6107a960048036038101906107a4919061331c565b6121dd565b005b6107b361227b565b6040516107c09190613632565b60405180910390f35b6107d1612281565b6040516107de9190613632565b60405180910390f35b61080160048036038101906107fc91906132f1565b612287565b005b61080b612322565b6040516108189190613577565b60405180910390f35b610829612347565b005b610845600480360381019061084091906132f1565b6123cb565b005b61084f612466565b60405161085c9190613632565b60405180910390f35b61086d61246c565b60405161087a9190613632565b60405180910390f35b61089d6004803603810190610898919061331c565b6124fe565b6040516108ab929190613abd565b60405180910390f35b6108ce60048036038101906108c9919061335a565b61265b565b6040516108dc929190613c43565b60405180910390f35b6108ff60048036038101906108fa91906132f1565b6129fa565b60405161090c9190613632565b60405180910390f35b61092f600480360381019061092a91906132f1565b612a40565b60405161093d929190613abd565b60405180910390f35b610960600480360381019061095b91906132f1565b612b7d565b005b61097c600480360381019061097791906132f1565b612c04565b005b610986612c88565b6040516109939190613619565b60405180910390f35b6109a4612d1a565b6040516109b19190613632565b60405180910390f35b6109c2612d20565b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2790613cc2565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610a6b9291906138b5565b6020604051808303815f875af1158015610a87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aab9190613d0a565b508273ffffffffffffffffffffffffffffffffffffffff167f505b28e6941631badc363841ecbf8e1214b9379c643936458e87be718e15799982604051610af29190613632565b60405180910390a2505050565b610b07612d20565b8073ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015610b4a573d5f803e3d5ffd5b5050565b610b56612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663f97196623084846040518463ffffffff1660e01b8152600401610ba793929190613d35565b6020604051808303815f875af1158015610bc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be79190613d7e565b505050565b610bf4612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff166337ebe3a8306040518263ffffffff1660e01b8152600401610c419190613577565b5f604051808303815f87803b158015610c58575f80fd5b505af1158015610c6a573d5f803e3d5ffd5b50505050565b610c78612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663eb59acdc306040518263ffffffff1660e01b8152600401610cc59190613577565b5f604051808303815f87803b158015610cdc575f80fd5b505af1158015610cee573d5f803e3d5ffd5b50505050565b610cfc612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16632210dfb16040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610d55575f80fd5b505af1158015610d67573d5f803e3d5ffd5b50505050565b610d75612d20565b8060275f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6005602052805f5260405f205f915054906101000a900460ff1681565b610ddd612d20565b8273ffffffffffffffffffffffffffffffffffffffff166342842e0e3084846040518463ffffffff1660e01b8152600401610e1a93929190613d35565b5f604051808303815f87803b158015610e31575f80fd5b505af1158015610e43573d5f803e3d5ffd5b505050508273ffffffffffffffffffffffffffffffffffffffff167ff0e12da6b257be18ce026650cff8b178975c77440ae67662ac380d78d784ffaa82604051610e8d9190613632565b60405180910390a2505050565b610ea2612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663908c8502306040518263ffffffff1660e01b8152600401610eef9190613577565b5f604051808303815f87803b158015610f06575f80fd5b505af1158015610f18573d5f803e3d5ffd5b50505050565b5f805f8073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663dde798a4306040518263ffffffff1660e01b8152600401610f6f9190613577565b608060405180830381865afa158015610f8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fae9190613dcc565b935093509350935090919293565b6021602052815f5260405f208181548110610fd5575f80fd5b905f5260205f2090600702015f9150915050805f015490806001018054610ffb90613e5d565b80601f016020809104026020016040519081016040528092919081815260200182805461102790613e5d565b80156110725780601f1061104957610100808354040283529160200191611072565b820191905f5260205f20905b81548152906001019060200180831161105557829003601f168201915b50505050509080600201549080600301805461108d90613e5d565b80601f01602080910402602001604051908101604052809291908181526020018280546110b990613e5d565b80156111045780601f106110db57610100808354040283529160200191611104565b820191905f5260205f20905b8154815290600101906020018083116110e757829003601f168201915b505050505090806004015f9054906101000a900460ff16908060050154908060060154905087565b6023818154811061113b575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060205f83600281111561117f5761117e6133c7565b5b6002811115611191576111906133c7565b5b81526020019081526020015f2080546111a990613e5d565b80601f01602080910402602001604051908101604052809291908181526020018280546111d590613e5d565b80156112205780601f106111f757610100808354040283529160200191611220565b820191905f5260205f20905b81548152906001019060200180831161120357829003601f168201915b50505050509050919050565b6002816025811061123b575f80fd5b60209182820401919006915054906101000a900460ff1681565b61125d612da7565b611265612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663954fa5ee30336040518363ffffffff1660e01b81526004016112b4929190613e8d565b6020604051808303815f875af11580156112d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f49190613d7e565b506112fd612df6565b565b60275f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61132c612d20565b6113355f612dff565b565b601e602052805f5260405f205f915090505481565b611354612d20565b8573ffffffffffffffffffffffffffffffffffffffff1663f242432a3085888887876040518763ffffffff1660e01b815260040161139796959493929190613efe565b5f604051808303815f87803b1580156113ae575f80fd5b505af11580156113c0573d5f803e3d5ffd5b505050508573ffffffffffffffffffffffffffffffffffffffff167ff0e12da6b257be18ce026650cff8b178975c77440ae67662ac380d78d784ffaa8660405161140a9190613632565b60405180910390a2505050505050565b611422612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16633ba5713e306040518263ffffffff1660e01b815260040161146f9190613577565b5f604051808303815f87803b158015611486575f80fd5b505af1158015611498573d5f803e3d5ffd5b50505050565b5f8082036114af57600290506114dd565b60055f8381526020019081526020015f205f9054906101000a900460ff166114d85760016114da565b5f5b90505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611511612d20565b8060078190555050565b611523612da7565b5f8211611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c90613fc8565b60405180910390fd5b5f8390506115963330858473ffffffffffffffffffffffffffffffffffffffff16612ec0909392919063ffffffff16565b5f602560065442336040516020016115b09392919061404b565b604051602081830303815290604052805190602001205f1c6115d291906140b4565b90505f600282602581106115e9576115e86140e4565b5b602091828204019190069054906101000a900460ff1660ff1690505f61160e8261149e565b90505f816002811115611624576116236133c7565b5b866002811115611637576116366133c7565b5b1490505f81156117cb575f8673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161167b9190613577565b602060405180830381865afa158015611696573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ba9190613d7e565b90506002808111156116cf576116ce6133c7565b5b8460028111156116e2576116e16133c7565b5b146116f9578860026116f4919061413e565b611708565b88600754611707919061413e565b5b91508181106117415761173c33838973ffffffffffffffffffffffffffffffffffffffff16612f429092919063ffffffff16565b611776565b5f8111156117755761177433828973ffffffffffffffffffffffffffffffffffffffff16612f429092919063ffffffff16565b5b5b81601e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117c2919061417f565b92505081905550505b601f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166118cf576001601f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550602333908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60065f8154809291906118e1906141b2565b91905055508760225f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611932919061417f565b925050819055505f60275f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119989190613577565b602060405180830381865afa1580156119b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d79190613d7e565b9050600854811115611a1157611a10336008548473ffffffffffffffffffffffffffffffffffffffff16612f429092919063ffffffff16565b5b5f60205f876002811115611a2857611a276133c7565b5b6002811115611a3a57611a396133c7565b5b81526020019081526020015f208054611a5290613e5d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7e90613e5d565b8015611ac95780601f10611aa057610100808354040283529160200191611ac9565b820191905f5260205f20905b815481529060010190602001808311611aac57829003601f168201915b505050505090505f60205f8c6002811115611ae757611ae66133c7565b5b6002811115611af957611af86133c7565b5b81526020019081526020015f208054611b1190613e5d565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3d90613e5d565b8015611b885780601f10611b5f57610100808354040283529160200191611b88565b820191905f5260205f20905b815481529060010190602001808311611b6b57829003601f168201915b5050505050905060215f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060e001604052808e81526020018381526020018a8152602001848152602001881515815260200187815260200142815250908060018154018082558091505060019003905f5260205f2090600702015f909190919091505f820151815f01556020820151816001019081611c4491906143ba565b50604082015181600201556060820151816003019081611c6491906143ba565b506080820151816004015f6101000a81548160ff02191690831515021790555060a0820151816005015560c0820151816006015550503373ffffffffffffffffffffffffffffffffffffffff167ff14919ff92658c8b721faa944957b48dedaee13316a12a2635add911929e91708d83604051611ce2929190614489565b60405180910390a23373ffffffffffffffffffffffffffffffffffffffff167f9866c7d534ee19214efceb6d9f1de5ef8625b0e3b92cdeca4f78ba3baed31044878a85604051611d34939291906144b7565b60405180910390a250505050505050505050611d4e612df6565b505050565b73430000000000000000000000000000000000000281565b6022602052805f5260405f205f915090505481565b611d88612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663fafce39e308585856040518563ffffffff1660e01b8152600401611ddb94939291906144f3565b6020604051808303815f875af1158015611df7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e1b9190613d7e565b50505050565b5f600654905090565b60265f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60208052805f5260405f205f915090508054611e6a90613e5d565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9690613e5d565b8015611ee15780601f10611eb857610100808354040283529160200191611ee1565b820191905f5260205f20905b815481529060010190602001808311611ec457829003601f168201915b505050505081565b60048160128110611ef8575f80fd5b60209182820401919006915054906101000a900460ff1681565b611f1a612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663aa857d986040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611f73575f80fd5b505af1158015611f85573d5f803e3d5ffd5b50505050565b611f93612d20565b8060088190555050565b600981600a8110611fac575f80fd5b600202015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b606060215f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b828210156121d2578382905f5260205f2090600702016040518060e00160405290815f820154815260200160018201805461207b90613e5d565b80601f01602080910402602001604051908101604052809291908181526020018280546120a790613e5d565b80156120f25780601f106120c9576101008083540402835291602001916120f2565b820191905f5260205f20905b8154815290600101906020018083116120d557829003601f168201915b505050505081526020016002820154815260200160038201805461211590613e5d565b80601f016020809104026020016040519081016040528092919081815260200182805461214190613e5d565b801561218c5780601f106121635761010080835404028352916020019161218c565b820191905f5260205f20905b81548152906001019060200180831161216f57829003601f168201915b50505050508152602001600482015f9054906101000a900460ff161515151581526020016005820154815260200160068201548152505081526020019060010190612041565b505050509050919050565b6121e5612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16630951888f3084846040518463ffffffff1660e01b815260040161223693929190613d35565b6020604051808303815f875af1158015612252573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122769190613d7e565b505050565b60065481565b601d5481565b61228f612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663860043b630836040518363ffffffff1660e01b81526004016122de929190613e8d565b6020604051808303815f875af11580156122fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061231e9190613d7e565b5050565b60255f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61234f612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663b71d6dd4306040518263ffffffff1660e01b815260040161239c9190613577565b5f604051808303815f87803b1580156123b3575f80fd5b505af11580156123c5573d5f803e3d5ffd5b50505050565b6123d3612d20565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663662aa11d30836040518363ffffffff1660e01b8152600401612422929190613e8d565b6020604051808303815f875af115801561243e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124629190613d7e565b5050565b60075481565b5f73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663ec3278e8306040518263ffffffff1660e01b81526004016124ba9190613577565b602060405180830381865afa1580156124d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124f99190613d7e565b905090565b5f80612508612da7565b612510612d20565b60255f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aad3ec9685856040518363ffffffff1660e01b815260040161256c9291906138b5565b6020604051808303815f875af1158015612588573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125ac9190613d7e565b60265f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aad3ec9686866040518363ffffffff1660e01b81526004016126089291906138b5565b6020604051808303815f875af1158015612624573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126489190613d7e565b91509150612654612df6565b9250929050565b6060805f8311801561266e5750600a8311155b6126ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a490614580565b60405180910390fd5b5f60238054905090505f81116126f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ef906145e8565b60405180910390fd5b8367ffffffffffffffff811115612712576127116141f9565b5b6040519080825280602002602001820160405280156127405781602001602082028036833780820191505090505b5092508367ffffffffffffffff81111561275d5761275c6141f9565b5b60405190808252806020026020018201604052801561278b5781602001602082028036833780820191505090505b5091505f5b848110156127c5575f8382815181106127ac576127ab6140e4565b5b6020026020010181815250508080600101915050612790565b505f5b818110156129f3575f602382815481106127e5576127e46140e4565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f601e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f5b878110156129e35785818151811061286d5761286c6140e4565b5b60200260200101518211156129d6575f60018961288a9190614606565b90505b8181111561296257866001826128a39190614606565b815181106128b4576128b36140e4565b5b60200260200101518782815181106128cf576128ce6140e4565b5b602002602001018181525050876001826128e99190614606565b815181106128fa576128f96140e4565b5b6020026020010151888281518110612915576129146140e4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808061295a90614639565b91505061288d565b5081868281518110612977576129766140e4565b5b60200260200101818152505082878281518110612997576129966140e4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506129e3565b8080600101915050612852565b50505080806001019150506127c8565b5050915091565b5f601e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f8060255f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e12f3a61846040518263ffffffff1660e01b8152600401612a9c9190613577565b602060405180830381865afa158015612ab7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612adb9190613d7e565b60265f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e12f3a61856040518263ffffffff1660e01b8152600401612b359190613577565b602060405180830381865afa158015612b50573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b749190613d7e565b91509150915091565b612b85612d20565b732536fe9ab3f511540f2f9e2ec2a805005c3dd80073ffffffffffffffffffffffffffffffffffffffff1663b30080ac30836040518363ffffffff1660e01b8152600401612bd4929190613e8d565b5f604051808303815f87803b158015612beb575f80fd5b505af1158015612bfd573d5f803e3d5ffd5b5050505050565b612c0c612d20565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c7c575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612c739190613577565b60405180910390fd5b612c8581612dff565b50565b5f73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663fd8c4b9d306040518263ffffffff1660e01b8152600401612cd69190613577565b602060405180830381865afa158015612cf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d15919061468a565b905090565b60085481565b612d28612fc1565b73ffffffffffffffffffffffffffffffffffffffff16612d466114e2565b73ffffffffffffffffffffffffffffffffffffffff1614612da557612d69612fc1565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401612d9c9190613577565b60405180910390fd5b565b600260015403612dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de3906146ff565b60405180910390fd5b6002600181905550565b60018081905550565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f3c848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401612ef593929190613d35565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612fc8565b50505050565b612fbc838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612f759291906138b5565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612fc8565b505050565b5f33905090565b5f612ff2828473ffffffffffffffffffffffffffffffffffffffff1661305d90919063ffffffff16565b90505f8151141580156130165750808060200190518101906130149190613d0a565b155b1561305857826040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161304f9190613577565b60405180910390fd5b505050565b606061306a83835f613072565b905092915050565b6060814710156130b957306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016130b09190613577565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff1684866040516130e19190614761565b5f6040518083038185875af1925050503d805f811461311b576040519150601f19603f3d011682016040523d82523d5f602084013e613120565b606091505b509150915061313086838361313b565b925050509392505050565b6060826131505761314b826131c8565b6131c0565b5f825114801561317657505f8473ffffffffffffffffffffffffffffffffffffffff163b145b156131b857836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016131af9190613577565b60405180910390fd5b8190506131c1565b5b9392505050565b5f815111156131da5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61323d82613214565b9050919050565b61324d81613233565b8114613257575f80fd5b50565b5f8135905061326881613244565b92915050565b5f819050919050565b6132808161326e565b811461328a575f80fd5b50565b5f8135905061329b81613277565b92915050565b5f805f606084860312156132b8576132b761320c565b5b5f6132c58682870161325a565b93505060206132d68682870161325a565b92505060406132e78682870161328d565b9150509250925092565b5f602082840312156133065761330561320c565b5b5f6133138482850161325a565b91505092915050565b5f80604083850312156133325761333161320c565b5b5f61333f8582860161325a565b92505060206133508582860161328d565b9150509250929050565b5f6020828403121561336f5761336e61320c565b5b5f61337c8482850161328d565b91505092915050565b5f8115159050919050565b61339981613385565b82525050565b5f6020820190506133b25f830184613390565b92915050565b6133c18161326e565b82525050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110613405576134046133c7565b5b50565b5f819050613415826133f4565b919050565b5f61342482613408565b9050919050565b6134348161341a565b82525050565b5f60808201905061344d5f8301876133b8565b61345a60208301866133b8565b61346760408301856133b8565b613474606083018461342b565b95945050505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6134bf8261347d565b6134c98185613487565b93506134d9818560208601613497565b6134e2816134a5565b840191505092915050565b5f60e0820190506135005f83018a6133b8565b818103602083015261351281896134b5565b905061352160408301886133b8565b818103606083015261353381876134b5565b90506135426080830186613390565b61354f60a08301856133b8565b61355c60c08301846133b8565b98975050505050505050565b61357181613233565b82525050565b5f60208201905061358a5f830184613568565b92915050565b6003811061359c575f80fd5b50565b5f813590506135ad81613590565b92915050565b5f602082840312156135c8576135c761320c565b5b5f6135d58482850161359f565b91505092915050565b5f6020820190508181035f8301526135f681846134b5565b905092915050565b5f60ff82169050919050565b613613816135fe565b82525050565b5f60208201905061362c5f83018461360a565b92915050565b5f6020820190506136455f8301846133b8565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261366c5761366b61364b565b5b8235905067ffffffffffffffff8111156136895761368861364f565b5b6020830191508360018202830111156136a5576136a4613653565b5b9250929050565b5f805f805f8060a087890312156136c6576136c561320c565b5b5f6136d389828a0161325a565b96505060206136e489828a0161328d565b95505060406136f589828a0161328d565b945050606061370689828a0161325a565b935050608087013567ffffffffffffffff81111561372757613726613210565b5b61373389828a01613657565b92509250509295509295509295565b60038110613753576137526133c7565b5b50565b5f81905061376382613742565b919050565b5f61377282613756565b9050919050565b61378281613768565b82525050565b5f60208201905061379b5f830184613779565b92915050565b5f805f606084860312156137b8576137b761320c565b5b5f6137c58682870161325a565b93505060206137d68682870161328d565b92505060406137e78682870161359f565b9150509250925092565b5f819050919050565b5f61381461380f61380a84613214565b6137f1565b613214565b9050919050565b5f613825826137fa565b9050919050565b5f6138368261381b565b9050919050565b6138468161382c565b82525050565b5f60208201905061385f5f83018461383d565b92915050565b5f805f6060848603121561387c5761387b61320c565b5b5f6138898682870161325a565b935050602061389a8682870161328d565b92505060406138ab8682870161328d565b9150509250925092565b5f6040820190506138c85f830185613568565b6138d560208301846133b8565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61390e8161326e565b82525050565b5f82825260208201905092915050565b5f61392e8261347d565b6139388185613914565b9350613948818560208601613497565b613951816134a5565b840191505092915050565b61396581613385565b82525050565b5f60e083015f8301516139805f860182613905565b50602083015184820360208601526139988282613924565b91505060408301516139ad6040860182613905565b50606083015184820360608601526139c58282613924565b91505060808301516139da608086018261395c565b5060a08301516139ed60a0860182613905565b5060c0830151613a0060c0860182613905565b508091505092915050565b5f613a16838361396b565b905092915050565b5f602082019050919050565b5f613a34826138dc565b613a3e81856138e6565b935083602082028501613a50856138f6565b805f5b85811015613a8b5784840389528151613a6c8582613a0b565b9450613a7783613a1e565b925060208a01995050600181019050613a53565b50829750879550505050505092915050565b5f6020820190508181035f830152613ab58184613a2a565b905092915050565b5f604082019050613ad05f8301856133b8565b613add60208301846133b8565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613b1681613233565b82525050565b5f613b278383613b0d565b60208301905092915050565b5f602082019050919050565b5f613b4982613ae4565b613b538185613aee565b9350613b5e83613afe565b805f5b83811015613b8e578151613b758882613b1c565b9750613b8083613b33565b925050600181019050613b61565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f613bcf8383613905565b60208301905092915050565b5f602082019050919050565b5f613bf182613b9b565b613bfb8185613ba5565b9350613c0683613bb5565b805f5b83811015613c36578151613c1d8882613bc4565b9750613c2883613bdb565b925050600181019050613c09565b5085935050505092915050565b5f6040820190508181035f830152613c5b8185613b3f565b90508181036020830152613c6f8184613be7565b90509392505050565b7f43616e6e6f74207265636f766572206f776e20746f6b656e73000000000000005f82015250565b5f613cac601983613487565b9150613cb782613c78565b602082019050919050565b5f6020820190508181035f830152613cd981613ca0565b9050919050565b613ce981613385565b8114613cf3575f80fd5b50565b5f81519050613d0481613ce0565b92915050565b5f60208284031215613d1f57613d1e61320c565b5b5f613d2c84828501613cf6565b91505092915050565b5f606082019050613d485f830186613568565b613d556020830185613568565b613d6260408301846133b8565b949350505050565b5f81519050613d7881613277565b92915050565b5f60208284031215613d9357613d9261320c565b5b5f613da084828501613d6a565b91505092915050565b60028110613db5575f80fd5b50565b5f81519050613dc681613da9565b92915050565b5f805f8060808587031215613de457613de361320c565b5b5f613df187828801613d6a565b9450506020613e0287828801613d6a565b9350506040613e1387828801613d6a565b9250506060613e2487828801613db8565b91505092959194509250565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613e7457607f821691505b602082108103613e8757613e86613e30565b5b50919050565b5f604082019050613ea05f830185613568565b613ead6020830184613568565b9392505050565b5f82825260208201905092915050565b828183375f83830152505050565b5f613edd8385613eb4565b9350613eea838584613ec4565b613ef3836134a5565b840190509392505050565b5f60a082019050613f115f830189613568565b613f1e6020830188613568565b613f2b60408301876133b8565b613f3860608301866133b8565b8181036080830152613f4b818486613ed2565b9050979650505050505050565b7f42657420616d6f756e74206d7573742062652067726561746572207468616e205f8201527f7a65726f00000000000000000000000000000000000000000000000000000000602082015250565b5f613fb2602483613487565b9150613fbd82613f58565b604082019050919050565b5f6020820190508181035f830152613fdf81613fa6565b9050919050565b5f819050919050565b614000613ffb8261326e565b613fe6565b82525050565b5f8160601b9050919050565b5f61401c82614006565b9050919050565b5f61402d82614012565b9050919050565b61404561404082613233565b614023565b82525050565b5f6140568286613fef565b6020820191506140668285613fef565b6020820191506140768284614034565b601482019150819050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6140be8261326e565b91506140c98361326e565b9250826140d9576140d8614087565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6141488261326e565b91506141538361326e565b92508282026141618161326e565b9150828204841483151761417857614177614111565b5b5092915050565b5f6141898261326e565b91506141948361326e565b92508282019050808211156141ac576141ab614111565b5b92915050565b5f6141bc8261326e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141ee576141ed614111565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026142827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614247565b61428c8683614247565b95508019841693508086168417925050509392505050565b5f6142be6142b96142b48461326e565b6137f1565b61326e565b9050919050565b5f819050919050565b6142d7836142a4565b6142eb6142e3826142c5565b848454614253565b825550505050565b5f90565b6142ff6142f3565b61430a8184846142ce565b505050565b5b8181101561432d576143225f826142f7565b600181019050614310565b5050565b601f8211156143725761434381614226565b61434c84614238565b8101602085101561435b578190505b61436f61436785614238565b83018261430f565b50505b505050565b5f82821c905092915050565b5f6143925f1984600802614377565b1980831691505092915050565b5f6143aa8383614383565b9150826002028217905092915050565b6143c38261347d565b67ffffffffffffffff8111156143dc576143db6141f9565b5b6143e68254613e5d565b6143f1828285614331565b5f60209050601f831160018114614422575f8415614410578287015190505b61441a858261439f565b865550614481565b601f19841661443086614226565b5f5b8281101561445757848901518255600182019150602085019450602081019050614432565b868310156144745784890151614470601f891682614383565b8355505b6001600288020188555050505b505050505050565b5f60408201905061449c5f8301856133b8565b81810360208301526144ae81846134b5565b90509392505050565b5f6060820190506144ca5f830186613390565b6144d760208301856133b8565b81810360408301526144e981846134b5565b9050949350505050565b5f6080820190506145065f830187613568565b6145136020830186613568565b61452060408301856133b8565b61452d60608301846133b8565b95945050505050565b7f436f756e74206d757374206265206265747765656e203120616e6420313000005f82015250565b5f61456a601e83613487565b915061457582614536565b602082019050919050565b5f6020820190508181035f8301526145978161455e565b9050919050565b7f4e6f20757365727320746f206c697374000000000000000000000000000000005f82015250565b5f6145d2601083613487565b91506145dd8261459e565b602082019050919050565b5f6020820190508181035f8301526145ff816145c6565b9050919050565b5f6146108261326e565b915061461b8361326e565b925082820390508181111561463357614632614111565b5b92915050565b5f6146438261326e565b91505f820361465557614654614111565b5b600182039050919050565b614669816135fe565b8114614673575f80fd5b50565b5f8151905061468481614660565b92915050565b5f6020828403121561469f5761469e61320c565b5b5f6146ac84828501614676565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6146e9601f83613487565b91506146f4826146b5565b602082019050919050565b5f6020820190508181035f830152614716816146dd565b9050919050565b5f81519050919050565b5f81905092915050565b5f61473b8261471d565b6147458185614727565b9350614755818560208601613497565b80840191505092915050565b5f61476c8284614731565b91508190509291505056fea264697066735822122012a1c4ca3ba775f75954b78bb604ff0a9966ec1d3bd18abd45dc85d2d005b96564736f6c634300081a0033
Deployed Bytecode Sourcemap
62156:13256:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74241:340;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75286:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72665:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71788:133;;;:::i;:::-;;72538:119;;;:::i;:::-;;72440:90;;;:::i;:::-;;70640:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63130:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74589:267;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72303:129;;;:::i;:::-;;73956:277;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;64354:38;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;64457:30;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68861:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62343:505;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70777:118;;;:::i;:::-;;64734:73;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22445:103;;;:::i;:::-;;64203:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74864:414;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71929:133;;;:::i;:::-;;68662:191;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21770:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70426:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66416:2238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62244:90;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64401:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73368:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68986:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64655:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64302:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62855:266;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72070:94;;;:::i;:::-;;70533:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63379:28;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;69196:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72949:272;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63182:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63414:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72816:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64576:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72172:123;;;:::i;:::-;;73229:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63213:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73680:127;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70903:340;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;69313:1105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;69083:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71251:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;71559:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22703:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73815:133;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63251:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74241:340;21656:13;:11;:13::i;:::-;74419:4:::1;74395:29;;:12;:29;;::::0;74387:67:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;74472:12;74465:29;;;74495:7;74504:11;74465:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;74547:12;74532:41;;;74561:11;74532:41;;;;;;:::i;:::-;;;;;;;;74241:340:::0;;;:::o;75286:123::-;21656:13;:11;:13::i;:::-;75361:7:::1;75353:25;;:48;75379:21;75353:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;75286:123:::0;:::o;72665:143::-;21656:13;:11;:13::i;:::-;62291:42:::1;72750:16;;;72775:4;72782:9;72793:6;72750:50;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72665:143:::0;;:::o;71788:133::-;21656:13;:11;:13::i;:::-;62291:42:::1;71861:37;;;71907:4;71861:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;71788:133::o:0;72538:119::-;21656:13;:11;:13::i;:::-;62291:42:::1;72604:30;;;72643:4;72604:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;72538:119::o:0;72440:90::-;21656:13;:11;:13::i;:::-;62291:42:::1;72498:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;72440:90::o:0;70640:105::-;21656:13;:11;:13::i;:::-;70729:8:::1;70713:13;;:24;;;;;;;;;;;;;;;;;;70640:105:::0;:::o;63130:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;74589:267::-;21656:13;:11;:13::i;:::-;74738:10:::1;74730:36;;;74775:4;74782:7;74791;74730:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;74828:10;74815:33;;;74840:7;74815:33;;;;;;:::i;:::-;;;;;;;;74589:267:::0;;;:::o;72303:129::-;21656:13;:11;:13::i;:::-;62291:42:::1;72374:35;;;72418:4;72374:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;72303:129::o:0;73956:277::-;74045:20;74080;74115:19;74149:7;62291:42;74191:19;;;74219:4;74191:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74184:41;;;;;;;;73956:277;;;;:::o;64354:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64457:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68861:117::-;68920:13;68953:10;:17;68964:5;68953:17;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68946:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68861:117;;;:::o;62343:505::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70777:118::-;57854:21;:19;:21::i;:::-;21656:13:::1;:11;:13::i;:::-;62291:42:::2;70843:17;;;70869:4;70876:10;70843:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57898:20:::0;:18;:20::i;:::-;70777:118::o;64734:73::-;;;;;;;;;;;;;:::o;22445:103::-;21656:13;:11;:13::i;:::-;22510:30:::1;22537:1;22510:18;:30::i;:::-;22445:103::o:0;64203:43::-;;;;;;;;;;;;;;;;;:::o;74864:414::-;21656:13;:11;:13::i;:::-;75070:10:::1;75061:37;;;75121:4;75141:7;75163;75185:6;75206:4;;75061:160;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;75250:10;75237:33;;;75262:7;75237:33;;;;;;:::i;:::-;;;;;;;;74864:414:::0;;;;;;:::o;71929:133::-;21656:13;:11;:13::i;:::-;62291:42:::1;72002:37;;;72048:4;72002:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;71929:133::o:0;68662:191::-;68717:8;68752:1;68742:6;:11;68738:38;;68762:14;68755:21;;;;68738:38;68794:11;:19;68806:6;68794:19;;;;;;;;;;;;;;;;;;;;;:51;;68831:14;68794:51;;;68816:12;68794:51;68787:58;;68662:191;;;;:::o;21770:87::-;21816:7;21843:6;;;;;;;;;;;21836:13;;21770:87;:::o;70426:99::-;21656:13;:11;:13::i;:::-;70511:6:::1;70497:11;:20;;;;70426:99:::0;:::o;66416:2238::-;57854:21;:19;:21::i;:::-;66567:1:::1;66558:6;:10;66550:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;66622:13;66645:9;66622:33;;66666:58;66690:10;66710:4;66717:6;66666;:23;;;;:58;;;;;;:::i;:::-;66737:19;66862:14;66808:9;;66819:15;66836:10;66791:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66781:67;;;;;;66759:100;;:117;;;;:::i;:::-;66737:139;;66889:21;66913:7;66921:11;66913:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;66889:44;;;;66944:21;66968:23;66977:13;66968:8;:23::i;:::-;66944:47;;67004:8;67025:12;67016:21;;;;;;;;:::i;:::-;;:5;:21;;;;;;;;:::i;:::-;;;67004:34;;67049:14;67084:3;67080:515;;;67104:15;67122:6;:16;;;67147:4;67122:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67104:49;;67194:14;67178:30:::0;::::1;;;;;;;:::i;:::-;;:12;:30;;;;;;;;:::i;:::-;;;67177:106;;67276:6;67272:1;:10;;;;:::i;:::-;67177:106;;;67244:6;67230:11;;:20;;;;:::i;:::-;67177:106;67168:115;;67315:6;67304:7;:17;67300:237;;67342:39;67362:10;67374:6;67342;:19;;;;:39;;;;;:::i;:::-;67300:237;;;67436:1;67426:7;:11;67422:100;;;67462:40;67482:10;67494:7;67462:6;:19;;;;:40;;;;;:::i;:::-;67422:100;67300:237;67577:6;67553:8;:20;67562:10;67553:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;67089:506;67080:515;67612:9;:21;67622:10;67612:21;;;;;;;;;;;;;;;;;;;;;;;;;67607:128;;67674:4;67650:9;:21;67660:10;67650:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;67693:13;67712:10;67693:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67607:128;67747:9;;:11;;;;;;;;;:::i;:::-;;;;;;67799:6;67771:12;:24;67784:10;67771:24;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;67818:13;67841;;;;;;;;;;;67818:37;;67866:21;67890:6;:16;;;67915:4;67890:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67866:55;;67952:11;;67936:13;:27;67932:104;;;67980:44;68000:10;68012:11;;67980:6;:19;;;;:44;;;;;:::i;:::-;67932:104;68048:30;68081:10;:24;68092:12;68081:24;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68048:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68116:23;68142:10;:17;68153:5;68142:17;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68116:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68172:4;:16;68177:10;68172:16;;;;;;;;;;;;;;;68208:292;;;;;;;;68240:6;68208:292;;;;68274:9;68208:292;;;;68317:13;68208:292;;;;68363:16;68208:292;;;;68403:3;68208:292;;;;;;68433:6;68208:292;;;;68469:15;68208:292;;::::0;68172:339:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68539:10;68529:40;;;68551:6;68559:9;68529:40;;;;;;;:::i;:::-;;;;;;;;68597:10;68585:61;;;68609:3;68614:13;68629:16;68585:61;;;;;;;;:::i;:::-;;;;;;;;66539:2115;;;;;;;;;;57898:20:::0;:18;:20::i;:::-;66416:2238;;;:::o;62244:90::-;62291:42;62244:90;:::o;64401:47::-;;;;;;;;;;;;;;;;;:::o;73368:304::-;21656:13;:11;:13::i;:::-;62291:42:::1;73523:14;;;73560:4;73580:14;73609:10;73634:19;73523:141;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;73368:304:::0;;;:::o;68986:89::-;69031:7;69058:9;;69051:16;;68986:89;:::o;64655:72::-;;;;;;;;;;;;;:::o;64302:45::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62855:266::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72070:94::-;21656:13;:11;:13::i;:::-;62291:42:::1;72130:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;72070:94::o:0;70533:99::-;21656:13;:11;:13::i;:::-;70618:6:::1;70604:11;:20;;;;70533:99:::0;:::o;63379:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69196:109::-;69254:13;69287:4;:10;69292:4;69287:10;;;;;;;;;;;;;;;69280:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69196:109;;;:::o;72949:272::-;21656:13;:11;:13::i;:::-;62291:42:::1;73086:28;;;73137:4;73157:14;73186:16;73086:127;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72949:272:::0;;:::o;63182:24::-;;;;:::o;63414:29::-;;;;:::o;72816:125::-;21656:13;:11;:13::i;:::-;62291:42:::1;72888:19;;;72916:4;72923:9;72888:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72816:125:::0;:::o;64576:72::-;;;;;;;;;;;;;:::o;72172:123::-;21656:13;:11;:13::i;:::-;62291:42:::1;72240:32;;;72281:4;72240:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;72172:123::o:0;73229:131::-;21656:13;:11;:13::i;:::-;62291:42:::1;73304:17;;;73330:4;73337:14;73304:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;73229:131:::0;:::o;63213:31::-;;;;:::o;73680:127::-;73733:7;62291:42;73760:24;;;73793:4;73760:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73753:46;;73680:127;:::o;70903:340::-;71043:7;71052;57854:21;:19;:21::i;:::-;21656:13:::1;:11;:13::i;:::-;71114:12:::2;;;;;;;;;;;71099:34;;;71134:10;71146:7;71099:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71184:12;;;;;;;;;;;71169:34;;;71204:10;71216:7;71169:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71077:158;;;;57898:20:::0;:18;:20::i;:::-;70903:340;;;;;:::o;69313:1105::-;69397:25;69424:24;69482:1;69474:5;:9;:24;;;;;69496:2;69487:5;:11;;69474:24;69466:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;69546:17;69566:13;:20;;;;69546:40;;69617:1;69605:9;:13;69597:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;69677:5;69663:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69652:31;;69718:5;69704:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69694:30;;69742:9;69737:77;69761:5;69757:1;:9;69737:77;;;69801:1;69788:7;69796:1;69788:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;69768:3;;;;;;;69737:77;;;;69831:9;69826:585;69850:9;69846:1;:13;69826:585;;;69881:12;69896:13;69910:1;69896:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;69881:31;;69927:15;69945:8;:14;69954:4;69945:14;;;;;;;;;;;;;;;;69927:32;;69981:9;69976:424;70000:5;69996:1;:9;69976:424;;;70045:7;70053:1;70045:10;;;;;;;;:::i;:::-;;;;;;;;70035:7;:20;70031:354;;;70085:9;70105:1;70097:5;:9;;;;:::i;:::-;70085:21;;70080:174;70112:1;70108;:5;70080:174;;;70160:7;70172:1;70168;:5;;;;:::i;:::-;70160:14;;;;;;;;:::i;:::-;;;;;;;;70147:7;70155:1;70147:10;;;;;;;;:::i;:::-;;;;;;;:27;;;;;70215:8;70228:1;70224;:5;;;;:::i;:::-;70215:15;;;;;;;;:::i;:::-;;;;;;;;70201:8;70210:1;70201:11;;;;;;;;:::i;:::-;;;;;;;:29;;;;;;;;;;;70115:3;;;;;:::i;:::-;;;;70080:174;;;;70289:7;70276;70284:1;70276:10;;;;;;;;:::i;:::-;;;;;;;:20;;;;;70333:4;70319:8;70328:1;70319:11;;;;;;;;:::i;:::-;;;;;;;:18;;;;;;;;;;;70360:5;;70031:354;70007:3;;;;;;;69976:424;;;;69866:545;;69861:3;;;;;;;69826:585;;;;69455:963;69313:1105;;;:::o;69083:105::-;69139:7;69166:8;:14;69175:4;69166:14;;;;;;;;;;;;;;;;69159:21;;69083:105;;;:::o;71251:300::-;71347:7;71356;71418:12;;;;;;;;;;;71403:47;;;71451:8;71403:57;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71490:12;;;;;;;;;;;71475:47;;;71523:8;71475:57;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71381:162;;;;71251:300;;;:::o;71559:221::-;21656:13;:11;:13::i;:::-;71654:42:::1;71641:102;;;71752:4;71759:12;71641:131;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;71559:221:::0;:::o;22703:220::-;21656:13;:11;:13::i;:::-;22808:1:::1;22788:22;;:8;:22;;::::0;22784:93:::1;;22862:1;22834:31;;;;;;;;;;;:::i;:::-;;;;;;;;22784:93;22887:28;22906:8;22887:18;:28::i;:::-;22703:220:::0;:::o;73815:133::-;73872:5;62291:42;73897:28;;;73934:4;73897:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73890:50;;73815:133;:::o;63251:30::-;;;;:::o;21935:166::-;22006:12;:10;:12::i;:::-;21995:23;;:7;:5;:7::i;:::-;:23;;;21991:103;;22069:12;:10;:12::i;:::-;22042:40;;;;;;;;;;;:::i;:::-;;;;;;;;21991:103;21935:166::o;57934:293::-;57336:1;58068:7;;:19;58060:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;57336:1;58201:7;:18;;;;57934:293::o;58235:213::-;57292:1;58418:7;:22;;;;58235:213::o;23083:191::-;23157:16;23176:6;;;;;;;;;;;23157:25;;23202:8;23193:6;;:17;;;;;;;;;;;;;;;;;;23257:8;23226:40;;23247:8;23226:40;;;;;;;;;;;;23146:128;23083:191;:::o;14939:190::-;15040:81;15060:5;15082;:18;;;15103:4;15109:2;15113:5;15067:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15040:19;:81::i;:::-;14939:190;;;;:::o;14532:162::-;14615:71;14635:5;14657;:14;;;14674:2;14678:5;14642:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14615:19;:71::i;:::-;14532:162;;;:::o;19779:98::-;19832:7;19859:10;19852:17;;19779:98;:::o;17343:638::-;17767:23;17793:33;17821:4;17801:5;17793:27;;;;:33;;;;:::i;:::-;17767:59;;17862:1;17841:10;:17;:22;;:57;;;;;17879:10;17868:30;;;;;;;;;;;;:::i;:::-;17867:31;17841:57;17837:137;;;17955:5;17922:40;;;;;;;;;;;:::i;:::-;;;;;;;;17837:137;17413:568;17343:638;;:::o;9658:153::-;9733:12;9765:38;9787:6;9795:4;9801:1;9765:21;:38::i;:::-;9758:45;;9658:153;;;;:::o;10146:398::-;10245:12;10298:5;10274:21;:29;10270:110;;;10362:4;10327:41;;;;;;;;;;;:::i;:::-;;;;;;;;10270:110;10391:12;10405:23;10432:6;:11;;10451:5;10458:4;10432:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10390:73;;;;10481:55;10508:6;10516:7;10525:10;10481:26;:55::i;:::-;10474:62;;;;10146:398;;;;;:::o;11622:597::-;11770:12;11800:7;11795:417;;11824:19;11832:10;11824:7;:19::i;:::-;11795:417;;;12073:1;12052:10;:17;:22;:49;;;;;12100:1;12078:6;:18;;;:23;12052:49;12048:121;;;12146:6;12129:24;;;;;;;;;;;:::i;:::-;;;;;;;;12048:121;12190:10;12183:17;;;;11795:417;11622:597;;;;;;:::o;12772:528::-;12925:1;12905:10;:17;:21;12901:392;;;13137:10;13131:17;13194:15;13181:10;13177:2;13173:19;13166:44;12901:392;13264:17;;;;;;;;;;;;;;88:117:1;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:619::-;1274:6;1282;1290;1339:2;1327:9;1318:7;1314:23;1310:32;1307:119;;;1345:79;;:::i;:::-;1307:119;1465:1;1490:53;1535:7;1526:6;1515:9;1511:22;1490:53;:::i;:::-;1480:63;;1436:117;1592:2;1618:53;1663:7;1654:6;1643:9;1639:22;1618:53;:::i;:::-;1608:63;;1563:118;1720:2;1746:53;1791:7;1782:6;1771:9;1767:22;1746:53;:::i;:::-;1736:63;;1691:118;1197:619;;;;;:::o;1822:329::-;1881:6;1930:2;1918:9;1909:7;1905:23;1901:32;1898:119;;;1936:79;;:::i;:::-;1898:119;2056:1;2081:53;2126:7;2117:6;2106:9;2102:22;2081:53;:::i;:::-;2071:63;;2027:117;1822:329;;;;:::o;2157:474::-;2225:6;2233;2282:2;2270:9;2261:7;2257:23;2253:32;2250:119;;;2288:79;;:::i;:::-;2250:119;2408:1;2433:53;2478:7;2469:6;2458:9;2454:22;2433:53;:::i;:::-;2423:63;;2379:117;2535:2;2561:53;2606:7;2597:6;2586:9;2582:22;2561:53;:::i;:::-;2551:63;;2506:118;2157:474;;;;;:::o;2637:329::-;2696:6;2745:2;2733:9;2724:7;2720:23;2716:32;2713:119;;;2751:79;;:::i;:::-;2713:119;2871:1;2896:53;2941:7;2932:6;2921:9;2917:22;2896:53;:::i;:::-;2886:63;;2842:117;2637:329;;;;:::o;2972:90::-;3006:7;3049:5;3042:13;3035:21;3024:32;;2972:90;;;:::o;3068:109::-;3149:21;3164:5;3149:21;:::i;:::-;3144:3;3137:34;3068:109;;:::o;3183:210::-;3270:4;3308:2;3297:9;3293:18;3285:26;;3321:65;3383:1;3372:9;3368:17;3359:6;3321:65;:::i;:::-;3183:210;;;;:::o;3399:118::-;3486:24;3504:5;3486:24;:::i;:::-;3481:3;3474:37;3399:118;;:::o;3523:180::-;3571:77;3568:1;3561:88;3668:4;3665:1;3658:15;3692:4;3689:1;3682:15;3709:117;3794:1;3787:5;3784:12;3774:46;;3800:18;;:::i;:::-;3774:46;3709:117;:::o;3832:135::-;3881:7;3910:5;3899:16;;3916:45;3955:5;3916:45;:::i;:::-;3832:135;;;:::o;3973:::-;4033:9;4066:36;4096:5;4066:36;:::i;:::-;4053:49;;3973:135;;;:::o;4114:151::-;4211:47;4252:5;4211:47;:::i;:::-;4206:3;4199:60;4114:151;;:::o;4271:573::-;4458:4;4496:3;4485:9;4481:19;4473:27;;4510:71;4578:1;4567:9;4563:17;4554:6;4510:71;:::i;:::-;4591:72;4659:2;4648:9;4644:18;4635:6;4591:72;:::i;:::-;4673;4741:2;4730:9;4726:18;4717:6;4673:72;:::i;:::-;4755:82;4833:2;4822:9;4818:18;4809:6;4755:82;:::i;:::-;4271:573;;;;;;;:::o;4850:99::-;4902:6;4936:5;4930:12;4920:22;;4850:99;;;:::o;4955:169::-;5039:11;5073:6;5068:3;5061:19;5113:4;5108:3;5104:14;5089:29;;4955:169;;;;:::o;5130:139::-;5219:6;5214:3;5209;5203:23;5260:1;5251:6;5246:3;5242:16;5235:27;5130:139;;;:::o;5275:102::-;5316:6;5367:2;5363:7;5358:2;5351:5;5347:14;5343:28;5333:38;;5275:102;;;:::o;5383:377::-;5471:3;5499:39;5532:5;5499:39;:::i;:::-;5554:71;5618:6;5613:3;5554:71;:::i;:::-;5547:78;;5634:65;5692:6;5687:3;5680:4;5673:5;5669:16;5634:65;:::i;:::-;5724:29;5746:6;5724:29;:::i;:::-;5719:3;5715:39;5708:46;;5475:285;5383:377;;;;:::o;5766:1056::-;6061:4;6099:3;6088:9;6084:19;6076:27;;6113:71;6181:1;6170:9;6166:17;6157:6;6113:71;:::i;:::-;6231:9;6225:4;6221:20;6216:2;6205:9;6201:18;6194:48;6259:78;6332:4;6323:6;6259:78;:::i;:::-;6251:86;;6347:72;6415:2;6404:9;6400:18;6391:6;6347:72;:::i;:::-;6466:9;6460:4;6456:20;6451:2;6440:9;6436:18;6429:48;6494:78;6567:4;6558:6;6494:78;:::i;:::-;6486:86;;6582:67;6644:3;6633:9;6629:19;6620:6;6582:67;:::i;:::-;6659:73;6727:3;6716:9;6712:19;6703:6;6659:73;:::i;:::-;6742;6810:3;6799:9;6795:19;6786:6;6742:73;:::i;:::-;5766:1056;;;;;;;;;;:::o;6828:118::-;6915:24;6933:5;6915:24;:::i;:::-;6910:3;6903:37;6828:118;;:::o;6952:222::-;7045:4;7083:2;7072:9;7068:18;7060:26;;7096:71;7164:1;7153:9;7149:17;7140:6;7096:71;:::i;:::-;6952:222;;;;:::o;7180:112::-;7266:1;7259:5;7256:12;7246:40;;7282:1;7279;7272:12;7246:40;7180:112;:::o;7298:165::-;7357:5;7395:6;7382:20;7373:29;;7411:46;7451:5;7411:46;:::i;:::-;7298:165;;;;:::o;7469:355::-;7541:6;7590:2;7578:9;7569:7;7565:23;7561:32;7558:119;;;7596:79;;:::i;:::-;7558:119;7716:1;7741:66;7799:7;7790:6;7779:9;7775:22;7741:66;:::i;:::-;7731:76;;7687:130;7469:355;;;;:::o;7830:313::-;7943:4;7981:2;7970:9;7966:18;7958:26;;8030:9;8024:4;8020:20;8016:1;8005:9;8001:17;7994:47;8058:78;8131:4;8122:6;8058:78;:::i;:::-;8050:86;;7830:313;;;;:::o;8149:86::-;8184:7;8224:4;8217:5;8213:16;8202:27;;8149:86;;;:::o;8241:112::-;8324:22;8340:5;8324:22;:::i;:::-;8319:3;8312:35;8241:112;;:::o;8359:214::-;8448:4;8486:2;8475:9;8471:18;8463:26;;8499:67;8563:1;8552:9;8548:17;8539:6;8499:67;:::i;:::-;8359:214;;;;:::o;8579:222::-;8672:4;8710:2;8699:9;8695:18;8687:26;;8723:71;8791:1;8780:9;8776:17;8767:6;8723:71;:::i;:::-;8579:222;;;;:::o;8807:117::-;8916:1;8913;8906:12;8930:117;9039:1;9036;9029:12;9053:117;9162:1;9159;9152:12;9189:552;9246:8;9256:6;9306:3;9299:4;9291:6;9287:17;9283:27;9273:122;;9314:79;;:::i;:::-;9273:122;9427:6;9414:20;9404:30;;9457:18;9449:6;9446:30;9443:117;;;9479:79;;:::i;:::-;9443:117;9593:4;9585:6;9581:17;9569:29;;9647:3;9639:4;9631:6;9627:17;9617:8;9613:32;9610:41;9607:128;;;9654:79;;:::i;:::-;9607:128;9189:552;;;;;:::o;9747:1109::-;9853:6;9861;9869;9877;9885;9893;9942:3;9930:9;9921:7;9917:23;9913:33;9910:120;;;9949:79;;:::i;:::-;9910:120;10069:1;10094:53;10139:7;10130:6;10119:9;10115:22;10094:53;:::i;:::-;10084:63;;10040:117;10196:2;10222:53;10267:7;10258:6;10247:9;10243:22;10222:53;:::i;:::-;10212:63;;10167:118;10324:2;10350:53;10395:7;10386:6;10375:9;10371:22;10350:53;:::i;:::-;10340:63;;10295:118;10452:2;10478:53;10523:7;10514:6;10503:9;10499:22;10478:53;:::i;:::-;10468:63;;10423:118;10608:3;10597:9;10593:19;10580:33;10640:18;10632:6;10629:30;10626:117;;;10662:79;;:::i;:::-;10626:117;10775:64;10831:7;10822:6;10811:9;10807:22;10775:64;:::i;:::-;10757:82;;;;10551:298;9747:1109;;;;;;;;:::o;10862:118::-;10948:1;10941:5;10938:12;10928:46;;10954:18;;:::i;:::-;10928:46;10862:118;:::o;10986:137::-;11036:7;11065:5;11054:16;;11071:46;11111:5;11071:46;:::i;:::-;10986:137;;;:::o;11129:::-;11190:9;11223:37;11254:5;11223:37;:::i;:::-;11210:50;;11129:137;;;:::o;11272:153::-;11370:48;11412:5;11370:48;:::i;:::-;11365:3;11358:61;11272:153;;:::o;11431:244::-;11535:4;11573:2;11562:9;11558:18;11550:26;;11586:82;11665:1;11654:9;11650:17;11641:6;11586:82;:::i;:::-;11431:244;;;;:::o;11681:645::-;11771:6;11779;11787;11836:2;11824:9;11815:7;11811:23;11807:32;11804:119;;;11842:79;;:::i;:::-;11804:119;11962:1;11987:53;12032:7;12023:6;12012:9;12008:22;11987:53;:::i;:::-;11977:63;;11933:117;12089:2;12115:53;12160:7;12151:6;12140:9;12136:22;12115:53;:::i;:::-;12105:63;;12060:118;12217:2;12243:66;12301:7;12292:6;12281:9;12277:22;12243:66;:::i;:::-;12233:76;;12188:131;11681:645;;;;;:::o;12332:60::-;12360:3;12381:5;12374:12;;12332:60;;;:::o;12398:142::-;12448:9;12481:53;12499:34;12508:24;12526:5;12508:24;:::i;:::-;12499:34;:::i;:::-;12481:53;:::i;:::-;12468:66;;12398:142;;;:::o;12546:126::-;12596:9;12629:37;12660:5;12629:37;:::i;:::-;12616:50;;12546:126;;;:::o;12678:141::-;12743:9;12776:37;12807:5;12776:37;:::i;:::-;12763:50;;12678:141;;;:::o;12825:161::-;12927:52;12973:5;12927:52;:::i;:::-;12922:3;12915:65;12825:161;;:::o;12992:252::-;13100:4;13138:2;13127:9;13123:18;13115:26;;13151:86;13234:1;13223:9;13219:17;13210:6;13151:86;:::i;:::-;12992:252;;;;:::o;13250:619::-;13327:6;13335;13343;13392:2;13380:9;13371:7;13367:23;13363:32;13360:119;;;13398:79;;:::i;:::-;13360:119;13518:1;13543:53;13588:7;13579:6;13568:9;13564:22;13543:53;:::i;:::-;13533:63;;13489:117;13645:2;13671:53;13716:7;13707:6;13696:9;13692:22;13671:53;:::i;:::-;13661:63;;13616:118;13773:2;13799:53;13844:7;13835:6;13824:9;13820:22;13799:53;:::i;:::-;13789:63;;13744:118;13250:619;;;;;:::o;13875:332::-;13996:4;14034:2;14023:9;14019:18;14011:26;;14047:71;14115:1;14104:9;14100:17;14091:6;14047:71;:::i;:::-;14128:72;14196:2;14185:9;14181:18;14172:6;14128:72;:::i;:::-;13875:332;;;;;:::o;14213:136::-;14302:6;14336:5;14330:12;14320:22;;14213:136;;;:::o;14355:206::-;14476:11;14510:6;14505:3;14498:19;14550:4;14545:3;14541:14;14526:29;;14355:206;;;;:::o;14567:154::-;14656:4;14679:3;14671:11;;14709:4;14704:3;14700:14;14692:22;;14567:154;;;:::o;14727:108::-;14804:24;14822:5;14804:24;:::i;:::-;14799:3;14792:37;14727:108;;:::o;14841:159::-;14915:11;14949:6;14944:3;14937:19;14989:4;14984:3;14980:14;14965:29;;14841:159;;;;:::o;15006:357::-;15084:3;15112:39;15145:5;15112:39;:::i;:::-;15167:61;15221:6;15216:3;15167:61;:::i;:::-;15160:68;;15237:65;15295:6;15290:3;15283:4;15276:5;15272:16;15237:65;:::i;:::-;15327:29;15349:6;15327:29;:::i;:::-;15322:3;15318:39;15311:46;;15088:275;15006:357;;;;:::o;15369:99::-;15440:21;15455:5;15440:21;:::i;:::-;15435:3;15428:34;15369:99;;:::o;15526:1553::-;15629:3;15665:4;15660:3;15656:14;15754:4;15747:5;15743:16;15737:23;15773:63;15830:4;15825:3;15821:14;15807:12;15773:63;:::i;:::-;15680:166;15931:4;15924:5;15920:16;15914:23;15984:3;15978:4;15974:14;15967:4;15962:3;15958:14;15951:38;16010:73;16078:4;16064:12;16010:73;:::i;:::-;16002:81;;15856:238;16185:4;16178:5;16174:16;16168:23;16204:63;16261:4;16256:3;16252:14;16238:12;16204:63;:::i;:::-;16104:173;16367:4;16360:5;16356:16;16350:23;16420:3;16414:4;16410:14;16403:4;16398:3;16394:14;16387:38;16446:73;16514:4;16500:12;16446:73;:::i;:::-;16438:81;;16287:243;16611:4;16604:5;16600:16;16594:23;16630:57;16681:4;16676:3;16672:14;16658:12;16630:57;:::i;:::-;16540:157;16781:4;16774:5;16770:16;16764:23;16800:63;16857:4;16852:3;16848:14;16834:12;16800:63;:::i;:::-;16707:166;16960:4;16953:5;16949:16;16943:23;16979:63;17036:4;17031:3;17027:14;17013:12;16979:63;:::i;:::-;16883:169;17069:4;17062:11;;15634:1445;15526:1553;;;;:::o;17085:244::-;17198:10;17233:90;17319:3;17311:6;17233:90;:::i;:::-;17219:104;;17085:244;;;;:::o;17335:135::-;17427:4;17459;17454:3;17450:14;17442:22;;17335:135;;;:::o;17532:1087::-;17695:3;17724:76;17794:5;17724:76;:::i;:::-;17816:108;17917:6;17912:3;17816:108;:::i;:::-;17809:115;;17950:3;17995:4;17987:6;17983:17;17978:3;17974:27;18025:78;18097:5;18025:78;:::i;:::-;18126:7;18157:1;18142:432;18167:6;18164:1;18161:13;18142:432;;;18238:9;18232:4;18228:20;18223:3;18216:33;18289:6;18283:13;18317:108;18420:4;18405:13;18317:108;:::i;:::-;18309:116;;18448:82;18523:6;18448:82;:::i;:::-;18438:92;;18559:4;18554:3;18550:14;18543:21;;18202:372;18189:1;18186;18182:9;18177:14;;18142:432;;;18146:14;18590:4;18583:11;;18610:3;18603:10;;17700:919;;;;;17532:1087;;;;:::o;18625:461::-;18812:4;18850:2;18839:9;18835:18;18827:26;;18899:9;18893:4;18889:20;18885:1;18874:9;18870:17;18863:47;18927:152;19074:4;19065:6;18927:152;:::i;:::-;18919:160;;18625:461;;;;:::o;19092:332::-;19213:4;19251:2;19240:9;19236:18;19228:26;;19264:71;19332:1;19321:9;19317:17;19308:6;19264:71;:::i;:::-;19345:72;19413:2;19402:9;19398:18;19389:6;19345:72;:::i;:::-;19092:332;;;;;:::o;19430:114::-;19497:6;19531:5;19525:12;19515:22;;19430:114;;;:::o;19550:184::-;19649:11;19683:6;19678:3;19671:19;19723:4;19718:3;19714:14;19699:29;;19550:184;;;;:::o;19740:132::-;19807:4;19830:3;19822:11;;19860:4;19855:3;19851:14;19843:22;;19740:132;;;:::o;19878:108::-;19955:24;19973:5;19955:24;:::i;:::-;19950:3;19943:37;19878:108;;:::o;19992:179::-;20061:10;20082:46;20124:3;20116:6;20082:46;:::i;:::-;20160:4;20155:3;20151:14;20137:28;;19992:179;;;;:::o;20177:113::-;20247:4;20279;20274:3;20270:14;20262:22;;20177:113;;;:::o;20326:732::-;20445:3;20474:54;20522:5;20474:54;:::i;:::-;20544:86;20623:6;20618:3;20544:86;:::i;:::-;20537:93;;20654:56;20704:5;20654:56;:::i;:::-;20733:7;20764:1;20749:284;20774:6;20771:1;20768:13;20749:284;;;20850:6;20844:13;20877:63;20936:3;20921:13;20877:63;:::i;:::-;20870:70;;20963:60;21016:6;20963:60;:::i;:::-;20953:70;;20809:224;20796:1;20793;20789:9;20784:14;;20749:284;;;20753:14;21049:3;21042:10;;20450:608;;;20326:732;;;;:::o;21064:114::-;21131:6;21165:5;21159:12;21149:22;;21064:114;;;:::o;21184:184::-;21283:11;21317:6;21312:3;21305:19;21357:4;21352:3;21348:14;21333:29;;21184:184;;;;:::o;21374:132::-;21441:4;21464:3;21456:11;;21494:4;21489:3;21485:14;21477:22;;21374:132;;;:::o;21512:179::-;21581:10;21602:46;21644:3;21636:6;21602:46;:::i;:::-;21680:4;21675:3;21671:14;21657:28;;21512:179;;;;:::o;21697:113::-;21767:4;21799;21794:3;21790:14;21782:22;;21697:113;;;:::o;21846:732::-;21965:3;21994:54;22042:5;21994:54;:::i;:::-;22064:86;22143:6;22138:3;22064:86;:::i;:::-;22057:93;;22174:56;22224:5;22174:56;:::i;:::-;22253:7;22284:1;22269:284;22294:6;22291:1;22288:13;22269:284;;;22370:6;22364:13;22397:63;22456:3;22441:13;22397:63;:::i;:::-;22390:70;;22483:60;22536:6;22483:60;:::i;:::-;22473:70;;22329:224;22316:1;22313;22309:9;22304:14;;22269:284;;;22273:14;22569:3;22562:10;;21970:608;;;21846:732;;;;:::o;22584:634::-;22805:4;22843:2;22832:9;22828:18;22820:26;;22892:9;22886:4;22882:20;22878:1;22867:9;22863:17;22856:47;22920:108;23023:4;23014:6;22920:108;:::i;:::-;22912:116;;23075:9;23069:4;23065:20;23060:2;23049:9;23045:18;23038:48;23103:108;23206:4;23197:6;23103:108;:::i;:::-;23095:116;;22584:634;;;;;:::o;23224:175::-;23364:27;23360:1;23352:6;23348:14;23341:51;23224:175;:::o;23405:366::-;23547:3;23568:67;23632:2;23627:3;23568:67;:::i;:::-;23561:74;;23644:93;23733:3;23644:93;:::i;:::-;23762:2;23757:3;23753:12;23746:19;;23405:366;;;:::o;23777:419::-;23943:4;23981:2;23970:9;23966:18;23958:26;;24030:9;24024:4;24020:20;24016:1;24005:9;24001:17;23994:47;24058:131;24184:4;24058:131;:::i;:::-;24050:139;;23777:419;;;:::o;24202:116::-;24272:21;24287:5;24272:21;:::i;:::-;24265:5;24262:32;24252:60;;24308:1;24305;24298:12;24252:60;24202:116;:::o;24324:137::-;24378:5;24409:6;24403:13;24394:22;;24425:30;24449:5;24425:30;:::i;:::-;24324:137;;;;:::o;24467:345::-;24534:6;24583:2;24571:9;24562:7;24558:23;24554:32;24551:119;;;24589:79;;:::i;:::-;24551:119;24709:1;24734:61;24787:7;24778:6;24767:9;24763:22;24734:61;:::i;:::-;24724:71;;24680:125;24467:345;;;;:::o;24818:442::-;24967:4;25005:2;24994:9;24990:18;24982:26;;25018:71;25086:1;25075:9;25071:17;25062:6;25018:71;:::i;:::-;25099:72;25167:2;25156:9;25152:18;25143:6;25099:72;:::i;:::-;25181;25249:2;25238:9;25234:18;25225:6;25181:72;:::i;:::-;24818:442;;;;;;:::o;25266:143::-;25323:5;25354:6;25348:13;25339:22;;25370:33;25397:5;25370:33;:::i;:::-;25266:143;;;;:::o;25415:351::-;25485:6;25534:2;25522:9;25513:7;25509:23;25505:32;25502:119;;;25540:79;;:::i;:::-;25502:119;25660:1;25685:64;25741:7;25732:6;25721:9;25717:22;25685:64;:::i;:::-;25675:74;;25631:128;25415:351;;;;:::o;25772:111::-;25857:1;25850:5;25847:12;25837:40;;25873:1;25870;25863:12;25837:40;25772:111;:::o;25889:167::-;25958:5;25989:6;25983:13;25974:22;;26005:45;26044:5;26005:45;:::i;:::-;25889:167;;;;:::o;26062:844::-;26171:6;26179;26187;26195;26244:3;26232:9;26223:7;26219:23;26215:33;26212:120;;;26251:79;;:::i;:::-;26212:120;26371:1;26396:64;26452:7;26443:6;26432:9;26428:22;26396:64;:::i;:::-;26386:74;;26342:128;26509:2;26535:64;26591:7;26582:6;26571:9;26567:22;26535:64;:::i;:::-;26525:74;;26480:129;26648:2;26674:64;26730:7;26721:6;26710:9;26706:22;26674:64;:::i;:::-;26664:74;;26619:129;26787:2;26813:76;26881:7;26872:6;26861:9;26857:22;26813:76;:::i;:::-;26803:86;;26758:141;26062:844;;;;;;;:::o;26912:180::-;26960:77;26957:1;26950:88;27057:4;27054:1;27047:15;27081:4;27078:1;27071:15;27098:320;27142:6;27179:1;27173:4;27169:12;27159:22;;27226:1;27220:4;27216:12;27247:18;27237:81;;27303:4;27295:6;27291:17;27281:27;;27237:81;27365:2;27357:6;27354:14;27334:18;27331:38;27328:84;;27384:18;;:::i;:::-;27328:84;27149:269;27098:320;;;:::o;27424:332::-;27545:4;27583:2;27572:9;27568:18;27560:26;;27596:71;27664:1;27653:9;27649:17;27640:6;27596:71;:::i;:::-;27677:72;27745:2;27734:9;27730:18;27721:6;27677:72;:::i;:::-;27424:332;;;;;:::o;27762:168::-;27845:11;27879:6;27874:3;27867:19;27919:4;27914:3;27910:14;27895:29;;27762:168;;;;:::o;27936:148::-;28034:6;28029:3;28024;28011:30;28075:1;28066:6;28061:3;28057:16;28050:27;27936:148;;;:::o;28112:314::-;28208:3;28229:70;28292:6;28287:3;28229:70;:::i;:::-;28222:77;;28309:56;28358:6;28353:3;28346:5;28309:56;:::i;:::-;28390:29;28412:6;28390:29;:::i;:::-;28385:3;28381:39;28374:46;;28112:314;;;;;:::o;28432:771::-;28665:4;28703:3;28692:9;28688:19;28680:27;;28717:71;28785:1;28774:9;28770:17;28761:6;28717:71;:::i;:::-;28798:72;28866:2;28855:9;28851:18;28842:6;28798:72;:::i;:::-;28880;28948:2;28937:9;28933:18;28924:6;28880:72;:::i;:::-;28962;29030:2;29019:9;29015:18;29006:6;28962:72;:::i;:::-;29082:9;29076:4;29072:20;29066:3;29055:9;29051:19;29044:49;29110:86;29191:4;29182:6;29174;29110:86;:::i;:::-;29102:94;;28432:771;;;;;;;;;:::o;29209:223::-;29349:34;29345:1;29337:6;29333:14;29326:58;29418:6;29413:2;29405:6;29401:15;29394:31;29209:223;:::o;29438:366::-;29580:3;29601:67;29665:2;29660:3;29601:67;:::i;:::-;29594:74;;29677:93;29766:3;29677:93;:::i;:::-;29795:2;29790:3;29786:12;29779:19;;29438:366;;;:::o;29810:419::-;29976:4;30014:2;30003:9;29999:18;29991:26;;30063:9;30057:4;30053:20;30049:1;30038:9;30034:17;30027:47;30091:131;30217:4;30091:131;:::i;:::-;30083:139;;29810:419;;;:::o;30235:79::-;30274:7;30303:5;30292:16;;30235:79;;;:::o;30320:157::-;30425:45;30445:24;30463:5;30445:24;:::i;:::-;30425:45;:::i;:::-;30420:3;30413:58;30320:157;;:::o;30483:94::-;30516:8;30564:5;30560:2;30556:14;30535:35;;30483:94;;;:::o;30583:::-;30622:7;30651:20;30665:5;30651:20;:::i;:::-;30640:31;;30583:94;;;:::o;30683:100::-;30722:7;30751:26;30771:5;30751:26;:::i;:::-;30740:37;;30683:100;;;:::o;30789:157::-;30894:45;30914:24;30932:5;30914:24;:::i;:::-;30894:45;:::i;:::-;30889:3;30882:58;30789:157;;:::o;30952:538::-;31120:3;31135:75;31206:3;31197:6;31135:75;:::i;:::-;31235:2;31230:3;31226:12;31219:19;;31248:75;31319:3;31310:6;31248:75;:::i;:::-;31348:2;31343:3;31339:12;31332:19;;31361:75;31432:3;31423:6;31361:75;:::i;:::-;31461:2;31456:3;31452:12;31445:19;;31481:3;31474:10;;30952:538;;;;;;:::o;31496:180::-;31544:77;31541:1;31534:88;31641:4;31638:1;31631:15;31665:4;31662:1;31655:15;31682:176;31714:1;31731:20;31749:1;31731:20;:::i;:::-;31726:25;;31765:20;31783:1;31765:20;:::i;:::-;31760:25;;31804:1;31794:35;;31809:18;;:::i;:::-;31794:35;31850:1;31847;31843:9;31838:14;;31682:176;;;;:::o;31864:180::-;31912:77;31909:1;31902:88;32009:4;32006:1;31999:15;32033:4;32030:1;32023:15;32050:180;32098:77;32095:1;32088:88;32195:4;32192:1;32185:15;32219:4;32216:1;32209:15;32236:410;32276:7;32299:20;32317:1;32299:20;:::i;:::-;32294:25;;32333:20;32351:1;32333:20;:::i;:::-;32328:25;;32388:1;32385;32381:9;32410:30;32428:11;32410:30;:::i;:::-;32399:41;;32589:1;32580:7;32576:15;32573:1;32570:22;32550:1;32543:9;32523:83;32500:139;;32619:18;;:::i;:::-;32500:139;32284:362;32236:410;;;;:::o;32652:191::-;32692:3;32711:20;32729:1;32711:20;:::i;:::-;32706:25;;32745:20;32763:1;32745:20;:::i;:::-;32740:25;;32788:1;32785;32781:9;32774:16;;32809:3;32806:1;32803:10;32800:36;;;32816:18;;:::i;:::-;32800:36;32652:191;;;;:::o;32849:233::-;32888:3;32911:24;32929:5;32911:24;:::i;:::-;32902:33;;32957:66;32950:5;32947:77;32944:103;;33027:18;;:::i;:::-;32944:103;33074:1;33067:5;33063:13;33056:20;;32849:233;;;:::o;33088:180::-;33136:77;33133:1;33126:88;33233:4;33230:1;33223:15;33257:4;33254:1;33247:15;33274:141;33323:4;33346:3;33338:11;;33369:3;33366:1;33359:14;33403:4;33400:1;33390:18;33382:26;;33274:141;;;:::o;33421:93::-;33458:6;33505:2;33500;33493:5;33489:14;33485:23;33475:33;;33421:93;;;:::o;33520:107::-;33564:8;33614:5;33608:4;33604:16;33583:37;;33520:107;;;;:::o;33633:393::-;33702:6;33752:1;33740:10;33736:18;33775:97;33805:66;33794:9;33775:97;:::i;:::-;33893:39;33923:8;33912:9;33893:39;:::i;:::-;33881:51;;33965:4;33961:9;33954:5;33950:21;33941:30;;34014:4;34004:8;34000:19;33993:5;33990:30;33980:40;;33709:317;;33633:393;;;;;:::o;34032:142::-;34082:9;34115:53;34133:34;34142:24;34160:5;34142:24;:::i;:::-;34133:34;:::i;:::-;34115:53;:::i;:::-;34102:66;;34032:142;;;:::o;34180:75::-;34223:3;34244:5;34237:12;;34180:75;;;:::o;34261:269::-;34371:39;34402:7;34371:39;:::i;:::-;34432:91;34481:41;34505:16;34481:41;:::i;:::-;34473:6;34466:4;34460:11;34432:91;:::i;:::-;34426:4;34419:105;34337:193;34261:269;;;:::o;34536:73::-;34581:3;34536:73;:::o;34615:189::-;34692:32;;:::i;:::-;34733:65;34791:6;34783;34777:4;34733:65;:::i;:::-;34668:136;34615:189;;:::o;34810:186::-;34870:120;34887:3;34880:5;34877:14;34870:120;;;34941:39;34978:1;34971:5;34941:39;:::i;:::-;34914:1;34907:5;34903:13;34894:22;;34870:120;;;34810:186;;:::o;35002:543::-;35103:2;35098:3;35095:11;35092:446;;;35137:38;35169:5;35137:38;:::i;:::-;35221:29;35239:10;35221:29;:::i;:::-;35211:8;35207:44;35404:2;35392:10;35389:18;35386:49;;;35425:8;35410:23;;35386:49;35448:80;35504:22;35522:3;35504:22;:::i;:::-;35494:8;35490:37;35477:11;35448:80;:::i;:::-;35107:431;;35092:446;35002:543;;;:::o;35551:117::-;35605:8;35655:5;35649:4;35645:16;35624:37;;35551:117;;;;:::o;35674:169::-;35718:6;35751:51;35799:1;35795:6;35787:5;35784:1;35780:13;35751:51;:::i;:::-;35747:56;35832:4;35826;35822:15;35812:25;;35725:118;35674:169;;;;:::o;35848:295::-;35924:4;36070:29;36095:3;36089:4;36070:29;:::i;:::-;36062:37;;36132:3;36129:1;36125:11;36119:4;36116:21;36108:29;;35848:295;;;;:::o;36148:1395::-;36265:37;36298:3;36265:37;:::i;:::-;36367:18;36359:6;36356:30;36353:56;;;36389:18;;:::i;:::-;36353:56;36433:38;36465:4;36459:11;36433:38;:::i;:::-;36518:67;36578:6;36570;36564:4;36518:67;:::i;:::-;36612:1;36636:4;36623:17;;36668:2;36660:6;36657:14;36685:1;36680:618;;;;37342:1;37359:6;37356:77;;;37408:9;37403:3;37399:19;37393:26;37384:35;;37356:77;37459:67;37519:6;37512:5;37459:67;:::i;:::-;37453:4;37446:81;37315:222;36650:887;;36680:618;36732:4;36728:9;36720:6;36716:22;36766:37;36798:4;36766:37;:::i;:::-;36825:1;36839:208;36853:7;36850:1;36847:14;36839:208;;;36932:9;36927:3;36923:19;36917:26;36909:6;36902:42;36983:1;36975:6;36971:14;36961:24;;37030:2;37019:9;37015:18;37002:31;;36876:4;36873:1;36869:12;36864:17;;36839:208;;;37075:6;37066:7;37063:19;37060:179;;;37133:9;37128:3;37124:19;37118:26;37176:48;37218:4;37210:6;37206:17;37195:9;37176:48;:::i;:::-;37168:6;37161:64;37083:156;37060:179;37285:1;37281;37273:6;37269:14;37265:22;37259:4;37252:36;36687:611;;;36650:887;;36240:1303;;;36148:1395;;:::o;37549:423::-;37690:4;37728:2;37717:9;37713:18;37705:26;;37741:71;37809:1;37798:9;37794:17;37785:6;37741:71;:::i;:::-;37859:9;37853:4;37849:20;37844:2;37833:9;37829:18;37822:48;37887:78;37960:4;37951:6;37887:78;:::i;:::-;37879:86;;37549:423;;;;;:::o;37978:521::-;38141:4;38179:2;38168:9;38164:18;38156:26;;38192:65;38254:1;38243:9;38239:17;38230:6;38192:65;:::i;:::-;38267:72;38335:2;38324:9;38320:18;38311:6;38267:72;:::i;:::-;38386:9;38380:4;38376:20;38371:2;38360:9;38356:18;38349:48;38414:78;38487:4;38478:6;38414:78;:::i;:::-;38406:86;;37978:521;;;;;;:::o;38505:553::-;38682:4;38720:3;38709:9;38705:19;38697:27;;38734:71;38802:1;38791:9;38787:17;38778:6;38734:71;:::i;:::-;38815:72;38883:2;38872:9;38868:18;38859:6;38815:72;:::i;:::-;38897;38965:2;38954:9;38950:18;38941:6;38897:72;:::i;:::-;38979;39047:2;39036:9;39032:18;39023:6;38979:72;:::i;:::-;38505:553;;;;;;;:::o;39064:180::-;39204:32;39200:1;39192:6;39188:14;39181:56;39064:180;:::o;39250:366::-;39392:3;39413:67;39477:2;39472:3;39413:67;:::i;:::-;39406:74;;39489:93;39578:3;39489:93;:::i;:::-;39607:2;39602:3;39598:12;39591:19;;39250:366;;;:::o;39622:419::-;39788:4;39826:2;39815:9;39811:18;39803:26;;39875:9;39869:4;39865:20;39861:1;39850:9;39846:17;39839:47;39903:131;40029:4;39903:131;:::i;:::-;39895:139;;39622:419;;;:::o;40047:166::-;40187:18;40183:1;40175:6;40171:14;40164:42;40047:166;:::o;40219:366::-;40361:3;40382:67;40446:2;40441:3;40382:67;:::i;:::-;40375:74;;40458:93;40547:3;40458:93;:::i;:::-;40576:2;40571:3;40567:12;40560:19;;40219:366;;;:::o;40591:419::-;40757:4;40795:2;40784:9;40780:18;40772:26;;40844:9;40838:4;40834:20;40830:1;40819:9;40815:17;40808:47;40872:131;40998:4;40872:131;:::i;:::-;40864:139;;40591:419;;;:::o;41016:194::-;41056:4;41076:20;41094:1;41076:20;:::i;:::-;41071:25;;41110:20;41128:1;41110:20;:::i;:::-;41105:25;;41154:1;41151;41147:9;41139:17;;41178:1;41172:4;41169:11;41166:37;;;41183:18;;:::i;:::-;41166:37;41016:194;;;;:::o;41216:171::-;41255:3;41278:24;41296:5;41278:24;:::i;:::-;41269:33;;41324:4;41317:5;41314:15;41311:41;;41332:18;;:::i;:::-;41311:41;41379:1;41372:5;41368:13;41361:20;;41216:171;;;:::o;41393:118::-;41464:22;41480:5;41464:22;:::i;:::-;41457:5;41454:33;41444:61;;41501:1;41498;41491:12;41444:61;41393:118;:::o;41517:139::-;41572:5;41603:6;41597:13;41588:22;;41619:31;41644:5;41619:31;:::i;:::-;41517:139;;;;:::o;41662:347::-;41730:6;41779:2;41767:9;41758:7;41754:23;41750:32;41747:119;;;41785:79;;:::i;:::-;41747:119;41905:1;41930:62;41984:7;41975:6;41964:9;41960:22;41930:62;:::i;:::-;41920:72;;41876:126;41662:347;;;;:::o;42015:181::-;42155:33;42151:1;42143:6;42139:14;42132:57;42015:181;:::o;42202:366::-;42344:3;42365:67;42429:2;42424:3;42365:67;:::i;:::-;42358:74;;42441:93;42530:3;42441:93;:::i;:::-;42559:2;42554:3;42550:12;42543:19;;42202:366;;;:::o;42574:419::-;42740:4;42778:2;42767:9;42763:18;42755:26;;42827:9;42821:4;42817:20;42813:1;42802:9;42798:17;42791:47;42855:131;42981:4;42855:131;:::i;:::-;42847:139;;42574:419;;;:::o;42999:98::-;43050:6;43084:5;43078:12;43068:22;;42999:98;;;:::o;43103:147::-;43204:11;43241:3;43226:18;;43103:147;;;;:::o;43256:386::-;43360:3;43388:38;43420:5;43388:38;:::i;:::-;43442:88;43523:6;43518:3;43442:88;:::i;:::-;43435:95;;43539:65;43597:6;43592:3;43585:4;43578:5;43574:16;43539:65;:::i;:::-;43629:6;43624:3;43620:16;43613:23;;43364:278;43256:386;;;;:::o;43648:271::-;43778:3;43800:93;43889:3;43880:6;43800:93;:::i;:::-;43793:100;;43910:3;43903:10;;43648:271;;;;:::o
Swarm Source
ipfs://12a1c4ca3ba775f75954b78bb604ff0a9966ec1d3bd18abd45dc85d2d005b965
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.26
Net Worth in ETH
0.00009
Token Allocations
WETH
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| BLAST | 100.00% | $2,938.16 | 0.00009 | $0.2644 |
Loading...
Loading
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.