ETH Price: $2,070.63 (+6.13%)
 

Overview

Max Total Supply

100,000,000 YIDO

Holders

131

Transfers

-
0

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 8 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Yidocy+ is the gateway to Bitcoin mining and more. It is the stake-to-reward platform offering the easiest access to digital asset mining for retail investors. By staking $Yido, users earn high-yield in Bitcoin on a daily basis and with no locking period.

Market

Volume (24H):$0.00
Market Capitalization:$0.00
Circulating Supply:0.00 YIDO
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
YidocyToken

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
shanghai EvmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2024-08-22
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/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/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;





/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

// File: @openzeppelin/contracts/access/IAccessControl.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)

pragma solidity ^0.8.20;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev The `account` is missing a role.
     */
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);

    /**
     * @dev The caller of a function is not the expected one.
     *
     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
     */
    error AccessControlBadConfirmation();

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     */
    function renounceRole(bytes32 role, address callerConfirmation) external;
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)

pragma solidity ^0.8.20;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)

pragma solidity ^0.8.20;




/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```solidity
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```solidity
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address account => bool) hasRole;
        bytes32 adminRole;
    }

    mapping(bytes32 role => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with an {AccessControlUnauthorizedAccount} error including the required role.
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual returns (bool) {
        return _roles[role].hasRole[account];
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
     * is missing `role`.
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert AccessControlUnauthorizedAccount(account, role);
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address callerConfirmation) public virtual {
        if (callerConfirmation != _msgSender()) {
            revert AccessControlBadConfirmation();
        }

        _revokeRole(role, callerConfirmation);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
        if (!hasRole(role, account)) {
            _roles[role].hasRole[account] = true;
            emit RoleGranted(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
        if (hasRole(role, account)) {
            _roles[role].hasRole[account] = false;
            emit RoleRevoked(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }
}

// File: IRewardPool.sol



pragma solidity ^0.8.0;

interface IRewardPool {
    function notifyReward(uint256 amount) external;
    function getUserStakingBalance(address account) external view returns(uint256);
    function deposit(address staker, uint256 amount) external;
}

// File: YidocyToken.sol



pragma solidity ^0.8.0;




contract YidocyToken is ERC20, AccessControl {
    uint256 internal immutable _supplyCap;
    IRewardPool internal _rewardPool;

    struct VestingSchedule {
        uint256 validFromDate;
        uint256 amount;
    }
    struct LockupInfo {
        uint256 lockupAmount;
        uint256 code; // 1: Team, 2: Advisor, 3: Private Sale
        address rewardPoolAddress;
        VestingSchedule[] vestingSchedules;
    }
    address[] internal _userLockupAddresses;
    mapping(address => LockupInfo) internal _userLockups;

    address[] internal _adminRoleMembers;

    struct AdminRoleRequest {
        address newAdmin;
        address revokeAdmin;
        uint256 action; // 1: add, 2: revoke, 3: transfer
        uint256 status; // 0: requested, 1: executed, 2: rejected
        address requestedAdmin;
        address approvedAdmin;
        address rejectedAdmin;
    }
    mapping(uint256 => AdminRoleRequest) internal _adminRoleRequests;
    uint256 internal _adminRoleRequestCount;

    event AdminRoleTransferred(address indexed currentAdmin, address indexed newAdmin, uint256 requestId);
    event AdminRoleAdded(address indexed performedAdmin, address indexed newAdmin, uint256 requestId);
    event AdminRoleRevoked(address indexed performedAdmin, address indexed revokedAdmin, uint256 requestId);
    event AdminRoleRequested(address indexed requesteAdmin, uint256 action, uint256 requestId);
    event AdminRoleRejected(address indexed rejectedAdmin, uint256 action, uint256 requestId);

    modifier onlyAdmin() {
        require(_isAdmin(msg.sender), "YidocyToken : Restricted to admins.");
        _;
    }

    constructor(address[] memory multiAdminRoles, uint256 supplyCap) ERC20("Yidocy", "YIDO") {
        require(multiAdminRoles.length > 1, "YidocyToken : Number of multiAdminRoles must be over 1");
        for (uint256 i = 0; i < multiAdminRoles.length; i++) {
            require(multiAdminRoles[i] != address(0), "YidocyToken : multiAdminRole address could not be zero");
            require(multiAdminRoles[i] != msg.sender, "YidocyToken : Except contructor, number of multiAdminRoles must be over 1");
        }
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _adminRoleMembers.push(msg.sender);
        for (uint256 i = 0; i < multiAdminRoles.length; i++) {
            _adminRoleMembers.push(multiAdminRoles[i]);
            _grantRole(DEFAULT_ADMIN_ROLE, multiAdminRoles[i]);
        }
        _supplyCap = supplyCap;
        _mint(msg.sender, _supplyCap);    
    }

    function decimals() public view virtual override returns (uint8) {
        return 8;
    }

    function getLockupUsers() external view returns(address[] memory) {
        return _userLockupAddresses;
    }

    function getUserLockup(address account) external view returns(
        uint256 lockupAmount,
        uint256 code,
        uint256[] memory vestingValidFromDateList,
        uint256[] memory vestingAmountList
    ) {
        lockupAmount = 0;
        LockupInfo memory userLockup = _userLockups[account];
        if (userLockup.lockupAmount > 0) {
            lockupAmount = userLockup.lockupAmount;
            code = userLockup.code;
            vestingValidFromDateList = new uint256[](userLockup.vestingSchedules.length);
            vestingAmountList = new uint256[](userLockup.vestingSchedules.length);
            for (uint256 i = 0; i < userLockup.vestingSchedules.length; i++) {
                vestingValidFromDateList[i] = userLockup.vestingSchedules[i].validFromDate;
                vestingAmountList[i] = userLockup.vestingSchedules[i].amount;
            }
        }
    }

    function transferableAmount(address sender, address recipient) internal view returns (uint256){
        uint256 senderBalanceOf = balanceOf(sender);
        LockupInfo memory userLockup = _userLockups[sender];
        if (userLockup.lockupAmount == 0 || userLockup.rewardPoolAddress == recipient) {
            return senderBalanceOf;
        }
        uint256 senderStakingBalanceOf = IRewardPool(userLockup.rewardPoolAddress).getUserStakingBalance(sender);
        uint256 amount = senderBalanceOf + senderStakingBalanceOf;
        uint256 nowTimestamp = uint256(block.timestamp);
        uint256 vestingScheduleLength = userLockup.vestingSchedules.length;
        for (uint256 i = 0; i < vestingScheduleLength; i++) {
            if (userLockup.vestingSchedules[i].validFromDate > nowTimestamp) {
                if (amount < userLockup.vestingSchedules[i].amount) {
                    return 0;
                }
                amount -= userLockup.vestingSchedules[i].amount;
            }
        }
        if (amount >= senderBalanceOf) {
            return senderBalanceOf;
        }
        return amount;
    }

    function stakeToken(uint256 amount) external {
        transfer(address(_rewardPool), amount);
        _rewardPool.deposit(msg.sender, amount);
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        require(transferableAmount(_msgSender(), recipient)  >= amount, "YidocyToken : Cannot transfer more than transferable amount");
        return super.transfer(recipient, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        require(transferableAmount(sender, recipient)  >= amount, "YidocyToken : Cannot transfer from more than transferable amount");
        return super.transferFrom(sender, recipient, amount);
    }

    function mint() external pure {
        revert("YidocyToken : mint is not supported for this TOKEN!!");
    }
    function setRewardPool(address rewardPool) external onlyAdmin {
        require(address(_rewardPool) == address(0), "YidocyToken : setRewardPool must called once at the deploy time");
        require(rewardPool != address(0), "YidocyToken : RewardPool address is required");
        _rewardPool = IRewardPool(rewardPool);
    }

    function burn() external pure {
        revert("YidocyToken : burn is not supported for this TOKEN!!");
    }

    function setUserLockup(
        address rewardPoolAddress,
        address account,
        uint256 lockupAmount,
        uint8 code, // 1: Team, 2: Advisor, 3: Private Sale
        uint256[] memory vestingValidFromDateList,
        uint256[] memory vestingAmountList
    ) external onlyAdmin {
        if (lockupAmount == 0) {
            delete _userLockups[account];
            uint256 addressLength = _userLockupAddresses.length;
            for (uint256 i = 0; i < addressLength; i++) {
                if (_userLockupAddresses[i] == account) {
                    delete _userLockupAddresses[i];
                    _userLockupAddresses[i] = _userLockupAddresses[addressLength-1];
                    _userLockupAddresses.pop();
                    break;
                }
            }
            return;
        }
        require(vestingValidFromDateList.length == vestingAmountList.length, "YidocyToken : Lockup date list and amount list must be the same length!");
        uint256 vestingTotalAmount = 0;
        for (uint256 i = 0; i < vestingValidFromDateList.length; i++) {
            vestingTotalAmount += vestingAmountList[i];
        }
        require(vestingTotalAmount <= lockupAmount, "YidocyToken : Lockup vesting total amount must be less or equal to the lockup amount!");

        _userLockups[account].lockupAmount = lockupAmount;
        _userLockups[account].code = code;
        _userLockups[account].rewardPoolAddress = rewardPoolAddress;
        delete _userLockups[account].vestingSchedules;
        for (uint256 i = 0; i < vestingValidFromDateList.length; i++) {
            _userLockups[account].vestingSchedules.push(VestingSchedule(vestingValidFromDateList[i], vestingAmountList[i]));
        }
        bool addressFound = false;
        uint256 userLockupAddressLength = _userLockupAddresses.length;
        for (uint256 i = 0; i < userLockupAddressLength; i++) {
            if (_userLockupAddresses[i] == account) {
                addressFound = true;
                break;
            }
        }
        if (!addressFound) {
            _userLockupAddresses.push(account);
        }
    }

    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
    }
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
    } 
    function renounceRole(bytes32 role, address callerConfirmation) public virtual override {
    }

    function _isAdmin(address account) internal view returns (bool) {
        return hasRole(DEFAULT_ADMIN_ROLE, account);
    }
    function isAdmin(address account) external view returns (bool) {
        return hasRole(DEFAULT_ADMIN_ROLE, account);
    }
    function _adminRoleMembersCount() internal view returns (uint256) {
        uint256 count = 0;
        for (uint256 i = 0; i < _adminRoleMembers.length; i++) {
            if (_adminRoleMembers[i] != address(0)) {
                count++;
            }
        }
        return count;
    }
    function adminRoleMembersCount() external view returns (uint256) {
        return _adminRoleMembersCount();
    }
    function getAdminRoleMembers() external view returns (address[] memory adminRoleMembers) {
        adminRoleMembers = new address[](_adminRoleMembersCount());
        uint256 index = 0;
        for (uint256 i = 0; i < _adminRoleMembers.length; i++) {
            if (_adminRoleMembers[i] != address(0)) {
                adminRoleMembers[index++] = _adminRoleMembers[i];
            }
        }
    }
    function getAdminRoleRequestCount() external view returns(uint256) {
        return _adminRoleRequestCount;
    }
    
    function getAdminRoleRequest(uint256 requestId) external view returns (
        address newAdmin,
        address revokeAdmin,
        uint256 action,
        uint256 status,
        address requestedAdmin,
        address approvedAdmin,
        address rejectedAdmin       
    ) {
        require(requestId < _adminRoleRequestCount, "YidocyToken : requestId does not exist");
        newAdmin = _adminRoleRequests[requestId].newAdmin;
        revokeAdmin = _adminRoleRequests[requestId].revokeAdmin;
        action = _adminRoleRequests[requestId].action;
        status = _adminRoleRequests[requestId].status;
        requestedAdmin = _adminRoleRequests[requestId].requestedAdmin;
        approvedAdmin = _adminRoleRequests[requestId].approvedAdmin;
        rejectedAdmin = _adminRoleRequests[requestId].newAdmin;
    }
    function requestTransferAdminRole(address newAdmin) external onlyAdmin returns(uint256) {
        require(newAdmin != address(0), "YidocyToken : Cannot transfer admin role to zero address");
        require(newAdmin != msg.sender, "YidocyToken : Cannot transfer admin role to the same address");
        require(_adminRoleRequestCount == 0 || _adminRoleRequests[_adminRoleRequestCount-1].status > 0, "YidocyToken : Previous AdminRole Request is pending");
        uint256 requestId = _adminRoleRequestCount;
        _adminRoleRequestCount += 1;
        _adminRoleRequests[requestId] = AdminRoleRequest({
            newAdmin: newAdmin,
            revokeAdmin: msg.sender,
            action: 3,
            status: 0,
            requestedAdmin: msg.sender,
            approvedAdmin: address(0),
            rejectedAdmin: address(0)
        });
        emit AdminRoleRequested(msg.sender, 3, requestId);
        return requestId;
    }
    function requestAddAdminRole(address newAdmin) external onlyAdmin returns(uint256) {
        require(newAdmin != address(0), "YidocyToken : Cannot add admin role for zero address");
        require(newAdmin != msg.sender, "YidocyToken : Cannot add admin role for the same address");
        require(_adminRoleRequestCount == 0 || _adminRoleRequests[_adminRoleRequestCount-1].status > 0, "YidocyToken : Previous AdminRole Request is pending");
        uint256 requestId = _adminRoleRequestCount;
        _adminRoleRequestCount += 1;
        _adminRoleRequests[requestId] = AdminRoleRequest({
            newAdmin: newAdmin,
            revokeAdmin: address(0),
            action: 1,
            status: 0,
            requestedAdmin: msg.sender,
            approvedAdmin: address(0),
            rejectedAdmin: address(0)
        });
        emit AdminRoleRequested(msg.sender, 1, requestId);
        return requestId;
    }
    function requestRevokeAdminRole(address revokeAdmin) external onlyAdmin returns(uint256) {
        require(revokeAdmin != address(0), "YidocyToken : Cannot add admin role for zero address");
        require(_adminRoleRequestCount == 0 || _adminRoleRequests[_adminRoleRequestCount-1].status > 0, "YidocyToken : Previous AdminRole Request is pending");
        uint256 requestId = _adminRoleRequestCount;
        _adminRoleRequestCount += 1;
        _adminRoleRequests[requestId] = AdminRoleRequest({
            newAdmin: address(0),
            revokeAdmin: revokeAdmin,
            action: 2,
            status: 0,
            requestedAdmin: msg.sender,
            approvedAdmin: address(0),
            rejectedAdmin: address(0)
        });
        emit AdminRoleRequested(msg.sender, 2, requestId);
        return requestId;
    }

    function executeRequestAdminRole(bool approval) external onlyAdmin returns(uint256) {
        require(_adminRoleRequestCount > 0, "YidocyToken : There is no excutable AdminRoleRequest");
        uint256 requestId = _adminRoleRequestCount-1;
        require(_adminRoleRequestCount > 0 && _adminRoleRequests[requestId].status == 0, "YidocyToken : No AdminRole Request is requested");
        require(msg.sender != _adminRoleRequests[requestId].requestedAdmin, "YidocyToken : Execute Request must be the other amdinRoler");
        if (approval) {
            _adminRoleRequests[requestId].status = 1;
            _adminRoleRequests[requestId].approvedAdmin = msg.sender;
            _adminRoleRequests[requestId].rejectedAdmin = address(0);
            if (_adminRoleRequests[requestId].action == 1) { // add new AdminRole
                _grantRole(DEFAULT_ADMIN_ROLE, _adminRoleRequests[requestId].newAdmin);
                _adminRoleMembers.push(_adminRoleRequests[requestId].newAdmin);
                emit AdminRoleAdded(msg.sender, _adminRoleRequests[requestId].newAdmin, requestId);
            } else if (_adminRoleRequests[requestId].action == 2) { // revoke AdminRole
                _revokeRole(DEFAULT_ADMIN_ROLE, _adminRoleRequests[requestId].revokeAdmin);
                for (uint256 i = 0; i < _adminRoleMembers.length; i++) {
                    if (_adminRoleMembers[i] == _adminRoleRequests[requestId].revokeAdmin) {
                        _adminRoleMembers[i] = address(0);
                        break;
                    }
                }        
                emit AdminRoleRevoked(msg.sender, _adminRoleRequests[requestId].revokeAdmin, requestId);
            } else if (_adminRoleRequests[requestId].action == 3) { // transfer AdminRole
                _grantRole(DEFAULT_ADMIN_ROLE, _adminRoleRequests[requestId].newAdmin);
                _revokeRole(DEFAULT_ADMIN_ROLE, _adminRoleRequests[requestId].revokeAdmin);
                for (uint256 i = 0; i < _adminRoleMembers.length; i++) {
                    if (_adminRoleMembers[i] == _adminRoleRequests[requestId].revokeAdmin) {
                        _adminRoleMembers[i] = _adminRoleRequests[requestId].newAdmin;
                        break;
                    }
                }
                emit AdminRoleTransferred(msg.sender, _adminRoleRequests[requestId].newAdmin, requestId);
            }
        } else {
            _adminRoleRequests[requestId].status = 2;
            _adminRoleRequests[requestId].approvedAdmin = address(0);
            _adminRoleRequests[requestId].rejectedAdmin = msg.sender;
            emit AdminRoleRejected(msg.sender, _adminRoleRequests[requestId].action, requestId);
        }
        return requestId;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address[]","name":"multiAdminRoles","type":"address[]"},{"internalType":"uint256","name":"supplyCap","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"performedAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"AdminRoleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rejectedAdmin","type":"address"},{"indexed":false,"internalType":"uint256","name":"action","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"AdminRoleRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requesteAdmin","type":"address"},{"indexed":false,"internalType":"uint256","name":"action","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"AdminRoleRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"performedAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"revokedAdmin","type":"address"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"AdminRoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currentAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"AdminRoleTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminRoleMembersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burn","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"approval","type":"bool"}],"name":"executeRequestAdminRole","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdminRoleMembers","outputs":[{"internalType":"address[]","name":"adminRoleMembers","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"getAdminRoleRequest","outputs":[{"internalType":"address","name":"newAdmin","type":"address"},{"internalType":"address","name":"revokeAdmin","type":"address"},{"internalType":"uint256","name":"action","type":"uint256"},{"internalType":"uint256","name":"status","type":"uint256"},{"internalType":"address","name":"requestedAdmin","type":"address"},{"internalType":"address","name":"approvedAdmin","type":"address"},{"internalType":"address","name":"rejectedAdmin","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdminRoleRequestCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLockupUsers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUserLockup","outputs":[{"internalType":"uint256","name":"lockupAmount","type":"uint256"},{"internalType":"uint256","name":"code","type":"uint256"},{"internalType":"uint256[]","name":"vestingValidFromDateList","type":"uint256[]"},{"internalType":"uint256[]","name":"vestingAmountList","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"requestAddAdminRole","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"revokeAdmin","type":"address"}],"name":"requestRevokeAdminRole","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"requestTransferAdminRole","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rewardPool","type":"address"}],"name":"setRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rewardPoolAddress","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"lockupAmount","type":"uint256"},{"internalType":"uint8","name":"code","type":"uint8"},{"internalType":"uint256[]","name":"vestingValidFromDateList","type":"uint256[]"},{"internalType":"uint256[]","name":"vestingAmountList","type":"uint256[]"}],"name":"setUserLockup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60a060405234801562000010575f80fd5b50604051620064e5380380620064e58339818101604052810190620000369190620009e4565b6040518060400160405280600681526020017f5969646f637900000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5949444f000000000000000000000000000000000000000000000000000000008152508160039081620000b3919062000c76565b508060049081620000c5919062000c76565b50505060018251116200010f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001069062000dde565b60405180910390fd5b5f5b82518110156200024d575f73ffffffffffffffffffffffffffffffffffffffff1683828151811062000148576200014762000dfe565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603620001a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001a09062000e9f565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16838281518110620001d657620001d562000dfe565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160362000237576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200022e9062000f59565b60405180910390fd5b8080620002449062000fa6565b91505062000111565b50620002625f801b33620003b960201b60201c565b50600933908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f5b825181101562000394576009838281518110620002e757620002e662000dfe565b5b6020026020010151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200037d5f801b84838151811062000369576200036862000dfe565b5b6020026020010151620003b960201b60201c565b5080806200038b9062000fa6565b915050620002c5565b508060808181525050620003b133608051620004b560201b60201c565b5050620010bf565b5f620003cc83836200053f60201b60201c565b620004ab57600160055f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555062000447620005a360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050620004af565b5f90505b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000528575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016200051f919062001003565b60405180910390fd5b6200053b5f8383620005aa60201b60201c565b5050565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620005fe578060025f828254620005f191906200101e565b92505081905550620006cf565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156200068a578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401620006819392919062001069565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000718578060025f828254039250508190555062000762565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620007c19190620010a4565b60405180910390a3505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200082b82620007e3565b810181811067ffffffffffffffff821117156200084d576200084c620007f3565b5b80604052505050565b5f62000861620007ce565b90506200086f828262000820565b919050565b5f67ffffffffffffffff821115620008915762000890620007f3565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620008d182620008a6565b9050919050565b620008e381620008c5565b8114620008ee575f80fd5b50565b5f815190506200090181620008d8565b92915050565b5f6200091d620009178462000874565b62000856565b90508083825260208201905060208402830185811115620009435762000942620008a2565b5b835b818110156200097057806200095b8882620008f1565b84526020840193505060208101905062000945565b5050509392505050565b5f82601f830112620009915762000990620007df565b5b8151620009a384826020860162000907565b91505092915050565b5f819050919050565b620009c081620009ac565b8114620009cb575f80fd5b50565b5f81519050620009de81620009b5565b92915050565b5f8060408385031215620009fd57620009fc620007d7565b5b5f83015167ffffffffffffffff81111562000a1d5762000a1c620007db565b5b62000a2b858286016200097a565b925050602062000a3e85828601620009ce565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000a9757607f821691505b60208210810362000aad5762000aac62000a52565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000b117fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000ad4565b62000b1d868362000ad4565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62000b5e62000b5862000b5284620009ac565b62000b35565b620009ac565b9050919050565b5f819050919050565b62000b798362000b3e565b62000b9162000b888262000b65565b84845462000ae0565b825550505050565b5f90565b62000ba762000b99565b62000bb481848462000b6e565b505050565b5b8181101562000bdb5762000bcf5f8262000b9d565b60018101905062000bba565b5050565b601f82111562000c2a5762000bf48162000ab3565b62000bff8462000ac5565b8101602085101562000c0f578190505b62000c2762000c1e8562000ac5565b83018262000bb9565b50505b505050565b5f82821c905092915050565b5f62000c4c5f198460080262000c2f565b1980831691505092915050565b5f62000c66838362000c3b565b9150826002028217905092915050565b62000c818262000a48565b67ffffffffffffffff81111562000c9d5762000c9c620007f3565b5b62000ca9825462000a7f565b62000cb682828562000bdf565b5f60209050601f83116001811462000cec575f841562000cd7578287015190505b62000ce3858262000c59565b86555062000d52565b601f19841662000cfc8662000ab3565b5f5b8281101562000d255784890151825560018201915060208501945060208101905062000cfe565b8683101562000d45578489015162000d41601f89168262000c3b565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f5969646f6379546f6b656e203a204e756d626572206f66206d756c746941646d5f8201527f696e526f6c6573206d757374206265206f766572203100000000000000000000602082015250565b5f62000dc660368362000d5a565b915062000dd38262000d6a565b604082019050919050565b5f6020820190508181035f83015262000df78162000db8565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f5969646f6379546f6b656e203a206d756c746941646d696e526f6c65206164645f8201527f7265737320636f756c64206e6f74206265207a65726f00000000000000000000602082015250565b5f62000e8760368362000d5a565b915062000e948262000e2b565b604082019050919050565b5f6020820190508181035f83015262000eb88162000e79565b9050919050565b7f5969646f6379546f6b656e203a2045786365707420636f6e74727563746f722c5f8201527f206e756d626572206f66206d756c746941646d696e526f6c6573206d7573742060208201527f6265206f76657220310000000000000000000000000000000000000000000000604082015250565b5f62000f4160498362000d5a565b915062000f4e8262000ebf565b606082019050919050565b5f6020820190508181035f83015262000f728162000f33565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000fb282620009ac565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000fe75762000fe662000f79565b5b600182019050919050565b62000ffd81620008c5565b82525050565b5f602082019050620010185f83018462000ff2565b92915050565b5f6200102a82620009ac565b91506200103783620009ac565b925082820190508082111562001052576200105162000f79565b5b92915050565b6200106381620009ac565b82525050565b5f6060820190506200107e5f83018662000ff2565b6200108d602083018562001058565b6200109c604083018462001058565b949350505050565b5f602082019050620010b95f83018462001058565b92915050565b608051615410620010d55f395f50506154105ff3fe608060405234801561000f575f80fd5b50600436106101ee575f3560e01c806370a082311161010d578063a136e2e9116100a0578063cf9dfe671161006f578063cf9dfe67146105fb578063d547741f14610619578063dd62ed3e14610635578063fb66da2c14610665576101ee565b8063a136e2e914610573578063a217fddf14610591578063a9059cbb146105af578063cda6b847146105df576101ee565b806394c0b71b116100dc57806394c0b71b146104d957806394d74d8f146104f557806395d89b411461052557806397a909c514610543576101ee565b806370a082311461042a57806378238c371461045a5780637d2597bc1461047657806391d14854146104a9576101ee565b806324d7806c1161018557806344df8e701161015457806344df8e701461039c5780634cfc302a146103a65780634fa4544f146103dc5780636548ec3c146103fa576101ee565b806324d7806c146103165780632f2ff15d14610346578063313ce5671461036257806336568abe14610380576101ee565b80631394de35116101c15780631394de351461027a57806318160ddd1461029857806323b872dd146102b6578063248a9ca3146102e6576101ee565b806301ffc9a7146101f257806306fdde0314610222578063095ea7b3146102405780631249c58b14610270575b5f80fd5b61020c60048036038101906102079190613d24565b610695565b6040516102199190613d69565b60405180910390f35b61022a61070e565b6040516102379190613e0c565b60405180910390f35b61025a60048036038101906102559190613eb9565b61079e565b6040516102679190613d69565b60405180910390f35b6102786107c0565b005b6102826107fb565b60405161028f9190613fae565b60405180910390f35b6102a061097b565b6040516102ad9190613fdd565b60405180910390f35b6102d060048036038101906102cb9190613ff6565b610984565b6040516102dd9190613d69565b60405180910390f35b61030060048036038101906102fb9190614079565b6109e5565b60405161030d91906140b3565b60405180910390f35b610330600480360381019061032b91906140cc565b610a02565b60405161033d9190613d69565b60405180910390f35b610360600480360381019061035b91906140f7565b610a16565b005b61036a610a2d565b6040516103779190614150565b60405180910390f35b61039a600480360381019061039591906140f7565b610a35565b005b6103a4610a39565b005b6103c060048036038101906103bb9190614169565b610a74565b6040516103d397969594939291906141a3565b60405180910390f35b6103e4610c04565b6040516103f19190613fdd565b60405180910390f35b610414600480360381019061040f91906140cc565b610c12565b6040516104219190613fdd565b60405180910390f35b610444600480360381019061043f91906140cc565b610fd8565b6040516104519190613fdd565b60405180910390f35b610474600480360381019061046f91906140cc565b61101d565b005b610490600480360381019061048b91906140cc565b6111a5565b6040516104a094939291906142c7565b60405180910390f35b6104c360048036038101906104be91906140f7565b611436565b6040516104d09190613d69565b60405180910390f35b6104f360048036038101906104ee9190614482565b61149a565b005b61050f600480360381019061050a919061456d565b611b45565b60405161051c9190613fdd565b60405180910390f35b61052d61250c565b60405161053a9190613e0c565b60405180910390f35b61055d600480360381019061055891906140cc565b61259c565b60405161056a9190613fdd565b60405180910390f35b61057b6129d0565b6040516105889190613fdd565b60405180910390f35b6105996129d9565b6040516105a691906140b3565b60405180910390f35b6105c960048036038101906105c49190613eb9565b6129df565b6040516105d69190613d69565b60405180910390f35b6105f960048036038101906105f49190614169565b612a45565b005b610603612afd565b6040516106109190613fae565b60405180910390f35b610633600480360381019061062e91906140f7565b612b88565b005b61064f600480360381019061064a9190614598565b612b9f565b60405161065c9190613fdd565b60405180910390f35b61067f600480360381019061067a91906140cc565b612c21565b60405161068c9190613fdd565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610707575061070682613055565b5b9050919050565b60606003805461071d90614603565b80601f016020809104026020016040519081016040528092919081815260200182805461074990614603565b80156107945780601f1061076b57610100808354040283529160200191610794565b820191905f5260205f20905b81548152906001019060200180831161077757829003601f168201915b5050505050905090565b5f806107a86130be565b90506107b58185856130c5565b600191505092915050565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f2906146a3565b60405180910390fd5b60606108056130d7565b67ffffffffffffffff81111561081e5761081d614346565b5b60405190808252806020026020018201604052801561084c5781602001602082028036833780820191505090505b5090505f805b600980549050811015610976575f73ffffffffffffffffffffffffffffffffffffffff166009828154811061088a576108896146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461096357600981815481106108e1576108e06146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383806109159061471b565b945081518110610928576109276146c1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b808061096e9061471b565b915050610852565b505090565b5f600254905090565b5f816109908585613183565b10156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906147d2565b60405180910390fd5b6109dc848484613472565b90509392505050565b5f60055f8381526020019081526020015f20600101549050919050565b5f610a0f5f801b83611436565b9050919050565b610a1f826109e5565b610a28816134a0565b505050565b5f6008905090565b5050565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6b90614860565b60405180910390fd5b5f805f805f805f600b548810610abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab6906148ee565b60405180910390fd5b600a5f8981526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169650600a5f8981526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169550600a5f8981526020019081526020015f20600201549450600a5f8981526020019081526020015f20600301549350600a5f8981526020019081526020015f206004015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250600a5f8981526020019081526020015f206005015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600a5f8981526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919395979092949650565b5f610c0d6130d7565b905090565b5f610c1c336134b4565b610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c529061497c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc090614a0a565b60405180910390fd5b5f600b541480610cfa57505f600a5f6001600b54610ce79190614a28565b81526020019081526020015f2060030154115b610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3090614acb565b60405180910390fd5b5f600b5490506001600b5f828254610d519190614ae9565b925050819055506040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001600281526020015f81526020013373ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815250600a5f8381526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816005015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050503373ffffffffffffffffffffffffffffffffffffffff167f1856f2a9466fc9694120d85bbe5912e43f8dcac0e7444b633d37e9b8797edc4c600283604051610fc7929190614b5e565b60405180910390a280915050919050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611026336134b4565b611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c9061497c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110eb90614bf5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115990614c83565b60405180910390fd5b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f806060805f93505f60085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060800160405290815f820154815260200160018201548152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201805480602002602001604051908101604052809291908181526020015f905b828210156112c5578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190611282565b505050508152505090505f815f0151111561142e57805f015194508060200151935080606001515167ffffffffffffffff81111561130657611305614346565b5b6040519080825280602002602001820160405280156113345781602001602082028036833780820191505090505b50925080606001515167ffffffffffffffff81111561135657611355614346565b5b6040519080825280602002602001820160405280156113845781602001602082028036833780820191505090505b5091505f5b81606001515181101561142c57816060015181815181106113ad576113ac6146c1565b5b60200260200101515f01518482815181106113cb576113ca6146c1565b5b602002602001018181525050816060015181815181106113ee576113ed6146c1565b5b60200260200101516020015183828151811061140d5761140c6146c1565b5b60200260200101818152505080806114249061471b565b915050611389565b505b509193509193565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6114a3336134b4565b6114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d99061497c565b60405180910390fd5b5f840361172e5760085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8082015f9055600182015f9055600282015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600382015f6115699190613c79565b50505f60078054905090505f5b81811015611727578673ffffffffffffffffffffffffffffffffffffffff16600782815481106115a9576115a86146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036117145760078181548110611600576115ff6146c1565b5b905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560076001836116399190614a28565b8154811061164a576116496146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660078281548110611686576116856146c1565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060078054806116dd576116dc614ca1565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055611727565b808061171f9061471b565b915050611576565b5050611b3d565b8051825114611772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176990614d64565b60405180910390fd5b5f805b83518110156117b957828181518110611791576117906146c1565b5b6020026020010151826117a49190614ae9565b915080806117b19061471b565b915050611775565b50848111156117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f490614e18565b60405180910390fd5b8460085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01819055508360ff1660085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101819055508660085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015f6119529190613c79565b5f5b8351811015611a335760085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060030160405180604001604052808684815181106119bb576119ba6146c1565b5b602002602001015181526020018584815181106119db576119da6146c1565b5b6020026020010151815250908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f01556020820151816001015550508080611a2b9061471b565b915050611954565b505f8060078054905090505f5b81811015611ad2578873ffffffffffffffffffffffffffffffffffffffff1660078281548110611a7357611a726146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611abf5760019250611ad2565b8080611aca9061471b565b915050611a40565b5081611b3957600788908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050505b505050505050565b5f611b4f336134b4565b611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b859061497c565b60405180910390fd5b5f600b5411611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc990614ea6565b60405180910390fd5b5f6001600b54611be29190614a28565b90505f600b54118015611c0857505f600a5f8381526020019081526020015f2060030154145b611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e90614f34565b60405180910390fd5b600a5f8281526020019081526020015f206004015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603611ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdf90614fc2565b60405180910390fd5b82156123e0576001600a5f8381526020019081526020015f206003018190555033600a5f8381526020019081526020015f206005015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f600a5f8381526020019081526020015f206006015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a5f8381526020019081526020015f206002015403611f3557611e065f801b600a5f8481526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166134c8565b506009600a5f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a5f8281526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbc711a5bc58cc648fd036ed1db719e9c7c5fb92914031817f543568b9f936b6a83604051611f289190613fdd565b60405180910390a36123db565b6002600a5f8381526020019081526020015f20600201540361215157611f905f801b600a5f8481526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135b2565b505f5b6009805490508110156120b357600a5f8381526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660098281548110611ffe57611ffd6146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036120a0575f60098281548110612056576120556146c1565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506120b3565b80806120ab9061471b565b915050611f93565b50600a5f8281526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f93a2f844485e30d143e0c7361eebf3f6ec34c4f4f55332eea2be8c70a0fe5ea0836040516121449190613fdd565b60405180910390a36123da565b6003600a5f8381526020019081526020015f2060020154036123d9576121ab5f801b600a5f8481526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166134c8565b506121eb5f801b600a5f8481526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135b2565b505f5b60098054905081101561234057600a5f8381526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660098281548110612259576122586146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361232d57600a5f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600982815481106122e3576122e26146c1565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612340565b80806123389061471b565b9150506121ee565b50600a5f8281526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ffc8f4d09e96ba904a527fa1360c3d459aacd1f47bbb98e364a49dde5d9b1b0da836040516123d09190613fdd565b60405180910390a35b5b5b612503565b6002600a5f8381526020019081526020015f20600301819055505f600a5f8381526020019081526020015f206005015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600a5f8381526020019081526020015f206006015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167f9abb3b33111900360d220d1245bf87c952c1371f54d8cabc10407e50a9e9d26c600a5f8481526020019081526020015f2060020154836040516124fa929190614fe0565b60405180910390a25b80915050919050565b60606004805461251b90614603565b80601f016020809104026020016040519081016040528092919081815260200182805461254790614603565b80156125925780601f1061256957610100808354040283529160200191612592565b820191905f5260205f20905b81548152906001019060200180831161257557829003601f168201915b5050505050905090565b5f6125a6336134b4565b6125e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125dc9061497c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264a90615077565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b890615105565b60405180910390fd5b5f600b5414806126f257505f600a5f6001600b546126df9190614a28565b81526020019081526020015f2060030154115b612731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272890614acb565b60405180910390fd5b5f600b5490506001600b5f8282546127499190614ae9565b925050819055506040518060e001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001600381526020015f81526020013373ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815250600a5f8381526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816005015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050503373ffffffffffffffffffffffffffffffffffffffff167f1856f2a9466fc9694120d85bbe5912e43f8dcac0e7444b633d37e9b8797edc4c6003836040516129bf92919061515c565b60405180910390a280915050919050565b5f600b54905090565b5f801b81565b5f816129f26129ec6130be565b85613183565b1015612a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2a906151f3565b60405180910390fd5b612a3d838361369c565b905092915050565b612a7060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826129df565b5060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166347e7ef2433836040518363ffffffff1660e01b8152600401612acd929190615211565b5f604051808303815f87803b158015612ae4575f80fd5b505af1158015612af6573d5f803e3d5ffd5b5050505050565b60606007805480602002602001604051908101604052809291908181526020018280548015612b7e57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612b35575b5050505050905090565b612b91826109e5565b612b9a816134a0565b505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f612c2b336134b4565b612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c619061497c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccf90614a0a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3d906152a8565b60405180910390fd5b5f600b541480612d7757505f600a5f6001600b54612d649190614a28565b81526020019081526020015f2060030154115b612db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dad90614acb565b60405180910390fd5b5f600b5490506001600b5f828254612dce9190614ae9565b925050819055506040518060e001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff168152602001600181526020015f81526020013373ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815250600a5f8381526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816005015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050503373ffffffffffffffffffffffffffffffffffffffff167f1856f2a9466fc9694120d85bbe5912e43f8dcac0e7444b633d37e9b8797edc4c6001836040516130449291906152ff565b60405180910390a280915050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b6130d283838360016136be565b505050565b5f805f90505f5b60098054905081101561317b575f73ffffffffffffffffffffffffffffffffffffffff1660098281548110613116576131156146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146131685781806131649061471b565b9250505b80806131739061471b565b9150506130de565b508091505090565b5f8061318e84610fd8565b90505f60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060800160405290815f820154815260200160018201548152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201805480602002602001604051908101604052809291908181526020015f905b828210156132a8578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190613265565b505050508152505090505f815f015114806132f257508373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16145b1561330157819250505061346c565b5f816040015173ffffffffffffffffffffffffffffffffffffffff166323fc91e4876040518263ffffffff1660e01b815260040161333f9190615326565b602060405180830381865afa15801561335a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061337e9190615353565b90505f818461338d9190614ae9565b90505f4290505f84606001515190505f5b8181101561344c5782866060015182815181106133be576133bd6146c1565b5b60200260200101515f0151111561343957856060015181815181106133e6576133e56146c1565b5b602002602001015160200151841015613408575f97505050505050505061346c565b8560600151818151811061341f5761341e6146c1565b5b602002602001015160200151846134369190614a28565b93505b80806134449061471b565b91505061339e565b508583106134625785965050505050505061346c565b8296505050505050505b92915050565b5f8061347c6130be565b905061348985828561388d565b61349485858561391f565b60019150509392505050565b6134b1816134ac6130be565b613a0f565b50565b5f6134c15f801b83611436565b9050919050565b5f6134d38383611436565b6135a857600160055f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506135456130be565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600190506135ac565b5f90505b92915050565b5f6135bd8383611436565b15613692575f60055f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061362f6130be565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050613696565b5f90505b92915050565b5f806136a66130be565b90506136b381858561391f565b600191505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361372e575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016137259190615326565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361379e575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016137959190615326565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015613887578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161387e9190613fdd565b60405180910390a35b50505050565b5f6138988484612b9f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114613919578181101561390a578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016139019392919061537e565b60405180910390fd5b61391884848484035f6136be565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361398f575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016139869190615326565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036139ff575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016139f69190615326565b60405180910390fd5b613a0a838383613a60565b505050565b613a198282611436565b613a5c5780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401613a539291906153b3565b60405180910390fd5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613ab0578060025f828254613aa49190614ae9565b92505081905550613b7e565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613b39578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401613b309392919061537e565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613bc5578060025f8282540392505081905550613c0f565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c6c9190613fdd565b60405180910390a3505050565b5080545f8255600202905f5260205f2090810190613c979190613c9a565b50565b5b80821115613cba575f8082015f9055600182015f905550600201613c9b565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613d0381613ccf565b8114613d0d575f80fd5b50565b5f81359050613d1e81613cfa565b92915050565b5f60208284031215613d3957613d38613cc7565b5b5f613d4684828501613d10565b91505092915050565b5f8115159050919050565b613d6381613d4f565b82525050565b5f602082019050613d7c5f830184613d5a565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613db9578082015181840152602081019050613d9e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613dde82613d82565b613de88185613d8c565b9350613df8818560208601613d9c565b613e0181613dc4565b840191505092915050565b5f6020820190508181035f830152613e248184613dd4565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e5582613e2c565b9050919050565b613e6581613e4b565b8114613e6f575f80fd5b50565b5f81359050613e8081613e5c565b92915050565b5f819050919050565b613e9881613e86565b8114613ea2575f80fd5b50565b5f81359050613eb381613e8f565b92915050565b5f8060408385031215613ecf57613ece613cc7565b5b5f613edc85828601613e72565b9250506020613eed85828601613ea5565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613f2981613e4b565b82525050565b5f613f3a8383613f20565b60208301905092915050565b5f602082019050919050565b5f613f5c82613ef7565b613f668185613f01565b9350613f7183613f11565b805f5b83811015613fa1578151613f888882613f2f565b9750613f9383613f46565b925050600181019050613f74565b5085935050505092915050565b5f6020820190508181035f830152613fc68184613f52565b905092915050565b613fd781613e86565b82525050565b5f602082019050613ff05f830184613fce565b92915050565b5f805f6060848603121561400d5761400c613cc7565b5b5f61401a86828701613e72565b935050602061402b86828701613e72565b925050604061403c86828701613ea5565b9150509250925092565b5f819050919050565b61405881614046565b8114614062575f80fd5b50565b5f813590506140738161404f565b92915050565b5f6020828403121561408e5761408d613cc7565b5b5f61409b84828501614065565b91505092915050565b6140ad81614046565b82525050565b5f6020820190506140c65f8301846140a4565b92915050565b5f602082840312156140e1576140e0613cc7565b5b5f6140ee84828501613e72565b91505092915050565b5f806040838503121561410d5761410c613cc7565b5b5f61411a85828601614065565b925050602061412b85828601613e72565b9150509250929050565b5f60ff82169050919050565b61414a81614135565b82525050565b5f6020820190506141635f830184614141565b92915050565b5f6020828403121561417e5761417d613cc7565b5b5f61418b84828501613ea5565b91505092915050565b61419d81613e4b565b82525050565b5f60e0820190506141b65f83018a614194565b6141c36020830189614194565b6141d06040830188613fce565b6141dd6060830187613fce565b6141ea6080830186614194565b6141f760a0830185614194565b61420460c0830184614194565b98975050505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61424281613e86565b82525050565b5f6142538383614239565b60208301905092915050565b5f602082019050919050565b5f61427582614210565b61427f818561421a565b935061428a8361422a565b805f5b838110156142ba5781516142a18882614248565b97506142ac8361425f565b92505060018101905061428d565b5085935050505092915050565b5f6080820190506142da5f830187613fce565b6142e76020830186613fce565b81810360408301526142f9818561426b565b9050818103606083015261430d818461426b565b905095945050505050565b61432181614135565b811461432b575f80fd5b50565b5f8135905061433c81614318565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61437c82613dc4565b810181811067ffffffffffffffff8211171561439b5761439a614346565b5b80604052505050565b5f6143ad613cbe565b90506143b98282614373565b919050565b5f67ffffffffffffffff8211156143d8576143d7614346565b5b602082029050602081019050919050565b5f80fd5b5f6143ff6143fa846143be565b6143a4565b90508083825260208201905060208402830185811115614422576144216143e9565b5b835b8181101561444b57806144378882613ea5565b845260208401935050602081019050614424565b5050509392505050565b5f82601f83011261446957614468614342565b5b81356144798482602086016143ed565b91505092915050565b5f805f805f8060c0878903121561449c5761449b613cc7565b5b5f6144a989828a01613e72565b96505060206144ba89828a01613e72565b95505060406144cb89828a01613ea5565b94505060606144dc89828a0161432e565b935050608087013567ffffffffffffffff8111156144fd576144fc613ccb565b5b61450989828a01614455565b92505060a087013567ffffffffffffffff81111561452a57614529613ccb565b5b61453689828a01614455565b9150509295509295509295565b61454c81613d4f565b8114614556575f80fd5b50565b5f8135905061456781614543565b92915050565b5f6020828403121561458257614581613cc7565b5b5f61458f84828501614559565b91505092915050565b5f80604083850312156145ae576145ad613cc7565b5b5f6145bb85828601613e72565b92505060206145cc85828601613e72565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061461a57607f821691505b60208210810361462d5761462c6145d6565b5b50919050565b7f5969646f6379546f6b656e203a206d696e74206973206e6f7420737570706f725f8201527f74656420666f72207468697320544f4b454e2121000000000000000000000000602082015250565b5f61468d603483613d8c565b915061469882614633565b604082019050919050565b5f6020820190508181035f8301526146ba81614681565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61472582613e86565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614757576147566146ee565b5b600182019050919050565b7f5969646f6379546f6b656e203a2043616e6e6f74207472616e736665722066725f8201527f6f6d206d6f7265207468616e207472616e7366657261626c6520616d6f756e74602082015250565b5f6147bc604083613d8c565b91506147c782614762565b604082019050919050565b5f6020820190508181035f8301526147e9816147b0565b9050919050565b7f5969646f6379546f6b656e203a206275726e206973206e6f7420737570706f725f8201527f74656420666f72207468697320544f4b454e2121000000000000000000000000602082015250565b5f61484a603483613d8c565b9150614855826147f0565b604082019050919050565b5f6020820190508181035f8301526148778161483e565b9050919050565b7f5969646f6379546f6b656e203a2072657175657374496420646f6573206e6f745f8201527f2065786973740000000000000000000000000000000000000000000000000000602082015250565b5f6148d8602683613d8c565b91506148e38261487e565b604082019050919050565b5f6020820190508181035f830152614905816148cc565b9050919050565b7f5969646f6379546f6b656e203a205265737472696374656420746f2061646d695f8201527f6e732e0000000000000000000000000000000000000000000000000000000000602082015250565b5f614966602383613d8c565b91506149718261490c565b604082019050919050565b5f6020820190508181035f8301526149938161495a565b9050919050565b7f5969646f6379546f6b656e203a2043616e6e6f74206164642061646d696e20725f8201527f6f6c6520666f72207a65726f2061646472657373000000000000000000000000602082015250565b5f6149f4603483613d8c565b91506149ff8261499a565b604082019050919050565b5f6020820190508181035f830152614a21816149e8565b9050919050565b5f614a3282613e86565b9150614a3d83613e86565b9250828203905081811115614a5557614a546146ee565b5b92915050565b7f5969646f6379546f6b656e203a2050726576696f75732041646d696e526f6c655f8201527f20526571756573742069732070656e64696e6700000000000000000000000000602082015250565b5f614ab5603383613d8c565b9150614ac082614a5b565b604082019050919050565b5f6020820190508181035f830152614ae281614aa9565b9050919050565b5f614af382613e86565b9150614afe83613e86565b9250828201905080821115614b1657614b156146ee565b5b92915050565b5f819050919050565b5f819050919050565b5f614b48614b43614b3e84614b1c565b614b25565b613e86565b9050919050565b614b5881614b2e565b82525050565b5f604082019050614b715f830185614b4f565b614b7e6020830184613fce565b9392505050565b7f5969646f6379546f6b656e203a20736574526577617264506f6f6c206d7573745f8201527f2063616c6c6564206f6e636520617420746865206465706c6f792074696d6500602082015250565b5f614bdf603f83613d8c565b9150614bea82614b85565b604082019050919050565b5f6020820190508181035f830152614c0c81614bd3565b9050919050565b7f5969646f6379546f6b656e203a20526577617264506f6f6c20616464726573735f8201527f2069732072657175697265640000000000000000000000000000000000000000602082015250565b5f614c6d602c83613d8c565b9150614c7882614c13565b604082019050919050565b5f6020820190508181035f830152614c9a81614c61565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b7f5969646f6379546f6b656e203a204c6f636b75702064617465206c69737420615f8201527f6e6420616d6f756e74206c697374206d757374206265207468652073616d652060208201527f6c656e6774682100000000000000000000000000000000000000000000000000604082015250565b5f614d4e604783613d8c565b9150614d5982614cce565b606082019050919050565b5f6020820190508181035f830152614d7b81614d42565b9050919050565b7f5969646f6379546f6b656e203a204c6f636b75702076657374696e6720746f745f8201527f616c20616d6f756e74206d757374206265206c657373206f7220657175616c2060208201527f746f20746865206c6f636b757020616d6f756e74210000000000000000000000604082015250565b5f614e02605583613d8c565b9150614e0d82614d82565b606082019050919050565b5f6020820190508181035f830152614e2f81614df6565b9050919050565b7f5969646f6379546f6b656e203a205468657265206973206e6f206578637574615f8201527f626c652041646d696e526f6c6552657175657374000000000000000000000000602082015250565b5f614e90603483613d8c565b9150614e9b82614e36565b604082019050919050565b5f6020820190508181035f830152614ebd81614e84565b9050919050565b7f5969646f6379546f6b656e203a204e6f2041646d696e526f6c652052657175655f8201527f7374206973207265717565737465640000000000000000000000000000000000602082015250565b5f614f1e602f83613d8c565b9150614f2982614ec4565b604082019050919050565b5f6020820190508181035f830152614f4b81614f12565b9050919050565b7f5969646f6379546f6b656e203a20457865637574652052657175657374206d755f8201527f737420626520746865206f7468657220616d64696e526f6c6572000000000000602082015250565b5f614fac603a83613d8c565b9150614fb782614f52565b604082019050919050565b5f6020820190508181035f830152614fd981614fa0565b9050919050565b5f604082019050614ff35f830185613fce565b6150006020830184613fce565b9392505050565b7f5969646f6379546f6b656e203a2043616e6e6f74207472616e736665722061645f8201527f6d696e20726f6c6520746f207a65726f20616464726573730000000000000000602082015250565b5f615061603883613d8c565b915061506c82615007565b604082019050919050565b5f6020820190508181035f83015261508e81615055565b9050919050565b7f5969646f6379546f6b656e203a2043616e6e6f74207472616e736665722061645f8201527f6d696e20726f6c6520746f207468652073616d65206164647265737300000000602082015250565b5f6150ef603c83613d8c565b91506150fa82615095565b604082019050919050565b5f6020820190508181035f83015261511c816150e3565b9050919050565b5f819050919050565b5f61514661514161513c84615123565b614b25565b613e86565b9050919050565b6151568161512c565b82525050565b5f60408201905061516f5f83018561514d565b61517c6020830184613fce565b9392505050565b7f5969646f6379546f6b656e203a2043616e6e6f74207472616e73666572206d6f5f8201527f7265207468616e207472616e7366657261626c6520616d6f756e740000000000602082015250565b5f6151dd603b83613d8c565b91506151e882615183565b604082019050919050565b5f6020820190508181035f83015261520a816151d1565b9050919050565b5f6040820190506152245f830185614194565b6152316020830184613fce565b9392505050565b7f5969646f6379546f6b656e203a2043616e6e6f74206164642061646d696e20725f8201527f6f6c6520666f72207468652073616d6520616464726573730000000000000000602082015250565b5f615292603883613d8c565b915061529d82615238565b604082019050919050565b5f6020820190508181035f8301526152bf81615286565b9050919050565b5f819050919050565b5f6152e96152e46152df846152c6565b614b25565b613e86565b9050919050565b6152f9816152cf565b82525050565b5f6040820190506153125f8301856152f0565b61531f6020830184613fce565b9392505050565b5f6020820190506153395f830184614194565b92915050565b5f8151905061534d81613e8f565b92915050565b5f6020828403121561536857615367613cc7565b5b5f6153758482850161533f565b91505092915050565b5f6060820190506153915f830186614194565b61539e6020830185613fce565b6153ab6040830184613fce565b949350505050565b5f6040820190506153c65f830185614194565b6153d360208301846140a4565b939250505056fea264697066735822122055dd98f62b710ed3f7683d04260e292273c931c36f91d5efea235c1fe14fd59264736f6c634300081400330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c6ac43fbf09d7a62bb26621c53d81598d79477df000000000000000000000000e36b810471c45ed8446b9ecfef481cb99c04f1b2

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106101ee575f3560e01c806370a082311161010d578063a136e2e9116100a0578063cf9dfe671161006f578063cf9dfe67146105fb578063d547741f14610619578063dd62ed3e14610635578063fb66da2c14610665576101ee565b8063a136e2e914610573578063a217fddf14610591578063a9059cbb146105af578063cda6b847146105df576101ee565b806394c0b71b116100dc57806394c0b71b146104d957806394d74d8f146104f557806395d89b411461052557806397a909c514610543576101ee565b806370a082311461042a57806378238c371461045a5780637d2597bc1461047657806391d14854146104a9576101ee565b806324d7806c1161018557806344df8e701161015457806344df8e701461039c5780634cfc302a146103a65780634fa4544f146103dc5780636548ec3c146103fa576101ee565b806324d7806c146103165780632f2ff15d14610346578063313ce5671461036257806336568abe14610380576101ee565b80631394de35116101c15780631394de351461027a57806318160ddd1461029857806323b872dd146102b6578063248a9ca3146102e6576101ee565b806301ffc9a7146101f257806306fdde0314610222578063095ea7b3146102405780631249c58b14610270575b5f80fd5b61020c60048036038101906102079190613d24565b610695565b6040516102199190613d69565b60405180910390f35b61022a61070e565b6040516102379190613e0c565b60405180910390f35b61025a60048036038101906102559190613eb9565b61079e565b6040516102679190613d69565b60405180910390f35b6102786107c0565b005b6102826107fb565b60405161028f9190613fae565b60405180910390f35b6102a061097b565b6040516102ad9190613fdd565b60405180910390f35b6102d060048036038101906102cb9190613ff6565b610984565b6040516102dd9190613d69565b60405180910390f35b61030060048036038101906102fb9190614079565b6109e5565b60405161030d91906140b3565b60405180910390f35b610330600480360381019061032b91906140cc565b610a02565b60405161033d9190613d69565b60405180910390f35b610360600480360381019061035b91906140f7565b610a16565b005b61036a610a2d565b6040516103779190614150565b60405180910390f35b61039a600480360381019061039591906140f7565b610a35565b005b6103a4610a39565b005b6103c060048036038101906103bb9190614169565b610a74565b6040516103d397969594939291906141a3565b60405180910390f35b6103e4610c04565b6040516103f19190613fdd565b60405180910390f35b610414600480360381019061040f91906140cc565b610c12565b6040516104219190613fdd565b60405180910390f35b610444600480360381019061043f91906140cc565b610fd8565b6040516104519190613fdd565b60405180910390f35b610474600480360381019061046f91906140cc565b61101d565b005b610490600480360381019061048b91906140cc565b6111a5565b6040516104a094939291906142c7565b60405180910390f35b6104c360048036038101906104be91906140f7565b611436565b6040516104d09190613d69565b60405180910390f35b6104f360048036038101906104ee9190614482565b61149a565b005b61050f600480360381019061050a919061456d565b611b45565b60405161051c9190613fdd565b60405180910390f35b61052d61250c565b60405161053a9190613e0c565b60405180910390f35b61055d600480360381019061055891906140cc565b61259c565b60405161056a9190613fdd565b60405180910390f35b61057b6129d0565b6040516105889190613fdd565b60405180910390f35b6105996129d9565b6040516105a691906140b3565b60405180910390f35b6105c960048036038101906105c49190613eb9565b6129df565b6040516105d69190613d69565b60405180910390f35b6105f960048036038101906105f49190614169565b612a45565b005b610603612afd565b6040516106109190613fae565b60405180910390f35b610633600480360381019061062e91906140f7565b612b88565b005b61064f600480360381019061064a9190614598565b612b9f565b60405161065c9190613fdd565b60405180910390f35b61067f600480360381019061067a91906140cc565b612c21565b60405161068c9190613fdd565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610707575061070682613055565b5b9050919050565b60606003805461071d90614603565b80601f016020809104026020016040519081016040528092919081815260200182805461074990614603565b80156107945780601f1061076b57610100808354040283529160200191610794565b820191905f5260205f20905b81548152906001019060200180831161077757829003601f168201915b5050505050905090565b5f806107a86130be565b90506107b58185856130c5565b600191505092915050565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f2906146a3565b60405180910390fd5b60606108056130d7565b67ffffffffffffffff81111561081e5761081d614346565b5b60405190808252806020026020018201604052801561084c5781602001602082028036833780820191505090505b5090505f805b600980549050811015610976575f73ffffffffffffffffffffffffffffffffffffffff166009828154811061088a576108896146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461096357600981815481106108e1576108e06146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383806109159061471b565b945081518110610928576109276146c1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b808061096e9061471b565b915050610852565b505090565b5f600254905090565b5f816109908585613183565b10156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906147d2565b60405180910390fd5b6109dc848484613472565b90509392505050565b5f60055f8381526020019081526020015f20600101549050919050565b5f610a0f5f801b83611436565b9050919050565b610a1f826109e5565b610a28816134a0565b505050565b5f6008905090565b5050565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6b90614860565b60405180910390fd5b5f805f805f805f600b548810610abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab6906148ee565b60405180910390fd5b600a5f8981526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169650600a5f8981526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169550600a5f8981526020019081526020015f20600201549450600a5f8981526020019081526020015f20600301549350600a5f8981526020019081526020015f206004015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250600a5f8981526020019081526020015f206005015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600a5f8981526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919395979092949650565b5f610c0d6130d7565b905090565b5f610c1c336134b4565b610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c529061497c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc090614a0a565b60405180910390fd5b5f600b541480610cfa57505f600a5f6001600b54610ce79190614a28565b81526020019081526020015f2060030154115b610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3090614acb565b60405180910390fd5b5f600b5490506001600b5f828254610d519190614ae9565b925050819055506040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001600281526020015f81526020013373ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815250600a5f8381526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816005015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050503373ffffffffffffffffffffffffffffffffffffffff167f1856f2a9466fc9694120d85bbe5912e43f8dcac0e7444b633d37e9b8797edc4c600283604051610fc7929190614b5e565b60405180910390a280915050919050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611026336134b4565b611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c9061497c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110eb90614bf5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115990614c83565b60405180910390fd5b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f806060805f93505f60085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060800160405290815f820154815260200160018201548152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201805480602002602001604051908101604052809291908181526020015f905b828210156112c5578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190611282565b505050508152505090505f815f0151111561142e57805f015194508060200151935080606001515167ffffffffffffffff81111561130657611305614346565b5b6040519080825280602002602001820160405280156113345781602001602082028036833780820191505090505b50925080606001515167ffffffffffffffff81111561135657611355614346565b5b6040519080825280602002602001820160405280156113845781602001602082028036833780820191505090505b5091505f5b81606001515181101561142c57816060015181815181106113ad576113ac6146c1565b5b60200260200101515f01518482815181106113cb576113ca6146c1565b5b602002602001018181525050816060015181815181106113ee576113ed6146c1565b5b60200260200101516020015183828151811061140d5761140c6146c1565b5b60200260200101818152505080806114249061471b565b915050611389565b505b509193509193565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6114a3336134b4565b6114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d99061497c565b60405180910390fd5b5f840361172e5760085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8082015f9055600182015f9055600282015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600382015f6115699190613c79565b50505f60078054905090505f5b81811015611727578673ffffffffffffffffffffffffffffffffffffffff16600782815481106115a9576115a86146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036117145760078181548110611600576115ff6146c1565b5b905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560076001836116399190614a28565b8154811061164a576116496146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660078281548110611686576116856146c1565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060078054806116dd576116dc614ca1565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055611727565b808061171f9061471b565b915050611576565b5050611b3d565b8051825114611772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176990614d64565b60405180910390fd5b5f805b83518110156117b957828181518110611791576117906146c1565b5b6020026020010151826117a49190614ae9565b915080806117b19061471b565b915050611775565b50848111156117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f490614e18565b60405180910390fd5b8460085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01819055508360ff1660085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101819055508660085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015f6119529190613c79565b5f5b8351811015611a335760085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060030160405180604001604052808684815181106119bb576119ba6146c1565b5b602002602001015181526020018584815181106119db576119da6146c1565b5b6020026020010151815250908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f01556020820151816001015550508080611a2b9061471b565b915050611954565b505f8060078054905090505f5b81811015611ad2578873ffffffffffffffffffffffffffffffffffffffff1660078281548110611a7357611a726146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611abf5760019250611ad2565b8080611aca9061471b565b915050611a40565b5081611b3957600788908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050505b505050505050565b5f611b4f336134b4565b611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b859061497c565b60405180910390fd5b5f600b5411611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc990614ea6565b60405180910390fd5b5f6001600b54611be29190614a28565b90505f600b54118015611c0857505f600a5f8381526020019081526020015f2060030154145b611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e90614f34565b60405180910390fd5b600a5f8281526020019081526020015f206004015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603611ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdf90614fc2565b60405180910390fd5b82156123e0576001600a5f8381526020019081526020015f206003018190555033600a5f8381526020019081526020015f206005015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f600a5f8381526020019081526020015f206006015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a5f8381526020019081526020015f206002015403611f3557611e065f801b600a5f8481526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166134c8565b506009600a5f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a5f8281526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbc711a5bc58cc648fd036ed1db719e9c7c5fb92914031817f543568b9f936b6a83604051611f289190613fdd565b60405180910390a36123db565b6002600a5f8381526020019081526020015f20600201540361215157611f905f801b600a5f8481526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135b2565b505f5b6009805490508110156120b357600a5f8381526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660098281548110611ffe57611ffd6146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036120a0575f60098281548110612056576120556146c1565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506120b3565b80806120ab9061471b565b915050611f93565b50600a5f8281526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f93a2f844485e30d143e0c7361eebf3f6ec34c4f4f55332eea2be8c70a0fe5ea0836040516121449190613fdd565b60405180910390a36123da565b6003600a5f8381526020019081526020015f2060020154036123d9576121ab5f801b600a5f8481526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166134c8565b506121eb5f801b600a5f8481526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135b2565b505f5b60098054905081101561234057600a5f8381526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660098281548110612259576122586146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361232d57600a5f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600982815481106122e3576122e26146c1565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612340565b80806123389061471b565b9150506121ee565b50600a5f8281526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ffc8f4d09e96ba904a527fa1360c3d459aacd1f47bbb98e364a49dde5d9b1b0da836040516123d09190613fdd565b60405180910390a35b5b5b612503565b6002600a5f8381526020019081526020015f20600301819055505f600a5f8381526020019081526020015f206005015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600a5f8381526020019081526020015f206006015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167f9abb3b33111900360d220d1245bf87c952c1371f54d8cabc10407e50a9e9d26c600a5f8481526020019081526020015f2060020154836040516124fa929190614fe0565b60405180910390a25b80915050919050565b60606004805461251b90614603565b80601f016020809104026020016040519081016040528092919081815260200182805461254790614603565b80156125925780601f1061256957610100808354040283529160200191612592565b820191905f5260205f20905b81548152906001019060200180831161257557829003601f168201915b5050505050905090565b5f6125a6336134b4565b6125e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125dc9061497c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264a90615077565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b890615105565b60405180910390fd5b5f600b5414806126f257505f600a5f6001600b546126df9190614a28565b81526020019081526020015f2060030154115b612731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272890614acb565b60405180910390fd5b5f600b5490506001600b5f8282546127499190614ae9565b925050819055506040518060e001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001600381526020015f81526020013373ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815250600a5f8381526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816005015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050503373ffffffffffffffffffffffffffffffffffffffff167f1856f2a9466fc9694120d85bbe5912e43f8dcac0e7444b633d37e9b8797edc4c6003836040516129bf92919061515c565b60405180910390a280915050919050565b5f600b54905090565b5f801b81565b5f816129f26129ec6130be565b85613183565b1015612a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2a906151f3565b60405180910390fd5b612a3d838361369c565b905092915050565b612a7060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826129df565b5060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166347e7ef2433836040518363ffffffff1660e01b8152600401612acd929190615211565b5f604051808303815f87803b158015612ae4575f80fd5b505af1158015612af6573d5f803e3d5ffd5b5050505050565b60606007805480602002602001604051908101604052809291908181526020018280548015612b7e57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612b35575b5050505050905090565b612b91826109e5565b612b9a816134a0565b505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f612c2b336134b4565b612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c619061497c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccf90614a0a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3d906152a8565b60405180910390fd5b5f600b541480612d7757505f600a5f6001600b54612d649190614a28565b81526020019081526020015f2060030154115b612db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dad90614acb565b60405180910390fd5b5f600b5490506001600b5f828254612dce9190614ae9565b925050819055506040518060e001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff168152602001600181526020015f81526020013373ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815250600a5f8381526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816005015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050503373ffffffffffffffffffffffffffffffffffffffff167f1856f2a9466fc9694120d85bbe5912e43f8dcac0e7444b633d37e9b8797edc4c6001836040516130449291906152ff565b60405180910390a280915050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b6130d283838360016136be565b505050565b5f805f90505f5b60098054905081101561317b575f73ffffffffffffffffffffffffffffffffffffffff1660098281548110613116576131156146c1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146131685781806131649061471b565b9250505b80806131739061471b565b9150506130de565b508091505090565b5f8061318e84610fd8565b90505f60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060800160405290815f820154815260200160018201548152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201805480602002602001604051908101604052809291908181526020015f905b828210156132a8578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190613265565b505050508152505090505f815f015114806132f257508373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16145b1561330157819250505061346c565b5f816040015173ffffffffffffffffffffffffffffffffffffffff166323fc91e4876040518263ffffffff1660e01b815260040161333f9190615326565b602060405180830381865afa15801561335a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061337e9190615353565b90505f818461338d9190614ae9565b90505f4290505f84606001515190505f5b8181101561344c5782866060015182815181106133be576133bd6146c1565b5b60200260200101515f0151111561343957856060015181815181106133e6576133e56146c1565b5b602002602001015160200151841015613408575f97505050505050505061346c565b8560600151818151811061341f5761341e6146c1565b5b602002602001015160200151846134369190614a28565b93505b80806134449061471b565b91505061339e565b508583106134625785965050505050505061346c565b8296505050505050505b92915050565b5f8061347c6130be565b905061348985828561388d565b61349485858561391f565b60019150509392505050565b6134b1816134ac6130be565b613a0f565b50565b5f6134c15f801b83611436565b9050919050565b5f6134d38383611436565b6135a857600160055f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506135456130be565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600190506135ac565b5f90505b92915050565b5f6135bd8383611436565b15613692575f60055f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061362f6130be565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050613696565b5f90505b92915050565b5f806136a66130be565b90506136b381858561391f565b600191505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361372e575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016137259190615326565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361379e575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016137959190615326565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015613887578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161387e9190613fdd565b60405180910390a35b50505050565b5f6138988484612b9f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114613919578181101561390a578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016139019392919061537e565b60405180910390fd5b61391884848484035f6136be565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361398f575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016139869190615326565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036139ff575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016139f69190615326565b60405180910390fd5b613a0a838383613a60565b505050565b613a198282611436565b613a5c5780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401613a539291906153b3565b60405180910390fd5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613ab0578060025f828254613aa49190614ae9565b92505081905550613b7e565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613b39578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401613b309392919061537e565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613bc5578060025f8282540392505081905550613c0f565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c6c9190613fdd565b60405180910390a3505050565b5080545f8255600202905f5260205f2090810190613c979190613c9a565b50565b5b80821115613cba575f8082015f9055600182015f905550600201613c9b565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613d0381613ccf565b8114613d0d575f80fd5b50565b5f81359050613d1e81613cfa565b92915050565b5f60208284031215613d3957613d38613cc7565b5b5f613d4684828501613d10565b91505092915050565b5f8115159050919050565b613d6381613d4f565b82525050565b5f602082019050613d7c5f830184613d5a565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613db9578082015181840152602081019050613d9e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613dde82613d82565b613de88185613d8c565b9350613df8818560208601613d9c565b613e0181613dc4565b840191505092915050565b5f6020820190508181035f830152613e248184613dd4565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e5582613e2c565b9050919050565b613e6581613e4b565b8114613e6f575f80fd5b50565b5f81359050613e8081613e5c565b92915050565b5f819050919050565b613e9881613e86565b8114613ea2575f80fd5b50565b5f81359050613eb381613e8f565b92915050565b5f8060408385031215613ecf57613ece613cc7565b5b5f613edc85828601613e72565b9250506020613eed85828601613ea5565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613f2981613e4b565b82525050565b5f613f3a8383613f20565b60208301905092915050565b5f602082019050919050565b5f613f5c82613ef7565b613f668185613f01565b9350613f7183613f11565b805f5b83811015613fa1578151613f888882613f2f565b9750613f9383613f46565b925050600181019050613f74565b5085935050505092915050565b5f6020820190508181035f830152613fc68184613f52565b905092915050565b613fd781613e86565b82525050565b5f602082019050613ff05f830184613fce565b92915050565b5f805f6060848603121561400d5761400c613cc7565b5b5f61401a86828701613e72565b935050602061402b86828701613e72565b925050604061403c86828701613ea5565b9150509250925092565b5f819050919050565b61405881614046565b8114614062575f80fd5b50565b5f813590506140738161404f565b92915050565b5f6020828403121561408e5761408d613cc7565b5b5f61409b84828501614065565b91505092915050565b6140ad81614046565b82525050565b5f6020820190506140c65f8301846140a4565b92915050565b5f602082840312156140e1576140e0613cc7565b5b5f6140ee84828501613e72565b91505092915050565b5f806040838503121561410d5761410c613cc7565b5b5f61411a85828601614065565b925050602061412b85828601613e72565b9150509250929050565b5f60ff82169050919050565b61414a81614135565b82525050565b5f6020820190506141635f830184614141565b92915050565b5f6020828403121561417e5761417d613cc7565b5b5f61418b84828501613ea5565b91505092915050565b61419d81613e4b565b82525050565b5f60e0820190506141b65f83018a614194565b6141c36020830189614194565b6141d06040830188613fce565b6141dd6060830187613fce565b6141ea6080830186614194565b6141f760a0830185614194565b61420460c0830184614194565b98975050505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61424281613e86565b82525050565b5f6142538383614239565b60208301905092915050565b5f602082019050919050565b5f61427582614210565b61427f818561421a565b935061428a8361422a565b805f5b838110156142ba5781516142a18882614248565b97506142ac8361425f565b92505060018101905061428d565b5085935050505092915050565b5f6080820190506142da5f830187613fce565b6142e76020830186613fce565b81810360408301526142f9818561426b565b9050818103606083015261430d818461426b565b905095945050505050565b61432181614135565b811461432b575f80fd5b50565b5f8135905061433c81614318565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61437c82613dc4565b810181811067ffffffffffffffff8211171561439b5761439a614346565b5b80604052505050565b5f6143ad613cbe565b90506143b98282614373565b919050565b5f67ffffffffffffffff8211156143d8576143d7614346565b5b602082029050602081019050919050565b5f80fd5b5f6143ff6143fa846143be565b6143a4565b90508083825260208201905060208402830185811115614422576144216143e9565b5b835b8181101561444b57806144378882613ea5565b845260208401935050602081019050614424565b5050509392505050565b5f82601f83011261446957614468614342565b5b81356144798482602086016143ed565b91505092915050565b5f805f805f8060c0878903121561449c5761449b613cc7565b5b5f6144a989828a01613e72565b96505060206144ba89828a01613e72565b95505060406144cb89828a01613ea5565b94505060606144dc89828a0161432e565b935050608087013567ffffffffffffffff8111156144fd576144fc613ccb565b5b61450989828a01614455565b92505060a087013567ffffffffffffffff81111561452a57614529613ccb565b5b61453689828a01614455565b9150509295509295509295565b61454c81613d4f565b8114614556575f80fd5b50565b5f8135905061456781614543565b92915050565b5f6020828403121561458257614581613cc7565b5b5f61458f84828501614559565b91505092915050565b5f80604083850312156145ae576145ad613cc7565b5b5f6145bb85828601613e72565b92505060206145cc85828601613e72565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061461a57607f821691505b60208210810361462d5761462c6145d6565b5b50919050565b7f5969646f6379546f6b656e203a206d696e74206973206e6f7420737570706f725f8201527f74656420666f72207468697320544f4b454e2121000000000000000000000000602082015250565b5f61468d603483613d8c565b915061469882614633565b604082019050919050565b5f6020820190508181035f8301526146ba81614681565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61472582613e86565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614757576147566146ee565b5b600182019050919050565b7f5969646f6379546f6b656e203a2043616e6e6f74207472616e736665722066725f8201527f6f6d206d6f7265207468616e207472616e7366657261626c6520616d6f756e74602082015250565b5f6147bc604083613d8c565b91506147c782614762565b604082019050919050565b5f6020820190508181035f8301526147e9816147b0565b9050919050565b7f5969646f6379546f6b656e203a206275726e206973206e6f7420737570706f725f8201527f74656420666f72207468697320544f4b454e2121000000000000000000000000602082015250565b5f61484a603483613d8c565b9150614855826147f0565b604082019050919050565b5f6020820190508181035f8301526148778161483e565b9050919050565b7f5969646f6379546f6b656e203a2072657175657374496420646f6573206e6f745f8201527f2065786973740000000000000000000000000000000000000000000000000000602082015250565b5f6148d8602683613d8c565b91506148e38261487e565b604082019050919050565b5f6020820190508181035f830152614905816148cc565b9050919050565b7f5969646f6379546f6b656e203a205265737472696374656420746f2061646d695f8201527f6e732e0000000000000000000000000000000000000000000000000000000000602082015250565b5f614966602383613d8c565b91506149718261490c565b604082019050919050565b5f6020820190508181035f8301526149938161495a565b9050919050565b7f5969646f6379546f6b656e203a2043616e6e6f74206164642061646d696e20725f8201527f6f6c6520666f72207a65726f2061646472657373000000000000000000000000602082015250565b5f6149f4603483613d8c565b91506149ff8261499a565b604082019050919050565b5f6020820190508181035f830152614a21816149e8565b9050919050565b5f614a3282613e86565b9150614a3d83613e86565b9250828203905081811115614a5557614a546146ee565b5b92915050565b7f5969646f6379546f6b656e203a2050726576696f75732041646d696e526f6c655f8201527f20526571756573742069732070656e64696e6700000000000000000000000000602082015250565b5f614ab5603383613d8c565b9150614ac082614a5b565b604082019050919050565b5f6020820190508181035f830152614ae281614aa9565b9050919050565b5f614af382613e86565b9150614afe83613e86565b9250828201905080821115614b1657614b156146ee565b5b92915050565b5f819050919050565b5f819050919050565b5f614b48614b43614b3e84614b1c565b614b25565b613e86565b9050919050565b614b5881614b2e565b82525050565b5f604082019050614b715f830185614b4f565b614b7e6020830184613fce565b9392505050565b7f5969646f6379546f6b656e203a20736574526577617264506f6f6c206d7573745f8201527f2063616c6c6564206f6e636520617420746865206465706c6f792074696d6500602082015250565b5f614bdf603f83613d8c565b9150614bea82614b85565b604082019050919050565b5f6020820190508181035f830152614c0c81614bd3565b9050919050565b7f5969646f6379546f6b656e203a20526577617264506f6f6c20616464726573735f8201527f2069732072657175697265640000000000000000000000000000000000000000602082015250565b5f614c6d602c83613d8c565b9150614c7882614c13565b604082019050919050565b5f6020820190508181035f830152614c9a81614c61565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b7f5969646f6379546f6b656e203a204c6f636b75702064617465206c69737420615f8201527f6e6420616d6f756e74206c697374206d757374206265207468652073616d652060208201527f6c656e6774682100000000000000000000000000000000000000000000000000604082015250565b5f614d4e604783613d8c565b9150614d5982614cce565b606082019050919050565b5f6020820190508181035f830152614d7b81614d42565b9050919050565b7f5969646f6379546f6b656e203a204c6f636b75702076657374696e6720746f745f8201527f616c20616d6f756e74206d757374206265206c657373206f7220657175616c2060208201527f746f20746865206c6f636b757020616d6f756e74210000000000000000000000604082015250565b5f614e02605583613d8c565b9150614e0d82614d82565b606082019050919050565b5f6020820190508181035f830152614e2f81614df6565b9050919050565b7f5969646f6379546f6b656e203a205468657265206973206e6f206578637574615f8201527f626c652041646d696e526f6c6552657175657374000000000000000000000000602082015250565b5f614e90603483613d8c565b9150614e9b82614e36565b604082019050919050565b5f6020820190508181035f830152614ebd81614e84565b9050919050565b7f5969646f6379546f6b656e203a204e6f2041646d696e526f6c652052657175655f8201527f7374206973207265717565737465640000000000000000000000000000000000602082015250565b5f614f1e602f83613d8c565b9150614f2982614ec4565b604082019050919050565b5f6020820190508181035f830152614f4b81614f12565b9050919050565b7f5969646f6379546f6b656e203a20457865637574652052657175657374206d755f8201527f737420626520746865206f7468657220616d64696e526f6c6572000000000000602082015250565b5f614fac603a83613d8c565b9150614fb782614f52565b604082019050919050565b5f6020820190508181035f830152614fd981614fa0565b9050919050565b5f604082019050614ff35f830185613fce565b6150006020830184613fce565b9392505050565b7f5969646f6379546f6b656e203a2043616e6e6f74207472616e736665722061645f8201527f6d696e20726f6c6520746f207a65726f20616464726573730000000000000000602082015250565b5f615061603883613d8c565b915061506c82615007565b604082019050919050565b5f6020820190508181035f83015261508e81615055565b9050919050565b7f5969646f6379546f6b656e203a2043616e6e6f74207472616e736665722061645f8201527f6d696e20726f6c6520746f207468652073616d65206164647265737300000000602082015250565b5f6150ef603c83613d8c565b91506150fa82615095565b604082019050919050565b5f6020820190508181035f83015261511c816150e3565b9050919050565b5f819050919050565b5f61514661514161513c84615123565b614b25565b613e86565b9050919050565b6151568161512c565b82525050565b5f60408201905061516f5f83018561514d565b61517c6020830184613fce565b9392505050565b7f5969646f6379546f6b656e203a2043616e6e6f74207472616e73666572206d6f5f8201527f7265207468616e207472616e7366657261626c6520616d6f756e740000000000602082015250565b5f6151dd603b83613d8c565b91506151e882615183565b604082019050919050565b5f6020820190508181035f83015261520a816151d1565b9050919050565b5f6040820190506152245f830185614194565b6152316020830184613fce565b9392505050565b7f5969646f6379546f6b656e203a2043616e6e6f74206164642061646d696e20725f8201527f6f6c6520666f72207468652073616d6520616464726573730000000000000000602082015250565b5f615292603883613d8c565b915061529d82615238565b604082019050919050565b5f6020820190508181035f8301526152bf81615286565b9050919050565b5f819050919050565b5f6152e96152e46152df846152c6565b614b25565b613e86565b9050919050565b6152f9816152cf565b82525050565b5f6040820190506153125f8301856152f0565b61531f6020830184613fce565b9392505050565b5f6020820190506153395f830184614194565b92915050565b5f8151905061534d81613e8f565b92915050565b5f6020828403121561536857615367613cc7565b5b5f6153758482850161533f565b91505092915050565b5f6060820190506153915f830186614194565b61539e6020830185613fce565b6153ab6040830184613fce565b949350505050565b5f6040820190506153c65f830185614194565b6153d360208301846140a4565b939250505056fea264697066735822122055dd98f62b710ed3f7683d04260e292273c931c36f91d5efea235c1fe14fd59264736f6c63430008140033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c6ac43fbf09d7a62bb26621c53d81598d79477df000000000000000000000000e36b810471c45ed8446b9ecfef481cb99c04f1b2

-----Decoded View---------------
Arg [0] : multiAdminRoles (address[]): 0xc6aC43Fbf09d7A62bb26621C53d81598D79477df,0xe36b810471c45eD8446B9Ecfef481cb99c04F1b2
Arg [1] : supplyCap (uint256): 10000000000000000

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 000000000000000000000000c6ac43fbf09d7a62bb26621c53d81598d79477df
Arg [4] : 000000000000000000000000e36b810471c45ed8446b9ecfef481cb99c04f1b2


Deployed Bytecode Sourcemap

35377:16370:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30395:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13297:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15590:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41020:111;;;:::i;:::-;;44809:408;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14399:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40693:319;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31675:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44253:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43781:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37952:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44017:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41476:111;;;:::i;:::-;;45350:838;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;44688:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48103:852;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14561:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41137:331;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38172:905;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;30691:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41595:2178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48963:2781;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13507:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46194:955;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45223:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30003:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40397:288;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40237:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38052:112;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43898;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15129:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47155:942;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30395:204;30480:4;30519:32;30504:47;;;:11;:47;;;;:87;;;;30555:36;30579:11;30555:23;:36::i;:::-;30504:87;30497:94;;30395:204;;;:::o;13297:91::-;13342:13;13375:5;13368:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13297:91;:::o;15590:190::-;15663:4;15680:13;15696:12;:10;:12::i;:::-;15680:28;;15719:31;15728:5;15735:7;15744:5;15719:8;:31::i;:::-;15768:4;15761:11;;;15590:190;;;;:::o;41020:111::-;41061:62;;;;;;;;;;:::i;:::-;;;;;;;;44809:408;44863:33;44942:24;:22;:24::i;:::-;44928:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44909:58;;44978:13;45011:9;45006:204;45030:17;:24;;;;45026:1;:28;45006:204;;;45112:1;45080:34;;:17;45098:1;45080:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:34;;;45076:123;;45163:17;45181:1;45163:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45135:16;45152:7;;;;;:::i;:::-;;;45135:25;;;;;;;;:::i;:::-;;;;;;;:48;;;;;;;;;;;45076:123;45056:3;;;;;:::i;:::-;;;;45006:204;;;;44898:319;44809:408;:::o;14399:99::-;14451:7;14478:12;;14471:19;;14399:99;:::o;40693:319::-;40799:4;40866:6;40824:37;40843:6;40851:9;40824:18;:37::i;:::-;:48;;40816:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;40959:45;40978:6;40986:9;40997:6;40959:18;:45::i;:::-;40952:52;;40693:319;;;;;:::o;31675:122::-;31740:7;31767:6;:12;31774:4;31767:12;;;;;;;;;;;:22;;;31760:29;;31675:122;;;:::o;44253:125::-;44310:4;44334:36;30048:4;44342:18;;44362:7;44334;:36::i;:::-;44327:43;;44253:125;;;:::o;43781:111::-;43864:18;43877:4;43864:12;:18::i;:::-;30287:16;30298:4;30287:10;:16::i;:::-;43781:111;;;:::o;37952:92::-;38010:5;38035:1;38028:8;;37952:92;:::o;44017:96::-;;;:::o;41476:111::-;41517:62;;;;;;;;;;:::i;:::-;;;;;;;;45350:838;45431:16;45458:19;45488:14;45513;45538:22;45571:21;45603;45670:22;;45658:9;:34;45650:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;45757:18;:29;45776:9;45757:29;;;;;;;;;;;:38;;;;;;;;;;;;45746:49;;45820:18;:29;45839:9;45820:29;;;;;;;;;;;:41;;;;;;;;;;;;45806:55;;45881:18;:29;45900:9;45881:29;;;;;;;;;;;:36;;;45872:45;;45937:18;:29;45956:9;45937:29;;;;;;;;;;;:36;;;45928:45;;46001:18;:29;46020:9;46001:29;;;;;;;;;;;:44;;;;;;;;;;;;45984:61;;46072:18;:29;46091:9;46072:29;;;;;;;;;;;:43;;;;;;;;;;;;46056:59;;46142:18;:29;46161:9;46142:29;;;;;;;;;;;:38;;;;;;;;;;;;46126:54;;45350:838;;;;;;;;;:::o;44688:115::-;44744:7;44771:24;:22;:24::i;:::-;44764:31;;44688:115;:::o;48103:852::-;48183:7;36961:20;36970:10;36961:8;:20::i;:::-;36953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48234:1:::1;48211:25;;:11;:25;;::::0;48203:90:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;48338:1;48312:22;;:27;:86;;;;48397:1;48343:18;:44;48385:1;48362:22;;:24;;;;:::i;:::-;48343:44;;;;;;;;;;;:51;;;:55;48312:86;48304:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;48465:17;48485:22;;48465:42;;48544:1;48518:22;;:27;;;;;;;:::i;:::-;;;;;;;;48588:272;;;;;;;;48638:1;48588:272;;;;;;48668:11;48588:272;;;;;;48702:1;48588:272;;;;48726:1;48588:272;;;;48758:10;48588:272;;;;;;48806:1;48588:272;;;;;;48846:1;48588:272;;;;::::0;48556:18:::1;:29;48575:9;48556:29;;;;;;;;;;;:304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48895:10;48876:44;;;48907:1;48910:9;48876:44;;;;;;;:::i;:::-;;;;;;;;48938:9;48931:16;;;48103:852:::0;;;:::o;14561:118::-;14626:7;14653:9;:18;14663:7;14653:18;;;;;;;;;;;;;;;;14646:25;;14561:118;;;:::o;41137:331::-;36961:20;36970:10;36961:8;:20::i;:::-;36953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41250:1:::1;41218:34;;41226:11;;;;;;;;;;;41218:34;;;41210:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;41361:1;41339:24;;:10;:24;;::::0;41331:81:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41449:10;41423:11;;:37;;;;;;;;;;;;;;;;;;41137:331:::0;:::o;38172:905::-;38244:20;38275:12;38298:41;38350:34;38418:1;38403:16;;38430:28;38461:12;:21;38474:7;38461:21;;;;;;;;;;;;;;;38430:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38523:1;38497:10;:23;;;:27;38493:577;;;38556:10;:23;;;38541:38;;38601:10;:15;;;38594:22;;38672:10;:27;;;:34;38658:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38631:76;;38756:10;:27;;;:34;38742:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38722:69;;38811:9;38806:253;38830:10;:27;;;:34;38826:1;:38;38806:253;;;38920:10;:27;;;38948:1;38920:30;;;;;;;;:::i;:::-;;;;;;;;:44;;;38890:24;38915:1;38890:27;;;;;;;;:::i;:::-;;;;;;;:74;;;;;39006:10;:27;;;39034:1;39006:30;;;;;;;;:::i;:::-;;;;;;;;:37;;;38983:17;39001:1;38983:20;;;;;;;;:::i;:::-;;;;;;;:60;;;;;38866:3;;;;;:::i;:::-;;;;38806:253;;;;38493:577;38392:685;38172:905;;;;;:::o;30691:138::-;30768:4;30792:6;:12;30799:4;30792:12;;;;;;;;;;;:20;;:29;30813:7;30792:29;;;;;;;;;;;;;;;;;;;;;;;;;30785:36;;30691:138;;;;:::o;41595:2178::-;36961:20;36970:10;36961:8;:20::i;:::-;36953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41926:1:::1;41910:12;:17:::0;41906:533:::1;;41951:12;:21;41964:7;41951:21;;;;;;;;;;;;;;;;41944:28:::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41987:21;42011:20;:27;;;;41987:51;;42058:9;42053:354;42077:13;42073:1;:17;42053:354;;;42147:7;42120:34;;:20;42141:1;42120:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:34;;::::0;42116:276:::1;;42186:20;42207:1;42186:23;;;;;;;;:::i;:::-;;;;;;;;;;42179:30;;;;;;;;;;;42258:20;42293:1;42279:13;:15;;;;:::i;:::-;42258:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42232:20;42253:1;42232:23;;;;;;;;:::i;:::-;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;42318:20;:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;42367:5;;42116:276;42092:3;;;;;:::i;:::-;;;;42053:354;;;;42421:7;;;41906:533;42492:17;:24;42457;:31;:59;42449:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;42603:26;42649:9:::0;42644:131:::1;42668:24;:31;42664:1;:35;42644:131;;;42743:17;42761:1;42743:20;;;;;;;;:::i;:::-;;;;;;;;42721:42;;;;;:::i;:::-;;;42701:3;;;;;:::i;:::-;;;;42644:131;;;;42815:12;42793:18;:34;;42785:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;42967:12;42930;:21;42943:7;42930:21;;;;;;;;;;;;;;;:34;;:49;;;;43019:4;42990:33;;:12;:21;43003:7;42990:21;;;;;;;;;;;;;;;:26;;:33;;;;43076:17;43034:12;:21;43047:7;43034:21;;;;;;;;;;;;;;;:39;;;:59;;;;;;;;;;;;;;;;;;43111:12;:21;43124:7;43111:21;;;;;;;;;;;;;;;:38;;;43104:45;;;;:::i;:::-;43165:9;43160:200;43184:24;:31;43180:1;:35;43160:200;;;43237:12;:21;43250:7;43237:21;;;;;;;;;;;;;;;:38;;43281:66;;;;;;;;43297:24;43322:1;43297:27;;;;;;;;:::i;:::-;;;;;;;;43281:66;;;;43326:17;43344:1;43326:20;;;;;;;;:::i;:::-;;;;;;;;43281:66;;::::0;43237:111:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43217:3;;;;;:::i;:::-;;;;43160:200;;;;43370:17;43406:31:::0;43440:20:::1;:27;;;;43406:61;;43483:9;43478:198;43502:23;43498:1;:27;43478:198;;;43578:7;43551:34;;:20;43572:1;43551:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:34;;::::0;43547:118:::1;;43621:4;43606:19;;43644:5;;43547:118;43527:3;;;;;:::i;:::-;;;;43478:198;;;;43691:12;43686:80;;43720:20;43746:7;43720:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43686:80;41895:1878;;;37032:1;41595:2178:::0;;;;;;:::o;48963:2781::-;49038:7;36961:20;36970:10;36961:8;:20::i;:::-;36953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49091:1:::1;49066:22;;:26;49058:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;49160:17;49203:1;49180:22;;:24;;;;:::i;:::-;49160:44;;49248:1;49223:22;;:26;:71;;;;;49293:1;49253:18;:29;49272:9;49253:29;;;;;;;;;;;:36;;;:41;49223:71;49215:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;49379:18;:29;49398:9;49379:29;;;;;;;;;;;:44;;;;;;;;;;;;49365:58;;:10;:58;;::::0;49357:129:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;49501:8;49497:2213;;;49565:1;49526:18;:29;49545:9;49526:29;;;;;;;;;;;:36;;:40;;;;49627:10;49581:18;:29;49600:9;49581:29;;;;;;;;;;;:43;;;:56;;;;;;;;;;;;;;;;;;49706:1;49652:18;:29;49671:9;49652:29;;;;;;;;;;;:43;;;:56;;;;;;;;;;;;;;;;;;49767:1;49727:18;:29;49746:9;49727:29;;;;;;;;;;;:36;;;:41:::0;49723:1663:::1;;49810:70;30048:4;49821:18:::0;::::1;49841;:29;49860:9;49841:29;;;;;;;;;;;:38;;;;;;;;;;;;49810:10;:70::i;:::-;;49899:17;49922:18;:29;49941:9;49922:29;;;;;;;;;;;:38;;;;;;;;;;;;49899:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50012:18;:29;50031:9;50012:29;;;;;;;;;;;:38;;;;;;;;;;;;49985:77;;50000:10;49985:77;;;50052:9;49985:77;;;;;;:::i;:::-;;;;;;;;49723:1663;;;50128:1;50088:18;:29;50107:9;50088:29;;;;;;;;;;;:36;;;:41:::0;50084:1302:::1;;50170:74;30048:4;50182:18:::0;::::1;50202;:29;50221:9;50202:29;;;;;;;;;;;:41;;;;;;;;;;;;50170:11;:74::i;:::-;;50268:9;50263:284;50287:17;:24;;;;50283:1;:28;50263:284;;;50369:18;:29;50388:9;50369:29;;;;;;;;;;;:41;;;;;;;;;;;;50345:65;;:17;50363:1;50345:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:65;;::::0;50341:187:::1;;50470:1;50439:17;50457:1;50439:20;;;;;;;;:::i;:::-;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;50499:5;;50341:187;50313:3;;;;;:::i;:::-;;;;50263:284;;;;50607:18;:29;50626:9;50607:29;;;;;;;;;;;:41;;;;;;;;;;;;50578:82;;50595:10;50578:82;;;50650:9;50578:82;;;;;;:::i;:::-;;;;;;;;50084:1302;;;50726:1;50686:18;:29;50705:9;50686:29;;;;;;;;;;;:36;;;:41:::0;50682:704:::1;;50770:70;30048:4;50781:18:::0;::::1;50801;:29;50820:9;50801:29;;;;;;;;;;;:38;;;;;;;;;;;;50770:10;:70::i;:::-;;50859:74;30048:4;50871:18:::0;::::1;50891;:29;50910:9;50891:29;;;;;;;;;;;:41;;;;;;;;;;;;50859:11;:74::i;:::-;;50957:9;50952:312;50976:17;:24;;;;50972:1;:28;50952:312;;;51058:18;:29;51077:9;51058:29;;;;;;;;;;;:41;;;;;;;;;;;;51034:65;;:17;51052:1;51034:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:65;;::::0;51030:215:::1;;51151:18;:29;51170:9;51151:29;;;;;;;;;;;:38;;;;;;;;;;;;51128:17;51146:1;51128:20;;;;;;;;:::i;:::-;;;;;;;;;;:61;;;;;;;;;;;;;;;;;;51216:5;;51030:215;51002:3;;;;;:::i;:::-;;;;50952:312;;;;51320:18;:29;51339:9;51320:29;;;;;;;;;;;:38;;;;;;;;;;;;51287:83;;51308:10;51287:83;;;51360:9;51287:83;;;;;;:::i;:::-;;;;;;;;50682:704;50084:1302;49723:1663;49497:2213;;;51457:1;51418:18;:29;51437:9;51418:29;;;;;;;;;;;:36;;:40;;;;51527:1;51473:18;:29;51492:9;51473:29;;;;;;;;;;;:43;;;:56;;;;;;;;;;;;;;;;;;51590:10;51544:18;:29;51563:9;51544:29;;;;;;;;;;;:43;;;:56;;;;;;;;;;;;;;;;;;51638:10;51620:78;;;51650:18;:29;51669:9;51650:29;;;;;;;;;;;:36;;;51688:9;51620:78;;;;;;;:::i;:::-;;;;;;;;49497:2213;51727:9;51720:16;;;48963:2781:::0;;;:::o;13507:95::-;13554:13;13587:7;13580:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13507:95;:::o;46194:955::-;46273:7;36961:20;36970:10;36961:8;:20::i;:::-;36953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46321:1:::1;46301:22;;:8;:22;;::::0;46293:91:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46415:10;46403:22;;:8;:22;;::::0;46395:95:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46535:1;46509:22;;:27;:86;;;;46594:1;46540:18;:44;46582:1;46559:22;;:24;;;;:::i;:::-;46540:44;;;;;;;;;;;:51;;;:55;46509:86;46501:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;46662:17;46682:22;;46662:42;;46741:1;46715:22;;:27;;;;;;;:::i;:::-;;;;;;;;46785:269;;;;;;;;46827:8;46785:269;;;;;;46863:10;46785:269;;;;;;46896:1;46785:269;;;;46920:1;46785:269;;;;46952:10;46785:269;;;;;;47000:1;46785:269;;;;;;47040:1;46785:269;;;;::::0;46753:18:::1;:29;46772:9;46753:29;;;;;;;;;;;:301;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47089:10;47070:44;;;47101:1;47104:9;47070:44;;;;;;;:::i;:::-;;;;;;;;47132:9;47125:16;;;46194:955:::0;;;:::o;45223:115::-;45281:7;45308:22;;45301:29;;45223:115;:::o;30003:49::-;30048:4;30003:49;;;:::o;40397:288::-;40483:4;40556:6;40508:43;40527:12;:10;:12::i;:::-;40541:9;40508:18;:43::i;:::-;:54;;40500:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;40644:33;40659:9;40670:6;40644:14;:33::i;:::-;40637:40;;40397:288;;;;:::o;40237:152::-;40293:38;40310:11;;;;;;;;;;;40324:6;40293:8;:38::i;:::-;;40342:11;;;;;;;;;;;:19;;;40362:10;40374:6;40342:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40237:152;:::o;38052:112::-;38100:16;38136:20;38129:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38052:112;:::o;43898:::-;43982:18;43995:4;43982:12;:18::i;:::-;30287:16;30298:4;30287:10;:16::i;:::-;43898:112;;;:::o;15129:142::-;15209:7;15236:11;:18;15248:5;15236:18;;;;;;;;;;;;;;;:27;15255:7;15236:27;;;;;;;;;;;;;;;;15229:34;;15129:142;;;;:::o;47155:942::-;47229:7;36961:20;36970:10;36961:8;:20::i;:::-;36953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47277:1:::1;47257:22;;:8;:22;;::::0;47249:87:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;47367:10;47355:22;;:8;:22;;::::0;47347:91:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;47483:1;47457:22;;:27;:86;;;;47542:1;47488:18;:44;47530:1;47507:22;;:24;;;;:::i;:::-;47488:44;;;;;;;;;;;:51;;;:55;47457:86;47449:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;47610:17;47630:22;;47610:42;;47689:1;47663:22;;:27;;;;;;;:::i;:::-;;;;;;;;47733:269;;;;;;;;47775:8;47733:269;;;;;;47819:1;47733:269;;;;;;47844:1;47733:269;;;;47868:1;47733:269;;;;47900:10;47733:269;;;;;;47948:1;47733:269;;;;;;47988:1;47733:269;;;;::::0;47701:18:::1;:29;47720:9;47701:29;;;;;;;;;;;:301;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48037:10;48018:44;;;48049:1;48052:9;48018:44;;;;;;;:::i;:::-;;;;;;;;48080:9;48073:16;;;47155:942:::0;;;:::o;27731:148::-;27807:4;27846:25;27831:40;;;:11;:40;;;;27824:47;;27731:148;;;:::o;4302:98::-;4355:7;4382:10;4375:17;;4302:98;:::o;20417:130::-;20502:37;20511:5;20518:7;20527:5;20534:4;20502:8;:37::i;:::-;20417:130;;;:::o;44384:298::-;44441:7;44461:13;44477:1;44461:17;;44494:9;44489:163;44513:17;:24;;;;44509:1;:28;44489:163;;;44595:1;44563:34;;:17;44581:1;44563:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:34;;;44559:82;;44618:7;;;;;:::i;:::-;;;;44559:82;44539:3;;;;;:::i;:::-;;;;44489:163;;;;44669:5;44662:12;;;44384:298;:::o;39085:1144::-;39171:7;39190:23;39216:17;39226:6;39216:9;:17::i;:::-;39190:43;;39244:28;39275:12;:20;39288:6;39275:20;;;;;;;;;;;;;;;39244:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39337:1;39310:10;:23;;;:28;:73;;;;39374:9;39342:41;;:10;:28;;;:41;;;39310:73;39306:128;;;39407:15;39400:22;;;;;;39306:128;39444:30;39489:10;:28;;;39477:63;;;39541:6;39477:71;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39444:104;;39559:14;39594:22;39576:15;:40;;;;:::i;:::-;39559:57;;39627:20;39658:15;39627:47;;39685:29;39717:10;:27;;;:34;39685:66;;39767:9;39762:346;39786:21;39782:1;:25;39762:346;;;39880:12;39833:10;:27;;;39861:1;39833:30;;;;;;;;:::i;:::-;;;;;;;;:44;;;:59;39829:268;;;39926:10;:27;;;39954:1;39926:30;;;;;;;;:::i;:::-;;;;;;;;:37;;;39917:6;:46;39913:103;;;39995:1;39988:8;;;;;;;;;;;39913:103;40044:10;:27;;;40072:1;40044:30;;;;;;;;:::i;:::-;;;;;;;;:37;;;40034:47;;;;;:::i;:::-;;;39829:268;39809:3;;;;;:::i;:::-;;;;39762:346;;;;40132:15;40122:6;:25;40118:80;;40171:15;40164:22;;;;;;;;;;40118:80;40215:6;40208:13;;;;;;;;39085:1144;;;;;:::o;16358:249::-;16445:4;16462:15;16480:12;:10;:12::i;:::-;16462:30;;16503:37;16519:4;16525:7;16534:5;16503:15;:37::i;:::-;16551:26;16561:4;16567:2;16571:5;16551:9;:26::i;:::-;16595:4;16588:11;;;16358:249;;;;;:::o;31044:105::-;31111:30;31122:4;31128:12;:10;:12::i;:::-;31111:10;:30::i;:::-;31044:105;:::o;44121:126::-;44179:4;44203:36;30048:4;44211:18;;44231:7;44203;:36::i;:::-;44196:43;;44121:126;;;:::o;34121:324::-;34198:4;34220:22;34228:4;34234:7;34220;:22::i;:::-;34215:223;;34291:4;34259:6;:12;34266:4;34259:12;;;;;;;;;;;:20;;:29;34280:7;34259:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;34342:12;:10;:12::i;:::-;34315:40;;34333:7;34315:40;;34327:4;34315:40;;;;;;;;;;34377:4;34370:11;;;;34215:223;34421:5;34414:12;;34121:324;;;;;:::o;34689:325::-;34767:4;34788:22;34796:4;34802:7;34788;:22::i;:::-;34784:223;;;34859:5;34827:6;:12;34834:4;34827:12;;;;;;;;;;;:20;;:29;34848:7;34827:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;34911:12;:10;:12::i;:::-;34884:40;;34902:7;34884:40;;34896:4;34884:40;;;;;;;;;;34946:4;34939:11;;;;34784:223;34990:5;34983:12;;34689:325;;;;;:::o;14884:182::-;14953:4;14970:13;14986:12;:10;:12::i;:::-;14970:28;;15009:27;15019:5;15026:2;15030:5;15009:9;:27::i;:::-;15054:4;15047:11;;;14884:182;;;;:::o;21398:443::-;21528:1;21511:19;;:5;:19;;;21507:91;;21583:1;21554:32;;;;;;;;;;;:::i;:::-;;;;;;;;21507:91;21631:1;21612:21;;:7;:21;;;21608:92;;21685:1;21657:31;;;;;;;;;;;:::i;:::-;;;;;;;;21608:92;21740:5;21710:11;:18;21722:5;21710:18;;;;;;;;;;;;;;;:27;21729:7;21710:27;;;;;;;;;;;;;;;:35;;;;21760:9;21756:78;;;21807:7;21791:31;;21800:5;21791:31;;;21816:5;21791:31;;;;;;:::i;:::-;;;;;;;;21756:78;21398:443;;;;:::o;22133:487::-;22233:24;22260:25;22270:5;22277:7;22260:9;:25::i;:::-;22233:52;;22320:17;22300:16;:37;22296:317;;22377:5;22358:16;:24;22354:132;;;22437:7;22446:16;22464:5;22410:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;22354:132;22529:57;22538:5;22545:7;22573:5;22554:16;:24;22580:5;22529:8;:57::i;:::-;22296:317;22222:398;22133:487;;;:::o;16992:308::-;17092:1;17076:18;;:4;:18;;;17072:88;;17145:1;17118:30;;;;;;;;;;;:::i;:::-;;;;;;;;17072:88;17188:1;17174:16;;:2;:16;;;17170:88;;17243:1;17214:32;;;;;;;;;;;:::i;:::-;;;;;;;;17170:88;17268:24;17276:4;17282:2;17286:5;17268:7;:24::i;:::-;16992:308;;;:::o;31285:201::-;31374:22;31382:4;31388:7;31374;:22::i;:::-;31369:110;;31453:7;31462:4;31420:47;;;;;;;;;;;;:::i;:::-;;;;;;;;31369:110;31285:201;;:::o;17624:1135::-;17730:1;17714:18;;:4;:18;;;17710:552;;17868:5;17852:12;;:21;;;;;;;:::i;:::-;;;;;;;;17710:552;;;17906:19;17928:9;:15;17938:4;17928:15;;;;;;;;;;;;;;;;17906:37;;17976:5;17962:11;:19;17958:117;;;18034:4;18040:11;18053:5;18009:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;17958:117;18230:5;18216:11;:19;18198:9;:15;18208:4;18198:15;;;;;;;;;;;;;;;:37;;;;17891:371;17710:552;18292:1;18278:16;;:2;:16;;;18274:435;;18460:5;18444:12;;:21;;;;;;;;;;;18274:435;;;18677:5;18660:9;:13;18670:2;18660:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;18274:435;18741:2;18726:25;;18735:4;18726:25;;;18745:5;18726:25;;;;;;:::i;:::-;;;;;;;;17624:1135;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:77::-;3404:7;3433:5;3422:16;;3367:77;;;:::o;3450:122::-;3523:24;3541:5;3523:24;:::i;:::-;3516:5;3513:35;3503:63;;3562:1;3559;3552:12;3503:63;3450:122;:::o;3578:139::-;3624:5;3662:6;3649:20;3640:29;;3678:33;3705:5;3678:33;:::i;:::-;3578:139;;;;:::o;3723:474::-;3791:6;3799;3848:2;3836:9;3827:7;3823:23;3819:32;3816:119;;;3854:79;;:::i;:::-;3816:119;3974:1;3999:53;4044:7;4035:6;4024:9;4020:22;3999:53;:::i;:::-;3989:63;;3945:117;4101:2;4127:53;4172:7;4163:6;4152:9;4148:22;4127:53;:::i;:::-;4117:63;;4072:118;3723:474;;;;;:::o;4203:114::-;4270:6;4304:5;4298:12;4288:22;;4203:114;;;:::o;4323:184::-;4422:11;4456:6;4451:3;4444:19;4496:4;4491:3;4487:14;4472:29;;4323:184;;;;:::o;4513:132::-;4580:4;4603:3;4595:11;;4633:4;4628:3;4624:14;4616:22;;4513:132;;;:::o;4651:108::-;4728:24;4746:5;4728:24;:::i;:::-;4723:3;4716:37;4651:108;;:::o;4765:179::-;4834:10;4855:46;4897:3;4889:6;4855:46;:::i;:::-;4933:4;4928:3;4924:14;4910:28;;4765:179;;;;:::o;4950:113::-;5020:4;5052;5047:3;5043:14;5035:22;;4950:113;;;:::o;5099:732::-;5218:3;5247:54;5295:5;5247:54;:::i;:::-;5317:86;5396:6;5391:3;5317:86;:::i;:::-;5310:93;;5427:56;5477:5;5427:56;:::i;:::-;5506:7;5537:1;5522:284;5547:6;5544:1;5541:13;5522:284;;;5623:6;5617:13;5650:63;5709:3;5694:13;5650:63;:::i;:::-;5643:70;;5736:60;5789:6;5736:60;:::i;:::-;5726:70;;5582:224;5569:1;5566;5562:9;5557:14;;5522:284;;;5526:14;5822:3;5815:10;;5223:608;;;5099:732;;;;:::o;5837:373::-;5980:4;6018:2;6007:9;6003:18;5995:26;;6067:9;6061:4;6057:20;6053:1;6042:9;6038:17;6031:47;6095:108;6198:4;6189:6;6095:108;:::i;:::-;6087:116;;5837:373;;;;:::o;6216:118::-;6303:24;6321:5;6303:24;:::i;:::-;6298:3;6291:37;6216:118;;:::o;6340:222::-;6433:4;6471:2;6460:9;6456:18;6448:26;;6484:71;6552:1;6541:9;6537:17;6528:6;6484:71;:::i;:::-;6340:222;;;;:::o;6568:619::-;6645:6;6653;6661;6710:2;6698:9;6689:7;6685:23;6681:32;6678:119;;;6716:79;;:::i;:::-;6678:119;6836:1;6861:53;6906:7;6897:6;6886:9;6882:22;6861:53;:::i;:::-;6851:63;;6807:117;6963:2;6989:53;7034:7;7025:6;7014:9;7010:22;6989:53;:::i;:::-;6979:63;;6934:118;7091:2;7117:53;7162:7;7153:6;7142:9;7138:22;7117:53;:::i;:::-;7107:63;;7062:118;6568:619;;;;;:::o;7193:77::-;7230:7;7259:5;7248:16;;7193:77;;;:::o;7276:122::-;7349:24;7367:5;7349:24;:::i;:::-;7342:5;7339:35;7329:63;;7388:1;7385;7378:12;7329:63;7276:122;:::o;7404:139::-;7450:5;7488:6;7475:20;7466:29;;7504:33;7531:5;7504:33;:::i;:::-;7404:139;;;;:::o;7549:329::-;7608:6;7657:2;7645:9;7636:7;7632:23;7628:32;7625:119;;;7663:79;;:::i;:::-;7625:119;7783:1;7808:53;7853:7;7844:6;7833:9;7829:22;7808:53;:::i;:::-;7798:63;;7754:117;7549:329;;;;:::o;7884:118::-;7971:24;7989:5;7971:24;:::i;:::-;7966:3;7959:37;7884:118;;:::o;8008:222::-;8101:4;8139:2;8128:9;8124:18;8116:26;;8152:71;8220:1;8209:9;8205:17;8196:6;8152:71;:::i;:::-;8008:222;;;;:::o;8236:329::-;8295:6;8344:2;8332:9;8323:7;8319:23;8315:32;8312:119;;;8350:79;;:::i;:::-;8312:119;8470:1;8495:53;8540:7;8531:6;8520:9;8516:22;8495:53;:::i;:::-;8485:63;;8441:117;8236:329;;;;:::o;8571:474::-;8639:6;8647;8696:2;8684:9;8675:7;8671:23;8667:32;8664:119;;;8702:79;;:::i;:::-;8664:119;8822:1;8847:53;8892:7;8883:6;8872:9;8868:22;8847:53;:::i;:::-;8837:63;;8793:117;8949:2;8975:53;9020:7;9011:6;9000:9;8996:22;8975:53;:::i;:::-;8965:63;;8920:118;8571:474;;;;;:::o;9051:86::-;9086:7;9126:4;9119:5;9115:16;9104:27;;9051:86;;;:::o;9143:112::-;9226:22;9242:5;9226:22;:::i;:::-;9221:3;9214:35;9143:112;;:::o;9261:214::-;9350:4;9388:2;9377:9;9373:18;9365:26;;9401:67;9465:1;9454:9;9450:17;9441:6;9401:67;:::i;:::-;9261:214;;;;:::o;9481:329::-;9540:6;9589:2;9577:9;9568:7;9564:23;9560:32;9557:119;;;9595:79;;:::i;:::-;9557:119;9715:1;9740:53;9785:7;9776:6;9765:9;9761:22;9740:53;:::i;:::-;9730:63;;9686:117;9481:329;;;;:::o;9816:118::-;9903:24;9921:5;9903:24;:::i;:::-;9898:3;9891:37;9816:118;;:::o;9940:886::-;10201:4;10239:3;10228:9;10224:19;10216:27;;10253:71;10321:1;10310:9;10306:17;10297:6;10253:71;:::i;:::-;10334:72;10402:2;10391:9;10387:18;10378:6;10334:72;:::i;:::-;10416;10484:2;10473:9;10469:18;10460:6;10416:72;:::i;:::-;10498;10566:2;10555:9;10551:18;10542:6;10498:72;:::i;:::-;10580:73;10648:3;10637:9;10633:19;10624:6;10580:73;:::i;:::-;10663;10731:3;10720:9;10716:19;10707:6;10663:73;:::i;:::-;10746;10814:3;10803:9;10799:19;10790:6;10746:73;:::i;:::-;9940:886;;;;;;;;;;:::o;10832:114::-;10899:6;10933:5;10927:12;10917:22;;10832:114;;;:::o;10952:184::-;11051:11;11085:6;11080:3;11073:19;11125:4;11120:3;11116:14;11101:29;;10952:184;;;;:::o;11142:132::-;11209:4;11232:3;11224:11;;11262:4;11257:3;11253:14;11245:22;;11142:132;;;:::o;11280:108::-;11357:24;11375:5;11357:24;:::i;:::-;11352:3;11345:37;11280:108;;:::o;11394:179::-;11463:10;11484:46;11526:3;11518:6;11484:46;:::i;:::-;11562:4;11557:3;11553:14;11539:28;;11394:179;;;;:::o;11579:113::-;11649:4;11681;11676:3;11672:14;11664:22;;11579:113;;;:::o;11728:732::-;11847:3;11876:54;11924:5;11876:54;:::i;:::-;11946:86;12025:6;12020:3;11946:86;:::i;:::-;11939:93;;12056:56;12106:5;12056:56;:::i;:::-;12135:7;12166:1;12151:284;12176:6;12173:1;12170:13;12151:284;;;12252:6;12246:13;12279:63;12338:3;12323:13;12279:63;:::i;:::-;12272:70;;12365:60;12418:6;12365:60;:::i;:::-;12355:70;;12211:224;12198:1;12195;12191:9;12186:14;;12151:284;;;12155:14;12451:3;12444:10;;11852:608;;;11728:732;;;;:::o;12466:855::-;12743:4;12781:3;12770:9;12766:19;12758:27;;12795:71;12863:1;12852:9;12848:17;12839:6;12795:71;:::i;:::-;12876:72;12944:2;12933:9;12929:18;12920:6;12876:72;:::i;:::-;12995:9;12989:4;12985:20;12980:2;12969:9;12965:18;12958:48;13023:108;13126:4;13117:6;13023:108;:::i;:::-;13015:116;;13178:9;13172:4;13168:20;13163:2;13152:9;13148:18;13141:48;13206:108;13309:4;13300:6;13206:108;:::i;:::-;13198:116;;12466:855;;;;;;;:::o;13327:118::-;13398:22;13414:5;13398:22;:::i;:::-;13391:5;13388:33;13378:61;;13435:1;13432;13425:12;13378:61;13327:118;:::o;13451:135::-;13495:5;13533:6;13520:20;13511:29;;13549:31;13574:5;13549:31;:::i;:::-;13451:135;;;;:::o;13592:117::-;13701:1;13698;13691:12;13715:180;13763:77;13760:1;13753:88;13860:4;13857:1;13850:15;13884:4;13881:1;13874:15;13901:281;13984:27;14006:4;13984:27;:::i;:::-;13976:6;13972:40;14114:6;14102:10;14099:22;14078:18;14066:10;14063:34;14060:62;14057:88;;;14125:18;;:::i;:::-;14057:88;14165:10;14161:2;14154:22;13944:238;13901:281;;:::o;14188:129::-;14222:6;14249:20;;:::i;:::-;14239:30;;14278:33;14306:4;14298:6;14278:33;:::i;:::-;14188:129;;;:::o;14323:311::-;14400:4;14490:18;14482:6;14479:30;14476:56;;;14512:18;;:::i;:::-;14476:56;14562:4;14554:6;14550:17;14542:25;;14622:4;14616;14612:15;14604:23;;14323:311;;;:::o;14640:117::-;14749:1;14746;14739:12;14780:710;14876:5;14901:81;14917:64;14974:6;14917:64;:::i;:::-;14901:81;:::i;:::-;14892:90;;15002:5;15031:6;15024:5;15017:21;15065:4;15058:5;15054:16;15047:23;;15118:4;15110:6;15106:17;15098:6;15094:30;15147:3;15139:6;15136:15;15133:122;;;15166:79;;:::i;:::-;15133:122;15281:6;15264:220;15298:6;15293:3;15290:15;15264:220;;;15373:3;15402:37;15435:3;15423:10;15402:37;:::i;:::-;15397:3;15390:50;15469:4;15464:3;15460:14;15453:21;;15340:144;15324:4;15319:3;15315:14;15308:21;;15264:220;;;15268:21;14882:608;;14780:710;;;;;:::o;15513:370::-;15584:5;15633:3;15626:4;15618:6;15614:17;15610:27;15600:122;;15641:79;;:::i;:::-;15600:122;15758:6;15745:20;15783:94;15873:3;15865:6;15858:4;15850:6;15846:17;15783:94;:::i;:::-;15774:103;;15590:293;15513:370;;;;:::o;15889:1473::-;16041:6;16049;16057;16065;16073;16081;16130:3;16118:9;16109:7;16105:23;16101:33;16098:120;;;16137:79;;:::i;:::-;16098:120;16257:1;16282:53;16327:7;16318:6;16307:9;16303:22;16282:53;:::i;:::-;16272:63;;16228:117;16384:2;16410:53;16455:7;16446:6;16435:9;16431:22;16410:53;:::i;:::-;16400:63;;16355:118;16512:2;16538:53;16583:7;16574:6;16563:9;16559:22;16538:53;:::i;:::-;16528:63;;16483:118;16640:2;16666:51;16709:7;16700:6;16689:9;16685:22;16666:51;:::i;:::-;16656:61;;16611:116;16794:3;16783:9;16779:19;16766:33;16826:18;16818:6;16815:30;16812:117;;;16848:79;;:::i;:::-;16812:117;16953:78;17023:7;17014:6;17003:9;16999:22;16953:78;:::i;:::-;16943:88;;16737:304;17108:3;17097:9;17093:19;17080:33;17140:18;17132:6;17129:30;17126:117;;;17162:79;;:::i;:::-;17126:117;17267:78;17337:7;17328:6;17317:9;17313:22;17267:78;:::i;:::-;17257:88;;17051:304;15889:1473;;;;;;;;:::o;17368:116::-;17438:21;17453:5;17438:21;:::i;:::-;17431:5;17428:32;17418:60;;17474:1;17471;17464:12;17418:60;17368:116;:::o;17490:133::-;17533:5;17571:6;17558:20;17549:29;;17587:30;17611:5;17587:30;:::i;:::-;17490:133;;;;:::o;17629:323::-;17685:6;17734:2;17722:9;17713:7;17709:23;17705:32;17702:119;;;17740:79;;:::i;:::-;17702:119;17860:1;17885:50;17927:7;17918:6;17907:9;17903:22;17885:50;:::i;:::-;17875:60;;17831:114;17629:323;;;;:::o;17958:474::-;18026:6;18034;18083:2;18071:9;18062:7;18058:23;18054:32;18051:119;;;18089:79;;:::i;:::-;18051:119;18209:1;18234:53;18279:7;18270:6;18259:9;18255:22;18234:53;:::i;:::-;18224:63;;18180:117;18336:2;18362:53;18407:7;18398:6;18387:9;18383:22;18362:53;:::i;:::-;18352:63;;18307:118;17958:474;;;;;:::o;18438:180::-;18486:77;18483:1;18476:88;18583:4;18580:1;18573:15;18607:4;18604:1;18597:15;18624:320;18668:6;18705:1;18699:4;18695:12;18685:22;;18752:1;18746:4;18742:12;18773:18;18763:81;;18829:4;18821:6;18817:17;18807:27;;18763:81;18891:2;18883:6;18880:14;18860:18;18857:38;18854:84;;18910:18;;:::i;:::-;18854:84;18675:269;18624:320;;;:::o;18950:239::-;19090:34;19086:1;19078:6;19074:14;19067:58;19159:22;19154:2;19146:6;19142:15;19135:47;18950:239;:::o;19195:366::-;19337:3;19358:67;19422:2;19417:3;19358:67;:::i;:::-;19351:74;;19434:93;19523:3;19434:93;:::i;:::-;19552:2;19547:3;19543:12;19536:19;;19195:366;;;:::o;19567:419::-;19733:4;19771:2;19760:9;19756:18;19748:26;;19820:9;19814:4;19810:20;19806:1;19795:9;19791:17;19784:47;19848:131;19974:4;19848:131;:::i;:::-;19840:139;;19567:419;;;:::o;19992:180::-;20040:77;20037:1;20030:88;20137:4;20134:1;20127:15;20161:4;20158:1;20151:15;20178:180;20226:77;20223:1;20216:88;20323:4;20320:1;20313:15;20347:4;20344:1;20337:15;20364:233;20403:3;20426:24;20444:5;20426:24;:::i;:::-;20417:33;;20472:66;20465:5;20462:77;20459:103;;20542:18;;:::i;:::-;20459:103;20589:1;20582:5;20578:13;20571:20;;20364:233;;;:::o;20603:251::-;20743:34;20739:1;20731:6;20727:14;20720:58;20812:34;20807:2;20799:6;20795:15;20788:59;20603:251;:::o;20860:366::-;21002:3;21023:67;21087:2;21082:3;21023:67;:::i;:::-;21016:74;;21099:93;21188:3;21099:93;:::i;:::-;21217:2;21212:3;21208:12;21201:19;;20860:366;;;:::o;21232:419::-;21398:4;21436:2;21425:9;21421:18;21413:26;;21485:9;21479:4;21475:20;21471:1;21460:9;21456:17;21449:47;21513:131;21639:4;21513:131;:::i;:::-;21505:139;;21232:419;;;:::o;21657:239::-;21797:34;21793:1;21785:6;21781:14;21774:58;21866:22;21861:2;21853:6;21849:15;21842:47;21657:239;:::o;21902:366::-;22044:3;22065:67;22129:2;22124:3;22065:67;:::i;:::-;22058:74;;22141:93;22230:3;22141:93;:::i;:::-;22259:2;22254:3;22250:12;22243:19;;21902:366;;;:::o;22274:419::-;22440:4;22478:2;22467:9;22463:18;22455:26;;22527:9;22521:4;22517:20;22513:1;22502:9;22498:17;22491:47;22555:131;22681:4;22555:131;:::i;:::-;22547:139;;22274:419;;;:::o;22699:225::-;22839:34;22835:1;22827:6;22823:14;22816:58;22908:8;22903:2;22895:6;22891:15;22884:33;22699:225;:::o;22930:366::-;23072:3;23093:67;23157:2;23152:3;23093:67;:::i;:::-;23086:74;;23169:93;23258:3;23169:93;:::i;:::-;23287:2;23282:3;23278:12;23271:19;;22930:366;;;:::o;23302:419::-;23468:4;23506:2;23495:9;23491:18;23483:26;;23555:9;23549:4;23545:20;23541:1;23530:9;23526:17;23519:47;23583:131;23709:4;23583:131;:::i;:::-;23575:139;;23302:419;;;:::o;23727:222::-;23867:34;23863:1;23855:6;23851:14;23844:58;23936:5;23931:2;23923:6;23919:15;23912:30;23727:222;:::o;23955:366::-;24097:3;24118:67;24182:2;24177:3;24118:67;:::i;:::-;24111:74;;24194:93;24283:3;24194:93;:::i;:::-;24312:2;24307:3;24303:12;24296:19;;23955:366;;;:::o;24327:419::-;24493:4;24531:2;24520:9;24516:18;24508:26;;24580:9;24574:4;24570:20;24566:1;24555:9;24551:17;24544:47;24608:131;24734:4;24608:131;:::i;:::-;24600:139;;24327:419;;;:::o;24752:239::-;24892:34;24888:1;24880:6;24876:14;24869:58;24961:22;24956:2;24948:6;24944:15;24937:47;24752:239;:::o;24997:366::-;25139:3;25160:67;25224:2;25219:3;25160:67;:::i;:::-;25153:74;;25236:93;25325:3;25236:93;:::i;:::-;25354:2;25349:3;25345:12;25338:19;;24997:366;;;:::o;25369:419::-;25535:4;25573:2;25562:9;25558:18;25550:26;;25622:9;25616:4;25612:20;25608:1;25597:9;25593:17;25586:47;25650:131;25776:4;25650:131;:::i;:::-;25642:139;;25369:419;;;:::o;25794:194::-;25834:4;25854:20;25872:1;25854:20;:::i;:::-;25849:25;;25888:20;25906:1;25888:20;:::i;:::-;25883:25;;25932:1;25929;25925:9;25917:17;;25956:1;25950:4;25947:11;25944:37;;;25961:18;;:::i;:::-;25944:37;25794:194;;;;:::o;25994:238::-;26134:34;26130:1;26122:6;26118:14;26111:58;26203:21;26198:2;26190:6;26186:15;26179:46;25994:238;:::o;26238:366::-;26380:3;26401:67;26465:2;26460:3;26401:67;:::i;:::-;26394:74;;26477:93;26566:3;26477:93;:::i;:::-;26595:2;26590:3;26586:12;26579:19;;26238:366;;;:::o;26610:419::-;26776:4;26814:2;26803:9;26799:18;26791:26;;26863:9;26857:4;26853:20;26849:1;26838:9;26834:17;26827:47;26891:131;27017:4;26891:131;:::i;:::-;26883:139;;26610:419;;;:::o;27035:191::-;27075:3;27094:20;27112:1;27094:20;:::i;:::-;27089:25;;27128:20;27146:1;27128:20;:::i;:::-;27123:25;;27171:1;27168;27164:9;27157:16;;27192:3;27189:1;27186:10;27183:36;;;27199:18;;:::i;:::-;27183:36;27035:191;;;;:::o;27232:85::-;27277:7;27306:5;27295:16;;27232:85;;;:::o;27323:60::-;27351:3;27372:5;27365:12;;27323:60;;;:::o;27389:158::-;27447:9;27480:61;27498:42;27507:32;27533:5;27507:32;:::i;:::-;27498:42;:::i;:::-;27480:61;:::i;:::-;27467:74;;27389:158;;;:::o;27553:147::-;27648:45;27687:5;27648:45;:::i;:::-;27643:3;27636:58;27553:147;;:::o;27706:348::-;27835:4;27873:2;27862:9;27858:18;27850:26;;27886:79;27962:1;27951:9;27947:17;27938:6;27886:79;:::i;:::-;27975:72;28043:2;28032:9;28028:18;28019:6;27975:72;:::i;:::-;27706:348;;;;;:::o;28060:250::-;28200:34;28196:1;28188:6;28184:14;28177:58;28269:33;28264:2;28256:6;28252:15;28245:58;28060:250;:::o;28316:366::-;28458:3;28479:67;28543:2;28538:3;28479:67;:::i;:::-;28472:74;;28555:93;28644:3;28555:93;:::i;:::-;28673:2;28668:3;28664:12;28657:19;;28316:366;;;:::o;28688:419::-;28854:4;28892:2;28881:9;28877:18;28869:26;;28941:9;28935:4;28931:20;28927:1;28916:9;28912:17;28905:47;28969:131;29095:4;28969:131;:::i;:::-;28961:139;;28688:419;;;:::o;29113:231::-;29253:34;29249:1;29241:6;29237:14;29230:58;29322:14;29317:2;29309:6;29305:15;29298:39;29113:231;:::o;29350:366::-;29492:3;29513:67;29577:2;29572:3;29513:67;:::i;:::-;29506:74;;29589:93;29678:3;29589:93;:::i;:::-;29707:2;29702:3;29698:12;29691:19;;29350:366;;;:::o;29722:419::-;29888:4;29926:2;29915:9;29911:18;29903:26;;29975:9;29969:4;29965:20;29961:1;29950:9;29946:17;29939:47;30003:131;30129:4;30003:131;:::i;:::-;29995:139;;29722:419;;;:::o;30147:180::-;30195:77;30192:1;30185:88;30292:4;30289:1;30282:15;30316:4;30313:1;30306:15;30333:295;30473:34;30469:1;30461:6;30457:14;30450:58;30542:34;30537:2;30529:6;30525:15;30518:59;30611:9;30606:2;30598:6;30594:15;30587:34;30333:295;:::o;30634:366::-;30776:3;30797:67;30861:2;30856:3;30797:67;:::i;:::-;30790:74;;30873:93;30962:3;30873:93;:::i;:::-;30991:2;30986:3;30982:12;30975:19;;30634:366;;;:::o;31006:419::-;31172:4;31210:2;31199:9;31195:18;31187:26;;31259:9;31253:4;31249:20;31245:1;31234:9;31230:17;31223:47;31287:131;31413:4;31287:131;:::i;:::-;31279:139;;31006:419;;;:::o;31431:309::-;31571:34;31567:1;31559:6;31555:14;31548:58;31640:34;31635:2;31627:6;31623:15;31616:59;31709:23;31704:2;31696:6;31692:15;31685:48;31431:309;:::o;31746:366::-;31888:3;31909:67;31973:2;31968:3;31909:67;:::i;:::-;31902:74;;31985:93;32074:3;31985:93;:::i;:::-;32103:2;32098:3;32094:12;32087:19;;31746:366;;;:::o;32118:419::-;32284:4;32322:2;32311:9;32307:18;32299:26;;32371:9;32365:4;32361:20;32357:1;32346:9;32342:17;32335:47;32399:131;32525:4;32399:131;:::i;:::-;32391:139;;32118:419;;;:::o;32543:239::-;32683:34;32679:1;32671:6;32667:14;32660:58;32752:22;32747:2;32739:6;32735:15;32728:47;32543:239;:::o;32788:366::-;32930:3;32951:67;33015:2;33010:3;32951:67;:::i;:::-;32944:74;;33027:93;33116:3;33027:93;:::i;:::-;33145:2;33140:3;33136:12;33129:19;;32788:366;;;:::o;33160:419::-;33326:4;33364:2;33353:9;33349:18;33341:26;;33413:9;33407:4;33403:20;33399:1;33388:9;33384:17;33377:47;33441:131;33567:4;33441:131;:::i;:::-;33433:139;;33160:419;;;:::o;33585:234::-;33725:34;33721:1;33713:6;33709:14;33702:58;33794:17;33789:2;33781:6;33777:15;33770:42;33585:234;:::o;33825:366::-;33967:3;33988:67;34052:2;34047:3;33988:67;:::i;:::-;33981:74;;34064:93;34153:3;34064:93;:::i;:::-;34182:2;34177:3;34173:12;34166:19;;33825:366;;;:::o;34197:419::-;34363:4;34401:2;34390:9;34386:18;34378:26;;34450:9;34444:4;34440:20;34436:1;34425:9;34421:17;34414:47;34478:131;34604:4;34478:131;:::i;:::-;34470:139;;34197:419;;;:::o;34622:245::-;34762:34;34758:1;34750:6;34746:14;34739:58;34831:28;34826:2;34818:6;34814:15;34807:53;34622:245;:::o;34873:366::-;35015:3;35036:67;35100:2;35095:3;35036:67;:::i;:::-;35029:74;;35112:93;35201:3;35112:93;:::i;:::-;35230:2;35225:3;35221:12;35214:19;;34873:366;;;:::o;35245:419::-;35411:4;35449:2;35438:9;35434:18;35426:26;;35498:9;35492:4;35488:20;35484:1;35473:9;35469:17;35462:47;35526:131;35652:4;35526:131;:::i;:::-;35518:139;;35245:419;;;:::o;35670:332::-;35791:4;35829:2;35818:9;35814:18;35806:26;;35842:71;35910:1;35899:9;35895:17;35886:6;35842:71;:::i;:::-;35923:72;35991:2;35980:9;35976:18;35967:6;35923:72;:::i;:::-;35670:332;;;;;:::o;36008:243::-;36148:34;36144:1;36136:6;36132:14;36125:58;36217:26;36212:2;36204:6;36200:15;36193:51;36008:243;:::o;36257:366::-;36399:3;36420:67;36484:2;36479:3;36420:67;:::i;:::-;36413:74;;36496:93;36585:3;36496:93;:::i;:::-;36614:2;36609:3;36605:12;36598:19;;36257:366;;;:::o;36629:419::-;36795:4;36833:2;36822:9;36818:18;36810:26;;36882:9;36876:4;36872:20;36868:1;36857:9;36853:17;36846:47;36910:131;37036:4;36910:131;:::i;:::-;36902:139;;36629:419;;;:::o;37054:247::-;37194:34;37190:1;37182:6;37178:14;37171:58;37263:30;37258:2;37250:6;37246:15;37239:55;37054:247;:::o;37307:366::-;37449:3;37470:67;37534:2;37529:3;37470:67;:::i;:::-;37463:74;;37546:93;37635:3;37546:93;:::i;:::-;37664:2;37659:3;37655:12;37648:19;;37307:366;;;:::o;37679:419::-;37845:4;37883:2;37872:9;37868:18;37860:26;;37932:9;37926:4;37922:20;37918:1;37907:9;37903:17;37896:47;37960:131;38086:4;37960:131;:::i;:::-;37952:139;;37679:419;;;:::o;38104:85::-;38149:7;38178:5;38167:16;;38104:85;;;:::o;38195:158::-;38253:9;38286:61;38304:42;38313:32;38339:5;38313:32;:::i;:::-;38304:42;:::i;:::-;38286:61;:::i;:::-;38273:74;;38195:158;;;:::o;38359:147::-;38454:45;38493:5;38454:45;:::i;:::-;38449:3;38442:58;38359:147;;:::o;38512:348::-;38641:4;38679:2;38668:9;38664:18;38656:26;;38692:79;38768:1;38757:9;38753:17;38744:6;38692:79;:::i;:::-;38781:72;38849:2;38838:9;38834:18;38825:6;38781:72;:::i;:::-;38512:348;;;;;:::o;38866:246::-;39006:34;39002:1;38994:6;38990:14;38983:58;39075:29;39070:2;39062:6;39058:15;39051:54;38866:246;:::o;39118:366::-;39260:3;39281:67;39345:2;39340:3;39281:67;:::i;:::-;39274:74;;39357:93;39446:3;39357:93;:::i;:::-;39475:2;39470:3;39466:12;39459:19;;39118:366;;;:::o;39490:419::-;39656:4;39694:2;39683:9;39679:18;39671:26;;39743:9;39737:4;39733:20;39729:1;39718:9;39714:17;39707:47;39771:131;39897:4;39771:131;:::i;:::-;39763:139;;39490:419;;;:::o;39915:332::-;40036:4;40074:2;40063:9;40059:18;40051:26;;40087:71;40155:1;40144:9;40140:17;40131:6;40087:71;:::i;:::-;40168:72;40236:2;40225:9;40221:18;40212:6;40168:72;:::i;:::-;39915:332;;;;;:::o;40253:243::-;40393:34;40389:1;40381:6;40377:14;40370:58;40462:26;40457:2;40449:6;40445:15;40438:51;40253:243;:::o;40502:366::-;40644:3;40665:67;40729:2;40724:3;40665:67;:::i;:::-;40658:74;;40741:93;40830:3;40741:93;:::i;:::-;40859:2;40854:3;40850:12;40843:19;;40502:366;;;:::o;40874:419::-;41040:4;41078:2;41067:9;41063:18;41055:26;;41127:9;41121:4;41117:20;41113:1;41102:9;41098:17;41091:47;41155:131;41281:4;41155:131;:::i;:::-;41147:139;;40874:419;;;:::o;41299:85::-;41344:7;41373:5;41362:16;;41299:85;;;:::o;41390:158::-;41448:9;41481:61;41499:42;41508:32;41534:5;41508:32;:::i;:::-;41499:42;:::i;:::-;41481:61;:::i;:::-;41468:74;;41390:158;;;:::o;41554:147::-;41649:45;41688:5;41649:45;:::i;:::-;41644:3;41637:58;41554:147;;:::o;41707:348::-;41836:4;41874:2;41863:9;41859:18;41851:26;;41887:79;41963:1;41952:9;41948:17;41939:6;41887:79;:::i;:::-;41976:72;42044:2;42033:9;42029:18;42020:6;41976:72;:::i;:::-;41707:348;;;;;:::o;42061:222::-;42154:4;42192:2;42181:9;42177:18;42169:26;;42205:71;42273:1;42262:9;42258:17;42249:6;42205:71;:::i;:::-;42061:222;;;;:::o;42289:143::-;42346:5;42377:6;42371:13;42362:22;;42393:33;42420:5;42393:33;:::i;:::-;42289:143;;;;:::o;42438:351::-;42508:6;42557:2;42545:9;42536:7;42532:23;42528:32;42525:119;;;42563:79;;:::i;:::-;42525:119;42683:1;42708:64;42764:7;42755:6;42744:9;42740:22;42708:64;:::i;:::-;42698:74;;42654:128;42438:351;;;;:::o;42795:442::-;42944:4;42982:2;42971:9;42967:18;42959:26;;42995:71;43063:1;43052:9;43048:17;43039:6;42995:71;:::i;:::-;43076:72;43144:2;43133:9;43129:18;43120:6;43076:72;:::i;:::-;43158;43226:2;43215:9;43211:18;43202:6;43158:72;:::i;:::-;42795:442;;;;;;:::o;43243:332::-;43364:4;43402:2;43391:9;43387:18;43379:26;;43415:71;43483:1;43472:9;43468:17;43459:6;43415:71;:::i;:::-;43496:72;43564:2;43553:9;43549:18;43540:6;43496:72;:::i;:::-;43243:332;;;;;:::o

Swarm Source

ipfs://55dd98f62b710ed3f7683d04260e292273c931c36f91d5efea235c1fe14fd592
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.