More Info
Private Name Tags
ContractCreator:
Sponsored
Latest 25 from a total of 290 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Redeem Nest To W... | 49655331 | 142 days ago | IN | 0 MATIC | 1.83155634 | ||||
Redeem Nest To W... | 49655251 | 142 days ago | IN | 0 MATIC | 2.03552489 | ||||
Redeem Nest To W... | 49655199 | 142 days ago | IN | 0 MATIC | 1.7801588 | ||||
Redeem Nest To W... | 47102578 | 206 days ago | IN | 0 MATIC | 0.38818916 | ||||
Redeem Nest To W... | 47102457 | 206 days ago | IN | 0 MATIC | 0.41241866 | ||||
Redeem Nest To W... | 47099171 | 207 days ago | IN | 0 MATIC | 0.00579532 | ||||
Redeem Nest To W... | 47098713 | 207 days ago | IN | 0 MATIC | 0.00600109 | ||||
Redeem Nest To W... | 47098138 | 207 days ago | IN | 0 MATIC | 0.91607074 | ||||
Redeem Nest To W... | 47032313 | 208 days ago | IN | 0 MATIC | 0.74868356 | ||||
Redeem Nest To W... | 46540462 | 221 days ago | IN | 0 MATIC | 0.71170384 | ||||
Redeem Nest To W... | 46540446 | 221 days ago | IN | 0 MATIC | 0.30124237 | ||||
Redeem Nest To W... | 46540420 | 221 days ago | IN | 0 MATIC | 0.86014036 | ||||
Redeem Nest To W... | 46540386 | 221 days ago | IN | 0 MATIC | 0.4111329 | ||||
Redeem Nest To W... | 45284421 | 252 days ago | IN | 0 MATIC | 1.36325591 | ||||
Redeem Nest To W... | 45024170 | 259 days ago | IN | 0 MATIC | 0.03043038 | ||||
Redeem Nest To W... | 45024113 | 259 days ago | IN | 0 MATIC | 0.08384614 | ||||
Redeem Nest To W... | 43220746 | 305 days ago | IN | 0 MATIC | 0.39760548 | ||||
Redeem Nest To W... | 43220459 | 305 days ago | IN | 0 MATIC | 0.45548603 | ||||
Redeem Nest To W... | 42427569 | 325 days ago | IN | 0 MATIC | 1.48493466 | ||||
Redeem Nest To W... | 40538942 | 374 days ago | IN | 0 MATIC | 0.65345197 | ||||
Redeem Nest To W... | 40179643 | 384 days ago | IN | 0 MATIC | 0.13531953 | ||||
Redeem Nest To W... | 39522352 | 401 days ago | IN | 0 MATIC | 0.48767303 | ||||
Redeem Nest To W... | 39522182 | 401 days ago | IN | 0 MATIC | 1.12782942 | ||||
Redeem Nest To W... | 39508561 | 402 days ago | IN | 0 MATIC | 1.46403015 | ||||
Redeem Nest To W... | 39508430 | 402 days ago | IN | 0 MATIC | 1.51978616 |
Loading...
Loading
Contract Name:
NestRedeem
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-04-12 */ // File: OpenZeppelin/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; } } // File: OpenZeppelin/Ownable.sol pragma solidity ^0.8.0; /** * @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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing 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); } } // File: OpenZeppelin/Address.sol pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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://diligence.consensys.net/posts/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.5.11/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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: Interfaces/IERC20.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount ) external returns (bool); /** * @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); } // File: OpenZeppelin/SafeERC20.sol pragma solidity ^0.8.0; /** * @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; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } 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)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } 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"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @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"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: Interfaces/IPie.sol pragma solidity 0.8.1; interface IPie is IERC20 { function joinPool(uint256 _amount) external; function exitPool(uint256 _amount) external; function calcTokensForAmount(uint256 _amount) external view returns(address[] memory tokens, uint256[] memory amounts); } // File: Interfaces/ILendingRegistry.sol pragma solidity 0.8.1; interface ILendingRegistry { // Maps wrapped token to protocol function wrappedToProtocol(address _wrapped) external view returns(bytes32); // Maps wrapped token to underlying function wrappedToUnderlying(address _wrapped) external view returns(address); function underlyingToProtocolWrapped(address _underlying, bytes32 protocol) external view returns (address); function protocolToLogic(bytes32 _protocol) external view returns (address); /** @notice Set which protocl a wrapped token belongs to @param _wrapped Address of the wrapped token @param _protocol Bytes32 key of the protocol */ function setWrappedToProtocol(address _wrapped, bytes32 _protocol) external; /** @notice Set what is the underlying for a wrapped token @param _wrapped Address of the wrapped token @param _underlying Address of the underlying token */ function setWrappedToUnderlying(address _wrapped, address _underlying) external; /** @notice Set the logic contract for the protocol @param _protocol Bytes32 key of the procol @param _logic Address of the lending logic contract for that protocol */ function setProtocolToLogic(bytes32 _protocol, address _logic) external; /** @notice Set the wrapped token for the underlying deposited in this protocol @param _underlying Address of the unerlying token @param _protocol Bytes32 key of the protocol @param _wrapped Address of the wrapped token */ function setUnderlyingToProtocolWrapped(address _underlying, bytes32 _protocol, address _wrapped) external; /** @notice Get tx data to lend the underlying amount in a specific protocol @param _underlying Address of the underlying token @param _amount Amount to lend @param _protocol Bytes32 key of the protocol @return targets Addresses of the contracts to call @return data Calldata for the calls */ function getLendTXData(address _underlying, uint256 _amount, bytes32 _protocol) external view returns(address[] memory targets, bytes[] memory data); /** @notice Get the tx data to unlend the wrapped amount @param _wrapped Address of the wrapped token @param _amount Amount of wrapped token to unlend @return targets Addresses of the contracts to call @return data Calldata for the calls */ function getUnlendTXData(address _wrapped, uint256 _amount, address _tokenHolder) external view returns(address[] memory targets, bytes[] memory data); } // File: Interfaces/ILendingLogic.sol pragma solidity ^0.8.1; interface ILendingLogic { /** @notice Get the APR based on underlying token. @param _token Address of the underlying token @return Interest with 18 decimals */ function getAPRFromUnderlying(address _token) external view returns(uint256); /** @notice Get the APR based on wrapped token. @param _token Address of the wrapped token @return Interest with 18 decimals */ function getAPRFromWrapped(address _token) external view returns(uint256); /** @notice Get the calls needed to lend. @param _underlying Address of the underlying token @param _amount Amount of the underlying token @return targets Addresses of the contracts to call @return data Calldata of the calls */ function lend(address _underlying, uint256 _amount, address _tokenHolder) external view returns(address[] memory targets, bytes[] memory data); /** @notice Get the calls needed to unlend @param _wrapped Address of the wrapped token @param _amount Amount of the underlying tokens @return targets Addresses of the contracts to call @return data Calldata of the calls */ function unlend(address _wrapped, uint256 _amount, address _tokenHolder) external view returns(address[] memory targets, bytes[] memory data); /** @notice Get the underlying wrapped exchange rate @param _wrapped Address of the wrapped token @return The exchange rate */ function exchangeRate(address _wrapped) external returns(uint256); /** @notice Get the underlying wrapped exchange rate in a view (non state changing) way @param _wrapped Address of the wrapped token @return The exchange rate */ function exchangeRateView(address _wrapped) external view returns(uint256); } // File: Interfaces/IUniRouter.sol pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniRouter is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File: Interfaces/IUniV3Router.sol pragma solidity ^0.8.1; interface uniV3Router { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } struct ExactOutputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; uint160 sqrtPriceLimitX96; } struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } struct ExactOutputParams { bytes path; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; } function exactInputSingle(ExactInputSingleParams memory params) external returns (uint256 amountOut); function exactOutputSingle(ExactOutputSingleParams calldata params) external; function exactOutput(ExactOutputParams memory params) external returns (uint256 amountIn); } interface uniOracle { function quoteExactOutputSingle( address tokenIn, address tokenOut, uint24 fee, uint256 amountOut, uint160 sqrtPriceLimitX96 ) external returns (uint256 amountIn); function quoteExactInputSingle( address tokenIn, address tokenOut, uint24 fee, uint256 amountIn, uint160 sqrtPriceLimitX96 ) external returns (uint256 amountOut); } // File: Interfaces/IRecipe.sol pragma solidity 0.8.1; interface IRecipe { function bake( address _inputToken, address _outputToken, uint256 _maxInput, bytes memory _data ) external returns (uint256 inputAmountUsed, uint256 outputAmount); } // File: Interfaces/IBalancer.sol pragma solidity ^0.8.1; interface IBalancer{ enum SwapKind { GIVEN_IN, GIVEN_OUT } struct BatchSwapStep { bytes32 poolId; uint256 assetInIndex; uint256 assetOutIndex; uint256 amount; bytes userData; } //Balancer params struct SingleSwap { bytes32 poolId; SwapKind kind; address assetIn; address assetOut; uint256 amount; bytes userData; } struct FundManagement { address sender; bool fromInternalBalance; address payable recipient; bool toInternalBalance; } function swap( SingleSwap memory singleSwap, FundManagement memory funds, uint256 limit, uint256 deadline ) external payable returns (uint256); function queryBatchSwap( SwapKind kind, BatchSwapStep[] memory swaps, address[] memory assets, FundManagement memory funds ) external returns (int256[] memory assetDeltas); } // File: wETHRedeemer.sol pragma solidity 0.8.1; contract NestRedeem is Ownable { using SafeERC20 for IERC20; //Failing to query a price is expensive, //so we save info about the DEX state to prevent querying the price if it is not viable mapping(address => bytes32) balancerViable; mapping(address => uint16) uniFee; // Adds a custom hop before reaching the destination token mapping(address => address) public customHops; struct BestPrice{ uint price; uint ammIndex; } IBalancer balancer = IBalancer(0xBA12222222228d8Ba445958a75a0704d566BF2C8); uniOracle oracle = uniOracle(0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6); uniV3Router uniRouter = uniV3Router(0xE592427A0AEce92De3Edee1F18E0157C05861564); IUniRouter sushiRouter = IUniRouter(0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506); IUniRouter quickRouter = IUniRouter(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff); IERC20 immutable WETH; ILendingRegistry immutable lendingRegistry; constructor(address _weth, address _lendingRegistry) { WETH = IERC20(_weth); lendingRegistry = ILendingRegistry(_lendingRegistry); } function redeemNestToWeth(address _nestAddress, uint256 _nestAmount) external { require(_nestAmount >= 1e2, "Min nest amount: 0.01"); IPie pie = IPie(_nestAddress); require(pie.balanceOf(msg.sender) >= _nestAmount, "Insufficient nest balance"); // Transfer nest tokens to redeem contract pie.transferFrom(msg.sender, address(this), _nestAmount); uint256 pieBalance = pie.balanceOf(address(this)); // Get tokens inside the index, as well as the amounts received. (address[] memory tokens,) = pie.calcTokensForAmount(pieBalance); // Dissolve index for the individual tokens pie.exitPool(pieBalance); // Exchange underlying tokens for WETH for(uint256 i = 0; i < tokens.length; i++) { tokensToWeth(tokens[i],IERC20(tokens[i]).balanceOf(address(this))); } // Transfer redeemed WETH to msg.sender WETH.transfer(msg.sender, WETH.balanceOf(address(this))); } function tokensToWeth(address _token, uint256 _amount) internal { // If they are lending tokens, unlend them address underlying = lendingRegistry.wrappedToUnderlying(_token); if (underlying != address(0)) { // calc amount according to exchange rate ILendingLogic lendingLogic = getLendingLogicFromWrapped(_token); uint256 exchangeRate = lendingLogic.exchangeRate(_token); // wrapped to underlying exchangeRate uint256 underlyingAmount = _amount * exchangeRate / 1e18; // Unlend token (address[] memory _targets, bytes[] memory _data) = lendingRegistry.getUnlendTXData(_token, _amount, address(this)); for(uint256 j = 0; j < _targets.length; j++) { _targets[j].call(_data[j]); } _amount = underlyingAmount; _token = underlying; } // If underlying token is wETH, no need to swap if (_token == address(WETH)) return; address customHopToken = customHops[_token]; //If we customHop token is set, we first swap from token -> hopToken -> WETH if(customHopToken != address(0)) { BestPrice memory hopOutPrice = getBestPrice(_token, customHopToken, _amount); BestPrice memory wethOutPrice = getBestPrice(customHopToken, address(WETH), hopOutPrice.price); //Swap weth for hopToken dexSwap(_token, customHopToken, _amount, hopOutPrice.ammIndex); //Swap hopToken for outputToken dexSwap(customHopToken, address(WETH), hopOutPrice.price, wethOutPrice.ammIndex); } // else normal swap else{ BestPrice memory bestPrice = getBestPrice(_token, address(WETH), _amount); dexSwap(_token, address(WETH), _amount, bestPrice.ammIndex); } } function getBestPrice(address _assetIn, address _assetOut, uint _amountIn) public returns (BestPrice memory){ uint uniAmount; uint sushiAmount; uint quickAmount; uint balancerAmount; BestPrice memory bestPrice; //GET UNI PRICE uint uniIndex; (uniAmount,uniIndex) = getPriceUniV3(_assetIn,_assetOut,_amountIn,uniFee[_assetOut]); bestPrice.price = uniAmount; bestPrice.ammIndex = uniIndex; //GET SUSHI PRICE try sushiRouter.getAmountsOut(_amountIn, getRoute(_assetIn, _assetOut)) returns(uint256[] memory amounts) { sushiAmount = amounts[1]; } catch { sushiAmount = 0; } if(bestPrice.price<sushiAmount){ bestPrice.price = sushiAmount; bestPrice.ammIndex = 2; } //GET QUICKSWAP PRICE try quickRouter.getAmountsOut(_amountIn, getRoute(_assetIn, _assetOut)) returns(uint256[] memory amounts) { quickAmount = amounts[1]; } catch { quickAmount = 0; } if(bestPrice.price<quickAmount){ bestPrice.price = quickAmount; bestPrice.ammIndex = 3; } //GET BALANCER PRICE if(balancerViable[_assetIn]!= ""){ balancerAmount = getPriceBalancer(_assetIn,_assetOut,_amountIn); if(bestPrice.price<balancerAmount){ bestPrice.price = balancerAmount; bestPrice.ammIndex = 4; } } require(bestPrice.price > 0); return bestPrice; } function dexSwap(address _assetIn, address _assetOut, uint _amountIn, uint _ammIndex) public { //Uni1 if(_ammIndex == 0){ uniV3Router.ExactInputSingleParams memory params = uniV3Router.ExactInputSingleParams( _assetIn, _assetOut, 500, address(this), block.timestamp + 1, _amountIn, 0, 0 ); IERC20(_assetIn).approve(address(uniRouter), 0); IERC20(_assetIn).approve(address(uniRouter), type(uint256).max); uniRouter.exactInputSingle(params); return; } //Uni2 if(_ammIndex == 1){ uniV3Router.ExactInputSingleParams memory params = uniV3Router.ExactInputSingleParams( _assetIn, _assetOut, 3000, address(this), block.timestamp + 1, _amountIn, 0, 0 ); IERC20(_assetIn).approve(address(uniRouter), 0); IERC20(_assetIn).approve(address(uniRouter), type(uint256).max); uniRouter.exactInputSingle(params); return; } //Sushi if(_ammIndex == 2){ IERC20(_assetIn).approve(address(sushiRouter), 0); IERC20(_assetIn).approve(address(sushiRouter), type(uint256).max); sushiRouter.swapExactTokensForTokens(_amountIn,0,getRoute(_assetIn, _assetOut),address(this),block.timestamp + 1); return; } //Quickswap if(_ammIndex == 3){ IERC20(_assetIn).approve(address(quickRouter), 0); IERC20(_assetIn).approve(address(quickRouter), type(uint256).max); quickRouter.swapExactTokensForTokens(_amountIn,0,getRoute(_assetIn, _assetOut),address(this),block.timestamp + 1); return; } //Balancer IBalancer.SwapKind kind = IBalancer.SwapKind.GIVEN_IN; IBalancer.SingleSwap memory singleSwap = IBalancer.SingleSwap( balancerViable[_assetIn], kind, _assetIn, _assetOut, _amountIn, "" ); IBalancer.FundManagement memory funds = IBalancer.FundManagement( address(this), false, payable(address(this)), false ); IERC20(_assetIn).approve(address(balancer), 0); IERC20(_assetIn).approve(address(balancer), type(uint256).max); balancer.swap( singleSwap, funds, 0, block.timestamp + 1 ); } function getPriceUniV3(address _assetIn, address _assetOut, uint _amountIn, uint16 _uniFee) internal returns(uint uniAmount, uint index){ //Uni provides pools with different fees. The most popular being 0.05% and 0.3% //Unfortunately they have to be specified if(_uniFee == 500){ try oracle.quoteExactInputSingle(_assetIn,_assetOut,500,_amountIn,0) returns(uint256 returnAmount) { uniAmount = returnAmount; } catch { uniAmount = 0; } //index = 0; no need to set 0, as it is the default value } else if(_uniFee == 3000){ try oracle.quoteExactInputSingle(_assetIn,_assetOut,3000,_amountIn,0) returns(uint256 returnAmount) { uniAmount = returnAmount; } catch { uniAmount = 0; } index = 1; } else{ try oracle.quoteExactInputSingle(_assetIn,_assetOut,500,_amountIn,0) returns(uint256 returnAmount) { uniAmount = returnAmount; } catch { uniAmount = 0; } //index = 0 try oracle.quoteExactInputSingle(_assetIn,_assetOut,3000,_amountIn,0) returns(uint256 returnAmount) { if(uniAmount>returnAmount){ index = 1; uniAmount = returnAmount; } } catch { //uniAmount is either already 0 or higher } } } function getPriceBalancer(address _assetIn, address _assetOut, uint _amountIn) internal returns(uint balancerAmount){ //Get Balancer price IBalancer.SwapKind kind = IBalancer.SwapKind.GIVEN_IN; address[] memory assets = new address[](2); assets[0] = _assetIn; assets[1] = _assetOut; IBalancer.BatchSwapStep[] memory swapStep = new IBalancer.BatchSwapStep[](1); swapStep[0] = IBalancer.BatchSwapStep(balancerViable[_assetIn], 0, 1, _amountIn, ""); IBalancer.FundManagement memory funds = IBalancer.FundManagement(payable(msg.sender),false,payable(msg.sender),false); try balancer.queryBatchSwap(kind,swapStep,assets,funds) returns(int[] memory amounts) { balancerAmount = uint(amounts[1]); } catch { balancerAmount = 0; } } function getLendingLogicFromWrapped(address _wrapped) internal view returns(ILendingLogic) { return ILendingLogic( lendingRegistry.protocolToLogic( lendingRegistry.wrappedToProtocol( _wrapped ) ) ); } function getRoute(address _inputToken, address _outputToken) internal pure returns(address[] memory route) { route = new address[](2); route[0] = _inputToken; route[1] = _outputToken; return route; } function setCustomHop(address _token, address _hop) external onlyOwner { customHops[_token] = _hop; } function setUniPoolMapping(address _outputAsset, uint16 _Fee) external onlyOwner { uniFee[_outputAsset] = _Fee; } function setBalancerPoolMapping(address _inputAsset, bytes32 _pool) external onlyOwner { balancerViable[_inputAsset] = _pool; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_lendingRegistry","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":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"customHops","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_assetIn","type":"address"},{"internalType":"address","name":"_assetOut","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_ammIndex","type":"uint256"}],"name":"dexSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_assetIn","type":"address"},{"internalType":"address","name":"_assetOut","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"getBestPrice","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"ammIndex","type":"uint256"}],"internalType":"struct NestRedeem.BestPrice","name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nestAddress","type":"address"},{"internalType":"uint256","name":"_nestAmount","type":"uint256"}],"name":"redeemNestToWeth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_inputAsset","type":"address"},{"internalType":"bytes32","name":"_pool","type":"bytes32"}],"name":"setBalancerPoolMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_hop","type":"address"}],"name":"setCustomHop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outputAsset","type":"address"},{"internalType":"uint16","name":"_Fee","type":"uint16"}],"name":"setUniPoolMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c060405273ba12222222228d8ba445958a75a0704d566bf2c8600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b27308f9f90d607463bb33ea1bebb41c27ce5ab6600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e592427a0aece92de3edee1f18e0157c05861564600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731b02da8cb0d097eb8d57a175b88c7d8b47997506600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a5e0829caced8ffdd4de3c43696c57f7d7a678ff600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001ba57600080fd5b50604051620048fb380380620048fb8339818101604052810190620001e0919062000359565b62000200620001f46200027660201b60201c565b6200027e60201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250505050620003e8565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000815190506200035381620003ce565b92915050565b600080604083850312156200036d57600080fd5b60006200037d8582860162000342565b9250506020620003908582860162000342565b9150509250929050565b6000620003a782620003ae565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620003d9816200039a565b8114620003e557600080fd5b50565b60805160601c60a05160601c6144a86200045360003960008181611da501528181611f4601528181612c760152612cb201526000818161080e0152818161084b01528181612112015281816122190152818161225a0152818161229701526122c401526144a86000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063c1a5c7f111610066578063c1a5c7f11461011f578063d6d2aedb1461014f578063f2fde38b1461017f578063f4dbeeaf1461019b578063febf0e25146101b75761009e565b8063168a1a60146100a35780634ec8f6ae146100bf57806365fbf798146100db578063715018a6146100f75780638da5cb5b14610101575b600080fd5b6100bd60048036038101906100b89190613302565b6101d3565b005b6100d960048036038101906100d491906131d8565b6102ad565b005b6100f560048036038101906100f0919061333e565b6103ab565b005b6100ff610969565b005b6101096109f1565b6040516101169190613a70565b60405180910390f35b61013960048036038101906101349190613186565b610a1a565b6040516101469190613a70565b60405180910390f35b61016960048036038101906101649190613214565b610a4d565b6040516101769190613cdf565b60405180910390f35b61019960048036038101906101949190613186565b610dc4565b005b6101b560048036038101906101b09190613263565b610ebc565b005b6101d160048036038101906101cc91906132c6565b611cd5565b005b6101db611d99565b73ffffffffffffffffffffffffffffffffffffffff166101f96109f1565b73ffffffffffffffffffffffffffffffffffffffff161461024f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024690613c7f565b60405180910390fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055505050565b6102b5611d99565b73ffffffffffffffffffffffffffffffffffffffff166102d36109f1565b73ffffffffffffffffffffffffffffffffffffffff1614610329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032090613c7f565b60405180910390fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60648110156103ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e690613cbf565b60405180910390fd5b6000829050818173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161042e9190613a70565b60206040518083038186803b15801561044657600080fd5b505afa15801561045a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047e9190613526565b10156104bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b690613c9f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016104fc93929190613b31565b602060405180830381600087803b15801561051657600080fd5b505af115801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e91906134d4565b5060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161058a9190613a70565b60206040518083038186803b1580156105a257600080fd5b505afa1580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190613526565b905060008273ffffffffffffffffffffffffffffffffffffffff1663371babdc836040518263ffffffff1660e01b81526004016106179190613d62565b60006040518083038186803b15801561062f57600080fd5b505afa158015610643573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061066c91906133e6565b5090508273ffffffffffffffffffffffffffffffffffffffff1663be1d24ad836040518263ffffffff1660e01b81526004016106a89190613d62565b600060405180830381600087803b1580156106c257600080fd5b505af11580156106d6573d6000803e3d6000fd5b5050505060005b815181101561080b576107f8828281518110610722577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151838381518110610763577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107a39190613a70565b60206040518083038186803b1580156107bb57600080fd5b505afa1580156107cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f39190613526565b611da1565b8080610803906141f4565b9150506106dd565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108a29190613a70565b60206040518083038186803b1580156108ba57600080fd5b505afa1580156108ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f29190613526565b6040518363ffffffff1660e01b815260040161090f929190613b91565b602060405180830381600087803b15801561092957600080fd5b505af115801561093d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096191906134d4565b505050505050565b610971611d99565b73ffffffffffffffffffffffffffffffffffffffff1661098f6109f1565b73ffffffffffffffffffffffffffffffffffffffff16146109e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109dc90613c7f565b60405180910390fd5b6109ef60006122f7565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a55612dcc565b600080600080610a63612dcc565b6000610abe8a8a8a600260008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff166123bb565b80925081975050508582600001818152505080826020018181525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f89610b238d8d612708565b6040518363ffffffff1660e01b8152600401610b40929190613d7d565b60006040518083038186803b158015610b5857600080fd5b505afa925050508015610b8e57506040513d6000823e3d601f19601f82011682018060405250810190610b8b9190613493565b60015b610b9b5760009450610be1565b80600181518110610bd5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519550505b8482600001511015610c03578482600001818152505060028260200181815250505b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f89610c4c8d8d612708565b6040518363ffffffff1660e01b8152600401610c69929190613d7d565b60006040518083038186803b158015610c8157600080fd5b505afa925050508015610cb757506040513d6000823e3d601f19601f82011682018060405250810190610cb49190613493565b60015b610cc45760009350610d0a565b80600181518110610cfe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519450505b8382600001511015610d2c578382600001818152505060038260200181815250505b6000600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610da357610d7e8a8a8a61286c565b92508282600001511015610da2578282600001818152505060048260200181815250505b5b6000826000015111610db457600080fd5b8196505050505050509392505050565b610dcc611d99565b73ffffffffffffffffffffffffffffffffffffffff16610dea6109f1565b73ffffffffffffffffffffffffffffffffffffffff1614610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3790613c7f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea790613c5f565b60405180910390fd5b610eb9816122f7565b50565b60008114156111a55760006040518061010001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020016101f462ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff168152602001600142610f419190613fb7565b815260200184815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090508473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518363ffffffff1660e01b8152600401610fce929190613b68565b602060405180830381600087803b158015610fe857600080fd5b505af1158015610ffc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102091906134d4565b508473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161109e929190613b91565b602060405180830381600087803b1580156110b857600080fd5b505af11580156110cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f091906134d4565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663414bf389826040518263ffffffff1660e01b815260040161114c9190613cfa565b602060405180830381600087803b15801561116657600080fd5b505af115801561117a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119e9190613526565b5050611ccf565b600181141561148e5760006040518061010001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001610bb862ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200160014261122a9190613fb7565b815260200184815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090508473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518363ffffffff1660e01b81526004016112b7929190613b68565b602060405180830381600087803b1580156112d157600080fd5b505af11580156112e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130991906134d4565b508473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611387929190613b91565b602060405180830381600087803b1580156113a157600080fd5b505af11580156113b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d991906134d4565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663414bf389826040518263ffffffff1660e01b81526004016114359190613cfa565b602060405180830381600087803b15801561144f57600080fd5b505af1158015611463573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114879190613526565b5050611ccf565b60028114156116ee578373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518363ffffffff1660e01b81526004016114f5929190613b68565b602060405180830381600087803b15801561150f57600080fd5b505af1158015611523573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154791906134d4565b508373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016115c5929190613b91565b602060405180830381600087803b1580156115df57600080fd5b505af11580156115f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161791906134d4565b50600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed17398360006116638888612708565b306001426116719190613fb7565b6040518663ffffffff1660e01b8152600401611691959493929190613dad565b600060405180830381600087803b1580156116ab57600080fd5b505af11580156116bf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116e89190613493565b50611ccf565b600381141561194e578373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518363ffffffff1660e01b8152600401611755929190613b68565b602060405180830381600087803b15801561176f57600080fd5b505af1158015611783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a791906134d4565b508373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611825929190613b91565b602060405180830381600087803b15801561183f57600080fd5b505af1158015611853573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187791906134d4565b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed17398360006118c38888612708565b306001426118d19190613fb7565b6040518663ffffffff1660e01b81526004016118f1959493929190613dad565b600060405180830381600087803b15801561190b57600080fd5b505af115801561191f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119489190613493565b50611ccf565b6000806040518060c00160405280600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018360018111156119da577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001604051806020016040528060008152508152509050600060405180608001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581526020013073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090508673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518363ffffffff1660e01b8152600401611ae7929190613b68565b602060405180830381600087803b158015611b0157600080fd5b505af1158015611b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3991906134d4565b508673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611bb7929190613b91565b602060405180830381600087803b158015611bd157600080fd5b505af1158015611be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0991906134d4565b50600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166352bbbe2983836000600142611c599190613fb7565b6040518563ffffffff1660e01b8152600401611c789493929190613d16565b602060405180830381600087803b158015611c9257600080fd5b505af1158015611ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cca9190613526565b505050505b50505050565b611cdd611d99565b73ffffffffffffffffffffffffffffffffffffffff16611cfb6109f1565b73ffffffffffffffffffffffffffffffffffffffff1614611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890613c7f565b60405180910390fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600033905090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166355579d32846040518263ffffffff1660e01b8152600401611dfc9190613a70565b60206040518083038186803b158015611e1457600080fd5b505afa158015611e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4c91906131af565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612110576000611e8d84612c72565b905060008173ffffffffffffffffffffffffffffffffffffffff1663dc3b7c8b866040518263ffffffff1660e01b8152600401611eca9190613a70565b602060405180830381600087803b158015611ee457600080fd5b505af1158015611ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1c9190613526565b90506000670de0b6b3a76400008286611f35919061403e565b611f3f919061400d565b90506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166358d28ef78989306040518463ffffffff1660e01b8152600401611fa193929190613bba565b60006040518083038186803b158015611fb957600080fd5b505afa158015611fcd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ff6919061337a565b9150915060005b82518110156121035782818151811061203f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16828281518110612096577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040516120ab9190613a59565b6000604051808303816000865af19150503d80600081146120e8576040519150601f19603f3d011682016040523d82523d6000602084013e6120ed565b606091505b50505080806120fb906141f4565b915050611ffd565b5082965085975050505050505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561216a57506122f3565b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461228f57600061220f858386610a4d565b90506000612242837f00000000000000000000000000000000000000000000000000000000000000008460000151610a4d565b90506122548684878560200151610ebc565b612288837f000000000000000000000000000000000000000000000000000000000000000084600001518460200151610ebc565b50506122f0565b60006122bc857f000000000000000000000000000000000000000000000000000000000000000086610a4d565b90506122ee857f0000000000000000000000000000000000000000000000000000000000000000868460200151610ebc565b505b50505b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806101f48361ffff16141561249457600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7729d4387876101f48860006040518663ffffffff1660e01b8152600401612432959493929190613ade565b602060405180830381600087803b15801561244c57600080fd5b505af192505050801561247d57506040513d601f19601f8201168201806040525081019061247a9190613526565b60015b61248a576000915061248f565b809250505b6126ff565b610bb88361ffff16141561256e57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7729d438787610bb88860006040518663ffffffff1660e01b8152600401612508959493929190613a8b565b602060405180830381600087803b15801561252257600080fd5b505af192505050801561255357506040513d601f19601f820116820180604052508101906125509190613526565b60015b6125605760009150612565565b809250505b600190506126fe565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7729d4387876101f48860006040518663ffffffff1660e01b81526004016125d4959493929190613ade565b602060405180830381600087803b1580156125ee57600080fd5b505af192505050801561261f57506040513d601f19601f8201168201806040525081019061261c9190613526565b60015b61262c5760009150612631565b809250505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7729d438787610bb88860006040518663ffffffff1660e01b8152600401612697959493929190613a8b565b602060405180830381600087803b1580156126b157600080fd5b505af19250505080156126e257506040513d601f19601f820116820180604052508101906126df9190613526565b60015b6126eb576126fd565b808311156126fb57600191508092505b505b5b5b94509492505050565b6060600267ffffffffffffffff81111561274b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156127795781602001602082028036833780820191505090505b50905082816000815181106127b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050818160018151811061282c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505092915050565b600080600090506000600267ffffffffffffffff8111156128b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156128e45781602001602082028036833780820191505090505b5090508581600081518110612922577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508481600181518110612997577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600167ffffffffffffffff811115612a14577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612a4d57816020015b612a3a612de6565b815260200190600190039081612a325790505b5090506040518060a00160405280600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815260200160008152602001600181526020018681526020016040518060200160405280600081525081525081600081518110612b01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250600060405180608001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020016000151581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152509050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f84d066e858486856040518563ffffffff1660e01b8152600401612bc49493929190613c0c565b600060405180830381600087803b158015612bde57600080fd5b505af1925050508015612c1457506040513d6000823e3d601f19601f82011682018060405250810190612c119190613452565b60015b612c215760009450612c67565b80600181518110612c5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519550505b505050509392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f8b7f4227f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b7db91fc856040518263ffffffff1660e01b8152600401612d099190613a70565b60206040518083038186803b158015612d2157600080fd5b505afa158015612d35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5991906134fd565b6040518263ffffffff1660e01b8152600401612d759190613bf1565b60206040518083038186803b158015612d8d57600080fd5b505afa158015612da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc591906131af565b9050919050565b604051806040016040528060008152602001600081525090565b6040518060a0016040528060008019168152602001600081526020016000815260200160008152602001606081525090565b6000612e2b612e2684613e2c565b613e07565b90508083825260208201905082856020860282011115612e4a57600080fd5b60005b85811015612e7a5781612e60888261300c565b845260208401935060208301925050600181019050612e4d565b5050509392505050565b6000612e97612e9284613e58565b613e07565b9050808382526020820190508260005b85811015612ed75781518501612ebd8882613108565b845260208401935060208301925050600181019050612ea7565b5050509392505050565b6000612ef4612eef84613e84565b613e07565b90508083825260208201905082856020860282011115612f1357600080fd5b60005b85811015612f435781612f298882613132565b845260208401935060208301925050600181019050612f16565b5050509392505050565b6000612f60612f5b84613eb0565b613e07565b90508083825260208201905082856020860282011115612f7f57600080fd5b60005b85811015612faf5781612f958882613171565b845260208401935060208301925050600181019050612f82565b5050509392505050565b6000612fcc612fc784613edc565b613e07565b905082815260208101848484011115612fe457600080fd5b612fef848285614190565b509392505050565b600081359050613006816143e8565b92915050565b60008151905061301b816143e8565b92915050565b600082601f83011261303257600080fd5b8151613042848260208601612e18565b91505092915050565b600082601f83011261305c57600080fd5b815161306c848260208601612e84565b91505092915050565b600082601f83011261308657600080fd5b8151613096848260208601612ee1565b91505092915050565b600082601f8301126130b057600080fd5b81516130c0848260208601612f4d565b91505092915050565b6000815190506130d8816143ff565b92915050565b6000813590506130ed81614416565b92915050565b60008151905061310281614416565b92915050565b600082601f83011261311957600080fd5b8151613129848260208601612fb9565b91505092915050565b6000815190506131418161442d565b92915050565b60008135905061315681614444565b92915050565b60008135905061316b8161445b565b92915050565b6000815190506131808161445b565b92915050565b60006020828403121561319857600080fd5b60006131a684828501612ff7565b91505092915050565b6000602082840312156131c157600080fd5b60006131cf8482850161300c565b91505092915050565b600080604083850312156131eb57600080fd5b60006131f985828601612ff7565b925050602061320a85828601612ff7565b9150509250929050565b60008060006060848603121561322957600080fd5b600061323786828701612ff7565b935050602061324886828701612ff7565b92505060406132598682870161315c565b9150509250925092565b6000806000806080858703121561327957600080fd5b600061328787828801612ff7565b945050602061329887828801612ff7565b93505060406132a98782880161315c565b92505060606132ba8782880161315c565b91505092959194509250565b600080604083850312156132d957600080fd5b60006132e785828601612ff7565b92505060206132f8858286016130de565b9150509250929050565b6000806040838503121561331557600080fd5b600061332385828601612ff7565b925050602061333485828601613147565b9150509250929050565b6000806040838503121561335157600080fd5b600061335f85828601612ff7565b92505060206133708582860161315c565b9150509250929050565b6000806040838503121561338d57600080fd5b600083015167ffffffffffffffff8111156133a757600080fd5b6133b385828601613021565b925050602083015167ffffffffffffffff8111156133d057600080fd5b6133dc8582860161304b565b9150509250929050565b600080604083850312156133f957600080fd5b600083015167ffffffffffffffff81111561341357600080fd5b61341f85828601613021565b925050602083015167ffffffffffffffff81111561343c57600080fd5b6134488582860161309f565b9150509250929050565b60006020828403121561346457600080fd5b600082015167ffffffffffffffff81111561347e57600080fd5b61348a84828501613075565b91505092915050565b6000602082840312156134a557600080fd5b600082015167ffffffffffffffff8111156134bf57600080fd5b6134cb8482850161309f565b91505092915050565b6000602082840312156134e657600080fd5b60006134f4848285016130c9565b91505092915050565b60006020828403121561350f57600080fd5b600061351d848285016130f3565b91505092915050565b60006020828403121561353857600080fd5b600061354684828501613171565b91505092915050565b600061355b838361358a565b60208301905092915050565b600061357383836137f8565b905092915050565b613584816140aa565b82525050565b61359381614098565b82525050565b6135a281614098565b82525050565b60006135b382613f2d565b6135bd8185613f68565b93506135c883613f0d565b8060005b838110156135f95781516135e0888261354f565b97506135eb83613f4e565b9250506001810190506135cc565b5085935050505092915050565b600061361182613f38565b61361b8185613f79565b93508360208202850161362d85613f1d565b8060005b85811015613669578484038952815161364a8582613567565b945061365583613f5b565b925060208a01995050600181019050613631565b50829750879550505050505092915050565b613684816140bc565b82525050565b613693816140c8565b82525050565b6136a2816140c8565b82525050565b60006136b382613f43565b6136bd8185613f8a565b93506136cd818560208601614190565b6136d6816142f9565b840191505092915050565b60006136ec82613f43565b6136f68185613f9b565b9350613706818560208601614190565b80840191505092915050565b61371b81614136565b82525050565b61372a81614136565b82525050565b61373981614148565b82525050565b6137488161415a565b82525050565b6137578161416c565b82525050565b6137668161417e565b82525050565b6000613779602683613fa6565b91506137848261430a565b604082019050919050565b600061379c602083613fa6565b91506137a782614359565b602082019050919050565b60006137bf601983613fa6565b91506137ca82614382565b602082019050919050565b60006137e2601583613fa6565b91506137ed826143ab565b602082019050919050565b600060a083016000830151613810600086018261368a565b5060208301516138236020860182613a3b565b5060408301516138366040860182613a3b565b5060608301516138496060860182613a3b565b506080830151848203608086015261386182826136a8565b9150508091505092915050565b6040820160008201516138846000850182613a3b565b5060208201516138976020850182613a3b565b50505050565b610100820160008201516138b4600085018261358a565b5060208201516138c7602085018261358a565b5060408201516138da6040850182613a2c565b5060608201516138ed606085018261358a565b5060808201516139006080850182613a3b565b5060a082015161391360a0850182613a3b565b5060c082015161392660c0850182613a3b565b5060e082015161393960e0850182613a1d565b50505050565b608082016000820151613955600085018261358a565b506020820151613968602085018261367b565b50604082015161397b604085018261357b565b50606082015161398e606085018261367b565b50505050565b600060c0830160008301516139ac600086018261368a565b5060208301516139bf6020860182613712565b5060408301516139d2604086018261358a565b5060608301516139e5606086018261358a565b5060808301516139f86080860182613a3b565b5060a083015184820360a0860152613a1082826136a8565b9150508091505092915050565b613a26816140fd565b82525050565b613a358161411d565b82525050565b613a448161412c565b82525050565b613a538161412c565b82525050565b6000613a6582846136e1565b915081905092915050565b6000602082019050613a856000830184613599565b92915050565b600060a082019050613aa06000830188613599565b613aad6020830187613599565b613aba604083018661374e565b613ac76060830185613a4a565b613ad46080830184613730565b9695505050505050565b600060a082019050613af36000830188613599565b613b006020830187613599565b613b0d604083018661375d565b613b1a6060830185613a4a565b613b276080830184613730565b9695505050505050565b6000606082019050613b466000830186613599565b613b536020830185613599565b613b606040830184613a4a565b949350505050565b6000604082019050613b7d6000830185613599565b613b8a602083018461373f565b9392505050565b6000604082019050613ba66000830185613599565b613bb36020830184613a4a565b9392505050565b6000606082019050613bcf6000830186613599565b613bdc6020830185613a4a565b613be96040830184613599565b949350505050565b6000602082019050613c066000830184613699565b92915050565b600060e082019050613c216000830187613721565b8181036020830152613c338186613606565b90508181036040830152613c4781856135a8565b9050613c56606083018461393f565b95945050505050565b60006020820190508181036000830152613c788161376c565b9050919050565b60006020820190508181036000830152613c988161378f565b9050919050565b60006020820190508181036000830152613cb8816137b2565b9050919050565b60006020820190508181036000830152613cd8816137d5565b9050919050565b6000604082019050613cf4600083018461386e565b92915050565b600061010082019050613d10600083018461389d565b92915050565b600060e0820190508181036000830152613d308187613994565b9050613d3f602083018661393f565b613d4c60a083018561373f565b613d5960c0830184613a4a565b95945050505050565b6000602082019050613d776000830184613a4a565b92915050565b6000604082019050613d926000830185613a4a565b8181036020830152613da481846135a8565b90509392505050565b600060a082019050613dc26000830188613a4a565b613dcf602083018761373f565b8181036040830152613de181866135a8565b9050613df06060830185613599565b613dfd6080830184613a4a565b9695505050505050565b6000613e11613e22565b9050613e1d82826141c3565b919050565b6000604051905090565b600067ffffffffffffffff821115613e4757613e466142ca565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613e7357613e726142ca565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613e9f57613e9e6142ca565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ecb57613eca6142ca565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ef757613ef66142ca565b5b613f00826142f9565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000613fc28261412c565b9150613fcd8361412c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140025761400161423d565b5b828201905092915050565b60006140188261412c565b91506140238361412c565b9250826140335761403261426c565b5b828204905092915050565b60006140498261412c565b91506140548361412c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561408d5761408c61423d565b5b828202905092915050565b60006140a3826140fd565b9050919050565b60006140b5826140fd565b9050919050565b60008115159050919050565b6000819050919050565b60008190506140e0826143d4565b919050565b6000819050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b6000614141826140d2565b9050919050565b6000614153826140fd565b9050919050565b60006141658261412c565b9050919050565b60006141778261411d565b9050919050565b60006141898261411d565b9050919050565b60005b838110156141ae578082015181840152602081019050614193565b838111156141bd576000848401525b50505050565b6141cc826142f9565b810181811067ffffffffffffffff821117156141eb576141ea6142ca565b5b80604052505050565b60006141ff8261412c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142325761423161423d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e73756666696369656e74206e6573742062616c616e636500000000000000600082015250565b7f4d696e206e65737420616d6f756e743a20302e30310000000000000000000000600082015250565b600281106143e5576143e461429b565b5b50565b6143f181614098565b81146143fc57600080fd5b50565b614408816140bc565b811461441357600080fd5b50565b61441f816140c8565b811461442a57600080fd5b50565b614436816140e5565b811461444157600080fd5b50565b61444d816140ef565b811461445857600080fd5b50565b6144648161412c565b811461446f57600080fd5b5056fea26469706673582212207650651c406dbf6e5775d6274324c06d3ce6d5a2d9220bb7d664e9ddd43b5efc64736f6c634300080100330000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f619000000000000000000000000c94bc5c62c53e88d67c3874f5e8f91c6a99656ca
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063c1a5c7f111610066578063c1a5c7f11461011f578063d6d2aedb1461014f578063f2fde38b1461017f578063f4dbeeaf1461019b578063febf0e25146101b75761009e565b8063168a1a60146100a35780634ec8f6ae146100bf57806365fbf798146100db578063715018a6146100f75780638da5cb5b14610101575b600080fd5b6100bd60048036038101906100b89190613302565b6101d3565b005b6100d960048036038101906100d491906131d8565b6102ad565b005b6100f560048036038101906100f0919061333e565b6103ab565b005b6100ff610969565b005b6101096109f1565b6040516101169190613a70565b60405180910390f35b61013960048036038101906101349190613186565b610a1a565b6040516101469190613a70565b60405180910390f35b61016960048036038101906101649190613214565b610a4d565b6040516101769190613cdf565b60405180910390f35b61019960048036038101906101949190613186565b610dc4565b005b6101b560048036038101906101b09190613263565b610ebc565b005b6101d160048036038101906101cc91906132c6565b611cd5565b005b6101db611d99565b73ffffffffffffffffffffffffffffffffffffffff166101f96109f1565b73ffffffffffffffffffffffffffffffffffffffff161461024f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024690613c7f565b60405180910390fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055505050565b6102b5611d99565b73ffffffffffffffffffffffffffffffffffffffff166102d36109f1565b73ffffffffffffffffffffffffffffffffffffffff1614610329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032090613c7f565b60405180910390fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60648110156103ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e690613cbf565b60405180910390fd5b6000829050818173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161042e9190613a70565b60206040518083038186803b15801561044657600080fd5b505afa15801561045a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047e9190613526565b10156104bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b690613c9f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016104fc93929190613b31565b602060405180830381600087803b15801561051657600080fd5b505af115801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e91906134d4565b5060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161058a9190613a70565b60206040518083038186803b1580156105a257600080fd5b505afa1580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190613526565b905060008273ffffffffffffffffffffffffffffffffffffffff1663371babdc836040518263ffffffff1660e01b81526004016106179190613d62565b60006040518083038186803b15801561062f57600080fd5b505afa158015610643573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061066c91906133e6565b5090508273ffffffffffffffffffffffffffffffffffffffff1663be1d24ad836040518263ffffffff1660e01b81526004016106a89190613d62565b600060405180830381600087803b1580156106c257600080fd5b505af11580156106d6573d6000803e3d6000fd5b5050505060005b815181101561080b576107f8828281518110610722577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151838381518110610763577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107a39190613a70565b60206040518083038186803b1580156107bb57600080fd5b505afa1580156107cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f39190613526565b611da1565b8080610803906141f4565b9150506106dd565b507f0000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f61973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb337f0000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f61973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108a29190613a70565b60206040518083038186803b1580156108ba57600080fd5b505afa1580156108ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f29190613526565b6040518363ffffffff1660e01b815260040161090f929190613b91565b602060405180830381600087803b15801561092957600080fd5b505af115801561093d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096191906134d4565b505050505050565b610971611d99565b73ffffffffffffffffffffffffffffffffffffffff1661098f6109f1565b73ffffffffffffffffffffffffffffffffffffffff16146109e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109dc90613c7f565b60405180910390fd5b6109ef60006122f7565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a55612dcc565b600080600080610a63612dcc565b6000610abe8a8a8a600260008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff166123bb565b80925081975050508582600001818152505080826020018181525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f89610b238d8d612708565b6040518363ffffffff1660e01b8152600401610b40929190613d7d565b60006040518083038186803b158015610b5857600080fd5b505afa925050508015610b8e57506040513d6000823e3d601f19601f82011682018060405250810190610b8b9190613493565b60015b610b9b5760009450610be1565b80600181518110610bd5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519550505b8482600001511015610c03578482600001818152505060028260200181815250505b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f89610c4c8d8d612708565b6040518363ffffffff1660e01b8152600401610c69929190613d7d565b60006040518083038186803b158015610c8157600080fd5b505afa925050508015610cb757506040513d6000823e3d601f19601f82011682018060405250810190610cb49190613493565b60015b610cc45760009350610d0a565b80600181518110610cfe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519450505b8382600001511015610d2c578382600001818152505060038260200181815250505b6000600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610da357610d7e8a8a8a61286c565b92508282600001511015610da2578282600001818152505060048260200181815250505b5b6000826000015111610db457600080fd5b8196505050505050509392505050565b610dcc611d99565b73ffffffffffffffffffffffffffffffffffffffff16610dea6109f1565b73ffffffffffffffffffffffffffffffffffffffff1614610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3790613c7f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea790613c5f565b60405180910390fd5b610eb9816122f7565b50565b60008114156111a55760006040518061010001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020016101f462ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff168152602001600142610f419190613fb7565b815260200184815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090508473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518363ffffffff1660e01b8152600401610fce929190613b68565b602060405180830381600087803b158015610fe857600080fd5b505af1158015610ffc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102091906134d4565b508473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161109e929190613b91565b602060405180830381600087803b1580156110b857600080fd5b505af11580156110cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f091906134d4565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663414bf389826040518263ffffffff1660e01b815260040161114c9190613cfa565b602060405180830381600087803b15801561116657600080fd5b505af115801561117a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119e9190613526565b5050611ccf565b600181141561148e5760006040518061010001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001610bb862ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200160014261122a9190613fb7565b815260200184815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090508473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518363ffffffff1660e01b81526004016112b7929190613b68565b602060405180830381600087803b1580156112d157600080fd5b505af11580156112e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130991906134d4565b508473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611387929190613b91565b602060405180830381600087803b1580156113a157600080fd5b505af11580156113b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d991906134d4565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663414bf389826040518263ffffffff1660e01b81526004016114359190613cfa565b602060405180830381600087803b15801561144f57600080fd5b505af1158015611463573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114879190613526565b5050611ccf565b60028114156116ee578373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518363ffffffff1660e01b81526004016114f5929190613b68565b602060405180830381600087803b15801561150f57600080fd5b505af1158015611523573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154791906134d4565b508373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016115c5929190613b91565b602060405180830381600087803b1580156115df57600080fd5b505af11580156115f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161791906134d4565b50600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed17398360006116638888612708565b306001426116719190613fb7565b6040518663ffffffff1660e01b8152600401611691959493929190613dad565b600060405180830381600087803b1580156116ab57600080fd5b505af11580156116bf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116e89190613493565b50611ccf565b600381141561194e578373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518363ffffffff1660e01b8152600401611755929190613b68565b602060405180830381600087803b15801561176f57600080fd5b505af1158015611783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a791906134d4565b508373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611825929190613b91565b602060405180830381600087803b15801561183f57600080fd5b505af1158015611853573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187791906134d4565b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed17398360006118c38888612708565b306001426118d19190613fb7565b6040518663ffffffff1660e01b81526004016118f1959493929190613dad565b600060405180830381600087803b15801561190b57600080fd5b505af115801561191f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119489190613493565b50611ccf565b6000806040518060c00160405280600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018360018111156119da577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001604051806020016040528060008152508152509050600060405180608001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581526020013073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090508673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518363ffffffff1660e01b8152600401611ae7929190613b68565b602060405180830381600087803b158015611b0157600080fd5b505af1158015611b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3991906134d4565b508673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611bb7929190613b91565b602060405180830381600087803b158015611bd157600080fd5b505af1158015611be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0991906134d4565b50600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166352bbbe2983836000600142611c599190613fb7565b6040518563ffffffff1660e01b8152600401611c789493929190613d16565b602060405180830381600087803b158015611c9257600080fd5b505af1158015611ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cca9190613526565b505050505b50505050565b611cdd611d99565b73ffffffffffffffffffffffffffffffffffffffff16611cfb6109f1565b73ffffffffffffffffffffffffffffffffffffffff1614611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890613c7f565b60405180910390fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600033905090565b60007f000000000000000000000000c94bc5c62c53e88d67c3874f5e8f91c6a99656ca73ffffffffffffffffffffffffffffffffffffffff166355579d32846040518263ffffffff1660e01b8152600401611dfc9190613a70565b60206040518083038186803b158015611e1457600080fd5b505afa158015611e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4c91906131af565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612110576000611e8d84612c72565b905060008173ffffffffffffffffffffffffffffffffffffffff1663dc3b7c8b866040518263ffffffff1660e01b8152600401611eca9190613a70565b602060405180830381600087803b158015611ee457600080fd5b505af1158015611ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1c9190613526565b90506000670de0b6b3a76400008286611f35919061403e565b611f3f919061400d565b90506000807f000000000000000000000000c94bc5c62c53e88d67c3874f5e8f91c6a99656ca73ffffffffffffffffffffffffffffffffffffffff166358d28ef78989306040518463ffffffff1660e01b8152600401611fa193929190613bba565b60006040518083038186803b158015611fb957600080fd5b505afa158015611fcd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ff6919061337a565b9150915060005b82518110156121035782818151811061203f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16828281518110612096577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040516120ab9190613a59565b6000604051808303816000865af19150503d80600081146120e8576040519150601f19603f3d011682016040523d82523d6000602084013e6120ed565b606091505b50505080806120fb906141f4565b915050611ffd565b5082965085975050505050505b7f0000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f61973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561216a57506122f3565b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461228f57600061220f858386610a4d565b90506000612242837f0000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f6198460000151610a4d565b90506122548684878560200151610ebc565b612288837f0000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f61984600001518460200151610ebc565b50506122f0565b60006122bc857f0000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f61986610a4d565b90506122ee857f0000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f619868460200151610ebc565b505b50505b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806101f48361ffff16141561249457600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7729d4387876101f48860006040518663ffffffff1660e01b8152600401612432959493929190613ade565b602060405180830381600087803b15801561244c57600080fd5b505af192505050801561247d57506040513d601f19601f8201168201806040525081019061247a9190613526565b60015b61248a576000915061248f565b809250505b6126ff565b610bb88361ffff16141561256e57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7729d438787610bb88860006040518663ffffffff1660e01b8152600401612508959493929190613a8b565b602060405180830381600087803b15801561252257600080fd5b505af192505050801561255357506040513d601f19601f820116820180604052508101906125509190613526565b60015b6125605760009150612565565b809250505b600190506126fe565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7729d4387876101f48860006040518663ffffffff1660e01b81526004016125d4959493929190613ade565b602060405180830381600087803b1580156125ee57600080fd5b505af192505050801561261f57506040513d601f19601f8201168201806040525081019061261c9190613526565b60015b61262c5760009150612631565b809250505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7729d438787610bb88860006040518663ffffffff1660e01b8152600401612697959493929190613a8b565b602060405180830381600087803b1580156126b157600080fd5b505af19250505080156126e257506040513d601f19601f820116820180604052508101906126df9190613526565b60015b6126eb576126fd565b808311156126fb57600191508092505b505b5b5b94509492505050565b6060600267ffffffffffffffff81111561274b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156127795781602001602082028036833780820191505090505b50905082816000815181106127b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050818160018151811061282c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505092915050565b600080600090506000600267ffffffffffffffff8111156128b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156128e45781602001602082028036833780820191505090505b5090508581600081518110612922577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508481600181518110612997577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600167ffffffffffffffff811115612a14577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612a4d57816020015b612a3a612de6565b815260200190600190039081612a325790505b5090506040518060a00160405280600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815260200160008152602001600181526020018681526020016040518060200160405280600081525081525081600081518110612b01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250600060405180608001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020016000151581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152509050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f84d066e858486856040518563ffffffff1660e01b8152600401612bc49493929190613c0c565b600060405180830381600087803b158015612bde57600080fd5b505af1925050508015612c1457506040513d6000823e3d601f19601f82011682018060405250810190612c119190613452565b60015b612c215760009450612c67565b80600181518110612c5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519550505b505050509392505050565b60007f000000000000000000000000c94bc5c62c53e88d67c3874f5e8f91c6a99656ca73ffffffffffffffffffffffffffffffffffffffff1663f8b7f4227f000000000000000000000000c94bc5c62c53e88d67c3874f5e8f91c6a99656ca73ffffffffffffffffffffffffffffffffffffffff1663b7db91fc856040518263ffffffff1660e01b8152600401612d099190613a70565b60206040518083038186803b158015612d2157600080fd5b505afa158015612d35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5991906134fd565b6040518263ffffffff1660e01b8152600401612d759190613bf1565b60206040518083038186803b158015612d8d57600080fd5b505afa158015612da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc591906131af565b9050919050565b604051806040016040528060008152602001600081525090565b6040518060a0016040528060008019168152602001600081526020016000815260200160008152602001606081525090565b6000612e2b612e2684613e2c565b613e07565b90508083825260208201905082856020860282011115612e4a57600080fd5b60005b85811015612e7a5781612e60888261300c565b845260208401935060208301925050600181019050612e4d565b5050509392505050565b6000612e97612e9284613e58565b613e07565b9050808382526020820190508260005b85811015612ed75781518501612ebd8882613108565b845260208401935060208301925050600181019050612ea7565b5050509392505050565b6000612ef4612eef84613e84565b613e07565b90508083825260208201905082856020860282011115612f1357600080fd5b60005b85811015612f435781612f298882613132565b845260208401935060208301925050600181019050612f16565b5050509392505050565b6000612f60612f5b84613eb0565b613e07565b90508083825260208201905082856020860282011115612f7f57600080fd5b60005b85811015612faf5781612f958882613171565b845260208401935060208301925050600181019050612f82565b5050509392505050565b6000612fcc612fc784613edc565b613e07565b905082815260208101848484011115612fe457600080fd5b612fef848285614190565b509392505050565b600081359050613006816143e8565b92915050565b60008151905061301b816143e8565b92915050565b600082601f83011261303257600080fd5b8151613042848260208601612e18565b91505092915050565b600082601f83011261305c57600080fd5b815161306c848260208601612e84565b91505092915050565b600082601f83011261308657600080fd5b8151613096848260208601612ee1565b91505092915050565b600082601f8301126130b057600080fd5b81516130c0848260208601612f4d565b91505092915050565b6000815190506130d8816143ff565b92915050565b6000813590506130ed81614416565b92915050565b60008151905061310281614416565b92915050565b600082601f83011261311957600080fd5b8151613129848260208601612fb9565b91505092915050565b6000815190506131418161442d565b92915050565b60008135905061315681614444565b92915050565b60008135905061316b8161445b565b92915050565b6000815190506131808161445b565b92915050565b60006020828403121561319857600080fd5b60006131a684828501612ff7565b91505092915050565b6000602082840312156131c157600080fd5b60006131cf8482850161300c565b91505092915050565b600080604083850312156131eb57600080fd5b60006131f985828601612ff7565b925050602061320a85828601612ff7565b9150509250929050565b60008060006060848603121561322957600080fd5b600061323786828701612ff7565b935050602061324886828701612ff7565b92505060406132598682870161315c565b9150509250925092565b6000806000806080858703121561327957600080fd5b600061328787828801612ff7565b945050602061329887828801612ff7565b93505060406132a98782880161315c565b92505060606132ba8782880161315c565b91505092959194509250565b600080604083850312156132d957600080fd5b60006132e785828601612ff7565b92505060206132f8858286016130de565b9150509250929050565b6000806040838503121561331557600080fd5b600061332385828601612ff7565b925050602061333485828601613147565b9150509250929050565b6000806040838503121561335157600080fd5b600061335f85828601612ff7565b92505060206133708582860161315c565b9150509250929050565b6000806040838503121561338d57600080fd5b600083015167ffffffffffffffff8111156133a757600080fd5b6133b385828601613021565b925050602083015167ffffffffffffffff8111156133d057600080fd5b6133dc8582860161304b565b9150509250929050565b600080604083850312156133f957600080fd5b600083015167ffffffffffffffff81111561341357600080fd5b61341f85828601613021565b925050602083015167ffffffffffffffff81111561343c57600080fd5b6134488582860161309f565b9150509250929050565b60006020828403121561346457600080fd5b600082015167ffffffffffffffff81111561347e57600080fd5b61348a84828501613075565b91505092915050565b6000602082840312156134a557600080fd5b600082015167ffffffffffffffff8111156134bf57600080fd5b6134cb8482850161309f565b91505092915050565b6000602082840312156134e657600080fd5b60006134f4848285016130c9565b91505092915050565b60006020828403121561350f57600080fd5b600061351d848285016130f3565b91505092915050565b60006020828403121561353857600080fd5b600061354684828501613171565b91505092915050565b600061355b838361358a565b60208301905092915050565b600061357383836137f8565b905092915050565b613584816140aa565b82525050565b61359381614098565b82525050565b6135a281614098565b82525050565b60006135b382613f2d565b6135bd8185613f68565b93506135c883613f0d565b8060005b838110156135f95781516135e0888261354f565b97506135eb83613f4e565b9250506001810190506135cc565b5085935050505092915050565b600061361182613f38565b61361b8185613f79565b93508360208202850161362d85613f1d565b8060005b85811015613669578484038952815161364a8582613567565b945061365583613f5b565b925060208a01995050600181019050613631565b50829750879550505050505092915050565b613684816140bc565b82525050565b613693816140c8565b82525050565b6136a2816140c8565b82525050565b60006136b382613f43565b6136bd8185613f8a565b93506136cd818560208601614190565b6136d6816142f9565b840191505092915050565b60006136ec82613f43565b6136f68185613f9b565b9350613706818560208601614190565b80840191505092915050565b61371b81614136565b82525050565b61372a81614136565b82525050565b61373981614148565b82525050565b6137488161415a565b82525050565b6137578161416c565b82525050565b6137668161417e565b82525050565b6000613779602683613fa6565b91506137848261430a565b604082019050919050565b600061379c602083613fa6565b91506137a782614359565b602082019050919050565b60006137bf601983613fa6565b91506137ca82614382565b602082019050919050565b60006137e2601583613fa6565b91506137ed826143ab565b602082019050919050565b600060a083016000830151613810600086018261368a565b5060208301516138236020860182613a3b565b5060408301516138366040860182613a3b565b5060608301516138496060860182613a3b565b506080830151848203608086015261386182826136a8565b9150508091505092915050565b6040820160008201516138846000850182613a3b565b5060208201516138976020850182613a3b565b50505050565b610100820160008201516138b4600085018261358a565b5060208201516138c7602085018261358a565b5060408201516138da6040850182613a2c565b5060608201516138ed606085018261358a565b5060808201516139006080850182613a3b565b5060a082015161391360a0850182613a3b565b5060c082015161392660c0850182613a3b565b5060e082015161393960e0850182613a1d565b50505050565b608082016000820151613955600085018261358a565b506020820151613968602085018261367b565b50604082015161397b604085018261357b565b50606082015161398e606085018261367b565b50505050565b600060c0830160008301516139ac600086018261368a565b5060208301516139bf6020860182613712565b5060408301516139d2604086018261358a565b5060608301516139e5606086018261358a565b5060808301516139f86080860182613a3b565b5060a083015184820360a0860152613a1082826136a8565b9150508091505092915050565b613a26816140fd565b82525050565b613a358161411d565b82525050565b613a448161412c565b82525050565b613a538161412c565b82525050565b6000613a6582846136e1565b915081905092915050565b6000602082019050613a856000830184613599565b92915050565b600060a082019050613aa06000830188613599565b613aad6020830187613599565b613aba604083018661374e565b613ac76060830185613a4a565b613ad46080830184613730565b9695505050505050565b600060a082019050613af36000830188613599565b613b006020830187613599565b613b0d604083018661375d565b613b1a6060830185613a4a565b613b276080830184613730565b9695505050505050565b6000606082019050613b466000830186613599565b613b536020830185613599565b613b606040830184613a4a565b949350505050565b6000604082019050613b7d6000830185613599565b613b8a602083018461373f565b9392505050565b6000604082019050613ba66000830185613599565b613bb36020830184613a4a565b9392505050565b6000606082019050613bcf6000830186613599565b613bdc6020830185613a4a565b613be96040830184613599565b949350505050565b6000602082019050613c066000830184613699565b92915050565b600060e082019050613c216000830187613721565b8181036020830152613c338186613606565b90508181036040830152613c4781856135a8565b9050613c56606083018461393f565b95945050505050565b60006020820190508181036000830152613c788161376c565b9050919050565b60006020820190508181036000830152613c988161378f565b9050919050565b60006020820190508181036000830152613cb8816137b2565b9050919050565b60006020820190508181036000830152613cd8816137d5565b9050919050565b6000604082019050613cf4600083018461386e565b92915050565b600061010082019050613d10600083018461389d565b92915050565b600060e0820190508181036000830152613d308187613994565b9050613d3f602083018661393f565b613d4c60a083018561373f565b613d5960c0830184613a4a565b95945050505050565b6000602082019050613d776000830184613a4a565b92915050565b6000604082019050613d926000830185613a4a565b8181036020830152613da481846135a8565b90509392505050565b600060a082019050613dc26000830188613a4a565b613dcf602083018761373f565b8181036040830152613de181866135a8565b9050613df06060830185613599565b613dfd6080830184613a4a565b9695505050505050565b6000613e11613e22565b9050613e1d82826141c3565b919050565b6000604051905090565b600067ffffffffffffffff821115613e4757613e466142ca565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613e7357613e726142ca565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613e9f57613e9e6142ca565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ecb57613eca6142ca565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ef757613ef66142ca565b5b613f00826142f9565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000613fc28261412c565b9150613fcd8361412c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140025761400161423d565b5b828201905092915050565b60006140188261412c565b91506140238361412c565b9250826140335761403261426c565b5b828204905092915050565b60006140498261412c565b91506140548361412c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561408d5761408c61423d565b5b828202905092915050565b60006140a3826140fd565b9050919050565b60006140b5826140fd565b9050919050565b60008115159050919050565b6000819050919050565b60008190506140e0826143d4565b919050565b6000819050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b6000614141826140d2565b9050919050565b6000614153826140fd565b9050919050565b60006141658261412c565b9050919050565b60006141778261411d565b9050919050565b60006141898261411d565b9050919050565b60005b838110156141ae578082015181840152602081019050614193565b838111156141bd576000848401525b50505050565b6141cc826142f9565b810181811067ffffffffffffffff821117156141eb576141ea6142ca565b5b80604052505050565b60006141ff8261412c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142325761423161423d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e73756666696369656e74206e6573742062616c616e636500000000000000600082015250565b7f4d696e206e65737420616d6f756e743a20302e30310000000000000000000000600082015250565b600281106143e5576143e461429b565b5b50565b6143f181614098565b81146143fc57600080fd5b50565b614408816140bc565b811461441357600080fd5b50565b61441f816140c8565b811461442a57600080fd5b50565b614436816140e5565b811461444157600080fd5b50565b61444d816140ef565b811461445857600080fd5b50565b6144648161412c565b811461446f57600080fd5b5056fea26469706673582212207650651c406dbf6e5775d6274324c06d3ce6d5a2d9220bb7d664e9ddd43b5efc64736f6c63430008010033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f619000000000000000000000000c94bc5c62c53e88d67c3874f5e8f91c6a99656ca
-----Decoded View---------------
Arg [0] : _weth (address): 0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619
Arg [1] : _lendingRegistry (address): 0xc94BC5C62C53E88d67C3874f5E8f91c6a99656ca
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f619
Arg [1] : 000000000000000000000000c94bc5c62c53e88d67c3874f5e8f91c6a99656ca
Deployed Bytecode Sourcemap
31169:11965:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42855:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42732:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32329:1016;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2452:103;;;:::i;:::-;;1801:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31536:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35287:1647;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2710:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36942:2771;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42990:141;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42855:127;2032:12;:10;:12::i;:::-;2021:23;;:7;:5;:7::i;:::-;:23;;;2013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42970:4:::1;42947:6;:20;42954:12;42947:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;42855:127:::0;;:::o;42732:115::-;2032:12;:10;:12::i;:::-;2021:23;;:7;:5;:7::i;:::-;:23;;;2013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42835:4:::1;42814:10;:18;42825:6;42814:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;42732:115:::0;;:::o;32329:1016::-;32441:3;32426:11;:18;;32418:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;32483:8;32499:12;32483:29;;32560:11;32531:3;:13;;;32545:10;32531:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;32523:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;32666:3;:16;;;32683:10;32703:4;32710:11;32666:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32733:18;32754:3;:13;;;32776:4;32754:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32733:49;;32870:23;32898:3;:23;;;32922:10;32898:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32869:64;;;32999:3;:12;;;33012:10;32999:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33088:9;33084:136;33107:6;:13;33103:1;:17;33084:136;;;33142:66;33155:6;33162:1;33155:9;;;;;;;;;;;;;;;;;;;;;;33172:6;33179:1;33172:9;;;;;;;;;;;;;;;;;;;;;;33165:27;;;33201:4;33165:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33142:12;:66::i;:::-;33122:3;;;;;:::i;:::-;;;;33084:136;;;;33281:4;:13;;;33295:10;33307:4;:14;;;33330:4;33307:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33281:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32329:1016;;;;;:::o;2452:103::-;2032:12;:10;:12::i;:::-;2021:23;;:7;:5;:7::i;:::-;:23;;;2013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2517:30:::1;2544:1;2517:18;:30::i;:::-;2452:103::o:0;1801:87::-;1847:7;1874:6;;;;;;;;;;;1867:13;;1801:87;:::o;31536:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;35287:1647::-;35378:16;;:::i;:::-;35406:14;35431:16;35458;35485:19;35515:26;;:::i;:::-;35579:13;35626:61;35640:8;35649:9;35659;35669:6;:17;35676:9;35669:17;;;;;;;;;;;;;;;;;;;;;;;;;35626:13;:61::i;:::-;35603:84;;;;;;;;35716:9;35698;:15;;:27;;;;;35757:8;35736:9;:18;;:29;;;;;35817:11;;;;;;;;;;;:25;;;35843:9;35854:29;35863:8;35873:9;35854:8;:29::i;:::-;35817:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35813:206;;36006:1;35992:15;;35813:206;;;35948:7;35956:1;35948:10;;;;;;;;;;;;;;;;;;;;;;35934:24;;35885:85;35813:206;36048:11;36032:9;:15;;;:27;36029:124;;;36093:11;36075:9;:15;;:29;;;;;36140:1;36119:9;:18;;:22;;;;;36029:124;36200:11;;;;;;;;;;;:25;;;36226:9;36237:29;36246:8;36256:9;36237:8;:29::i;:::-;36200:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36196:206;;36389:1;36375:15;;36196:206;;;36331:7;36339:1;36331:10;;;;;;;;;;;;;;;;;;;;;;36317:24;;36268:85;36196:206;36431:11;36415:9;:15;;;:27;36412:124;;;36476:11;36458:9;:15;;:29;;;;;36523:1;36502:9;:18;;:22;;;;;36412:124;36581:29;:14;:24;36596:8;36581:24;;;;;;;;;;;;;;;;:29;36578:279;;36643:46;36660:8;36669:9;36679;36643:16;:46::i;:::-;36626:63;;36723:14;36707:9;:15;;;:30;36704:142;;;36775:14;36757:9;:15;;:32;;;;;36829:1;36808:9;:18;;:22;;;;;36704:142;36578:279;36895:1;36877:9;:15;;;:19;36869:28;;;;;;36917:9;36910:16;;;;;;;;35287:1647;;;;;:::o;2710:201::-;2032:12;:10;:12::i;:::-;2021:23;;:7;:5;:7::i;:::-;:23;;;2013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2819:1:::1;2799:22;;:8;:22;;;;2791:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2875:28;2894:8;2875:18;:28::i;:::-;2710:201:::0;:::o;36942:2771::-;37078:1;37065:9;:14;37062:570;;;37095:48;37146:264;;;;;;;;37199:8;37146:264;;;;;;37226:9;37146:264;;;;;;37254:3;37146:264;;;;;;37284:4;37146:264;;;;;;37326:1;37308:15;:19;;;;:::i;:::-;37146:264;;;;37346:9;37146:264;;;;37374:1;37146:264;;;;37394:1;37146:264;;;;;37095:315;;37432:8;37425:24;;;37458:9;;;;;;;;;;;37470:1;37425:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37494:8;37487:24;;;37520:9;;;;;;;;;;;37532:17;37487:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37565:9;;;;;;;;;;;:26;;;37592:6;37565:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37614:7;;;37062:570;37674:1;37661:9;:14;37658:573;;;37691:48;37742:265;;;;;;;;37795:8;37742:265;;;;;;37822:9;37742:265;;;;;;37850:4;37742:265;;;;;;37881:4;37742:265;;;;;;37923:1;37905:15;:19;;;;:::i;:::-;37742:265;;;;37943:9;37742:265;;;;37971:1;37742:265;;;;37991:1;37742:265;;;;;37691:316;;38031:8;38024:24;;;38057:9;;;;;;;;;;;38069:1;38024:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38093:8;38086:24;;;38119:9;;;;;;;;;;;38131:17;38086:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38164:9;;;;;;;;;;;:26;;;38191:6;38164:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38213:7;;;37658:573;38274:1;38261:9;:14;38258:323;;;38298:8;38291:24;;;38324:11;;;;;;;;;;;38338:1;38291:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38362:8;38355:24;;;38388:11;;;;;;;;;;;38402:17;38355:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38435:11;;;;;;;;;;;:36;;;38472:9;38482:1;38484:29;38493:8;38503:9;38484:8;:29::i;:::-;38522:4;38546:1;38528:15;:19;;;;:::i;:::-;38435:113;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38563:7;;38258:323;38628:1;38615:9;:14;38612:323;;;38652:8;38645:24;;;38678:11;;;;;;;;;;;38692:1;38645:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38716:8;38709:24;;;38742:11;;;;;;;;;;;38756:17;38709:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38789:11;;;;;;;;;;;:36;;;38826:9;38836:1;38838:29;38847:8;38857:9;38838:8;:29::i;:::-;38876:4;38900:1;38882:15;:19;;;;:::i;:::-;38789:113;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38917:7;;38612:323;38967:23;39031:38;39072:177;;;;;;;;39107:14;:24;39122:8;39107:24;;;;;;;;;;;;;;;;39072:177;;;;39146:4;39072:177;;;;;;;;;;;;;;;;;;;;39165:8;39072:177;;;;;;39188:9;39072:177;;;;;;39212:9;39072:177;;;;;;;;;;;;;;;;;;;39031:218;;39260:37;39301:140;;;;;;;;39348:4;39301:140;;;;;;39368:5;39301:140;;;;;;39404:4;39301:140;;;;;;39425:5;39301:140;;;;;39260:181;;39461:8;39454:24;;;39487:8;;;;;;;;;;;39498:1;39454:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39518:8;39511:24;;;39544:8;;;;;;;;;;;39555:17;39511:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39584:8;;;;;;;;;;;:13;;;39612:10;39637:5;39657:1;39691;39673:15;:19;;;;:::i;:::-;39584:119;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36942:2771;;;;;;;;:::o;42990:141::-;2032:12;:10;:12::i;:::-;2021:23;;:7;:5;:7::i;:::-;:23;;;2013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43118:5:::1;43088:14;:27;43103:11;43088:27;;;;;;;;;;;;;;;:35;;;;42990:141:::0;;:::o;604:98::-;657:7;684:10;677:17;;604:98;:::o;33353:1926::-;33482:18;33503:15;:35;;;33539:6;33503:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33482:64;;33583:1;33561:24;;:10;:24;;;33557:713;;33657:26;33686:34;33713:6;33686:26;:34::i;:::-;33657:63;;33735:20;33758:12;:25;;;33784:6;33758:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33735:56;;33846:24;33898:4;33883:12;33873:7;:22;;;;:::i;:::-;:29;;;;:::i;:::-;33846:56;;33949:25;33976:20;34000:15;:31;;;34032:6;34040:7;34057:4;34000:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33948:115;;;;34082:9;34078:106;34101:8;:15;34097:1;:19;34078:106;;;34142:8;34151:1;34142:11;;;;;;;;;;;;;;;;;;;;;;:16;;34159:5;34165:1;34159:8;;;;;;;;;;;;;;;;;;;;;;34142:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34118:3;;;;;:::i;:::-;;;;34078:106;;;;34208:16;34198:26;;34248:10;34239:19;;33557:713;;;;;;34361:4;34343:23;;:6;:23;;;34339:36;;;34368:7;;;34339:36;34387:22;34412:10;:18;34423:6;34412:18;;;;;;;;;;;;;;;;;;;;;;;;;34387:43;;34556:1;34530:28;;:14;:28;;;34527:745;;34575:28;34606:45;34619:6;34627:14;34643:7;34606:12;:45::i;:::-;34575:76;;34680:29;34712:62;34725:14;34749:4;34756:11;:17;;;34712:12;:62::i;:::-;34680:94;;34827:62;34835:6;34843:14;34859:7;34868:11;:20;;;34827:7;:62::i;:::-;34949:80;34957:14;34981:4;34988:11;:17;;;35007:12;:21;;;34949:7;:80::i;:::-;34527:745;;;;;35099:26;35128:44;35141:6;35157:4;35164:7;35128:12;:44::i;:::-;35099:73;;35201:59;35209:6;35225:4;35232:7;35241:9;:18;;;35201:7;:59::i;:::-;34527:745;;33353:1926;;;;;:::o;3071:191::-;3145:16;3164:6;;;;;;;;;;;3145:25;;3190:8;3181:6;;:17;;;;;;;;;;;;;;;;;;3245:8;3214:40;;3235:8;3214:40;;;;;;;;;;;;3071:191;;:::o;39721:1553::-;39830:14;39846:10;40022:3;40011:7;:14;;;40008:1259;;;40045:6;;;;;;;;;;;:28;;;40074:8;40083:9;40093:3;40097:9;40107:1;40045:64;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40041:213;;40237:1;40225:13;;40041:213;;;40171:12;40159:24;;40110:89;40041:213;40008:1259;;;40365:4;40354:7;:15;;;40351:916;;;40389:6;;;;;;;;;;;:28;;;40418:8;40427:9;40437:4;40442:9;40452:1;40389:65;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40385:214;;40582:1;40570:13;;40385:214;;;40516:12;40504:24;;40455:89;40385:214;40621:1;40613:9;;40351:916;;;40667:6;;;;;;;;;;;:28;;;40696:8;40705:9;40715:3;40719:9;40729:1;40667:64;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40663:213;;40859:1;40847:13;;40663:213;;;40793:12;40781:24;;40732:89;40663:213;40919:6;;;;;;;;;;;:28;;;40948:8;40957:9;40967:4;40972:9;40982:1;40919:65;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40915:341;;;;;41047:12;41037:9;:22;41034:125;;;41091:1;41083:9;;41127:12;41115:24;;41034:125;40985:189;40915:341;40351:916;40008:1259;39721:1553;;;;;;;:::o;42482:242::-;42565:22;42622:1;42608:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42600:24;;42646:11;42635:5;42641:1;42635:8;;;;;;;;;;;;;;;;;;;;;:22;;;;;;;;;;;42679:12;42668:5;42674:1;42668:8;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;;42482:242;;;;:::o;41282:880::-;41378:19;41449:23;41475:27;41449:53;;41515:23;41555:1;41541:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41515:42;;41580:8;41568:6;41575:1;41568:9;;;;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;41611:9;41599:6;41606:1;41599:9;;;;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;41633:41;41707:1;41677:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;41633:76;;41734:70;;;;;;;;41758:14;:24;41773:8;41758:24;;;;;;;;;;;;;;;;41734:70;;;;41784:1;41734:70;;;;41787:1;41734:70;;;;41790:9;41734:70;;;;;;;;;;;;;;;;;;;41720:8;41729:1;41720:11;;;;;;;;;;;;;;;;;;;;;:84;;;;41817:37;41857:77;;;;;;;;41890:10;41857:77;;;;;;41902:5;41857:77;;;;;;41916:10;41857:77;;;;;;41928:5;41857:77;;;;;41817:117;;41951:8;;;;;;;;;;;:23;;;41975:4;41980:8;41989:6;41996:5;41951:51;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41947:198;;42132:1;42115:18;;41947:198;;;42070:7;42078:1;42070:10;;;;;;;;;;;;;;;;;;;;;;42048:33;;42003:90;41947:198;41282:880;;;;;;;;;:::o;42170:304::-;42246:13;42307:15;:31;;;42357:15;:33;;;42413:8;42357:83;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42307:148;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42272:194;;42170:304;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24:645:1:-;;156:81;172:64;229:6;172:64;:::i;:::-;156:81;:::i;:::-;147:90;;257:5;285:6;278:5;271:21;311:4;304:5;300:16;293:23;;336:6;386:3;378:4;370:6;366:17;361:3;357:27;354:36;351:2;;;403:1;400;393:12;351:2;431:1;416:247;441:6;438:1;435:13;416:247;;;508:3;536:48;580:3;568:10;536:48;:::i;:::-;531:3;524:61;614:4;609:3;605:14;598:21;;648:4;643:3;639:14;632:21;;476:187;463:1;460;456:9;451:14;;416:247;;;420:14;137:532;;;;;;;:::o;690:628::-;;831:90;847:73;913:6;847:73;:::i;:::-;831:90;:::i;:::-;822:99;;941:5;969:6;962:5;955:21;995:4;988:5;984:16;977:23;;1020:6;1051:1;1036:276;1061:6;1058:1;1055:13;1036:276;;;1146:3;1140:10;1132:6;1128:23;1176:57;1229:3;1217:10;1176:57;:::i;:::-;1171:3;1164:70;1263:4;1258:3;1254:14;1247:21;;1297:4;1292:3;1288:14;1281:21;;1096:216;1083:1;1080;1076:9;1071:14;;1036:276;;;1040:14;812:506;;;;;;;:::o;1340:642::-;;1471:80;1487:63;1543:6;1487:63;:::i;:::-;1471:80;:::i;:::-;1462:89;;1571:5;1599:6;1592:5;1585:21;1625:4;1618:5;1614:16;1607:23;;1650:6;1700:3;1692:4;1684:6;1680:17;1675:3;1671:27;1668:36;1665:2;;;1717:1;1714;1707:12;1665:2;1745:1;1730:246;1755:6;1752:1;1749:13;1730:246;;;1822:3;1850:47;1893:3;1881:10;1850:47;:::i;:::-;1845:3;1838:60;1927:4;1922:3;1918:14;1911:21;;1961:4;1956:3;1952:14;1945:21;;1790:186;1777:1;1774;1770:9;1765:14;;1730:246;;;1734:14;1452:530;;;;;;;:::o;2005:645::-;;2137:81;2153:64;2210:6;2153:64;:::i;:::-;2137:81;:::i;:::-;2128:90;;2238:5;2266:6;2259:5;2252:21;2292:4;2285:5;2281:16;2274:23;;2317:6;2367:3;2359:4;2351:6;2347:17;2342:3;2338:27;2335:36;2332:2;;;2384:1;2381;2374:12;2332:2;2412:1;2397:247;2422:6;2419:1;2416:13;2397:247;;;2489:3;2517:48;2561:3;2549:10;2517:48;:::i;:::-;2512:3;2505:61;2595:4;2590:3;2586:14;2579:21;;2629:4;2624:3;2620:14;2613:21;;2457:187;2444:1;2441;2437:9;2432:14;;2397:247;;;2401:14;2118:532;;;;;;;:::o;2656:352::-;;2769:65;2785:48;2826:6;2785:48;:::i;:::-;2769:65;:::i;:::-;2760:74;;2857:6;2850:5;2843:21;2895:4;2888:5;2884:16;2933:3;2924:6;2919:3;2915:16;2912:25;2909:2;;;2950:1;2947;2940:12;2909:2;2963:39;2995:6;2990:3;2985;2963:39;:::i;:::-;2750:258;;;;;;:::o;3014:139::-;;3098:6;3085:20;3076:29;;3114:33;3141:5;3114:33;:::i;:::-;3066:87;;;;:::o;3159:143::-;;3247:6;3241:13;3232:22;;3263:33;3290:5;3263:33;:::i;:::-;3222:80;;;;:::o;3325:318::-;;3456:3;3449:4;3441:6;3437:17;3433:27;3423:2;;3474:1;3471;3464:12;3423:2;3507:6;3501:13;3532:105;3633:3;3625:6;3618:4;3610:6;3606:17;3532:105;:::i;:::-;3523:114;;3413:230;;;;;:::o;3664:336::-;;3804:3;3797:4;3789:6;3785:17;3781:27;3771:2;;3822:1;3819;3812:12;3771:2;3855:6;3849:13;3880:114;3990:3;3982:6;3975:4;3967:6;3963:17;3880:114;:::i;:::-;3871:123;;3761:239;;;;;:::o;4022:316::-;;4152:3;4145:4;4137:6;4133:17;4129:27;4119:2;;4170:1;4167;4160:12;4119:2;4203:6;4197:13;4228:104;4328:3;4320:6;4313:4;4305:6;4301:17;4228:104;:::i;:::-;4219:113;;4109:229;;;;;:::o;4361:318::-;;4492:3;4485:4;4477:6;4473:17;4469:27;4459:2;;4510:1;4507;4500:12;4459:2;4543:6;4537:13;4568:105;4669:3;4661:6;4654:4;4646:6;4642:17;4568:105;:::i;:::-;4559:114;;4449:230;;;;;:::o;4685:137::-;;4770:6;4764:13;4755:22;;4786:30;4810:5;4786:30;:::i;:::-;4745:77;;;;:::o;4828:139::-;;4912:6;4899:20;4890:29;;4928:33;4955:5;4928:33;:::i;:::-;4880:87;;;;:::o;4973:143::-;;5061:6;5055:13;5046:22;;5077:33;5104:5;5077:33;:::i;:::-;5036:80;;;;:::o;5135:286::-;;5250:3;5243:4;5235:6;5231:17;5227:27;5217:2;;5268:1;5265;5258:12;5217:2;5301:6;5295:13;5326:89;5411:3;5403:6;5396:4;5388:6;5384:17;5326:89;:::i;:::-;5317:98;;5207:214;;;;;:::o;5427:141::-;;5514:6;5508:13;5499:22;;5530:32;5556:5;5530:32;:::i;:::-;5489:79;;;;:::o;5574:137::-;;5657:6;5644:20;5635:29;;5673:32;5699:5;5673:32;:::i;:::-;5625:86;;;;:::o;5717:139::-;;5801:6;5788:20;5779:29;;5817:33;5844:5;5817:33;:::i;:::-;5769:87;;;;:::o;5862:143::-;;5950:6;5944:13;5935:22;;5966:33;5993:5;5966:33;:::i;:::-;5925:80;;;;:::o;6011:262::-;;6119:2;6107:9;6098:7;6094:23;6090:32;6087:2;;;6135:1;6132;6125:12;6087:2;6178:1;6203:53;6248:7;6239:6;6228:9;6224:22;6203:53;:::i;:::-;6193:63;;6149:117;6077:196;;;;:::o;6279:284::-;;6398:2;6386:9;6377:7;6373:23;6369:32;6366:2;;;6414:1;6411;6404:12;6366:2;6457:1;6482:64;6538:7;6529:6;6518:9;6514:22;6482:64;:::i;:::-;6472:74;;6428:128;6356:207;;;;:::o;6569:407::-;;;6694:2;6682:9;6673:7;6669:23;6665:32;6662:2;;;6710:1;6707;6700:12;6662:2;6753:1;6778:53;6823:7;6814:6;6803:9;6799:22;6778:53;:::i;:::-;6768:63;;6724:117;6880:2;6906:53;6951:7;6942:6;6931:9;6927:22;6906:53;:::i;:::-;6896:63;;6851:118;6652:324;;;;;:::o;6982:552::-;;;;7124:2;7112:9;7103:7;7099:23;7095:32;7092:2;;;7140:1;7137;7130:12;7092:2;7183:1;7208:53;7253:7;7244:6;7233:9;7229:22;7208:53;:::i;:::-;7198:63;;7154:117;7310:2;7336:53;7381:7;7372:6;7361:9;7357:22;7336:53;:::i;:::-;7326:63;;7281:118;7438:2;7464:53;7509:7;7500:6;7489:9;7485:22;7464:53;:::i;:::-;7454:63;;7409:118;7082:452;;;;;:::o;7540:698::-;;;;;7699:3;7687:9;7678:7;7674:23;7670:33;7667:2;;;7716:1;7713;7706:12;7667:2;7759:1;7784:53;7829:7;7820:6;7809:9;7805:22;7784:53;:::i;:::-;7774:63;;7730:117;7886:2;7912:53;7957:7;7948:6;7937:9;7933:22;7912:53;:::i;:::-;7902:63;;7857:118;8014:2;8040:53;8085:7;8076:6;8065:9;8061:22;8040:53;:::i;:::-;8030:63;;7985:118;8142:2;8168:53;8213:7;8204:6;8193:9;8189:22;8168:53;:::i;:::-;8158:63;;8113:118;7657:581;;;;;;;:::o;8244:407::-;;;8369:2;8357:9;8348:7;8344:23;8340:32;8337:2;;;8385:1;8382;8375:12;8337:2;8428:1;8453:53;8498:7;8489:6;8478:9;8474:22;8453:53;:::i;:::-;8443:63;;8399:117;8555:2;8581:53;8626:7;8617:6;8606:9;8602:22;8581:53;:::i;:::-;8571:63;;8526:118;8327:324;;;;;:::o;8657:405::-;;;8781:2;8769:9;8760:7;8756:23;8752:32;8749:2;;;8797:1;8794;8787:12;8749:2;8840:1;8865:53;8910:7;8901:6;8890:9;8886:22;8865:53;:::i;:::-;8855:63;;8811:117;8967:2;8993:52;9037:7;9028:6;9017:9;9013:22;8993:52;:::i;:::-;8983:62;;8938:117;8739:323;;;;;:::o;9068:407::-;;;9193:2;9181:9;9172:7;9168:23;9164:32;9161:2;;;9209:1;9206;9199:12;9161:2;9252:1;9277:53;9322:7;9313:6;9302:9;9298:22;9277:53;:::i;:::-;9267:63;;9223:117;9379:2;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9350:118;9151:324;;;;;:::o;9481:730::-;;;9676:2;9664:9;9655:7;9651:23;9647:32;9644:2;;;9692:1;9689;9682:12;9644:2;9756:1;9745:9;9741:17;9735:24;9786:18;9778:6;9775:30;9772:2;;;9818:1;9815;9808:12;9772:2;9846:89;9927:7;9918:6;9907:9;9903:22;9846:89;:::i;:::-;9836:99;;9706:239;10005:2;9994:9;9990:18;9984:25;10036:18;10028:6;10025:30;10022:2;;;10068:1;10065;10058:12;10022:2;10096:98;10186:7;10177:6;10166:9;10162:22;10096:98;:::i;:::-;10086:108;;9955:249;9634:577;;;;;:::o;10217:712::-;;;10403:2;10391:9;10382:7;10378:23;10374:32;10371:2;;;10419:1;10416;10409:12;10371:2;10483:1;10472:9;10468:17;10462:24;10513:18;10505:6;10502:30;10499:2;;;10545:1;10542;10535:12;10499:2;10573:89;10654:7;10645:6;10634:9;10630:22;10573:89;:::i;:::-;10563:99;;10433:239;10732:2;10721:9;10717:18;10711:25;10763:18;10755:6;10752:30;10749:2;;;10795:1;10792;10785:12;10749:2;10823:89;10904:7;10895:6;10884:9;10880:22;10823:89;:::i;:::-;10813:99;;10682:240;10361:568;;;;;:::o;10935:418::-;;11078:2;11066:9;11057:7;11053:23;11049:32;11046:2;;;11094:1;11091;11084:12;11046:2;11158:1;11147:9;11143:17;11137:24;11188:18;11180:6;11177:30;11174:2;;;11220:1;11217;11210:12;11174:2;11248:88;11328:7;11319:6;11308:9;11304:22;11248:88;:::i;:::-;11238:98;;11108:238;11036:317;;;;:::o;11359:420::-;;11503:2;11491:9;11482:7;11478:23;11474:32;11471:2;;;11519:1;11516;11509:12;11471:2;11583:1;11572:9;11568:17;11562:24;11613:18;11605:6;11602:30;11599:2;;;11645:1;11642;11635:12;11599:2;11673:89;11754:7;11745:6;11734:9;11730:22;11673:89;:::i;:::-;11663:99;;11533:239;11461:318;;;;:::o;11785:278::-;;11901:2;11889:9;11880:7;11876:23;11872:32;11869:2;;;11917:1;11914;11907:12;11869:2;11960:1;11985:61;12038:7;12029:6;12018:9;12014:22;11985:61;:::i;:::-;11975:71;;11931:125;11859:204;;;;:::o;12069:284::-;;12188:2;12176:9;12167:7;12163:23;12159:32;12156:2;;;12204:1;12201;12194:12;12156:2;12247:1;12272:64;12328:7;12319:6;12308:9;12304:22;12272:64;:::i;:::-;12262:74;;12218:128;12146:207;;;;:::o;12359:284::-;;12478:2;12466:9;12457:7;12453:23;12449:32;12446:2;;;12494:1;12491;12484:12;12446:2;12537:1;12562:64;12618:7;12609:6;12598:9;12594:22;12562:64;:::i;:::-;12552:74;;12508:128;12436:207;;;;:::o;12649:179::-;;12739:46;12781:3;12773:6;12739:46;:::i;:::-;12817:4;12812:3;12808:14;12794:28;;12729:99;;;;:::o;12834:280::-;;13000:108;13104:3;13096:6;13000:108;:::i;:::-;12986:122;;12976:138;;;;:::o;13120:132::-;13213:32;13239:5;13213:32;:::i;:::-;13208:3;13201:45;13191:61;;:::o;13258:108::-;13335:24;13353:5;13335:24;:::i;:::-;13330:3;13323:37;13313:53;;:::o;13372:118::-;13459:24;13477:5;13459:24;:::i;:::-;13454:3;13447:37;13437:53;;:::o;13526:732::-;;13674:54;13722:5;13674:54;:::i;:::-;13744:86;13823:6;13818:3;13744:86;:::i;:::-;13737:93;;13854:56;13904:5;13854:56;:::i;:::-;13933:7;13964:1;13949:284;13974:6;13971:1;13968:13;13949:284;;;14050:6;14044:13;14077:63;14136:3;14121:13;14077:63;:::i;:::-;14070:70;;14163:60;14216:6;14163:60;:::i;:::-;14153:70;;14009:224;13996:1;13993;13989:9;13984:14;;13949:284;;;13953:14;14249:3;14242:10;;13650:608;;;;;;;:::o;14340:1159::-;;14550:85;14629:5;14550:85;:::i;:::-;14651:117;14761:6;14756:3;14651:117;:::i;:::-;14644:124;;14794:3;14839:4;14831:6;14827:17;14822:3;14818:27;14869:87;14950:5;14869:87;:::i;:::-;14979:7;15010:1;14995:459;15020:6;15017:1;15014:13;14995:459;;;15091:9;15085:4;15081:20;15076:3;15069:33;15142:6;15136:13;15170:126;15291:4;15276:13;15170:126;:::i;:::-;15162:134;;15319:91;15403:6;15319:91;:::i;:::-;15309:101;;15439:4;15434:3;15430:14;15423:21;;15055:399;15042:1;15039;15035:9;15030:14;;14995:459;;;14999:14;15470:4;15463:11;;15490:3;15483:10;;14526:973;;;;;;;;;:::o;15505:99::-;15576:21;15591:5;15576:21;:::i;:::-;15571:3;15564:34;15554:50;;:::o;15610:108::-;15687:24;15705:5;15687:24;:::i;:::-;15682:3;15675:37;15665:53;;:::o;15724:118::-;15811:24;15829:5;15811:24;:::i;:::-;15806:3;15799:37;15789:53;;:::o;15848:340::-;;15952:38;15984:5;15952:38;:::i;:::-;16006:60;16059:6;16054:3;16006:60;:::i;:::-;15999:67;;16075:52;16120:6;16115:3;16108:4;16101:5;16097:16;16075:52;:::i;:::-;16152:29;16174:6;16152:29;:::i;:::-;16147:3;16143:39;16136:46;;15928:260;;;;;:::o;16194:373::-;;16326:38;16358:5;16326:38;:::i;:::-;16380:88;16461:6;16456:3;16380:88;:::i;:::-;16373:95;;16477:52;16522:6;16517:3;16510:4;16503:5;16499:16;16477:52;:::i;:::-;16554:6;16549:3;16545:16;16538:23;;16302:265;;;;;:::o;16573:143::-;16661:48;16703:5;16661:48;:::i;:::-;16656:3;16649:61;16639:77;;:::o;16722:153::-;16820:48;16862:5;16820:48;:::i;:::-;16815:3;16808:61;16798:77;;:::o;16881:147::-;16976:45;17015:5;16976:45;:::i;:::-;16971:3;16964:58;16954:74;;:::o;17034:147::-;17129:45;17168:5;17129:45;:::i;:::-;17124:3;17117:58;17107:74;;:::o;17187:151::-;17284:47;17325:5;17284:47;:::i;:::-;17279:3;17272:60;17262:76;;:::o;17344:149::-;17440:46;17480:5;17440:46;:::i;:::-;17435:3;17428:59;17418:75;;:::o;17499:366::-;;17662:67;17726:2;17721:3;17662:67;:::i;:::-;17655:74;;17738:93;17827:3;17738:93;:::i;:::-;17856:2;17851:3;17847:12;17840:19;;17645:220;;;:::o;17871:366::-;;18034:67;18098:2;18093:3;18034:67;:::i;:::-;18027:74;;18110:93;18199:3;18110:93;:::i;:::-;18228:2;18223:3;18219:12;18212:19;;18017:220;;;:::o;18243:366::-;;18406:67;18470:2;18465:3;18406:67;:::i;:::-;18399:74;;18482:93;18571:3;18482:93;:::i;:::-;18600:2;18595:3;18591:12;18584:19;;18389:220;;;:::o;18615:366::-;;18778:67;18842:2;18837:3;18778:67;:::i;:::-;18771:74;;18854:93;18943:3;18854:93;:::i;:::-;18972:2;18967:3;18963:12;18956:19;;18761:220;;;:::o;19059:1153::-;;19216:4;19211:3;19207:14;19305:4;19298:5;19294:16;19288:23;19324:63;19381:4;19376:3;19372:14;19358:12;19324:63;:::i;:::-;19231:166;19487:4;19480:5;19476:16;19470:23;19506:63;19563:4;19558:3;19554:14;19540:12;19506:63;:::i;:::-;19407:172;19670:4;19663:5;19659:16;19653:23;19689:63;19746:4;19741:3;19737:14;19723:12;19689:63;:::i;:::-;19589:173;19846:4;19839:5;19835:16;19829:23;19865:63;19922:4;19917:3;19913:14;19899:12;19865:63;:::i;:::-;19772:166;20024:4;20017:5;20013:16;20007:23;20077:3;20071:4;20067:14;20060:4;20055:3;20051:14;20044:38;20103:71;20169:4;20155:12;20103:71;:::i;:::-;20095:79;;19948:237;20202:4;20195:11;;19185:1027;;;;;:::o;20284:516::-;20435:4;20430:3;20426:14;20523:4;20516:5;20512:16;20506:23;20542:63;20599:4;20594:3;20590:14;20576:12;20542:63;:::i;:::-;20450:165;20701:4;20694:5;20690:16;20684:23;20720:63;20777:4;20772:3;20768:14;20754:12;20720:63;:::i;:::-;20625:168;20404:396;;;:::o;20900:1625::-;21077:6;21072:3;21068:16;21169:4;21162:5;21158:16;21152:23;21188:63;21245:4;21240:3;21236:14;21222:12;21188:63;:::i;:::-;21094:167;21347:4;21340:5;21336:16;21330:23;21366:63;21423:4;21418:3;21414:14;21400:12;21366:63;:::i;:::-;21271:168;21520:4;21513:5;21509:16;21503:23;21539:61;21594:4;21589:3;21585:14;21571:12;21539:61;:::i;:::-;21449:161;21697:4;21690:5;21686:16;21680:23;21716:63;21773:4;21768:3;21764:14;21750:12;21716:63;:::i;:::-;21620:169;21875:4;21868:5;21864:16;21858:23;21894:63;21951:4;21946:3;21942:14;21928:12;21894:63;:::i;:::-;21799:168;22053:4;22046:5;22042:16;22036:23;22072:63;22129:4;22124:3;22120:14;22106:12;22072:63;:::i;:::-;21977:168;22239:4;22232:5;22228:16;22222:23;22258:63;22315:4;22310:3;22306:14;22292:12;22258:63;:::i;:::-;22155:176;22426:4;22419:5;22415:16;22409:23;22445:63;22502:4;22497:3;22493:14;22479:12;22445:63;:::i;:::-;22341:177;21046:1479;;;:::o;22605:908::-;22766:4;22761:3;22757:14;22855:4;22848:5;22844:16;22838:23;22874:63;22931:4;22926:3;22922:14;22908:12;22874:63;:::i;:::-;22781:166;23044:4;23037:5;23033:16;23027:23;23063:57;23114:4;23109:3;23105:14;23091:12;23063:57;:::i;:::-;22957:173;23217:4;23210:5;23206:16;23200:23;23236:79;23309:4;23304:3;23300:14;23286:12;23236:79;:::i;:::-;23140:185;23420:4;23413:5;23409:16;23403:23;23439:57;23490:4;23485:3;23481:14;23467:12;23439:57;:::i;:::-;23335:171;22735:778;;;:::o;23585:1332::-;;23746:4;23741:3;23737:14;23835:4;23828:5;23824:16;23818:23;23854:63;23911:4;23906:3;23902:14;23888:12;23854:63;:::i;:::-;23761:166;24009:4;24002:5;23998:16;23992:23;24028:74;24096:4;24091:3;24087:14;24073:12;24028:74;:::i;:::-;23937:175;24197:4;24190:5;24186:16;24180:23;24216:63;24273:4;24268:3;24264:14;24250:12;24216:63;:::i;:::-;24122:167;24375:4;24368:5;24364:16;24358:23;24394:63;24451:4;24446:3;24442:14;24428:12;24394:63;:::i;:::-;24299:168;24551:4;24544:5;24540:16;24534:23;24570:63;24627:4;24622:3;24618:14;24604:12;24570:63;:::i;:::-;24477:166;24729:4;24722:5;24718:16;24712:23;24782:3;24776:4;24772:14;24765:4;24760:3;24756:14;24749:38;24808:71;24874:4;24860:12;24808:71;:::i;:::-;24800:79;;24653:237;24907:4;24900:11;;23715:1202;;;;;:::o;24923:108::-;25000:24;25018:5;25000:24;:::i;:::-;24995:3;24988:37;24978:53;;:::o;25037:105::-;25112:23;25129:5;25112:23;:::i;:::-;25107:3;25100:36;25090:52;;:::o;25148:108::-;25225:24;25243:5;25225:24;:::i;:::-;25220:3;25213:37;25203:53;;:::o;25262:118::-;25349:24;25367:5;25349:24;:::i;:::-;25344:3;25337:37;25327:53;;:::o;25386:271::-;;25538:93;25627:3;25618:6;25538:93;:::i;:::-;25531:100;;25648:3;25641:10;;25520:137;;;;:::o;25663:222::-;;25794:2;25783:9;25779:18;25771:26;;25807:71;25875:1;25864:9;25860:17;25851:6;25807:71;:::i;:::-;25761:124;;;;:::o;25891:700::-;;26152:3;26141:9;26137:19;26129:27;;26166:71;26234:1;26223:9;26219:17;26210:6;26166:71;:::i;:::-;26247:72;26315:2;26304:9;26300:18;26291:6;26247:72;:::i;:::-;26329:82;26407:2;26396:9;26392:18;26383:6;26329:82;:::i;:::-;26421:72;26489:2;26478:9;26474:18;26465:6;26421:72;:::i;:::-;26503:81;26579:3;26568:9;26564:19;26555:6;26503:81;:::i;:::-;26119:472;;;;;;;;:::o;26597:698::-;;26857:3;26846:9;26842:19;26834:27;;26871:71;26939:1;26928:9;26924:17;26915:6;26871:71;:::i;:::-;26952:72;27020:2;27009:9;27005:18;26996:6;26952:72;:::i;:::-;27034:81;27111:2;27100:9;27096:18;27087:6;27034:81;:::i;:::-;27125:72;27193:2;27182:9;27178:18;27169:6;27125:72;:::i;:::-;27207:81;27283:3;27272:9;27268:19;27259:6;27207:81;:::i;:::-;26824:471;;;;;;;;:::o;27301:442::-;;27488:2;27477:9;27473:18;27465:26;;27501:71;27569:1;27558:9;27554:17;27545:6;27501:71;:::i;:::-;27582:72;27650:2;27639:9;27635:18;27626:6;27582:72;:::i;:::-;27664;27732:2;27721:9;27717:18;27708:6;27664:72;:::i;:::-;27455:288;;;;;;:::o;27749:348::-;;27916:2;27905:9;27901:18;27893:26;;27929:71;27997:1;27986:9;27982:17;27973:6;27929:71;:::i;:::-;28010:80;28086:2;28075:9;28071:18;28062:6;28010:80;:::i;:::-;27883:214;;;;;:::o;28103:332::-;;28262:2;28251:9;28247:18;28239:26;;28275:71;28343:1;28332:9;28328:17;28319:6;28275:71;:::i;:::-;28356:72;28424:2;28413:9;28409:18;28400:6;28356:72;:::i;:::-;28229:206;;;;;:::o;28441:442::-;;28628:2;28617:9;28613:18;28605:26;;28641:71;28709:1;28698:9;28694:17;28685:6;28641:71;:::i;:::-;28722:72;28790:2;28779:9;28775:18;28766:6;28722:72;:::i;:::-;28804;28872:2;28861:9;28857:18;28848:6;28804:72;:::i;:::-;28595:288;;;;;;:::o;28889:222::-;;29020:2;29009:9;29005:18;28997:26;;29033:71;29101:1;29090:9;29086:17;29077:6;29033:71;:::i;:::-;28987:124;;;;:::o;29117:1129::-;;29569:3;29558:9;29554:19;29546:27;;29583:82;29662:1;29651:9;29647:17;29638:6;29583:82;:::i;:::-;29712:9;29706:4;29702:20;29697:2;29686:9;29682:18;29675:48;29740:170;29905:4;29896:6;29740:170;:::i;:::-;29732:178;;29957:9;29951:4;29947:20;29942:2;29931:9;29927:18;29920:48;29985:108;30088:4;30079:6;29985:108;:::i;:::-;29977:116;;30103:136;30235:2;30224:9;30220:18;30211:6;30103:136;:::i;:::-;29536:710;;;;;;;:::o;30252:419::-;;30456:2;30445:9;30441:18;30433:26;;30505:9;30499:4;30495:20;30491:1;30480:9;30476:17;30469:47;30533:131;30659:4;30533:131;:::i;:::-;30525:139;;30423:248;;;:::o;30677:419::-;;30881:2;30870:9;30866:18;30858:26;;30930:9;30924:4;30920:20;30916:1;30905:9;30901:17;30894:47;30958:131;31084:4;30958:131;:::i;:::-;30950:139;;30848:248;;;:::o;31102:419::-;;31306:2;31295:9;31291:18;31283:26;;31355:9;31349:4;31345:20;31341:1;31330:9;31326:17;31319:47;31383:131;31509:4;31383:131;:::i;:::-;31375:139;;31273:248;;;:::o;31527:419::-;;31731:2;31720:9;31716:18;31708:26;;31780:9;31774:4;31770:20;31766:1;31755:9;31751:17;31744:47;31808:131;31934:4;31808:131;:::i;:::-;31800:139;;31698:248;;;:::o;31952:330::-;;32137:2;32126:9;32122:18;32114:26;;32150:125;32272:1;32261:9;32257:17;32248:6;32150:125;:::i;:::-;32104:178;;;;:::o;32288:383::-;;32499:3;32488:9;32484:19;32476:27;;32513:151;32661:1;32650:9;32646:17;32637:6;32513:151;:::i;:::-;32466:205;;;;:::o;32677:862::-;;33020:3;33009:9;33005:19;32997:27;;33070:9;33064:4;33060:20;33056:1;33045:9;33041:17;33034:47;33098:114;33207:4;33198:6;33098:114;:::i;:::-;33090:122;;33222:136;33354:2;33343:9;33339:18;33330:6;33222:136;:::i;:::-;33368:81;33444:3;33433:9;33429:19;33420:6;33368:81;:::i;:::-;33459:73;33527:3;33516:9;33512:19;33503:6;33459:73;:::i;:::-;32987:552;;;;;;;:::o;33545:222::-;;33676:2;33665:9;33661:18;33653:26;;33689:71;33757:1;33746:9;33742:17;33733:6;33689:71;:::i;:::-;33643:124;;;;:::o;33773:483::-;;33982:2;33971:9;33967:18;33959:26;;33995:71;34063:1;34052:9;34048:17;34039:6;33995:71;:::i;:::-;34113:9;34107:4;34103:20;34098:2;34087:9;34083:18;34076:48;34141:108;34244:4;34235:6;34141:108;:::i;:::-;34133:116;;33949:307;;;;;:::o;34262:831::-;;34563:3;34552:9;34548:19;34540:27;;34577:71;34645:1;34634:9;34630:17;34621:6;34577:71;:::i;:::-;34658:80;34734:2;34723:9;34719:18;34710:6;34658:80;:::i;:::-;34785:9;34779:4;34775:20;34770:2;34759:9;34755:18;34748:48;34813:108;34916:4;34907:6;34813:108;:::i;:::-;34805:116;;34931:72;34999:2;34988:9;34984:18;34975:6;34931:72;:::i;:::-;35013:73;35081:3;35070:9;35066:19;35057:6;35013:73;:::i;:::-;34530:563;;;;;;;;:::o;35099:129::-;;35160:20;;:::i;:::-;35150:30;;35189:33;35217:4;35209:6;35189:33;:::i;:::-;35140:88;;;:::o;35234:75::-;;35300:2;35294:9;35284:19;;35274:35;:::o;35315:311::-;;35482:18;35474:6;35471:30;35468:2;;;35504:18;;:::i;:::-;35468:2;35554:4;35546:6;35542:17;35534:25;;35614:4;35608;35604:15;35596:23;;35397:229;;;:::o;35632:320::-;;35808:18;35800:6;35797:30;35794:2;;;35830:18;;:::i;:::-;35794:2;35880:4;35872:6;35868:17;35860:25;;35940:4;35934;35930:15;35922:23;;35723:229;;;:::o;35958:310::-;;36124:18;36116:6;36113:30;36110:2;;;36146:18;;:::i;:::-;36110:2;36196:4;36188:6;36184:17;36176:25;;36256:4;36250;36246:15;36238:23;;36039:229;;;:::o;36274:311::-;;36441:18;36433:6;36430:30;36427:2;;;36463:18;;:::i;:::-;36427:2;36513:4;36505:6;36501:17;36493:25;;36573:4;36567;36563:15;36555:23;;36356:229;;;:::o;36591:307::-;;36742:18;36734:6;36731:30;36728:2;;;36764:18;;:::i;:::-;36728:2;36802:29;36824:6;36802:29;:::i;:::-;36794:37;;36886:4;36880;36876:15;36868:23;;36657:241;;;:::o;36904:132::-;;36994:3;36986:11;;37024:4;37019:3;37015:14;37007:22;;36976:60;;;:::o;37042:163::-;;37163:3;37155:11;;37193:4;37188:3;37184:14;37176:22;;37145:60;;;:::o;37211:114::-;;37312:5;37306:12;37296:22;;37285:40;;;:::o;37331:145::-;;37463:5;37457:12;37447:22;;37436:40;;;:::o;37482:98::-;;37567:5;37561:12;37551:22;;37540:40;;;:::o;37586:113::-;;37688:4;37683:3;37679:14;37671:22;;37661:38;;;:::o;37705:144::-;;37838:4;37833:3;37829:14;37821:22;;37811:38;;;:::o;37855:184::-;;37988:6;37983:3;37976:19;38028:4;38023:3;38019:14;38004:29;;37966:73;;;;:::o;38045:215::-;;38209:6;38204:3;38197:19;38249:4;38244:3;38240:14;38225:29;;38187:73;;;;:::o;38266:158::-;;38373:6;38368:3;38361:19;38413:4;38408:3;38404:14;38389:29;;38351:73;;;;:::o;38430:147::-;;38568:3;38553:18;;38543:34;;;;:::o;38583:169::-;;38701:6;38696:3;38689:19;38741:4;38736:3;38732:14;38717:29;;38679:73;;;;:::o;38758:305::-;;38817:20;38835:1;38817:20;:::i;:::-;38812:25;;38851:20;38869:1;38851:20;:::i;:::-;38846:25;;39005:1;38937:66;38933:74;38930:1;38927:81;38924:2;;;39011:18;;:::i;:::-;38924:2;39055:1;39052;39048:9;39041:16;;38802:261;;;;:::o;39069:185::-;;39126:20;39144:1;39126:20;:::i;:::-;39121:25;;39160:20;39178:1;39160:20;:::i;:::-;39155:25;;39199:1;39189:2;;39204:18;;:::i;:::-;39189:2;39246:1;39243;39239:9;39234:14;;39111:143;;;;:::o;39260:348::-;;39323:20;39341:1;39323:20;:::i;:::-;39318:25;;39357:20;39375:1;39357:20;:::i;:::-;39352:25;;39545:1;39477:66;39473:74;39470:1;39467:81;39462:1;39455:9;39448:17;39444:105;39441:2;;;39552:18;;:::i;:::-;39441:2;39600:1;39597;39593:9;39582:20;;39308:300;;;;:::o;39614:96::-;;39680:24;39698:5;39680:24;:::i;:::-;39669:35;;39659:51;;;:::o;39716:104::-;;39790:24;39808:5;39790:24;:::i;:::-;39779:35;;39769:51;;;:::o;39826:90::-;;39903:5;39896:13;39889:21;39878:32;;39868:48;;;:::o;39922:77::-;;39988:5;39977:16;;39967:32;;;:::o;40005:137::-;;40084:5;40073:16;;40090:46;40130:5;40090:46;:::i;:::-;40063:79;;;:::o;40148:76::-;;40213:5;40202:16;;40192:32;;;:::o;40230:89::-;;40306:6;40299:5;40295:18;40284:29;;40274:45;;;:::o;40325:126::-;;40402:42;40395:5;40391:54;40380:65;;40370:81;;;:::o;40457:91::-;;40533:8;40526:5;40522:20;40511:31;;40501:47;;;:::o;40554:77::-;;40620:5;40609:16;;40599:32;;;:::o;40637:137::-;;40731:37;40762:5;40731:37;:::i;:::-;40718:50;;40708:66;;;:::o;40780:121::-;;40871:24;40889:5;40871:24;:::i;:::-;40858:37;;40848:53;;;:::o;40907:121::-;;40998:24;41016:5;40998:24;:::i;:::-;40985:37;;40975:53;;;:::o;41034:122::-;;41127:23;41144:5;41127:23;:::i;:::-;41114:36;;41104:52;;;:::o;41162:121::-;;41254:23;41271:5;41254:23;:::i;:::-;41241:36;;41231:52;;;:::o;41289:307::-;41357:1;41367:113;41381:6;41378:1;41375:13;41367:113;;;41466:1;41461:3;41457:11;41451:18;41447:1;41442:3;41438:11;41431:39;41403:2;41400:1;41396:10;41391:15;;41367:113;;;41498:6;41495:1;41492:13;41489:2;;;41578:1;41569:6;41564:3;41560:16;41553:27;41489:2;41338:258;;;;:::o;41602:281::-;41685:27;41707:4;41685:27;:::i;:::-;41677:6;41673:40;41815:6;41803:10;41800:22;41779:18;41767:10;41764:34;41761:62;41758:2;;;41826:18;;:::i;:::-;41758:2;41866:10;41862:2;41855:22;41645:238;;;:::o;41889:233::-;;41951:24;41969:5;41951:24;:::i;:::-;41942:33;;41997:66;41990:5;41987:77;41984:2;;;42067:18;;:::i;:::-;41984:2;42114:1;42107:5;42103:13;42096:20;;41932:190;;;:::o;42128:180::-;42176:77;42173:1;42166:88;42273:4;42270:1;42263:15;42297:4;42294:1;42287:15;42314:180;42362:77;42359:1;42352:88;42459:4;42456:1;42449:15;42483:4;42480:1;42473:15;42500:180;42548:77;42545:1;42538:88;42645:4;42642:1;42635:15;42669:4;42666:1;42659:15;42686:180;42734:77;42731:1;42724:88;42831:4;42828:1;42821:15;42855:4;42852:1;42845:15;42872:102;;42964:2;42960:7;42955:2;42948:5;42944:14;42940:28;42930:38;;42920:54;;;:::o;42980:225::-;43120:34;43116:1;43108:6;43104:14;43097:58;43189:8;43184:2;43176:6;43172:15;43165:33;43086:119;:::o;43211:182::-;43351:34;43347:1;43339:6;43335:14;43328:58;43317:76;:::o;43399:175::-;43539:27;43535:1;43527:6;43523:14;43516:51;43505:69;:::o;43580:171::-;43720:23;43716:1;43708:6;43704:14;43697:47;43686:65;:::o;43757:118::-;43843:1;43836:5;43833:12;43823:2;;43849:18;;:::i;:::-;43823:2;43813:62;:::o;43881:122::-;43954:24;43972:5;43954:24;:::i;:::-;43947:5;43944:35;43934:2;;43993:1;43990;43983:12;43934:2;43924:79;:::o;44009:116::-;44079:21;44094:5;44079:21;:::i;:::-;44072:5;44069:32;44059:2;;44115:1;44112;44105:12;44059:2;44049:76;:::o;44131:122::-;44204:24;44222:5;44204:24;:::i;:::-;44197:5;44194:35;44184:2;;44243:1;44240;44233:12;44184:2;44174:79;:::o;44259:120::-;44331:23;44348:5;44331:23;:::i;:::-;44324:5;44321:34;44311:2;;44369:1;44366;44359:12;44311:2;44301:78;:::o;44385:120::-;44457:23;44474:5;44457:23;:::i;:::-;44450:5;44447:34;44437:2;;44495:1;44492;44485:12;44437:2;44427:78;:::o;44511:122::-;44584:24;44602:5;44584:24;:::i;:::-;44577:5;44574:35;44564:2;;44623:1;44620;44613:12;44564:2;44554:79;:::o
Swarm Source
ipfs://7650651c406dbf6e5775d6274324c06d3ce6d5a2d9220bb7d664e9ddd43b5efc
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.