Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 160 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Stake | 24782860 | 8 mins ago | IN | 0 ETH | 0.0000676 | ||||
| Stake | 24782830 | 14 mins ago | IN | 0 ETH | 0.00106047 | ||||
| Stake | 24782607 | 1 hr ago | IN | 0 ETH | 0.00001967 | ||||
| Stake | 24782282 | 2 hrs ago | IN | 0 ETH | 0.00002809 | ||||
| Stake | 24782245 | 2 hrs ago | IN | 0 ETH | 0.00038818 | ||||
| Stake | 24782118 | 2 hrs ago | IN | 0 ETH | 0.00024181 | ||||
| Stake | 24781678 | 4 hrs ago | IN | 0 ETH | 0.00077601 | ||||
| Stake | 24781259 | 5 hrs ago | IN | 0 ETH | 0.00063836 | ||||
| Stake | 24780944 | 6 hrs ago | IN | 0 ETH | 0.00004267 | ||||
| Stake | 24780723 | 7 hrs ago | IN | 0 ETH | 0.00004737 | ||||
| Stake | 24780075 | 9 hrs ago | IN | 0 ETH | 0.0002 | ||||
| Stake | 24780065 | 9 hrs ago | IN | 0 ETH | 0.00014315 | ||||
| Stake | 24779125 | 12 hrs ago | IN | 0 ETH | 0.00038127 | ||||
| Stake | 24779046 | 12 hrs ago | IN | 0 ETH | 0.00236022 | ||||
| Stake | 24778744 | 13 hrs ago | IN | 0 ETH | 0.0001792 | ||||
| Stake | 24778653 | 14 hrs ago | IN | 0 ETH | 0.00090144 | ||||
| Stake | 24778641 | 14 hrs ago | IN | 0 ETH | 0.00198734 | ||||
| Stake | 24778584 | 14 hrs ago | IN | 0 ETH | 0.00010659 | ||||
| Stake | 24778564 | 14 hrs ago | IN | 0 ETH | 0.00114711 | ||||
| Stake | 24778538 | 14 hrs ago | IN | 0 ETH | 0.00008123 | ||||
| Stake | 24778336 | 15 hrs ago | IN | 0 ETH | 0.00036063 | ||||
| Stake | 24778322 | 15 hrs ago | IN | 0 ETH | 0.00049284 | ||||
| Stake | 24778296 | 15 hrs ago | IN | 0 ETH | 0.00018329 | ||||
| Stake | 24778291 | 15 hrs ago | IN | 0 ETH | 0.00002533 | ||||
| Stake | 24778290 | 15 hrs ago | IN | 0 ETH | 0.00013688 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
CuboidsStaking
Compiler Version
v0.8.34+commit.80d5c536
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2026-03-28
*/
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* 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[ERC 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.4.0) (token/ERC721/IERC721.sol)
pragma solidity >=0.6.2;
/**
* @dev Required interface of an ERC-721 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 ERC-721 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 ERC-721
* 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/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity >=0.5.0;
/**
* @title ERC-721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC-721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be
* reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/utils/StorageSlot.sol
// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
pragma solidity ^0.8.20;
/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC-1967 implementation slot:
* ```solidity
* contract ERC1967 {
* // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(newImplementation.code.length > 0);
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*
* TIP: Consider using this library along with {SlotDerivation}.
*/
library StorageSlot {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
bytes32 value;
}
struct Uint256Slot {
uint256 value;
}
struct Int256Slot {
int256 value;
}
struct StringSlot {
string value;
}
struct BytesSlot {
bytes value;
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/
function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
assembly ("memory-safe") {
r.slot := slot
}
}
/**
* @dev Returns a `BooleanSlot` with member `value` located at `slot`.
*/
function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
assembly ("memory-safe") {
r.slot := slot
}
}
/**
* @dev Returns a `Bytes32Slot` with member `value` located at `slot`.
*/
function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
assembly ("memory-safe") {
r.slot := slot
}
}
/**
* @dev Returns a `Uint256Slot` with member `value` located at `slot`.
*/
function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
assembly ("memory-safe") {
r.slot := slot
}
}
/**
* @dev Returns a `Int256Slot` with member `value` located at `slot`.
*/
function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {
assembly ("memory-safe") {
r.slot := slot
}
}
/**
* @dev Returns a `StringSlot` with member `value` located at `slot`.
*/
function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
assembly ("memory-safe") {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` representation of the string storage pointer `store`.
*/
function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
assembly ("memory-safe") {
r.slot := store.slot
}
}
/**
* @dev Returns a `BytesSlot` with member `value` located at `slot`.
*/
function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
assembly ("memory-safe") {
r.slot := slot
}
}
/**
* @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
*/
function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
assembly ("memory-safe") {
r.slot := store.slot
}
}
}
// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v5.5.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @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 EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* 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].
*
* IMPORTANT: Deprecated. This storage-based reentrancy guard will be removed and replaced
* by the {ReentrancyGuardTransient} variant in v6.0.
*
* @custom:stateless
*/
abstract contract ReentrancyGuard {
using StorageSlot for bytes32;
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant REENTRANCY_GUARD_STORAGE =
0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;
// 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;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_reentrancyGuardStorageSlot().getUint256Slot().value = 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();
}
/**
* @dev A `view` only version of {nonReentrant}. Use to block view functions
* from being called, preventing reading from inconsistent contract state.
*
* CAUTION: This is a "view" modifier and does not change the reentrancy
* status. Use it only on view functions. For payable or non-payable functions,
* use the standard {nonReentrant} modifier instead.
*/
modifier nonReentrantView() {
_nonReentrantBeforeView();
_;
}
function _nonReentrantBeforeView() private view {
if (_reentrancyGuardEntered()) {
revert ReentrancyGuardReentrantCall();
}
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
_nonReentrantBeforeView();
// Any calls to nonReentrant after this point will fail
_reentrancyGuardStorageSlot().getUint256Slot().value = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_reentrancyGuardStorageSlot().getUint256Slot().value = 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 _reentrancyGuardStorageSlot().getUint256Slot().value == ENTERED;
}
function _reentrancyGuardStorageSlot() internal pure virtual returns (bytes32) {
return REENTRANCY_GUARD_STORAGE;
}
}
// 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/utils/Pausable.sol
// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)
pragma solidity ^0.8.20;
/**
* @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 {
bool private _paused;
/**
* @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);
/**
* @dev The operation failed because the contract is paused.
*/
error EnforcedPause();
/**
* @dev The operation failed because the contract is not paused.
*/
error ExpectedPause();
/**
* @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 {
if (paused()) {
revert EnforcedPause();
}
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
if (!paused()) {
revert ExpectedPause();
}
}
/**
* @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/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: contracts/stakingv2.sol
pragma solidity ^0.8.20;
/**
* @title CuboidsStaking v2
* @author Cuboids Team
* @notice Hard-lock staking with rarity boost multipliers + on-chain points.
*
* ═══════════════════════════════════════════════════════════════
* STAKING & BOOST
* ═══════════════════════════════════════════════════════════════
*
* Holders stake Cuboids → NFTs lock in this contract.
* Longer staking = higher rarity boost for V2 evolution:
*
* Days Staked Boost Tier
* ────────── ───── ────────
* 0 (none) 1.00x None
* 7+ 1.25x Bronze
* 30+ 1.50x Silver
* 60+ 1.75x Gold
* 90+ 2.00x Diamond
*
* 1/1 tokens get +0.50x bonus on top.
* Time is cumulative across unstake/re-stake cycles.
*
* ═══════════════════════════════════════════════════════════════
* POINTS SYSTEM
* ═══════════════════════════════════════════════════════════════
*
* - Every staked Cuboid earns 10 points per day.
* - 1/1 tokens (IDs: 192, 1242, 1343, 1433, 1503, 1537) earn 2x (20/day).
* - Points are non-transferable and tracked per wallet.
* - Points accumulate automatically — no claiming needed.
* - Points can be spent by:
* • The holder themselves (selfSpendPoints)
* • Owner-authorized contracts (spendPoints) — e.g. key mint contract
* - Points persist after unstaking (earned points are never lost).
*
* ═══════════════════════════════════════════════════════════════
* SNAPSHOT
* ═══════════════════════════════════════════════════════════════
*
* Owner calls snapshot() before key mint to freeze boosts.
* After snapshot, holders can unstake without losing recorded boost.
*
* ═══════════════════════════════════════════════════════════════
* DEPLOYMENT CHECKLIST
* ═══════════════════════════════════════════════════════════════
*
* 1. Deploy with constructor arg: NFT contract address
* 2. Add staking contract to Transfer Validator list #43:
* addAccountsToList(43, 1, [thisContractAddress])
* 3. Test stake/unstake with one token
* 4. Later: addAuthorizedSpender(keyMintContractAddress)
*/
contract CuboidsStaking is IERC721Receiver, ReentrancyGuard, Pausable, Ownable {
// ═══════════════════════════════════════════════════════════
// CONSTANTS
// ═══════════════════════════════════════════════════════════
IERC721 public immutable cuboidsNFT;
/// @notice Rarity boost tiers in basis points (10000 = 1.00x)
uint256 public constant BOOST_BASE = 10000; // 1.00x
uint256 public constant BOOST_TIER_1 = 12500; // 1.25x — 7+ days
uint256 public constant BOOST_TIER_2 = 15000; // 1.50x — 30+ days
uint256 public constant BOOST_TIER_3 = 17500; // 1.75x — 60+ days
uint256 public constant BOOST_TIER_4 = 20000; // 2.00x — 90+ days
uint256 public constant BONUS_ONE_OF_ONE = 5000; // +0.50x for 1/1 tokens
uint256 public constant TIER_1_DAYS = 7 days;
uint256 public constant TIER_2_DAYS = 30 days;
uint256 public constant TIER_3_DAYS = 60 days;
uint256 public constant TIER_4_DAYS = 90 days;
/// @notice Points earned per day per staked token (in wei-like precision: 18 decimals)
/// 10 points/day = 10e18 per 86400 seconds = 115740740740740 per second
uint256 public constant POINTS_PER_SEC = 115740740740740; // ~10 points/day
uint256 public constant POINTS_PER_SEC_1OF1 = 231481481481481; // ~20 points/day (2x)
uint256 public constant POINTS_DECIMALS = 1e18;
// ═══════════════════════════════════════════════════════════
// STATE — STAKING
// ═══════════════════════════════════════════════════════════
struct StakeInfo {
address owner; // Who staked this token
uint128 stakedAt; // Timestamp when current session began
uint128 accumulatedTime; // Total seconds from previous sessions
bool isStaked; // Currently staked?
}
/// @dev tokenId => StakeInfo
mapping(uint256 => StakeInfo) public stakes;
/// @dev address => list of currently staked token IDs
mapping(address => uint256[]) private _stakedTokens;
/// @dev tokenId => index in _stakedTokens array
mapping(uint256 => uint256) private _stakedTokenIndex;
/// @dev 1/1 token lookup
mapping(uint256 => bool) public isOneOfOne;
/// @notice Total NFTs currently staked
uint256 public totalStaked;
// ═══════════════════════════════════════════════════════════
// STATE — POINTS
// ═══════════════════════════════════════════════════════════
/// @dev Credited points balance per user (points already "banked")
mapping(address => uint256) public creditedPoints;
/// @dev Last time pending points were credited for each token
mapping(uint256 => uint256) public lastPointsCreditAt;
/// @dev Total points spent per user (lifetime)
mapping(address => uint256) public totalSpent;
/// @dev Authorized contracts that can spend points on behalf of holders
mapping(address => bool) public authorizedSpenders;
// ═══════════════════════════════════════════════════════════
// STATE — SNAPSHOT
// ═══════════════════════════════════════════════════════════
struct Snapshot {
uint128 timestamp;
bool exists;
}
mapping(uint256 => Snapshot) public snapshots;
mapping(uint256 => mapping(uint256 => uint256)) public snapshotBoosts;
mapping(uint256 => mapping(uint256 => uint256)) public snapshotPoints;
uint256 public snapshotCount;
// ═══════════════════════════════════════════════════════════
// EVENTS
// ═══════════════════════════════════════════════════════════
event Staked(address indexed user, uint256[] tokenIds, uint256 timestamp);
event Unstaked(address indexed user, uint256[] tokenIds, uint256 timestamp);
event PointsCredited(address indexed user, uint256 amount);
event PointsSpent(address indexed user, uint256 amount, address indexed spender);
event SpenderAuthorized(address indexed spender, bool authorized);
event SnapshotTaken(uint256 indexed snapshotId, uint256 timestamp);
event EmergencyUnstaked(uint256 indexed tokenId, address indexed to);
// ═══════════════════════════════════════════════════════════
// CONSTRUCTOR
// ═══════════════════════════════════════════════════════════
constructor(address nftAddress_) Ownable(msg.sender) {
require(nftAddress_ != address(0), "Zero address");
cuboidsNFT = IERC721(nftAddress_);
// Register 1/1 tokens
isOneOfOne[192] = true;
isOneOfOne[1242] = true;
isOneOfOne[1343] = true;
isOneOfOne[1433] = true;
isOneOfOne[1503] = true;
isOneOfOne[1537] = true;
}
// ═══════════════════════════════════════════════════════════
// STAKING
// ═══════════════════════════════════════════════════════════
/**
* @notice Stake one or more Cuboids. NFTs transfer into this contract.
* @param tokenIds Array of token IDs to stake. Max 50 per tx.
*/
function stake(uint256[] calldata tokenIds) external nonReentrant whenNotPaused {
uint256 length = tokenIds.length;
require(length > 0, "Empty array");
require(length <= 50, "Max 50 per transaction");
for (uint256 i = 0; i < length; ) {
uint256 tokenId = tokenIds[i];
require(cuboidsNFT.ownerOf(tokenId) == msg.sender, "Not token owner");
StakeInfo storage info = stakes[tokenId];
require(!info.isStaked, "Already staked");
// Update state BEFORE external call
info.owner = msg.sender;
info.stakedAt = uint128(block.timestamp);
info.isStaked = true;
// Start points clock for this token
lastPointsCreditAt[tokenId] = block.timestamp;
// Track in user's staked list
_stakedTokenIndex[tokenId] = _stakedTokens[msg.sender].length;
_stakedTokens[msg.sender].push(tokenId);
totalStaked++;
// Transfer NFT into this contract
cuboidsNFT.transferFrom(msg.sender, address(this), tokenId);
unchecked { ++i; }
}
emit Staked(msg.sender, tokenIds, block.timestamp);
}
/**
* @notice Unstake one or more Cuboids. NFTs return to staker.
* All pending points are automatically credited before unstaking.
* @param tokenIds Array of token IDs to unstake. Max 50 per tx.
*/
function unstake(uint256[] calldata tokenIds) external nonReentrant whenNotPaused {
uint256 length = tokenIds.length;
require(length > 0, "Empty array");
require(length <= 50, "Max 50 per transaction");
for (uint256 i = 0; i < length; ) {
uint256 tokenId = tokenIds[i];
StakeInfo storage info = stakes[tokenId];
require(info.isStaked, "Not staked");
require(info.owner == msg.sender, "Not your token");
// Credit pending points BEFORE unstaking
_creditTokenPoints(tokenId, msg.sender);
// Accumulate boost time
uint128 sessionTime = uint128(block.timestamp) - info.stakedAt;
info.accumulatedTime += sessionTime;
info.isStaked = false;
info.stakedAt = 0;
// Remove from staked list
_removeFromStakedList(msg.sender, tokenId);
totalStaked--;
// Transfer NFT back
cuboidsNFT.transferFrom(address(this), msg.sender, tokenId);
unchecked { ++i; }
}
emit Unstaked(msg.sender, tokenIds, block.timestamp);
}
// ═══════════════════════════════════════════════════════════
// POINTS — EARNING
// ═══════════════════════════════════════════════════════════
/**
* @notice Get pending (uncredited) points for a single token.
* @param tokenId The token to query.
* @return Pending points (18 decimal precision).
*/
function pendingTokenPoints(uint256 tokenId) public view returns (uint256) {
StakeInfo memory info = stakes[tokenId];
if (!info.isStaked) return 0;
uint256 elapsed = block.timestamp - lastPointsCreditAt[tokenId];
uint256 rate = isOneOfOne[tokenId] ? POINTS_PER_SEC_1OF1 : POINTS_PER_SEC;
return elapsed * rate;
}
/**
* @notice Get total pending points for all of a user's staked tokens.
* @param user The address to query.
* @return Total pending points (18 decimal precision).
*/
function pendingPoints(address user) public view returns (uint256) {
uint256[] memory tokens = _stakedTokens[user];
uint256 total = 0;
for (uint256 i = 0; i < tokens.length; ) {
total += pendingTokenPoints(tokens[i]);
unchecked { ++i; }
}
return total;
}
/**
* @notice Get total points for a user (credited + pending).
* @dev This is the "real" balance used for spending.
* @param user The address to query.
* @return Total points (18 decimal precision).
*/
function getTotalPoints(address user) public view returns (uint256) {
return creditedPoints[user] + pendingPoints(user);
}
/**
* @notice Get points as a human-readable number (no decimals).
* @param user The address to query.
* @return Points as a whole number (e.g., 150 = 150 points).
*/
function getPointsDisplay(address user) external view returns (uint256) {
return getTotalPoints(user) / POINTS_DECIMALS;
}
/**
* @notice Get detailed points breakdown for a user.
* @param user The address to query.
* @return credited Already banked points (display units).
* @return pending Currently earning, not yet banked (display units).
* @return total credited + pending (display units).
* @return spent Total points spent lifetime (display units).
* @return stakedCount Number of tokens currently staked.
* @return dailyRate Points earned per day at current stake (display units).
*/
function getPointsInfo(address user) external view returns (
uint256 credited,
uint256 pending,
uint256 total,
uint256 spent,
uint256 stakedCount,
uint256 dailyRate
) {
uint256 rawCredited = creditedPoints[user];
uint256 rawPending = pendingPoints(user);
credited = rawCredited / POINTS_DECIMALS;
pending = rawPending / POINTS_DECIMALS;
total = (rawCredited + rawPending) / POINTS_DECIMALS;
spent = totalSpent[user] / POINTS_DECIMALS;
stakedCount = _stakedTokens[user].length;
// Calculate daily rate
uint256[] memory tokens = _stakedTokens[user];
uint256 rawDaily = 0;
for (uint256 i = 0; i < tokens.length; ) {
rawDaily += isOneOfOne[tokens[i]]
? POINTS_PER_SEC_1OF1 * 86400
: POINTS_PER_SEC * 86400;
unchecked { ++i; }
}
dailyRate = rawDaily / POINTS_DECIMALS;
}
/**
* @notice Credit all pending points for the caller's staked tokens.
* @dev This is optional — points are auto-credited on unstake.
* Useful if a user wants to "bank" points without unstaking.
*/
function claimPoints() external nonReentrant whenNotPaused {
uint256[] memory tokens = _stakedTokens[msg.sender];
require(tokens.length > 0, "No staked tokens");
uint256 totalCredited = 0;
for (uint256 i = 0; i < tokens.length; ) {
totalCredited += _creditTokenPoints(tokens[i], msg.sender);
unchecked { ++i; }
}
if (totalCredited > 0) {
emit PointsCredited(msg.sender, totalCredited);
}
}
/**
* @dev Credit pending points for a single token to its owner.
* @return The amount of points credited.
*/
function _creditTokenPoints(uint256 tokenId, address owner_) internal returns (uint256) {
uint256 pending = pendingTokenPoints(tokenId);
if (pending > 0) {
creditedPoints[owner_] += pending;
lastPointsCreditAt[tokenId] = block.timestamp;
}
return pending;
}
// ═══════════════════════════════════════════════════════════
// POINTS — SPENDING
// ═══════════════════════════════════════════════════════════
/**
* @notice Spend your own points. Used for future redemptions.
* @param amount Points to spend (display units, e.g., 100 = 100 points).
*/
function selfSpendPoints(uint256 amount) external nonReentrant whenNotPaused {
uint256 rawAmount = amount * POINTS_DECIMALS;
_deductPoints(msg.sender, rawAmount);
totalSpent[msg.sender] += rawAmount;
emit PointsSpent(msg.sender, rawAmount, msg.sender);
}
/**
* @notice Authorized spender deducts points from a holder.
* @dev Only callable by contracts added via addAuthorizedSpender().
* Used by key mint contract, future drops, etc.
* @param user The holder whose points to deduct.
* @param amount Points to spend (display units, e.g., 100 = 100 points).
*/
function spendPoints(address user, uint256 amount) external nonReentrant {
require(authorizedSpenders[msg.sender], "Not authorized spender");
uint256 rawAmount = amount * POINTS_DECIMALS;
_deductPoints(user, rawAmount);
totalSpent[user] += rawAmount;
emit PointsSpent(user, rawAmount, msg.sender);
}
/**
* @dev Internal: deduct points from a user. Credits pending first.
* Reverts if insufficient balance.
*/
function _deductPoints(address user, uint256 rawAmount) internal {
// First, credit all pending points to ensure accurate balance
uint256[] memory tokens = _stakedTokens[user];
for (uint256 i = 0; i < tokens.length; ) {
_creditTokenPoints(tokens[i], user);
unchecked { ++i; }
}
require(creditedPoints[user] >= rawAmount, "Insufficient points");
creditedPoints[user] -= rawAmount;
}
// ═══════════════════════════════════════════════════════════
// AUTHORIZED SPENDERS
// ═══════════════════════════════════════════════════════════
/**
* @notice Add or remove an authorized points spender.
* @dev Use this to authorize the key mint contract, future drops, etc.
* @param spender The contract address to authorize.
* @param authorized True to authorize, false to revoke.
*/
function setAuthorizedSpender(address spender, bool authorized) external onlyOwner {
require(spender != address(0), "Zero address");
authorizedSpenders[spender] = authorized;
emit SpenderAuthorized(spender, authorized);
}
// ═══════════════════════════════════════════════════════════
// BOOST CALCULATION
// ═══════════════════════════════════════════════════════════
/**
* @notice Get total staking duration for a token (cumulative).
*/
function getTotalStakeTime(uint256 tokenId) public view returns (uint256) {
StakeInfo memory info = stakes[tokenId];
uint256 total = info.accumulatedTime;
if (info.isStaked) {
total += block.timestamp - info.stakedAt;
}
return total;
}
/**
* @notice Get rarity boost for a token in basis points.
*/
function getBoost(uint256 tokenId) public view returns (uint256) {
uint256 totalTime = getTotalStakeTime(tokenId);
uint256 boost = _calculateBoostFromTime(totalTime);
if (isOneOfOne[tokenId]) {
boost += BONUS_ONE_OF_ONE;
}
return boost;
}
/**
* @notice Get full boost info for display.
*/
function getBoostInfo(uint256 tokenId) external view returns (
uint8 tier,
uint256 boost,
uint256 totalDays,
bool is1of1
) {
uint256 totalTime = getTotalStakeTime(tokenId);
totalDays = totalTime / 1 days;
boost = getBoost(tokenId);
is1of1 = isOneOfOne[tokenId];
if (totalTime >= TIER_4_DAYS) tier = 4; // Diamond
else if (totalTime >= TIER_3_DAYS) tier = 3; // Gold
else if (totalTime >= TIER_2_DAYS) tier = 2; // Silver
else if (totalTime >= TIER_1_DAYS) tier = 1; // Bronze
else tier = 0; // None
}
function _calculateBoostFromTime(uint256 totalTime) internal pure returns (uint256) {
if (totalTime >= TIER_4_DAYS) return BOOST_TIER_4;
if (totalTime >= TIER_3_DAYS) return BOOST_TIER_3;
if (totalTime >= TIER_2_DAYS) return BOOST_TIER_2;
if (totalTime >= TIER_1_DAYS) return BOOST_TIER_1;
return BOOST_BASE;
}
// ═══════════════════════════════════════════════════════════
// SNAPSHOT
// ═══════════════════════════════════════════════════════════
/**
* @notice Snapshot boosts AND points for all specified tokens.
* @param tokenIds All staked token IDs to snapshot.
*/
function snapshot(uint256[] calldata tokenIds) external onlyOwner {
uint256 snapId = snapshotCount;
snapshotCount++;
snapshots[snapId] = Snapshot({
timestamp: uint128(block.timestamp),
exists: true
});
for (uint256 i = 0; i < tokenIds.length; ) {
uint256 tokenId = tokenIds[i];
if (stakes[tokenId].owner != address(0)) {
snapshotBoosts[snapId][tokenId] = getBoost(tokenId);
// Store total points for the token's owner at snapshot time
address tokenOwner = stakes[tokenId].owner;
if (snapshotPoints[snapId][tokenId] == 0) {
snapshotPoints[snapId][tokenId] = getTotalPoints(tokenOwner);
}
}
unchecked { ++i; }
}
emit SnapshotTaken(snapId, block.timestamp);
}
/**
* @notice Continue a snapshot with more tokens (for large collections).
*/
function snapshotContinue(uint256 snapId, uint256[] calldata tokenIds) external onlyOwner {
require(snapshots[snapId].exists, "Snapshot does not exist");
for (uint256 i = 0; i < tokenIds.length; ) {
uint256 tokenId = tokenIds[i];
if (stakes[tokenId].owner != address(0)) {
snapshotBoosts[snapId][tokenId] = getBoost(tokenId);
address tokenOwner = stakes[tokenId].owner;
if (snapshotPoints[snapId][tokenId] == 0) {
snapshotPoints[snapId][tokenId] = getTotalPoints(tokenOwner);
}
}
unchecked { ++i; }
}
}
/**
* @notice Get a token's frozen boost from a snapshot.
*/
function getSnapshotBoost(uint256 snapId, uint256 tokenId) external view returns (uint256) {
require(snapshots[snapId].exists, "Snapshot does not exist");
return snapshotBoosts[snapId][tokenId];
}
/**
* @notice Get a token owner's frozen points from a snapshot.
*/
function getSnapshotPoints(uint256 snapId, uint256 tokenId) external view returns (uint256) {
require(snapshots[snapId].exists, "Snapshot does not exist");
return snapshotPoints[snapId][tokenId] / POINTS_DECIMALS;
}
// ═══════════════════════════════════════════════════════════
// VIEW FUNCTIONS
// ═══════════════════════════════════════════════════════════
/**
* @notice Get all currently staked token IDs for a user.
*/
function getStakedTokens(address user) external view returns (uint256[] memory) {
return _stakedTokens[user];
}
/**
* @notice Get staked count for a user.
*/
function getStakedCount(address user) external view returns (uint256) {
return _stakedTokens[user].length;
}
/**
* @notice Check if a token is staked.
*/
function isStaked(uint256 tokenId) external view returns (bool) {
return stakes[tokenId].isStaked;
}
/**
* @notice Get the staker of a token.
*/
function stakerOf(uint256 tokenId) external view returns (address) {
return stakes[tokenId].owner;
}
/**
* @notice Batch query: boosts, points, and staking status.
*/
function batchGetInfo(uint256[] calldata tokenIds) external view returns (
uint256[] memory boosts,
bool[] memory staked,
address[] memory owners,
uint256[] memory days_,
uint256[] memory tokenPoints
) {
uint256 length = tokenIds.length;
boosts = new uint256[](length);
staked = new bool[](length);
owners = new address[](length);
days_ = new uint256[](length);
tokenPoints = new uint256[](length);
for (uint256 i = 0; i < length; ) {
uint256 tokenId = tokenIds[i];
boosts[i] = getBoost(tokenId);
staked[i] = stakes[tokenId].isStaked;
owners[i] = stakes[tokenId].owner;
days_[i] = getTotalStakeTime(tokenId) / 1 days;
tokenPoints[i] = pendingTokenPoints(tokenId) / POINTS_DECIMALS;
unchecked { ++i; }
}
}
// ═══════════════════════════════════════════════════════════
// ADMIN
// ═══════════════════════════════════════════════════════════
function pause() external onlyOwner { _pause(); }
function unpause() external onlyOwner { _unpause(); }
/**
* @notice Emergency: return a stuck NFT. Credits pending points first.
*/
function emergencyUnstake(uint256 tokenId) external onlyOwner nonReentrant {
StakeInfo storage info = stakes[tokenId];
require(info.isStaked, "Not staked");
address tokenOwner = info.owner;
require(tokenOwner != address(0), "Invalid owner");
// Credit points before unstaking
_creditTokenPoints(tokenId, tokenOwner);
// Accumulate time
uint128 sessionTime = uint128(block.timestamp) - info.stakedAt;
info.accumulatedTime += sessionTime;
info.isStaked = false;
info.stakedAt = 0;
_removeFromStakedList(tokenOwner, tokenId);
totalStaked--;
cuboidsNFT.transferFrom(address(this), tokenOwner, tokenId);
emit EmergencyUnstaked(tokenId, tokenOwner);
}
/**
* @notice Emergency: batch return multiple stuck NFTs.
*/
function emergencyUnstakeBatch(uint256[] calldata tokenIds) external onlyOwner nonReentrant {
for (uint256 i = 0; i < tokenIds.length; ) {
uint256 tokenId = tokenIds[i];
StakeInfo storage info = stakes[tokenId];
if (info.isStaked && info.owner != address(0)) {
address tokenOwner = info.owner;
_creditTokenPoints(tokenId, tokenOwner);
uint128 sessionTime = uint128(block.timestamp) - info.stakedAt;
info.accumulatedTime += sessionTime;
info.isStaked = false;
info.stakedAt = 0;
_removeFromStakedList(tokenOwner, tokenId);
totalStaked--;
cuboidsNFT.transferFrom(address(this), tokenOwner, tokenId);
emit EmergencyUnstaked(tokenId, tokenOwner);
}
unchecked { ++i; }
}
}
/**
* @notice Owner can grant bonus points to any address (airdrops, rewards).
* @param user Recipient address.
* @param amount Points to grant (display units, e.g., 100 = 100 points).
*/
function grantPoints(address user, uint256 amount) external onlyOwner {
require(user != address(0), "Zero address");
creditedPoints[user] += amount * POINTS_DECIMALS;
emit PointsCredited(user, amount * POINTS_DECIMALS);
}
/**
* @notice Owner can batch grant points to multiple addresses.
* @param users Array of recipient addresses.
* @param amounts Array of point amounts (display units).
*/
function grantPointsBatch(address[] calldata users, uint256[] calldata amounts) external onlyOwner {
require(users.length == amounts.length, "Length mismatch");
for (uint256 i = 0; i < users.length; ) {
require(users[i] != address(0), "Zero address");
uint256 rawAmount = amounts[i] * POINTS_DECIMALS;
creditedPoints[users[i]] += rawAmount;
emit PointsCredited(users[i], rawAmount);
unchecked { ++i; }
}
}
// ═══════════════════════════════════════════════════════════
// INTERNAL HELPERS
// ═══════════════════════════════════════════════════════════
function _removeFromStakedList(address user, uint256 tokenId) internal {
uint256[] storage userTokens = _stakedTokens[user];
uint256 index = _stakedTokenIndex[tokenId];
uint256 lastIndex = userTokens.length - 1;
if (index != lastIndex) {
uint256 lastTokenId = userTokens[lastIndex];
userTokens[index] = lastTokenId;
_stakedTokenIndex[lastTokenId] = index;
}
userTokens.pop();
delete _stakedTokenIndex[tokenId];
}
// ═══════════════════════════════════════════════════════════
// ERC721 RECEIVER
// ═══════════════════════════════════════════════════════════
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external view override returns (bytes4) {
require(msg.sender == address(cuboidsNFT), "Only Cuboids NFTs accepted");
return IERC721Receiver.onERC721Received.selector;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"nftAddress_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"EmergencyUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PointsCredited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"spender","type":"address"}],"name":"PointsSpent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"snapshotId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SnapshotTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"bool","name":"authorized","type":"bool"}],"name":"SpenderAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"BONUS_ONE_OF_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOOST_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOOST_TIER_1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOOST_TIER_2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOOST_TIER_3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOOST_TIER_4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POINTS_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POINTS_PER_SEC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POINTS_PER_SEC_1OF1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIER_1_DAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIER_2_DAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIER_3_DAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIER_4_DAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedSpenders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchGetInfo","outputs":[{"internalType":"uint256[]","name":"boosts","type":"uint256[]"},{"internalType":"bool[]","name":"staked","type":"bool[]"},{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"days_","type":"uint256[]"},{"internalType":"uint256[]","name":"tokenPoints","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"creditedPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cuboidsNFT","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"emergencyUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"emergencyUnstakeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBoost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBoostInfo","outputs":[{"internalType":"uint8","name":"tier","type":"uint8"},{"internalType":"uint256","name":"boost","type":"uint256"},{"internalType":"uint256","name":"totalDays","type":"uint256"},{"internalType":"bool","name":"is1of1","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getPointsDisplay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getPointsInfo","outputs":[{"internalType":"uint256","name":"credited","type":"uint256"},{"internalType":"uint256","name":"pending","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"spent","type":"uint256"},{"internalType":"uint256","name":"stakedCount","type":"uint256"},{"internalType":"uint256","name":"dailyRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"snapId","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSnapshotBoost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"snapId","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSnapshotPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getStakedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getStakedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getTotalPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTotalStakeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"grantPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"grantPointsBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isOneOfOne","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastPointsCreditAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"pendingPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"pendingTokenPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"selfSpendPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"bool","name":"authorized","type":"bool"}],"name":"setAuthorizedSpender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"snapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"snapshotBoosts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"snapId","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"snapshotContinue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snapshotCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"snapshotPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"snapshots","outputs":[{"internalType":"uint128","name":"timestamp","type":"uint128"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"spendPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakes","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint128","name":"stakedAt","type":"uint128"},{"internalType":"uint128","name":"accumulatedTime","type":"uint128"},{"internalType":"bool","name":"isStaked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalSpent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a060405234801561000f575f5ffd5b5060405161576a38038061576a833981810160405281019061003191906103d2565b33600161005061004561027f60201b60201c565b6102a860201b60201c565b5f01819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100c6575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100bd919061040c565b60405180910390fd5b6100d5816102b160201b60201c565b505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013b9061047f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050600160045f60c081526020019081526020015f205f6101000a81548160ff021916908315150217905550600160045f6104da81526020019081526020015f205f6101000a81548160ff021916908315150217905550600160045f61053f81526020019081526020015f205f6101000a81548160ff021916908315150217905550600160045f61059981526020019081526020015f205f6101000a81548160ff021916908315150217905550600160045f6105df81526020019081526020015f205f6101000a81548160ff021916908315150217905550600160045f61060181526020019081526020015f205f6101000a81548160ff0219169083151502179055505061049d565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005f1b905090565b5f819050919050565b5f5f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6103a182610378565b9050919050565b6103b181610397565b81146103bb575f5ffd5b50565b5f815190506103cc816103a8565b92915050565b5f602082840312156103e7576103e6610374565b5b5f6103f4848285016103be565b91505092915050565b61040681610397565b82525050565b5f60208201905061041f5f8301846103fd565b92915050565b5f82825260208201905092915050565b7f5a65726f206164647265737300000000000000000000000000000000000000005f82015250565b5f610469600c83610425565b915061047482610435565b602082019050919050565b5f6020820190508181035f8301526104968161045d565b9050919050565b60805161528b6104df5f395f8181610e0d015281816112900152818161155e0152818161171901528181612078015281816126bd0152613442015261528b5ff3fe608060405234801561000f575f5ffd5b5060043610610397575f3560e01c806383c13db2116101e7578063c7dc319b1161010d578063dd0e08c5116100ab578063f09cc60d1161007a578063f09cc60d14610b57578063f2fde38b14610b87578063f444694014610ba3578063fcc4874c14610bbf57610397565b8063dd0e08c514610acf578063de22763214610aff578063e0f191c014610b1d578063e449f34114610b3b57610397565b8063d63e4386116100e7578063d63e438614610a1e578063d6565a2d14610a4e578063d706541d14610a7f578063da515dc114610ab357610397565b8063c7dc319b1461098b578063d2454e8d146109bb578063d5a44f86146109eb57610397565b806397260d9511610185578063b1224ab311610154578063b1224ab3146108f1578063baa51f861461090d578063c4950aab1461093d578063c659c82d1461096d57610397565b806397260d9514610831578063a1190a0214610861578063a8949b4614610891578063ac86e186146108c157610397565b80638da5cb5b116101c15780638da5cb5b146107a8578063918d2428146107c657806394cbdbe0146107e257806396911e7a1461081557610397565b806383c13db21461075057806383f158b5146107805780638456cb591461079e57610397565b80632a48cfa4116102cc5780635c975abb1161026a57806374aa9b3c1161023957806374aa9b3c146106af5780637629f014146106e45780637f067c3f14610714578063817b1cd21461073257610397565b80635c975abb1461063957806363c28db114610657578063675718b814610687578063715018a6146106a557610397565b80633f27a04f116102a65780633f27a04f146105d55780633f4ba83a146105f35780634ef127b1146105fd578063505dbfab1461061b57610397565b80632a48cfa41461057d578063315261f21461059b5780633e867261146105b957610397565b806310bba86411610339578063150b7a0211610313578063150b7a02146104e3578063168d0cdd146105135780631f4fc8c31461052f57806325f09e611461055f57610397565b806310bba8641461047757806312d3f8561461049557806313c8e2de146104b357610397565b806306c0989d1161037557806306c0989d146103dd578063098ab6a11461040d5780630fbf0a931461042b5780631088ce901461044757610397565b8063012ce5011461039b578063042f1ba7146103b757806304d092c7146103d3575b5f5ffd5b6103b560048036038101906103b09190613f40565b610bef565b005b6103d160048036038101906103cc9190613ffa565b610ee7565b005b6103db611003565b005b6103f760048036038101906103f29190614038565b611195565b6040516104049190614072565b60405180910390f35b6104156111aa565b6040516104229190614072565b60405180910390f35b610445600480360381019061044091906140ec565b6111b0565b005b610461600480360381019061045c9190614038565b611653565b60405161046e9190614072565b60405180910390f35b61047f6116ac565b60405161048c9190614072565b60405180910390f35b61049d6116b8565b6040516104aa9190614072565b60405180910390f35b6104cd60048036038101906104c89190613f40565b6116bf565b6040516104da9190614072565b60405180910390f35b6104fd60048036038101906104f8919061418c565b611716565b60405161050a919061424a565b60405180910390f35b61052d600480360381019061052891906140ec565b6117b8565b005b61054960048036038101906105449190614038565b611a0c565b6040516105569190614072565b60405180910390f35b610567611a30565b6040516105749190614072565b60405180910390f35b610585611a36565b6040516105929190614072565b60405180910390f35b6105a3611a40565b6040516105b09190614072565b60405180910390f35b6105d360048036038101906105ce9190613f40565b611a47565b005b6105dd611b3c565b6040516105ea9190614072565b60405180910390f35b6105fb611b42565b005b610605611b54565b6040516106129190614072565b60405180910390f35b610623611b5e565b6040516106309190614072565b60405180910390f35b610641611b65565b60405161064e9190614272565b60405180910390f35b610671600480360381019061066c9190614038565b611b79565b60405161067e9190614342565b60405180910390f35b61068f611c0c565b60405161069c9190614072565b60405180910390f35b6106ad611c12565b005b6106c960048036038101906106c49190614038565b611c25565b6040516106db96959493929190614362565b60405180910390f35b6106fe60048036038101906106f99190613f40565b611ea2565b60405161070b9190614072565b60405180910390f35b61071c612021565b6040516107299190614072565b60405180910390f35b61073a612027565b6040516107479190614072565b60405180910390f35b61076a60048036038101906107659190614038565b61202d565b6040516107779190614072565b60405180910390f35b610788612076565b604051610795919061441c565b60405180910390f35b6107a661209a565b005b6107b06120ac565b6040516107bd9190614444565b60405180910390f35b6107e060048036038101906107db919061445d565b6120d4565b005b6107fc60048036038101906107f79190613f40565b61224b565b60405161080c94939291906144b6565b60405180910390f35b61082f600480360381019061082a919061445d565b6122f2565b005b61084b600480360381019061084691906144f9565b612433565b6040516108589190614072565b60405180910390f35b61087b60048036038101906108769190613f40565b612453565b6040516108889190614272565b60405180910390f35b6108ab60048036038101906108a69190614038565b612470565b6040516108b89190614072565b60405180910390f35b6108db60048036038101906108d69190613f40565b612485565b6040516108e89190614444565b60405180910390f35b61090b600480360381019061090691906140ec565b6124c0565b005b61092760048036038101906109229190613f40565b6127a6565b6040516109349190614272565b60405180910390f35b61095760048036038101906109529190614038565b6127cf565b6040516109649190614072565b60405180910390f35b6109756128b5565b6040516109829190614072565b60405180910390f35b6109a560048036038101906109a091906144f9565b6128bb565b6040516109b29190614072565b60405180910390f35b6109d560048036038101906109d09190614038565b612945565b6040516109e29190614272565b60405180910390f35b610a056004803603810190610a009190613f40565b612962565b604051610a159493929190614561565b60405180910390f35b610a386004803603810190610a3391906144f9565b6129f0565b604051610a459190614072565b60405180910390f35b610a686004803603810190610a639190613f40565b612a8d565b604051610a769291906145a4565b60405180910390f35b610a996004803603810190610a9491906140ec565b612ad4565b604051610aaa959493929190614739565b60405180910390f35b610acd6004803603810190610ac891906147ad565b612dfb565b005b610ae96004803603810190610ae49190613f40565b612fc1565b604051610af69190614072565b60405180910390f35b610b07613164565b604051610b149190614072565b60405180910390f35b610b2561316a565b604051610b329190614072565b60405180910390f35b610b556004803603810190610b5091906140ec565b613171565b005b610b716004803603810190610b6c9190613f40565b613538565b604051610b7e9190614072565b60405180910390f35b610ba16004803603810190610b9c9190614038565b61354d565b005b610bbd6004803603810190610bb8919061485f565b6135d1565b005b610bd96004803603810190610bd491906144f9565b6137f8565b604051610be69190614072565b60405180910390f35b610bf7613818565b610bff61389f565b5f60015f8381526020019081526020015f209050806002015f9054906101000a900460ff16610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a90614937565b60405180910390fd5b5f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee9061499f565b60405180910390fd5b610d0183826138c1565b505f826001015f9054906101000a90046fffffffffffffffffffffffffffffffff1642610d2e91906149ea565b9050808360010160108282829054906101000a90046fffffffffffffffffffffffffffffffff16610d5f9190614a2d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505f836002015f6101000a81548160ff0219169083151502179055505f836001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550610df4828561394a565b60055f815480929190610e0690614a70565b91905055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff1660e01b8152600401610e6893929190614a97565b5f604051808303815f87803b158015610e7f575f5ffd5b505af1158015610e91573d5f5f3e3d5ffd5b505050508173ffffffffffffffffffffffffffffffffffffffff16847fe45d6a07d2c0fb8434c56ef7edc1da4b054c2713283d9b501a07c559db36467e60405160405180910390a3505050610ee4613a50565b50565b610eef613818565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5490614b16565b60405180910390fd5b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fae147a7c9fb958af671f40fcdd8c9317dd78c17d572aeb8fb41010846c4a45c882604051610ff79190614272565b60405180910390a25050565b61100b61389f565b611013613a6a565b5f60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561109957602002820191905f5260205f20905b815481526020019060010190808311611085575b505050505090505f8151116110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90614b7e565b60405180910390fd5b5f5f90505f5f90505b82518110156111315761111983828151811061110b5761110a614b9c565b5b6020026020010151336138c1565b826111249190614bc9565b91508060010190506110ec565b505f811115611189573373ffffffffffffffffffffffffffffffffffffffff167f3a18fec58b4855f99fb3bbdecafa3982e86acfcd89de889f1396c1bfc3bfb686826040516111809190614072565b60405180910390a25b5050611193613a50565b565b6006602052805f5260405f205f915090505481565b600d5481565b6111b861389f565b6111c0613a6a565b5f8282905090505f8111611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120090614c46565b60405180910390fd5b603281111561124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124490614cae565b60405180910390fd5b5f5f90505b818110156115f3575f84848381811061126e5761126d614b9c565b5b9050602002013590503373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016112e79190614072565b602060405180830381865afa158015611302573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113269190614ce0565b73ffffffffffffffffffffffffffffffffffffffff161461137c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137390614d55565b60405180910390fd5b5f60015f8381526020019081526020015f209050806002015f9054906101000a900460ff16156113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890614dbd565b60405180910390fd5b33815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042816001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001816002015f6101000a81548160ff0219169083151502179055504260075f8481526020019081526020015f208190555060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905060035f8481526020019081526020015f208190555060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f909190919091505560055f81548092919061155790614ddb565b91905055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016115b993929190614a97565b5f604051808303815f87803b1580156115d0575f5ffd5b505af11580156115e2573d5f5f3e3d5ffd5b505050508260010192505050611252565b503373ffffffffffffffffffffffffffffffffffffffff167ff2dcf2c2203868ea22146a870b3a09ccabe0a475657c9a03083b1b060fb0dc5184844260405161163e93929190614e8a565b60405180910390a25061164f613a50565b5050565b5f61165d826127cf565b60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546116a59190614bc9565b9050919050565b670de0b6b3a764000081565b62093a8081565b5f5f6116ca83611ea2565b90505f6116d682613aab565b905060045f8581526020019081526020015f205f9054906101000a900460ff161561170c57611388816117099190614bc9565b90505b8092505050919050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90614f04565b60405180910390fd5b63150b7a0260e01b905095945050505050565b6117c0613818565b5f600d549050600d5f8154809291906117d890614ddb565b91905055506040518060400160405280426fffffffffffffffffffffffffffffffff16815260200160011515815250600a5f8381526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a81548160ff0219169083151502179055509050505f5f90505b838390508110156119ce575f84848381811061189a57611899614b9c565b5b9050602002013590505f73ffffffffffffffffffffffffffffffffffffffff1660015f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119c257611911816116bf565b600b5f8581526020019081526020015f205f8381526020019081526020015f20819055505f60015f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f600c5f8681526020019081526020015f205f8481526020019081526020015f2054036119c05761199b81611653565b600c5f8681526020019081526020015f205f8481526020019081526020015f20819055505b505b8160010191505061187b565b50807f3b5ce8b2d475067181f949f668899c93f26f0b25c5f8712ebca6b4b93d92989d426040516119ff9190614072565b60405180910390a2505050565b5f670de0b6b3a7640000611a1f83611653565b611a299190614f4f565b9050919050565b61271081565b65d287fb79cd0981565b624f1a0081565b611a4f61389f565b611a57613a6a565b5f670de0b6b3a764000082611a6c9190614f7f565b9050611a783382613b07565b8060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611ac49190614bc9565b925050819055503373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f0b3ef45f7821bcca9433bcfc8b5b7309f7950f929d64030fafec7b3cf9a29dbd83604051611b289190614072565b60405180910390a350611b39613a50565b50565b61445c81565b611b4a613818565b611b52613cab565b565b656943fdbce68481565b62278d0081565b5f5f5f9054906101000a900460ff16905090565b606060025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015611c0057602002820191905f5260205f20905b815481526020019060010190808311611bec575b50505050509050919050565b6130d481565b611c1a613818565b611c235f613d0b565b565b5f5f5f5f5f5f5f60065f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f611c76896127cf565b9050670de0b6b3a764000082611c8c9190614f4f565b9750670de0b6b3a764000081611ca29190614f4f565b9650670de0b6b3a76400008183611cb99190614bc9565b611cc39190614f4f565b9550670de0b6b3a764000060085f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611d169190614f4f565b945060025f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905093505f60025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015611de157602002820191905f5260205f20905b815481526020019060010190808311611dcd575b505050505090505f5f90505f5f90505b8251811015611e7e5760045f848381518110611e1057611e0f614b9c565b5b602002602001015181526020019081526020015f205f9054906101000a900460ff16611e505762015180656943fdbce684611e4b9190614f7f565b611e66565b6201518065d287fb79cd09611e659190614f7f565b5b82611e719190614bc9565b9150806001019050611df1565b50670de0b6b3a764000081611e939190614f4f565b94505050505091939550919395565b5f5f60015f8481526020019081526020015f206040518060800160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900460ff16151515158152505090505f81604001516fffffffffffffffffffffffffffffffff1690508160600151156120175781602001516fffffffffffffffffffffffffffffffff16426120099190614fc0565b816120149190614bc9565b90505b8092505050919050565b61138881565b60055481565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490509050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6120a2613818565b6120aa613dce565b565b5f5f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6120dc61389f565b60095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c9061503d565b60405180910390fd5b5f670de0b6b3a76400008261217a9190614f7f565b90506121868382613b07565b8060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546121d29190614bc9565b925050819055503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f0b3ef45f7821bcca9433bcfc8b5b7309f7950f929d64030fafec7b3cf9a29dbd836040516122369190614072565b60405180910390a350612247613a50565b5050565b5f5f5f5f5f61225986611ea2565b9050620151808161226a9190614f4f565b9250612275866116bf565b935060045f8781526020019081526020015f205f9054906101000a900460ff1691506276a70081106122aa57600494506122ea565b624f1a0081106122bd57600394506122e9565b62278d0081106122d057600294506122e8565b62093a8081106122e357600194506122e7565b5f94505b5b5b5b509193509193565b6122fa613818565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f90614b16565b60405180910390fd5b670de0b6b3a76400008161237c9190614f7f565b60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546123c79190614bc9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f3a18fec58b4855f99fb3bbdecafa3982e86acfcd89de889f1396c1bfc3bfb686670de0b6b3a76400008361241a9190614f7f565b6040516124279190614072565b60405180910390a25050565b600c602052815f5260405f20602052805f5260405f205f91509150505481565b6004602052805f5260405f205f915054906101000a900460ff1681565b6008602052805f5260405f205f915090505481565b5f60015f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6124c8613818565b6124d061389f565b5f5f90505b82829050811015612799575f8383838181106124f4576124f3614b9c565b5b9050602002013590505f60015f8381526020019081526020015f209050806002015f9054906101000a900460ff16801561257c57505f73ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b1561278c575f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506125b183826138c1565b505f826001015f9054906101000a90046fffffffffffffffffffffffffffffffff16426125de91906149ea565b9050808360010160108282829054906101000a90046fffffffffffffffffffffffffffffffff1661260f9190614a2d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505f836002015f6101000a81548160ff0219169083151502179055505f836001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506126a4828561394a565b60055f8154809291906126b690614a70565b91905055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff1660e01b815260040161271893929190614a97565b5f604051808303815f87803b15801561272f575f5ffd5b505af1158015612741573d5f5f3e3d5ffd5b505050508173ffffffffffffffffffffffffffffffffffffffff16847fe45d6a07d2c0fb8434c56ef7edc1da4b054c2713283d9b501a07c559db36467e60405160405180910390a350505b82600101925050506124d5565b506127a2613a50565b5050565b5f60015f8381526020019081526020015f206002015f9054906101000a900460ff169050919050565b5f5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561285657602002820191905f5260205f20905b815481526020019060010190808311612842575b505050505090505f5f90505f5f90505b82518110156128aa5761289283828151811061288557612884614b9c565b5b6020026020010151612fc1565b8261289d9190614bc9565b9150806001019050612866565b508092505050919050565b614e2081565b5f600a5f8481526020019081526020015f205f0160109054906101000a900460ff1661291c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612913906150a5565b60405180910390fd5b600b5f8481526020019081526020015f205f8381526020019081526020015f2054905092915050565b6009602052805f5260405f205f915054906101000a900460ff1681565b6001602052805f5260405f205f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015f9054906101000a90046fffffffffffffffffffffffffffffffff16908060010160109054906101000a90046fffffffffffffffffffffffffffffffff1690806002015f9054906101000a900460ff16905084565b5f600a5f8481526020019081526020015f205f0160109054906101000a900460ff16612a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a48906150a5565b60405180910390fd5b670de0b6b3a7640000600c5f8581526020019081526020015f205f8481526020019081526020015f2054612a859190614f4f565b905092915050565b600a602052805f5260405f205f91509050805f015f9054906101000a90046fffffffffffffffffffffffffffffffff1690805f0160109054906101000a900460ff16905082565b60608060608060605f8787905090508067ffffffffffffffff811115612afd57612afc6150c3565b5b604051908082528060200260200182016040528015612b2b5781602001602082028036833780820191505090505b5095508067ffffffffffffffff811115612b4857612b476150c3565b5b604051908082528060200260200182016040528015612b765781602001602082028036833780820191505090505b5094508067ffffffffffffffff811115612b9357612b926150c3565b5b604051908082528060200260200182016040528015612bc15781602001602082028036833780820191505090505b5093508067ffffffffffffffff811115612bde57612bdd6150c3565b5b604051908082528060200260200182016040528015612c0c5781602001602082028036833780820191505090505b5092508067ffffffffffffffff811115612c2957612c286150c3565b5b604051908082528060200260200182016040528015612c575781602001602082028036833780820191505090505b5091505f5f90505b81811015612def575f898983818110612c7b57612c7a614b9c565b5b905060200201359050612c8d816116bf565b888381518110612ca057612c9f614b9c565b5b60200260200101818152505060015f8281526020019081526020015f206002015f9054906101000a900460ff16878381518110612ce057612cdf614b9c565b5b60200260200101901515908115158152505060015f8281526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868381518110612d3857612d37614b9c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505062015180612d7f82611ea2565b612d899190614f4f565b858381518110612d9c57612d9b614b9c565b5b602002602001018181525050670de0b6b3a7640000612dba82612fc1565b612dc49190614f4f565b848381518110612dd757612dd6614b9c565b5b60200260200101818152505081600101915050612c5f565b50509295509295909350565b612e03613818565b600a5f8481526020019081526020015f205f0160109054906101000a900460ff16612e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5a906150a5565b60405180910390fd5b5f5f90505b82829050811015612fbb575f838383818110612e8757612e86614b9c565b5b9050602002013590505f73ffffffffffffffffffffffffffffffffffffffff1660015f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612faf57612efe816116bf565b600b5f8781526020019081526020015f205f8381526020019081526020015f20819055505f60015f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f600c5f8881526020019081526020015f205f8481526020019081526020015f205403612fad57612f8881611653565b600c5f8881526020019081526020015f205f8481526020019081526020015f20819055505b505b81600101915050612e68565b50505050565b5f5f60015f8481526020019081526020015f206040518060800160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900460ff161515151581525050905080606001516130f4575f91505061315f565b5f60075f8581526020019081526020015f2054426131129190614fc0565b90505f60045f8681526020019081526020015f205f9054906101000a900460ff1661314357656943fdbce68461314b565b65d287fb79cd095b905080826131599190614f7f565b93505050505b919050565b613a9881565b6276a70081565b61317961389f565b613181613a6a565b5f8282905090505f81116131ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c190614c46565b60405180910390fd5b603281111561320e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320590614cae565b60405180910390fd5b5f5f90505b818110156134d8575f84848381811061322f5761322e614b9c565b5b9050602002013590505f60015f8381526020019081526020015f209050806002015f9054906101000a900460ff1661329c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329390614937565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461332c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133239061513a565b60405180910390fd5b61333682336138c1565b505f816001015f9054906101000a90046fffffffffffffffffffffffffffffffff164261336391906149ea565b9050808260010160108282829054906101000a90046fffffffffffffffffffffffffffffffff166133949190614a2d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505f826002015f6101000a81548160ff0219169083151502179055505f826001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550613429338461394a565b60055f81548092919061343b90614a70565b91905055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3033866040518463ffffffff1660e01b815260040161349d93929190614a97565b5f604051808303815f87803b1580156134b4575f5ffd5b505af11580156134c6573d5f5f3e3d5ffd5b50505050836001019350505050613213565b503373ffffffffffffffffffffffffffffffffffffffff167fe788e4bc271e1c72b4230407aea7fbea360cb4ed631b438d8de2ea619505e8d184844260405161352393929190614e8a565b60405180910390a250613534613a50565b5050565b6007602052805f5260405f205f915090505481565b613555613818565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036135c5575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016135bc9190614444565b60405180910390fd5b6135ce81613d0b565b50565b6135d9613818565b818190508484905014613621576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613618906151a2565b60405180910390fd5b5f5f90505b848490508110156137f1575f73ffffffffffffffffffffffffffffffffffffffff1685858381811061365b5761365a614b9c565b5b90506020020160208101906136709190614038565b73ffffffffffffffffffffffffffffffffffffffff16036136c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136bd90614b16565b60405180910390fd5b5f670de0b6b3a76400008484848181106136e3576136e2614b9c565b5b905060200201356136f49190614f7f565b90508060065f88888681811061370d5761370c614b9c565b5b90506020020160208101906137229190614038565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546137699190614bc9565b9250508190555085858381811061378357613782614b9c565b5b90506020020160208101906137989190614038565b73ffffffffffffffffffffffffffffffffffffffff167f3a18fec58b4855f99fb3bbdecafa3982e86acfcd89de889f1396c1bfc3bfb686826040516137dd9190614072565b60405180910390a281600101915050613626565b5050505050565b600b602052815f5260405f20602052805f5260405f205f91509150505481565b613820613e2f565b73ffffffffffffffffffffffffffffffffffffffff1661383e6120ac565b73ffffffffffffffffffffffffffffffffffffffff161461389d57613861613e2f565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016138949190614444565b60405180910390fd5b565b6138a7613e36565b60026138b96138b4613e77565b613ea0565b5f0181905550565b5f5f6138cc84612fc1565b90505f811115613940578060065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546139229190614bc9565b925050819055504260075f8681526020019081526020015f20819055505b8091505092915050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f60035f8481526020019081526020015f205490505f600183805490506139b19190614fc0565b9050808214613a11575f8382815481106139ce576139cd614b9c565b5b905f5260205f2001549050808484815481106139ed576139ec614b9c565b5b905f5260205f2001819055508260035f8381526020019081526020015f2081905550505b82805480613a2257613a216151c0565b5b600190038181905f5260205f20015f9055905560035f8581526020019081526020015f205f90555050505050565b6001613a62613a5d613e77565b613ea0565b5f0181905550565b613a72611b65565b15613aa9576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6276a7008210613ac057614e209050613b02565b624f1a008210613ad45761445c9050613b02565b62278d008210613ae857613a989050613b02565b62093a808210613afc576130d49050613b02565b61271090505b919050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015613b8d57602002820191905f5260205f20905b815481526020019060010190808311613b79575b505050505090505f5f90505b8151811015613bd257613bc6828281518110613bb857613bb7614b9c565b5b6020026020010151856138c1565b50806001019050613b99565b508160065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015613c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c4a90615237565b60405180910390fd5b8160065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613c9f9190614fc0565b92505081905550505050565b613cb3613ea9565b5f5f5f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613cf4613e2f565b604051613d019190614444565b60405180910390a1565b5f5f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613dd6613a6a565b60015f5f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613e18613e2f565b604051613e259190614444565b60405180910390a1565b5f33905090565b613e3e613ee9565b15613e75576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005f1b905090565b5f819050919050565b613eb1611b65565b613ee7576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6002613efc613ef7613e77565b613ea0565b5f015414905090565b5f5ffd5b5f5ffd5b5f819050919050565b613f1f81613f0d565b8114613f29575f5ffd5b50565b5f81359050613f3a81613f16565b92915050565b5f60208284031215613f5557613f54613f05565b5b5f613f6284828501613f2c565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613f9482613f6b565b9050919050565b613fa481613f8a565b8114613fae575f5ffd5b50565b5f81359050613fbf81613f9b565b92915050565b5f8115159050919050565b613fd981613fc5565b8114613fe3575f5ffd5b50565b5f81359050613ff481613fd0565b92915050565b5f5f604083850312156140105761400f613f05565b5b5f61401d85828601613fb1565b925050602061402e85828601613fe6565b9150509250929050565b5f6020828403121561404d5761404c613f05565b5b5f61405a84828501613fb1565b91505092915050565b61406c81613f0d565b82525050565b5f6020820190506140855f830184614063565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126140ac576140ab61408b565b5b8235905067ffffffffffffffff8111156140c9576140c861408f565b5b6020830191508360208202830111156140e5576140e4614093565b5b9250929050565b5f5f6020838503121561410257614101613f05565b5b5f83013567ffffffffffffffff81111561411f5761411e613f09565b5b61412b85828601614097565b92509250509250929050565b5f5f83601f84011261414c5761414b61408b565b5b8235905067ffffffffffffffff8111156141695761416861408f565b5b60208301915083600182028301111561418557614184614093565b5b9250929050565b5f5f5f5f5f608086880312156141a5576141a4613f05565b5b5f6141b288828901613fb1565b95505060206141c388828901613fb1565b94505060406141d488828901613f2c565b935050606086013567ffffffffffffffff8111156141f5576141f4613f09565b5b61420188828901614137565b92509250509295509295909350565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61424481614210565b82525050565b5f60208201905061425d5f83018461423b565b92915050565b61426c81613fc5565b82525050565b5f6020820190506142855f830184614263565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6142bd81613f0d565b82525050565b5f6142ce83836142b4565b60208301905092915050565b5f602082019050919050565b5f6142f08261428b565b6142fa8185614295565b9350614305836142a5565b805f5b8381101561433557815161431c88826142c3565b9750614327836142da565b925050600181019050614308565b5085935050505092915050565b5f6020820190508181035f83015261435a81846142e6565b905092915050565b5f60c0820190506143755f830189614063565b6143826020830188614063565b61438f6040830187614063565b61439c6060830186614063565b6143a96080830185614063565b6143b660a0830184614063565b979650505050505050565b5f819050919050565b5f6143e46143df6143da84613f6b565b6143c1565b613f6b565b9050919050565b5f6143f5826143ca565b9050919050565b5f614406826143eb565b9050919050565b614416816143fc565b82525050565b5f60208201905061442f5f83018461440d565b92915050565b61443e81613f8a565b82525050565b5f6020820190506144575f830184614435565b92915050565b5f5f6040838503121561447357614472613f05565b5b5f61448085828601613fb1565b925050602061449185828601613f2c565b9150509250929050565b5f60ff82169050919050565b6144b08161449b565b82525050565b5f6080820190506144c95f8301876144a7565b6144d66020830186614063565b6144e36040830185614063565b6144f06060830184614263565b95945050505050565b5f5f6040838503121561450f5761450e613f05565b5b5f61451c85828601613f2c565b925050602061452d85828601613f2c565b9150509250929050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b61455b81614537565b82525050565b5f6080820190506145745f830187614435565b6145816020830186614552565b61458e6040830185614552565b61459b6060830184614263565b95945050505050565b5f6040820190506145b75f830185614552565b6145c46020830184614263565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6145fd81613fc5565b82525050565b5f61460e83836145f4565b60208301905092915050565b5f602082019050919050565b5f614630826145cb565b61463a81856145d5565b9350614645836145e5565b805f5b8381101561467557815161465c8882614603565b97506146678361461a565b925050600181019050614648565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6146b481613f8a565b82525050565b5f6146c583836146ab565b60208301905092915050565b5f602082019050919050565b5f6146e782614682565b6146f1818561468c565b93506146fc8361469c565b805f5b8381101561472c57815161471388826146ba565b975061471e836146d1565b9250506001810190506146ff565b5085935050505092915050565b5f60a0820190508181035f83015261475181886142e6565b905081810360208301526147658187614626565b9050818103604083015261477981866146dd565b9050818103606083015261478d81856142e6565b905081810360808301526147a181846142e6565b90509695505050505050565b5f5f5f604084860312156147c4576147c3613f05565b5b5f6147d186828701613f2c565b935050602084013567ffffffffffffffff8111156147f2576147f1613f09565b5b6147fe86828701614097565b92509250509250925092565b5f5f83601f84011261481f5761481e61408b565b5b8235905067ffffffffffffffff81111561483c5761483b61408f565b5b60208301915083602082028301111561485857614857614093565b5b9250929050565b5f5f5f5f6040858703121561487757614876613f05565b5b5f85013567ffffffffffffffff81111561489457614893613f09565b5b6148a08782880161480a565b9450945050602085013567ffffffffffffffff8111156148c3576148c2613f09565b5b6148cf87828801614097565b925092505092959194509250565b5f82825260208201905092915050565b7f4e6f74207374616b6564000000000000000000000000000000000000000000005f82015250565b5f614921600a836148dd565b915061492c826148ed565b602082019050919050565b5f6020820190508181035f83015261494e81614915565b9050919050565b7f496e76616c6964206f776e6572000000000000000000000000000000000000005f82015250565b5f614989600d836148dd565b915061499482614955565b602082019050919050565b5f6020820190508181035f8301526149b68161497d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6149f482614537565b91506149ff83614537565b925082820390506fffffffffffffffffffffffffffffffff811115614a2757614a266149bd565b5b92915050565b5f614a3782614537565b9150614a4283614537565b925082820190506fffffffffffffffffffffffffffffffff811115614a6a57614a696149bd565b5b92915050565b5f614a7a82613f0d565b91505f8203614a8c57614a8b6149bd565b5b600182039050919050565b5f606082019050614aaa5f830186614435565b614ab76020830185614435565b614ac46040830184614063565b949350505050565b7f5a65726f206164647265737300000000000000000000000000000000000000005f82015250565b5f614b00600c836148dd565b9150614b0b82614acc565b602082019050919050565b5f6020820190508181035f830152614b2d81614af4565b9050919050565b7f4e6f207374616b656420746f6b656e73000000000000000000000000000000005f82015250565b5f614b686010836148dd565b9150614b7382614b34565b602082019050919050565b5f6020820190508181035f830152614b9581614b5c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f614bd382613f0d565b9150614bde83613f0d565b9250828201905080821115614bf657614bf56149bd565b5b92915050565b7f456d7074792061727261790000000000000000000000000000000000000000005f82015250565b5f614c30600b836148dd565b9150614c3b82614bfc565b602082019050919050565b5f6020820190508181035f830152614c5d81614c24565b9050919050565b7f4d617820353020706572207472616e73616374696f6e000000000000000000005f82015250565b5f614c986016836148dd565b9150614ca382614c64565b602082019050919050565b5f6020820190508181035f830152614cc581614c8c565b9050919050565b5f81519050614cda81613f9b565b92915050565b5f60208284031215614cf557614cf4613f05565b5b5f614d0284828501614ccc565b91505092915050565b7f4e6f7420746f6b656e206f776e657200000000000000000000000000000000005f82015250565b5f614d3f600f836148dd565b9150614d4a82614d0b565b602082019050919050565b5f6020820190508181035f830152614d6c81614d33565b9050919050565b7f416c7265616479207374616b65640000000000000000000000000000000000005f82015250565b5f614da7600e836148dd565b9150614db282614d73565b602082019050919050565b5f6020820190508181035f830152614dd481614d9b565b9050919050565b5f614de582613f0d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e1757614e166149bd565b5b600182019050919050565b5f5ffd5b82818337505050565b5f614e3a8385614295565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614e6d57614e6c614e22565b5b602083029250614e7e838584614e26565b82840190509392505050565b5f6040820190508181035f830152614ea3818587614e2f565b9050614eb26020830184614063565b949350505050565b7f4f6e6c79204375626f696473204e4654732061636365707465640000000000005f82015250565b5f614eee601a836148dd565b9150614ef982614eba565b602082019050919050565b5f6020820190508181035f830152614f1b81614ee2565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614f5982613f0d565b9150614f6483613f0d565b925082614f7457614f73614f22565b5b828204905092915050565b5f614f8982613f0d565b9150614f9483613f0d565b9250828202614fa281613f0d565b91508282048414831517614fb957614fb86149bd565b5b5092915050565b5f614fca82613f0d565b9150614fd583613f0d565b9250828203905081811115614fed57614fec6149bd565b5b92915050565b7f4e6f7420617574686f72697a6564207370656e646572000000000000000000005f82015250565b5f6150276016836148dd565b915061503282614ff3565b602082019050919050565b5f6020820190508181035f8301526150548161501b565b9050919050565b7f536e617073686f7420646f6573206e6f742065786973740000000000000000005f82015250565b5f61508f6017836148dd565b915061509a8261505b565b602082019050919050565b5f6020820190508181035f8301526150bc81615083565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e6f7420796f757220746f6b656e0000000000000000000000000000000000005f82015250565b5f615124600e836148dd565b915061512f826150f0565b602082019050919050565b5f6020820190508181035f83015261515181615118565b9050919050565b7f4c656e677468206d69736d6174636800000000000000000000000000000000005f82015250565b5f61518c600f836148dd565b915061519782615158565b602082019050919050565b5f6020820190508181035f8301526151b981615180565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b7f496e73756666696369656e7420706f696e7473000000000000000000000000005f82015250565b5f6152216013836148dd565b915061522c826151ed565b602082019050919050565b5f6020820190508181035f83015261524e81615215565b905091905056fea2646970667358221220a4054881f95e6576bac7ebe283ea13b266ea28fe4c6b610fd266c2da41bd615d64736f6c6343000822003300000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f25
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610397575f3560e01c806383c13db2116101e7578063c7dc319b1161010d578063dd0e08c5116100ab578063f09cc60d1161007a578063f09cc60d14610b57578063f2fde38b14610b87578063f444694014610ba3578063fcc4874c14610bbf57610397565b8063dd0e08c514610acf578063de22763214610aff578063e0f191c014610b1d578063e449f34114610b3b57610397565b8063d63e4386116100e7578063d63e438614610a1e578063d6565a2d14610a4e578063d706541d14610a7f578063da515dc114610ab357610397565b8063c7dc319b1461098b578063d2454e8d146109bb578063d5a44f86146109eb57610397565b806397260d9511610185578063b1224ab311610154578063b1224ab3146108f1578063baa51f861461090d578063c4950aab1461093d578063c659c82d1461096d57610397565b806397260d9514610831578063a1190a0214610861578063a8949b4614610891578063ac86e186146108c157610397565b80638da5cb5b116101c15780638da5cb5b146107a8578063918d2428146107c657806394cbdbe0146107e257806396911e7a1461081557610397565b806383c13db21461075057806383f158b5146107805780638456cb591461079e57610397565b80632a48cfa4116102cc5780635c975abb1161026a57806374aa9b3c1161023957806374aa9b3c146106af5780637629f014146106e45780637f067c3f14610714578063817b1cd21461073257610397565b80635c975abb1461063957806363c28db114610657578063675718b814610687578063715018a6146106a557610397565b80633f27a04f116102a65780633f27a04f146105d55780633f4ba83a146105f35780634ef127b1146105fd578063505dbfab1461061b57610397565b80632a48cfa41461057d578063315261f21461059b5780633e867261146105b957610397565b806310bba86411610339578063150b7a0211610313578063150b7a02146104e3578063168d0cdd146105135780631f4fc8c31461052f57806325f09e611461055f57610397565b806310bba8641461047757806312d3f8561461049557806313c8e2de146104b357610397565b806306c0989d1161037557806306c0989d146103dd578063098ab6a11461040d5780630fbf0a931461042b5780631088ce901461044757610397565b8063012ce5011461039b578063042f1ba7146103b757806304d092c7146103d3575b5f5ffd5b6103b560048036038101906103b09190613f40565b610bef565b005b6103d160048036038101906103cc9190613ffa565b610ee7565b005b6103db611003565b005b6103f760048036038101906103f29190614038565b611195565b6040516104049190614072565b60405180910390f35b6104156111aa565b6040516104229190614072565b60405180910390f35b610445600480360381019061044091906140ec565b6111b0565b005b610461600480360381019061045c9190614038565b611653565b60405161046e9190614072565b60405180910390f35b61047f6116ac565b60405161048c9190614072565b60405180910390f35b61049d6116b8565b6040516104aa9190614072565b60405180910390f35b6104cd60048036038101906104c89190613f40565b6116bf565b6040516104da9190614072565b60405180910390f35b6104fd60048036038101906104f8919061418c565b611716565b60405161050a919061424a565b60405180910390f35b61052d600480360381019061052891906140ec565b6117b8565b005b61054960048036038101906105449190614038565b611a0c565b6040516105569190614072565b60405180910390f35b610567611a30565b6040516105749190614072565b60405180910390f35b610585611a36565b6040516105929190614072565b60405180910390f35b6105a3611a40565b6040516105b09190614072565b60405180910390f35b6105d360048036038101906105ce9190613f40565b611a47565b005b6105dd611b3c565b6040516105ea9190614072565b60405180910390f35b6105fb611b42565b005b610605611b54565b6040516106129190614072565b60405180910390f35b610623611b5e565b6040516106309190614072565b60405180910390f35b610641611b65565b60405161064e9190614272565b60405180910390f35b610671600480360381019061066c9190614038565b611b79565b60405161067e9190614342565b60405180910390f35b61068f611c0c565b60405161069c9190614072565b60405180910390f35b6106ad611c12565b005b6106c960048036038101906106c49190614038565b611c25565b6040516106db96959493929190614362565b60405180910390f35b6106fe60048036038101906106f99190613f40565b611ea2565b60405161070b9190614072565b60405180910390f35b61071c612021565b6040516107299190614072565b60405180910390f35b61073a612027565b6040516107479190614072565b60405180910390f35b61076a60048036038101906107659190614038565b61202d565b6040516107779190614072565b60405180910390f35b610788612076565b604051610795919061441c565b60405180910390f35b6107a661209a565b005b6107b06120ac565b6040516107bd9190614444565b60405180910390f35b6107e060048036038101906107db919061445d565b6120d4565b005b6107fc60048036038101906107f79190613f40565b61224b565b60405161080c94939291906144b6565b60405180910390f35b61082f600480360381019061082a919061445d565b6122f2565b005b61084b600480360381019061084691906144f9565b612433565b6040516108589190614072565b60405180910390f35b61087b60048036038101906108769190613f40565b612453565b6040516108889190614272565b60405180910390f35b6108ab60048036038101906108a69190614038565b612470565b6040516108b89190614072565b60405180910390f35b6108db60048036038101906108d69190613f40565b612485565b6040516108e89190614444565b60405180910390f35b61090b600480360381019061090691906140ec565b6124c0565b005b61092760048036038101906109229190613f40565b6127a6565b6040516109349190614272565b60405180910390f35b61095760048036038101906109529190614038565b6127cf565b6040516109649190614072565b60405180910390f35b6109756128b5565b6040516109829190614072565b60405180910390f35b6109a560048036038101906109a091906144f9565b6128bb565b6040516109b29190614072565b60405180910390f35b6109d560048036038101906109d09190614038565b612945565b6040516109e29190614272565b60405180910390f35b610a056004803603810190610a009190613f40565b612962565b604051610a159493929190614561565b60405180910390f35b610a386004803603810190610a3391906144f9565b6129f0565b604051610a459190614072565b60405180910390f35b610a686004803603810190610a639190613f40565b612a8d565b604051610a769291906145a4565b60405180910390f35b610a996004803603810190610a9491906140ec565b612ad4565b604051610aaa959493929190614739565b60405180910390f35b610acd6004803603810190610ac891906147ad565b612dfb565b005b610ae96004803603810190610ae49190613f40565b612fc1565b604051610af69190614072565b60405180910390f35b610b07613164565b604051610b149190614072565b60405180910390f35b610b2561316a565b604051610b329190614072565b60405180910390f35b610b556004803603810190610b5091906140ec565b613171565b005b610b716004803603810190610b6c9190613f40565b613538565b604051610b7e9190614072565b60405180910390f35b610ba16004803603810190610b9c9190614038565b61354d565b005b610bbd6004803603810190610bb8919061485f565b6135d1565b005b610bd96004803603810190610bd491906144f9565b6137f8565b604051610be69190614072565b60405180910390f35b610bf7613818565b610bff61389f565b5f60015f8381526020019081526020015f209050806002015f9054906101000a900460ff16610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a90614937565b60405180910390fd5b5f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee9061499f565b60405180910390fd5b610d0183826138c1565b505f826001015f9054906101000a90046fffffffffffffffffffffffffffffffff1642610d2e91906149ea565b9050808360010160108282829054906101000a90046fffffffffffffffffffffffffffffffff16610d5f9190614a2d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505f836002015f6101000a81548160ff0219169083151502179055505f836001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550610df4828561394a565b60055f815480929190610e0690614a70565b91905055507f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f2573ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff1660e01b8152600401610e6893929190614a97565b5f604051808303815f87803b158015610e7f575f5ffd5b505af1158015610e91573d5f5f3e3d5ffd5b505050508173ffffffffffffffffffffffffffffffffffffffff16847fe45d6a07d2c0fb8434c56ef7edc1da4b054c2713283d9b501a07c559db36467e60405160405180910390a3505050610ee4613a50565b50565b610eef613818565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5490614b16565b60405180910390fd5b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fae147a7c9fb958af671f40fcdd8c9317dd78c17d572aeb8fb41010846c4a45c882604051610ff79190614272565b60405180910390a25050565b61100b61389f565b611013613a6a565b5f60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561109957602002820191905f5260205f20905b815481526020019060010190808311611085575b505050505090505f8151116110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90614b7e565b60405180910390fd5b5f5f90505f5f90505b82518110156111315761111983828151811061110b5761110a614b9c565b5b6020026020010151336138c1565b826111249190614bc9565b91508060010190506110ec565b505f811115611189573373ffffffffffffffffffffffffffffffffffffffff167f3a18fec58b4855f99fb3bbdecafa3982e86acfcd89de889f1396c1bfc3bfb686826040516111809190614072565b60405180910390a25b5050611193613a50565b565b6006602052805f5260405f205f915090505481565b600d5481565b6111b861389f565b6111c0613a6a565b5f8282905090505f8111611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120090614c46565b60405180910390fd5b603281111561124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124490614cae565b60405180910390fd5b5f5f90505b818110156115f3575f84848381811061126e5761126d614b9c565b5b9050602002013590503373ffffffffffffffffffffffffffffffffffffffff167f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f2573ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016112e79190614072565b602060405180830381865afa158015611302573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113269190614ce0565b73ffffffffffffffffffffffffffffffffffffffff161461137c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137390614d55565b60405180910390fd5b5f60015f8381526020019081526020015f209050806002015f9054906101000a900460ff16156113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890614dbd565b60405180910390fd5b33815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042816001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001816002015f6101000a81548160ff0219169083151502179055504260075f8481526020019081526020015f208190555060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905060035f8481526020019081526020015f208190555060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f909190919091505560055f81548092919061155790614ddb565b91905055507f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f2573ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016115b993929190614a97565b5f604051808303815f87803b1580156115d0575f5ffd5b505af11580156115e2573d5f5f3e3d5ffd5b505050508260010192505050611252565b503373ffffffffffffffffffffffffffffffffffffffff167ff2dcf2c2203868ea22146a870b3a09ccabe0a475657c9a03083b1b060fb0dc5184844260405161163e93929190614e8a565b60405180910390a25061164f613a50565b5050565b5f61165d826127cf565b60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546116a59190614bc9565b9050919050565b670de0b6b3a764000081565b62093a8081565b5f5f6116ca83611ea2565b90505f6116d682613aab565b905060045f8581526020019081526020015f205f9054906101000a900460ff161561170c57611388816117099190614bc9565b90505b8092505050919050565b5f7f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f2573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90614f04565b60405180910390fd5b63150b7a0260e01b905095945050505050565b6117c0613818565b5f600d549050600d5f8154809291906117d890614ddb565b91905055506040518060400160405280426fffffffffffffffffffffffffffffffff16815260200160011515815250600a5f8381526020019081526020015f205f820151815f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506020820151815f0160106101000a81548160ff0219169083151502179055509050505f5f90505b838390508110156119ce575f84848381811061189a57611899614b9c565b5b9050602002013590505f73ffffffffffffffffffffffffffffffffffffffff1660015f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119c257611911816116bf565b600b5f8581526020019081526020015f205f8381526020019081526020015f20819055505f60015f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f600c5f8681526020019081526020015f205f8481526020019081526020015f2054036119c05761199b81611653565b600c5f8681526020019081526020015f205f8481526020019081526020015f20819055505b505b8160010191505061187b565b50807f3b5ce8b2d475067181f949f668899c93f26f0b25c5f8712ebca6b4b93d92989d426040516119ff9190614072565b60405180910390a2505050565b5f670de0b6b3a7640000611a1f83611653565b611a299190614f4f565b9050919050565b61271081565b65d287fb79cd0981565b624f1a0081565b611a4f61389f565b611a57613a6a565b5f670de0b6b3a764000082611a6c9190614f7f565b9050611a783382613b07565b8060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611ac49190614bc9565b925050819055503373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f0b3ef45f7821bcca9433bcfc8b5b7309f7950f929d64030fafec7b3cf9a29dbd83604051611b289190614072565b60405180910390a350611b39613a50565b50565b61445c81565b611b4a613818565b611b52613cab565b565b656943fdbce68481565b62278d0081565b5f5f5f9054906101000a900460ff16905090565b606060025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015611c0057602002820191905f5260205f20905b815481526020019060010190808311611bec575b50505050509050919050565b6130d481565b611c1a613818565b611c235f613d0b565b565b5f5f5f5f5f5f5f60065f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f611c76896127cf565b9050670de0b6b3a764000082611c8c9190614f4f565b9750670de0b6b3a764000081611ca29190614f4f565b9650670de0b6b3a76400008183611cb99190614bc9565b611cc39190614f4f565b9550670de0b6b3a764000060085f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611d169190614f4f565b945060025f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905093505f60025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015611de157602002820191905f5260205f20905b815481526020019060010190808311611dcd575b505050505090505f5f90505f5f90505b8251811015611e7e5760045f848381518110611e1057611e0f614b9c565b5b602002602001015181526020019081526020015f205f9054906101000a900460ff16611e505762015180656943fdbce684611e4b9190614f7f565b611e66565b6201518065d287fb79cd09611e659190614f7f565b5b82611e719190614bc9565b9150806001019050611df1565b50670de0b6b3a764000081611e939190614f4f565b94505050505091939550919395565b5f5f60015f8481526020019081526020015f206040518060800160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900460ff16151515158152505090505f81604001516fffffffffffffffffffffffffffffffff1690508160600151156120175781602001516fffffffffffffffffffffffffffffffff16426120099190614fc0565b816120149190614bc9565b90505b8092505050919050565b61138881565b60055481565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490509050919050565b7f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f2581565b6120a2613818565b6120aa613dce565b565b5f5f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6120dc61389f565b60095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c9061503d565b60405180910390fd5b5f670de0b6b3a76400008261217a9190614f7f565b90506121868382613b07565b8060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546121d29190614bc9565b925050819055503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f0b3ef45f7821bcca9433bcfc8b5b7309f7950f929d64030fafec7b3cf9a29dbd836040516122369190614072565b60405180910390a350612247613a50565b5050565b5f5f5f5f5f61225986611ea2565b9050620151808161226a9190614f4f565b9250612275866116bf565b935060045f8781526020019081526020015f205f9054906101000a900460ff1691506276a70081106122aa57600494506122ea565b624f1a0081106122bd57600394506122e9565b62278d0081106122d057600294506122e8565b62093a8081106122e357600194506122e7565b5f94505b5b5b5b509193509193565b6122fa613818565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f90614b16565b60405180910390fd5b670de0b6b3a76400008161237c9190614f7f565b60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546123c79190614bc9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f3a18fec58b4855f99fb3bbdecafa3982e86acfcd89de889f1396c1bfc3bfb686670de0b6b3a76400008361241a9190614f7f565b6040516124279190614072565b60405180910390a25050565b600c602052815f5260405f20602052805f5260405f205f91509150505481565b6004602052805f5260405f205f915054906101000a900460ff1681565b6008602052805f5260405f205f915090505481565b5f60015f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6124c8613818565b6124d061389f565b5f5f90505b82829050811015612799575f8383838181106124f4576124f3614b9c565b5b9050602002013590505f60015f8381526020019081526020015f209050806002015f9054906101000a900460ff16801561257c57505f73ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b1561278c575f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506125b183826138c1565b505f826001015f9054906101000a90046fffffffffffffffffffffffffffffffff16426125de91906149ea565b9050808360010160108282829054906101000a90046fffffffffffffffffffffffffffffffff1661260f9190614a2d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505f836002015f6101000a81548160ff0219169083151502179055505f836001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506126a4828561394a565b60055f8154809291906126b690614a70565b91905055507f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f2573ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff1660e01b815260040161271893929190614a97565b5f604051808303815f87803b15801561272f575f5ffd5b505af1158015612741573d5f5f3e3d5ffd5b505050508173ffffffffffffffffffffffffffffffffffffffff16847fe45d6a07d2c0fb8434c56ef7edc1da4b054c2713283d9b501a07c559db36467e60405160405180910390a350505b82600101925050506124d5565b506127a2613a50565b5050565b5f60015f8381526020019081526020015f206002015f9054906101000a900460ff169050919050565b5f5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561285657602002820191905f5260205f20905b815481526020019060010190808311612842575b505050505090505f5f90505f5f90505b82518110156128aa5761289283828151811061288557612884614b9c565b5b6020026020010151612fc1565b8261289d9190614bc9565b9150806001019050612866565b508092505050919050565b614e2081565b5f600a5f8481526020019081526020015f205f0160109054906101000a900460ff1661291c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612913906150a5565b60405180910390fd5b600b5f8481526020019081526020015f205f8381526020019081526020015f2054905092915050565b6009602052805f5260405f205f915054906101000a900460ff1681565b6001602052805f5260405f205f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015f9054906101000a90046fffffffffffffffffffffffffffffffff16908060010160109054906101000a90046fffffffffffffffffffffffffffffffff1690806002015f9054906101000a900460ff16905084565b5f600a5f8481526020019081526020015f205f0160109054906101000a900460ff16612a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a48906150a5565b60405180910390fd5b670de0b6b3a7640000600c5f8581526020019081526020015f205f8481526020019081526020015f2054612a859190614f4f565b905092915050565b600a602052805f5260405f205f91509050805f015f9054906101000a90046fffffffffffffffffffffffffffffffff1690805f0160109054906101000a900460ff16905082565b60608060608060605f8787905090508067ffffffffffffffff811115612afd57612afc6150c3565b5b604051908082528060200260200182016040528015612b2b5781602001602082028036833780820191505090505b5095508067ffffffffffffffff811115612b4857612b476150c3565b5b604051908082528060200260200182016040528015612b765781602001602082028036833780820191505090505b5094508067ffffffffffffffff811115612b9357612b926150c3565b5b604051908082528060200260200182016040528015612bc15781602001602082028036833780820191505090505b5093508067ffffffffffffffff811115612bde57612bdd6150c3565b5b604051908082528060200260200182016040528015612c0c5781602001602082028036833780820191505090505b5092508067ffffffffffffffff811115612c2957612c286150c3565b5b604051908082528060200260200182016040528015612c575781602001602082028036833780820191505090505b5091505f5f90505b81811015612def575f898983818110612c7b57612c7a614b9c565b5b905060200201359050612c8d816116bf565b888381518110612ca057612c9f614b9c565b5b60200260200101818152505060015f8281526020019081526020015f206002015f9054906101000a900460ff16878381518110612ce057612cdf614b9c565b5b60200260200101901515908115158152505060015f8281526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868381518110612d3857612d37614b9c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505062015180612d7f82611ea2565b612d899190614f4f565b858381518110612d9c57612d9b614b9c565b5b602002602001018181525050670de0b6b3a7640000612dba82612fc1565b612dc49190614f4f565b848381518110612dd757612dd6614b9c565b5b60200260200101818152505081600101915050612c5f565b50509295509295909350565b612e03613818565b600a5f8481526020019081526020015f205f0160109054906101000a900460ff16612e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5a906150a5565b60405180910390fd5b5f5f90505b82829050811015612fbb575f838383818110612e8757612e86614b9c565b5b9050602002013590505f73ffffffffffffffffffffffffffffffffffffffff1660015f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612faf57612efe816116bf565b600b5f8781526020019081526020015f205f8381526020019081526020015f20819055505f60015f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f600c5f8881526020019081526020015f205f8481526020019081526020015f205403612fad57612f8881611653565b600c5f8881526020019081526020015f205f8481526020019081526020015f20819055505b505b81600101915050612e68565b50505050565b5f5f60015f8481526020019081526020015f206040518060800160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900460ff161515151581525050905080606001516130f4575f91505061315f565b5f60075f8581526020019081526020015f2054426131129190614fc0565b90505f60045f8681526020019081526020015f205f9054906101000a900460ff1661314357656943fdbce68461314b565b65d287fb79cd095b905080826131599190614f7f565b93505050505b919050565b613a9881565b6276a70081565b61317961389f565b613181613a6a565b5f8282905090505f81116131ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c190614c46565b60405180910390fd5b603281111561320e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320590614cae565b60405180910390fd5b5f5f90505b818110156134d8575f84848381811061322f5761322e614b9c565b5b9050602002013590505f60015f8381526020019081526020015f209050806002015f9054906101000a900460ff1661329c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329390614937565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461332c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133239061513a565b60405180910390fd5b61333682336138c1565b505f816001015f9054906101000a90046fffffffffffffffffffffffffffffffff164261336391906149ea565b9050808260010160108282829054906101000a90046fffffffffffffffffffffffffffffffff166133949190614a2d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505f826002015f6101000a81548160ff0219169083151502179055505f826001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550613429338461394a565b60055f81548092919061343b90614a70565b91905055507f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f2573ffffffffffffffffffffffffffffffffffffffff166323b872dd3033866040518463ffffffff1660e01b815260040161349d93929190614a97565b5f604051808303815f87803b1580156134b4575f5ffd5b505af11580156134c6573d5f5f3e3d5ffd5b50505050836001019350505050613213565b503373ffffffffffffffffffffffffffffffffffffffff167fe788e4bc271e1c72b4230407aea7fbea360cb4ed631b438d8de2ea619505e8d184844260405161352393929190614e8a565b60405180910390a250613534613a50565b5050565b6007602052805f5260405f205f915090505481565b613555613818565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036135c5575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016135bc9190614444565b60405180910390fd5b6135ce81613d0b565b50565b6135d9613818565b818190508484905014613621576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613618906151a2565b60405180910390fd5b5f5f90505b848490508110156137f1575f73ffffffffffffffffffffffffffffffffffffffff1685858381811061365b5761365a614b9c565b5b90506020020160208101906136709190614038565b73ffffffffffffffffffffffffffffffffffffffff16036136c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136bd90614b16565b60405180910390fd5b5f670de0b6b3a76400008484848181106136e3576136e2614b9c565b5b905060200201356136f49190614f7f565b90508060065f88888681811061370d5761370c614b9c565b5b90506020020160208101906137229190614038565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546137699190614bc9565b9250508190555085858381811061378357613782614b9c565b5b90506020020160208101906137989190614038565b73ffffffffffffffffffffffffffffffffffffffff167f3a18fec58b4855f99fb3bbdecafa3982e86acfcd89de889f1396c1bfc3bfb686826040516137dd9190614072565b60405180910390a281600101915050613626565b5050505050565b600b602052815f5260405f20602052805f5260405f205f91509150505481565b613820613e2f565b73ffffffffffffffffffffffffffffffffffffffff1661383e6120ac565b73ffffffffffffffffffffffffffffffffffffffff161461389d57613861613e2f565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016138949190614444565b60405180910390fd5b565b6138a7613e36565b60026138b96138b4613e77565b613ea0565b5f0181905550565b5f5f6138cc84612fc1565b90505f811115613940578060065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546139229190614bc9565b925050819055504260075f8681526020019081526020015f20819055505b8091505092915050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f60035f8481526020019081526020015f205490505f600183805490506139b19190614fc0565b9050808214613a11575f8382815481106139ce576139cd614b9c565b5b905f5260205f2001549050808484815481106139ed576139ec614b9c565b5b905f5260205f2001819055508260035f8381526020019081526020015f2081905550505b82805480613a2257613a216151c0565b5b600190038181905f5260205f20015f9055905560035f8581526020019081526020015f205f90555050505050565b6001613a62613a5d613e77565b613ea0565b5f0181905550565b613a72611b65565b15613aa9576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6276a7008210613ac057614e209050613b02565b624f1a008210613ad45761445c9050613b02565b62278d008210613ae857613a989050613b02565b62093a808210613afc576130d49050613b02565b61271090505b919050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015613b8d57602002820191905f5260205f20905b815481526020019060010190808311613b79575b505050505090505f5f90505b8151811015613bd257613bc6828281518110613bb857613bb7614b9c565b5b6020026020010151856138c1565b50806001019050613b99565b508160065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015613c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c4a90615237565b60405180910390fd5b8160065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613c9f9190614fc0565b92505081905550505050565b613cb3613ea9565b5f5f5f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613cf4613e2f565b604051613d019190614444565b60405180910390a1565b5f5f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613dd6613a6a565b60015f5f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613e18613e2f565b604051613e259190614444565b60405180910390a1565b5f33905090565b613e3e613ee9565b15613e75576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005f1b905090565b5f819050919050565b613eb1611b65565b613ee7576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6002613efc613ef7613e77565b613ea0565b5f015414905090565b5f5ffd5b5f5ffd5b5f819050919050565b613f1f81613f0d565b8114613f29575f5ffd5b50565b5f81359050613f3a81613f16565b92915050565b5f60208284031215613f5557613f54613f05565b5b5f613f6284828501613f2c565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613f9482613f6b565b9050919050565b613fa481613f8a565b8114613fae575f5ffd5b50565b5f81359050613fbf81613f9b565b92915050565b5f8115159050919050565b613fd981613fc5565b8114613fe3575f5ffd5b50565b5f81359050613ff481613fd0565b92915050565b5f5f604083850312156140105761400f613f05565b5b5f61401d85828601613fb1565b925050602061402e85828601613fe6565b9150509250929050565b5f6020828403121561404d5761404c613f05565b5b5f61405a84828501613fb1565b91505092915050565b61406c81613f0d565b82525050565b5f6020820190506140855f830184614063565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126140ac576140ab61408b565b5b8235905067ffffffffffffffff8111156140c9576140c861408f565b5b6020830191508360208202830111156140e5576140e4614093565b5b9250929050565b5f5f6020838503121561410257614101613f05565b5b5f83013567ffffffffffffffff81111561411f5761411e613f09565b5b61412b85828601614097565b92509250509250929050565b5f5f83601f84011261414c5761414b61408b565b5b8235905067ffffffffffffffff8111156141695761416861408f565b5b60208301915083600182028301111561418557614184614093565b5b9250929050565b5f5f5f5f5f608086880312156141a5576141a4613f05565b5b5f6141b288828901613fb1565b95505060206141c388828901613fb1565b94505060406141d488828901613f2c565b935050606086013567ffffffffffffffff8111156141f5576141f4613f09565b5b61420188828901614137565b92509250509295509295909350565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61424481614210565b82525050565b5f60208201905061425d5f83018461423b565b92915050565b61426c81613fc5565b82525050565b5f6020820190506142855f830184614263565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6142bd81613f0d565b82525050565b5f6142ce83836142b4565b60208301905092915050565b5f602082019050919050565b5f6142f08261428b565b6142fa8185614295565b9350614305836142a5565b805f5b8381101561433557815161431c88826142c3565b9750614327836142da565b925050600181019050614308565b5085935050505092915050565b5f6020820190508181035f83015261435a81846142e6565b905092915050565b5f60c0820190506143755f830189614063565b6143826020830188614063565b61438f6040830187614063565b61439c6060830186614063565b6143a96080830185614063565b6143b660a0830184614063565b979650505050505050565b5f819050919050565b5f6143e46143df6143da84613f6b565b6143c1565b613f6b565b9050919050565b5f6143f5826143ca565b9050919050565b5f614406826143eb565b9050919050565b614416816143fc565b82525050565b5f60208201905061442f5f83018461440d565b92915050565b61443e81613f8a565b82525050565b5f6020820190506144575f830184614435565b92915050565b5f5f6040838503121561447357614472613f05565b5b5f61448085828601613fb1565b925050602061449185828601613f2c565b9150509250929050565b5f60ff82169050919050565b6144b08161449b565b82525050565b5f6080820190506144c95f8301876144a7565b6144d66020830186614063565b6144e36040830185614063565b6144f06060830184614263565b95945050505050565b5f5f6040838503121561450f5761450e613f05565b5b5f61451c85828601613f2c565b925050602061452d85828601613f2c565b9150509250929050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b61455b81614537565b82525050565b5f6080820190506145745f830187614435565b6145816020830186614552565b61458e6040830185614552565b61459b6060830184614263565b95945050505050565b5f6040820190506145b75f830185614552565b6145c46020830184614263565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6145fd81613fc5565b82525050565b5f61460e83836145f4565b60208301905092915050565b5f602082019050919050565b5f614630826145cb565b61463a81856145d5565b9350614645836145e5565b805f5b8381101561467557815161465c8882614603565b97506146678361461a565b925050600181019050614648565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6146b481613f8a565b82525050565b5f6146c583836146ab565b60208301905092915050565b5f602082019050919050565b5f6146e782614682565b6146f1818561468c565b93506146fc8361469c565b805f5b8381101561472c57815161471388826146ba565b975061471e836146d1565b9250506001810190506146ff565b5085935050505092915050565b5f60a0820190508181035f83015261475181886142e6565b905081810360208301526147658187614626565b9050818103604083015261477981866146dd565b9050818103606083015261478d81856142e6565b905081810360808301526147a181846142e6565b90509695505050505050565b5f5f5f604084860312156147c4576147c3613f05565b5b5f6147d186828701613f2c565b935050602084013567ffffffffffffffff8111156147f2576147f1613f09565b5b6147fe86828701614097565b92509250509250925092565b5f5f83601f84011261481f5761481e61408b565b5b8235905067ffffffffffffffff81111561483c5761483b61408f565b5b60208301915083602082028301111561485857614857614093565b5b9250929050565b5f5f5f5f6040858703121561487757614876613f05565b5b5f85013567ffffffffffffffff81111561489457614893613f09565b5b6148a08782880161480a565b9450945050602085013567ffffffffffffffff8111156148c3576148c2613f09565b5b6148cf87828801614097565b925092505092959194509250565b5f82825260208201905092915050565b7f4e6f74207374616b6564000000000000000000000000000000000000000000005f82015250565b5f614921600a836148dd565b915061492c826148ed565b602082019050919050565b5f6020820190508181035f83015261494e81614915565b9050919050565b7f496e76616c6964206f776e6572000000000000000000000000000000000000005f82015250565b5f614989600d836148dd565b915061499482614955565b602082019050919050565b5f6020820190508181035f8301526149b68161497d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6149f482614537565b91506149ff83614537565b925082820390506fffffffffffffffffffffffffffffffff811115614a2757614a266149bd565b5b92915050565b5f614a3782614537565b9150614a4283614537565b925082820190506fffffffffffffffffffffffffffffffff811115614a6a57614a696149bd565b5b92915050565b5f614a7a82613f0d565b91505f8203614a8c57614a8b6149bd565b5b600182039050919050565b5f606082019050614aaa5f830186614435565b614ab76020830185614435565b614ac46040830184614063565b949350505050565b7f5a65726f206164647265737300000000000000000000000000000000000000005f82015250565b5f614b00600c836148dd565b9150614b0b82614acc565b602082019050919050565b5f6020820190508181035f830152614b2d81614af4565b9050919050565b7f4e6f207374616b656420746f6b656e73000000000000000000000000000000005f82015250565b5f614b686010836148dd565b9150614b7382614b34565b602082019050919050565b5f6020820190508181035f830152614b9581614b5c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f614bd382613f0d565b9150614bde83613f0d565b9250828201905080821115614bf657614bf56149bd565b5b92915050565b7f456d7074792061727261790000000000000000000000000000000000000000005f82015250565b5f614c30600b836148dd565b9150614c3b82614bfc565b602082019050919050565b5f6020820190508181035f830152614c5d81614c24565b9050919050565b7f4d617820353020706572207472616e73616374696f6e000000000000000000005f82015250565b5f614c986016836148dd565b9150614ca382614c64565b602082019050919050565b5f6020820190508181035f830152614cc581614c8c565b9050919050565b5f81519050614cda81613f9b565b92915050565b5f60208284031215614cf557614cf4613f05565b5b5f614d0284828501614ccc565b91505092915050565b7f4e6f7420746f6b656e206f776e657200000000000000000000000000000000005f82015250565b5f614d3f600f836148dd565b9150614d4a82614d0b565b602082019050919050565b5f6020820190508181035f830152614d6c81614d33565b9050919050565b7f416c7265616479207374616b65640000000000000000000000000000000000005f82015250565b5f614da7600e836148dd565b9150614db282614d73565b602082019050919050565b5f6020820190508181035f830152614dd481614d9b565b9050919050565b5f614de582613f0d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e1757614e166149bd565b5b600182019050919050565b5f5ffd5b82818337505050565b5f614e3a8385614295565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614e6d57614e6c614e22565b5b602083029250614e7e838584614e26565b82840190509392505050565b5f6040820190508181035f830152614ea3818587614e2f565b9050614eb26020830184614063565b949350505050565b7f4f6e6c79204375626f696473204e4654732061636365707465640000000000005f82015250565b5f614eee601a836148dd565b9150614ef982614eba565b602082019050919050565b5f6020820190508181035f830152614f1b81614ee2565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614f5982613f0d565b9150614f6483613f0d565b925082614f7457614f73614f22565b5b828204905092915050565b5f614f8982613f0d565b9150614f9483613f0d565b9250828202614fa281613f0d565b91508282048414831517614fb957614fb86149bd565b5b5092915050565b5f614fca82613f0d565b9150614fd583613f0d565b9250828203905081811115614fed57614fec6149bd565b5b92915050565b7f4e6f7420617574686f72697a6564207370656e646572000000000000000000005f82015250565b5f6150276016836148dd565b915061503282614ff3565b602082019050919050565b5f6020820190508181035f8301526150548161501b565b9050919050565b7f536e617073686f7420646f6573206e6f742065786973740000000000000000005f82015250565b5f61508f6017836148dd565b915061509a8261505b565b602082019050919050565b5f6020820190508181035f8301526150bc81615083565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e6f7420796f757220746f6b656e0000000000000000000000000000000000005f82015250565b5f615124600e836148dd565b915061512f826150f0565b602082019050919050565b5f6020820190508181035f83015261515181615118565b9050919050565b7f4c656e677468206d69736d6174636800000000000000000000000000000000005f82015250565b5f61518c600f836148dd565b915061519782615158565b602082019050919050565b5f6020820190508181035f8301526151b981615180565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b7f496e73756666696369656e7420706f696e7473000000000000000000000000005f82015250565b5f6152216013836148dd565b915061522c826151ed565b602082019050919050565b5f6020820190508181035f83015261524e81615215565b905091905056fea2646970667358221220a4054881f95e6576bac7ebe283ea13b266ea28fe4c6b610fd266c2da41bd615d64736f6c63430008220033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f25
-----Decoded View---------------
Arg [0] : nftAddress_ (address): 0x15F2C5d9311f7d8D41B40479eA2b5F1361865f25
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f25
Deployed Bytecode Sourcemap
26597:30318:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52251:799;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43987:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40128:500;;;:::i;:::-;;29920:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31042:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33364:1259;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37820:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28205:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27642:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45121:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56610:302;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47079:917;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38161:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27189:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28111:61;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27745:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41669:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27406:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52095:53;;;:::i;:::-;;28022:60;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27693:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19041:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49899:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27253:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22414:103;;;:::i;:::-;;38849:1030;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;44735:298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27560:47;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29413:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50095:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27077:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52040:49;;;:::i;:::-;;21739:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42332:349;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45497:669;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;54307:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30966:69;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29317:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30161:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50470:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53137:941;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50287:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37240:330;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27483:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48863:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30293:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28998:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;49175:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30838:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;50675:969;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;48100:677;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36670:364;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27329:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27797:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34868:1208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30046:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22672:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54772:502;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30890:69;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52251:799;21625:13;:11;:13::i;:::-;14461:21:::1;:19;:21::i;:::-;52337:22:::2;52362:6;:15;52369:7;52362:15;;;;;;;;;;;52337:40;;52396:4;:13;;;;;;;;;;;;52388:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;52437:18;52458:4;:10;;;;;;;;;;;;52437:31;;52509:1;52487:24;;:10;:24;;::::0;52479:50:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;52585:39;52604:7;52613:10;52585:18;:39::i;:::-;;52665:19;52714:4;:13;;;;;;;;;;;;52695:15;52687:40;;;;:::i;:::-;52665:62;;52762:11;52738:4;:20;;;:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52801:5;52784:4;:13;;;:22;;;;;;;;;;;;;;;;;;52834:1;52817:4;:13;;;:18;;;;;;;;;;;;;;;;;;52848:42;52870:10;52882:7;52848:21;:42::i;:::-;52901:11;;:13;;;;;;;;;:::i;:::-;;;;;;52927:10;:23;;;52959:4;52966:10;52978:7;52927:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53031:10;53004:38;;53022:7;53004:38;;;;;;;;;;52326:724;;;14505:20:::1;:18;:20::i;:::-;52251:799:::0;:::o;43987:253::-;21625:13;:11;:13::i;:::-;44108:1:::1;44089:21;;:7;:21;;::::0;44081:46:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;44168:10;44138:18;:27;44157:7;44138:27;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;44212:7;44194:38;;;44221:10;44194:38;;;;;;:::i;:::-;;;;;;;;43987:253:::0;;:::o;40128:500::-;14461:21;:19;:21::i;:::-;18646:19:::1;:17;:19::i;:::-;40198:23:::2;40224:13;:25;40238:10;40224:25;;;;;;;;;;;;;;;40198:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40284:1;40268:6;:13;:17;40260:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;40319:21;40343:1;40319:25;;40360:9;40372:1;40360:13;;40355:158;40379:6;:13;40375:1;:17;40355:158;;;40428:41;40447:6;40454:1;40447:9;;;;;;;;:::i;:::-;;;;;;;;40458:10;40428:18;:41::i;:::-;40411:58;;;;;:::i;:::-;;;40496:3;;;;;40355:158;;;;40545:1;40529:13;:17;40525:96;;;40583:10;40568:41;;;40595:13;40568:41;;;;;;:::i;:::-;;;;;;;;40525:96;40187:441;;14505:20:::0;:18;:20::i;:::-;40128:500::o;29920:49::-;;;;;;;;;;;;;;;;;:::o;31042:28::-;;;;:::o;33364:1259::-;14461:21;:19;:21::i;:::-;18646:19:::1;:17;:19::i;:::-;33455:14:::2;33472:8;;:15;;33455:32;;33515:1;33506:6;:10;33498:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;33562:2;33552:6;:12;;33544:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;33609:9;33621:1;33609:13;;33604:949;33628:6;33624:1;:10;33604:949;;;33653:15;33671:8;;33680:1;33671:11;;;;;;;:::i;:::-;;;;;;;;33653:29;;33736:10;33705:41;;:10;:18;;;33724:7;33705:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;33697:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;33783:22;33808:6;:15;33815:7;33808:15;;;;;;;;;;;33783:40;;33847:4;:13;;;;;;;;;;;;33846:14;33838:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;33963:10;33946:4;:10;;;:27;;;;;;;;;;;;;;;;;;34013:15;33988:4;:13;;;:41;;;;;;;;;;;;;;;;;;34061:4;34044;:13;;;:21;;;;;;;;;;;;;;;;;;34162:15;34132:18;:27;34151:7;34132:27;;;;;;;;;;;:45;;;;34267:13;:25;34281:10;34267:25;;;;;;;;;;;;;;;:32;;;;34238:17;:26;34256:7;34238:26;;;;;;;;;;;:61;;;;34314:13;:25;34328:10;34314:25;;;;;;;;;;;;;;;34345:7;34314:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34370:11;;:13;;;;;;;;;:::i;:::-;;;;;;34448:10;:23;;;34472:10;34492:4;34499:7;34448:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34536:3;;;;;33638:915;;33604:949;;;;34577:10;34570:45;;;34589:8;;34599:15;34570:45;;;;;;;;:::i;:::-;;;;;;;;33444:1179;14505:20:::0;:18;:20::i;:::-;33364:1259;;:::o;37820:136::-;37879:7;37929:19;37943:4;37929:13;:19::i;:::-;37906:14;:20;37921:4;37906:20;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;37899:49;;37820:136;;;:::o;28205:50::-;28251:4;28205:50;:::o;27642:44::-;27680:6;27642:44;:::o;45121:301::-;45177:7;45197:17;45217:26;45235:7;45217:17;:26::i;:::-;45197:46;;45254:13;45270:34;45294:9;45270:23;:34::i;:::-;45254:50;;45319:10;:19;45330:7;45319:19;;;;;;;;;;;;;;;;;;;;;45315:77;;;27603:4;45355:25;;;;;:::i;:::-;;;45315:77;45409:5;45402:12;;;;45121:301;;;:::o;56610:302::-;56754:6;56803:10;56781:33;;:10;:33;;;56773:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;56863:41;;;56856:48;;56610:302;;;;;;;:::o;47079:917::-;21625:13;:11;:13::i;:::-;47156:14:::1;47173:13;;47156:30;;47197:13;;:15;;;;;;;;;:::i;:::-;;;;;;47245:101;;;;;;;;47288:15;47245:101;;;;;;47330:4;47245:101;;;;::::0;47225:9:::1;:17;47235:6;47225:17;;;;;;;;;;;:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47364:9;47376:1;47364:13;;47359:574;47383:8;;:15;;47379:1;:19;47359:574;;;47417:15;47435:8;;47444:1;47435:11;;;;;;;:::i;:::-;;;;;;;;47417:29;;47498:1;47465:35;;:6;:15;47472:7;47465:15;;;;;;;;;;;:21;;;;;;;;;;;;:35;;;47461:429;;47555:17;47564:7;47555:8;:17::i;:::-;47521:14;:22;47536:6;47521:22;;;;;;;;;;;:31;47544:7;47521:31;;;;;;;;;;;:51;;;;47669:18;47690:6;:15;47697:7;47690:15;;;;;;;;;;;:21;;;;;;;;;;;;47669:42;;47769:1;47734:14;:22;47749:6;47734:22;;;;;;;;;;;:31;47757:7;47734:31;;;;;;;;;;;;:36:::0;47730:145:::1;;47829:26;47844:10;47829:14;:26::i;:::-;47795:14;:22;47810:6;47795:22;;;;;;;;;;;:31;47818:7;47795:31;;;;;;;;;;;:60;;;;47730:145;47502:388;47461:429;47916:3;;;;;47402:531;47359:574;;;;47964:6;47950:38;47972:15;47950:38;;;;;;:::i;:::-;;;;;;;;47145:851;47079:917:::0;;:::o;38161:136::-;38224:7;28251:4;38251:20;38266:4;38251:14;:20::i;:::-;:38;;;;:::i;:::-;38244:45;;38161:136;;;:::o;27189:48::-;27232:5;27189:48;:::o;28111:61::-;28157:15;28111:61;:::o;27745:45::-;27783:7;27745:45;:::o;41669:295::-;14461:21;:19;:21::i;:::-;18646:19:::1;:17;:19::i;:::-;41757:17:::2;28251:4;41777:6;:24;;;;:::i;:::-;41757:44;;41812:36;41826:10;41838:9;41812:13;:36::i;:::-;41885:9;41859:10;:22;41870:10;41859:22;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;41945:10;41910:46;;41922:10;41910:46;;;41934:9;41910:46;;;;;;:::i;:::-;;;;;;;;41746:218;14505:20:::0;:18;:20::i;:::-;41669:295;:::o;27406:48::-;27449:5;27406:48;:::o;52095:53::-;21625:13;:11;:13::i;:::-;52135:10:::1;:8;:10::i;:::-;52095:53::o:0;28022:60::-;28067:15;28022:60;:::o;27693:45::-;27731:7;27693:45;:::o;19041:86::-;19088:4;19112:7;;;;;;;;;;;19105:14;;19041:86;:::o;49899:125::-;49961:16;49997:13;:19;50011:4;49997:19;;;;;;;;;;;;;;;49990:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49899:125;;;:::o;27253:48::-;27296:5;27253:48;:::o;22414:103::-;21625:13;:11;:13::i;:::-;22479:30:::1;22506:1;22479:18;:30::i;:::-;22414:103::o:0;38849:1030::-;38919:16;38946:15;38972:13;38996;39020:19;39050:17;39086:19;39108:14;:20;39123:4;39108:20;;;;;;;;;;;;;;;;39086:42;;39139:18;39161:19;39175:4;39161:13;:19::i;:::-;39139:41;;28251:4;39207:11;:29;;;;:::i;:::-;39193:43;;28251:4;39261:10;:28;;;;:::i;:::-;39247:42;;28251:4;39329:10;39315:11;:24;;;;:::i;:::-;39314:44;;;;:::i;:::-;39300:58;;28251:4;39383:10;:16;39394:4;39383:16;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;39369:48;;39442:13;:19;39456:4;39442:19;;;;;;;;;;;;;;;:26;;;;39428:40;;39514:23;39540:13;:19;39554:4;39540:19;;;;;;;;;;;;;;;39514:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39570:16;39589:1;39570:20;;39606:9;39618:1;39606:13;;39601:222;39625:6;:13;39621:1;:17;39601:222;;;39669:10;:21;39680:6;39687:1;39680:9;;;;;;;;:::i;:::-;;;;;;;;39669:21;;;;;;;;;;;;;;;;;;;;;:110;;39774:5;28067:15;39757:22;;;;:::i;:::-;39669:110;;;39732:5;28157:15;39710:27;;;;:::i;:::-;39669:110;39657:122;;;;;:::i;:::-;;;39806:3;;;;;39601:222;;;;28251:4;39845:8;:26;;;;:::i;:::-;39833:38;;39075:804;;;;38849:1030;;;;;;;:::o;44735:298::-;44800:7;44820:21;44844:6;:15;44851:7;44844:15;;;;;;;;;;;44820:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44870:13;44886:4;:20;;;44870:36;;;;44921:4;:13;;;44917:86;;;44978:4;:13;;;44960:31;;:15;:31;;;;:::i;:::-;44951:40;;;;;:::i;:::-;;;44917:86;45020:5;45013:12;;;;44735:298;;;:::o;27560:47::-;27603:4;27560:47;:::o;29413:26::-;;;;:::o;50095:122::-;50156:7;50183:13;:19;50197:4;50183:19;;;;;;;;;;;;;;;:26;;;;50176:33;;50095:122;;;:::o;27077:35::-;;;:::o;52040:49::-;21625:13;:11;:13::i;:::-;52078:8:::1;:6;:8::i;:::-;52040:49::o:0;21739:87::-;21785:7;21812:6;;;;;;;;;;;21805:13;;21739:87;:::o;42332:349::-;14461:21;:19;:21::i;:::-;42424:18:::1;:30;42443:10;42424:30;;;;;;;;;;;;;;;;;;;;;;;;;42416:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42492:17;28251:4;42512:6;:24;;;;:::i;:::-;42492:44;;42547:30;42561:4;42567:9;42547:13;:30::i;:::-;42608:9;42588:10;:16;42599:4;42588:16;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;42662:10;42633:40;;42645:4;42633:40;;;42651:9;42633:40;;;;;;:::i;:::-;;;;;;;;42405:276;14505:20:::0;:18;:20::i;:::-;42332:349;;:::o;45497:669::-;45569:10;45590:13;45614:17;45642:11;45672:17;45692:26;45710:7;45692:17;:26::i;:::-;45672:46;;45753:6;45741:9;:18;;;;:::i;:::-;45729:30;;45778:17;45787:7;45778:8;:17::i;:::-;45770:25;;45815:10;:19;45826:7;45815:19;;;;;;;;;;;;;;;;;;;;;45806:28;;27835:7;45851:9;:24;45847:271;;45884:1;45877:8;;45847:271;;;27783:7;45921:9;:24;45917:201;;45954:1;45947:8;;45917:201;;;27731:7;45984:9;:24;45980:138;;46017:1;46010:8;;45980:138;;;27680:6;46049:9;:24;46045:73;;46082:1;46075:8;;46045:73;;;46117:1;46110:8;;46045:73;45980:138;45917:201;45847:271;45661:505;45497:669;;;;;:::o;54307:253::-;21625:13;:11;:13::i;:::-;54412:1:::1;54396:18;;:4;:18;;::::0;54388:43:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28251:4;54466:6;:24;;;;:::i;:::-;54442:14;:20;54457:4;54442:20;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;54521:4;54506:46;;;28251:4;54527:6;:24;;;;:::i;:::-;54506:46;;;;;;:::i;:::-;;;;;;;;54307:253:::0;;:::o;30966:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29317:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;30161:45::-;;;;;;;;;;;;;;;;;:::o;50470:114::-;50528:7;50555:6;:15;50562:7;50555:15;;;;;;;;;;;:21;;;;;;;;;;;;50548:28;;50470:114;;;:::o;53137:941::-;21625:13;:11;:13::i;:::-;14461:21:::1;:19;:21::i;:::-;53245:9:::2;53257:1;53245:13;;53240:831;53264:8;;:15;;53260:1;:19;53240:831;;;53298:15;53316:8;;53325:1;53316:11;;;;;;;:::i;:::-;;;;;;;;53298:29;;53342:22;53367:6;:15;53374:7;53367:15;;;;;;;;;;;53342:40;;53403:4;:13;;;;;;;;;;;;:41;;;;;53442:1;53420:24;;:4;:10;;;;;;;;;;;;:24;;;;53403:41;53399:627;;;53465:18;53486:4;:10;;;;;;;;;;;;53465:31;;53517:39;53536:7;53545:10;53517:18;:39::i;:::-;;53577:19;53626:4;:13;;;;;;;;;;;;53607:15;53599:40;;;;:::i;:::-;53577:62;;53682:11;53658:4;:20;;;:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53729:5;53712:4;:13;;;:22;;;;;;;;;;;;;;;;;;53770:1;53753:4;:13;;;:18;;;;;;;;;;;;;;;;;;53792:42;53814:10;53826:7;53792:21;:42::i;:::-;53853:11;;:13;;;;;;;;;:::i;:::-;;;;;;53887:10;:23;;;53919:4;53926:10;53938:7;53887:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53999:10;53972:38;;53990:7;53972:38;;;;;;;;;;53446:580;;53399:627;54054:3;;;;;53283:788;;53240:831;;;;14505:20:::1;:18;:20::i;:::-;53137:941:::0;;:::o;50287:114::-;50345:4;50369:6;:15;50376:7;50369:15;;;;;;;;;;;:24;;;;;;;;;;;;50362:31;;50287:114;;;:::o;37240:330::-;37298:7;37318:23;37344:13;:19;37358:4;37344:19;;;;;;;;;;;;;;;37318:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37374:13;37390:1;37374:17;;37407:9;37419:1;37407:13;;37402:138;37426:6;:13;37422:1;:17;37402:138;;;37467:29;37486:6;37493:1;37486:9;;;;;;;;:::i;:::-;;;;;;;;37467:18;:29::i;:::-;37458:38;;;;;:::i;:::-;;;37523:3;;;;;37402:138;;;;37557:5;37550:12;;;;37240:330;;;:::o;27483:48::-;27526:5;27483:48;:::o;48863:219::-;48945:7;48973:9;:17;48983:6;48973:17;;;;;;;;;;;:24;;;;;;;;;;;;48965:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;49043:14;:22;49058:6;49043:22;;;;;;;;;;;:31;49066:7;49043:31;;;;;;;;;;;;49036:38;;48863:219;;;;:::o;30293:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;28998:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49175:238::-;49258:7;49286:9;:17;49296:6;49286:17;;;;;;;;;;;:24;;;;;;;;;;;;49278:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;28251:4;49356:14;:22;49371:6;49356:22;;;;;;;;;;;:31;49379:7;49356:31;;;;;;;;;;;;:49;;;;:::i;:::-;49349:56;;49175:238;;;;:::o;30838:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50675:969::-;50759:23;50793;50827;50861:22;50894:28;50941:14;50958:8;;:15;;50941:32;;51012:6;50998:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50984:35;;51055:6;51044:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51030:32;;51101:6;51087:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51073:35;;51147:6;51133:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51119:35;;51193:6;51179:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51165:35;;51218:9;51230:1;51218:13;;51213:424;51237:6;51233:1;:10;51213:424;;;51262:15;51280:8;;51289:1;51280:11;;;;;;;:::i;:::-;;;;;;;;51262:29;;51323:17;51332:7;51323:8;:17::i;:::-;51306:6;51313:1;51306:9;;;;;;;;:::i;:::-;;;;;;;:34;;;;;51372:6;:15;51379:7;51372:15;;;;;;;;;;;:24;;;;;;;;;;;;51355:6;51362:1;51355:9;;;;;;;;:::i;:::-;;;;;;;:41;;;;;;;;;;;51428:6;:15;51435:7;51428:15;;;;;;;;;;;:21;;;;;;;;;;;;51411:6;51418:1;51411:9;;;;;;;;:::i;:::-;;;;;;;:38;;;;;;;;;;;51510:6;51481:26;51499:7;51481:17;:26::i;:::-;:35;;;;:::i;:::-;51464:5;51470:1;51464:8;;;;;;;;:::i;:::-;;;;;;;:52;;;;;28251:4;51548:27;51567:7;51548:18;:27::i;:::-;:45;;;;:::i;:::-;51531:11;51543:1;51531:14;;;;;;;;:::i;:::-;;;;;;;:62;;;;;51620:3;;;;;51247:390;51213:424;;;;50930:714;50675:969;;;;;;;;:::o;48100:677::-;21625:13;:11;:13::i;:::-;48209:9:::1;:17;48219:6;48209:17;;;;;;;;;;;:24;;;;;;;;;;;;48201:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;48279:9;48291:1;48279:13;;48274:496;48298:8;;:15;;48294:1;:19;48274:496;;;48332:15;48350:8;;48359:1;48350:11;;;;;;;:::i;:::-;;;;;;;;48332:29;;48413:1;48380:35;;:6;:15;48387:7;48380:15;;;;;;;;;;;:21;;;;;;;;;;;;:35;;;48376:351;;48470:17;48479:7;48470:8;:17::i;:::-;48436:14;:22;48451:6;48436:22;;;;;;;;;;;:31;48459:7;48436:31;;;;;;;;;;;:51;;;;48506:18;48527:6;:15;48534:7;48527:15;;;;;;;;;;;:21;;;;;;;;;;;;48506:42;;48606:1;48571:14;:22;48586:6;48571:22;;;;;;;;;;;:31;48594:7;48571:31;;;;;;;;;;;;:36:::0;48567:145:::1;;48666:26;48681:10;48666:14;:26::i;:::-;48632:14;:22;48647:6;48632:22;;;;;;;;;;;:31;48655:7;48632:31;;;;;;;;;;;:60;;;;48567:145;48417:310;48376:351;48753:3;;;;;48317:453;48274:496;;;;48100:677:::0;;;:::o;36670:364::-;36736:7;36756:21;36780:6;:15;36787:7;36780:15;;;;;;;;;;;36756:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36811:4;:13;;;36806:28;;36833:1;36826:8;;;;;36806:28;36847:15;36883:18;:27;36902:7;36883:27;;;;;;;;;;;;36865:15;:45;;;;:::i;:::-;36847:63;;36921:12;36936:10;:19;36947:7;36936:19;;;;;;;;;;;;;;;;;;;;;:58;;28067:15;36936:58;;;28157:15;36936:58;36921:73;;37022:4;37012:7;:14;;;;:::i;:::-;37005:21;;;;;36670:364;;;;:::o;27329:48::-;27372:5;27329:48;:::o;27797:45::-;27835:7;27797:45;:::o;34868:1208::-;14461:21;:19;:21::i;:::-;18646:19:::1;:17;:19::i;:::-;34961:14:::2;34978:8;;:15;;34961:32;;35021:1;35012:6;:10;35004:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;35068:2;35058:6;:12;;35050:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;35115:9;35127:1;35115:13;;35110:894;35134:6;35130:1;:10;35110:894;;;35159:15;35177:8;;35186:1;35177:11;;;;;;;:::i;:::-;;;;;;;;35159:29;;35203:22;35228:6;:15;35235:7;35228:15;;;;;;;;;;;35203:40;;35268:4;:13;;;;;;;;;;;;35260:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;35344:10;35330:24;;:4;:10;;;;;;;;;;;;:24;;;35322:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;35445:39;35464:7;35473:10;35445:18;:39::i;:::-;;35539:19;35588:4;:13;;;;;;;;;;;;35569:15;35561:40;;;;:::i;:::-;35539:62;;35640:11;35616:4;:20;;;:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35683:5;35666:4;:13;;;:22;;;;;;;;;;;;;;;;;;35720:1;35703:4;:13;;;:18;;;;;;;;;;;;;;;;;;35778:42;35800:10;35812:7;35778:21;:42::i;:::-;35835:11;;:13;;;;;;;;;:::i;:::-;;;;;;35899:10;:23;;;35931:4;35938:10;35950:7;35899:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35987:3;;;;;35144:860;;;35110:894;;;;36030:10;36021:47;;;36042:8;;36052:15;36021:47;;;;;;;;:::i;:::-;;;;;;;;34950:1126;14505:20:::0;:18;:20::i;:::-;34868:1208;;:::o;30046:53::-;;;;;;;;;;;;;;;;;:::o;22672:220::-;21625:13;:11;:13::i;:::-;22777:1:::1;22757:22;;:8;:22;;::::0;22753:93:::1;;22831:1;22803:31;;;;;;;;;;;:::i;:::-;;;;;;;;22753:93;22856:28;22875:8;22856:18;:28::i;:::-;22672:220:::0;:::o;54772:502::-;21625:13;:11;:13::i;:::-;54906:7:::1;;:14;;54890:5;;:12;;:30;54882:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54956:9;54968:1;54956:13;;54951:316;54975:5;;:12;;54971:1;:16;54951:316;;;55034:1;55014:22;;:5;;55020:1;55014:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:22;;::::0;55006:47:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;55068:17;28251:4;55088:7;;55096:1;55088:10;;;;;;;:::i;:::-;;;;;;;;:28;;;;:::i;:::-;55068:48;;55159:9;55131:14;:24;55146:5;;55152:1;55146:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55131:24;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;55203:5;;55209:1;55203:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55188:35;;;55213:9;55188:35;;;;;;:::i;:::-;;;;;;;;55250:3;;;;;54991:276;54951:316;;;;54772:502:::0;;;;:::o;30890:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21904:166::-;21975:12;:10;:12::i;:::-;21964:23;;:7;:5;:7::i;:::-;:23;;;21960:103;;22038:12;:10;:12::i;:::-;22011:40;;;;;;;;;;;:::i;:::-;;;;;;;;21960:103;21904:166::o;15211:298::-;15336:25;:23;:25::i;:::-;13826:1;15439:46;:29;:27;:29::i;:::-;:44;:46::i;:::-;:52;;:62;;;;15211:298::o;40769:324::-;40848:7;40868:15;40886:27;40905:7;40886:18;:27::i;:::-;40868:45;;40938:1;40928:7;:11;40924:137;;;40982:7;40956:14;:22;40971:6;40956:22;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;41034:15;41004:18;:27;41023:7;41004:27;;;;;;;;;;;:45;;;;40924:137;41078:7;41071:14;;;40769:324;;;;:::o;55681:523::-;55763:28;55794:13;:19;55808:4;55794:19;;;;;;;;;;;;;;;55763:50;;55824:13;55840:17;:26;55858:7;55840:26;;;;;;;;;;;;55824:42;;55877:17;55917:1;55897:10;:17;;;;:21;;;;:::i;:::-;55877:41;;55944:9;55935:5;:18;55931:193;;55970:19;55992:10;56003:9;55992:21;;;;;;;;:::i;:::-;;;;;;;;;;55970:43;;56048:11;56028:10;56039:5;56028:17;;;;;;;;:::i;:::-;;;;;;;;;:31;;;;56107:5;56074:17;:30;56092:11;56074:30;;;;;;;;;;;:38;;;;55955:169;55931:193;56136:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56170:17;:26;56188:7;56170:26;;;;;;;;;;;56163:33;;;55752:452;;;55681:523;;:::o;15517:257::-;13783:1;15700:46;:29;:27;:29::i;:::-;:44;:46::i;:::-;:52;;:66;;;;15517:257::o;19200:132::-;19266:8;:6;:8::i;:::-;19262:63;;;19298:15;;;;;;;;;;;;;;19262:63;19200:132::o;46174:360::-;46249:7;27835;46273:9;:24;46269:49;;27526:5;46299:19;;;;46269:49;27783:7;46333:9;:24;46329:49;;27449:5;46359:19;;;;46329:49;27731:7;46393:9;:24;46389:49;;27372:5;46419:19;;;;46389:49;27680:6;46453:9;:24;46449:49;;27296:5;46479:19;;;;46449:49;27232:5;46509:17;;46174:360;;;;:::o;42826:468::-;42974:23;43000:13;:19;43014:4;43000:19;;;;;;;;;;;;;;;42974:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43035:9;43047:1;43035:13;;43030:135;43054:6;:13;43050:1;:17;43030:135;;;43086:35;43105:6;43112:1;43105:9;;;;;;;;:::i;:::-;;;;;;;;43116:4;43086:18;:35::i;:::-;;43148:3;;;;;43030:135;;;;43209:9;43185:14;:20;43200:4;43185:20;;;;;;;;;;;;;;;;:33;;43177:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43277:9;43253:14;:20;43268:4;43253:20;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;42891:403;42826:468;;:::o;19942:120::-;18905:16;:14;:16::i;:::-;20011:5:::1;20001:7;;:15;;;;;;;;;;;;;;;;;;20032:22;20041:12;:10;:12::i;:::-;20032:22;;;;;;:::i;:::-;;;;;;;;19942:120::o:0;23052:191::-;23126:16;23145:6;;;;;;;;;;;23126:25;;23171:8;23162:6;;:17;;;;;;;;;;;;;;;;;;23226:8;23195:40;;23216:8;23195:40;;;;;;;;;;;;23115:128;23052:191;:::o;19683:118::-;18646:19;:17;:19::i;:::-;19753:4:::1;19743:7;;:14;;;;;;;;;;;;;;;;;;19773:20;19780:12;:10;:12::i;:::-;19773:20;;;;;;:::i;:::-;;;;;;;;19683:118::o:0;16951:98::-;17004:7;17031:10;17024:17;;16951:98;:::o;15042:161::-;15105:25;:23;:25::i;:::-;15101:95;;;15154:30;;;;;;;;;;;;;;15101:95;15042:161::o;16120:129::-;16190:7;12910:66;16217:24;;16210:31;;16120:129;:::o;9830:167::-;9891:21;9975:4;9965:14;;9830:167;;;:::o;19409:130::-;19473:8;:6;:8::i;:::-;19468:64;;19505:15;;;;;;;;;;;;;;19468:64;19409:130::o;15959:153::-;16017:4;13826:1;16041:46;:29;:27;:29::i;:::-;:44;:46::i;:::-;:52;;;:63;16034:70;;15959:153;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:126::-;1062:7;1102:42;1095:5;1091:54;1080:65;;1025:126;;;:::o;1157:96::-;1194:7;1223:24;1241:5;1223:24;:::i;:::-;1212:35;;1157:96;;;:::o;1259:122::-;1332:24;1350:5;1332:24;:::i;:::-;1325:5;1322:35;1312:63;;1371:1;1368;1361:12;1312:63;1259:122;:::o;1387:139::-;1433:5;1471:6;1458:20;1449:29;;1487:33;1514:5;1487:33;:::i;:::-;1387:139;;;;:::o;1532:90::-;1566:7;1609:5;1602:13;1595:21;1584:32;;1532:90;;;:::o;1628:116::-;1698:21;1713:5;1698:21;:::i;:::-;1691:5;1688:32;1678:60;;1734:1;1731;1724:12;1678:60;1628:116;:::o;1750:133::-;1793:5;1831:6;1818:20;1809:29;;1847:30;1871:5;1847:30;:::i;:::-;1750:133;;;;:::o;1889:468::-;1954:6;1962;2011:2;1999:9;1990:7;1986:23;1982:32;1979:119;;;2017:79;;:::i;:::-;1979:119;2137:1;2162:53;2207:7;2198:6;2187:9;2183:22;2162:53;:::i;:::-;2152:63;;2108:117;2264:2;2290:50;2332:7;2323:6;2312:9;2308:22;2290:50;:::i;:::-;2280:60;;2235:115;1889:468;;;;;:::o;2363:329::-;2422:6;2471:2;2459:9;2450:7;2446:23;2442:32;2439:119;;;2477:79;;:::i;:::-;2439:119;2597:1;2622:53;2667:7;2658:6;2647:9;2643:22;2622:53;:::i;:::-;2612:63;;2568:117;2363:329;;;;:::o;2698:118::-;2785:24;2803:5;2785:24;:::i;:::-;2780:3;2773:37;2698:118;;:::o;2822:222::-;2915:4;2953:2;2942:9;2938:18;2930:26;;2966:71;3034:1;3023:9;3019:17;3010:6;2966:71;:::i;:::-;2822:222;;;;:::o;3050:117::-;3159:1;3156;3149:12;3173:117;3282:1;3279;3272:12;3296:117;3405:1;3402;3395:12;3436:568;3509:8;3519:6;3569:3;3562:4;3554:6;3550:17;3546:27;3536:122;;3577:79;;:::i;:::-;3536:122;3690:6;3677:20;3667:30;;3720:18;3712:6;3709:30;3706:117;;;3742:79;;:::i;:::-;3706:117;3856:4;3848:6;3844:17;3832:29;;3910:3;3902:4;3894:6;3890:17;3880:8;3876:32;3873:41;3870:128;;;3917:79;;:::i;:::-;3870:128;3436:568;;;;;:::o;4010:559::-;4096:6;4104;4153:2;4141:9;4132:7;4128:23;4124:32;4121:119;;;4159:79;;:::i;:::-;4121:119;4307:1;4296:9;4292:17;4279:31;4337:18;4329:6;4326:30;4323:117;;;4359:79;;:::i;:::-;4323:117;4472:80;4544:7;4535:6;4524:9;4520:22;4472:80;:::i;:::-;4454:98;;;;4250:312;4010:559;;;;;:::o;4588:552::-;4645:8;4655:6;4705:3;4698:4;4690:6;4686:17;4682:27;4672:122;;4713:79;;:::i;:::-;4672:122;4826:6;4813:20;4803:30;;4856:18;4848:6;4845:30;4842:117;;;4878:79;;:::i;:::-;4842:117;4992:4;4984:6;4980:17;4968:29;;5046:3;5038:4;5030:6;5026:17;5016:8;5012:32;5009:41;5006:128;;;5053:79;;:::i;:::-;5006:128;4588:552;;;;;:::o;5146:963::-;5243:6;5251;5259;5267;5275;5324:3;5312:9;5303:7;5299:23;5295:33;5292:120;;;5331:79;;:::i;:::-;5292:120;5451:1;5476:53;5521:7;5512:6;5501:9;5497:22;5476:53;:::i;:::-;5466:63;;5422:117;5578:2;5604:53;5649:7;5640:6;5629:9;5625:22;5604:53;:::i;:::-;5594:63;;5549:118;5706:2;5732:53;5777:7;5768:6;5757:9;5753:22;5732:53;:::i;:::-;5722:63;;5677:118;5862:2;5851:9;5847:18;5834:32;5893:18;5885:6;5882:30;5879:117;;;5915:79;;:::i;:::-;5879:117;6028:64;6084:7;6075:6;6064:9;6060:22;6028:64;:::i;:::-;6010:82;;;;5805:297;5146:963;;;;;;;;:::o;6115:149::-;6151:7;6191:66;6184:5;6180:78;6169:89;;6115:149;;;:::o;6270:115::-;6355:23;6372:5;6355:23;:::i;:::-;6350:3;6343:36;6270:115;;:::o;6391:218::-;6482:4;6520:2;6509:9;6505:18;6497:26;;6533:69;6599:1;6588:9;6584:17;6575:6;6533:69;:::i;:::-;6391:218;;;;:::o;6615:109::-;6696:21;6711:5;6696:21;:::i;:::-;6691:3;6684:34;6615:109;;:::o;6730:210::-;6817:4;6855:2;6844:9;6840:18;6832:26;;6868:65;6930:1;6919:9;6915:17;6906:6;6868:65;:::i;:::-;6730:210;;;;:::o;6946:114::-;7013:6;7047:5;7041:12;7031:22;;6946:114;;;:::o;7066:184::-;7165:11;7199:6;7194:3;7187:19;7239:4;7234:3;7230:14;7215:29;;7066:184;;;;:::o;7256:132::-;7323:4;7346:3;7338:11;;7376:4;7371:3;7367:14;7359:22;;7256:132;;;:::o;7394:108::-;7471:24;7489:5;7471:24;:::i;:::-;7466:3;7459:37;7394:108;;:::o;7508:179::-;7577:10;7598:46;7640:3;7632:6;7598:46;:::i;:::-;7676:4;7671:3;7667:14;7653:28;;7508:179;;;;:::o;7693:113::-;7763:4;7795;7790:3;7786:14;7778:22;;7693:113;;;:::o;7842:732::-;7961:3;7990:54;8038:5;7990:54;:::i;:::-;8060:86;8139:6;8134:3;8060:86;:::i;:::-;8053:93;;8170:56;8220:5;8170:56;:::i;:::-;8249:7;8280:1;8265:284;8290:6;8287:1;8284:13;8265:284;;;8366:6;8360:13;8393:63;8452:3;8437:13;8393:63;:::i;:::-;8386:70;;8479:60;8532:6;8479:60;:::i;:::-;8469:70;;8325:224;8312:1;8309;8305:9;8300:14;;8265:284;;;8269:14;8565:3;8558:10;;7966:608;;;7842:732;;;;:::o;8580:373::-;8723:4;8761:2;8750:9;8746:18;8738:26;;8810:9;8804:4;8800:20;8796:1;8785:9;8781:17;8774:47;8838:108;8941:4;8932:6;8838:108;:::i;:::-;8830:116;;8580:373;;;;:::o;8959:775::-;9192:4;9230:3;9219:9;9215:19;9207:27;;9244:71;9312:1;9301:9;9297:17;9288:6;9244:71;:::i;:::-;9325:72;9393:2;9382:9;9378:18;9369:6;9325:72;:::i;:::-;9407;9475:2;9464:9;9460:18;9451:6;9407:72;:::i;:::-;9489;9557:2;9546:9;9542:18;9533:6;9489:72;:::i;:::-;9571:73;9639:3;9628:9;9624:19;9615:6;9571:73;:::i;:::-;9654;9722:3;9711:9;9707:19;9698:6;9654:73;:::i;:::-;8959:775;;;;;;;;;:::o;9740:60::-;9768:3;9789:5;9782:12;;9740:60;;;:::o;9806:142::-;9856:9;9889:53;9907:34;9916:24;9934:5;9916:24;:::i;:::-;9907:34;:::i;:::-;9889:53;:::i;:::-;9876:66;;9806:142;;;:::o;9954:126::-;10004:9;10037:37;10068:5;10037:37;:::i;:::-;10024:50;;9954:126;;;:::o;10086:141::-;10151:9;10184:37;10215:5;10184:37;:::i;:::-;10171:50;;10086:141;;;:::o;10233:161::-;10335:52;10381:5;10335:52;:::i;:::-;10330:3;10323:65;10233:161;;:::o;10400:252::-;10508:4;10546:2;10535:9;10531:18;10523:26;;10559:86;10642:1;10631:9;10627:17;10618:6;10559:86;:::i;:::-;10400:252;;;;:::o;10658:118::-;10745:24;10763:5;10745:24;:::i;:::-;10740:3;10733:37;10658:118;;:::o;10782:222::-;10875:4;10913:2;10902:9;10898:18;10890:26;;10926:71;10994:1;10983:9;10979:17;10970:6;10926:71;:::i;:::-;10782:222;;;;:::o;11010:474::-;11078:6;11086;11135:2;11123:9;11114:7;11110:23;11106:32;11103:119;;;11141:79;;:::i;:::-;11103:119;11261:1;11286:53;11331:7;11322:6;11311:9;11307:22;11286:53;:::i;:::-;11276:63;;11232:117;11388:2;11414:53;11459:7;11450:6;11439:9;11435:22;11414:53;:::i;:::-;11404:63;;11359:118;11010:474;;;;;:::o;11490:86::-;11525:7;11565:4;11558:5;11554:16;11543:27;;11490:86;;;:::o;11582:112::-;11665:22;11681:5;11665:22;:::i;:::-;11660:3;11653:35;11582:112;;:::o;11700:533::-;11867:4;11905:3;11894:9;11890:19;11882:27;;11919:67;11983:1;11972:9;11968:17;11959:6;11919:67;:::i;:::-;11996:72;12064:2;12053:9;12049:18;12040:6;11996:72;:::i;:::-;12078;12146:2;12135:9;12131:18;12122:6;12078:72;:::i;:::-;12160:66;12222:2;12211:9;12207:18;12198:6;12160:66;:::i;:::-;11700:533;;;;;;;:::o;12239:474::-;12307:6;12315;12364:2;12352:9;12343:7;12339:23;12335:32;12332:119;;;12370:79;;:::i;:::-;12332:119;12490:1;12515:53;12560:7;12551:6;12540:9;12536:22;12515:53;:::i;:::-;12505:63;;12461:117;12617:2;12643:53;12688:7;12679:6;12668:9;12664:22;12643:53;:::i;:::-;12633:63;;12588:118;12239:474;;;;;:::o;12719:118::-;12756:7;12796:34;12789:5;12785:46;12774:57;;12719:118;;;:::o;12843:::-;12930:24;12948:5;12930:24;:::i;:::-;12925:3;12918:37;12843:118;;:::o;12967:541::-;13138:4;13176:3;13165:9;13161:19;13153:27;;13190:71;13258:1;13247:9;13243:17;13234:6;13190:71;:::i;:::-;13271:72;13339:2;13328:9;13324:18;13315:6;13271:72;:::i;:::-;13353;13421:2;13410:9;13406:18;13397:6;13353:72;:::i;:::-;13435:66;13497:2;13486:9;13482:18;13473:6;13435:66;:::i;:::-;12967:541;;;;;;;:::o;13514:320::-;13629:4;13667:2;13656:9;13652:18;13644:26;;13680:71;13748:1;13737:9;13733:17;13724:6;13680:71;:::i;:::-;13761:66;13823:2;13812:9;13808:18;13799:6;13761:66;:::i;:::-;13514:320;;;;;:::o;13840:111::-;13904:6;13938:5;13932:12;13922:22;;13840:111;;;:::o;13957:181::-;14053:11;14087:6;14082:3;14075:19;14127:4;14122:3;14118:14;14103:29;;13957:181;;;;:::o;14144:129::-;14208:4;14231:3;14223:11;;14261:4;14256:3;14252:14;14244:22;;14144:129;;;:::o;14279:99::-;14350:21;14365:5;14350:21;:::i;:::-;14345:3;14338:34;14279:99;;:::o;14384:167::-;14447:10;14468:40;14504:3;14496:6;14468:40;:::i;:::-;14540:4;14535:3;14531:14;14517:28;;14384:167;;;;:::o;14557:110::-;14624:4;14656;14651:3;14647:14;14639:22;;14557:110;;;:::o;14697:708::-;14810:3;14839:51;14884:5;14839:51;:::i;:::-;14906:83;14982:6;14977:3;14906:83;:::i;:::-;14899:90;;15013:53;15060:5;15013:53;:::i;:::-;15089:7;15120:1;15105:275;15130:6;15127:1;15124:13;15105:275;;;15206:6;15200:13;15233:57;15286:3;15271:13;15233:57;:::i;:::-;15226:64;;15313:57;15363:6;15313:57;:::i;:::-;15303:67;;15165:215;15152:1;15149;15145:9;15140:14;;15105:275;;;15109:14;15396:3;15389:10;;14815:590;;;14697:708;;;;:::o;15411:114::-;15478:6;15512:5;15506:12;15496:22;;15411:114;;;:::o;15531:184::-;15630:11;15664:6;15659:3;15652:19;15704:4;15699:3;15695:14;15680:29;;15531:184;;;;:::o;15721:132::-;15788:4;15811:3;15803:11;;15841:4;15836:3;15832:14;15824:22;;15721:132;;;:::o;15859:108::-;15936:24;15954:5;15936:24;:::i;:::-;15931:3;15924:37;15859:108;;:::o;15973:179::-;16042:10;16063:46;16105:3;16097:6;16063:46;:::i;:::-;16141:4;16136:3;16132:14;16118:28;;15973:179;;;;:::o;16158:113::-;16228:4;16260;16255:3;16251:14;16243:22;;16158:113;;;:::o;16307:732::-;16426:3;16455:54;16503:5;16455:54;:::i;:::-;16525:86;16604:6;16599:3;16525:86;:::i;:::-;16518:93;;16635:56;16685:5;16635:56;:::i;:::-;16714:7;16745:1;16730:284;16755:6;16752:1;16749:13;16730:284;;;16831:6;16825:13;16858:63;16917:3;16902:13;16858:63;:::i;:::-;16851:70;;16944:60;16997:6;16944:60;:::i;:::-;16934:70;;16790:224;16777:1;16774;16770:9;16765:14;;16730:284;;;16734:14;17030:3;17023:10;;16431:608;;;16307:732;;;;:::o;17045:1407::-;17494:4;17532:3;17521:9;17517:19;17509:27;;17582:9;17576:4;17572:20;17568:1;17557:9;17553:17;17546:47;17610:108;17713:4;17704:6;17610:108;:::i;:::-;17602:116;;17765:9;17759:4;17755:20;17750:2;17739:9;17735:18;17728:48;17793:102;17890:4;17881:6;17793:102;:::i;:::-;17785:110;;17942:9;17936:4;17932:20;17927:2;17916:9;17912:18;17905:48;17970:108;18073:4;18064:6;17970:108;:::i;:::-;17962:116;;18125:9;18119:4;18115:20;18110:2;18099:9;18095:18;18088:48;18153:108;18256:4;18247:6;18153:108;:::i;:::-;18145:116;;18309:9;18303:4;18299:20;18293:3;18282:9;18278:19;18271:49;18337:108;18440:4;18431:6;18337:108;:::i;:::-;18329:116;;17045:1407;;;;;;;;:::o;18458:704::-;18553:6;18561;18569;18618:2;18606:9;18597:7;18593:23;18589:32;18586:119;;;18624:79;;:::i;:::-;18586:119;18744:1;18769:53;18814:7;18805:6;18794:9;18790:22;18769:53;:::i;:::-;18759:63;;18715:117;18899:2;18888:9;18884:18;18871:32;18930:18;18922:6;18919:30;18916:117;;;18952:79;;:::i;:::-;18916:117;19065:80;19137:7;19128:6;19117:9;19113:22;19065:80;:::i;:::-;19047:98;;;;18842:313;18458:704;;;;;:::o;19185:568::-;19258:8;19268:6;19318:3;19311:4;19303:6;19299:17;19295:27;19285:122;;19326:79;;:::i;:::-;19285:122;19439:6;19426:20;19416:30;;19469:18;19461:6;19458:30;19455:117;;;19491:79;;:::i;:::-;19455:117;19605:4;19597:6;19593:17;19581:29;;19659:3;19651:4;19643:6;19639:17;19629:8;19625:32;19622:41;19619:128;;;19666:79;;:::i;:::-;19619:128;19185:568;;;;;:::o;19759:934::-;19881:6;19889;19897;19905;19954:2;19942:9;19933:7;19929:23;19925:32;19922:119;;;19960:79;;:::i;:::-;19922:119;20108:1;20097:9;20093:17;20080:31;20138:18;20130:6;20127:30;20124:117;;;20160:79;;:::i;:::-;20124:117;20273:80;20345:7;20336:6;20325:9;20321:22;20273:80;:::i;:::-;20255:98;;;;20051:312;20430:2;20419:9;20415:18;20402:32;20461:18;20453:6;20450:30;20447:117;;;20483:79;;:::i;:::-;20447:117;20596:80;20668:7;20659:6;20648:9;20644:22;20596:80;:::i;:::-;20578:98;;;;20373:313;19759:934;;;;;;;:::o;20699:169::-;20783:11;20817:6;20812:3;20805:19;20857:4;20852:3;20848:14;20833:29;;20699:169;;;;:::o;20874:160::-;21014:12;21010:1;21002:6;20998:14;20991:36;20874:160;:::o;21040:366::-;21182:3;21203:67;21267:2;21262:3;21203:67;:::i;:::-;21196:74;;21279:93;21368:3;21279:93;:::i;:::-;21397:2;21392:3;21388:12;21381:19;;21040:366;;;:::o;21412:419::-;21578:4;21616:2;21605:9;21601:18;21593:26;;21665:9;21659:4;21655:20;21651:1;21640:9;21636:17;21629:47;21693:131;21819:4;21693:131;:::i;:::-;21685:139;;21412:419;;;:::o;21837:163::-;21977:15;21973:1;21965:6;21961:14;21954:39;21837:163;:::o;22006:366::-;22148:3;22169:67;22233:2;22228:3;22169:67;:::i;:::-;22162:74;;22245:93;22334:3;22245:93;:::i;:::-;22363:2;22358:3;22354:12;22347:19;;22006:366;;;:::o;22378:419::-;22544:4;22582:2;22571:9;22567:18;22559:26;;22631:9;22625:4;22621:20;22617:1;22606:9;22602:17;22595:47;22659:131;22785:4;22659:131;:::i;:::-;22651:139;;22378:419;;;:::o;22803:180::-;22851:77;22848:1;22841:88;22948:4;22945:1;22938:15;22972:4;22969:1;22962:15;22989:227;23029:4;23049:20;23067:1;23049:20;:::i;:::-;23044:25;;23083:20;23101:1;23083:20;:::i;:::-;23078:25;;23127:1;23124;23120:9;23112:17;;23151:34;23145:4;23142:44;23139:70;;;23189:18;;:::i;:::-;23139:70;22989:227;;;;:::o;23222:224::-;23262:3;23281:20;23299:1;23281:20;:::i;:::-;23276:25;;23315:20;23333:1;23315:20;:::i;:::-;23310:25;;23358:1;23355;23351:9;23344:16;;23381:34;23376:3;23373:43;23370:69;;;23419:18;;:::i;:::-;23370:69;23222:224;;;;:::o;23452:171::-;23491:3;23514:24;23532:5;23514:24;:::i;:::-;23505:33;;23560:4;23553:5;23550:15;23547:41;;23568:18;;:::i;:::-;23547:41;23615:1;23608:5;23604:13;23597:20;;23452:171;;;:::o;23629:442::-;23778:4;23816:2;23805:9;23801:18;23793:26;;23829:71;23897:1;23886:9;23882:17;23873:6;23829:71;:::i;:::-;23910:72;23978:2;23967:9;23963:18;23954:6;23910:72;:::i;:::-;23992;24060:2;24049:9;24045:18;24036:6;23992:72;:::i;:::-;23629:442;;;;;;:::o;24077:162::-;24217:14;24213:1;24205:6;24201:14;24194:38;24077:162;:::o;24245:366::-;24387:3;24408:67;24472:2;24467:3;24408:67;:::i;:::-;24401:74;;24484:93;24573:3;24484:93;:::i;:::-;24602:2;24597:3;24593:12;24586:19;;24245:366;;;:::o;24617:419::-;24783:4;24821:2;24810:9;24806:18;24798:26;;24870:9;24864:4;24860:20;24856:1;24845:9;24841:17;24834:47;24898:131;25024:4;24898:131;:::i;:::-;24890:139;;24617:419;;;:::o;25042:166::-;25182:18;25178:1;25170:6;25166:14;25159:42;25042:166;:::o;25214:366::-;25356:3;25377:67;25441:2;25436:3;25377:67;:::i;:::-;25370:74;;25453:93;25542:3;25453:93;:::i;:::-;25571:2;25566:3;25562:12;25555:19;;25214:366;;;:::o;25586:419::-;25752:4;25790:2;25779:9;25775:18;25767:26;;25839:9;25833:4;25829:20;25825:1;25814:9;25810:17;25803:47;25867:131;25993:4;25867:131;:::i;:::-;25859:139;;25586:419;;;:::o;26011:180::-;26059:77;26056:1;26049:88;26156:4;26153:1;26146:15;26180:4;26177:1;26170:15;26197:191;26237:3;26256:20;26274:1;26256:20;:::i;:::-;26251:25;;26290:20;26308:1;26290:20;:::i;:::-;26285:25;;26333:1;26330;26326:9;26319:16;;26354:3;26351:1;26348:10;26345:36;;;26361:18;;:::i;:::-;26345:36;26197:191;;;;:::o;26394:161::-;26534:13;26530:1;26522:6;26518:14;26511:37;26394:161;:::o;26561:366::-;26703:3;26724:67;26788:2;26783:3;26724:67;:::i;:::-;26717:74;;26800:93;26889:3;26800:93;:::i;:::-;26918:2;26913:3;26909:12;26902:19;;26561:366;;;:::o;26933:419::-;27099:4;27137:2;27126:9;27122:18;27114:26;;27186:9;27180:4;27176:20;27172:1;27161:9;27157:17;27150:47;27214:131;27340:4;27214:131;:::i;:::-;27206:139;;26933:419;;;:::o;27358:172::-;27498:24;27494:1;27486:6;27482:14;27475:48;27358:172;:::o;27536:366::-;27678:3;27699:67;27763:2;27758:3;27699:67;:::i;:::-;27692:74;;27775:93;27864:3;27775:93;:::i;:::-;27893:2;27888:3;27884:12;27877:19;;27536:366;;;:::o;27908:419::-;28074:4;28112:2;28101:9;28097:18;28089:26;;28161:9;28155:4;28151:20;28147:1;28136:9;28132:17;28125:47;28189:131;28315:4;28189:131;:::i;:::-;28181:139;;27908:419;;;:::o;28333:143::-;28390:5;28421:6;28415:13;28406:22;;28437:33;28464:5;28437:33;:::i;:::-;28333:143;;;;:::o;28482:351::-;28552:6;28601:2;28589:9;28580:7;28576:23;28572:32;28569:119;;;28607:79;;:::i;:::-;28569:119;28727:1;28752:64;28808:7;28799:6;28788:9;28784:22;28752:64;:::i;:::-;28742:74;;28698:128;28482:351;;;;:::o;28839:165::-;28979:17;28975:1;28967:6;28963:14;28956:41;28839:165;:::o;29010:366::-;29152:3;29173:67;29237:2;29232:3;29173:67;:::i;:::-;29166:74;;29249:93;29338:3;29249:93;:::i;:::-;29367:2;29362:3;29358:12;29351:19;;29010:366;;;:::o;29382:419::-;29548:4;29586:2;29575:9;29571:18;29563:26;;29635:9;29629:4;29625:20;29621:1;29610:9;29606:17;29599:47;29663:131;29789:4;29663:131;:::i;:::-;29655:139;;29382:419;;;:::o;29807:164::-;29947:16;29943:1;29935:6;29931:14;29924:40;29807:164;:::o;29977:366::-;30119:3;30140:67;30204:2;30199:3;30140:67;:::i;:::-;30133:74;;30216:93;30305:3;30216:93;:::i;:::-;30334:2;30329:3;30325:12;30318:19;;29977:366;;;:::o;30349:419::-;30515:4;30553:2;30542:9;30538:18;30530:26;;30602:9;30596:4;30592:20;30588:1;30577:9;30573:17;30566:47;30630:131;30756:4;30630:131;:::i;:::-;30622:139;;30349:419;;;:::o;30774:233::-;30813:3;30836:24;30854:5;30836:24;:::i;:::-;30827:33;;30882:66;30875:5;30872:77;30869:103;;30952:18;;:::i;:::-;30869:103;30999:1;30992:5;30988:13;30981:20;;30774:233;;;:::o;31013:117::-;31122:1;31119;31112:12;31136:99;31221:6;31216:3;31211;31198:30;31136:99;;;:::o;31271:537::-;31399:3;31420:86;31499:6;31494:3;31420:86;:::i;:::-;31413:93;;31530:66;31522:6;31519:78;31516:165;;;31600:79;;:::i;:::-;31516:165;31712:4;31704:6;31700:17;31690:27;;31727:43;31763:6;31758:3;31751:5;31727:43;:::i;:::-;31795:6;31790:3;31786:16;31779:23;;31271:537;;;;;:::o;31814:503::-;31995:4;32033:2;32022:9;32018:18;32010:26;;32082:9;32076:4;32072:20;32068:1;32057:9;32053:17;32046:47;32110:118;32223:4;32214:6;32206;32110:118;:::i;:::-;32102:126;;32238:72;32306:2;32295:9;32291:18;32282:6;32238:72;:::i;:::-;31814:503;;;;;;:::o;32323:176::-;32463:28;32459:1;32451:6;32447:14;32440:52;32323:176;:::o;32505:366::-;32647:3;32668:67;32732:2;32727:3;32668:67;:::i;:::-;32661:74;;32744:93;32833:3;32744:93;:::i;:::-;32862:2;32857:3;32853:12;32846:19;;32505:366;;;:::o;32877:419::-;33043:4;33081:2;33070:9;33066:18;33058:26;;33130:9;33124:4;33120:20;33116:1;33105:9;33101:17;33094:47;33158:131;33284:4;33158:131;:::i;:::-;33150:139;;32877:419;;;:::o;33302:180::-;33350:77;33347:1;33340:88;33447:4;33444:1;33437:15;33471:4;33468:1;33461:15;33488:185;33528:1;33545:20;33563:1;33545:20;:::i;:::-;33540:25;;33579:20;33597:1;33579:20;:::i;:::-;33574:25;;33618:1;33608:35;;33623:18;;:::i;:::-;33608:35;33665:1;33662;33658:9;33653:14;;33488:185;;;;:::o;33679:410::-;33719:7;33742:20;33760:1;33742:20;:::i;:::-;33737:25;;33776:20;33794:1;33776:20;:::i;:::-;33771:25;;33831:1;33828;33824:9;33853:30;33871:11;33853:30;:::i;:::-;33842:41;;34032:1;34023:7;34019:15;34016:1;34013:22;33993:1;33986:9;33966:83;33943:139;;34062:18;;:::i;:::-;33943:139;33727:362;33679:410;;;;:::o;34095:194::-;34135:4;34155:20;34173:1;34155:20;:::i;:::-;34150:25;;34189:20;34207:1;34189:20;:::i;:::-;34184:25;;34233:1;34230;34226:9;34218:17;;34257:1;34251:4;34248:11;34245:37;;;34262:18;;:::i;:::-;34245:37;34095:194;;;;:::o;34295:172::-;34435:24;34431:1;34423:6;34419:14;34412:48;34295:172;:::o;34473:366::-;34615:3;34636:67;34700:2;34695:3;34636:67;:::i;:::-;34629:74;;34712:93;34801:3;34712:93;:::i;:::-;34830:2;34825:3;34821:12;34814:19;;34473:366;;;:::o;34845:419::-;35011:4;35049:2;35038:9;35034:18;35026:26;;35098:9;35092:4;35088:20;35084:1;35073:9;35069:17;35062:47;35126:131;35252:4;35126:131;:::i;:::-;35118:139;;34845:419;;;:::o;35270:173::-;35410:25;35406:1;35398:6;35394:14;35387:49;35270:173;:::o;35449:366::-;35591:3;35612:67;35676:2;35671:3;35612:67;:::i;:::-;35605:74;;35688:93;35777:3;35688:93;:::i;:::-;35806:2;35801:3;35797:12;35790:19;;35449:366;;;:::o;35821:419::-;35987:4;36025:2;36014:9;36010:18;36002:26;;36074:9;36068:4;36064:20;36060:1;36049:9;36045:17;36038:47;36102:131;36228:4;36102:131;:::i;:::-;36094:139;;35821:419;;;:::o;36246:180::-;36294:77;36291:1;36284:88;36391:4;36388:1;36381:15;36415:4;36412:1;36405:15;36432:164;36572:16;36568:1;36560:6;36556:14;36549:40;36432:164;:::o;36602:366::-;36744:3;36765:67;36829:2;36824:3;36765:67;:::i;:::-;36758:74;;36841:93;36930:3;36841:93;:::i;:::-;36959:2;36954:3;36950:12;36943:19;;36602:366;;;:::o;36974:419::-;37140:4;37178:2;37167:9;37163:18;37155:26;;37227:9;37221:4;37217:20;37213:1;37202:9;37198:17;37191:47;37255:131;37381:4;37255:131;:::i;:::-;37247:139;;36974:419;;;:::o;37399:165::-;37539:17;37535:1;37527:6;37523:14;37516:41;37399:165;:::o;37570:366::-;37712:3;37733:67;37797:2;37792:3;37733:67;:::i;:::-;37726:74;;37809:93;37898:3;37809:93;:::i;:::-;37927:2;37922:3;37918:12;37911:19;;37570:366;;;:::o;37942:419::-;38108:4;38146:2;38135:9;38131:18;38123:26;;38195:9;38189:4;38185:20;38181:1;38170:9;38166:17;38159:47;38223:131;38349:4;38223:131;:::i;:::-;38215:139;;37942:419;;;:::o;38367:180::-;38415:77;38412:1;38405:88;38512:4;38509:1;38502:15;38536:4;38533:1;38526:15;38553:169;38693:21;38689:1;38681:6;38677:14;38670:45;38553:169;:::o;38728:366::-;38870:3;38891:67;38955:2;38950:3;38891:67;:::i;:::-;38884:74;;38967:93;39056:3;38967:93;:::i;:::-;39085:2;39080:3;39076:12;39069:19;;38728:366;;;:::o;39100:419::-;39266:4;39304:2;39293:9;39289:18;39281:26;;39353:9;39347:4;39343:20;39339:1;39328:9;39324:17;39317:47;39381:131;39507:4;39381:131;:::i;:::-;39373:139;;39100:419;;;:::o
Swarm Source
ipfs://a4054881f95e6576bac7ebe283ea13b266ea28fe4c6b610fd266c2da41bd615d
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.