Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 60531931 | 177 days ago | 0.01 ETH | ||||
| 60531931 | 177 days ago | 0.01 ETH | ||||
| 60531851 | 177 days ago | 0.212 ETH | ||||
| 60531851 | 177 days ago | 0.212 ETH | ||||
| 55674987 | 273 days ago | 0.0004 ETH | ||||
| 55674987 | 273 days ago | 0.0006 ETH | ||||
| 55674987 | 273 days ago | 0.001 ETH | ||||
| 54666463 | 287 days ago | 0.00099448 ETH | ||||
| 54666463 | 287 days ago | 0.00099448 ETH | ||||
| 54666427 | 287 days ago | 0.001 ETH | ||||
| 54666427 | 287 days ago | 0.001 ETH | ||||
| 54666427 | 287 days ago | 0.001 ETH | ||||
| 51496726 | 328 days ago | 0.00008 ETH | ||||
| 51496726 | 328 days ago | 0.00008 ETH | ||||
| 51496726 | 328 days ago | 0.00008 ETH | ||||
| 51475923 | 328 days ago | 0.00142532 ETH | ||||
| 51475923 | 328 days ago | 0.00142532 ETH | ||||
| 51377204 | 330 days ago | 0.01 ETH | ||||
| 51377204 | 330 days ago | 0.01 ETH | ||||
| 51377204 | 330 days ago | 0.01 ETH | ||||
| 50194256 | 344 days ago | 0.04124027 ETH | ||||
| 50194256 | 344 days ago | 0.04124027 ETH | ||||
| 49578390 | 352 days ago | 0.00493766 ETH | ||||
| 49578390 | 352 days ago | 0.00493766 ETH | ||||
| 49208081 | 357 days ago | 0.00055 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
SwapAdapter
Compiler Version
v0.8.20+commit.a1b79de6
ZkSolc Version
v1.4.0
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.20;
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/access/Ownable2Step.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./lib/DexExecutor.sol";
import "./lib/Helper.sol";
// Be careful this contract contains unsafe call !.
// Do not approve token or just approve the right amount before call it.
// Clear approve in the same transaction if calling failed.
contract SwapAdapter is Ownable2Step, ReentrancyGuard {
using Address for address;
using SafeERC20 for IERC20;
struct Param {
address srcToken;
address dstToken;
address receiver;
address leftReceiver;
uint256 minAmount;
SwapData[] swaps;
}
struct SwapData {
uint8 dexType;
address callTo;
address approveTo;
uint256 fromAmount;
bytes callData;
}
event SwapComplete(
address indexed from,
address indexed srcToken,
uint256 indexed inputAmount,
address outToken,
uint256 outAmount,
address receiver
);
uint256 public immutable selfChainId = block.chainid;
constructor(address _owner) {
require(_owner != Helper.ZERO_ADDRESS, "ButterAgg: zero addr");
_transferOwnership(_owner);
}
// Not recommended for EOA call with token approve
// Approve the amount you want to trade.
// DexType 0 - AGG, 1 - UNIV2, 2 - UNIV3, 3 - CURVE
function swap(Param calldata params) external payable nonReentrant returns (uint256 outAmount) {
require(params.swaps.length > 0, "ButterAgg: empty swap data");
(uint256 amount, uint256 initInputTokenBalance) = _depositToken(params.srcToken);
uint256 finalTokenAmount = Helper._getBalance(params.dstToken, address(this));
(uint256 amountAdjust, uint256 firstAdjust, bool isUp) = _reBuildSwaps(amount, params.swaps);
bool isFirst = true;
SwapData[] memory _swaps = params.swaps;
for (uint256 i = 0; i < _swaps.length; i++) {
if (_swaps[i].dexType > 0 && firstAdjust > 0) {
if (isFirst) {
isUp ? _swaps[i].fromAmount += firstAdjust : _swaps[i].fromAmount -= firstAdjust;
isFirst = false;
} else {
isUp ? _swaps[i].fromAmount += amountAdjust : _swaps[i].fromAmount -= amountAdjust;
}
}
bool isNative = Helper._isNative(params.srcToken);
if (!isNative) {
IERC20(params.srcToken).safeApprove(_swaps[i].approveTo, 0);
IERC20(params.srcToken).safeApprove(_swaps[i].approveTo, _swaps[i].fromAmount);
}
DexExecutor.execute(
_swaps[i].dexType,
_swaps[i].callTo,
params.srcToken,
params.dstToken,
_swaps[i].fromAmount,
_swaps[i].callData
);
if (!isNative) {
IERC20(params.srcToken).safeApprove(_swaps[i].approveTo, 0);
}
}
outAmount = Helper._getBalance(params.dstToken, address(this)) - finalTokenAmount;
require(outAmount >= params.minAmount, "ButterAgg: swap received too low");
uint256 left = Helper._getBalance(params.srcToken, address(this)) - initInputTokenBalance;
if (left > 0) {
Helper._transfer(selfChainId, params.srcToken, params.leftReceiver, left);
}
address receiver = params.receiver == address(0) ? msg.sender : params.receiver;
Helper._transfer(selfChainId, params.dstToken, receiver, outAmount);
emit SwapComplete(msg.sender, params.srcToken, amount, params.dstToken, outAmount, receiver);
}
function _depositToken(address _token) private returns (uint256 amount, uint256 initInputTokenBalance) {
initInputTokenBalance = Helper._getBalance(_token, address(this));
if (Helper._isNative(_token)) {
initInputTokenBalance -= msg.value;
amount = msg.value;
} else {
amount = IERC20(_token).allowance(msg.sender, address(this));
SafeERC20.safeTransferFrom(IERC20(_token), msg.sender, address(this), amount);
}
require(amount > 0, "ButterAgg: zero input");
}
function _reBuildSwaps(
uint256 _amount,
SwapData[] memory _swaps
) private pure returns (uint256 amountAdjust, uint256 firstAdjust, bool isUp) {
uint256 total = 0;
uint256 count = 0;
for (uint256 i = 0; i < _swaps.length; i++) {
total += _swaps[i].fromAmount;
if (_swaps[i].dexType > 0) {
count++;
}
}
if (total > _amount) {
require(count > 0, "ButterAgg: cannot adjust");
isUp = false;
uint256 margin = total - _amount;
amountAdjust = margin / count;
firstAdjust = amountAdjust + (margin - amountAdjust * count);
} else if (total < _amount) {
if (count > 0) {
isUp = true;
uint256 margin = _amount - total;
amountAdjust = margin / count;
firstAdjust = amountAdjust + (margin - amountAdjust * count);
}
}
}
function rescueFunds(address _token, address _receiver, uint256 _amount) external onlyOwner {
require(_receiver != address(0));
Helper._transfer(selfChainId, _token, _receiver, _amount);
}
receive() external payable {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)
pragma solidity ^0.8.0;
import "./Ownable.sol";
/**
* @dev Contract module which provides access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() public virtual {
address sender = _msgSender();
require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
_transferOwnership(sender);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; // EIP-2612 is Final as of 2022-11-01. This file is deprecated. import "./IERC20Permit.sol";
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @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 amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` 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 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/IERC20Permit.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
* Revert on invalid signature.
*/
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "./Helper.sol";
library DexExecutor {
using SafeERC20 for IERC20;
enum DexType {
AGG,
UNIV2,
UNIV3,
CURVE,
FILL,
MIX
}
function execute(
uint8 _dexType,
address _router,
address _srcToken,
address _dstToken,
uint256 _amount,
bytes memory _swap
) internal {
bool _result;
bool _isNative = Helper._isNative(_srcToken);
DexType dexType = DexType(_dexType);
if (dexType == DexType.AGG) {
(_result) = _makeAggSwap(_router, _amount, _isNative, _swap);
} else if (dexType == DexType.UNIV2) {
(_result) = _makeUniV2Swap(_router, _dstToken, _amount, _isNative, _swap);
} else if (dexType == DexType.UNIV3) {
(_result) = _makeUniV3Swap(_router, _dstToken, _amount, _isNative, _swap);
} else if (dexType == DexType.CURVE) {
(_result) = _makeCurveSwap(_router, _amount, _isNative, _swap);
} else if (dexType == DexType.FILL) {
(_result) = _makeAggFill(_router, _amount, _isNative, _swap);
} else if (dexType == DexType.MIX) {
(_result) = _makeMixSwap(_srcToken, _amount, _swap);
} else {
require(false, "DexExecutor: unsupported dex type");
}
require(_result, "DexExecutor: swap fail");
}
struct MixSwap {
uint256 offset;
address srcToken;
address callTo;
address approveTo;
bytes callData;
}
function _makeMixSwap(address _srcToken, uint256 _amount, bytes memory _swap) internal returns (bool _result) {
MixSwap[] memory mixSwaps = abi.decode(_swap, (MixSwap[]));
for (uint256 i = 0; i < mixSwaps.length; i++) {
if (i != 0) {
_amount = Helper._getBalance(mixSwaps[i].srcToken, address(this));
_srcToken = mixSwaps[i].srcToken;
}
bytes memory callDatas = mixSwaps[i].callData;
uint256 offset = mixSwaps[i].offset;
if (offset != 0) {
assembly {
mstore(add(callDatas, offset), _amount)
}
}
if (Helper._isNative(_srcToken)) {
(_result, ) = mixSwaps[i].callTo.call{value: _amount}(callDatas);
} else {
if (i != 0) {
IERC20(_srcToken).safeIncreaseAllowance(mixSwaps[i].approveTo, _amount);
}
(_result, ) = mixSwaps[i].callTo.call(callDatas);
if (i != 0) {
IERC20(_srcToken).safeApprove(mixSwaps[i].approveTo, 0);
}
}
if (!_result) {
break;
}
}
}
function _makeAggSwap(
address _router,
uint256 _amount,
bool _isNative,
bytes memory _swap
) internal returns (bool _result) {
if (_isNative) {
(_result, ) = _router.call{value: _amount}(_swap);
} else {
(_result, ) = _router.call(_swap);
}
}
function _makeAggFill(
address _router,
uint256 _amount,
bool _isNative,
bytes memory _swap
) internal returns (bool _result) {
(uint256[] memory offsets, bytes memory callDatas) = abi.decode(_swap, (uint256[], bytes));
uint256 len = offsets.length;
for (uint i = 0; i < len; i++) {
uint256 offset = offsets[i];
if (offset != 0) {
assembly {
mstore(add(callDatas, offset), _amount)
}
}
}
if (_isNative) {
(_result, ) = _router.call{value: _amount}(callDatas);
} else {
(_result, ) = _router.call(callDatas);
}
}
function _makeUniV2Swap(
address _router,
address _dstToken,
uint256 _amount,
bool _isNative,
bytes memory _swap
) internal returns (bool _result) {
(uint256 amountOutMin, address[] memory path) = abi.decode(_swap, (uint256, address[]));
if (_isNative) {
(_result, ) = _router.call{value: _amount}(
abi.encodeWithSignature(
"swapExactETHForTokens(uint256,address[],address,uint256)",
amountOutMin,
path,
address(this),
block.timestamp + 100
)
);
} else if (Helper._isNative(_dstToken)) {
(_result, ) = _router.call(
abi.encodeWithSignature(
"swapExactTokensForETH(uint256,uint256,address[],address,uint256)",
_amount,
amountOutMin,
path,
address(this),
block.timestamp + 100
)
);
} else {
(_result, ) = _router.call(
abi.encodeWithSignature(
"swapExactTokensForTokens(uint256,uint256,address[],address,uint256)",
_amount,
amountOutMin,
path,
address(this),
block.timestamp + 100
)
);
}
}
struct ExactInputParams {
bytes path;
address recipient;
uint256 amountIn;
uint256 amountOutMinimum;
}
function _makeUniV3Swap(
address _router,
address _dstToken,
uint256 _amount,
bool _isNative,
bytes memory _swap
) internal returns (bool _result) {
(uint256 amountOutMin, bytes memory path) = abi.decode(_swap, (uint256, bytes));
address receiver = Helper._isNative(_dstToken) ? _router : address(this);
ExactInputParams memory params = ExactInputParams(path, receiver, _amount, amountOutMin);
bytes memory swapData = abi.encodeWithSignature("exactInput((bytes,address,uint256,uint256))", params);
uint256 value = _isNative ? _amount : 0;
if (Helper._isNative(_dstToken)) {
bytes[] memory c = new bytes[](2);
c[0] = swapData;
c[1] = abi.encodeWithSignature("unwrapWETH9(uint256,address)", amountOutMin, address(this));
(_result, ) = _router.call{value: value}(abi.encodeWithSignature("multicall(bytes[])", c));
} else {
(_result, ) = _router.call{value: value}(swapData);
}
}
function _makeCurveSwap(
address _router,
uint256 _amount,
bool _isNative,
bytes memory _swap
) internal returns (bool _result) {
(uint256 expected, address[9] memory routes, uint256[3][4] memory swap_params, address[4] memory pools) = abi
.decode(_swap, (uint256, address[9], uint256[3][4], address[4]));
uint256 value = _isNative ? _amount : 0;
(_result, ) = _router.call{value: value}(
abi.encodeWithSignature(
"exchange_multiple(address[9],uint256[3][4],uint256,uint256,address[4],address)",
routes,
swap_params,
_amount,
expected,
pools,
address(this)
)
);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol";
library Helper {
using SafeERC20 for IERC20;
address internal constant ZERO_ADDRESS = address(0);
address internal constant NATIVE_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
struct CallbackParam {
address target;
address approveTo;
uint256 offset;
uint256 extraNativeAmount;
address receiver;
bytes data;
}
struct SwapParam {
uint8 dexType;
address executor;
address approveTo;
address receiver;
address dstToken;
uint256 minReturnAmount;
bytes data;
}
function _isNative(address token) internal pure returns (bool) {
return (token == ZERO_ADDRESS || token == NATIVE_ADDRESS);
}
function _getBalance(address _token, address _account) internal view returns (uint256) {
if (_isNative(_token)) {
return _account.balance;
} else {
return IERC20(_token).balanceOf(_account);
}
}
function _transfer(uint256 _chainId, address _token, address _to, uint256 _amount) internal {
if (_isNative(_token)) {
Address.sendValue(payable(_to), _amount);
} else {
if (_chainId == 728126428 && _token == 0xa614f803B6FD780986A42c78Ec9c7f77e6DeD13C) {
// Tron USDT
_token.call(abi.encodeWithSelector(0xa9059cbb, _to, _amount));
} else {
IERC20(_token).safeTransfer(_to, _amount);
}
}
}
function _safeWithdraw(address _wToken, uint _value) internal returns (bool) {
(bool success, bytes memory data) = _wToken.call(abi.encodeWithSelector(0x2e1a7d4d, _value));
return (success && (data.length == 0 || abi.decode(data, (bool))));
}
function _getFirst4Bytes(bytes memory data) internal pure returns (bytes4 outBytes4) {
if (data.length == 0) {
return 0x0;
}
assembly {
outBytes4 := mload(add(data, 32))
}
}
function _makeSwap(
uint256 _amount,
address _srcToken,
SwapParam memory _swap
) internal returns (bool _result, address _dstToken, uint256 _returnAmount) {
_dstToken = _swap.dstToken;
uint256 nativeValue = 0;
bool isNative = Helper._isNative(_srcToken);
if (isNative) {
nativeValue = _amount;
} else {
IERC20(_srcToken).safeApprove(_swap.approveTo, 0);
IERC20(_srcToken).safeApprove(_swap.approveTo, _amount);
}
_returnAmount = Helper._getBalance(_dstToken, address(this));
(_result, ) = _swap.executor.call{value: nativeValue}(_swap.data);
_returnAmount = Helper._getBalance(_dstToken, address(this)) - _returnAmount;
if (!isNative) {
IERC20(_srcToken).safeApprove(_swap.approveTo, 0);
}
}
function _callBack(
uint256 _amount,
address _token,
CallbackParam memory _callParam
) internal returns (bool _result, uint256 _callAmount) {
_callAmount = Helper._getBalance(_token, address(this));
uint256 offset = _callParam.offset;
bytes memory callDatas = _callParam.data;
if (offset != 0) {
assembly {
mstore(add(callDatas, offset), _amount)
}
}
if (Helper._isNative(_token)) {
(_result, ) = _callParam.target.call{value: _amount}(callDatas);
} else {
if (_amount != 0) IERC20(_token).safeIncreaseAllowance(_callParam.approveTo, _amount);
// this contract not save money make sure send value can cover this
(_result, ) = _callParam.target.call{value: _callParam.extraNativeAmount}(callDatas);
if (_amount != 0) IERC20(_token).safeApprove(_callParam.approveTo, 0);
}
_callAmount = _callAmount - Helper._getBalance(_token, address(this));
}
function _permit(bytes memory _data) internal {
(
address token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) = abi.decode(_data, (address, address, address, uint256, uint256, uint8, bytes32, bytes32));
SafeERC20.safePermit(IERC20Permit(token), owner, spender, value, deadline, v, r, s);
}
}{
"evmVersion": "london",
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"srcToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"inputAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"outToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"outAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"SwapComplete","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"selfChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"leftReceiver","type":"address"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"components":[{"internalType":"uint8","name":"dexType","type":"uint8"},{"internalType":"address","name":"callTo","type":"address"},{"internalType":"address","name":"approveTo","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct SwapAdapter.SwapData[]","name":"swaps","type":"tuple[]"}],"internalType":"struct SwapAdapter.Param","name":"params","type":"tuple"}],"name":"swap","outputs":[{"internalType":"uint256","name":"outAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
9c4d535b00000000000000000000000000000000000000000000000000000000000000000100050b16e8bc3a5dca79a58640c1b1d8b727fe20609c40312d1b6db160c3a800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000df3f1ee5baf55055980887aad79f6fe6e3302d93
Deployed Bytecode
0x0004000000000002002400000000000200000000030100190000006004300270000004b50340019700030000003103550002000000010355000004b50040019d0000000102200190000000310000c13d0000008005000039000000400050043f000000040230008c000000950000413d000000000201043b000000e002200270000004c10420009c000000990000213d000004c70420009c000000a50000213d000004ca0420009c000000d10000613d000004cb0120009c0000013d0000c13d0000000001000416000000000101004b0000013d0000c13d000000000100041a000004b7021001970000000005000411000000000252004b0000013f0000c13d0000000102000039000000000302041a000004b803300197000000000032041b000004b801100197000000000010041b000004b5010000410000000002000414000004b50320009c0000000002018019000000c001200210000004b9011001c70000800d020000390000000303000039000004ba040000410000000006000019000001240000013d0000000002000416000000000202004b0000013d0000c13d000000bf02300039000004b602200197000000400020043f0000001f0230018f0000000504300272000000430000613d00000000050000190000000506500210000000000761034f000000000707043b000000a00660003900000000007604350000000105500039000000000645004b0000003b0000413d000000000502004b000000520000613d0000000504400210000000000141034f0000000302200210000000a004400039000000000504043300000000052501cf000000000525022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000151019f0000000000140435000000200130008c0000013d0000413d000000a00100043d002004b70010019b001f00000001001d000004b70110009c0000013d0000213d0000000102000039000000000102041a000004b801100197001e00000002001d000000000012041b0000000001000411000004b706100197000000000200041a000004b801200197000000000161019f000000000010041b000004b5040000410000000001000414000004b50310009c0000000001048019000000c001100210000004b9011001c7000004b7052001970000800d020000390000000303000039000004ba0400004112ce12c40000040f00000001012001900000013d0000613d00000002010000390000001e02000029000000000021041b000004bb0100004100000000001004390000000001000414000004b50210009c000004b501008041000000c001100210000004bc011001c70000800b0200003912ce12c90000040f00000001022001900000101f0000613d000000000101043b000000800010043f000000200100006b000001480000c13d000000400100043d0000004402100039000004be030000410000000000320435000000240210003900000014030000390000000000320435000004bf020000410000000000210435000000040210003900000020030000390000000000320435000004b502000041000004b50310009c00000000010280190000004001100210000004c0011001c7000012d000010430000000000103004b0000013d0000c13d0000000001000019000012cf0001042e000004c20420009c000000af0000213d000004c50120009c000000fb0000613d000004c60120009c0000013d0000c13d0000000001000416000000000101004b0000013d0000c13d0000000101000039000000000101041a000000ad0000013d000004c80120009c0000010b0000613d000004c90120009c0000013d0000c13d0000000001000416000000000101004b0000013d0000c13d000000000100041a000004b701100197000001080000013d000004c30420009c000001280000613d000004c40220009c0000013d0000c13d0000000002000416000000000202004b0000013d0000c13d000000040230008a000000200220008c0000013d0000413d0000000401100370000000000601043b000004b70160009c0000013d0000213d000000000100041a000004b7011001970000000005000411000000000151004b0000013f0000c13d0000000101000039000000000201041a000004b802200197000000000262019f000000000021041b000004b5010000410000000002000414000004b50320009c0000000002018019000000c001200210000004b9011001c70000800d020000390000000303000039000004cc04000041000001240000013d0000000002000416000000000202004b0000013d0000c13d000000040230008a000000600220008c0000013d0000413d0000000402100370000000000202043b002000000002001d000004b70220009c0000013d0000213d0000002402100370000000000202043b001f00000002001d000004b70220009c0000013d0000213d000000000200041a000004b7022001970000000003000411000000000232004b0000013f0000c13d0000001f0200006b0000013d0000613d0000004401100370000000000101043b001e00000001001d0000000001000412002400000001001d002300000000001d000080050100003900000044030000390000000004000415000000240440008a0000000504400210000004ec0200004112ce12a50000040f00000020020000290000001f030000290000001e0400002912ce11bb0000040f0000000001000019000012cf0001042e0000000001000416000000000101004b0000013d0000c13d0000000001000412002200000001001d002100000000001d000080050100003900000044030000390000000004000415000000220440008a0000000504400210000004ec0200004112ce12a50000040f000000800010043f000004f601000041000012cf0001042e0000000001000416000000000101004b0000013d0000c13d0000000101000039000000000201041a000004b7032001970000000006000411000000000363004b000001530000c13d000004b802200197000000000021041b000000000200041a000004b801200197000000000161019f000000000010041b000004b5010000410000000003000414000004b50430009c0000000003018019000000c001300210000004b9011001c7000004b7052001970000800d020000390000000303000039000004ba0400004112ce12c40000040f00000001012001900000013d0000613d000000970000013d002000000005001d000000040230008a000000200420008c0000013d0000413d0000000404100370000000000404043b001f00000004001d000004cd0440009c0000013d0000213d0000001f0220006a000004ce04000041000000c00520008c00000000050000190000000005044019000004ce02200197000000000602004b000000000400a019000004ce0220009c000000000405c019000000000204004b0000015f0000613d0000000001000019000012d000010430000004bf01000041000000800010043f0000002001000039000000840010043f000000a40010043f000004fa01000041000000c40010043f000004f401000041000012d0000104300000001f0100002912ce106e0000040f000000800100043d00000140000004430000016000100443000000200100003900000100001004430000001e010000290000012000100443000004bd01000041000012cf0001042e000004bf01000041000000800010043f0000002001000039000000840010043f0000002901000039000000a40010043f000004f701000041000000c40010043f000004f801000041000000e40010043f000004f901000041000012d0000104300000000204000039000000000204041a000000020220008c0000016b0000c13d000004bf01000041000000800010043f0000002001000039000000840010043f0000001f01000039000000a40010043f000004f501000041000001450000013d001e00000004001d000000000044041b0000001f040000290000000002430049000000230520008a000000a402400039000000000421034f000000000404043b000004ce06000041000000000754004b00000000070000190000000007068019000004ce05500197000004ce08400197000000000958004b0000000006008019000000000558013f000004ce0550009c000000000607c019000000000506004b0000013d0000c13d0000001f05000029001b00040050003d0000001b05400029000000000451034f000000000404043b000004cd0640009c0000013d0000213d000000050640021000000000036300490000002005500039000004ce06000041000000000735004b00000000070000190000000007062019000004ce03300197000004ce05500197000000000835004b0000000006008019000000000335013f000004ce0330009c000000000607c019000000000306004b0000013d0000c13d000000000304004b000001a10000c13d000004bf01000041000000800010043f0000002001000039000000840010043f0000001a01000039000000a40010043f000004f301000041000001450000013d000000a00220008a000000000121034f000000000101043b001d00000001001d000004b70110009c0000013d0000213d0000000001000410001800000001001d0000001d01000029000004b701100198000001ae0000613d000004cf0110009c000001be0000c13d000004d001000041000000000010043900000018010000290000000400100443000004b5010000410000000002000414000004b50320009c0000000002018019000000c001200210000004d1011001c70000800a0200003912ce12c90000040f00000001022001900000101f0000613d000000000101043b000001ff0000013d000004d201000041000000800010043f0000001801000029000004b701100197000000840010043f00000000010004140000001d02000029000000040220008c000001cc0000c13d0000000103000031000000200130008c00000000040300190000002004008039000001f80000013d000004b502000041000004b50310009c0000000001028019000000c001100210000004d3011001c70000001d0200002912ce12c90000040f00000000030100190000006003300270000004b503300197000000200430008c000000000403001900000020040080390000001f0540018f0000000506400272000001e50000613d00000000070000190000000508700210000000000981034f000000000909043b000000800880003900000000009804350000000107700039000000000867004b000001dd0000413d000000000705004b000001f40000613d0000000506600210000000000761034f00000003055002100000008006600039000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f000300000001035500000001022001900000030e0000613d0000001f01400039000000600110018f00000080011001bf000000400010043f000000200130008c0000013d0000413d000000800100043d001300000001001d0000001d01000029000004b701100198000002050000613d000004cf0110009c000002180000c13d0000000002000416000f00000002001d000000130120006b0000020d0000813d000004ea01000041000000000010043500000011010000390000037f0000013d0000000f0200002900130013002000710000000f0100006b0000022e0000c13d000000400100043d0000004402100039000004f203000041000000000032043500000024021000390000001503000039000000890000013d0000001801000029000004b701100197000000400300043d00000024023000390000000000120435000004d40100004100000000001304350000000001000411001a00000001001d000004b701100197001c00000003001d0000000402300039000000000012043500000000010004140000001d02000029000000040220008c0000032b0000c13d0000000103000031000000200130008c000000000403001900000020040080390000035d0000013d0000001f010000290000002401100039000500000001001d0000000201100367000000000201043b000004b70120009c0000013d0000213d000004b701200198000002390000613d000004cf0110009c000003aa0000c13d000004d001000041000000000010043900000018010000290000000400100443000004b5010000410000000002000414000004b50320009c0000000002018019000000c001200210000004d1011001c70000800a0200003912ce12c90000040f00000001022001900000101f0000613d000000000101043b000100000001001d00000000020000310000001f0120006a000000230410008a000000050100002900000080031000390000000201000367000000000331034f000000000303043b000004ce05000041000000000643004b00000000060000190000000006058019000004ce04400197000004ce07300197000000000847004b0000000005008019000000000447013f000004ce0440009c000000000506c019000000000405004b0000013d0000c13d0000001b03300029000000000431034f000000000404043b001a00000004001d000004cd0440009c0000013d0000213d0000001a04000029000000050440021000000000054200490000002003300039000004ce06000041000000000753004b00000000070000190000000007062019000004ce05500197001d00000003001d000004ce08300197000000000958004b0000000006008019000000000558013f000004ce0550009c000000000607c019000000000506004b0000013d0000c13d0000003f05400039001f0020000000920000001f0350017f000000400600043d001700000003001d0000000005360019001900000006001d000000000665004b00000000060000190000000106004039000004cd0750009c0000037c0000213d00000001066001900000037c0000c13d000000400050043f0000001a0300002900000019050000290000000007350436001c001d0040002d0000001c0520006b0000013d0000213d0000001c040000290000001d0540006c0000001a0a0000290000041a0000a13d000004ce09000041000000190a0000290000001d0b0000290000029c0000013d000000200aa000390000000003df001900000000000304350000008003c000390000000000e304350000000000ca0435000000200bb000390000001c03b0006c000004180000813d0000000005b1034f000000000505043b000004cd0650009c0000013d0000213d0000001d0d5000290000000005d20049000000a00650008c00000000060000190000000006094019000004ce05500197000000000805004b00000000080000190000000008092019000004ce0550009c000000000806c019000000000508004b0000013d0000c13d000000400c00043d000004d705c0009c0000037c0000213d000000a005c00039000000400050043f0000000005d1034f000000000505043b000000ff0650008c0000013d0000213d00000000065c04360000002005d00039000000000851034f000000000808043b000004b70e80009c0000013d0000213d00000000008604350000002006500039000000000561034f000000000505043b000004b70850009c0000013d0000213d0000004008c0003900000000005804350000002005600039000000000551034f000000000505043b0000006008c0003900000000005804350000004005600039000000000551034f000000000505043b000004cd0650009c0000013d0000213d0000000006d500190000001f05600039000000000825004b00000000080000190000000008098019000004ce05500197000004ce0d200197000000000ed5004b000000000e000019000000000e0940190000000005d5013f000004ce0550009c000000000e08c01900000000050e004b0000013d0000c13d000000000561034f000000000d05043b000004cd05d0009c0000037c0000213d0000003f05d000390000001f0550017f000000400e00043d00000000055e00190000000008e5004b00000000080000190000000108004039000004cd0f50009c0000037c0000213d00000001088001900000037c0000c13d000000400050043f000000000fde0436000000200560003900000000065d0019000000000626004b0000013d0000213d000000000651034f0000000508d00272000002fe0000613d0000000005000019000000050350021000000000043f0019000000000336034f000000000303043b00000000003404350000000105500039000000000385004b000002f60000413d0000001f05d00190000002930000613d0000000503800210000000000436034f00000000033f00190000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f0000000000430435000002930000013d000000400200043d0000001f0430018f00000005053002720000031b0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000003130000413d000000000604004b0000039e0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f00000000001504350000039e0000013d000004b502000041000004b50310009c00000000010280190000001c04000029000004b50340009c00000000020440190000004002200210000000c001100210000000000121019f000004d5011001c70000001d0200002912ce12c90000040f0000001c0a00002900000000030100190000006003300270000004b503300197000000200430008c000000000403001900000020040080390000001f0540018f00000005064002720000034a0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000003420000413d000000000705004b000003590000613d0000000506600210000000000761034f0000001c066000290000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f00030000000103550000000102200190000003820000613d0000001f01400039000000600110018f0000001c02100029000000000112004b00000000010000190000000101004039000004cd0420009c0000037c0000213d00000001011001900000037c0000c13d000000400020043f000000200130008c0000013d0000413d0000001c0100002900000000040104330000002001200039000004d603000041000000000031043500000044012000390000001803000029000000000031043500000024012000390000001a0300002900000000003104350000006401200039000f00000004001d000000000041043500000064010000390000000000120435000004d70120009c000003a50000a13d000004ea0100004100000000001004350000004101000039000000040010043f000004d801000041000012d000010430000000400200043d0000001f0430018f00000005053002720000038f0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000003870000413d000000000604004b0000039e0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000004b501000041000004b50420009c000000000201801900000040012002100000006002300210000000000121019f000012d000010430000000a001200039000000400010043f0000001d0100002912ce10870000040f0000020f0000013d000000400300043d000004d20100004100000000001304350000001801000029000004b701100197001d00000003001d000000040330003900000000001304350000000001000414000000040320008c000003ba0000c13d0000000103000031000000200130008c00000000040300190000002004008039000003eb0000013d000004b503000041000004b50410009c00000000010380190000001d05000029000004b50450009c00000000030540190000004003300210000000c001100210000000000131019f000004d8011001c712ce12c90000040f0000001d0a00002900000000030100190000006003300270000004b503300197000000200430008c000000000403001900000020040080390000001f0540018f0000000506400272000003d80000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000003d00000413d000000000705004b000003e70000613d0000000506600210000000000761034f0000001d066000290000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f00030000000103550000000102200190000003fb0000613d0000001f01400039000000600210018f0000001d01200029000000000221004b00000000020000190000000102004039000004cd0410009c0000037c0000213d00000001022001900000037c0000c13d000000400010043f000000200130008c0000013d0000413d0000001d010000290000000001010433000002480000013d000000400200043d0000001f0430018f0000000505300272000004080000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000004000000413d000000000604004b000004170000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f00000000001504350000039e0000013d0000001903000029000000000a030433000300010000003d00000000030a004b000400000000001d000a00000000001d000200000000001d000004b10000c13d000000400300043d0000001705300029000e00000003001d000000000335004b00000000060000190000000106004039000004cd0350009c0000037c0000213d00000001036001900000037c0000c13d000000400050043f0000000e030000290000001a040000290000000003430436000900000003001d0000001c040000290000001d0340006c000005080000a13d000004ce050000410000000e060000290000001d070000290000043f0000013d000000200660003900000000039b0019000000000003043500000080038000390000000000a30435000000000086043500000020077000390000001c0370006c000005050000813d000000000371034f000000000803043b000004cd0380009c0000013d0000213d0000001d098000290000000003920049000000a00430008c00000000040000190000000004054019000004ce03300197000000000803004b00000000080000190000000008052019000004ce0330009c000000000804c019000000000308004b0000013d0000c13d000000400800043d000004d70380009c0000037c0000213d000000a003800039000000400030043f000000000391034f000000000a03043b000000ff03a0008c0000013d0000213d000000000ba80436000000200a9000390000000003a1034f000000000c03043b000004b703c0009c0000013d0000213d0000000000cb0435000000200aa000390000000003a1034f000000000b03043b000004b703b0009c0000013d0000213d00000040038000390000000000b304350000002003a00039000000000331034f000000000303043b000000600480003900000000003404350000004003a00039000000000331034f000000000a03043b000004cd03a0009c0000013d0000213d000000000c9a00190000001f03c00039000000000423004b00000000040000190000000004058019000004ce03300197000004ce09200197000000000a93004b000000000a000019000000000a054019000000000393013f000004ce0330009c000000000a04c01900000000030a004b0000013d0000c13d0000000003c1034f000000000903043b000004cd0390009c0000037c0000213d0000003f039000390000001f0330017f000000400a00043d000000000b3a00190000000003ab004b000000000d000019000000010d004039000004cd03b0009c0000037c0000213d0000000103d001900000037c0000c13d0000004000b0043f000000000b9a0436000000200cc000390000000003c90019000000000323004b0000013d0000213d000000000cc1034f000000050d900272000004a10000613d000000000e0000190000000503e0021000000000043b001900000000033c034f000000000303043b0000000000340435000000010ee000390000000003de004b000004990000413d0000001f0e900190000004360000613d0000000503d0021000000000043c034f00000000033b0019000000030ce00210000000000d030433000000000dcd01cf000000000dcd022f000000000404043b000001000cc000890000000004c4022f0000000004c401cf0000000004d4019f0000000000430435000004360000013d000000000b00001900000000080000190000000009000019000004b80000013d000000010bb000390000000003ab004b000004cb0000813d0000000503b0021000000000033700190000000005030433000000600350003900000000030304330000000009930019000000000339004b000000000300001900000001030040390000000103300190000002090000c13d0000000003050433000000ff03300190000004b50000613d000000010300008a000000000338004b000002090000613d0000000108800039000004b50000013d0000000f0390006c000004d60000a13d000000000308004b000004f30000c13d000000400100043d0000004402100039000004d903000041000000000032043500000024021000390000001803000039000000890000013d0000000f0390006c000400000000001d000a00000000001d000200000000001d000004200000813d000000000308004b000400000000001d000a00000000001d000200000000001d000004200000613d0000000f0790006900040000608700e100000004358000b9000000000378004b000004e80000213d00000004435000fa000000000383004b000002090000c13d000000000357004b000002090000413d000200010000003d000a00040060002d0000000a0360006b000000000300001900000001030040390000000103300190000300000000001d000002090000c13d000004200000013d0000000f0790006a00040000608700e100000004358000b9000000000378004b000004fb0000213d00000004435000fa000000000383004b000002090000c13d000000000357004b000002090000413d000a00040060002d0000000a0360006b000000000300001900000001030040390000000103300190000200000000001d000002090000c13d000004200000013d0000000e020000290000000002020433001a00000002001d0000001802000029000c04b70020019b0000001a0200006b000005380000c13d0000000501100360000000000201043b000004b70120009c0000013d0000213d000004b701200198000005140000613d000004cf0110009c00000e850000c13d000004d001000041000000000010043900000018010000290000000400100443000004b5010000410000000002000414000004b50320009c0000000002018019000000c001200210000004d1011001c70000800a0200003912ce12c90000040f00000001022001900000101f0000613d000000000101043b000000010210006c000002090000413d001f000100100072000000050100002900000060021000390000000201000367000000000321034f000000000303043b0000001f0330006b00000edb0000813d000000400100043d0000004402100039000004f1030000410000000000320435000004bf02000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000008e0000013d000800010000003d0000001b01000029000700200010003d001200000000001d000600020000002d000005470000013d0000008003200039000000400030043f12ce10870000040f0000001202000029001200010020003d0000000e010000290000000001010433000000120110006b00000f6d0000813d000000120100002900000005011002100000000901100029000d00000001001d00000000010104330000000002010433000000ff02200190000005770000613d0000000a0200006b000005770000613d00000060011000390000000002010433000000080300006b000005600000613d000000060300006b000005660000613d0000000a03200029000000000223004b000000000200001900000001020040390000000102200190000002090000c13d0000000000310435000800000000001d000005770000013d000000030300006b0000056e0000613d000000040320006c000002090000413d0000000403000029000005690000013d0000000a0320006c000002090000413d0000000a0300002900000000023200490000000000210435000600000000001d000800000000001d000005770000013d0000000403200029000000000223004b000000000200001900000001020040390000000102200190000002090000c13d0000000000310435000600020000002d000800000000001d0000001b010000290000000201100367000000000101043b001000000001001d000004b70110009c0000013d0000213d000000100100006b0000061a0000613d0000001001000029000004cf0110009c0000061a0000613d0000000e010000290000000001010433000000120110006c00000e810000a13d0000000d01000029000000000101043300000040011000390000000001010433000000400200043d0000002003200039000004da040000410000000000430435000004b701100197000000240320003900000000001304350000004401000039001900000001001d000000000012043500000044012000390000000000010435000004db0120009c0000037c0000213d0000008001200039000000400010043f000000100100002912ce10870000040f0000001b010000290000000201100367000000000101043b001c00000001001d000004b70110009c0000013d0000213d0000000e010000290000000001010433000000120110006c00000e810000a13d000000400100043d001d00000001001d0000000d01000029000000000101043300000040021000390000000002020433001a04b70020019b00000060011000390000000001010433001700000001001d000000000101004b000006070000613d0000001d0200002900000024012000390000001a030000290000000000310435000004d401000041000000000012043500000004012000390000000c02000029000000000021043500000000010004140000001c02000029000000040220008c000005c40000c13d0000000103000031000000200130008c00000000040300190000002004008039000005f50000013d000004b50210009c000004b50300004100000000010380190000001d04000029000004b50240009c000000000203001900000000020440190000004002200210000000c001100210000000000121019f000004d5011001c70000001c0200002912ce12c90000040f00000000030100190000006003300270000004b503300197000000200430008c000000000403001900000020040080390000000505400272000005e20000613d000000000600001900000005076002100000001d08700029000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000005da0000413d0000001f06400190000005f10000613d0000000505500210000000000751034f0000001d055000290000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000102200190000010510000613d0000001f01400039000000600210018f0000001d01200029000000000221004b00000000020000190000000102004039000004cd0410009c0000037c0000213d00000001022001900000037c0000c13d000000400010043f000000200230008c0000013d0000413d0000001d020000290000000002020433000000000202004b001d00000001001d0000103d0000c13d0000001d030000290000002001300039000004da02000041000000000021043500000044013000390000001702000029000000000021043500000024013000390000001a02000029000000000021043500000019010000290000000000130435000004db0130009c0000037c0000213d0000001d020000290000008001200039000000400010043f0000001c0100002912ce10870000040f0000000e010000290000000001010433000000120110006c00000e810000a13d00000002020003670000001b032003600000000d01000029000000000401043300000000510404340000000005050433001c04b70050019b000000000303043b001700000003001d000004b70330009c0000013d0000213d0000000702200360000000000302043b000004b70230009c0000013d0000213d0000001706000029000004cf0260009c00000000050000190000000105006039000000000206004b00000000060000190000000106006039000000fe0210018f000000060220008c00000f6f0000813d0000008002400039000000000202043300000060044000390000000004040433001a00000004001d000000ff0410018f000000010140008c000006cd0000a13d000000000156019f000000020540008c000007600000613d000000030340008c000008440000613d000000040140008c000008c10000c13d0000000031020434000000400410008c000004ce0700004100000000040000190000000004074019000004ce05100197000000000605004b00000000060000190000000006072019000004ce0550009c000000000604c019000000000406004b0000013d0000c13d0000000005030433000004cd0450009c0000013d0000213d000000000431001900000000052500190000003f01500039000000000341004b000004ce0800004100000000030000190000000003088019000004ce01100197000004ce06400197000000000761004b00000000070000190000000007084019000000000161013f000004ce0110009c000000000703c019000000000107004b0000013d0000c13d00000020015000390000000003010433000004cd0130009c0000037c0000213d00000005063002100000003f016000390000001f0710017f000000400100043d0000000007710019000000000817004b00000000080000190000000108004039000004cd0970009c0000037c0000213d00000001088001900000037c0000c13d000000400070043f000000000331043600000040055000390000000006560019000000000746004b0000013d0000213d000000000765004b000006840000813d000000000703001900000000580504340000000007870436000000000865004b000006800000413d00000040052000390000000005050433000004cd0650009c0000013d0000213d00000000072500190000003f02700039000000000542004b000004ce0900004100000000050000190000000005098019000004ce02200197000004ce06400197000000000862004b00000000080000190000000008094019000000000262013f000004ce0220009c000000000805c019000000000208004b0000013d0000c13d00000020027000390000000006020433000004cd0260009c0000037c0000213d0000003f026000390000001f0220017f000000400500043d0000000002250019000000000852004b00000000080000190000000108004039000004cd0920009c0000037c0000213d00000001088001900000037c0000c13d000000400020043f000000000265043600000040077000390000000008760019000000000448004b0000013d0000213d000000000406004b000006b70000613d000000000400001900000000082400190000000009740019000000000909043300000000009804350000002004400039000000000864004b000006b00000413d000000000462001900000000000404350000000004010433000000000604004b000009640000613d0000000006000019000006c10000013d0000000106600039000000000746004b000009640000813d0000000007010433000000000767004b00000e810000a13d000000050760021000000000073700190000000007070433000000000807004b000006be0000613d00000000075700190000001a080000290000000000870435000006be0000013d000000000104004b000008b40000613d000000010140008c000008c10000c13d0000000014020434000000400540008c000004ce0800004100000000050000190000000005084019000004ce06400197000000000706004b00000000070000190000000007082019000004ce0660009c000000000705c019000000000507004b0000013d0000c13d0000000005010433001900000005001d00000040022000390000000005020433000004cd0250009c0000013d0000213d000000000214001900000000011500190000001f04100039000000000524004b000004ce0800004100000000050000190000000005088019000004ce04400197000004ce06200197000000000764004b00000000070000190000000007084019000000000464013f000004ce0440009c000000000705c019000000000407004b0000013d0000c13d0000000014010434000004cd0540009c0000037c0000213d00000005054002100000003f065000390000001f0660017f000000400700043d0000000006670019001d00000007001d000000000776004b00000000070000190000000107004039000004cd0860009c0000037c0000213d00000001077001900000037c0000c13d000000400060043f0000001d0600002900000000004604350000000004150019000000000224004b0000013d0000213d000000000241004b000007150000813d0000001d020000290000000015010434000004b70650009c0000013d0000213d00000020022000390000000000520435000000000541004b0000070e0000413d0000001701000029000004b7011001980000071a0000613d000004cf0110009c00000c0c0000c13d000004e60100004100000000001004390000000001000414000004b50210009c000004b501008041000000c001100210000004bc011001c70000800b0200003912ce12c90000040f00000001022001900000101f0000613d000000000301043b000000650100008a000000000113004b000002090000213d000000400200043d0000004401200039000000200400002900000000004104350000002001200039000004e70400004100000000004104350000002404200039000000190500002900000000005404350000001d040000290000000005040433000000a4042000390000000000540435000000c404200039000000000605004b000007440000613d00000000060000190000001d070000290000002007700039001d00000007001d0000000007070433000004b70770019700000000047404360000000106600039000000000756004b0000073b0000413d00000064033000390000008405200039000000000035043500000064032000390000000c0500002900000000005304350000000003240049000000200430008a00000000004204350000001f033000390000001f0430017f0000000003240019000000000443004b00000000040000190000000104004039000004cd0530009c0000037c0000213d00000001044001900000037c0000c13d000000400030043f000000000302043300000000020004140000001c04000029000000040440008c00000c590000c13d0000000102000039000000010100003100000d4c0000013d0000000045020434000000400650008c000004ce0900004100000000060000190000000006094019000004ce07500197000000000807004b00000000080000190000000008092019000004ce0770009c000000000806c019000000000608004b0000013d0000c13d00000040022000390000000002020433000004cd0620009c0000013d0000213d000000000745001900000000054200190000001f02500039000000000672004b000004ce0a000041000000000600001900000000060a8019000004ce02200197000004ce08700197000000000982004b000000000900001900000000090a4019000000000282013f000004ce0220009c000000000906c019000000000209004b0000013d0000c13d00000000020404330000000065050434000004cd0450009c0000037c0000213d0000003f045000390000001f0840017f000000400400043d0000000008840019000000000948004b00000000090000190000000109004039000004cd0a80009c0000037c0000213d00000001099001900000037c0000c13d000000400080043f00000000085404360000000009650019000000000779004b0000013d0000213d000000000705004b000007a00000613d00000000070000190000000009870019000000000a670019000000000a0a04330000000000a904350000002007700039000000000957004b000007990000413d00000000055800190000000000050435000004b706300197000004cf0560009c0000001c05000029000007aa0000613d000000000506004b0000001c05000029000007aa0000613d0000000c05000029000000400b00043d000004db06b0009c0000037c0000213d0000008006b00039000000400060043f0000006008b0003900000000002804350000004009b000390000001a060000290000000000690435000000200ab0003900000000005a043500000000004b0435000000400600043d0000002007600039000004e3040000410000000000470435000000240460003900000020050000390000000000540435000000000b0b04330000004404600039000000200c0000290000000000c40435000000c40c60003900000000040b043300000000004c0435000000e40c600039000000000d04004b000007d00000613d000000000d000019000000000ecd0019000000200dd00039000000000fbd0019000000000f0f04330000000000fe0435000000000e4d004b000007c90000413d000000000bc4001900000000000b0435000000000a0a0433000004b70aa00197000000640b6000390000000000ab04350000000009090433000000840a60003900000000009a04350000000008080433000000a40960003900000000008904350000001f044000390000001f0440017f000000c408400039000000000086043500000103044000390000001f0840017f0000000004680019000000000884004b00000000080000190000000108004039000004cd0940009c0000037c0000213d00000001088001900000037c0000c13d000000400040043f000000000101004b00000000010000190000001a0100c029001a00000001001d000004b701300198000007f30000613d000004cf0110009c00000bf00000c13d000004e00140009c0000037c0000213d0000006001400039000000400010043f000000400140003900000060070000390000000000710435000000200340003900000000007304350000001e070000290000000000740435000000000707004b00000e810000613d00000000006304350000000003040433000000000303004b00000e810000613d000000400300043d0000002006300039000004e407000041000000000076043500000044063000390000000c0700002900000000007604350000002406300039000000000026043500000044020000390000000000230435000004db0230009c0000037c0000213d0000008002300039000000400020043f0000000002040433000000020220008c00000e810000413d00000000003104350000000001040433000000020110008c00000e810000413d000000400200043d0000002001200039000004e503000041000000000031043500000024032000390000000000530435000000000304043300000044052000390000000000350435000000640520003900000005063002100000000007560019000000000603004b000009d40000613d0000000006000019000008320000013d0000001f098000390000001f0990017f0000000008780019000000000008043500000000077900190000000106600039000000000836004b000009d40000813d0000000008270049000000640880008a00000000058504360000002004400039000000000904043300000000080904330000000007870436000000000a08004b0000082a0000613d000000000a000019000000000b7a0019000000200aa00039000000000c9a0019000000000c0c04330000000000cb0435000000000b8a004b0000083c0000413d0000082a0000013d0000000034020434000003400540008c000004ce0800004100000000050000190000000005084019000004ce06400197000000000706004b00000000070000190000000007082019000004ce0660009c000000000705c019000000000507004b0000013d0000c13d00000000063400190000005f04200039000000000564004b000004ce0900004100000000050000190000000005098019000004ce07600197000004ce04400197000000000874004b00000000080000190000000008094019000000000474013f000004ce0440009c000000000805c019000000000408004b0000013d0000c13d0000000003030433000000400400043d000004df0540009c0000037c0000213d0000012005400039000000400050043f0000016008200039000000000568004b0000013d0000213d0000004005200039000001210700008a000000000775004b000008750000213d00000000070400190000000059050434000004b70a90009c0000013d0000213d0000000007970436000000000985004b0000086f0000413d0000017f05200039000000000765004b000004ce0b000041000000000700001900000000070b8019000004ce09600197000004ce05500197000000000a95004b000000000a000019000000000a0b4019000000000595013f000004ce0550009c000000000a07c01900000000050a004b0000013d0000c13d000000400500043d000004db0750009c0000037c0000213d0000008007500039000000400070043f000002e007200039000000000967004b0000013d0000213d000000000978004b000009760000813d0000000009050019000008940000013d0000000009a9043600000000087b004b00000000080b0019000009760000813d0000001f0a800039000000000b6a004b000004ce0e000041000000000b000019000000000b0e4019000004ce0c600197000004ce0aa00197000000000dca004b000000000d000019000000000d0e2019000000000aca013f000004ce0aa0009c000000000d0bc019000000000a0d004b0000013d0000613d000000400a00043d000004e00ba0009c0000037c0000213d000000600ba000390000004000b0043f000000600b800039000000000c6b004b0000013d0000213d000000610c00008a000000000cc8004b000008900000213d000000000c0a0019000000008d080434000000000cdc0436000000000db8004b000008af0000413d000008900000013d00000000120204340000001703000029000004b703300198000008ba0000613d000004cf0330009c00000bd50000c13d00000000030004140000001c04000029000000040440008c00000bdc0000c13d0000000102000039000000010100003100000d110000013d0000000031020434000000200410008c000004ce0700004100000000040000190000000004074019000004ce05100197000000000605004b00000000060000190000000006072019000004ce0550009c000000000604c019000000000406004b0000013d0000c13d0000000004030433000004cd0540009c0000013d0000213d0000000001210019000000200210003900000000033400190000001f04300039000000000524004b000004ce0800004100000000050000190000000005088019000004ce04400197000004ce06200197000000000764004b00000000070000190000000007084019000000000464013f000004ce0440009c000000000705c019000000000407004b0000013d0000c13d0000000046030434000004cd0560009c0000037c0000213d00000005056002100000003f075000390000001f0770017f000000400800043d0000000007780019001c00000008001d000000000887004b00000000080000190000000108004039000004cd0970009c0000037c0000213d00000001088001900000037c0000c13d000000400070043f0000001c070000290000000007670436001500000007001d0000000005450019000000000725004b0000013d0000213d000000000754004b00000a070000813d0000001c06000029000009060000013d000000200660003900000000088b00190000000000080435000000800870003900000000009804350000000000760435000000000754004b00000a050000813d0000000047040434000004cd0870009c0000013d0000213d00000000083700190000000007810049000000a00970008c000004ce0b000041000000000900001900000000090b4019000004ce07700197000000000a07004b000000000a000019000000000a0b2019000004ce0770009c000000000a09c01900000000070a004b0000013d0000c13d000000400700043d000004d70970009c0000037c0000213d000000a009700039000000400090043f000000200980003900000000090904330000000009970436000000400a800039000000000a0a0433000004b70ba0009c0000013d0000213d0000000000a9043500000060098000390000000009090433000004b70a90009c0000013d0000213d000000400a70003900000000009a043500000080098000390000000009090433000004b70a90009c0000013d0000213d000000600a70003900000000009a0435000000a0098000390000000009090433000004cd0a90009c0000013d0000213d000000000a8900190000003f08a00039000000000928004b000004ce0d000041000000000900001900000000090d8019000004ce08800197000004ce0b200197000000000cb8004b000000000c000019000000000c0d40190000000008b8013f000004ce0880009c000000000c09c01900000000080c004b0000013d0000c13d0000002008a000390000000008080433000004cd0980009c0000037c0000213d0000003f098000390000001f0b90017f000000400900043d000000000bb90019000000000c9b004b000000000c000019000000010c004039000004cd0db0009c0000037c0000213d000000010cc001900000037c0000c13d0000004000b0043f000000000b890436000000400aa00039000000000ca80019000000000c2c004b0000013d0000213d000000000c08004b000008fe0000613d000000000c000019000000000dbc0019000000000eac0019000000000e0e04330000000000ed0435000000200cc00039000000000d8c004b0000095c0000413d000008fe0000013d0000001703000029000000000103004b00000000010000190000000101006039000004cf0330009c00000000030000190000000103006039000000000313013f00000000010504330000000103300190000009ea0000613d00000000030004140000001c04000029000000040440008c00000c6d0000c13d0000000102000039000000010100003100000dcb0000013d000002ff08200039000000000968004b000004ce0c000041000000000900001900000000090c8019000004ce0a600197000004ce08800197000000000ba8004b000000000b000019000000000b0c40190000000008a8013f000004ce0880009c000000000b09c01900000000080b004b0000013d0000c13d000000400800043d000004db0980009c0000037c0000213d0000008009800039000000400090043f0000036002200039000000000662004b0000013d0000213d000000810600008a000000000667004b000009980000213d00000000060800190000000079070434000004b70a90009c0000013d0000213d0000000006960436000000000927004b000009910000413d000000400900043d0000002002900039000004e106000041000000000062043500000024069000390000000007000019000000004a040434000004b70aa001970000000006a60436000000080a70008c00000001077000390000099d0000413d00000144049000390000000006000019000000005705043400000000ba070434000000000aa40436000000000b0b04330000000000ba043500000040077000390000000007070433000000400a40003900000000007a0435000000030760008c00000001066000390000006004400039000009a50000413d000002e4049000390000000000340435000002c4039000390000001a040000290000000000430435000003040390003900000000040000190000000085080434000004b7055001970000000003530436000000030540008c0000000104400039000009b90000413d00000384039000390000000c04000029000000000043043500000384030000390000000000390435000000000101004b00000000010000190000001a0100c029001a00000001001d000004e20190009c0000037c0000213d000003c001900039000000400010043f000000000309043300000000010004140000001c04000029000000040440008c000009f10000c13d0000000102000039000000010100003100000ca80000013d0000000003270049000000200430008a00000000004204350000001f033000390000001f0430017f0000000003240019000000000443004b00000000040000190000000104004039000004cd0530009c0000037c0000213d00000001044001900000037c0000c13d000000400030043f000000000302043300000000020004140000001c04000029000000040440008c00000bf80000c13d0000000102000039000000010100003100000d380000013d00000000030004140000001c04000029000000040440008c00000c810000c13d0000000102000039000000010100003100000c940000013d000004b50420009c000004b50500004100000000020580190000004002200210000004b50430009c00000000030580190000006003300210000000000223019f000004b50310009c0000000001058019000000c001100210000000000112019f0000001a0200006b00000ca20000613d000004b9011001c700008009020000390000001a030000290000001c04000029000000000500001900000ca30000013d0000001c010000290000000006010433000000000106004b00000ed40000613d001d00000000001d0000001d02000029000000000102004b001900050020021800000a800000613d00000019020000290000001501200029001700000001001d000000000101043300000020011000390000000001010433000004b70210019800000a180000613d000004cf0120009c00000a270000c13d000004d0010000410000000000100439000000180100002900000004001004430000000001000414000004b50210009c000004b501008041000000c001100210000004d1011001c70000800a0200003912ce12c90000040f00000001022001900000101f0000613d000000000101043b00000a760000013d000000400300043d000004d2010000410000000000130435001a00000003001d00000004013000390000000c0300002900000000003104350000000001000414000000040320008c00000a360000c13d0000000103000031000000200130008c0000000004030019000000200400803900000a670000013d000004b50310009c000004b50400004100000000010480190000001a05000029000004b50350009c000000000304001900000000030540190000004003300210000000c001100210000000000131019f000004d8011001c712ce12c90000040f0000001a0900002900000000030100190000006003300270000004b503300197000000200430008c00000000040300190000002004008039000000050540027200000a540000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000a4c0000413d0000001f0640019000000a630000613d0000000505500210000000000751034f0000001a055000290000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010220019000000f820000613d0000001f01400039000000600210018f0000001a01200029000000000221004b00000000020000190000000102004039000004cd0410009c0000037c0000213d00000001022001900000037c0000c13d000000400010043f000000200130008c0000013d0000413d0000001a010000290000000001010433001a00000001001d0000001c0100002900000000060104330000001d0160006c00000e810000a13d0000001701000029000000000101043300000020011000390000000001010433001704b70010019b0000001d0160006c00000e810000a13d00000019020000290000001501200029001900000001001d0000000001010433000000800210003900000000030204330000000001010433000000000201004b00000a8e0000613d00000000013100190000001a020000290000000000210435001600000003001d0000001701000029000004b70210019800000a940000613d000004cf0120009c00000aa50000c13d0000001c0100002900000000010104330000001d0110006c00000e810000a13d0000001601000029000000002301043400000019010000290000000001010433000000400110003900000000040104330000000001000414000004b704400197000000040540008c00000ac40000c13d0000000102000039000000010100003100000add0000013d001400000002001d0000001d0100006b00000b620000613d0000001c0100002900000000010104330000001d0110006c00000e810000a13d0000001901000029000000000101043300000060011000390000000001010433000000400400043d000004d402000041000000000024043500000004024000390000000c030000290000000000320435000004b702100197001100000004001d0000002401400039000b00000002001d000000000021043500000000010004140000001402000029000000040220008c00000b0b0000c13d0000000103000031000000200130008c0000000004030019000000200400803900000b3d0000013d000004b50530009c000004b50600004100000000030680190000006003300210000004b50520009c00000000020680190000004002200210000000000223019f000004b50310009c0000000001068019000000c001100210000000000112019f0000001a0200006b00000ad70000613d000004b9011001c700008009020000390000001a03000029000000000500001900000ad80000013d000000000204001912ce12c40000040f00030000000103550000006001100270000104b50010019d000004b5011001970016000100200193000000000201004b00000bcc0000613d000004cd0210009c0000037c0000213d0000003f021000390000001f0320017f000000400200043d0000000003320019000000000423004b00000000040000190000000104004039000004cd0530009c0000037c0000213d00000001044001900000037c0000c13d000000400030043f00000000021204360000000303000367000000050410027200000afb0000613d000000000500001900000005065002100000000007620019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000af30000413d0000001f0110019000000bcc0000613d0000000504400210000000000343034f00000000024200190000000301100210000000000402043300000000041401cf000000000414022f000000000303043b0000010001100089000000000313022f00000000011301cf000000000141019f000000000012043500000bcc0000013d000004b50210009c000004b50300004100000000010380190000001104000029000004b50240009c000000000203001900000000020440190000004002200210000000c001100210000000000121019f000004d5011001c7000000140200002912ce12c90000040f000000110900002900000000030100190000006003300270000004b503300197000000200430008c00000000040300190000002004008039000000050540027200000b2a0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000b220000413d0000001f0640019000000b390000613d0000000505500210000000000751034f00000011055000290000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010220019000000f9f0000613d0000001f01400039000000600110018f0000001102100029000000000112004b00000000010000190000000101004039000004cd0420009c0000037c0000213d00000001011001900000037c0000c13d000000400020043f000000200130008c0000013d0000413d000000110100002900000000030104330000001a01300029000000000331004b000000000300001900000001030040390000000103300190000002090000c13d0000002003200039000004da0400004100000000004304350000004403200039000000000013043500000024012000390000000b03000029000000000031043500000044010000390000000000120435000004db0120009c0000037c0000213d0000008001200039000000400010043f000000140100002912ce10870000040f0000001c0100002900000000010104330000001d0110006c00000e810000a13d0000001601000029000000003401043400000019010000290000000001010433000000400110003900000000020104330000000001000414000004b702200197000000040520008c00000b730000c13d001600010000003d000000010100003100000b850000013d000004b50540009c000004b50600004100000000040680190000006004400210000004b50530009c00000000030680190000004003300210000000000334019f000004b50410009c0000000001068019000000c001100210000000000113019f12ce12c40000040f001600010020019300030000000103550000006001100270000104b50010019d000004b501100197000000000201004b00000bb10000613d000004cd0210009c0000037c0000213d0000003f021000390000001f0320017f000000400200043d0000000003320019000000000423004b00000000040000190000000104004039000004cd0530009c0000037c0000213d00000001044001900000037c0000c13d000000400030043f00000000021204360000000303000367000000050410027200000ba20000613d000000000500001900000005065002100000000007620019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000b9a0000413d0000001f0110019000000bb10000613d0000000504400210000000000343034f00000000024200190000000301100210000000000402043300000000041401cf000000000414022f000000000303043b0000010001100089000000000313022f00000000011301cf000000000141019f00000000001204350000001d0100006b00000bcc0000613d0000001c0100002900000000010104330000001d0110006c00000e810000a13d0000001901000029000000000101043300000060011000390000000001010433000000400200043d0000002003200039000004da040000410000000000430435000004b701100197000000240320003900000000001304350000004401000039000000000012043500000044012000390000000000010435000004db0120009c0000037c0000213d0000008001200039000000400010043f000000140100002912ce10870000040f000000160100006b00000ed40000613d0000001c0100002900000000060104330000001d01000029001d00010010003d0000001d0160006b00000a0a0000413d00000e610000013d00000000030004140000001c04000029000000040440008c00000cd60000c13d0000000102000039000000010100003100000ce90000013d000004b50420009c000004b50500004100000000020580190000006002200210000004b50410009c00000000010580190000004001100210000000000112019f000004b50230009c0000000003058019000000c002300210000000000112019f0000001a0200006b00000d0b0000613d000004b9011001c700008009020000390000001a030000290000001c04000029000000000500001900000d0c0000013d000000000206043300000000010004140000001c03000029000000040330008c00000cf70000c13d0000000102000039000000010100003100000df20000013d000004b50410009c000004b50500004100000000010580190000004001100210000004b50430009c00000000030580190000006003300210000000000113019f000004b50320009c0000000002058019000000c002200210000000000121019f0000001a0200006b00000d320000613d000004b9011001c700008009020000390000001a030000290000001c04000029000000000500001900000d330000013d000004b70130019800000c100000613d000004cf0110009c00000d5b0000c13d000004e60100004100000000001004390000000001000414000004b50210009c000004b501008041000000c001100210000004bc011001c70000800b0200003912ce12c90000040f00000001022001900000101f0000613d000000000301043b000000650100008a000000000113004b000002090000213d000000400200043d0000006401200039000000a00400003900000000004104350000004401200039000000190400002900000000004104350000002001200039000004e804000041000000000041043500000024042000390000001a0500002900000000005404350000001d040000290000000005040433000000c4042000390000000000540435000000e404200039000000000605004b00000c3d0000613d00000000060000190000001d070000290000002007700039001d00000007001d0000000007070433000004b70770019700000000047404360000000106600039000000000756004b00000c340000413d0000006403300039000000a405200039000000000035043500000084032000390000000c0500002900000000005304350000000003240049000000200430008a00000000004204350000001f033000390000001f0430017f0000000003240019000000000443004b00000000040000190000000104004039000004cd0530009c0000037c0000213d00000001044001900000037c0000c13d000000400030043f000000000302043300000000020004140000001c04000029000000040440008c00000da40000c13d0000000102000039000000010100003100000db70000013d000004b50410009c000004b50500004100000000010580190000004001100210000004b50430009c00000000030580190000006003300210000000000113019f000004b50320009c0000000002058019000000c002200210000000000121019f0000001a0200006b00000d460000613d000004b9011001c700008009020000390000001a030000290000001c04000029000000000500001900000d470000013d000004b50420009c000004b50500004100000000020580190000004002200210000004b50410009c00000000010580190000006001100210000000000121019f000004b50230009c0000000003058019000000c002300210000000000112019f0000001a0200006b00000dc50000613d000004b9011001c700008009020000390000001a030000290000001c04000029000000000500001900000dc60000013d000004b50420009c000004b50500004100000000020580190000004002200210000004b50410009c00000000010580190000006001100210000000000121019f000004b50230009c0000000003058019000000c002300210000000000112019f0000001c0200002912ce12c40000040f000000010220018f00030000000103550000006001100270000104b50010019d000004b501100197000000000301004b00000e5f0000613d000004cd0310009c0000037c0000213d0000003f031000390000001f0430017f000000400300043d0000000004430019000000000534004b00000000050000190000000105004039000004cd0640009c00000dd90000a13d0000037c0000013d0000001c0200002912ce12c40000040f00030000000103550000006001100270000104b50010019d000004b501100197000000000301004b00000cd40000613d000004cd0310009c0000037c0000213d0000003f031000390000001f0430017f000000400300043d0000000004430019000000000534004b00000000050000190000000105004039000004cd0640009c0000037c0000213d00000001055001900000037c0000c13d000000400040043f00000000031304360000000304000367000000050510027200000cc50000613d000000000600001900000005076002100000000008730019000000000774034f000000000707043b00000000007804350000000106600039000000000756004b00000cbd0000413d0000001f0110019000000cd40000613d0000000505500210000000000454034f00000000035300190000000301100210000000000503043300000000051501cf000000000515022f000000000404043b0000010001100089000000000414022f00000000011401cf000000000151019f0000000000130435000000010220018f00000e5f0000013d000004b50420009c000004b50500004100000000020580190000006002200210000004b50410009c00000000010580190000004001100210000000000112019f000004b50230009c0000000003058019000000c002300210000000000112019f0000001c0200002912ce12c40000040f000000010220018f00030000000103550000006001100270000104b50010019d000004b501100197000000000301004b00000e5f0000613d000004cd0310009c0000037c0000213d0000003f031000390000001f0430017f000000400300043d0000000004430019000000000534004b00000000050000190000000105004039000004cd0640009c00000d1f0000a13d0000037c0000013d000004b50370009c000004b50500004100000000070580190000004003700210000004b50420009c00000000020580190000006002200210000000000232019f000004b50310009c0000000001058019000000c001100210000000000112019f0000001a0200006b00000dec0000613d000004b9011001c700008009020000390000001a030000290000001c04000029000000000500001900000ded0000013d0000001c0200002912ce12c40000040f00030000000103550000006001100270000104b50010019d000004b501100197000000010220018f000000000301004b00000e5f0000613d000004cd0310009c0000037c0000213d0000003f031000390000001f0430017f000000400300043d0000000004430019000000000534004b00000000050000190000000105004039000004cd0640009c0000037c0000213d00000001055001900000037c0000c13d000000400040043f00000000031304360000000304000367000000050510027200000d2f0000613d000000000600001900000005076002100000000008730019000000000774034f000000000707043b00000000007804350000000106600039000000000756004b00000d270000413d0000001f0110019000000e5f0000613d00000e520000013d0000001c0200002912ce12c40000040f00030000000103550000006001100270000104b50010019d000004b501100197000000000301004b00000e1e0000613d000004cd0310009c0000037c0000213d0000003f031000390000001f0430017f000000400300043d0000000004430019000000000534004b00000000050000190000000105004039000004cd0640009c0000037c0000213d00000dff0000013d0000001c0200002912ce12c40000040f00030000000103550000006001100270000104b50010019d000004b501100197000000010220018f000000000301004b00000e5f0000613d000004cd0310009c0000037c0000213d0000003f031000390000001f0430017f000000400300043d0000000004430019000000000534004b00000000050000190000000105004039000004cd0640009c0000037c0000213d00000e400000013d000004e60100004100000000001004390000000001000414000004b50210009c000004b501008041000000c001100210000004bc011001c70000800b0200003912ce12c90000040f00000001022001900000101f0000613d000000000301043b000000650100008a000000000113004b000002090000213d000000400200043d0000006401200039000000a00400003900000000004104350000004401200039000000190400002900000000004104350000002001200039000004e904000041000000000041043500000024042000390000001a0500002900000000005404350000001d040000290000000005040433000000c4042000390000000000540435000000e404200039000000000605004b00000d880000613d00000000060000190000001d070000290000002007700039001d00000007001d0000000007070433000004b70770019700000000047404360000000106600039000000000756004b00000d7f0000413d0000006403300039000000a405200039000000000035043500000084032000390000000c0500002900000000005304350000000003240049000000200430008a00000000004204350000001f033000390000001f0430017f0000000003240019000000000443004b00000000040000190000000104004039000004cd0530009c0000037c0000213d00000001044001900000037c0000c13d000000400030043f000000000302043300000000020004140000001c04000029000000040440008c00000e200000c13d0000000102000039000000010100003100000e330000013d000004b50410009c000004b50500004100000000010580190000004001100210000004b50430009c00000000030580190000006003300210000000000113019f000004b50320009c0000000002058019000000c002200210000000000121019f0000001c0200002912ce12c40000040f000000010220018f00030000000103550000006001100270000104b50010019d000004b501100197000000000301004b00000e5f0000613d000004cd0310009c0000037c0000213d0000003f031000390000001f0430017f000000400300043d0000000004430019000000000534004b00000000050000190000000105004039000004cd0640009c0000037c0000213d00000e400000013d0000001c0200002912ce12c40000040f00030000000103550000006001100270000104b50010019d000004b501100197000000010220018f000000000301004b00000e5f0000613d000004cd0310009c0000037c0000213d0000003f031000390000001f0430017f000000400300043d0000000004430019000000000534004b00000000050000190000000105004039000004cd0640009c0000037c0000213d00000001055001900000037c0000c13d000000400040043f00000000031304360000000304000367000000050510027200000de90000613d000000000600001900000005076002100000000008730019000000000774034f000000000707043b00000000007804350000000106600039000000000756004b00000de10000413d0000001f0110019000000e520000c13d00000e5f0000013d0000001c0200002912ce12c40000040f00030000000103550000006001100270000104b50010019d000004b501100197000000000301004b00000e1e0000613d000004cd0310009c0000037c0000213d0000003f031000390000001f0430017f000000400300043d0000000004430019000000000534004b00000000050000190000000105004039000004cd0640009c0000037c0000213d00000001055001900000037c0000c13d000000400040043f00000000031304360000000304000367000000050510027200000e0f0000613d000000000600001900000005076002100000000008730019000000000774034f000000000707043b00000000007804350000000106600039000000000756004b00000e070000413d0000001f0110019000000e1e0000613d0000000505500210000000000454034f00000000035300190000000301100210000000000503043300000000051501cf000000000515022f000000000404043b0000010001100089000000000414022f00000000011401cf000000000151019f0000000000130435000000010220018f00000e5f0000013d000004b50410009c000004b50500004100000000010580190000004001100210000004b50430009c00000000030580190000006003300210000000000113019f000004b50320009c0000000002058019000000c002200210000000000121019f0000001c0200002912ce12c40000040f000000010220018f00030000000103550000006001100270000104b50010019d000004b501100197000000000301004b00000e5f0000613d000004cd0310009c0000037c0000213d0000003f031000390000001f0430017f000000400300043d0000000004430019000000000534004b00000000050000190000000105004039000004cd0640009c0000037c0000213d00000001055001900000037c0000c13d000000400040043f00000000031304360000000304000367000000050510027200000e500000613d000000000600001900000005076002100000000008730019000000000774034f000000000707043b00000000007804350000000106600039000000000756004b00000e480000413d0000001f0110019000000e5f0000613d0000000505500210000000000454034f00000000035300190000000301100210000000000503043300000000051501cf000000000515022f000000000404043b0000010001100089000000000414022f00000000011401cf000000000151019f0000000000130435000000000102004b00000ed40000613d000000100100006b000005410000613d0000001001000029000004cf0110009c000005410000613d0000001b010000290000000201100367000000000101043b000004b70210009c0000013d0000213d0000000e020000290000000002020433000000120220006c00000e810000a13d0000000d02000029000000000202043300000040022000390000000003020433000000400200043d0000002004200039000004da050000410000000000540435000004b703300197000000240420003900000000003404350000004403000039000000000032043500000044032000390000000000030435000004db0320009c0000053e0000a13d0000037c0000013d000004ea01000041000000000010043500000032010000390000037f0000013d000000400300043d000004d2010000410000000000130435002000000003001d00000004013000390000000c0300002900000000003104350000000001000414000000040320008c00000e940000c13d0000000103000031000000200130008c0000000004030019000000200400803900000ec40000013d000004b503000041000004b50410009c00000000010380190000002005000029000004b50450009c00000000030540190000004003300210000000c001100210000000000131019f000004d8011001c712ce12c90000040f00000000030100190000006003300270000004b503300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000eb10000613d000000000700001900000005087002100000002009800029000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000ea90000413d000000000705004b00000ec00000613d0000000506600210000000000761034f00000020066000290000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f0003000000010355000000010220019000000f500000613d0000001f01400039000000600210018f0000002001200029000000000221004b00000000020000190000000102004039000004cd0410009c0000037c0000213d00000001022001900000037c0000c13d000000400010043f000000200130008c0000013d0000413d00000020010000290000000001010433000005230000013d000000400100043d0000004402100039000004eb03000041000000000032043500000024021000390000001603000039000000890000013d001d0080002000920000001d01100360000000000201043b000004b70120009c0000013d0000213d000004b70120019800000ee40000613d000004cf0110009c00000f730000c13d000004d001000041000000000010043900000018010000290000000400100443000004b5010000410000000002000414000004b50320009c0000000002018019000000c001200210000004d1011001c70000800a0200003912ce12c90000040f00000001022001900000101f0000613d000000000101043b002000000001001d0000002002000029000000130120006c000002090000413d0000002002000029000000130120006c00000ffc0000c13d0000001d0100002900000040021000390000000201000367000000000221034f000000000202043b002000000002001d000004b70220009c0000013d0000213d000000200200006b00000f060000c13d0000000002000411002000000002001d0000000501100360000000000101043b001d00000001001d000004b70110009c0000013d0000213d000004ec010000410000000000100439000000000100041200000004001004430000002400000443000004b5010000410000000002000414000004b50320009c0000000002018019000000c001200210000004ed011001c7000080050200003912ce12c90000040f00000001022001900000101f0000613d000000000101043b0000001d0200002900000020030000290000001f0400002912ce11bb0000040f0000000501000029000000200210008a0000000201000367000000000221034f000000000602043b000004b70260009c0000013d0000213d0000000501100360000000000101043b000004b70210009c0000013d0000213d0000002002000029000004b702200197000000400300043d0000004004300039000000000024043500000020023000390000001f0400002900000000004204350000000000130435000004b5040000410000000001000414000004b50210009c0000000001048019000004b50230009c00000000030480190000004002300210000000c001100210000000000121019f000004ee011001c70000800d0200003900000004030000390000000005000411000004ef040000410000000f0700002912ce12c40000040f00000001012001900000013d0000613d00000001010000390000001e02000029000000000012041b000000400100043d0000001f020000290000000000210435000004b50210009c000004b5010080410000004001100210000004f0011001c7000012cf0001042e000000400200043d0000001f0430018f000000050530027200000f5d0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000f550000413d000000000604004b00000f6c0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f00000000001504350000039e0000013d00000002010003670000050c0000013d000004ea01000041000000000010043500000021010000390000037f0000013d000000400300043d000004d2010000410000000000130435002000000003001d00000004013000390000000c0300002900000000003104350000000001000414000000040320008c00000fbc0000c13d0000000103000031000000200130008c0000000004030019000000200400803900000fec0000013d000000400200043d0000001f0430018f000000050530027200000f8f0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000f870000413d000000000604004b00000f9e0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f00000000001504350000039e0000013d000000400200043d0000001f0430018f000000050530027200000fac0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000fa40000413d000000000604004b00000fbb0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f00000000001504350000039e0000013d000004b503000041000004b50410009c00000000010380190000002005000029000004b50450009c00000000030540190000004003300210000000c001100210000000000131019f000004d8011001c712ce12c90000040f00000000030100190000006003300270000004b503300197000000200430008c000000000403001900000020040080390000001f0540018f000000050640027200000fd90000613d000000000700001900000005087002100000002009800029000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000fd10000413d000000000705004b00000fe80000613d0000000506600210000000000761034f00000020066000290000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f00030000000103550000000102200190000010200000613d0000001f01400039000000600210018f0000002001200029000000000221004b00000000020000190000000102004039000004cd0410009c0000037c0000213d00000001022001900000037c0000c13d000000400010043f000000200130008c0000013d0000413d0000002001000029000000000101043300000ef30000013d00000002010003670000001b02100360000000000202043b001c00000002001d000004b70220009c0000013d0000213d0000001b020000290000006002200039000000000121034f000000000101043b001b00000001001d000004b70110009c0000013d0000213d000004ec010000410000000000100439000000000100041200000004001004430000002400000443000004b5010000410000000002000414000004b50320009c0000000002018019000000c001200210000004ed011001c7000080050200003912ce12c90000040f00000001022001900000101f0000613d0000002003000029000000130430006a000000000101043b0000001c020000290000001b0300002912ce11bb0000040f00000efa0000013d000000000001042f000000400200043d0000001f0430018f00000005053002720000102d0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000010250000413d000000000604004b0000103c0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f00000000001504350000039e0000013d0000006402100039000004dc0300004100000000003204350000004402100039000004dd030000410000000000320435000000240210003900000036030000390000000000320435000004bf020000410000000000210435000000040210003900000020030000390000000000320435000004b502000041000004b50310009c00000000010280190000004001100210000004de011001c7000012d000010430000000400200043d0000001f0430018f00000005053002720000105e0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000010560000413d000000000604004b0000106d0000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f00000000001504350000039e0000013d0000000102000039000000000302041a000004b803300197000000000032041b000004b706100197000000000200041a000004b801200197000000000161019f000000000010041b000004b5010000410000000003000414000004b50430009c0000000003018019000000c001300210000004b9011001c7000004b7052001970000800d020000390000000303000039000004ba0400004112ce12c40000040f0000000101200190000010850000613d000000000001042d0000000001000019000012d0000104300005000000000002000004b706100197000000400700043d000004fb0170009c0000115a0000813d0000004001700039000000400010043f0000002001700039000004fc0300004100000000003104350000002001000039000300000001001d000000000017043500000000230204340000000001000414000000040460008c000010df0000c13d00000060090000390000000102000032000010c70000613d000004cd0120009c0000115a0000213d0000003f01200039000000200300008a000000000131016f000000400900043d0000000001190019000000000391004b00000000030000190000000103004039000004cd0410009c0000115a0000213d00000001033001900000115a0000c13d000000400010043f0000001f0120018f000000000329043600000003040003670000000502200272000010b80000613d000000000500001900000005065002100000000007630019000000000664034f000000000606043b00000000006704350000000105500039000000000625004b000010b00000413d000000000501004b000010c70000613d0000000502200210000000000424034f00000000022300190000000301100210000000000302043300000000031301cf000000000313022f000000000404043b0000010001100089000000000414022f00000000011401cf000000000131019f00000000001204350000000002000415000000050220008a00000005022002100000000001090433000000000301004b000011280000c13d000100000009001d000004fd01000041000000000010043900000004010000390000000400100443000004b5010000410000000002000414000004b50320009c0000000002018019000000c001200210000004d1011001c7000080020200003912ce12c90000040f00000001022001900000118c0000613d0000000002000415000000050220008a0000113b0000013d000004b504000041000004b50530009c00000000030480190000006003300210000004b50520009c00000000020480190000004002200210000000000223019f000004b50310009c0000000001048019000000c001100210000000000112019f000200000006001d0000000002060019000100000007001d12ce12c40000040f00000060090000390000008003000039000300000001035500000000040100190000006004400270000104b50040019d000004b5054001980000111f0000613d0000003f03500039000004b603300197000000400900043d0000000003390019000000000493004b00000000040000190000000104004039000004cd0630009c0000115a0000213d00000001044001900000115a0000c13d000000400030043f0000001f0450018f00000000035904360000000505500272000011100000613d000000000600001900000005076002100000000008730019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000011080000413d000000000604004b0000111f0000613d0000000505500210000000000151034f00000000055300190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f000000000015043500000000010904330000000102200190000011770000613d0000000002000415000000040220008a0000000502200210000000000301004b00000002030000290000112b0000613d0000000502200270000000000209001f000011450000013d000100000009001d000004fd0100004100000000001004390000000400300443000004b5010000410000000002000414000004b50320009c0000000002018019000000c001200210000004d1011001c7000080020200003912ce12c90000040f00000001022001900000118c0000613d0000000002000415000000040220008a0000000502200210000000000101043b000000000101004b00000001090000290000118d0000613d00000000010904330000000502200270000000000209001f000000000201004b000011590000613d000004ce02000041000000200310008c00000000030000190000000003024019000004ce01100197000000000401004b000000000200a019000004ce0110009c000000000203c019000000000102004b000011600000c13d00000020019000390000000001010433000000000201004b0000000002000019000000010200c039000000000221004b000011600000c13d000000000101004b000011620000613d000000000001042d000004ea0100004100000000001004350000004101000039000000040010043f000004d801000041000012d0000104300000000001000019000012d000010430000000400100043d0000006402100039000004fe0300004100000000003204350000004402100039000004ff03000041000000000032043500000024021000390000002a030000390000000000320435000004bf020000410000000000210435000000040210003900000003030000290000000000320435000004b502000041000004b50310009c00000000010280190000004001100210000004de011001c7000012d000010430000000000201004b0000119f0000c13d000000400300043d000200000003001d000004bf0100004100000000001304350000000401300039000000030200002900000000002104350000002402300039000000010100002912ce11a80000040f00000002040000290000000001410049000004b502000041000004b50310009c0000000001028019000004b50340009c00000000040280190000004002400210000011a50000013d000000000001042f000000400100043d00000044021000390000050003000041000000000032043500000024021000390000001d030000390000000000320435000004bf020000410000000000210435000000040210003900000003030000290000000000320435000004b502000041000004b50310009c00000000010280190000004001100210000004c0011001c7000012d000010430000004b502000041000004b50410009c0000000001028019000004b50430009c000000000302801900000040023002100000006001100210000000000121019f000012d00001043000000000030104330000000002320436000000000403004b000011b40000613d000000000400001900000000052400190000002004400039000000000614001900000000060604330000000000650435000000000534004b000011ad0000413d000000000123001900000000000104350000001f01300039000000200300008a000000000131016f0000000001120019000000000001042d00020000000000020000000008010019000004b701200198000011c10000613d000004cf0510009c000011dd0000c13d000100000004001d000004d001000041000000000010043900000000010004100000000400100443000004b5010000410000000002000414000004b50420009c0000000002018019000000c001200210000004d1011001c70000800a02000039000200000003001d12ce12c90000040f0000000203000029000004b70430019700000001022001900000127c0000613d000000000101043b0000000103000029000000000131004b0000127d0000413d0000000001000414000000040240008c0000122e0000c13d00000001020000390000000101000031000012450000013d000000400900043d00000044059000390000000000450435000000200590003900000504060000410000000000650435000004b7063001970000002407900039000000000067043500000044060000390000000000690435000005050480009c000012380000c13d000005060410009c000012380000c13d000004db0190009c000012760000213d0000008001900039000000400010043f000004b501000041000004b50450009c000000000501801900000040045002100000000003090433000004b50530009c00000000030180190000006003300210000000000343019f0000000004000414000004b50540009c0000000004018019000000c001400210000000000113019f12ce12c40000040f000300000001035500000000020100190000006002200270000104b50020019d000004b504200198000012750000613d0000003f02400039000004b602200197000000400300043d0000000002230019000000000532004b00000000050000190000000105004039000004cd0620009c000012760000213d0000000105500190000012760000c13d000000400020043f0000001f0240018f000000000343043600000005044002720000121e0000613d000000000500001900000005065002100000000007630019000000000661034f000000000606043b00000000006704350000000105500039000000000645004b000012160000413d000000000502004b000012750000613d0000000504400210000000000141034f00000000034300190000000302200210000000000403043300000000042401cf000000000424022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000141019f0000000000130435000012750000013d000004b502000041000004b50510009c0000000001028019000000c001100210000000000203004b0000123f0000613d000004b9011001c700008009020000390000000005000019000012400000013d000005070290009c000012760000813d0000008002900039000000400020043f000000000209001912ce10870000040f000012750000013d000000000204001912ce12c40000040f00030000000103550000006001100270000104b50010019d000004b501100197000000000301004b000012730000613d000004cd0310009c000012760000213d0000003f03100039000000200400008a000000000343016f000000400400043d0000000003340019000000000543004b00000000050000190000000105004039000004cd0630009c000012760000213d0000000105500190000012760000c13d000000400030043f0000001f0310018f000000000414043600000003050003670000000501100272000012640000613d000000000600001900000005076002100000000008740019000000000775034f000000000707043b00000000007804350000000106600039000000000716004b0000125c0000413d000000000603004b000012730000613d0000000501100210000000000515034f00000000011400190000000303300210000000000401043300000000043401cf000000000434022f000000000505043b0000010003300089000000000535022f00000000033501cf000000000343019f000000000031043500000001012001900000128f0000613d000000000001042d000004ea0100004100000000001004350000004101000039000000040010043f000004d801000041000012d000010430000000000001042f000000400100043d00000044021000390000050303000041000000000032043500000024021000390000001d030000390000000000320435000004bf020000410000000000210435000000040210003900000020030000390000000000320435000004b502000041000004b50310009c00000000010280190000004001100210000004c0011001c7000012d000010430000000400100043d00000064021000390000050103000041000000000032043500000044021000390000050203000041000000000032043500000024021000390000003a030000390000000000320435000004bf020000410000000000210435000000040210003900000020030000390000000000320435000004b502000041000004b50310009c00000000010280190000004001100210000004de011001c7000012d000010430000000000001042f00000000050100190000000000200439000000050130008c000012b30000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000631004b000012ab0000413d000004b5010000410000000002000414000004b50420009c0000000002018019000004b50430009c00000000030180190000006001300210000000c002200210000000000112019f00000508011001c7000000000205001912ce12c90000040f0000000102200190000012c30000613d000000000101043b000000000001042d000000000001042f000012c7002104210000000102000039000000000001042d0000000002000019000000000001042d000012cc002104230000000102000039000000000001042d0000000002000019000000000001042d000012ce00000432000012cf0001042e000012d00001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b020000020000000000000000000000000000000400000000000000000000000000000002000000000000000000000000000000800000010000000000000000004275747465724167673a207a65726f206164647200000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000000000000000000000cc9e3e8800000000000000000000000000000000000000000000000000000000efa0646400000000000000000000000000000000000000000000000000000000efa0646500000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000cc9e3e8900000000000000000000000000000000000000000000000000000000e30c39780000000000000000000000000000000000000000000000000000000079ba50960000000000000000000000000000000000000000000000000000000079ba5097000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000006ccae05400000000000000000000000000000000000000000000000000000000715018a638d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700000000000000000000000000000000000000000000000000ffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f39020000020000000000000000000000000000002400000000000000000000000070a08231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000800000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff5f00000000000000000000000000000000000000240000000000000000000000004275747465724167673a2063616e6e6f742061646a7573740000000000000000095ea7b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000005361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f0000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffedf000000000000000000000000000000000000000000000000ffffffffffffff9f0651cb3500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffc3fb858183f0000000000000000000000000000000000000000000000000000000049404b7c00000000000000000000000000000000000000000000000000000000ac9650d800000000000000000000000000000000000000000000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391327ff36ab50000000000000000000000000000000000000000000000000000000018cbafe50000000000000000000000000000000000000000000000000000000038ed1739000000000000000000000000000000000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000004465784578656375746f723a2073776170206661696c00000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e020000020000000000000000000000000000004400000000000000000000000002000000000000000000000000000000000000600000000000000000000000003d665fb91a05a4c30e7e5da7d4eb00bda6b3a5f9b69ffc766b80912c4438db1900000000000000000000000000000000000000200000000000000000000000004275747465724167673a207377617020726563656976656420746f6f206c6f774275747465724167673a207a65726f20696e70757400000000000000000000004275747465724167673a20656d7074792073776170206461746100000000000000000000000000000000000000000000000000640000008000000000000000005265656e7472616e637947756172643a207265656e7472616e742063616c6c0000000000000000000000000000000000000000200000008000000000000000004f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206e6577206f776e6572000000000000000000000000000000000000000000000000000000000000000000000000000000000000840000008000000000000000004f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572000000000000000000000000000000000000000000000000ffffffffffffffc05361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65641806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b836f742073756363656564000000000000000000000000000000000000000000005361666545524332303a204552433230206f7065726174696f6e20646964206e416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006563697069656e74206d61792068617665207265766572746564000000000000416464726573733a20756e61626c6520746f2073656e642076616c75652c2072416464726573733a20696e73756666696369656e742062616c616e6365000000a9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b6653dc000000000000000000000000a614f803b6fd780986a42c78ec9c7f77e6ded13c000000000000000000000000000000000000000000000000ffffffffffffff800200000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012421c820c02aab1452f8452fbd0afff730d83eea052ecb5526b529329b9d129
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000df3f1ee5baf55055980887aad79f6fe6e3302d93
-----Decoded View---------------
Arg [0] : _owner (address): 0xdf3f1Ee5BAF55055980887AaD79F6fE6e3302D93
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000df3f1ee5baf55055980887aad79f6fe6e3302d93
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.