Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
10784914 | 1621 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
LoanTokenLogicStandard
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-09-02 */ /** * Copyright 2017-2020, bZeroX, LLC <https://bzx.network/>. All Rights Reserved. * Licensed under the Apache License, Version 2.0. */ pragma solidity 0.5.17; pragma experimental ABIEncoderV2; interface IWeth { function deposit() external payable; function withdraw(uint256 wad) external; } contract IERC20 { string public name; uint8 public decimals; string public symbol; function totalSupply() public view returns (uint256); function balanceOf(address _who) public view returns (uint256); function allowance(address _owner, address _spender) public view returns (uint256); function approve(address _spender, uint256 _value) public returns (bool); function transfer(address _to, uint256 _value) public returns (bool); function transferFrom(address _from, address _to, uint256 _value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } contract IWethERC20 is IWeth, IERC20 {} /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b != 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Integer division of two numbers, rounding up and truncating the quotient */ function divCeil(uint256 a, uint256 b) internal pure returns (uint256) { return divCeil(a, b, "SafeMath: division by zero"); } /** * @dev Integer division of two numbers, rounding up and truncating the quotient */ function divCeil(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b != 0, errorMessage); if (a == 0) { return 0; } uint256 c = ((a - 1) / b) + 1; return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function min256(uint256 _a, uint256 _b) internal pure returns (uint256) { return _a < _b ? _a : _b; } } /** * @title SignedSafeMath * @dev Signed math operations with safety checks that revert on error. */ library SignedSafeMath { int256 constant private _INT256_MIN = -2**255; /** * @dev Returns the multiplication of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow"); int256 c = a * b; require(c / a == b, "SignedSafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two signed integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(int256 a, int256 b) internal pure returns (int256) { require(b != 0, "SignedSafeMath: division by zero"); require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow"); int256 c = a / b; return c; } /** * @dev Returns the subtraction of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow"); return c; } /** * @dev Returns the addition of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow"); return c; } } /** * @title Helps contracts guard against reentrancy attacks. * @author Remco Bloemen <remco@2π.com>, Eenae <[email protected]> * @dev If you mark a function `nonReentrant`, you should also * mark it `external`. */ contract ReentrancyGuard { /// @dev Constant for unlocked guard state - non-zero to prevent extra gas costs. /// See: https://github.com/OpenZeppelin/openzeppelin-solidity/issues/1056 uint256 internal constant REENTRANCY_GUARD_FREE = 1; /// @dev Constant for locked guard state uint256 internal constant REENTRANCY_GUARD_LOCKED = 2; /** * @dev We use a single lock for the whole contract. */ uint256 internal reentrancyLock = REENTRANCY_GUARD_FREE; /** * @dev Prevents a contract from calling itself, directly or indirectly. * If you mark a function `nonReentrant`, you should also * mark it `external`. Calling one `nonReentrant` function from * another is not supported. Instead, you can implement a * `private` function doing the actual work, and an `external` * wrapper marked as `nonReentrant`. */ modifier nonReentrant() { require(reentrancyLock == REENTRANCY_GUARD_FREE, "nonReentrant"); reentrancyLock = REENTRANCY_GUARD_LOCKED; _; reentrancyLock = REENTRANCY_GUARD_FREE; } } /** * @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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @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]. * * _Available since v2.4.0._ */ function sendValue(address recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } /* * @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 GSN 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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @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. * * 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. */ 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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "unauthorized"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface ProtocolLike { function borrowOrTradeFromPool( bytes32 loanParamsId, bytes32 loanId, // if 0, start a new loan bool isTorqueLoan, uint256 initialMargin, address[4] calldata sentAddresses, // lender: must match loan if loanId provided // borrower: must match loan if loanId provided // receiver: receiver of funds (address(0) assumes borrower address) // manager: delegated manager of loan unless address(0) uint256[5] calldata sentValues, // newRate: new loan interest rate // newPrincipal: new loan size (borrowAmount + any borrowed interest) // torqueInterest: new amount of interest to escrow for Torque loan (determines initial loan length) // loanTokenReceived: total loanToken deposit (amount not sent to borrower in the case of Torque loans) // collateralTokenReceived: total collateralToken deposit bytes calldata loanDataBytes) external payable returns (uint256 newPrincipal, uint256 newCollateral); function getTotalPrincipal( address lender, address loanToken) external view returns (uint256); function withdrawAccruedInterest( address loanToken) external; function getLenderInterestData( address lender, address loanToken) external view returns ( uint256 interestPaid, uint256 interestPaidDate, uint256 interestOwedPerDay, uint256 interestUnPaid, uint256 interestFeePercent, uint256 principalTotal); function priceFeeds() external view returns (address); function getEstimatedMarginExposure( address loanToken, address collateralToken, uint256 loanTokenSent, uint256 collateralTokenSent, uint256 interestRate, uint256 newPrincipal) external view returns (uint256); function getRequiredCollateral( address loanToken, address collateralToken, uint256 newPrincipal, uint256 marginAmount, bool isTorqueLoan) external view returns (uint256 collateralAmountRequired); function getBorrowAmount( address loanToken, address collateralToken, uint256 collateralTokenAmount, uint256 marginAmount, bool isTorqueLoan) external view returns (uint256 borrowAmount); function isLoanPool( address loanPool) external view returns (bool); function lendingFeePercent() external view returns (uint256); } interface FeedsLike { function queryRate( address sourceTokenAddress, address destTokenAddress) external view returns (uint256 rate, uint256 precision); } contract ITokenHolderLike { function balanceOf(address _who) public view returns (uint256); function freeUpTo(uint256 value) public returns (uint256); function freeFromUpTo(address from, uint256 value) public returns (uint256); } contract GasTokenUser { ITokenHolderLike constant public gasToken = ITokenHolderLike(0x0000000000004946c0e9F43F4Dee607b0eF1fA1c); ITokenHolderLike constant public tokenHolder = ITokenHolderLike(0x55Eb3DD3f738cfdda986B8Eff3fa784477552C61); modifier usesGasToken(address holder) { if (holder == address(0)) { holder = address(tokenHolder); } if (gasToken.balanceOf(holder) != 0) { uint256 gasCalcValue = gasleft(); _; gasCalcValue = (_gasUsed(gasCalcValue) + 14154) / 41947; if (holder == address(tokenHolder)) { tokenHolder.freeUpTo( gasCalcValue ); } else { tokenHolder.freeFromUpTo( holder, gasCalcValue ); } } else { _; } } function _gasUsed( uint256 startingGas) internal view returns (uint256) { return 21000 + startingGas - gasleft() + 16 * msg.data.length; } } contract Pausable { // keccak256("Pausable_FunctionPause") bytes32 internal constant Pausable_FunctionPause = 0xa7143c84d793a15503da6f19bf9119a2dac94448ca45d77c8bf08f57b2e91047; modifier pausable(bytes4 sig) { require(!_isPaused(sig), "unauthorized"); _; } function _isPaused( bytes4 sig) internal view returns (bool isPaused) { bytes32 slot = keccak256(abi.encodePacked(sig, Pausable_FunctionPause)); assembly { isPaused := sload(slot) } } } contract LoanTokenBase is ReentrancyGuard, Ownable, Pausable { uint256 internal constant WEI_PRECISION = 10**18; uint256 internal constant WEI_PERCENT_PRECISION = 10**20; int256 internal constant sWEI_PRECISION = 10**18; string public name; string public symbol; uint8 public decimals; // uint88 for tight packing -> 8 + 88 + 160 = 256 uint88 internal lastSettleTime_; address public loanTokenAddress; uint256 public baseRate; uint256 public rateMultiplier; uint256 public lowUtilBaseRate; uint256 public lowUtilRateMultiplier; uint256 public targetLevel; uint256 public kinkLevel; uint256 public maxScaleRate; uint256 internal _flTotalAssetSupply; uint256 public checkpointSupply; uint256 public initialPrice; mapping (uint256 => bytes32) public loanParamsIds; // mapping of keccak256(collateralToken, isTorqueLoan) to loanParamsId mapping (address => uint256) internal checkpointPrices_; // price of token at last user checkpoint } contract AdvancedTokenStorage is LoanTokenBase { using SafeMath for uint256; event Transfer( address indexed from, address indexed to, uint256 value ); event Approval( address indexed owner, address indexed spender, uint256 value ); event Mint( address indexed minter, uint256 tokenAmount, uint256 assetAmount, uint256 price ); event Burn( address indexed burner, uint256 tokenAmount, uint256 assetAmount, uint256 price ); mapping(address => uint256) internal balances; mapping (address => mapping (address => uint256)) internal allowed; uint256 internal totalSupply_; function totalSupply() public view returns (uint256) { return totalSupply_; } function balanceOf( address _owner) public view returns (uint256) { return balances[_owner]; } function allowance( address _owner, address _spender) public view returns (uint256) { return allowed[_owner][_spender]; } } contract AdvancedToken is AdvancedTokenStorage { using SafeMath for uint256; function approve( address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } function increaseApproval( address _spender, uint256 _addedValue) public returns (bool) { uint256 _allowed = allowed[msg.sender][_spender] .add(_addedValue); allowed[msg.sender][_spender] = _allowed; emit Approval(msg.sender, _spender, _allowed); return true; } function decreaseApproval( address _spender, uint256 _subtractedValue) public returns (bool) { uint256 _allowed = allowed[msg.sender][_spender]; if (_subtractedValue >= _allowed) { _allowed = 0; } else { _allowed -= _subtractedValue; } allowed[msg.sender][_spender] = _allowed; emit Approval(msg.sender, _spender, _allowed); return true; } function _mint( address _to, uint256 _tokenAmount, uint256 _assetAmount, uint256 _price) internal returns (uint256) { require(_to != address(0), "15"); uint256 _balance = balances[_to] .add(_tokenAmount); balances[_to] = _balance; totalSupply_ = totalSupply_ .add(_tokenAmount); emit Mint(_to, _tokenAmount, _assetAmount, _price); emit Transfer(address(0), _to, _tokenAmount); return _balance; } function _burn( address _who, uint256 _tokenAmount, uint256 _assetAmount, uint256 _price) internal returns (uint256) { uint256 _balance = balances[_who].sub(_tokenAmount, "16"); // a rounding error may leave dust behind, so we clear this out if (_balance <= 10) { _tokenAmount = _tokenAmount.add(_balance); _balance = 0; } balances[_who] = _balance; totalSupply_ = totalSupply_.sub(_tokenAmount); emit Burn(_who, _tokenAmount, _assetAmount, _price); emit Transfer(_who, address(0), _tokenAmount); return _balance; } } contract LoanTokenLogicStandard is AdvancedToken, GasTokenUser { using SafeMath for uint256; using SignedSafeMath for int256; modifier settlesInterest() { _settleInterest(); _; } address internal target_; uint256 public constant VERSION = 6; address internal constant arbitraryCaller = 0x000F400e6818158D541C3EBE45FE3AA0d47372FF; address public constant bZxContract = 0xD8Ee69652E4e4838f2531732a46d1f7F584F0b7f; address public constant wethToken = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; bytes32 internal constant iToken_ProfitSoFar = 0x37aa2b7d583612f016e4a4de4292cb015139b3d7762663d06a53964912ea2fb6; // keccak256("iToken_ProfitSoFar") bytes32 internal constant iToken_LowerAdminAddress = 0x7ad06df6a0af6bd602d90db766e0d5f253b45187c3717a0f9026ea8b10ff0d4b; // keccak256("iToken_LowerAdminAddress") bytes32 internal constant iToken_LowerAdminContract = 0x34b31cff1dbd8374124bd4505521fc29cab0f9554a5386ba7d784a4e611c7e31; // keccak256("iToken_LowerAdminContract") constructor( address _newOwner) public { transferOwnership(_newOwner); } function() external { revert("fallback not allowed"); } /* Public functions */ function mint( address receiver, uint256 depositAmount) external nonReentrant returns (uint256) // mintAmount { return _mintToken( receiver, depositAmount ); } function burn( address receiver, uint256 burnAmount) external nonReentrant returns (uint256 loanAmountPaid) { loanAmountPaid = _burnToken( burnAmount ); if (loanAmountPaid != 0) { _safeTransfer(loanTokenAddress, receiver, loanAmountPaid, "5"); } } function flashBorrow( uint256 borrowAmount, address borrower, address target, string calldata signature, bytes calldata data) external payable nonReentrant pausable(msg.sig) settlesInterest returns (bytes memory) { require(borrowAmount != 0, "38"); // save before balances uint256 beforeEtherBalance = address(this).balance.sub(msg.value); uint256 beforeAssetsBalance = _underlyingBalance() .add(totalAssetBorrow()); // lock totalAssetSupply for duration of flash loan _flTotalAssetSupply = beforeAssetsBalance; // transfer assets to calling contract _safeTransfer(loanTokenAddress, borrower, borrowAmount, "39"); bytes memory callData; if (bytes(signature).length == 0) { callData = data; } else { callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data); } // arbitrary call (bool success, bytes memory returnData) = arbitraryCaller.call.value(msg.value)( abi.encodeWithSelector( 0xde064e0d, // sendCall(address,bytes) target, callData ) ); require(success, "call failed"); // unlock totalAssetSupply _flTotalAssetSupply = 0; // verifies return of flash loan require( address(this).balance >= beforeEtherBalance && _underlyingBalance() .add(totalAssetBorrow()) >= beforeAssetsBalance, "40" ); return returnData; } // ***** NOTE: Reentrancy is allowed here to allow flashloan use cases ***** function borrow( bytes32 loanId, // 0 if new loan uint256 withdrawAmount, uint256 initialLoanDuration, // duration in seconds uint256 collateralTokenSent, // if 0, loanId must be provided; any ETH sent must equal this value address collateralTokenAddress, // if address(0), this means ETH and ETH must be sent with the call or loanId must be provided address borrower, address receiver, bytes memory /*loanDataBytes*/) // arbitrary order data (for future use) public payable returns (uint256, uint256) // returns new principal and new collateral added to loan { return _borrow( loanId, withdrawAmount, initialLoanDuration, collateralTokenSent, collateralTokenAddress, borrower, receiver, "" ); } // ***** NOTE: Reentrancy is allowed here to allow flashloan use cases ***** function borrowWithGasToken( bytes32 loanId, // 0 if new loan uint256 withdrawAmount, uint256 initialLoanDuration, // duration in seconds uint256 collateralTokenSent, // if 0, loanId must be provided; any ETH sent must equal this value address collateralTokenAddress, // if address(0), this means ETH and ETH must be sent with the call or loanId must be provided address borrower, address receiver, address gasTokenUser, // specifies an address that has given spend approval for gas/chi token bytes memory /*loanDataBytes*/) // arbitrary order data (for future use) public payable usesGasToken(gasTokenUser) returns (uint256, uint256) // returns new principal and new collateral added to loan { return _borrow( loanId, withdrawAmount, initialLoanDuration, collateralTokenSent, collateralTokenAddress, borrower, receiver, "" ); } // Called to borrow and immediately get into a position // ***** NOTE: Reentrancy is allowed here to allow flashloan use cases ***** function marginTrade( bytes32 loanId, // 0 if new loan uint256 leverageAmount, uint256 loanTokenSent, uint256 collateralTokenSent, address collateralTokenAddress, address trader, bytes memory loanDataBytes) // arbitrary order data public payable returns (uint256, uint256) // returns new principal and new collateral added to trade { return _marginTrade( loanId, leverageAmount, loanTokenSent, collateralTokenSent, collateralTokenAddress, trader, loanDataBytes ); } // Called to borrow and immediately get into a position // ***** NOTE: Reentrancy is allowed here to allow flashloan use cases ***** function marginTradeWithGasToken( bytes32 loanId, // 0 if new loan uint256 leverageAmount, uint256 loanTokenSent, uint256 collateralTokenSent, address collateralTokenAddress, address trader, address gasTokenUser, // specifies an address that has given spend approval for gas/chi token bytes memory loanDataBytes) // arbitrary order data public payable usesGasToken(gasTokenUser) returns (uint256, uint256) // returns new principal and new collateral added to trade { return _marginTrade( loanId, leverageAmount, loanTokenSent, collateralTokenSent, collateralTokenAddress, trader, loanDataBytes ); } function transfer( address _to, uint256 _value) external returns (bool) { return _internalTransferFrom( msg.sender, _to, _value, uint256(-1) ); } function transferFrom( address _from, address _to, uint256 _value) external returns (bool) { return _internalTransferFrom( _from, _to, _value, allowed[_from][msg.sender] /*ProtocolLike(bZxContract).isLoanPool(msg.sender) ? uint256(-1) : allowed[_from][msg.sender]*/ ); } function _internalTransferFrom( address _from, address _to, uint256 _value, uint256 _allowanceAmount) internal returns (bool) { if (_allowanceAmount != uint256(-1)) { allowed[_from][msg.sender] = _allowanceAmount.sub(_value, "14"); } uint256 _balancesFrom = balances[_from]; uint256 _balancesTo = balances[_to]; require(_to != address(0), "15"); uint256 _balancesFromNew = _balancesFrom .sub(_value, "16"); balances[_from] = _balancesFromNew; uint256 _balancesToNew = _balancesTo .add(_value); balances[_to] = _balancesToNew; // handle checkpoint update uint256 _currentPrice = tokenPrice(); _updateCheckpoints( _from, _balancesFrom, _balancesFromNew, _currentPrice ); _updateCheckpoints( _to, _balancesTo, _balancesToNew, _currentPrice ); emit Transfer(_from, _to, _value); return true; } function _updateCheckpoints( address _user, uint256 _oldBalance, uint256 _newBalance, uint256 _currentPrice) internal { bytes32 slot = keccak256( abi.encodePacked(_user, iToken_ProfitSoFar) ); int256 _currentProfit; if (_newBalance == 0) { _currentPrice = 0; } else if (_oldBalance != 0) { _currentProfit = _profitOf( slot, _oldBalance, _currentPrice, checkpointPrices_[_user] ); } assembly { sstore(slot, _currentProfit) } checkpointPrices_[_user] = _currentPrice; } /* Public View functions */ function profitOf( address user) public view returns (int256) { bytes32 slot = keccak256( abi.encodePacked(user, iToken_ProfitSoFar) ); return _profitOf( slot, balances[user], tokenPrice(), checkpointPrices_[user] ); } function _profitOf( bytes32 slot, uint256 _balance, uint256 _currentPrice, uint256 _checkpointPrice) internal view returns (int256 profitSoFar) { if (_checkpointPrice == 0) { return 0; } assembly { profitSoFar := sload(slot) } profitSoFar = int256(_currentPrice) .sub(int256(_checkpointPrice)) .mul(int256(_balance)) .div(sWEI_PRECISION) .add(profitSoFar); } function tokenPrice() public view returns (uint256) // price { uint256 interestUnPaid; if (lastSettleTime_ != uint88(block.timestamp)) { (,interestUnPaid) = _getAllInterest(); } return _tokenPrice(_totalAssetSupply(interestUnPaid)); } function checkpointPrice( address _user) public view returns (uint256) // price { return checkpointPrices_[_user]; } function marketLiquidity() public view returns (uint256) { uint256 totalSupply = _totalAssetSupply(0); uint256 totalBorrow = totalAssetBorrow(); if (totalSupply > totalBorrow) { return totalSupply - totalBorrow; } } function avgBorrowInterestRate() public view returns (uint256) { return _avgBorrowInterestRate(totalAssetBorrow()); } // the minimum rate the next base protocol borrower will receive for variable-rate loans function borrowInterestRate() public view returns (uint256) { return _nextBorrowInterestRate(0); } function nextBorrowInterestRate( uint256 borrowAmount) public view returns (uint256) { return _nextBorrowInterestRate(borrowAmount); } // interest that lenders are currently receiving when supplying to the pool function supplyInterestRate() public view returns (uint256) { return totalSupplyInterestRate(_totalAssetSupply(0)); } function nextSupplyInterestRate( uint256 supplyAmount) public view returns (uint256) { return totalSupplyInterestRate(_totalAssetSupply(0).add(supplyAmount)); } function totalSupplyInterestRate( uint256 assetSupply) public view returns (uint256) { uint256 assetBorrow = totalAssetBorrow(); if (assetBorrow != 0) { return _supplyInterestRate( assetBorrow, assetSupply ); } } function totalAssetBorrow() public view returns (uint256) { return ProtocolLike(bZxContract).getTotalPrincipal( address(this), loanTokenAddress ); } function totalAssetSupply() public view returns (uint256) { uint256 interestUnPaid; if (lastSettleTime_ != uint88(block.timestamp)) { (,interestUnPaid) = _getAllInterest(); } return _totalAssetSupply(interestUnPaid); } function getMaxEscrowAmount( uint256 leverageAmount) public view returns (uint256) { uint256 initialMargin = SafeMath.div(WEI_PRECISION * WEI_PERCENT_PRECISION, leverageAmount); return marketLiquidity() .mul(initialMargin) .div(_adjustValue( WEI_PERCENT_PRECISION, // maximum possible interest (100%) 2419200, // 28 day duration for margin trades initialMargin)); } // returns the user's balance of underlying token function assetBalanceOf( address _owner) public view returns (uint256) { return balanceOf(_owner) .mul(tokenPrice()) .div(WEI_PRECISION); } function getEstimatedMarginDetails( uint256 leverageAmount, uint256 loanTokenSent, uint256 collateralTokenSent, address collateralTokenAddress) // address(0) means ETH public view returns (uint256 principal, uint256 collateral, uint256 interestRate) { if (collateralTokenAddress == address(0)) { collateralTokenAddress = wethToken; } uint256 totalDeposit = _totalDeposit( collateralTokenAddress, collateralTokenSent, loanTokenSent ); (principal, interestRate) = _getMarginBorrowAmountAndRate( leverageAmount, totalDeposit ); if (principal > _underlyingBalance()) { return (0, 0, 0); } loanTokenSent = loanTokenSent .add(principal); collateral = ProtocolLike(bZxContract).getEstimatedMarginExposure( loanTokenAddress, collateralTokenAddress, loanTokenSent, collateralTokenSent, interestRate, principal ); } function getDepositAmountForBorrow( uint256 borrowAmount, uint256 initialLoanDuration, // duration in seconds address collateralTokenAddress) // address(0) means ETH public view returns (uint256) // depositAmount { if (borrowAmount != 0) { (,,uint256 newBorrowAmount) = _getInterestRateAndBorrowAmount( borrowAmount, totalAssetSupply(), initialLoanDuration ); if (newBorrowAmount <= _underlyingBalance()) { return ProtocolLike(bZxContract).getRequiredCollateral( loanTokenAddress, collateralTokenAddress != address(0) ? collateralTokenAddress : wethToken, newBorrowAmount, 50 * WEI_PRECISION, // initialMargin true // isTorqueLoan ).add(10); // some dust to compensate for rounding errors } } } function getBorrowAmountForDeposit( uint256 depositAmount, uint256 initialLoanDuration, // duration in seconds address collateralTokenAddress) // address(0) means ETH public view returns (uint256 borrowAmount) { if (depositAmount != 0) { borrowAmount = ProtocolLike(bZxContract).getBorrowAmount( loanTokenAddress, collateralTokenAddress != address(0) ? collateralTokenAddress : wethToken, depositAmount, 50 * WEI_PRECISION, // initialMargin, true // isTorqueLoan ); (,,borrowAmount) = _getInterestRateAndBorrowAmount( borrowAmount, totalAssetSupply(), initialLoanDuration ); if (borrowAmount > _underlyingBalance()) { borrowAmount = 0; } } } /* Internal functions */ function _mintToken( address receiver, uint256 depositAmount) internal settlesInterest returns (uint256 mintAmount) { require (depositAmount != 0, "17"); uint256 currentPrice = _tokenPrice(_totalAssetSupply(0)); mintAmount = depositAmount .mul(WEI_PRECISION) .div(currentPrice); if (msg.value == 0) { _safeTransferFrom(loanTokenAddress, msg.sender, address(this), depositAmount, "18"); } else { require(msg.value == depositAmount, "18"); IWeth(wethToken).deposit.value(depositAmount)(); } _updateCheckpoints( receiver, balances[receiver], _mint(receiver, mintAmount, depositAmount, currentPrice), // newBalance currentPrice ); } function _burnToken( uint256 burnAmount) internal settlesInterest returns (uint256 loanAmountPaid) { require(burnAmount != 0, "19"); if (burnAmount > balanceOf(msg.sender)) { require(burnAmount == uint256(-1), "32"); burnAmount = balanceOf(msg.sender); } uint256 currentPrice = _tokenPrice(_totalAssetSupply(0)); uint256 loanAmountOwed = burnAmount .mul(currentPrice) .div(WEI_PRECISION); uint256 loanAmountAvailableInContract = _underlyingBalance(); loanAmountPaid = loanAmountOwed; require(loanAmountPaid <= loanAmountAvailableInContract, "37"); _updateCheckpoints( msg.sender, balances[msg.sender], _burn(msg.sender, burnAmount, loanAmountPaid, currentPrice), // newBalance currentPrice ); } function _borrow( bytes32 loanId, // 0 if new loan uint256 withdrawAmount, uint256 initialLoanDuration, // duration in seconds uint256 collateralTokenSent, // if 0, loanId must be provided; any ETH sent must equal this value address collateralTokenAddress, // if address(0), this means ETH and ETH must be sent with the call or loanId must be provided address borrower, address receiver, bytes memory /*loanDataBytes*/) // arbitrary order data (for future use) internal pausable(msg.sig) settlesInterest returns (uint256, uint256) // returns new principal and new collateral added to loan { require(withdrawAmount != 0, "6"); require(msg.value == 0 || msg.value == collateralTokenSent, "7"); require(collateralTokenSent != 0 || loanId != 0, "8"); require(collateralTokenAddress != address(0) || msg.value != 0 || loanId != 0, "9"); // ensures authorized use of existing loan require(loanId == 0 || msg.sender == borrower, "13"); if (collateralTokenAddress == address(0)) { collateralTokenAddress = wethToken; } require(collateralTokenAddress != loanTokenAddress, "10"); address[4] memory sentAddresses; uint256[5] memory sentAmounts; sentAddresses[0] = address(this); // lender sentAddresses[1] = borrower; sentAddresses[2] = receiver; //sentAddresses[3] = address(0); // manager //sentAmounts[0] = 0; // interestRate (found later) //sentAmounts[1] = 0; // borrowAmount (found later) //sentAmounts[2] = 0; // interestInitialAmount (found later) //sentAmounts[3] = 0; // loanTokenSent sentAmounts[4] = collateralTokenSent; // interestRate, interestInitialAmount, borrowAmount (newBorrowAmount) (sentAmounts[0], sentAmounts[2], sentAmounts[1]) = _getInterestRateAndBorrowAmount( withdrawAmount, _totalAssetSupply(0), // interest is settled above initialLoanDuration ); return _borrowOrTrade( loanId, withdrawAmount, 2 * WEI_PRECISION, // leverageAmount (translates to 150% margin for a Torque loan) collateralTokenAddress, sentAddresses, sentAmounts, "" // loanDataBytes ); } function _marginTrade( bytes32 loanId, // 0 if new loan uint256 leverageAmount, uint256 loanTokenSent, uint256 collateralTokenSent, address collateralTokenAddress, address trader, bytes memory loanDataBytes) internal pausable(msg.sig) settlesInterest returns (uint256, uint256) // returns new principal and new collateral added to trade { // ensures authorized use of existing loan require(loanId == 0 || msg.sender == trader, "13"); if (collateralTokenAddress == address(0)) { collateralTokenAddress = wethToken; } require(collateralTokenAddress != loanTokenAddress, "11"); uint256 totalDeposit = _totalDeposit( collateralTokenAddress, collateralTokenSent, loanTokenSent ); require(totalDeposit != 0, "12"); address[4] memory sentAddresses; uint256[5] memory sentAmounts; sentAddresses[0] = address(this); // lender sentAddresses[1] = trader; sentAddresses[2] = trader; //sentAddresses[3] = address(0); // manager //sentAmounts[0] = 0; // interestRate (found later) //sentAmounts[1] = 0; // borrowAmount (found later) //sentAmounts[2] = 0; // interestInitialAmount (interest is calculated based on fixed-term loan) sentAmounts[3] = loanTokenSent; sentAmounts[4] = collateralTokenSent; (sentAmounts[1], sentAmounts[0]) = _getMarginBorrowAmountAndRate( // borrowAmount, interestRate leverageAmount, totalDeposit ); return _borrowOrTrade( loanId, 0, // withdrawAmount leverageAmount, collateralTokenAddress, sentAddresses, sentAmounts, loanDataBytes ); } function _settleInterest() internal { uint88 ts = uint88(block.timestamp); if (lastSettleTime_ != ts) { ProtocolLike(bZxContract).withdrawAccruedInterest( loanTokenAddress ); lastSettleTime_ = ts; } } function _totalDeposit( address collateralTokenAddress, uint256 collateralTokenSent, uint256 loanTokenSent) internal view returns (uint256 totalDeposit) { totalDeposit = loanTokenSent; if (collateralTokenSent != 0) { (uint256 sourceToDestRate, uint256 sourceToDestPrecision) = FeedsLike(ProtocolLike(bZxContract).priceFeeds()).queryRate( collateralTokenAddress, loanTokenAddress ); if (sourceToDestRate != 0) { totalDeposit = collateralTokenSent .mul(sourceToDestRate) .div(sourceToDestPrecision) .add(totalDeposit); } } } function _getInterestRateAndBorrowAmount( uint256 borrowAmount, uint256 assetSupply, uint256 initialLoanDuration) // duration in seconds internal view returns (uint256 interestRate, uint256 interestInitialAmount, uint256 newBorrowAmount) { interestRate = _nextBorrowInterestRate2( borrowAmount, assetSupply ); // newBorrowAmount = borrowAmount * 10^18 / (10^18 - (interestRate * initialLoanDuration * 10^18 / (31536000 * 10^20))) newBorrowAmount = borrowAmount .mul(WEI_PRECISION) .div( SafeMath.sub(WEI_PRECISION, interestRate .mul(initialLoanDuration) .mul(WEI_PRECISION) .div(31536000 * WEI_PERCENT_PRECISION) // 365 * 86400 * WEI_PERCENT_PRECISION ) ); interestInitialAmount = newBorrowAmount .sub(borrowAmount); } // returns newPrincipal function _borrowOrTrade( bytes32 loanId, uint256 withdrawAmount, uint256 leverageAmount, address collateralTokenAddress, address[4] memory sentAddresses, uint256[5] memory sentAmounts, bytes memory loanDataBytes) internal returns (uint256, uint256) { require (sentAmounts[1] <= _underlyingBalance() && // newPrincipal sentAddresses[1] != address(0), // borrower "24" ); if (sentAddresses[2] == address(0)) { sentAddresses[2] = sentAddresses[1]; // receiver = borrower } // handle transfers prior to adding newPrincipal to loanTokenSent uint256 msgValue = _verifyTransfers( collateralTokenAddress, sentAddresses, sentAmounts, withdrawAmount ); // adding the loan token portion from the lender to loanTokenSent sentAmounts[3] = sentAmounts[3] .add(sentAmounts[1]); // newPrincipal if (withdrawAmount != 0) { // withdrawAmount already sent to the borrower, so we aren't sending it to the protocol sentAmounts[3] = sentAmounts[3] .sub(withdrawAmount); } bool isTorqueLoan = withdrawAmount != 0 ? true : false; bytes32 loanParamsId = loanParamsIds[uint256(keccak256(abi.encodePacked( collateralTokenAddress, isTorqueLoan )))]; // converting to initialMargin leverageAmount = SafeMath.div(WEI_PRECISION * WEI_PERCENT_PRECISION, leverageAmount); (sentAmounts[1], sentAmounts[4]) = ProtocolLike(bZxContract).borrowOrTradeFromPool.value(msgValue)( // newPrincipal, newCollateral loanParamsId, loanId, isTorqueLoan, leverageAmount, // initialMargin sentAddresses, sentAmounts, loanDataBytes ); require (sentAmounts[1] != 0, "25"); return (sentAmounts[1], sentAmounts[4]); // newPrincipal, newCollateral } // sentAddresses[0]: lender // sentAddresses[1]: borrower // sentAddresses[2]: receiver // sentAddresses[3]: manager // sentAmounts[0]: interestRate // sentAmounts[1]: newPrincipal // sentAmounts[2]: interestInitialAmount // sentAmounts[3]: loanTokenSent // sentAmounts[4]: collateralTokenSent function _verifyTransfers( address collateralTokenAddress, address[4] memory sentAddresses, uint256[5] memory sentAmounts, uint256 withdrawalAmount) internal returns (uint256 msgValue) { address _wethToken = wethToken; address _loanTokenAddress = loanTokenAddress; address receiver = sentAddresses[2]; uint256 newPrincipal = sentAmounts[1]; uint256 loanTokenSent = sentAmounts[3]; uint256 collateralTokenSent = sentAmounts[4]; require(_loanTokenAddress != collateralTokenAddress, "26"); msgValue = msg.value; if (withdrawalAmount != 0) { // withdrawOnOpen == true _safeTransfer(_loanTokenAddress, receiver, withdrawalAmount, "27"); if (newPrincipal > withdrawalAmount) { _safeTransfer(_loanTokenAddress, bZxContract, newPrincipal - withdrawalAmount, "27"); } } else { _safeTransfer(_loanTokenAddress, bZxContract, newPrincipal, "27"); } if (collateralTokenSent != 0) { if (collateralTokenAddress == _wethToken && msgValue != 0 && msgValue >= collateralTokenSent) { IWeth(_wethToken).deposit.value(collateralTokenSent)(); _safeTransfer(collateralTokenAddress, bZxContract, collateralTokenSent, "28"); msgValue -= collateralTokenSent; } else { _safeTransferFrom(collateralTokenAddress, msg.sender, bZxContract, collateralTokenSent, "28"); } } if (loanTokenSent != 0) { _safeTransferFrom(_loanTokenAddress, msg.sender, bZxContract, loanTokenSent, "29"); } } function _safeTransfer( address token, address to, uint256 amount, string memory errorMsg) internal { _callOptionalReturn( token, abi.encodeWithSelector(IERC20(token).transfer.selector, to, amount), errorMsg ); } function _safeTransferFrom( address token, address from, address to, uint256 amount, string memory errorMsg) internal { _callOptionalReturn( token, abi.encodeWithSelector(IERC20(token).transferFrom.selector, from, to, amount), errorMsg ); } function _callOptionalReturn( address token, bytes memory data, string memory errorMsg) internal { (bool success, bytes memory returndata) = token.call(data); require(success, errorMsg); if (returndata.length != 0) { require(abi.decode(returndata, (bool)), errorMsg); } } function _underlyingBalance() internal view returns (uint256) { return IERC20(loanTokenAddress).balanceOf(address(this)); } /* Internal View functions */ function _tokenPrice( uint256 assetSupply) internal view returns (uint256) { uint256 totalTokenSupply = totalSupply_; return totalTokenSupply != 0 ? assetSupply .mul(WEI_PRECISION) .div(totalTokenSupply) : initialPrice; } function _avgBorrowInterestRate( uint256 assetBorrow) internal view returns (uint256) { if (assetBorrow != 0) { (uint256 interestOwedPerDay,) = _getAllInterest(); return interestOwedPerDay .mul(365 * WEI_PERCENT_PRECISION) .div(assetBorrow); } } // next supply interest adjustment function _supplyInterestRate( uint256 assetBorrow, uint256 assetSupply) internal view returns (uint256) { if (assetBorrow != 0 && assetSupply >= assetBorrow) { return _avgBorrowInterestRate(assetBorrow) .mul(_utilizationRate(assetBorrow, assetSupply)) .mul(SafeMath.sub(WEI_PERCENT_PRECISION, ProtocolLike(bZxContract).lendingFeePercent())) .div(WEI_PERCENT_PRECISION * WEI_PERCENT_PRECISION); } } function _nextBorrowInterestRate( uint256 borrowAmount) internal view returns (uint256) { uint256 interestUnPaid; if (borrowAmount != 0) { if (lastSettleTime_ != uint88(block.timestamp)) { (,interestUnPaid) = _getAllInterest(); } uint256 balance = _underlyingBalance() .add(interestUnPaid); if (borrowAmount > balance) { borrowAmount = balance; } } return _nextBorrowInterestRate2( borrowAmount, _totalAssetSupply(interestUnPaid) ); } function _nextBorrowInterestRate2( uint256 newBorrowAmount, uint256 assetSupply) internal view returns (uint256 nextRate) { uint256 utilRate = _utilizationRate( totalAssetBorrow().add(newBorrowAmount), assetSupply ); uint256 thisMinRate; uint256 thisMaxRate; uint256 thisBaseRate = baseRate; uint256 thisRateMultiplier = rateMultiplier; uint256 thisTargetLevel = targetLevel; uint256 thisKinkLevel = kinkLevel; uint256 thisMaxScaleRate = maxScaleRate; if (utilRate < thisTargetLevel) { // target targetLevel utilization when utilization is under targetLevel utilRate = thisTargetLevel; } if (utilRate > thisKinkLevel) { // scale rate proportionally up to 100% uint256 thisMaxRange = WEI_PERCENT_PRECISION - thisKinkLevel; // will not overflow utilRate -= thisKinkLevel; if (utilRate > thisMaxRange) utilRate = thisMaxRange; thisMaxRate = thisRateMultiplier .add(thisBaseRate) .mul(thisKinkLevel) .div(WEI_PERCENT_PRECISION); nextRate = utilRate .mul(SafeMath.sub(thisMaxScaleRate, thisMaxRate)) .div(thisMaxRange) .add(thisMaxRate); } else { nextRate = utilRate .mul(thisRateMultiplier) .div(WEI_PERCENT_PRECISION) .add(thisBaseRate); thisMinRate = thisBaseRate; thisMaxRate = thisRateMultiplier .add(thisBaseRate); if (nextRate < thisMinRate) nextRate = thisMinRate; else if (nextRate > thisMaxRate) nextRate = thisMaxRate; } } function _getAllInterest() internal view returns ( uint256 interestOwedPerDay, uint256 interestUnPaid) { // interestPaid, interestPaidDate, interestOwedPerDay, interestUnPaid, interestFeePercent, principalTotal uint256 interestFeePercent; (,,interestOwedPerDay,interestUnPaid,interestFeePercent,) = ProtocolLike(bZxContract).getLenderInterestData( address(this), loanTokenAddress ); interestUnPaid = interestUnPaid .mul(SafeMath.sub(WEI_PERCENT_PRECISION, interestFeePercent)) .div(WEI_PERCENT_PRECISION); } function _getMarginBorrowAmountAndRate( uint256 leverageAmount, uint256 depositAmount) internal view returns (uint256 borrowAmount, uint256 interestRate) { uint256 initialMargin = SafeMath.div(WEI_PRECISION * WEI_PERCENT_PRECISION, leverageAmount); interestRate = _nextBorrowInterestRate2( depositAmount .mul(WEI_PERCENT_PRECISION) .div(initialMargin), _totalAssetSupply(0) ); // assumes that loan, collateral, and interest token are the same borrowAmount = depositAmount .mul(WEI_PERCENT_PRECISION * WEI_PERCENT_PRECISION) .div(_adjustValue( interestRate, 2419200, // 28 day duration for margin trades initialMargin)) .div(initialMargin); } function _totalAssetSupply( uint256 interestUnPaid) internal view returns (uint256) // assetSupply { if (totalSupply_ != 0) { uint256 assetsBalance = _flTotalAssetSupply; // temporary locked totalAssetSupply during a flash loan transaction if (assetsBalance == 0) { assetsBalance = _underlyingBalance() .add(totalAssetBorrow()); } return assetsBalance .add(interestUnPaid); } } function _adjustValue( uint256 interestRate, uint256 maxDuration, uint256 marginAmount) internal pure returns (uint256) { return maxDuration != 0 ? interestRate .mul(WEI_PERCENT_PRECISION) .mul(maxDuration) .div(31536000) // 86400 * 365 .div(marginAmount) .add(WEI_PERCENT_PRECISION) : WEI_PERCENT_PRECISION; } function _utilizationRate( uint256 assetBorrow, uint256 assetSupply) internal pure returns (uint256) { if (assetBorrow != 0 && assetSupply != 0) { // U = total_borrow / total_supply return assetBorrow .mul(WEI_PERCENT_PRECISION) .div(assetSupply); } } /* Owner-Only functions */ function updateSettings( address settingsTarget, bytes memory callData) public { if (msg.sender != owner()) { address _lowerAdmin; address _lowerAdminContract; assembly { _lowerAdmin := sload(iToken_LowerAdminAddress) _lowerAdminContract := sload(iToken_LowerAdminContract) } require(msg.sender == _lowerAdmin && settingsTarget == _lowerAdminContract); } address currentTarget = target_; target_ = settingsTarget; (bool result,) = address(this).call(callData); uint256 size; uint256 ptr; assembly { size := returndatasize ptr := mload(0x40) returndatacopy(ptr, 0, size) if eq(result, 0) { revert(ptr, size) } } target_ = currentTarget; assembly { return(ptr, size) } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"assetAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"assetAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":false,"stateMutability":"nonpayable","type":"fallback"},{"constant":true,"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"assetBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"avgBorrowInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bZxContract","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"loanId","type":"bytes32"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"},{"internalType":"uint256","name":"initialLoanDuration","type":"uint256"},{"internalType":"uint256","name":"collateralTokenSent","type":"uint256"},{"internalType":"address","name":"collateralTokenAddress","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"borrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"borrowInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"loanId","type":"bytes32"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"},{"internalType":"uint256","name":"initialLoanDuration","type":"uint256"},{"internalType":"uint256","name":"collateralTokenSent","type":"uint256"},{"internalType":"address","name":"collateralTokenAddress","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"gasTokenUser","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"borrowWithGasToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"burnAmount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"uint256","name":"loanAmountPaid","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"checkpointPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"checkpointSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashBorrow","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"gasToken","outputs":[{"internalType":"contract ITokenHolderLike","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"initialLoanDuration","type":"uint256"},{"internalType":"address","name":"collateralTokenAddress","type":"address"}],"name":"getBorrowAmountForDeposit","outputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"internalType":"uint256","name":"initialLoanDuration","type":"uint256"},{"internalType":"address","name":"collateralTokenAddress","type":"address"}],"name":"getDepositAmountForBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"leverageAmount","type":"uint256"},{"internalType":"uint256","name":"loanTokenSent","type":"uint256"},{"internalType":"uint256","name":"collateralTokenSent","type":"uint256"},{"internalType":"address","name":"collateralTokenAddress","type":"address"}],"name":"getEstimatedMarginDetails","outputs":[{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"interestRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"leverageAmount","type":"uint256"}],"name":"getMaxEscrowAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"kinkLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"loanParamsIds","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"loanTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lowUtilBaseRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lowUtilRateMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"loanId","type":"bytes32"},{"internalType":"uint256","name":"leverageAmount","type":"uint256"},{"internalType":"uint256","name":"loanTokenSent","type":"uint256"},{"internalType":"uint256","name":"collateralTokenSent","type":"uint256"},{"internalType":"address","name":"collateralTokenAddress","type":"address"},{"internalType":"address","name":"trader","type":"address"},{"internalType":"bytes","name":"loanDataBytes","type":"bytes"}],"name":"marginTrade","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"loanId","type":"bytes32"},{"internalType":"uint256","name":"leverageAmount","type":"uint256"},{"internalType":"uint256","name":"loanTokenSent","type":"uint256"},{"internalType":"uint256","name":"collateralTokenSent","type":"uint256"},{"internalType":"address","name":"collateralTokenAddress","type":"address"},{"internalType":"address","name":"trader","type":"address"},{"internalType":"address","name":"gasTokenUser","type":"address"},{"internalType":"bytes","name":"loanDataBytes","type":"bytes"}],"name":"marginTradeWithGasToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"marketLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxScaleRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"depositAmount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"}],"name":"nextBorrowInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"supplyAmount","type":"uint256"}],"name":"nextSupplyInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"profitOf","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rateMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"supplyInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"targetLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenHolder","outputs":[{"internalType":"contract ITokenHolderLike","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalAssetBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalAssetSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"assetSupply","type":"uint256"}],"name":"totalSupplyInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"settingsTarget","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"name":"updateSettings","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wethToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260016000553480156200001657600080fd5b5060405162004fc838038062004fc88339810160408190526200003991620001b4565b60006200004e6001600160e01b03620000a616565b600180546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062004fa8833981519152908290a3506200009f816001600160e01b03620000aa16565b50620002a7565b3390565b620000bd6001600160e01b03620000fc16565b620000e55760405162461bcd60e51b8152600401620000dc9062000263565b60405180910390fd5b620000f9816001600160e01b036200012d16565b50565b6001546000906001600160a01b03166200011e6001600160e01b03620000a616565b6001600160a01b031614905090565b6001600160a01b038116620001565760405162461bcd60e51b8152600401620000dc9062000251565b6001546040516001600160a01b0380841692169060008051602062004fa883398151915290600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b8051620001ae8162000290565b92915050565b600060208284031215620001c757600080fd5b6000620001d58484620001a1565b949350505050565b6000620001ec60268362000275565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600062000236600c8362000275565b6b1d5b985d5d1a1bdc9a5e995960a21b815260200192915050565b60208082528101620001ae81620001dd565b60208082528101620001ae8162000227565b90815260200190565b60006001600160a01b038216620001ae565b6200029b816200027e565b8114620000f957600080fd5b614cf180620002b76000396000f3fe6080604052600436106103505760003560e01c80636b40cd40116101c65780639dc29fac116100f7578063d73dd62311610095578063eebc50811161006f578063eebc5081146108f5578063ef2b0b3914610915578063f2fde38b1461092a578063ffa1ad741461094a57610350565b8063d73dd623146108a0578063d759dbeb146108c0578063dd62ed3e146108d557610350565b8063ba0e43bf116100d1578063ba0e43bf14610843578063c5bf0e9d14610858578063c91d59fe1461086b578063d65a50211461088057610350565b80639dc29fac146107e3578063a9059cbb14610803578063b9fe1a8f1461082357610350565b80638325a1c0116101645780638f32d59b1161013e5780638f32d59b1461078f5780638fb807c5146107a457806395d89b41146107b9578063995363d3146107ce57610350565b80638325a1c014610752578063890a62a0146107675780638da5cb5b1461077a57610350565b80637b7933b4116101a05780637b7933b4146106f35780637e37c08c146107085780637ff9b5961461071d578063829b38f41461073257610350565b80636b40cd401461068f57806370a08231146106be578063797bf385146106de57610350565b80632ea295fa116102a057806344a4a0031161023e57806356e07d701161021857806356e07d7014610625578063612ef80b1461063a578063631a3ef81461064f578063661884631461066f57610350565b806344a4a003146105ce5780634b57b0be146105e357806354198ce91461060557610350565b8063330691ac1161027a578063330691ac146105645780633885daf81461057957806340c10f191461058c578063420a83e7146105ac57610350565b80632ea295fa1461050f578063313ce567146105225780633291c11a1461054457610350565b806314dfe7921161030d5780631f68f20a116102e75780631f68f20a146104a357806320f6d07c146104b857806323b872dd146104cd578063284e2f56146104ed57610350565b806314dfe7921461045857806318160ddd146104795780631d0806ae1461048e57610350565b8063047979301461037e57806306b3efd6146103b457806306fdde03146103d4578063095ea7b3146103f657806309ec6b6b146104235780631241689814610438575b34801561035c57600080fd5b5060405162461bcd60e51b815260040161037590614a8f565b60405180910390fd5b34801561038a57600080fd5b5061039e610399366004613ed9565b61095f565b6040516103ab9190614881565b60405180910390f35b3480156103c057600080fd5b5061039e6103cf366004613a0e565b610a6b565b3480156103e057600080fd5b506103e9610aad565b6040516103ab9190614900565b34801561040257600080fd5b50610416610411366004613b19565b610b38565b6040516103ab9190614873565b34801561042f57600080fd5b5061039e610ba3565b34801561044457600080fd5b5061039e610453366004613dbf565b610bb8565b61046b610466366004613d0b565b610be3565b6040516103ab929190614b0f565b34801561048557600080fd5b5061039e610c05565b34801561049a57600080fd5b5061039e610c0b565b3480156104af57600080fd5b5061039e610c11565b3480156104c457600080fd5b5061039e610c17565b3480156104d957600080fd5b506104166104e8366004613a84565b610cae565b3480156104f957600080fd5b5061050d610508366004613ad1565b610ce9565b005b61046b61051d366004613c43565b610e2f565b34801561052e57600080fd5b50610537610e62565b6040516103ab9190614b38565b34801561055057600080fd5b5061039e61055f366004613dbf565b610e6b565b34801561057057600080fd5b5061039e610e7d565b61046b610587366004613c43565b610e83565b34801561059857600080fd5b5061039e6105a7366004613b19565b6110cd565b3480156105b857600080fd5b506105c161110e565b6040516103ab9190614911565b3480156105da57600080fd5b5061039e611126565b3480156105ef57600080fd5b506105f8611138565b6040516103ab9190614741565b34801561061157600080fd5b5061039e610620366004613a0e565b611150565b34801561063157600080fd5b5061039e6111f1565b34801561064657600080fd5b5061039e6111f7565b34801561065b57600080fd5b5061039e61066a366004613ed9565b611228565b34801561067b57600080fd5b5061041661068a366004613b19565b611349565b34801561069b57600080fd5b506106af6106aa366004613f1c565b6113ec565b6040516103ab93929190614b1d565b3480156106ca57600080fd5b5061039e6106d9366004613a0e565b611510565b3480156106ea57600080fd5b506105f861152b565b3480156106ff57600080fd5b5061039e611541565b34801561071457600080fd5b5061039e611547565b34801561072957600080fd5b5061039e61154d565b34801561073e57600080fd5b5061039e61074d366004613dbf565b6115a1565b34801561075e57600080fd5b5061039e6115e6565b61046b610775366004613b67565b6115f2565b34801561078657600080fd5b506105f861185d565b34801561079b57600080fd5b5061041661186c565b3480156107b057600080fd5b5061039e611892565b3480156107c557600080fd5b506103e96118d8565b3480156107da57600080fd5b506105f8611933565b3480156107ef57600080fd5b5061039e6107fe366004613b19565b611945565b34801561080f57600080fd5b5061041661081e366004613b19565b6119b9565b34801561082f57600080fd5b5061039e61083e366004613dbf565b6119c9565b34801561084f57600080fd5b5061039e6119d4565b6103e9610866366004613dfb565b6119da565b34801561087757600080fd5b506105c1611c71565b34801561088c57600080fd5b5061039e61089b366004613dbf565b611c83565b3480156108ac57600080fd5b506104166108bb366004613b19565b611c96565b3480156108cc57600080fd5b5061039e611d27565b3480156108e157600080fd5b5061039e6108f0366004613a4a565b611d2d565b34801561090157600080fd5b5061039e610910366004613a0e565b611d58565b34801561092157600080fd5b5061039e611d73565b34801561093657600080fd5b5061050d610945366004613a0e565b611d79565b34801561095657600080fd5b5061039e611da9565b60008315610a6457600454600080516020614c8f8339815191529063e762319f90600160601b90046001600160a01b039081169085166109b35773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26109b5565b845b6040516001600160e01b031960e085901b1681526109e792919089906802b5e3af16b188000090600190600401614792565b60206040518083038186803b1580156109ff57600080fd5b505afa158015610a13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a379190810190613ddd565b9050610a4b81610a45611892565b85611dae565b9250610a599150611e2c9050565b811115610a64575060005b9392505050565b6000610aa5670de0b6b3a7640000610a99610a8461154d565b610a8d86611510565b9063ffffffff611e6416565b9063ffffffff611e9e16565b90505b919050565b6002805460408051602060018416156101000260001901909316849004601f81018490048402820184019092528181529291830182828015610b305780601f10610b0557610100808354040283529160200191610b30565b820191906000526020600020905b815481529060010190602001808311610b1357829003601f168201915b505050505081565b3360008181526012602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610b91908690614881565b60405180910390a35060015b92915050565b6000610bb26104536000611ee0565b90505b90565b600080610bc3610c17565b90508015610bdd57610bd58184611f12565b915050610aa8565b50919050565b600080610bf589898989898989611fe3565b9150915097509795505050505050565b60135490565b600e5481565b60055481565b6004805460405163250f447f60e11b8152600092600080516020614c8f83398151915292634a1e88fe92610c5e923092600160601b90046001600160a01b0316910161474f565b60206040518083038186803b158015610c7657600080fd5b505afa158015610c8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bb29190810190613ddd565b6001600160a01b0383166000908152601260209081526040808320338452909152812054610ce190859085908590612145565b949350505050565b610cf161185d565b6001600160a01b0316336001600160a01b031614610d82577f7ad06df6a0af6bd602d90db766e0d5f253b45187c3717a0f9026ea8b10ff0d4b547f34b31cff1dbd8374124bd4505521fc29cab0f9554a5386ba7d784a4e611c7e3154336001600160a01b038316148015610d765750806001600160a01b0316846001600160a01b0316145b610d7f57600080fd5b50505b601480546001600160a01b038481166001600160a01b03198316179092556040519116906000903090610db6908590614735565b6000604051808303816000865af19150503d8060008114610df3576040519150601f19603f3d011682016040523d82523d6000602084013e610df8565b606091505b50506040519091503d90816000823e82610e10578181fd5b601480546001600160a01b0319166001600160a01b0386161790558181f35b600080610e518a8a8a8a8a8a8a604051806020016040528060008152506122dc565b915091509850989650505050505050565b60045460ff1681565b600f6020526000908152604090205481565b60065481565b600080836001600160a01b038116610eac57507355eb3dd3f738cfdda986b8eff3fa784477552c615b6040516370a0823160e01b81526d4946c0e9f43f4dee607b0ef1fa1c906370a0823190610edd908490600401614741565b60206040518083038186803b158015610ef557600080fd5b505afa158015610f09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f2d9190810190613ddd565b156110ab5760005a9050610f468c8c8c8c8c8c8b611fe3565b9350935061a3db610f56826124e6565b61374a0181610f6157fe5b0490506001600160a01b0382167355eb3dd3f738cfdda986b8eff3fa784477552c611415611018576040516331b35c9b60e11b81527355eb3dd3f738cfdda986b8eff3fa784477552c6190636366b93690610fc0908490600401614881565b602060405180830381600087803b158015610fda57600080fd5b505af1158015610fee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110129190810190613ddd565b506110a5565b60405163079d229f60e01b81527355eb3dd3f738cfdda986b8eff3fa784477552c619063079d229f906110519085908590600401614858565b602060405180830381600087803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110a39190810190613ddd565b505b506110bf565b6110ba8b8b8b8b8b8b8a611fe3565b925092505b509850989650505050505050565b60006001600054146110f15760405162461bcd60e51b815260040161037590614aaf565b600260005561110083836124fb565b90505b600160005592915050565b7355eb3dd3f738cfdda986b8eff3fa784477552c6181565b6000610bb2611133610c17565b612657565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b600080827f37aa2b7d583612f016e4a4de4292cb015139b3d7762663d06a53964912ea2fb660001b6040516020016111899291906146c9565b604051602081830303815290604052805190602001209050610a648160116000866001600160a01b03166001600160a01b03168152602001908152602001600020546111d361154d565b6001600160a01b03871660009081526010602052604090205461268a565b600a5481565b6000806112046000611ee0565b90506000611210610c17565b9050808211156112235790039050610bb5565b505090565b60008315610a645760006112448561123e611892565b86611dae565b92505050611250611e2c565b81116113415760045461133990600a90600080516020614c8f833981519152906325decac090600160601b90046001600160a01b039081169088166112a95773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26112ab565b875b6040516001600160e01b031960e085901b1681526112dd92919088906802b5e3af16b188000090600190600401614792565b60206040518083038186803b1580156112f557600080fd5b505afa158015611309573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061132d9190810190613ddd565b9063ffffffff6126ed16565b915050610a64565b509392505050565b3360009081526012602090815260408083206001600160a01b038616845290915281205480831061137c57506000611380565b8290035b3360008181526012602090815260408083206001600160a01b03891680855292529182902084905590519091907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906113da908590614881565b60405180910390a35060019392505050565b600080806001600160a01b0384166114165773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc293505b6000611423858789612712565b905061142f8882612855565b909450915061143c611e2c565b841115611453575060009250829150819050611506565b611463878563ffffffff6126ed16565b6004805460405163d67f707760e01b8152929950600080516020614c8f8339815191529263d67f7077926114b292600160601b90046001600160a01b0316918a918d918d918a918d91016147de565b60206040518083038186803b1580156114ca57600080fd5b505afa1580156114de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115029190810190613ddd565b9250505b9450945094915050565b6001600160a01b031660009081526011602052604090205490565b600454600160601b90046001600160a01b031681565b600d5481565b60085481565b600080426001600160581b0316600460019054906101000a90046001600160581b03166001600160581b03161461158a576115866128e6565b9150505b61159b61159682611ee0565b6129bc565b91505090565b6000806115be6f4b3b4ca85a86c47a098a22400000000084611e9e565b9050610a646115da68056bc75e2d631000006224ea00846129eb565b610a9983610a8d6111f7565b6000610bb26000612a2c565b600080836001600160a01b03811661161b57507355eb3dd3f738cfdda986b8eff3fa784477552c615b6040516370a0823160e01b81526d4946c0e9f43f4dee607b0ef1fa1c906370a082319061164c908490600401614741565b60206040518083038186803b15801561166457600080fd5b505afa158015611678573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061169c9190810190613ddd565b1561182a5760005a90506116c58d8d8d8d8d8d8d604051806020016040528060008152506122dc565b9350935061a3db6116d5826124e6565b61374a01816116e057fe5b0490506001600160a01b0382167355eb3dd3f738cfdda986b8eff3fa784477552c611415611797576040516331b35c9b60e11b81527355eb3dd3f738cfdda986b8eff3fa784477552c6190636366b9369061173f908490600401614881565b602060405180830381600087803b15801561175957600080fd5b505af115801561176d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117919190810190613ddd565b50611824565b60405163079d229f60e01b81527355eb3dd3f738cfdda986b8eff3fa784477552c619063079d229f906117d09085908590600401614858565b602060405180830381600087803b1580156117ea57600080fd5b505af11580156117fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118229190810190613ddd565b505b5061184e565b6118498c8c8c8c8c8c8c604051806020016040528060008152506122dc565b925092505b50995099975050505050505050565b6001546001600160a01b031690565b6001546000906001600160a01b0316611883612a87565b6001600160a01b031614905090565b600080426001600160581b0316600460019054906101000a90046001600160581b03166001600160581b0316146118cf576118cb6128e6565b9150505b61159b81611ee0565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b305780601f10610b0557610100808354040283529160200191610b30565b600080516020614c8f83398151915281565b60006001600054146119695760405162461bcd60e51b815260040161037590614aaf565b600260005561197782612a8b565b90508015611103576111036004600c9054906101000a90046001600160a01b03168483604051806040016040528060018152602001603560f81b815250612b7e565b6000610a64338484600019612145565b6000610aa582612a2c565b60095481565b60606001600054146119fe5760405162461bcd60e51b815260040161037590614aaf565b60026000908155356001600160e01b031916611a1981612bde565b15611a365760405162461bcd60e51b815260040161037590614a3f565b611a3e612c37565b88611a5b5760405162461bcd60e51b815260040161037590614abf565b6000611a6d473463ffffffff612cf116565b90506000611a84611a7c610c17565b61132d611e2c565b905080600c81905550611ac86004600c9054906101000a90046001600160a01b03168b8d60405180604001604052806002815260200161333960f01b815250612b7e565b606087611b0e5786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350611b4992505050565b8888604051611b1e929190614728565b604051908190038120611b37918990899060200161470b565b60405160208183030381529060405290505b60006060720f400e6818158d541c3ebe45fe3aa0d47372ff6001600160a01b03163463de064e0d8e86604051602401611b83929190614838565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611bbc9190614735565b60006040518083038185875af1925050503d8060008114611bf9576040519150601f19603f3d011682016040523d82523d6000602084013e611bfe565b606091505b509150915081611c205760405162461bcd60e51b815260040161037590614a6f565b6000600c55478511801590611c3f575083611c3c611a7c610c17565b10155b611c5b5760405162461bcd60e51b8152600401610375906149ef565b60016000559d9c50505050505050505050505050565b6d4946c0e9f43f4dee607b0ef1fa1c81565b6000610aa56104538361132d6000611ee0565b3360009081526012602090815260408083206001600160a01b03861684529091528120548190611ccc908463ffffffff6126ed16565b3360008181526012602090815260408083206001600160a01b038a168085529252918290208490559051929350917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906113da908590614881565b60075481565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b6001600160a01b031660009081526010602052604090205490565b600b5481565b611d8161186c565b611d9d5760405162461bcd60e51b815260040161037590614a3f565b611da681612d33565b50565b600681565b6000806000611dbd8686612db5565b9250611e0f611df7670de0b6b3a7640000611df26b0a3098c68eb9427db8000000610a9983610a8d8a8c63ffffffff611e6416565b612cf1565b610a9988670de0b6b3a764000063ffffffff611e6416565b9050611e21818763ffffffff612cf116565b915093509350939050565b600480546040516370a0823160e01b8152600092600160601b9092046001600160a01b0316916370a0823191610c5e91309101614741565b600082611e7357506000610b9d565b82820282848281611e8057fe5b0414610a645760405162461bcd60e51b815260040161037590614a2f565b6000610a6483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ecb565b6000601354600014610aa857600c5480611f0257611eff611a7c610c17565b90505b610bd5818463ffffffff6126ed16565b60008215801590611f235750828210155b15610b9d57611fdc68056bc75e2d631000008002610a99611fc668056bc75e2d63100000600080516020614c8f8339815191526001600160a01b0316634699f8466040518163ffffffff1660e01b815260040160206040518083038186803b158015611f8e57600080fd5b505afa158015611fa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611df29190810190613ddd565b610a8d611fd38888612f02565b610a8d89612657565b9050610b9d565b6000806000356001600160e01b031916611ffc81612bde565b156120195760405162461bcd60e51b815260040161037590614a3f565b612021612c37565b8915806120365750336001600160a01b038616145b6120525760405162461bcd60e51b8152600401610375906149af565b6001600160a01b0386166120785773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc295505b6004546001600160a01b03878116600160601b9092041614156120ad5760405162461bcd60e51b81526004016103759061499f565b60006120ba87898b612712565b9050806120d95760405162461bcd60e51b8152600401610375906149cf565b6120e16138fe565b6120e961391c565b3082526001600160a01b038816602083018190526040830152606081018b9052608081018a905261211a8c84612855565b825260208201526121318d60008e8c86868d612f34565b955095505050505097509795505050505050565b600060001982146121a1576040805180820190915260028152610c4d60f21b602082015261217c908390859063ffffffff61313316565b6001600160a01b03861660009081526012602090815260408083203384529091529020555b6001600160a01b0380861660009081526011602052604080822054928716808352912054906121e25760405162461bcd60e51b81526004016103759061492f565b60006122138660405180604001604052806002815260200161189b60f11b815250856131339092919063ffffffff16565b6001600160a01b0389166000908152601160205260408120829055909150612241838863ffffffff6126ed16565b6001600160a01b038916600090815260116020526040812082905590915061226761154d565b90506122758a86858461315f565b6122818985848461315f565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a6040516122c49190614881565b60405180910390a35060019998505050505050505050565b6000806000356001600160e01b0319166122f581612bde565b156123125760405162461bcd60e51b815260040161037590614a3f565b61231a612c37565b896123375760405162461bcd60e51b815260040161037590614adf565b34158061234357508734145b61235f5760405162461bcd60e51b81526004016103759061496f565b8715158061236c57508a15155b6123885760405162461bcd60e51b815260040161037590614aef565b6001600160a01b03871615158061239e57503415155b806123a857508a15155b6123c45760405162461bcd60e51b815260040161037590614a9f565b8a15806123d95750336001600160a01b038716145b6123f55760405162461bcd60e51b8152600401610375906149af565b6001600160a01b03871661241b5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc296505b6004546001600160a01b03888116600160601b9092041614156124505760405162461bcd60e51b81526004016103759061491f565b6124586138fe565b61246061391c565b3082526001600160a01b03888116602084015287166040830152608081018a90526124958c61248f6000611ee0565b8d611dae565b60208085019190915260408085019290925291835280519182019052600081526124d2908e908e90671bc16d674ec80000908d9087908790612f34565b945094505050509850989650505050505050565b6000601036025a836152080103019050919050565b6000612505612c37565b816125225760405162461bcd60e51b815260040161037590614a0f565b60006125316115966000611ee0565b905061254f81610a9985670de0b6b3a764000063ffffffff611e6416565b915034612597576125926004600c9054906101000a90046001600160a01b031633308660405180604001604052806002815260200161062760f31b815250613215565b61261f565b8234146125b65760405162461bcd60e51b815260040161037590614a1f565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561260557600080fd5b505af1158015612619573d6000803e3d6000fd5b50505050505b6001600160a01b03841660009081526011602052604090205461265090859061264a82868887613240565b8461315f565b5092915050565b60008115610aa85760006126696128e6565b509050610bd583610a99836907baab4146b63dd0000063ffffffff611e6416565b60008161269957506000610ce1565b5083546126e4816126d8670de0b6b3a76400006126cc886126c0898963ffffffff61336116565b9063ffffffff6133a716565b9063ffffffff61341216565b9063ffffffff61347616565b95945050505050565b600082820183811015610a645760405162461bcd60e51b81526004016103759061494f565b808215610a6457600080600080516020614c8f8339815191526001600160a01b03166378d849ed6040518163ffffffff1660e01b815260040160206040518083038186803b15801561276357600080fd5b505afa158015612777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061279b9190810190613a2c565b60048054604051630a7549df60e21b81526001600160a01b03938416936329d5277c936127d6938c93600160601b909104909216910161474f565b604080518083038186803b1580156127ed57600080fd5b505afa158015612801573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128259190810190613ea9565b915091508160001461284c576128498361132d83610a99898763ffffffff611e6416565b92505b50509392505050565b600080806128736f4b3b4ca85a86c47a098a22400000000086611e9e565b90506128a461289582610a998768056bc75e2d6310000063ffffffff611e6416565b61289f6000611ee0565b612db5565b91506128dc81610a996128bb856224ea00866129eb565b610a9988701d6329f1c35ca4bfabb9f561000000000063ffffffff611e6416565b9250509250929050565b60048054604051630d1979fb60e41b815260009283928392600080516020614c8f8339815191529263d1979fb092612932923092600160601b9092046001600160a01b0316910161474f565b60c06040518083038186803b15801561294a57600080fd5b505afa15801561295e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129829190810190613f7d565b50919650945092506129b5915068056bc75e2d631000009050610a996129a88285612cf1565b859063ffffffff611e6416565b9150509091565b601354600090806129cf57600e54610a64565b610a6481610a9985670de0b6b3a764000063ffffffff611e6416565b600082612a015768056bc75e2d63100000610ce1565b610ce168056bc75e2d6310000061132d84610a996301e133808189610a8d8c8863ffffffff611e6416565b6000808215612a7a57600454426001600160581b039081166101009092041614612a5c57612a586128e6565b9150505b6000612a6a8261132d611e2c565b905080841115612a78578093505b505b610a648361289f83611ee0565b3390565b6000612a95612c37565b81612ab25760405162461bcd60e51b815260040161037590614a4f565b612abb33611510565b821115612aef576000198214612ae35760405162461bcd60e51b8152600401610375906149ff565b612aec33611510565b91505b6000612afe6115966000611ee0565b90506000612b1e670de0b6b3a7640000610a99868563ffffffff611e6416565b90506000612b2a611e2c565b905081935080841115612b4f5760405162461bcd60e51b81526004016103759061497f565b33600081815260116020526040902054612b769190612b70828989896134bc565b8661315f565b505050919050565b604051612bd890859063a9059cbb60e01b90612ba09087908790602401614858565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152836135e1565b50505050565b600080827fa7143c84d793a15503da6f19bf9119a2dac94448ca45d77c8bf08f57b2e9104760001b604051602001612c179291906146ef565b60408051601f198184030181529190528051602090910120549392505050565b60045442906001600160581b038083166101009092041614611da65760048054604051630740ff7d60e51b8152600080516020614c8f8339815191529263e81fefa092612c9692600160601b9091046001600160a01b03169101614741565b600060405180830381600087803b158015612cb057600080fd5b505af1158015612cc4573d6000803e3d6000fd5b5050600480546001600160581b038516610100026bffffffffffffffffffffff0019909116179055505050565b6000610a6483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613133565b6001600160a01b038116612d595760405162461bcd60e51b81526004016103759061493f565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080612dcd612dc78561132d610c17565b84612f02565b600554600654600954600a54600b5494955060009485949392919082881015612df4578297505b81881115612e6757968190039668056bc75e2d6310000082900380891115612e1a578098505b612e3b68056bc75e2d63100000610a9985610a8d898b63ffffffff6126ed16565b9650612e5f8761132d83610a99612e52878d612cf1565b8e9063ffffffff611e6416565b995050612ebd565b612e888561132d68056bc75e2d63100000610a998c8963ffffffff611e6416565b98509395508593612e9f848663ffffffff6126ed16565b955086891015612eb157869850612ebd565b85891115612ebd578598505b505050505050505092915050565b60008183612eec5760405162461bcd60e51b81526004016103759190614900565b506000838581612ef857fe5b0495945050505050565b60008215801590612f1257508115155b15610b9d57611fdc82610a998568056bc75e2d6310000063ffffffff611e6416565b600080612f3f611e2c565b602085015111801590612f5e575060208501516001600160a01b031615155b612f7a5760405162461bcd60e51b81526004016103759061498f565b60408501516001600160a01b0316612fa05760208501516001600160a01b031660408601525b6000612fae8787878c6136a7565b60208601516060870151919250612fc591906126ed565b60608601528815612fe5576060850151612fdf908a612cf1565b60608601525b600089612ff3576000612ff6565b60015b90506000600f60008a846040516020016130119291906146a3565b60408051601f198184030181529181528151602092830120835290820192909252016000205490506130536f4b3b4ca85a86c47a098a2240000000008b611e9e565b9950600080516020614c8f8339815191526001600160a01b031663585314cf84838f868f8e8e8e6040518963ffffffff1660e01b815260040161309c979695949392919061488f565b60408051808303818588803b1580156130b457600080fd5b505af11580156130c8573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506130ed9190810190613ea9565b6080890152602088018190526131155760405162461bcd60e51b8152600401610375906149df565b50505060208401516080909401519399939850929650505050505050565b600081848411156131575760405162461bcd60e51b81526004016103759190614900565b505050900390565b6040516000906131959086907f37aa2b7d583612f016e4a4de4292cb015139b3d7762663d06a53964912ea2fb6906020016146c9565b604051602081830303815290604052805190602001209050600083600014156131c157600092506131f2565b84156131f2576001600160a01b0386166000908152601060205260409020546131ef9083908790869061268a565b90505b90556001600160a01b039093166000908152601060205260409020929092555050565b6040516132399086906323b872dd60e01b90612ba09088908890889060240161476a565b5050505050565b60006001600160a01b0385166132685760405162461bcd60e51b81526004016103759061492f565b6001600160a01b038516600090815260116020526040812054613291908663ffffffff6126ed16565b6001600160a01b03871660009081526011602052604090208190556013549091506132c2908663ffffffff6126ed16565b6013556040516001600160a01b038716907fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb9061330490889088908890614b1d565b60405180910390a2856001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516133509190614881565b60405180910390a395945050505050565b60008183038183128015906133765750838113155b8061338b575060008312801561338b57508381135b610a645760405162461bcd60e51b815260040161037590614acf565b6000826133b657506000610b9d565b826000191480156133ca5750600160ff1b82145b156133e75760405162461bcd60e51b815260040161037590614a7f565b828202828482816133f457fe5b0514610a645760405162461bcd60e51b815260040161037590614a7f565b6000816134315760405162461bcd60e51b815260040161037590614aff565b816000191480156134455750600160ff1b83145b156134625760405162461bcd60e51b8152600401610375906149bf565b600082848161346d57fe5b05949350505050565b600082820181831280159061348b5750838112155b806134a057506000831280156134a057508381125b610a645760405162461bcd60e51b81526004016103759061495f565b6040805180820182526002815261189b60f11b6020808301919091526001600160a01b038716600090815260119091529182205482916135049190879063ffffffff61313316565b9050600a81116135255761351e858263ffffffff6126ed16565b9450600090505b6001600160a01b0386166000908152601160205260409020819055601354613553908663ffffffff612cf116565b6013556040516001600160a01b038716907f743033787f4738ff4d6a7225ce2bd0977ee5f86b91a902a58f5e4d0b297b46449061359590889088908890614b1d565b60405180910390a260006001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516133509190614881565b60006060846001600160a01b0316846040516135fd9190614735565b6000604051808303816000865af19150503d806000811461363a576040519150601f19603f3d011682016040523d82523d6000602084013e61363f565b606091505b50915091508183906136645760405162461bcd60e51b81526004016103759190614900565b5080511561323957808060200190516136809190810190613b49565b839061369f5760405162461bcd60e51b81526004016103759190614900565b505050505050565b600454604084015160208401516060850151608086015160009473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2946001600160a01b03600160601b9092048216949093909290918b168514156137115760405162461bcd60e51b815260040161037590614a5f565b34965087156137835761374085858a60405180604001604052806002815260200161323760f01b815250612b7e565b8783111561377e5761377e85600080516020614c8f8339815191528a860360405180604001604052806002815260200161323760f01b815250612b7e565b6137b7565b6137b785600080516020614c8f8339815191528560405180604001604052806002815260200161323760f01b815250612b7e565b80156138b557856001600160a01b03168b6001600160a01b03161480156137dd57508615155b80156137e95750808710155b1561388057856001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561382957600080fd5b505af115801561383d573d6000803e3d6000fd5b50505050506138768b600080516020614c8f8339815191528360405180604001604052806002815260200161064760f31b815250612b7e565b80870396506138b5565b6138b58b33600080516020614c8f8339815191528460405180604001604052806002815260200161064760f31b815250613215565b81156138f0576138f08533600080516020614c8f8339815191528560405180604001604052806002815260200161323960f01b815250613215565b505050505050949350505050565b60405180608001604052806004906020820280388339509192915050565b6040518060a001604052806005906020820280388339509192915050565b8035610b9d81614c68565b8051610b9d81614c68565b8051610b9d81614c7c565b8035610b9d81614c85565b60008083601f84011261397857600080fd5b50813567ffffffffffffffff81111561399057600080fd5b6020830191508360018202830111156139a857600080fd5b9250929050565b600082601f8301126139c057600080fd5b81356139d36139ce82614b6d565b614b46565b915080825260208301602083018583830111156139ef57600080fd5b6139fa838284614bee565b50505092915050565b8051610b9d81614c85565b600060208284031215613a2057600080fd5b6000610ce1848461393a565b600060208284031215613a3e57600080fd5b6000610ce18484613945565b60008060408385031215613a5d57600080fd5b6000613a69858561393a565b9250506020613a7a8582860161393a565b9150509250929050565b600080600060608486031215613a9957600080fd5b6000613aa5868661393a565b9350506020613ab68682870161393a565b9250506040613ac78682870161395b565b9150509250925092565b60008060408385031215613ae457600080fd5b6000613af0858561393a565b925050602083013567ffffffffffffffff811115613b0d57600080fd5b613a7a858286016139af565b60008060408385031215613b2c57600080fd5b6000613b38858561393a565b9250506020613a7a8582860161395b565b600060208284031215613b5b57600080fd5b6000610ce18484613950565b60008060008060008060008060006101208a8c031215613b8657600080fd5b6000613b928c8c61395b565b9950506020613ba38c828d0161395b565b9850506040613bb48c828d0161395b565b9750506060613bc58c828d0161395b565b9650506080613bd68c828d0161393a565b95505060a0613be78c828d0161393a565b94505060c0613bf88c828d0161393a565b93505060e0613c098c828d0161393a565b9250506101008a013567ffffffffffffffff811115613c2757600080fd5b613c338c828d016139af565b9150509295985092959850929598565b600080600080600080600080610100898b031215613c6057600080fd5b6000613c6c8b8b61395b565b9850506020613c7d8b828c0161395b565b9750506040613c8e8b828c0161395b565b9650506060613c9f8b828c0161395b565b9550506080613cb08b828c0161393a565b94505060a0613cc18b828c0161393a565b93505060c0613cd28b828c0161393a565b92505060e089013567ffffffffffffffff811115613cef57600080fd5b613cfb8b828c016139af565b9150509295985092959890939650565b600080600080600080600060e0888a031215613d2657600080fd5b6000613d328a8a61395b565b9750506020613d438a828b0161395b565b9650506040613d548a828b0161395b565b9550506060613d658a828b0161395b565b9450506080613d768a828b0161393a565b93505060a0613d878a828b0161393a565b92505060c088013567ffffffffffffffff811115613da457600080fd5b613db08a828b016139af565b91505092959891949750929550565b600060208284031215613dd157600080fd5b6000610ce1848461395b565b600060208284031215613def57600080fd5b6000610ce18484613a03565b600080600080600080600060a0888a031215613e1657600080fd5b6000613e228a8a61395b565b9750506020613e338a828b0161393a565b9650506040613e448a828b0161393a565b955050606088013567ffffffffffffffff811115613e6157600080fd5b613e6d8a828b01613966565b9450945050608088013567ffffffffffffffff811115613e8c57600080fd5b613e988a828b01613966565b925092505092959891949750929550565b60008060408385031215613ebc57600080fd5b6000613ec88585613a03565b9250506020613a7a85828601613a03565b600080600060608486031215613eee57600080fd5b6000613efa868661395b565b9350506020613f0b8682870161395b565b9250506040613ac78682870161393a565b60008060008060808587031215613f3257600080fd5b6000613f3e878761395b565b9450506020613f4f8782880161395b565b9350506040613f608782880161395b565b9250506060613f718782880161393a565b91505092959194509250565b60008060008060008060c08789031215613f9657600080fd5b6000613fa28989613a03565b9650506020613fb389828a01613a03565b9550506040613fc489828a01613a03565b9450506060613fd589828a01613a03565b9350506080613fe689828a01613a03565b92505060a0613ff789828a01613a03565b9150509295509295509295565b60006140108383614024565b505060200190565b600061401083836140f6565b61402d81614bb4565b82525050565b61402d61403f82614bb4565b614c26565b61404d81614b95565b6140578184610aa8565b925061406282610bb5565b8060005b8381101561369f57815161407a8782614004565b965061408583614ba5565b925050600101614066565b61409981614b9b565b6140a38184610aa8565b92506140ae82610bb5565b8060005b8381101561369f5781516140c68782614018565b96506140d183614ba5565b9250506001016140b2565b61402d81614bbf565b61402d6140f182614bbf565b614c31565b61402d81610bb5565b61402d61410b82610bb5565b610bb5565b61402d61410b82614bc4565b60006141288385610aa8565b9350614135838584614bee565b50500190565b600061414682614ba1565b6141508185614bab565b9350614160818560208601614bfa565b61416981614c52565b9093019392505050565b600061417e82614ba1565b6141888185610aa8565b9350614198818560208601614bfa565b9290920192915050565b61402d81614be3565b60006141b8600283614bab565b61031360f41b815260200192915050565b60006141d6600283614bab565b61313560f01b815260200192915050565b60006141f4602683614bab565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061423c601b83614bab565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000614275602183614bab565b7f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f8152607760f81b602082015260400192915050565b60006142b8600183614bab565b603760f81b815260200192915050565b60006142d5600283614bab565b61333760f01b815260200192915050565b60006142f3600283614bab565b610c8d60f21b815260200192915050565b6000614311600283614bab565b61313160f01b815260200192915050565b600061432f600283614bab565b61313360f01b815260200192915050565b600061434d602183614bab565b7f5369676e6564536166654d6174683a206469766973696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000614390600283614bab565b61189960f11b815260200192915050565b60006143ae600283614bab565b61323560f01b815260200192915050565b60006143cc600283614bab565b61034360f41b815260200192915050565b60006143ea600283614bab565b61199960f11b815260200192915050565b6000614408600283614bab565b61313760f01b815260200192915050565b6000614426600283614bab565b61062760f31b815260200192915050565b6000614444602183614bab565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000614487600c83614bab565b6b1d5b985d5d1a1bdc9a5e995960a21b815260200192915050565b60006144af600283614bab565b61313960f01b815260200192915050565b60006144cd600283614bab565b61191b60f11b815260200192915050565b60006144eb600b83614bab565b6a18d85b1b0819985a5b195960aa1b815260200192915050565b6000614512602783614bab565b7f5369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f815266766572666c6f7760c81b602082015260400192915050565b600061455b601483614bab565b7319985b1b189858dac81b9bdd08185b1b1bddd95960621b815260200192915050565b600061458b600183614bab565b603960f81b815260200192915050565b60006145a8600c83614bab565b6b1b9bdb9499595b9d1c985b9d60a21b815260200192915050565b60006145d0600283614bab565b61066760f31b815260200192915050565b60006145ee602483614bab565b7f5369676e6564536166654d6174683a207375627472616374696f6e206f766572815263666c6f7760e01b602082015260400192915050565b6000614634600183614bab565b601b60f91b815260200192915050565b6000614651600183614bab565b600760fb1b815260200192915050565b600061466e602083614bab565b7f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f815260200192915050565b61402d81614bdd565b60006146af8285614033565b6014820191506146bf82846140e5565b5060010192915050565b60006146d58285614033565b6014820191506146e582846140ff565b5060200192915050565b60006146fb8285614110565b6004820191506146e582846140ff565b60006147178286614110565b6004820191506126e482848661411c565b6000610ce182848661411c565b6000610a648284614173565b60208101610b9d8284614024565b6040810161475d8285614024565b610a646020830184614024565b606081016147788286614024565b6147856020830185614024565b610ce160408301846140f6565b60a081016147a08288614024565b6147ad6020830187614024565b6147ba60408301866140f6565b6147c760608301856140f6565b6147d460808301846140dc565b9695505050505050565b60c081016147ec8289614024565b6147f96020830188614024565b61480660408301876140f6565b61481360608301866140f6565b61482060808301856140f6565b61482d60a08301846140f6565b979650505050505050565b604081016148468285614024565b8181036020830152610ce1818461413b565b604081016148668285614024565b610a6460208301846140f6565b60208101610b9d82846140dc565b60208101610b9d82846140f6565b6101c0810161489e828a6140f6565b6148ab60208301896140f6565b6148b860408301886140dc565b6148c560608301876140f6565b6148d26080830186614044565b6148e0610100830185614090565b8181036101a08301526148f3818461413b565b9998505050505050505050565b60208082528101610a64818461413b565b60208101610b9d82846141a2565b60208082528101610aa5816141ab565b60208082528101610aa5816141c9565b60208082528101610aa5816141e7565b60208082528101610aa58161422f565b60208082528101610aa581614268565b60208082528101610aa5816142ab565b60208082528101610aa5816142c8565b60208082528101610aa5816142e6565b60208082528101610aa581614304565b60208082528101610aa581614322565b60208082528101610aa581614340565b60208082528101610aa581614383565b60208082528101610aa5816143a1565b60208082528101610aa5816143bf565b60208082528101610aa5816143dd565b60208082528101610aa5816143fb565b60208082528101610aa581614419565b60208082528101610aa581614437565b60208082528101610aa58161447a565b60208082528101610aa5816144a2565b60208082528101610aa5816144c0565b60208082528101610aa5816144de565b60208082528101610aa581614505565b60208082528101610aa58161454e565b60208082528101610aa58161457e565b60208082528101610aa58161459b565b60208082528101610aa5816145c3565b60208082528101610aa5816145e1565b60208082528101610aa581614627565b60208082528101610aa581614644565b60208082528101610aa581614661565b6040810161486682856140f6565b60608101614b2b82866140f6565b61478560208301856140f6565b60208101610b9d828461469a565b60405181810167ffffffffffffffff81118282101715614b6557600080fd5b604052919050565b600067ffffffffffffffff821115614b8457600080fd5b506020601f91909101601f19160190565b50600490565b50600590565b5190565b60200190565b90815260200190565b6000610aa582614bd1565b151590565b6001600160e01b03191690565b6001600160a01b031690565b60ff1690565b6000610aa582614bb4565b82818337506000910152565b60005b83811015614c15578181015183820152602001614bfd565b83811115612bd85750506000910152565b6000610aa582614c3c565b6000610aa582614c47565b6000610aa582614c62565b6000610aa582614c5c565b601f01601f191690565b60f81b90565b60601b90565b614c7181614bb4565b8114611da657600080fd5b614c7181614bbf565b614c7181610bb556fe000000000000000000000000d8ee69652e4e4838f2531732a46d1f7f584f0b7fa365627a7a723158200f78724654d7f31ad20e1b806e2962f95eceeb528a08ea5361163f9c180e35086c6578706572696d656e74616cf564736f6c634300051100408be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000b7f72028d9b502dc871c444363a7ac5a52546608
Deployed Bytecode
0x6080604052600436106103505760003560e01c80636b40cd40116101c65780639dc29fac116100f7578063d73dd62311610095578063eebc50811161006f578063eebc5081146108f5578063ef2b0b3914610915578063f2fde38b1461092a578063ffa1ad741461094a57610350565b8063d73dd623146108a0578063d759dbeb146108c0578063dd62ed3e146108d557610350565b8063ba0e43bf116100d1578063ba0e43bf14610843578063c5bf0e9d14610858578063c91d59fe1461086b578063d65a50211461088057610350565b80639dc29fac146107e3578063a9059cbb14610803578063b9fe1a8f1461082357610350565b80638325a1c0116101645780638f32d59b1161013e5780638f32d59b1461078f5780638fb807c5146107a457806395d89b41146107b9578063995363d3146107ce57610350565b80638325a1c014610752578063890a62a0146107675780638da5cb5b1461077a57610350565b80637b7933b4116101a05780637b7933b4146106f35780637e37c08c146107085780637ff9b5961461071d578063829b38f41461073257610350565b80636b40cd401461068f57806370a08231146106be578063797bf385146106de57610350565b80632ea295fa116102a057806344a4a0031161023e57806356e07d701161021857806356e07d7014610625578063612ef80b1461063a578063631a3ef81461064f578063661884631461066f57610350565b806344a4a003146105ce5780634b57b0be146105e357806354198ce91461060557610350565b8063330691ac1161027a578063330691ac146105645780633885daf81461057957806340c10f191461058c578063420a83e7146105ac57610350565b80632ea295fa1461050f578063313ce567146105225780633291c11a1461054457610350565b806314dfe7921161030d5780631f68f20a116102e75780631f68f20a146104a357806320f6d07c146104b857806323b872dd146104cd578063284e2f56146104ed57610350565b806314dfe7921461045857806318160ddd146104795780631d0806ae1461048e57610350565b8063047979301461037e57806306b3efd6146103b457806306fdde03146103d4578063095ea7b3146103f657806309ec6b6b146104235780631241689814610438575b34801561035c57600080fd5b5060405162461bcd60e51b815260040161037590614a8f565b60405180910390fd5b34801561038a57600080fd5b5061039e610399366004613ed9565b61095f565b6040516103ab9190614881565b60405180910390f35b3480156103c057600080fd5b5061039e6103cf366004613a0e565b610a6b565b3480156103e057600080fd5b506103e9610aad565b6040516103ab9190614900565b34801561040257600080fd5b50610416610411366004613b19565b610b38565b6040516103ab9190614873565b34801561042f57600080fd5b5061039e610ba3565b34801561044457600080fd5b5061039e610453366004613dbf565b610bb8565b61046b610466366004613d0b565b610be3565b6040516103ab929190614b0f565b34801561048557600080fd5b5061039e610c05565b34801561049a57600080fd5b5061039e610c0b565b3480156104af57600080fd5b5061039e610c11565b3480156104c457600080fd5b5061039e610c17565b3480156104d957600080fd5b506104166104e8366004613a84565b610cae565b3480156104f957600080fd5b5061050d610508366004613ad1565b610ce9565b005b61046b61051d366004613c43565b610e2f565b34801561052e57600080fd5b50610537610e62565b6040516103ab9190614b38565b34801561055057600080fd5b5061039e61055f366004613dbf565b610e6b565b34801561057057600080fd5b5061039e610e7d565b61046b610587366004613c43565b610e83565b34801561059857600080fd5b5061039e6105a7366004613b19565b6110cd565b3480156105b857600080fd5b506105c161110e565b6040516103ab9190614911565b3480156105da57600080fd5b5061039e611126565b3480156105ef57600080fd5b506105f8611138565b6040516103ab9190614741565b34801561061157600080fd5b5061039e610620366004613a0e565b611150565b34801561063157600080fd5b5061039e6111f1565b34801561064657600080fd5b5061039e6111f7565b34801561065b57600080fd5b5061039e61066a366004613ed9565b611228565b34801561067b57600080fd5b5061041661068a366004613b19565b611349565b34801561069b57600080fd5b506106af6106aa366004613f1c565b6113ec565b6040516103ab93929190614b1d565b3480156106ca57600080fd5b5061039e6106d9366004613a0e565b611510565b3480156106ea57600080fd5b506105f861152b565b3480156106ff57600080fd5b5061039e611541565b34801561071457600080fd5b5061039e611547565b34801561072957600080fd5b5061039e61154d565b34801561073e57600080fd5b5061039e61074d366004613dbf565b6115a1565b34801561075e57600080fd5b5061039e6115e6565b61046b610775366004613b67565b6115f2565b34801561078657600080fd5b506105f861185d565b34801561079b57600080fd5b5061041661186c565b3480156107b057600080fd5b5061039e611892565b3480156107c557600080fd5b506103e96118d8565b3480156107da57600080fd5b506105f8611933565b3480156107ef57600080fd5b5061039e6107fe366004613b19565b611945565b34801561080f57600080fd5b5061041661081e366004613b19565b6119b9565b34801561082f57600080fd5b5061039e61083e366004613dbf565b6119c9565b34801561084f57600080fd5b5061039e6119d4565b6103e9610866366004613dfb565b6119da565b34801561087757600080fd5b506105c1611c71565b34801561088c57600080fd5b5061039e61089b366004613dbf565b611c83565b3480156108ac57600080fd5b506104166108bb366004613b19565b611c96565b3480156108cc57600080fd5b5061039e611d27565b3480156108e157600080fd5b5061039e6108f0366004613a4a565b611d2d565b34801561090157600080fd5b5061039e610910366004613a0e565b611d58565b34801561092157600080fd5b5061039e611d73565b34801561093657600080fd5b5061050d610945366004613a0e565b611d79565b34801561095657600080fd5b5061039e611da9565b60008315610a6457600454600080516020614c8f8339815191529063e762319f90600160601b90046001600160a01b039081169085166109b35773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26109b5565b845b6040516001600160e01b031960e085901b1681526109e792919089906802b5e3af16b188000090600190600401614792565b60206040518083038186803b1580156109ff57600080fd5b505afa158015610a13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a379190810190613ddd565b9050610a4b81610a45611892565b85611dae565b9250610a599150611e2c9050565b811115610a64575060005b9392505050565b6000610aa5670de0b6b3a7640000610a99610a8461154d565b610a8d86611510565b9063ffffffff611e6416565b9063ffffffff611e9e16565b90505b919050565b6002805460408051602060018416156101000260001901909316849004601f81018490048402820184019092528181529291830182828015610b305780601f10610b0557610100808354040283529160200191610b30565b820191906000526020600020905b815481529060010190602001808311610b1357829003601f168201915b505050505081565b3360008181526012602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610b91908690614881565b60405180910390a35060015b92915050565b6000610bb26104536000611ee0565b90505b90565b600080610bc3610c17565b90508015610bdd57610bd58184611f12565b915050610aa8565b50919050565b600080610bf589898989898989611fe3565b9150915097509795505050505050565b60135490565b600e5481565b60055481565b6004805460405163250f447f60e11b8152600092600080516020614c8f83398151915292634a1e88fe92610c5e923092600160601b90046001600160a01b0316910161474f565b60206040518083038186803b158015610c7657600080fd5b505afa158015610c8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bb29190810190613ddd565b6001600160a01b0383166000908152601260209081526040808320338452909152812054610ce190859085908590612145565b949350505050565b610cf161185d565b6001600160a01b0316336001600160a01b031614610d82577f7ad06df6a0af6bd602d90db766e0d5f253b45187c3717a0f9026ea8b10ff0d4b547f34b31cff1dbd8374124bd4505521fc29cab0f9554a5386ba7d784a4e611c7e3154336001600160a01b038316148015610d765750806001600160a01b0316846001600160a01b0316145b610d7f57600080fd5b50505b601480546001600160a01b038481166001600160a01b03198316179092556040519116906000903090610db6908590614735565b6000604051808303816000865af19150503d8060008114610df3576040519150601f19603f3d011682016040523d82523d6000602084013e610df8565b606091505b50506040519091503d90816000823e82610e10578181fd5b601480546001600160a01b0319166001600160a01b0386161790558181f35b600080610e518a8a8a8a8a8a8a604051806020016040528060008152506122dc565b915091509850989650505050505050565b60045460ff1681565b600f6020526000908152604090205481565b60065481565b600080836001600160a01b038116610eac57507355eb3dd3f738cfdda986b8eff3fa784477552c615b6040516370a0823160e01b81526d4946c0e9f43f4dee607b0ef1fa1c906370a0823190610edd908490600401614741565b60206040518083038186803b158015610ef557600080fd5b505afa158015610f09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f2d9190810190613ddd565b156110ab5760005a9050610f468c8c8c8c8c8c8b611fe3565b9350935061a3db610f56826124e6565b61374a0181610f6157fe5b0490506001600160a01b0382167355eb3dd3f738cfdda986b8eff3fa784477552c611415611018576040516331b35c9b60e11b81527355eb3dd3f738cfdda986b8eff3fa784477552c6190636366b93690610fc0908490600401614881565b602060405180830381600087803b158015610fda57600080fd5b505af1158015610fee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110129190810190613ddd565b506110a5565b60405163079d229f60e01b81527355eb3dd3f738cfdda986b8eff3fa784477552c619063079d229f906110519085908590600401614858565b602060405180830381600087803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110a39190810190613ddd565b505b506110bf565b6110ba8b8b8b8b8b8b8a611fe3565b925092505b509850989650505050505050565b60006001600054146110f15760405162461bcd60e51b815260040161037590614aaf565b600260005561110083836124fb565b90505b600160005592915050565b7355eb3dd3f738cfdda986b8eff3fa784477552c6181565b6000610bb2611133610c17565b612657565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b600080827f37aa2b7d583612f016e4a4de4292cb015139b3d7762663d06a53964912ea2fb660001b6040516020016111899291906146c9565b604051602081830303815290604052805190602001209050610a648160116000866001600160a01b03166001600160a01b03168152602001908152602001600020546111d361154d565b6001600160a01b03871660009081526010602052604090205461268a565b600a5481565b6000806112046000611ee0565b90506000611210610c17565b9050808211156112235790039050610bb5565b505090565b60008315610a645760006112448561123e611892565b86611dae565b92505050611250611e2c565b81116113415760045461133990600a90600080516020614c8f833981519152906325decac090600160601b90046001600160a01b039081169088166112a95773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26112ab565b875b6040516001600160e01b031960e085901b1681526112dd92919088906802b5e3af16b188000090600190600401614792565b60206040518083038186803b1580156112f557600080fd5b505afa158015611309573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061132d9190810190613ddd565b9063ffffffff6126ed16565b915050610a64565b509392505050565b3360009081526012602090815260408083206001600160a01b038616845290915281205480831061137c57506000611380565b8290035b3360008181526012602090815260408083206001600160a01b03891680855292529182902084905590519091907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906113da908590614881565b60405180910390a35060019392505050565b600080806001600160a01b0384166114165773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc293505b6000611423858789612712565b905061142f8882612855565b909450915061143c611e2c565b841115611453575060009250829150819050611506565b611463878563ffffffff6126ed16565b6004805460405163d67f707760e01b8152929950600080516020614c8f8339815191529263d67f7077926114b292600160601b90046001600160a01b0316918a918d918d918a918d91016147de565b60206040518083038186803b1580156114ca57600080fd5b505afa1580156114de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115029190810190613ddd565b9250505b9450945094915050565b6001600160a01b031660009081526011602052604090205490565b600454600160601b90046001600160a01b031681565b600d5481565b60085481565b600080426001600160581b0316600460019054906101000a90046001600160581b03166001600160581b03161461158a576115866128e6565b9150505b61159b61159682611ee0565b6129bc565b91505090565b6000806115be6f4b3b4ca85a86c47a098a22400000000084611e9e565b9050610a646115da68056bc75e2d631000006224ea00846129eb565b610a9983610a8d6111f7565b6000610bb26000612a2c565b600080836001600160a01b03811661161b57507355eb3dd3f738cfdda986b8eff3fa784477552c615b6040516370a0823160e01b81526d4946c0e9f43f4dee607b0ef1fa1c906370a082319061164c908490600401614741565b60206040518083038186803b15801561166457600080fd5b505afa158015611678573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061169c9190810190613ddd565b1561182a5760005a90506116c58d8d8d8d8d8d8d604051806020016040528060008152506122dc565b9350935061a3db6116d5826124e6565b61374a01816116e057fe5b0490506001600160a01b0382167355eb3dd3f738cfdda986b8eff3fa784477552c611415611797576040516331b35c9b60e11b81527355eb3dd3f738cfdda986b8eff3fa784477552c6190636366b9369061173f908490600401614881565b602060405180830381600087803b15801561175957600080fd5b505af115801561176d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117919190810190613ddd565b50611824565b60405163079d229f60e01b81527355eb3dd3f738cfdda986b8eff3fa784477552c619063079d229f906117d09085908590600401614858565b602060405180830381600087803b1580156117ea57600080fd5b505af11580156117fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118229190810190613ddd565b505b5061184e565b6118498c8c8c8c8c8c8c604051806020016040528060008152506122dc565b925092505b50995099975050505050505050565b6001546001600160a01b031690565b6001546000906001600160a01b0316611883612a87565b6001600160a01b031614905090565b600080426001600160581b0316600460019054906101000a90046001600160581b03166001600160581b0316146118cf576118cb6128e6565b9150505b61159b81611ee0565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b305780601f10610b0557610100808354040283529160200191610b30565b600080516020614c8f83398151915281565b60006001600054146119695760405162461bcd60e51b815260040161037590614aaf565b600260005561197782612a8b565b90508015611103576111036004600c9054906101000a90046001600160a01b03168483604051806040016040528060018152602001603560f81b815250612b7e565b6000610a64338484600019612145565b6000610aa582612a2c565b60095481565b60606001600054146119fe5760405162461bcd60e51b815260040161037590614aaf565b60026000908155356001600160e01b031916611a1981612bde565b15611a365760405162461bcd60e51b815260040161037590614a3f565b611a3e612c37565b88611a5b5760405162461bcd60e51b815260040161037590614abf565b6000611a6d473463ffffffff612cf116565b90506000611a84611a7c610c17565b61132d611e2c565b905080600c81905550611ac86004600c9054906101000a90046001600160a01b03168b8d60405180604001604052806002815260200161333960f01b815250612b7e565b606087611b0e5786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350611b4992505050565b8888604051611b1e929190614728565b604051908190038120611b37918990899060200161470b565b60405160208183030381529060405290505b60006060720f400e6818158d541c3ebe45fe3aa0d47372ff6001600160a01b03163463de064e0d8e86604051602401611b83929190614838565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611bbc9190614735565b60006040518083038185875af1925050503d8060008114611bf9576040519150601f19603f3d011682016040523d82523d6000602084013e611bfe565b606091505b509150915081611c205760405162461bcd60e51b815260040161037590614a6f565b6000600c55478511801590611c3f575083611c3c611a7c610c17565b10155b611c5b5760405162461bcd60e51b8152600401610375906149ef565b60016000559d9c50505050505050505050505050565b6d4946c0e9f43f4dee607b0ef1fa1c81565b6000610aa56104538361132d6000611ee0565b3360009081526012602090815260408083206001600160a01b03861684529091528120548190611ccc908463ffffffff6126ed16565b3360008181526012602090815260408083206001600160a01b038a168085529252918290208490559051929350917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906113da908590614881565b60075481565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b6001600160a01b031660009081526010602052604090205490565b600b5481565b611d8161186c565b611d9d5760405162461bcd60e51b815260040161037590614a3f565b611da681612d33565b50565b600681565b6000806000611dbd8686612db5565b9250611e0f611df7670de0b6b3a7640000611df26b0a3098c68eb9427db8000000610a9983610a8d8a8c63ffffffff611e6416565b612cf1565b610a9988670de0b6b3a764000063ffffffff611e6416565b9050611e21818763ffffffff612cf116565b915093509350939050565b600480546040516370a0823160e01b8152600092600160601b9092046001600160a01b0316916370a0823191610c5e91309101614741565b600082611e7357506000610b9d565b82820282848281611e8057fe5b0414610a645760405162461bcd60e51b815260040161037590614a2f565b6000610a6483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ecb565b6000601354600014610aa857600c5480611f0257611eff611a7c610c17565b90505b610bd5818463ffffffff6126ed16565b60008215801590611f235750828210155b15610b9d57611fdc68056bc75e2d631000008002610a99611fc668056bc75e2d63100000600080516020614c8f8339815191526001600160a01b0316634699f8466040518163ffffffff1660e01b815260040160206040518083038186803b158015611f8e57600080fd5b505afa158015611fa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611df29190810190613ddd565b610a8d611fd38888612f02565b610a8d89612657565b9050610b9d565b6000806000356001600160e01b031916611ffc81612bde565b156120195760405162461bcd60e51b815260040161037590614a3f565b612021612c37565b8915806120365750336001600160a01b038616145b6120525760405162461bcd60e51b8152600401610375906149af565b6001600160a01b0386166120785773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc295505b6004546001600160a01b03878116600160601b9092041614156120ad5760405162461bcd60e51b81526004016103759061499f565b60006120ba87898b612712565b9050806120d95760405162461bcd60e51b8152600401610375906149cf565b6120e16138fe565b6120e961391c565b3082526001600160a01b038816602083018190526040830152606081018b9052608081018a905261211a8c84612855565b825260208201526121318d60008e8c86868d612f34565b955095505050505097509795505050505050565b600060001982146121a1576040805180820190915260028152610c4d60f21b602082015261217c908390859063ffffffff61313316565b6001600160a01b03861660009081526012602090815260408083203384529091529020555b6001600160a01b0380861660009081526011602052604080822054928716808352912054906121e25760405162461bcd60e51b81526004016103759061492f565b60006122138660405180604001604052806002815260200161189b60f11b815250856131339092919063ffffffff16565b6001600160a01b0389166000908152601160205260408120829055909150612241838863ffffffff6126ed16565b6001600160a01b038916600090815260116020526040812082905590915061226761154d565b90506122758a86858461315f565b6122818985848461315f565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a6040516122c49190614881565b60405180910390a35060019998505050505050505050565b6000806000356001600160e01b0319166122f581612bde565b156123125760405162461bcd60e51b815260040161037590614a3f565b61231a612c37565b896123375760405162461bcd60e51b815260040161037590614adf565b34158061234357508734145b61235f5760405162461bcd60e51b81526004016103759061496f565b8715158061236c57508a15155b6123885760405162461bcd60e51b815260040161037590614aef565b6001600160a01b03871615158061239e57503415155b806123a857508a15155b6123c45760405162461bcd60e51b815260040161037590614a9f565b8a15806123d95750336001600160a01b038716145b6123f55760405162461bcd60e51b8152600401610375906149af565b6001600160a01b03871661241b5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc296505b6004546001600160a01b03888116600160601b9092041614156124505760405162461bcd60e51b81526004016103759061491f565b6124586138fe565b61246061391c565b3082526001600160a01b03888116602084015287166040830152608081018a90526124958c61248f6000611ee0565b8d611dae565b60208085019190915260408085019290925291835280519182019052600081526124d2908e908e90671bc16d674ec80000908d9087908790612f34565b945094505050509850989650505050505050565b6000601036025a836152080103019050919050565b6000612505612c37565b816125225760405162461bcd60e51b815260040161037590614a0f565b60006125316115966000611ee0565b905061254f81610a9985670de0b6b3a764000063ffffffff611e6416565b915034612597576125926004600c9054906101000a90046001600160a01b031633308660405180604001604052806002815260200161062760f31b815250613215565b61261f565b8234146125b65760405162461bcd60e51b815260040161037590614a1f565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561260557600080fd5b505af1158015612619573d6000803e3d6000fd5b50505050505b6001600160a01b03841660009081526011602052604090205461265090859061264a82868887613240565b8461315f565b5092915050565b60008115610aa85760006126696128e6565b509050610bd583610a99836907baab4146b63dd0000063ffffffff611e6416565b60008161269957506000610ce1565b5083546126e4816126d8670de0b6b3a76400006126cc886126c0898963ffffffff61336116565b9063ffffffff6133a716565b9063ffffffff61341216565b9063ffffffff61347616565b95945050505050565b600082820183811015610a645760405162461bcd60e51b81526004016103759061494f565b808215610a6457600080600080516020614c8f8339815191526001600160a01b03166378d849ed6040518163ffffffff1660e01b815260040160206040518083038186803b15801561276357600080fd5b505afa158015612777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061279b9190810190613a2c565b60048054604051630a7549df60e21b81526001600160a01b03938416936329d5277c936127d6938c93600160601b909104909216910161474f565b604080518083038186803b1580156127ed57600080fd5b505afa158015612801573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128259190810190613ea9565b915091508160001461284c576128498361132d83610a99898763ffffffff611e6416565b92505b50509392505050565b600080806128736f4b3b4ca85a86c47a098a22400000000086611e9e565b90506128a461289582610a998768056bc75e2d6310000063ffffffff611e6416565b61289f6000611ee0565b612db5565b91506128dc81610a996128bb856224ea00866129eb565b610a9988701d6329f1c35ca4bfabb9f561000000000063ffffffff611e6416565b9250509250929050565b60048054604051630d1979fb60e41b815260009283928392600080516020614c8f8339815191529263d1979fb092612932923092600160601b9092046001600160a01b0316910161474f565b60c06040518083038186803b15801561294a57600080fd5b505afa15801561295e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129829190810190613f7d565b50919650945092506129b5915068056bc75e2d631000009050610a996129a88285612cf1565b859063ffffffff611e6416565b9150509091565b601354600090806129cf57600e54610a64565b610a6481610a9985670de0b6b3a764000063ffffffff611e6416565b600082612a015768056bc75e2d63100000610ce1565b610ce168056bc75e2d6310000061132d84610a996301e133808189610a8d8c8863ffffffff611e6416565b6000808215612a7a57600454426001600160581b039081166101009092041614612a5c57612a586128e6565b9150505b6000612a6a8261132d611e2c565b905080841115612a78578093505b505b610a648361289f83611ee0565b3390565b6000612a95612c37565b81612ab25760405162461bcd60e51b815260040161037590614a4f565b612abb33611510565b821115612aef576000198214612ae35760405162461bcd60e51b8152600401610375906149ff565b612aec33611510565b91505b6000612afe6115966000611ee0565b90506000612b1e670de0b6b3a7640000610a99868563ffffffff611e6416565b90506000612b2a611e2c565b905081935080841115612b4f5760405162461bcd60e51b81526004016103759061497f565b33600081815260116020526040902054612b769190612b70828989896134bc565b8661315f565b505050919050565b604051612bd890859063a9059cbb60e01b90612ba09087908790602401614858565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152836135e1565b50505050565b600080827fa7143c84d793a15503da6f19bf9119a2dac94448ca45d77c8bf08f57b2e9104760001b604051602001612c179291906146ef565b60408051601f198184030181529190528051602090910120549392505050565b60045442906001600160581b038083166101009092041614611da65760048054604051630740ff7d60e51b8152600080516020614c8f8339815191529263e81fefa092612c9692600160601b9091046001600160a01b03169101614741565b600060405180830381600087803b158015612cb057600080fd5b505af1158015612cc4573d6000803e3d6000fd5b5050600480546001600160581b038516610100026bffffffffffffffffffffff0019909116179055505050565b6000610a6483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613133565b6001600160a01b038116612d595760405162461bcd60e51b81526004016103759061493f565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080612dcd612dc78561132d610c17565b84612f02565b600554600654600954600a54600b5494955060009485949392919082881015612df4578297505b81881115612e6757968190039668056bc75e2d6310000082900380891115612e1a578098505b612e3b68056bc75e2d63100000610a9985610a8d898b63ffffffff6126ed16565b9650612e5f8761132d83610a99612e52878d612cf1565b8e9063ffffffff611e6416565b995050612ebd565b612e888561132d68056bc75e2d63100000610a998c8963ffffffff611e6416565b98509395508593612e9f848663ffffffff6126ed16565b955086891015612eb157869850612ebd565b85891115612ebd578598505b505050505050505092915050565b60008183612eec5760405162461bcd60e51b81526004016103759190614900565b506000838581612ef857fe5b0495945050505050565b60008215801590612f1257508115155b15610b9d57611fdc82610a998568056bc75e2d6310000063ffffffff611e6416565b600080612f3f611e2c565b602085015111801590612f5e575060208501516001600160a01b031615155b612f7a5760405162461bcd60e51b81526004016103759061498f565b60408501516001600160a01b0316612fa05760208501516001600160a01b031660408601525b6000612fae8787878c6136a7565b60208601516060870151919250612fc591906126ed565b60608601528815612fe5576060850151612fdf908a612cf1565b60608601525b600089612ff3576000612ff6565b60015b90506000600f60008a846040516020016130119291906146a3565b60408051601f198184030181529181528151602092830120835290820192909252016000205490506130536f4b3b4ca85a86c47a098a2240000000008b611e9e565b9950600080516020614c8f8339815191526001600160a01b031663585314cf84838f868f8e8e8e6040518963ffffffff1660e01b815260040161309c979695949392919061488f565b60408051808303818588803b1580156130b457600080fd5b505af11580156130c8573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506130ed9190810190613ea9565b6080890152602088018190526131155760405162461bcd60e51b8152600401610375906149df565b50505060208401516080909401519399939850929650505050505050565b600081848411156131575760405162461bcd60e51b81526004016103759190614900565b505050900390565b6040516000906131959086907f37aa2b7d583612f016e4a4de4292cb015139b3d7762663d06a53964912ea2fb6906020016146c9565b604051602081830303815290604052805190602001209050600083600014156131c157600092506131f2565b84156131f2576001600160a01b0386166000908152601060205260409020546131ef9083908790869061268a565b90505b90556001600160a01b039093166000908152601060205260409020929092555050565b6040516132399086906323b872dd60e01b90612ba09088908890889060240161476a565b5050505050565b60006001600160a01b0385166132685760405162461bcd60e51b81526004016103759061492f565b6001600160a01b038516600090815260116020526040812054613291908663ffffffff6126ed16565b6001600160a01b03871660009081526011602052604090208190556013549091506132c2908663ffffffff6126ed16565b6013556040516001600160a01b038716907fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb9061330490889088908890614b1d565b60405180910390a2856001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516133509190614881565b60405180910390a395945050505050565b60008183038183128015906133765750838113155b8061338b575060008312801561338b57508381135b610a645760405162461bcd60e51b815260040161037590614acf565b6000826133b657506000610b9d565b826000191480156133ca5750600160ff1b82145b156133e75760405162461bcd60e51b815260040161037590614a7f565b828202828482816133f457fe5b0514610a645760405162461bcd60e51b815260040161037590614a7f565b6000816134315760405162461bcd60e51b815260040161037590614aff565b816000191480156134455750600160ff1b83145b156134625760405162461bcd60e51b8152600401610375906149bf565b600082848161346d57fe5b05949350505050565b600082820181831280159061348b5750838112155b806134a057506000831280156134a057508381125b610a645760405162461bcd60e51b81526004016103759061495f565b6040805180820182526002815261189b60f11b6020808301919091526001600160a01b038716600090815260119091529182205482916135049190879063ffffffff61313316565b9050600a81116135255761351e858263ffffffff6126ed16565b9450600090505b6001600160a01b0386166000908152601160205260409020819055601354613553908663ffffffff612cf116565b6013556040516001600160a01b038716907f743033787f4738ff4d6a7225ce2bd0977ee5f86b91a902a58f5e4d0b297b46449061359590889088908890614b1d565b60405180910390a260006001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516133509190614881565b60006060846001600160a01b0316846040516135fd9190614735565b6000604051808303816000865af19150503d806000811461363a576040519150601f19603f3d011682016040523d82523d6000602084013e61363f565b606091505b50915091508183906136645760405162461bcd60e51b81526004016103759190614900565b5080511561323957808060200190516136809190810190613b49565b839061369f5760405162461bcd60e51b81526004016103759190614900565b505050505050565b600454604084015160208401516060850151608086015160009473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2946001600160a01b03600160601b9092048216949093909290918b168514156137115760405162461bcd60e51b815260040161037590614a5f565b34965087156137835761374085858a60405180604001604052806002815260200161323760f01b815250612b7e565b8783111561377e5761377e85600080516020614c8f8339815191528a860360405180604001604052806002815260200161323760f01b815250612b7e565b6137b7565b6137b785600080516020614c8f8339815191528560405180604001604052806002815260200161323760f01b815250612b7e565b80156138b557856001600160a01b03168b6001600160a01b03161480156137dd57508615155b80156137e95750808710155b1561388057856001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561382957600080fd5b505af115801561383d573d6000803e3d6000fd5b50505050506138768b600080516020614c8f8339815191528360405180604001604052806002815260200161064760f31b815250612b7e565b80870396506138b5565b6138b58b33600080516020614c8f8339815191528460405180604001604052806002815260200161064760f31b815250613215565b81156138f0576138f08533600080516020614c8f8339815191528560405180604001604052806002815260200161323960f01b815250613215565b505050505050949350505050565b60405180608001604052806004906020820280388339509192915050565b6040518060a001604052806005906020820280388339509192915050565b8035610b9d81614c68565b8051610b9d81614c68565b8051610b9d81614c7c565b8035610b9d81614c85565b60008083601f84011261397857600080fd5b50813567ffffffffffffffff81111561399057600080fd5b6020830191508360018202830111156139a857600080fd5b9250929050565b600082601f8301126139c057600080fd5b81356139d36139ce82614b6d565b614b46565b915080825260208301602083018583830111156139ef57600080fd5b6139fa838284614bee565b50505092915050565b8051610b9d81614c85565b600060208284031215613a2057600080fd5b6000610ce1848461393a565b600060208284031215613a3e57600080fd5b6000610ce18484613945565b60008060408385031215613a5d57600080fd5b6000613a69858561393a565b9250506020613a7a8582860161393a565b9150509250929050565b600080600060608486031215613a9957600080fd5b6000613aa5868661393a565b9350506020613ab68682870161393a565b9250506040613ac78682870161395b565b9150509250925092565b60008060408385031215613ae457600080fd5b6000613af0858561393a565b925050602083013567ffffffffffffffff811115613b0d57600080fd5b613a7a858286016139af565b60008060408385031215613b2c57600080fd5b6000613b38858561393a565b9250506020613a7a8582860161395b565b600060208284031215613b5b57600080fd5b6000610ce18484613950565b60008060008060008060008060006101208a8c031215613b8657600080fd5b6000613b928c8c61395b565b9950506020613ba38c828d0161395b565b9850506040613bb48c828d0161395b565b9750506060613bc58c828d0161395b565b9650506080613bd68c828d0161393a565b95505060a0613be78c828d0161393a565b94505060c0613bf88c828d0161393a565b93505060e0613c098c828d0161393a565b9250506101008a013567ffffffffffffffff811115613c2757600080fd5b613c338c828d016139af565b9150509295985092959850929598565b600080600080600080600080610100898b031215613c6057600080fd5b6000613c6c8b8b61395b565b9850506020613c7d8b828c0161395b565b9750506040613c8e8b828c0161395b565b9650506060613c9f8b828c0161395b565b9550506080613cb08b828c0161393a565b94505060a0613cc18b828c0161393a565b93505060c0613cd28b828c0161393a565b92505060e089013567ffffffffffffffff811115613cef57600080fd5b613cfb8b828c016139af565b9150509295985092959890939650565b600080600080600080600060e0888a031215613d2657600080fd5b6000613d328a8a61395b565b9750506020613d438a828b0161395b565b9650506040613d548a828b0161395b565b9550506060613d658a828b0161395b565b9450506080613d768a828b0161393a565b93505060a0613d878a828b0161393a565b92505060c088013567ffffffffffffffff811115613da457600080fd5b613db08a828b016139af565b91505092959891949750929550565b600060208284031215613dd157600080fd5b6000610ce1848461395b565b600060208284031215613def57600080fd5b6000610ce18484613a03565b600080600080600080600060a0888a031215613e1657600080fd5b6000613e228a8a61395b565b9750506020613e338a828b0161393a565b9650506040613e448a828b0161393a565b955050606088013567ffffffffffffffff811115613e6157600080fd5b613e6d8a828b01613966565b9450945050608088013567ffffffffffffffff811115613e8c57600080fd5b613e988a828b01613966565b925092505092959891949750929550565b60008060408385031215613ebc57600080fd5b6000613ec88585613a03565b9250506020613a7a85828601613a03565b600080600060608486031215613eee57600080fd5b6000613efa868661395b565b9350506020613f0b8682870161395b565b9250506040613ac78682870161393a565b60008060008060808587031215613f3257600080fd5b6000613f3e878761395b565b9450506020613f4f8782880161395b565b9350506040613f608782880161395b565b9250506060613f718782880161393a565b91505092959194509250565b60008060008060008060c08789031215613f9657600080fd5b6000613fa28989613a03565b9650506020613fb389828a01613a03565b9550506040613fc489828a01613a03565b9450506060613fd589828a01613a03565b9350506080613fe689828a01613a03565b92505060a0613ff789828a01613a03565b9150509295509295509295565b60006140108383614024565b505060200190565b600061401083836140f6565b61402d81614bb4565b82525050565b61402d61403f82614bb4565b614c26565b61404d81614b95565b6140578184610aa8565b925061406282610bb5565b8060005b8381101561369f57815161407a8782614004565b965061408583614ba5565b925050600101614066565b61409981614b9b565b6140a38184610aa8565b92506140ae82610bb5565b8060005b8381101561369f5781516140c68782614018565b96506140d183614ba5565b9250506001016140b2565b61402d81614bbf565b61402d6140f182614bbf565b614c31565b61402d81610bb5565b61402d61410b82610bb5565b610bb5565b61402d61410b82614bc4565b60006141288385610aa8565b9350614135838584614bee565b50500190565b600061414682614ba1565b6141508185614bab565b9350614160818560208601614bfa565b61416981614c52565b9093019392505050565b600061417e82614ba1565b6141888185610aa8565b9350614198818560208601614bfa565b9290920192915050565b61402d81614be3565b60006141b8600283614bab565b61031360f41b815260200192915050565b60006141d6600283614bab565b61313560f01b815260200192915050565b60006141f4602683614bab565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061423c601b83614bab565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000614275602183614bab565b7f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f8152607760f81b602082015260400192915050565b60006142b8600183614bab565b603760f81b815260200192915050565b60006142d5600283614bab565b61333760f01b815260200192915050565b60006142f3600283614bab565b610c8d60f21b815260200192915050565b6000614311600283614bab565b61313160f01b815260200192915050565b600061432f600283614bab565b61313360f01b815260200192915050565b600061434d602183614bab565b7f5369676e6564536166654d6174683a206469766973696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000614390600283614bab565b61189960f11b815260200192915050565b60006143ae600283614bab565b61323560f01b815260200192915050565b60006143cc600283614bab565b61034360f41b815260200192915050565b60006143ea600283614bab565b61199960f11b815260200192915050565b6000614408600283614bab565b61313760f01b815260200192915050565b6000614426600283614bab565b61062760f31b815260200192915050565b6000614444602183614bab565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000614487600c83614bab565b6b1d5b985d5d1a1bdc9a5e995960a21b815260200192915050565b60006144af600283614bab565b61313960f01b815260200192915050565b60006144cd600283614bab565b61191b60f11b815260200192915050565b60006144eb600b83614bab565b6a18d85b1b0819985a5b195960aa1b815260200192915050565b6000614512602783614bab565b7f5369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f815266766572666c6f7760c81b602082015260400192915050565b600061455b601483614bab565b7319985b1b189858dac81b9bdd08185b1b1bddd95960621b815260200192915050565b600061458b600183614bab565b603960f81b815260200192915050565b60006145a8600c83614bab565b6b1b9bdb9499595b9d1c985b9d60a21b815260200192915050565b60006145d0600283614bab565b61066760f31b815260200192915050565b60006145ee602483614bab565b7f5369676e6564536166654d6174683a207375627472616374696f6e206f766572815263666c6f7760e01b602082015260400192915050565b6000614634600183614bab565b601b60f91b815260200192915050565b6000614651600183614bab565b600760fb1b815260200192915050565b600061466e602083614bab565b7f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f815260200192915050565b61402d81614bdd565b60006146af8285614033565b6014820191506146bf82846140e5565b5060010192915050565b60006146d58285614033565b6014820191506146e582846140ff565b5060200192915050565b60006146fb8285614110565b6004820191506146e582846140ff565b60006147178286614110565b6004820191506126e482848661411c565b6000610ce182848661411c565b6000610a648284614173565b60208101610b9d8284614024565b6040810161475d8285614024565b610a646020830184614024565b606081016147788286614024565b6147856020830185614024565b610ce160408301846140f6565b60a081016147a08288614024565b6147ad6020830187614024565b6147ba60408301866140f6565b6147c760608301856140f6565b6147d460808301846140dc565b9695505050505050565b60c081016147ec8289614024565b6147f96020830188614024565b61480660408301876140f6565b61481360608301866140f6565b61482060808301856140f6565b61482d60a08301846140f6565b979650505050505050565b604081016148468285614024565b8181036020830152610ce1818461413b565b604081016148668285614024565b610a6460208301846140f6565b60208101610b9d82846140dc565b60208101610b9d82846140f6565b6101c0810161489e828a6140f6565b6148ab60208301896140f6565b6148b860408301886140dc565b6148c560608301876140f6565b6148d26080830186614044565b6148e0610100830185614090565b8181036101a08301526148f3818461413b565b9998505050505050505050565b60208082528101610a64818461413b565b60208101610b9d82846141a2565b60208082528101610aa5816141ab565b60208082528101610aa5816141c9565b60208082528101610aa5816141e7565b60208082528101610aa58161422f565b60208082528101610aa581614268565b60208082528101610aa5816142ab565b60208082528101610aa5816142c8565b60208082528101610aa5816142e6565b60208082528101610aa581614304565b60208082528101610aa581614322565b60208082528101610aa581614340565b60208082528101610aa581614383565b60208082528101610aa5816143a1565b60208082528101610aa5816143bf565b60208082528101610aa5816143dd565b60208082528101610aa5816143fb565b60208082528101610aa581614419565b60208082528101610aa581614437565b60208082528101610aa58161447a565b60208082528101610aa5816144a2565b60208082528101610aa5816144c0565b60208082528101610aa5816144de565b60208082528101610aa581614505565b60208082528101610aa58161454e565b60208082528101610aa58161457e565b60208082528101610aa58161459b565b60208082528101610aa5816145c3565b60208082528101610aa5816145e1565b60208082528101610aa581614627565b60208082528101610aa581614644565b60208082528101610aa581614661565b6040810161486682856140f6565b60608101614b2b82866140f6565b61478560208301856140f6565b60208101610b9d828461469a565b60405181810167ffffffffffffffff81118282101715614b6557600080fd5b604052919050565b600067ffffffffffffffff821115614b8457600080fd5b506020601f91909101601f19160190565b50600490565b50600590565b5190565b60200190565b90815260200190565b6000610aa582614bd1565b151590565b6001600160e01b03191690565b6001600160a01b031690565b60ff1690565b6000610aa582614bb4565b82818337506000910152565b60005b83811015614c15578181015183820152602001614bfd565b83811115612bd85750506000910152565b6000610aa582614c3c565b6000610aa582614c47565b6000610aa582614c62565b6000610aa582614c5c565b601f01601f191690565b60f81b90565b60601b90565b614c7181614bb4565b8114611da657600080fd5b614c7181614bbf565b614c7181610bb556fe000000000000000000000000d8ee69652e4e4838f2531732a46d1f7f584f0b7fa365627a7a723158200f78724654d7f31ad20e1b806e2962f95eceeb528a08ea5361163f9c180e35086c6578706572696d656e74616cf564736f6c63430005110040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000B7F72028D9b502Dc871C444363a7aC5A52546608
-----Decoded View---------------
Arg [0] : _newOwner (address): 0xB7F72028D9b502Dc871C444363a7aC5A52546608
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000B7F72028D9b502Dc871C444363a7aC5A52546608
Deployed Bytecode Sourcemap
27327:40278:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27327:40278:0;28568:30;;-1:-1:-1;;;28568:30:0;;;;;;;;;;;;;;;;44546:969;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;44546:969:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;42100:220;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42100:220:0;;;;;;;;:::i;22793:18::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22793:18:0;;;:::i;:::-;;;;;;;;24948:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24948:248:0;;;;;;;;:::i;:::-;;;;;;;;40233:163;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40233:163:0;;;:::i;40627:345::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40627:345:0;;;;;;;;:::i;33396:694::-;;;;;;;;;:::i;:::-;;;;;;;;;24379:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24379:123:0;;;:::i;23339:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23339:27:0;;;:::i;23010:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23010:23:0;;;:::i;40980:229::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40980:229:0;;;:::i;35373:442::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35373:442:0;;;;;;;;:::i;66615:987::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;66615:987:0;;;;;;;;:::i;:::-;;31098:948;;;;;;;;;:::i;22845:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22845:21:0;;;:::i;:::-;;;;;;;;23375:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23375:49:0;;;;;;;;:::i;23040:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23040:29:0;;;:::i;34241:855::-;;;;;;;;;:::i;28644:258::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28644:258:0;;;;;;;;:::i;20905:107::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20905:107:0;;;:::i;:::-;;;;;;;;39538:163;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39538:163:0;;;:::i;27810:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27810:78:0;;;:::i;:::-;;;;;;;;37779:367;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37779:367:0;;;;;;;;:::i;23191:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23191:24:0;;;:::i;39229:301::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39229:301:0;;;:::i;43507:1031::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;43507:1031:0;;;;;;;;:::i;25570:476::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25570:476:0;;;;;;;;:::i;42328:1171::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42328:1171:0;;;;;;;;:::i;:::-;;;;;;;;;;24510:149;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24510:149:0;;;;;;;;:::i;22970:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22970:31:0;;;:::i;23301:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23301:31:0;;;:::i;23113:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23113:36:0;;;:::i;38720:322::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38720:322:0;;;:::i;41531:506::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41531:506:0;;;;;;;;:::i;39803:144::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39803:144:0;;;:::i;32136:1109::-;;;;;;;;;:::i;16374:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16374:79:0;;;:::i;16720:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16720:94:0;;;:::i;41217:306::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41217:306:0;;;:::i;22818:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22818:20:0;;;:::i;27723:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27723:80:0;;;:::i;28910:366::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28910:366:0;;;;;;;;:::i;35104:261::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35104:261:0;;;;;;;;:::i;39955:189::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39955:189:0;;;;;;;;:::i;23158:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23158:26:0;;;:::i;29284:1724::-;;;;;;;;;:::i;20794:104::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20794:104:0;;;:::i;40404:215::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40404:215:0;;;;;;;;:::i;25204:358::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25204:358:0;;;;;;;;:::i;23076:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23076:30:0;;;:::i;24667:185::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24667:185:0;;;;;;;;:::i;39050:171::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39050:171:0;;;;;;;;:::i;23222:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23222:27:0;;;:::i;16969:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16969:109:0;;;;;;;;:::i;27586:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27586:35:0;;;:::i;44546:969::-;44799:20;44841:18;;44837:671;;44951:16;;-1:-1:-1;;;;;;;;;;;27761:42:0;44891:41;;-1:-1:-1;;;44951:16:0;;-1:-1:-1;;;;;44951:16:0;;;;44986:36;;:73;;27846:42;44986:73;;;45025:22;44986:73;44891:309;;-1:-1:-1;;;;;;44891:309:0;;;;;;;;;;;45078:13;;45110:18;;45165:4;;44891:309;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44891:309:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44891:309:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44891:309:0;;;;;;;;;44876:324;;45236:152;45286:12;45317:18;:16;:18::i;:::-;45354:19;45236:31;:152::i;:::-;45217:171;-1:-1:-1;45424:20:0;;-1:-1:-1;45424:18:0;;-1:-1:-1;45424:20:0:i;:::-;45409:12;:35;45405:92;;;-1:-1:-1;45480:1:0;45405:92;44546:969;;;;;:::o;42100:220::-;42198:7;42230:82;22658:6;42230:49;42266:12;:10;:12::i;:::-;42230:17;42240:6;42230:9;:17::i;:::-;:35;:49;:35;:49;:::i;:::-;:67;:82;:67;:82;:::i;:::-;42223:89;;42100:220;;;;:::o;22793:18::-;;;;;;;;;;;;;;-1:-1:-1;;22793:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24948:248::-;25082:10;25052:4;25074:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;25074:29:0;;;;;;;;;;:38;;;25128;25052:4;;25074:29;;25128:38;;;;25106:6;;25128:38;;;;;;;;;;-1:-1:-1;25184:4:0;24948:248;;;;;:::o;40233:163::-;40311:7;40343:45;40367:20;40385:1;40367:17;:20::i;40343:45::-;40336:52;;40233:163;;:::o;40627:345::-;40739:7;40764:19;40786:18;:16;:18::i;:::-;40764:40;-1:-1:-1;40819:16:0;;40815:150;;40859:94;40897:11;40927;40859:19;:94::i;:::-;40852:101;;;;;40815:150;40627:345;;;;:::o;33396:694::-;33761:7;33770;33861:221;33888:6;33909:14;33938:13;33966:19;34000:22;34037:6;34058:13;33861:12;:221::i;:::-;33854:228;;;;33396:694;;;;;;;;;;:::o;24379:123::-;24482:12;;24379:123;:::o;23339:27::-;;;;:::o;23010:23::-;;;;:::o;40980:229::-;41174:16;;;41088:113;;-1:-1:-1;;;41088:113:0;;41056:7;;-1:-1:-1;;;;;;;;;;;27761:42:0;41088:43;;:113;;41154:4;;-1:-1:-1;;;41174:16:0;;-1:-1:-1;;;;;41174:16:0;;41088:113;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41088:113:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41088:113:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41088:113:0;;;;;;;;35373:442;-1:-1:-1;;;;;35627:14:0;;35503:4;35627:14;;;:7;:14;;;;;;;;35642:10;35627:26;;;;;;;;35532:275;;35568:5;;35588:3;;35606:6;;35532:21;:275::i;:::-;35525:282;35373:442;-1:-1:-1;;;;35373:442:0:o;66615:987::-;66755:7;:5;:7::i;:::-;-1:-1:-1;;;;;66741:21:0;:10;-1:-1:-1;;;;;66741:21:0;;66737:381;;66904:24;66898:31;66976:25;66970:32;67039:10;-1:-1:-1;;;;;67039:25:0;;;:66;;;;;67086:19;-1:-1:-1;;;;;67068:37:0;:14;-1:-1:-1;;;;;67068:37:0;;67039:66;67031:75;;;;;;66737:381;;;67154:7;;;-1:-1:-1;;;;;67172:24:0;;;-1:-1:-1;;;;;;67172:24:0;;;;;;67226:28;;67154:7;;;67130:21;;67234:4;;67226:28;;67245:8;;67226:28;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;;67385:4:0;67379:11;67209:45;;-1:-1:-1;67344:14:0;;;67267:12;67379:11;67404:28;67449:13;67446:2;;67477:4;67472:3;67465:17;67446:2;67507:7;:23;;-1:-1:-1;;;;;;67507:23:0;-1:-1:-1;;;;;67507:23:0;;;;;67579:4;67574:3;67567:17;31098:948;31703:7;31712;31802:236;31824:6;31845:14;31874:19;31908;31942:22;31979:8;32002;31802:236;;;;;;;;;;;;:7;:236::i;:::-;31795:243;;;;31098:948;;;;;;;;;;;:::o;22845:21::-;;;;;;:::o;23375:49::-;;;;;;;;;;;;;:::o;23040:29::-;;;;:::o;34241:855::-;34767:7;;34735:12;-1:-1:-1;;;;;21074:20:0;;21070:82;;-1:-1:-1;20969:42:0;21070:82;21168:26;;-1:-1:-1;;;21168:26:0;;20855:42;;21168:18;;:26;;21187:6;;21168:26;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21168:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21168:26:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21168:26:0;;;;;;;;;:31;21164:531;;21216:20;21239:9;21216:32;;34867:221;34894:6;34915:14;34944:13;34972:19;35006:22;35043:6;35064:13;34867:12;:221::i;:::-;34860:228;;;;21333:5;21299:22;21308:12;21299:8;:22::i;:::-;21324:5;21299:30;21298:40;;;;;;;-1:-1:-1;;;;;;21359:30:0;;20969:42;21359:30;21355:293;;;21410:74;;-1:-1:-1;;;21410:74:0;;20969:42;;21410:20;;:74;;21453:12;;21410:74;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21410:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21410:74:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21410:74:0;;;;;;;;;;21355:293;;;21525:107;;-1:-1:-1;;;21525:107:0;;20969:42;;21525:24;;:107;;21572:6;;21601:12;;21525:107;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21525:107:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21525:107:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21525:107:0;;;;;;;;;;21355:293;21164:531;;;;34867:221;34894:6;34915:14;34944:13;34972:19;35006:22;35043:6;35064:13;34867:12;:221::i;:::-;34860:228;;;;21682:1;34241:855;;;;;;;;;;;;:::o;28644:258::-;28776:7;10518:1;11211:14;;:39;11203:64;;;;-1:-1:-1;;;11203:64:0;;;;;;;;;10626:1;11278:14;:40;28822:72;28847:8;28870:13;28822:10;:72::i;:::-;28815:79;;11329:1;10518;11341:14;:38;28644:258;;-1:-1:-1;;28644:258:0:o;20905:107::-;20969:42;20905:107;:::o;39538:163::-;39619:7;39651:42;39674:18;:16;:18::i;:::-;39651:22;:42::i;27810:78::-;27846:42;27810:78;:::o;37779:367::-;37869:6;37893:12;37949:4;27944:66;37955:18;;37932:42;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;37932:42:0;;;37908:77;;;;;;37893:92;;38005:133;38029:4;38048:8;:14;38057:4;-1:-1:-1;;;;;38048:14:0;-1:-1:-1;;;;;38048:14:0;;;;;;;;;;;;;38077:12;:10;:12::i;:::-;-1:-1:-1;;;;;38104:23:0;;;;;;:17;:23;;;;;;38005:9;:133::i;23191:24::-;;;;:::o;39229:301::-;39304:7;39329:19;39351:20;39369:1;39351:17;:20::i;:::-;39329:42;;39382:19;39404:18;:16;:18::i;:::-;39382:40;;39451:11;39437;:25;39433:90;;;39486:25;;;-1:-1:-1;39479:32:0;;39433:90;39229:301;;;:::o;43507:1031::-;43759:7;43805:17;;43801:730;;43842:23;43869:152;43919:12;43950:18;:16;:18::i;:::-;43987:19;43869:31;:152::i;:::-;43839:182;;;;44061:20;:18;:20::i;:::-;44042:15;:39;44038:482;;44179:16;;44109:348;;44454:2;;-1:-1:-1;;;;;;;;;;;27761:42:0;44109:47;;-1:-1:-1;;;44179:16:0;;-1:-1:-1;;;;;44179:16:0;;;;44218:36;;:73;;27846:42;44218:73;;;44257:22;44218:73;44109:340;;-1:-1:-1;;;;;;44109:340:0;;;;;;;;;;;44314:15;;44352:18;;44410:4;;44109:340;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44109:340:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44109:340:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44109:340:0;;;;;;;;;:344;:348;:344;:348;:::i;:::-;44102:355;;;;;44038:482;43801:730;43507:1031;;;;;:::o;25570:476::-;25742:10;25693:4;25734:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;25734:29:0;;;;;;;;;;25778:28;;;25774:134;;-1:-1:-1;25834:1:0;25774:134;;;25868:28;;;25774:134;25926:10;25918:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;25918:29:0;;;;;;;;;;;:40;;;25976;;25918:29;;25926:10;25976:40;;;;25950:8;;25976:40;;;;;;;;;;-1:-1:-1;26034:4:0;;25570:476;-1:-1:-1;;;25570:476:0:o;42328:1171::-;42584:17;;;-1:-1:-1;;;;;42665:36:0;;42661:103;;27846:42;42718:34;;42661:103;42776:20;42799:123;42827:22;42864:19;42898:13;42799;:123::i;:::-;42776:146;;42963:96;43007:14;43036:12;42963:29;:96::i;:::-;42935:124;;-1:-1:-1;42935:124:0;-1:-1:-1;43086:20:0;:18;:20::i;:::-;43074:9;:32;43070:81;;;-1:-1:-1;43131:1:0;;-1:-1:-1;43131:1:0;;-1:-1:-1;43131:1:0;;-1:-1:-1;43123:16:0;;43070:81;43179:42;:13;43211:9;43179:42;:31;:42;:::i;:::-;43314:16;;;43247:244;;-1:-1:-1;;;43247:244:0;;43163:58;;-1:-1:-1;;;;;;;;;;;;27761:42:0;43247:52;;:244;;-1:-1:-1;;;43314:16:0;;-1:-1:-1;;;;;43314:16:0;;43345:22;;43163:58;;43410:19;;43444:12;;43471:9;;43247:244;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43247:244:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43247:244:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43247:244:0;;;;;;;;;43234:257;;42328:1171;;;;;;;;;;:::o;24510:149::-;-1:-1:-1;;;;;24635:16:0;24603:7;24635:16;;;:8;:16;;;;;;;24510:149::o;22970:31::-;;;-1:-1:-1;;;22970:31:0;;-1:-1:-1;;;;;22970:31:0;;:::o;23301:::-;;;;:::o;23113:36::-;;;;:::o;38720:322::-;38790:7;38824:22;38887:15;-1:-1:-1;;;;;38861:42:0;:15;;;;;;;;;-1:-1:-1;;;;;38861:15:0;-1:-1:-1;;;;;38861:42:0;;38857:112;;38940:17;:15;:17::i;:::-;38920:37;-1:-1:-1;;38857:112:0;38988:46;39000:33;39018:14;39000:17;:33::i;:::-;38988:11;:46::i;:::-;38981:53;;;38720:322;:::o;41531:506::-;41641:7;;41690:67;41703:37;41742:14;41690:12;:67::i;:::-;41666:91;;41775:254;41844:184;22721:6;41951:7;42014:13;41844:12;:184::i;:::-;41775:50;41811:13;41775:17;:15;:17::i;39803:144::-;39881:7;39913:26;39937:1;39913:23;:26::i;32136:1109::-;32902:7;;32870:12;-1:-1:-1;;;;;21074:20:0;;21070:82;;-1:-1:-1;20969:42:0;21070:82;21168:26;;-1:-1:-1;;;21168:26:0;;20855:42;;21168:18;;:26;;21187:6;;21168:26;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21168:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21168:26:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21168:26:0;;;;;;;;;:31;21164:531;;21216:20;21239:9;21216:32;;33001:236;33023:6;33044:14;33073:19;33107;33141:22;33178:8;33201;33001:236;;;;;;;;;;;;:7;:236::i;:::-;32994:243;;;;21333:5;21299:22;21308:12;21299:8;:22::i;:::-;21324:5;21299:30;21298:40;;;;;;;-1:-1:-1;;;;;;21359:30:0;;20969:42;21359:30;21355:293;;;21410:74;;-1:-1:-1;;;21410:74:0;;20969:42;;21410:20;;:74;;21453:12;;21410:74;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21410:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21410:74:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21410:74:0;;;;;;;;;;21355:293;;;21525:107;;-1:-1:-1;;;21525:107:0;;20969:42;;21525:24;;:107;;21572:6;;21601:12;;21525:107;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21525:107:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21525:107:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21525:107:0;;;;;;;;;;21355:293;21164:531;;;;33001:236;33023:6;33044:14;33073:19;33107;33141:22;33178:8;33201;33001:236;;;;;;;;;;;;:7;:236::i;:::-;32994:243;;;;21682:1;32136:1109;;;;;;;;;;;;;:::o;16374:79::-;16439:6;;-1:-1:-1;;;;;16439:6:0;16374:79;:::o;16720:94::-;16800:6;;16760:4;;-1:-1:-1;;;;;16800:6:0;16784:12;:10;:12::i;:::-;-1:-1:-1;;;;;16784:22:0;;16777:29;;16720:94;:::o;41217:306::-;41293:7;41318:22;41381:15;-1:-1:-1;;;;;41355:42:0;:15;;;;;;;;;-1:-1:-1;;;;;41355:15:0;-1:-1:-1;;;;;41355:42:0;;41351:112;;41434:17;:15;:17::i;:::-;41414:37;-1:-1:-1;;41351:112:0;41482:33;41500:14;41482:17;:33::i;22818:20::-;;;;;;;;;;;;;;;-1:-1:-1;;22818:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27723:80;-1:-1:-1;;;;;;;;;;;27723:80:0;:::o;28910:366::-;29039:22;10518:1;11211:14;;:39;11203:64;;;;-1:-1:-1;;;11203:64:0;;;;;;;;;10626:1;11278:14;:40;29096:46;29121:10;29096;:46::i;:::-;29079:63;-1:-1:-1;29159:19:0;;29155:114;;29195:62;29209:16;;;;;;;;;-1:-1:-1;;;;;29209:16:0;29227:8;29237:14;29195:62;;;;;;;;;;;;;-1:-1:-1;;;29195:62:0;;;:13;:62::i;35104:261::-;35206:4;35235:122;35271:10;35296:3;35314:6;-1:-1:-1;;35235:21:0;:122::i;39955:189::-;40067:7;40099:37;40123:12;40099:23;:37::i;23158:26::-;;;;:::o;29284:1724::-;29582:12;10518:1;11211:14;;:39;11203:64;;;;-1:-1:-1;;;11203:64:0;;;;;;;;;10626:1;11278:14;:40;;;29530:7;-1:-1:-1;;;;;;29530:7:0;22211:14;29530:7;22211:9;:14::i;:::-;22210:15;22202:40;;;;-1:-1:-1;;;22202:40:0;;;;;;;;;27508:17;:15;:17::i;:::-;29620;29612:32;;;;-1:-1:-1;;;29612:32:0;;;;;;;;;29690:26;29719:36;:21;29745:9;29719:36;:25;:36;:::i;:::-;29690:65;;29766:27;29796:58;29835:18;:16;:18::i;:::-;29796:20;:18;:20::i;:58::-;29766:88;;29950:19;29928;:41;;;;30030:61;30044:16;;;;;;;;;-1:-1:-1;;;;;30044:16:0;30062:8;30072:12;30030:61;;;;;;;;;;;;;-1:-1:-1;;;30030:61:0;;;:13;:61::i;:::-;30104:21;30140:28;30136:179;;30196:4;;30185:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;30185:15:0;;-1:-1:-1;30136:179:0;;-1:-1:-1;;;30136:179:0;;30284:9;;30268:27;;;;;;;;;;;;;;;;;30244:59;;30298:4;;;;30244:59;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;30244:59:0;;;30233:70;;30136:179;30355:12;30369:23;27672:42;-1:-1:-1;;;;;30396:20:0;30423:9;30489:10;30545:6;30570:8;30448:145;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;30448:145:0;;;;;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;30448:145:0;30396:208;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;30354:250:0;;;;30623:7;30615:31;;;;-1:-1:-1;;;30615:31:0;;;;;;;;;30717:1;30695:19;:23;30795:21;:43;-1:-1:-1;30795:43:0;;;:145;;;30921:19;30855:62;30898:18;:16;:18::i;30855:62::-;:85;;30795:145;30773:197;;;;-1:-1:-1;;;30773:197:0;;;;;;;;;10518:1;11341:14;:38;30990:10;29284:1724;-1:-1:-1;;;;;;;;;;;;;29284:1724:0:o;20794:104::-;20855:42;20794:104;:::o;40404:215::-;40516:7;40548:63;40572:38;40597:12;40572:20;40590:1;40572:17;:20::i;25204:358::-;25371:10;25322:4;25363:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;25363:29:0;;;;;;;;;;25322:4;;25363:60;;25411:11;25363:60;:47;:60;:::i;:::-;25442:10;25434:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;25434:29:0;;;;;;;;;;;:40;;;25492;;25344:79;;-1:-1:-1;25434:29:0;25492:40;;;;25344:79;;25492:40;;23076:30;;;;:::o;24667:185::-;-1:-1:-1;;;;;24819:15:0;;;24787:7;24819:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;;24667:185::o;39050:171::-;-1:-1:-1;;;;;39189:24:0;39148:7;39189:24;;;:17;:24;;;;;;;39050:171::o;23222:27::-;;;;:::o;16969:109::-;16586:9;:7;:9::i;:::-;16578:34;;;;-1:-1:-1;;;16578:34:0;;;;;;;;;17042:28;17061:8;17042:18;:28::i;:::-;16969:109;:::o;27586:35::-;27620:1;27586:35;:::o;52974:1039::-;53188:20;53210:29;53241:23;53297:88;53336:12;53363:11;53297:24;:88::i;:::-;53282:103;-1:-1:-1;53545:376:0;53627:279;22658:6;53676:172;53815:32;53676:108;22658:6;53676:63;53282:103;53719:19;53676:63;:42;:63;:::i;:172::-;53627:12;:279::i;:::-;53545:45;:12;22658:6;53545:45;:30;:45;:::i;:376::-;53527:394;-1:-1:-1;53958:47:0;53527:394;53992:12;53958:47;:33;:47;:::i;:::-;53934:71;;52974:1039;;;;;;;:::o;59404:169::-;59523:16;;;59516:49;;-1:-1:-1;;;59516:49:0;;59484:7;;-1:-1:-1;;;59523:16:0;;;-1:-1:-1;;;;;59523:16:0;;59516:34;;:49;;59559:4;;59516:49;;;3300:471;3358:7;3603:6;3599:47;;-1:-1:-1;3633:1:0;3626:8;;3599:47;3670:5;;;3674:1;3670;:5;:1;3694:5;;;;;:10;3686:56;;;;-1:-1:-1;;;3686:56:0;;;;;;;;4239:132;4297:7;4324:39;4328:1;4331;4324:39;;;;;;;;;;;;;;;;;:3;:39::i;65127:550::-;65238:7;65282:12;;65298:1;65282:17;65278:392;;65340:19;;65447:18;65443:141;;65502:66;65549:18;:16;:18::i;65502:66::-;65486:82;;65443:141;65607:51;:13;65643:14;65607:51;:35;:51;:::i;60377:534::-;60517:7;60546:16;;;;;:46;;;60581:11;60566;:26;;60546:46;60542:362;;;60616:276;22721:6;;60846:45;60616:207;60740:82;22721:6;-1:-1:-1;;;;;;;;;;;;;;;;60776:43:0;;:45;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60776:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60776:45:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;60776:45:0;;;;;;;;60740:82;60616:101;60674:42;60691:11;60704;60674:16;:42::i;:::-;60616:35;60639:11;60616:22;:35::i;:276::-;60609:283;;;;49900:1967;50275:7;50284;50223;;-1:-1:-1;;;;;;50223:7:0;22211:14;22221:3;22211:9;:14::i;:::-;22210:15;22202:40;;;;-1:-1:-1;;;22202:40:0;;;;;;;;;27508:17;:15;:17::i;:::-;50428:11;;;:35;;-1:-1:-1;50443:10:0;-1:-1:-1;;;;;50443:20:0;;;50428:35;50420:50;;;;-1:-1:-1;;;50420:50:0;;;;;;;;;-1:-1:-1;;;;;50487:36:0;;50483:103;;27846:42;50540:34;;50483:103;50630:16;;-1:-1:-1;;;;;50604:42:0;;;-1:-1:-1;;;50630:16:0;;;;50604:42;;50596:57;;;;-1:-1:-1;;;50596:57:0;;;;;;;;;50666:20;50689:123;50717:22;50754:19;50788:13;50689;:123::i;:::-;50666:146;-1:-1:-1;50831:17:0;50823:32;;;;-1:-1:-1;;;50823:32:0;;;;;;;;;50868:31;;:::i;:::-;50910:29;;:::i;:::-;50979:4;50952:32;;-1:-1:-1;;;;;51005:25:0;;50952:16;51005;;:25;;;51041:16;;;:25;51360:14;;;:30;;;51401:14;;;:36;;;51485:126;51559:14;51588:12;51485:29;:126::i;:::-;51450:161;;51451:14;;;51450:161;51631:228;51660:6;51479:1;51715:14;51744:22;51781:13;51451:11;51835:13;51631:14;:228::i;:::-;51624:235;;;;;;;49900:1967;;;;;;;;;;;:::o;35823:1163::-;35997:4;-1:-1:-1;;36023:16:0;:31;36019:127;;36100:34;;;;;;;;;;;;-1:-1:-1;;;36100:34:0;;;;;;:16;;36121:6;;36100:34;:20;:34;:::i;:::-;-1:-1:-1;;;;;36071:14:0;;;;;;:7;:14;;;;;;;;36086:10;36071:26;;;;;;;:63;36019:127;-1:-1:-1;;;;;36182:15:0;;;36158:21;36182:15;;;:8;:15;;;;;;;36230:13;;;;;;;;;;36256:32;;;;-1:-1:-1;;;36256:32:0;;;;;;;;;36301:24;36328:45;36360:6;36328:45;;;;;;;;;;;;;-1:-1:-1;;;36328:45:0;;;:13;:31;;:45;;;;;:::i;:::-;-1:-1:-1;;;;;36384:15:0;;;;;;:8;:15;;;;;:34;;;36301:72;;-1:-1:-1;36456:37:0;:11;36486:6;36456:37;:29;:37;:::i;:::-;-1:-1:-1;;;;;36504:13:0;;;;;;:8;:13;;;;;:30;;;36431:62;;-1:-1:-1;36608:12:0;:10;:12::i;:::-;36584:36;;36633:136;36666:5;36686:13;36714:16;36745:13;36633:18;:136::i;:::-;36780:130;36813:3;36831:11;36857:14;36886:13;36780:18;:130::i;:::-;36944:3;-1:-1:-1;;;;;36928:28:0;36937:5;-1:-1:-1;;;;;36928:28:0;;36949:6;36928:28;;;;;;;;;;;;;;;-1:-1:-1;36974:4:0;;35823:1163;-1:-1:-1;;;;;;;;;35823:1163:0:o;47395:2497::-;48038:7;48047;47986;;-1:-1:-1;;;;;;47986:7:0;22211:14;22221:3;22211:9;:14::i;:::-;22210:15;22202:40;;;;-1:-1:-1;;;22202:40:0;;;;;;;;;27508:17;:15;:17::i;:::-;48138:19;48130:33;;;;-1:-1:-1;;;48130:33:0;;;;;;;;;48184:9;:14;;:50;;;48215:19;48202:9;:32;48184:50;48176:64;;;;-1:-1:-1;;;48176:64:0;;;;;;;;;48259:24;;;;:39;;-1:-1:-1;48287:11:0;;;48259:39;48251:53;;;;-1:-1:-1;;;48251:53:0;;;;;;;;;-1:-1:-1;;;;;48323:36:0;;;;;:54;;-1:-1:-1;48363:9:0;:14;;48323:54;:69;;;-1:-1:-1;48381:11:0;;;48323:69;48315:83;;;;-1:-1:-1;;;48315:83:0;;;;;;;;;48471:11;;;:37;;-1:-1:-1;48486:10:0;-1:-1:-1;;;;;48486:22:0;;;48471:37;48463:52;;;;-1:-1:-1;;;48463:52:0;;;;;;;;;-1:-1:-1;;;;;48532:36:0;;48528:103;;27846:42;48585:34;;48528:103;48675:16;;-1:-1:-1;;;;;48649:42:0;;;-1:-1:-1;;;48675:16:0;;;;48649:42;;48641:57;;;;-1:-1:-1;;;48641:57:0;;;;;;;;;48711:31;;:::i;:::-;48753:29;;:::i;:::-;48822:4;48795:32;;-1:-1:-1;;;;;48848:27:0;;;48795:16;48848;;:27;48886;;:16;;;:27;49219:14;;;:36;;;49399:169;49445:14;49474:20;48809:1;49474:17;:20::i;:::-;49538:19;49399:31;:169::i;:::-;49349:14;49381;;;49348:220;;;;49365:14;;;;49348:220;;;;;;;49588:296;;;;;;;49361:1;49588:296;;;;49617:6;;49638:14;;49667:17;;49763:22;;49800:13;;49349:11;;49588:14;:296::i;:::-;49581:303;;;;;;47395:2497;;;;;;;;;;;;:::o;21710:247::-;21809:7;21914:2;21932:8;21914:33;21889:9;21862:11;21841:5;:32;:57;:106;21834:113;;21710:247;;;:::o;45557:878::-;45698:18;27508:17;:15;:17::i;:::-;45743:18;45734:34;;;;-1:-1:-1;;;45734:34:0;;;;;;;;;45781:20;45804:33;45816:20;45834:1;45816:17;:20::i;45804:33::-;45781:56;-1:-1:-1;45861:78:0;45781:56;45861:46;:13;22658:6;45861:46;:31;:46;:::i;:78::-;45848:91;-1:-1:-1;45956:9:0;45952:266;;45987:83;46005:16;;;;;;;;;-1:-1:-1;;;;;46005:16:0;46023:10;46043:4;46050:13;45987:83;;;;;;;;;;;;;-1:-1:-1;;;45987:83:0;;;:17;:83::i;:::-;45952:266;;;46124:13;46111:9;:26;46103:41;;;;-1:-1:-1;;;46103:41:0;;;;;;;;;27846:42;-1:-1:-1;;;;;46159:24:0;;46190:13;46159:47;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46159:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46159:47:0;;;;;45952:266;-1:-1:-1;;;;;46286:18:0;;;;;;:8;:18;;;;;;46230:197;;46263:8;;46319:56;46263:8;46335:10;46347:13;46362:12;46319:5;:56::i;:::-;46404:12;46230:18;:197::i;:::-;27536:1;45557:878;;;;:::o;59960:369::-;60073:7;60102:16;;60098:224;;60136:26;60167:17;:15;:17::i;:::-;-1:-1:-1;60135:49:0;-1:-1:-1;60206:104:0;60298:11;60206:69;60135:49;60247:27;60206:69;:40;:69;:::i;38154:558::-;38341:18;38381:21;38377:62;;-1:-1:-1;38426:1:0;38419:8;;38377:62;-1:-1:-1;38490:11:0;;38538:166;38490:11;38538:135;22778:6;38538:101;38629:8;38538:65;38545:13;38585:16;38538:65;:39;:65;:::i;:::-;:83;:101;:83;:101;:::i;:::-;:119;:135;:119;:135;:::i;:::-;:153;:166;:153;:166;:::i;:::-;38524:180;38154:558;-1:-1:-1;;;;;38154:558:0:o;1928:181::-;1986:7;2018:5;;;2042:6;;;;2034:46;;;;-1:-1:-1;;;2034:46:0;;;;;;;;52187:779;52425:13;52453:24;;52449:510;;52495:24;52521:29;-1:-1:-1;;;;;;;;;;;;;;;;52564:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52564:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52564:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;52564:38:0;;;;;;;;;52673:16;;;52554:150;;-1:-1:-1;;;52554:150:0;;-1:-1:-1;;;;;52554:59:0;;;;;;:150;;52632:22;;-1:-1:-1;;;52673:16:0;;;;;;;52554:150;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52554:150:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52554:150:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;52554:150:0;;;;;;;;;52494:210;;;;52723:16;52743:1;52723:21;52719:229;;52780:152;52919:12;52780:112;52870:21;52780:63;:19;52826:16;52780:63;:45;:63;:::i;:152::-;52765:167;;52719:229;52449:510;;52187:779;;;;;:::o;64224:895::-;64379:20;;;64463:67;64476:37;64515:14;64463:12;:67::i;:::-;64439:91;-1:-1:-1;64558:180:0;64597:95;64439:91;64597:58;:13;22721:6;64597:58;:35;:58;:::i;:95::-;64707:20;64725:1;64707:17;:20::i;:::-;64558:24;:180::i;:::-;64543:195;;64841:270;65097:13;64841:237;64938:139;64969:12;65000:7;65063:13;64938:12;:139::i;:::-;64841:78;:13;64873:45;64841:78;:31;:78;:::i;:270::-;64826:285;;64224:895;;;;;;:::o;63547:669::-;64021:16;;;63931:117;;-1:-1:-1;;;63931:117:0;;63638:26;;;;;;-1:-1:-1;;;;;;;;;;;27761:42:0;63931:47;;:117;;64001:4;;-1:-1:-1;;;64021:16:0;;;-1:-1:-1;;;;;64021:16:0;;63931:117;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63931:117:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63931:117:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;63931:117:0;;;;;;;;;-1:-1:-1;63871:177:0;;-1:-1:-1;63871:177:0;-1:-1:-1;63871:177:0;-1:-1:-1;64078:130:0;;-1:-1:-1;22721:6:0;;-1:-1:-1;64078:89:0;64111:55;22721:6;63871:177;64111:12;:55::i;:::-;64078:14;;:89;:32;:89;:::i;:130::-;64061:147;;63547:669;;;:::o;59618:334::-;59772:12;;59720:7;;59804:21;:140;;59932:12;;59804:140;;;59841:88;59912:16;59841:48;:11;22658:6;59841:48;:33;:48;:::i;65685:494::-;65850:7;65882:16;:289;;22721:6;65882:289;;;65914:220;22721:6;65914:175;66076:12;65914:124;66029:8;65914:124;65994:11;65914:57;:12;22721:6;65914:57;:34;:57;:::i;60919:671::-;61034:7;;61096:17;;61092:361;;61134:15;;61160;-1:-1:-1;;;;;61134:42:0;;;:15;;;;;:42;61130:120;;61217:17;:15;:17::i;:::-;61197:37;-1:-1:-1;;61130:120:0;61266:15;61284:58;61327:14;61284:20;:18;:20::i;:58::-;61266:76;;61376:7;61361:12;:22;61357:85;;;61419:7;61404:22;;61357:85;61092:361;;61472:110;61511:12;61538:33;61556:14;61538:17;:33::i;15165:98::-;15245:10;15165:98;:::o;46443:944::-;46554:22;27508:17;:15;:17::i;:::-;46602:15;46594:30;;;;-1:-1:-1;;;46594:30:0;;;;;;;;;46654:21;46664:10;46654:9;:21::i;:::-;46641:10;:34;46637:156;;;-1:-1:-1;;46700:10:0;:25;46692:40;;;;-1:-1:-1;;;46692:40:0;;;;;;;;;46760:21;46770:10;46760:9;:21::i;:::-;46747:34;;46637:156;46805:20;46828:33;46840:20;46858:1;46840:17;:20::i;46828:33::-;46805:56;-1:-1:-1;46874:22:0;46899:75;22658:6;46899:42;:10;46805:56;46899:42;:28;:42;:::i;:75::-;46874:100;;46985:37;47025:20;:18;:20::i;:::-;46985:60;;47075:14;47058:31;;47126:29;47108:14;:47;;47100:62;;;;-1:-1:-1;;;47100:62:0;;;;;;;;;47208:10;47233:20;;;;:8;:20;;;;;;47175:204;;47208:10;47268:59;47208:10;47286;47298:14;47314:12;47268:5;:59::i;:::-;47356:12;47175:18;:204::i;:::-;27536:1;;;46443:944;;;:::o;58327:324::-;58542:67;;58488:155;;58522:5;;-1:-1:-1;;;58565:31:0;58542:67;;58598:2;;58602:6;;58542:67;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;58542:67:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;58542:67:0;;;179:29:-1;;;;160:49;;;58624:8:0;58488:19;:155::i;:::-;58327:324;;;;:::o;22270:269::-;22361:13;22392:12;22434:3;22086:66;22439:22;;22417:45;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;22417:45:0;;;22407:56;;49:4:-1;22407:56:0;;;;22510:11;;22483:49;-1:-1:-1;;;22483:49:0:o;51875:304::-;51986:15;;51955;;-1:-1:-1;;;;;51986:21:0;;;:15;;;;;:21;51982:190;;52092:16;;;52024:99;;-1:-1:-1;;;52024:99:0;;-1:-1:-1;;;;;;;;;;;27761:42:0;52024:49;;:99;;-1:-1:-1;;;52092:16:0;;;-1:-1:-1;;;;;52092:16:0;;52024:99;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52024:99:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;52140:15:0;:20;;-1:-1:-1;;;;;52140:20:0;;;;-1:-1:-1;;52140:20:0;;;;;;-1:-1:-1;;51875:304:0;:::o;2384:136::-;2442:7;2469:43;2473:1;2476;2469:43;;;;;;;;;;;;;;;;;:3;:43::i;17184:229::-;-1:-1:-1;;;;;17258:22:0;;17250:73;;;;-1:-1:-1;;;17250:73:0;;;;;;;;;17360:6;;17339:38;;-1:-1:-1;;;;;17339:38:0;;;;17360:6;;17339:38;;17360:6;;17339:38;17388:6;:17;;-1:-1:-1;;;;;;17388:17:0;-1:-1:-1;;;;;17388:17:0;;;;;;;;;;17184:229::o;61598:1941::-;61747:16;61781;61800:107;61831:39;61854:15;61831:18;:16;:18::i;:39::-;61885:11;61800:16;:107::i;:::-;62003:8;;62051:14;;62102:11;;62148:9;;62195:12;;61781:126;;-1:-1:-1;61920:19:0;;;;62003:8;62051:14;62102:11;62148:9;62224:26;;;62220:170;;;62363:15;62352:26;;62220:170;62417:13;62406:8;:24;62402:1130;;;62598:25;;;;;22721:6;62523:37;;;62642:23;;;62638:69;;;62695:12;62684:23;;62638:69;62738:136;22721:6;62738:91;62815:13;62738:54;:18;62779:12;62738:54;:40;:54;:::i;:136::-;62724:150;;62902:146;63036:11;62902:111;63000:12;62902:75;62933:43;62946:16;62964:11;62933:12;:43::i;:::-;62902:8;;:75;:30;:75;:::i;:146::-;62891:157;;62402:1130;;;;63092:131;63210:12;63092:95;22721:6;63092:50;:8;63123:18;63092:50;:30;:50;:::i;:131::-;63081:142;-1:-1:-1;63254:12:0;;-1:-1:-1;63254:12:0;;63295:54;:18;63254:12;63295:54;:40;:54;:::i;:::-;63281:68;;63381:11;63370:8;:22;63366:154;;;63422:11;63411:22;;63366:154;;;63468:11;63457:8;:22;63453:67;;;63509:11;63498:22;;63453:67;61598:1941;;;;;;;;;;;;:::o;4901:346::-;4987:7;5090:12;5082:6;5074:29;;;;-1:-1:-1;;;5074:29:0;;;;;;;;;;;5114:9;5130:1;5126;:5;;;;;;;4901:346;-1:-1:-1;;;;;4901:346:0:o;66187:384::-;66324:7;66353:16;;;;;:36;;-1:-1:-1;66373:16:0;;;66353:36;66349:215;;;66461:91;66540:11;66461:56;:11;22721:6;66461:56;:33;:56;:::i;54050:2170::-;54362:7;54371;54423:20;:18;:20::i;:::-;54405:14;;;;:38;;;;:101;;-1:-1:-1;54476:16:0;;;;-1:-1:-1;;;;;54476:30:0;;;54405:101;54396:152;;;;-1:-1:-1;;;54396:152:0;;;;;;;;;54562:16;;;;-1:-1:-1;;;;;54562:30:0;54558:121;;54628:16;;;;-1:-1:-1;;;;;54609:35:0;:16;;;:35;54558:121;54766:16;54785:147;54816:22;54853:13;54881:11;54907:14;54785:16;:147::i;:::-;55070:14;;;;55037;;;;54766:166;;-1:-1:-1;55037:48:0;;:14;:32;:48::i;:::-;55020:14;;;:65;55118:19;;55114:222;;55272:14;;;;:52;;55309:14;55272:36;:52::i;:::-;55255:14;;;:69;55114:222;55348:17;55368:19;:60;;55423:5;55368:60;;;55403:4;55368:60;55348:80;;55441:20;55464:13;:126;55527:22;55564:12;55496:91;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;55496:91:0;;;55486:102;;49:4:-1;55486:102:0;;;;55464:126;;;;;;;;;;55478:111;55464:126;;;-1:-1:-1;55660:67:0;55673:37;55712:14;55660:12;:67::i;:::-;55643:84;;-1:-1:-1;;;;;;;;;;;;;;;;55775:47:0;;55829:8;55884:12;55911:6;55932:12;55959:14;56005:13;56033:11;56059:13;55775:308;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55775:308:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55775:308:0;;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;55775:308:0;;;;;;;;;55757:14;;;55740:343;55741:14;;;55740:343;;;56094:35;;;;-1:-1:-1;;;56094:35:0;;;;;;;;;-1:-1:-1;;;56150:14:0;;;;56166;;;;;56150;;56166;;-1:-1:-1;54050:2170:0;;-1:-1:-1;;;;;;;54050:2170:0:o;2857:192::-;2943:7;2979:12;2971:6;;;;2963:29;;;;-1:-1:-1;;;2963:29:0;;;;;;;;;;-1:-1:-1;;;3015:5:0;;;2857:192::o;36994:742::-;37212:43;;37173:12;;37212:43;;37229:5;;27944:66;;37212:43;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;37212:43:0;;;37188:78;;;;;;37173:93;;37279:21;37315:11;37330:1;37315:16;37311:290;;;37364:1;37348:17;;37311:290;;;37387:16;;37383:218;;-1:-1:-1;;;;;37550:24:0;;;;;;:17;:24;;;;;;37437:152;;37465:4;;37488:11;;37518:13;;37437:9;:152::i;:::-;37420:169;;37383:218;37637:28;;-1:-1:-1;;;;;37688:24:0;;;;;;;:17;:24;;;;;:40;;;;-1:-1:-1;;36994:742:0:o;58659:361::-;58901:77;;58847:165;;58881:5;;-1:-1:-1;;;58924:35:0;58901:77;;58961:4;;58967:2;;58971:6;;58901:77;;;;58847:165;58659:361;;;;;:::o;26054:556::-;26215:7;-1:-1:-1;;;;;26248:17:0;;26240:32;;;;-1:-1:-1;;;26240:32:0;;;;;;;;;-1:-1:-1;;;;;26304:13:0;;26285:16;26304:13;;;:8;:13;;;;;;:45;;26336:12;26304:45;:31;:45;:::i;:::-;-1:-1:-1;;;;;26360:13:0;;;;;;:8;:13;;;;;:24;;;26412:12;;26285:64;;-1:-1:-1;26412:44:0;;26443:12;26412:44;:30;:44;:::i;:::-;26397:12;:59;26474:45;;-1:-1:-1;;;;;26474:45:0;;;;;;;26484:12;;26498;;26512:6;;26474:45;;;;;;;;;;26556:3;-1:-1:-1;;;;;26535:39:0;26552:1;-1:-1:-1;;;;;26535:39:0;;26561:12;26535:39;;;;;;;;;;;;;;;26594:8;26054:556;-1:-1:-1;;;;;26054:556:0:o;9353:218::-;9409:6;9439:5;;;9464:6;;;;;;:16;;;9479:1;9474;:6;;9464:16;9463:38;;;;9490:1;9486;:5;:14;;;;;9499:1;9495;:5;9486:14;9455:87;;;;-1:-1:-1;;;9455:87:0;;;;;;;;7789:568;7845:6;8089;8085:47;;-1:-1:-1;8119:1:0;8112:8;;8085:47;8154:1;-1:-1:-1;;8154:7:0;:27;;;;;-1:-1:-1;;;8165:1:0;:16;8154:27;8152:30;8144:82;;;;-1:-1:-1;;;8144:82:0;;;;;;;;;8250:5;;;8254:1;8250;:5;:1;8274:5;;;;;:10;8266:62;;;;-1:-1:-1;;;8266:62:0;;;;;;;;8831:271;8887:6;8914;8906:51;;;;-1:-1:-1;;;8906:51:0;;;;;;;;;8978:1;-1:-1:-1;;8978:7:0;:27;;;;;-1:-1:-1;;;8989:1:0;:16;8978:27;8976:30;8968:76;;;;-1:-1:-1;;;8968:76:0;;;;;;;;;9057:8;9072:1;9068;:5;;;;;;;8831:271;-1:-1:-1;;;;8831:271:0:o;9816:215::-;9872:6;9902:5;;;9927:6;;;;;;:16;;;9942:1;9937;:6;;9927:16;9926:38;;;;9953:1;9949;:5;:14;;;;;9962:1;9958;:5;9949:14;9918:84;;;;-1:-1:-1;;;9918:84:0;;;;;;;;26618:702;26824:38;;;;;;;;;;;-1:-1:-1;;;26824:38:0;;;;;;;;-1:-1:-1;;;;;26824:14:0;;26780:7;26824:14;;;:8;:14;;;;;;;26780:7;;26824:38;;:14;26843:12;;26824:38;:18;:38;:::i;:::-;26805:57;;26972:2;26960:8;:14;26956:115;;27006:26;:12;27023:8;27006:26;:16;:26;:::i;:::-;26991:41;;27058:1;27047:12;;26956:115;-1:-1:-1;;;;;27081:14:0;;;;;;:8;:14;;;;;:25;;;27134:12;;:30;;27151:12;27134:30;:16;:30;:::i;:::-;27119:12;:45;27182:46;;-1:-1:-1;;;;;27182:46:0;;;;;;;27193:12;;27207;;27221:6;;27182:46;;;;;;;;;;27267:1;-1:-1:-1;;;;;27244:40:0;27253:4;-1:-1:-1;;;;;27244:40:0;;27271:12;27244:40;;;;;;;59028:368;59178:12;59192:23;59219:5;-1:-1:-1;;;;;59219:10:0;59230:4;59219:16;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;59177:58:0;;;;59254:7;59263:8;59246:26;;;;;-1:-1:-1;;;59246:26:0;;;;;;;;;;-1:-1:-1;59289:17:0;;:22;59285:104;;59347:10;59336:30;;;;;;;;;;;;;;59368:8;59328:49;;;;;-1:-1:-1;;;59328:49:0;;;;;;;;;;;59028:368;;;;;:::o;56567:1752::-;56891:16;;56937;;;;;56987:14;;;57036;;;;57091;;;;56788:16;;27846:42;;-1:-1:-1;;;;;;;;56891:16:0;;;;;;56937;;56987:14;;57036;;57126:43;;;;;57118:58;;;;-1:-1:-1;;;57118:58:0;;;;;;;;;57200:9;;-1:-1:-1;57226:21:0;;57222:414;;57290:66;57304:17;57323:8;57333:16;57290:66;;;;;;;;;;;;;-1:-1:-1;;;57290:66:0;;;:13;:66::i;:::-;57390:16;57375:12;:31;57371:156;;;57427:84;57441:17;-1:-1:-1;;;;;;;;;;;57488:16:0;57473:12;:31;57427:84;;;;;;;;;;;;;-1:-1:-1;;;57427:84:0;;;:13;:84::i;:::-;57222:414;;;57559:65;57573:17;-1:-1:-1;;;;;;;;;;;57605:12:0;57559:65;;;;;;;;;;;;;-1:-1:-1;;;57559:65:0;;;:13;:65::i;:::-;57652:24;;57648:519;;57723:10;-1:-1:-1;;;;;57697:36:0;:22;-1:-1:-1;;;;;57697:36:0;;:53;;;;-1:-1:-1;57737:13:0;;;57697:53;:88;;;;;57766:19;57754:8;:31;;57697:88;57693:463;;;57812:10;-1:-1:-1;;;;;57806:25:0;;57838:19;57806:54;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57806:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57806:54:0;;;;;57879:77;57893:22;-1:-1:-1;;;;;;;;;;;57930:19:0;57879:77;;;;;;;;;;;;;-1:-1:-1;;;57879:77:0;;;:13;:77::i;:::-;57987:19;57975:31;;;;57693:463;;;58047:93;58065:22;58089:10;-1:-1:-1;;;;;;;;;;;58114:19:0;58047:93;;;;;;;;;;;;;-1:-1:-1;;;58047:93:0;;;:17;:93::i;:::-;58183:18;;58179:133;;58218:82;58236:17;58255:10;-1:-1:-1;;;;;;;;;;;58280:13:0;58218:82;;;;;;;;;;;;;-1:-1:-1;;;58218:82:0;;;:17;:82::i;:::-;56567:1752;;;;;;;;;;;;:::o;27327:40278::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;27327:40278:0;;;-1:-1:-1;;27327:40278:0:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;27327:40278:0;;;-1:-1:-1;;27327:40278:0:o;5:130:-1:-;72:20;;97:33;72:20;97:33;;142:134;220:13;;238:33;220:13;238:33;;283:128;358:13;;376:30;358:13;376:30;;418:130;485:20;;510:33;485:20;510:33;;569:336;;;683:3;676:4;668:6;664:17;660:27;650:2;;701:1;698;691:12;650:2;-1:-1;721:20;;761:18;750:30;;747:2;;;793:1;790;783:12;747:2;827:4;819:6;815:17;803:29;;878:3;870:4;862:6;858:17;848:8;844:32;841:41;838:2;;;895:1;892;885:12;838:2;643:262;;;;;;914:440;;1015:3;1008:4;1000:6;996:17;992:27;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:64;1107:48;1148:6;1107:48;;;1092:64;;;1083:73;;1176:6;1169:5;1162:21;1212:4;1204:6;1200:17;1245:4;1238:5;1234:16;1280:3;1271:6;1266:3;1262:16;1259:25;1256:2;;;1297:1;1294;1287:12;1256:2;1307:41;1341:6;1336:3;1331;1307:41;;;975:379;;;;;;;;1859:134;1937:13;;1955:33;1937:13;1955:33;;2000:241;;2104:2;2092:9;2083:7;2079:23;2075:32;2072:2;;;2120:1;2117;2110:12;2072:2;2155:1;2172:53;2217:7;2197:9;2172:53;;2248:263;;2363:2;2351:9;2342:7;2338:23;2334:32;2331:2;;;2379:1;2376;2369:12;2331:2;2414:1;2431:64;2487:7;2467:9;2431:64;;2518:366;;;2639:2;2627:9;2618:7;2614:23;2610:32;2607:2;;;2655:1;2652;2645:12;2607:2;2690:1;2707:53;2752:7;2732:9;2707:53;;;2697:63;;2669:97;2797:2;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;;;2805:63;;2776:98;2601:283;;;;;;2891:491;;;;3029:2;3017:9;3008:7;3004:23;3000:32;2997:2;;;3045:1;3042;3035:12;2997:2;3080:1;3097:53;3142:7;3122:9;3097:53;;;3087:63;;3059:97;3187:2;3205:53;3250:7;3241:6;3230:9;3226:22;3205:53;;;3195:63;;3166:98;3295:2;3313:53;3358:7;3349:6;3338:9;3334:22;3313:53;;;3303:63;;3274:98;2991:391;;;;;;3389:470;;;3519:2;3507:9;3498:7;3494:23;3490:32;3487:2;;;3535:1;3532;3525:12;3487:2;3570:1;3587:53;3632:7;3612:9;3587:53;;;3577:63;;3549:97;3705:2;3694:9;3690:18;3677:32;3729:18;3721:6;3718:30;3715:2;;;3761:1;3758;3751:12;3715:2;3781:62;3835:7;3826:6;3815:9;3811:22;3781:62;;3866:366;;;3987:2;3975:9;3966:7;3962:23;3958:32;3955:2;;;4003:1;4000;3993:12;3955:2;4038:1;4055:53;4100:7;4080:9;4055:53;;;4045:63;;4017:97;4145:2;4163:53;4208:7;4199:6;4188:9;4184:22;4163:53;;4239:257;;4351:2;4339:9;4330:7;4326:23;4322:32;4319:2;;;4367:1;4364;4357:12;4319:2;4402:1;4419:61;4472:7;4452:9;4419:61;;4503:1351;;;;;;;;;;4752:3;4740:9;4731:7;4727:23;4723:33;4720:2;;;4769:1;4766;4759:12;4720:2;4804:1;4821:53;4866:7;4846:9;4821:53;;;4811:63;;4783:97;4911:2;4929:53;4974:7;4965:6;4954:9;4950:22;4929:53;;;4919:63;;4890:98;5019:2;5037:53;5082:7;5073:6;5062:9;5058:22;5037:53;;;5027:63;;4998:98;5127:2;5145:53;5190:7;5181:6;5170:9;5166:22;5145:53;;;5135:63;;5106:98;5235:3;5254:53;5299:7;5290:6;5279:9;5275:22;5254:53;;;5244:63;;5214:99;5344:3;5363:53;5408:7;5399:6;5388:9;5384:22;5363:53;;;5353:63;;5323:99;5453:3;5472:53;5517:7;5508:6;5497:9;5493:22;5472:53;;;5462:63;;5432:99;5562:3;5581:53;5626:7;5617:6;5606:9;5602:22;5581:53;;;5571:63;;5541:99;5699:3;5688:9;5684:19;5671:33;5724:18;5716:6;5713:30;5710:2;;;5756:1;5753;5746:12;5710:2;5776:62;5830:7;5821:6;5810:9;5806:22;5776:62;;;5766:72;;5650:194;4714:1140;;;;;;;;;;;;5861:1225;;;;;;;;;6093:3;6081:9;6072:7;6068:23;6064:33;6061:2;;;6110:1;6107;6100:12;6061:2;6145:1;6162:53;6207:7;6187:9;6162:53;;;6152:63;;6124:97;6252:2;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;;;6260:63;;6231:98;6360:2;6378:53;6423:7;6414:6;6403:9;6399:22;6378:53;;;6368:63;;6339:98;6468:2;6486:53;6531:7;6522:6;6511:9;6507:22;6486:53;;;6476:63;;6447:98;6576:3;6595:53;6640:7;6631:6;6620:9;6616:22;6595:53;;;6585:63;;6555:99;6685:3;6704:53;6749:7;6740:6;6729:9;6725:22;6704:53;;;6694:63;;6664:99;6794:3;6813:53;6858:7;6849:6;6838:9;6834:22;6813:53;;;6803:63;;6773:99;6931:3;6920:9;6916:19;6903:33;6956:18;6948:6;6945:30;6942:2;;;6988:1;6985;6978:12;6942:2;7008:62;7062:7;7053:6;7042:9;7038:22;7008:62;;;6998:72;;6882:194;6055:1031;;;;;;;;;;;;7093:1099;;;;;;;;7308:3;7296:9;7287:7;7283:23;7279:33;7276:2;;;7325:1;7322;7315:12;7276:2;7360:1;7377:53;7422:7;7402:9;7377:53;;;7367:63;;7339:97;7467:2;7485:53;7530:7;7521:6;7510:9;7506:22;7485:53;;;7475:63;;7446:98;7575:2;7593:53;7638:7;7629:6;7618:9;7614:22;7593:53;;;7583:63;;7554:98;7683:2;7701:53;7746:7;7737:6;7726:9;7722:22;7701:53;;;7691:63;;7662:98;7791:3;7810:53;7855:7;7846:6;7835:9;7831:22;7810:53;;;7800:63;;7770:99;7900:3;7919:53;7964:7;7955:6;7944:9;7940:22;7919:53;;;7909:63;;7879:99;8037:3;8026:9;8022:19;8009:33;8062:18;8054:6;8051:30;8048:2;;;8094:1;8091;8084:12;8048:2;8114:62;8168:7;8159:6;8148:9;8144:22;8114:62;;;8104:72;;7988:194;7270:922;;;;;;;;;;;8199:241;;8303:2;8291:9;8282:7;8278:23;8274:32;8271:2;;;8319:1;8316;8309:12;8271:2;8354:1;8371:53;8416:7;8396:9;8371:53;;8447:263;;8562:2;8550:9;8541:7;8537:23;8533:32;8530:2;;;8578:1;8575;8568:12;8530:2;8613:1;8630:64;8686:7;8666:9;8630:64;;8717:993;;;;;;;;8928:3;8916:9;8907:7;8903:23;8899:33;8896:2;;;8945:1;8942;8935:12;8896:2;8980:1;8997:53;9042:7;9022:9;8997:53;;;8987:63;;8959:97;9087:2;9105:53;9150:7;9141:6;9130:9;9126:22;9105:53;;;9095:63;;9066:98;9195:2;9213:53;9258:7;9249:6;9238:9;9234:22;9213:53;;;9203:63;;9174:98;9331:2;9320:9;9316:18;9303:32;9355:18;9347:6;9344:30;9341:2;;;9387:1;9384;9377:12;9341:2;9415:65;9472:7;9463:6;9452:9;9448:22;9415:65;;;9405:75;;;;9282:204;9545:3;9534:9;9530:19;9517:33;9570:18;9562:6;9559:30;9556:2;;;9602:1;9599;9592:12;9556:2;9630:64;9686:7;9677:6;9666:9;9662:22;9630:64;;;9620:74;;;;9496:204;8890:820;;;;;;;;;;;9717:399;;;9849:2;9837:9;9828:7;9824:23;9820:32;9817:2;;;9865:1;9862;9855:12;9817:2;9900:1;9917:64;9973:7;9953:9;9917:64;;;9907:74;;9879:108;10018:2;10036:64;10092:7;10083:6;10072:9;10068:22;10036:64;;10123:491;;;;10261:2;10249:9;10240:7;10236:23;10232:32;10229:2;;;10277:1;10274;10267:12;10229:2;10312:1;10329:53;10374:7;10354:9;10329:53;;;10319:63;;10291:97;10419:2;10437:53;10482:7;10473:6;10462:9;10458:22;10437:53;;;10427:63;;10398:98;10527:2;10545:53;10590:7;10581:6;10570:9;10566:22;10545:53;;10621:617;;;;;10776:3;10764:9;10755:7;10751:23;10747:33;10744:2;;;10793:1;10790;10783:12;10744:2;10828:1;10845:53;10890:7;10870:9;10845:53;;;10835:63;;10807:97;10935:2;10953:53;10998:7;10989:6;10978:9;10974:22;10953:53;;;10943:63;;10914:98;11043:2;11061:53;11106:7;11097:6;11086:9;11082:22;11061:53;;;11051:63;;11022:98;11151:2;11169:53;11214:7;11205:6;11194:9;11190:22;11169:53;;;11159:63;;11130:98;10738:500;;;;;;;;11245:946;;;;;;;11445:3;11433:9;11424:7;11420:23;11416:33;11413:2;;;11462:1;11459;11452:12;11413:2;11497:1;11514:64;11570:7;11550:9;11514:64;;;11504:74;;11476:108;11615:2;11633:64;11689:7;11680:6;11669:9;11665:22;11633:64;;;11623:74;;11594:109;11734:2;11752:64;11808:7;11799:6;11788:9;11784:22;11752:64;;;11742:74;;11713:109;11853:2;11871:64;11927:7;11918:6;11907:9;11903:22;11871:64;;;11861:74;;11832:109;11972:3;11991:64;12047:7;12038:6;12027:9;12023:22;11991:64;;;11981:74;;11951:110;12092:3;12111:64;12167:7;12158:6;12147:9;12143:22;12111:64;;;12101:74;;12071:110;11407:784;;;;;;;;;12199:173;;12286:46;12328:3;12320:6;12286:46;;;-1:-1;;12361:4;12352:14;;12279:93;12381:173;;12468:46;12510:3;12502:6;12468:46;;12562:103;12635:24;12653:5;12635:24;;;12630:3;12623:37;12617:48;;;12792:152;12893:45;12913:24;12931:5;12913:24;;;12893:45;;12984:660;13117:52;13163:5;13117:52;;;13182:84;13259:6;13254:3;13182:84;;;13175:91;;13287:54;13335:5;13287:54;;;13361:7;13389:1;13374:258;13399:6;13396:1;13393:13;13374:258;;;13466:6;13460:13;13487:63;13546:3;13531:13;13487:63;;;13480:70;;13567:58;13618:6;13567:58;;;13557:68;-1:-1;;13421:1;13414:9;13374:258;;13685:660;13818:52;13864:5;13818:52;;;13883:84;13960:6;13955:3;13883:84;;;13876:91;;13988:54;14036:5;13988:54;;;14062:7;14090:1;14075:258;14100:6;14097:1;14094:13;14075:258;;;14167:6;14161:13;14188:63;14247:3;14232:13;14188:63;;;14181:70;;14268:58;14319:6;14268:58;;;14258:68;-1:-1;;14122:1;14115:9;14075:258;;14353:104;14430:21;14445:5;14430:21;;14464:140;14559:39;14576:21;14591:5;14576:21;;;14559:39;;14611:113;14694:24;14712:5;14694:24;;14731:152;14832:45;14852:24;14870:5;14852:24;;;14832:45;;14890:148;14989:43;15008:23;15025:5;15008:23;;15068:310;;15200:88;15281:6;15276:3;15200:88;;;15193:95;;15300:43;15336:6;15331:3;15324:5;15300:43;;;-1:-1;;15356:16;;15186:192;15386:343;;15496:38;15528:5;15496:38;;;15546:70;15609:6;15604:3;15546:70;;;15539:77;;15621:52;15666:6;15661:3;15654:4;15647:5;15643:16;15621:52;;;15694:29;15716:6;15694:29;;;15685:39;;;;15476:253;-1:-1;;;15476:253;15736:356;;15864:38;15896:5;15864:38;;;15914:88;15995:6;15990:3;15914:88;;;15907:95;;16007:52;16052:6;16047:3;16040:4;16033:5;16029:16;16007:52;;;16071:16;;;;;15844:248;-1:-1;;15844:248;16099:174;16206:61;16261:5;16206:61;;17098:301;;17258:66;17322:1;17317:3;17258:66;;;-1:-1;;;17337:25;;17390:2;17381:12;;17244:155;-1:-1;;17244:155;17408:301;;17568:66;17632:1;17627:3;17568:66;;;-1:-1;;;17647:25;;17700:2;17691:12;;17554:155;-1:-1;;17554:155;17718:375;;17878:67;17942:2;17937:3;17878:67;;;17978:34;17958:55;;-1:-1;;;18042:2;18033:12;;18026:30;18084:2;18075:12;;17864:229;-1:-1;;17864:229;18102:327;;18262:67;18326:2;18321:3;18262:67;;;18362:29;18342:50;;18420:2;18411:12;;18248:181;-1:-1;;18248:181;18438:370;;18598:67;18662:2;18657:3;18598:67;;;18698:34;18678:55;;-1:-1;;;18762:2;18753:12;;18746:25;18799:2;18790:12;;18584:224;-1:-1;;18584:224;18817:300;;18977:66;19041:1;19036:3;18977:66;;;-1:-1;;;19056:24;;19108:2;19099:12;;18963:154;-1:-1;;18963:154;19126:301;;19286:66;19350:1;19345:3;19286:66;;;-1:-1;;;19365:25;;19418:2;19409:12;;19272:155;-1:-1;;19272:155;19436:301;;19596:66;19660:1;19655:3;19596:66;;;-1:-1;;;19675:25;;19728:2;19719:12;;19582:155;-1:-1;;19582:155;19746:301;;19906:66;19970:1;19965:3;19906:66;;;-1:-1;;;19985:25;;20038:2;20029:12;;19892:155;-1:-1;;19892:155;20056:301;;20216:66;20280:1;20275:3;20216:66;;;-1:-1;;;20295:25;;20348:2;20339:12;;20202:155;-1:-1;;20202:155;20366:370;;20526:67;20590:2;20585:3;20526:67;;;20626:34;20606:55;;-1:-1;;;20690:2;20681:12;;20674:25;20727:2;20718:12;;20512:224;-1:-1;;20512:224;20745:301;;20905:66;20969:1;20964:3;20905:66;;;-1:-1;;;20984:25;;21037:2;21028:12;;20891:155;-1:-1;;20891:155;21055:301;;21215:66;21279:1;21274:3;21215:66;;;-1:-1;;;21294:25;;21347:2;21338:12;;21201:155;-1:-1;;21201:155;21365:301;;21525:66;21589:1;21584:3;21525:66;;;-1:-1;;;21604:25;;21657:2;21648:12;;21511:155;-1:-1;;21511:155;21675:301;;21835:66;21899:1;21894:3;21835:66;;;-1:-1;;;21914:25;;21967:2;21958:12;;21821:155;-1:-1;;21821:155;21985:301;;22145:66;22209:1;22204:3;22145:66;;;-1:-1;;;22224:25;;22277:2;22268:12;;22131:155;-1:-1;;22131:155;22295:301;;22455:66;22519:1;22514:3;22455:66;;;-1:-1;;;22534:25;;22587:2;22578:12;;22441:155;-1:-1;;22441:155;22605:370;;22765:67;22829:2;22824:3;22765:67;;;22865:34;22845:55;;-1:-1;;;22929:2;22920:12;;22913:25;22966:2;22957:12;;22751:224;-1:-1;;22751:224;22984:312;;23144:67;23208:2;23203:3;23144:67;;;-1:-1;;;23224:35;;23287:2;23278:12;;23130:166;-1:-1;;23130:166;23305:301;;23465:66;23529:1;23524:3;23465:66;;;-1:-1;;;23544:25;;23597:2;23588:12;;23451:155;-1:-1;;23451:155;23615:301;;23775:66;23839:1;23834:3;23775:66;;;-1:-1;;;23854:25;;23907:2;23898:12;;23761:155;-1:-1;;23761:155;23925:311;;24085:67;24149:2;24144:3;24085:67;;;-1:-1;;;24165:34;;24227:2;24218:12;;24071:165;-1:-1;;24071:165;24245:376;;24405:67;24469:2;24464:3;24405:67;;;24505:34;24485:55;;-1:-1;;;24569:2;24560:12;;24553:31;24612:2;24603:12;;24391:230;-1:-1;;24391:230;24630:320;;24790:67;24854:2;24849:3;24790:67;;;-1:-1;;;24870:43;;24941:2;24932:12;;24776:174;-1:-1;;24776:174;24959:300;;25119:66;25183:1;25178:3;25119:66;;;-1:-1;;;25198:24;;25250:2;25241:12;;25105:154;-1:-1;;25105:154;25268:312;;25428:67;25492:2;25487:3;25428:67;;;-1:-1;;;25508:35;;25571:2;25562:12;;25414:166;-1:-1;;25414:166;25589:301;;25749:66;25813:1;25808:3;25749:66;;;-1:-1;;;25828:25;;25881:2;25872:12;;25735:155;-1:-1;;25735:155;25899:373;;26059:67;26123:2;26118:3;26059:67;;;26159:34;26139:55;;-1:-1;;;26223:2;26214:12;;26207:28;26263:2;26254:12;;26045:227;-1:-1;;26045:227;26281:300;;26441:66;26505:1;26500:3;26441:66;;;-1:-1;;;26520:24;;26572:2;26563:12;;26427:154;-1:-1;;26427:154;26590:300;;26750:66;26814:1;26809:3;26750:66;;;-1:-1;;;26829:24;;26881:2;26872:12;;26736:154;-1:-1;;26736:154;26899:332;;27059:67;27123:2;27118:3;27059:67;;;27159:34;27139:55;;27222:2;27213:12;;27045:186;-1:-1;;27045:186;27469:107;27548:22;27564:5;27548:22;;27583:370;;27724:75;27795:3;27786:6;27724:75;;;27821:2;27816:3;27812:12;27805:19;;27835:69;27900:3;27891:6;27835:69;;;-1:-1;27926:1;27917:11;;27712:241;-1:-1;;27712:241;27960:383;;28107:75;28178:3;28169:6;28107:75;;;28204:2;28199:3;28195:12;28188:19;;28218:75;28289:3;28280:6;28218:75;;;-1:-1;28315:2;28306:12;;28095:248;-1:-1;;28095:248;28350:378;;28495:73;28564:3;28555:6;28495:73;;;28590:1;28585:3;28581:11;28574:18;;28603:75;28674:3;28665:6;28603:75;;28735:416;;28908:73;28977:3;28968:6;28908:73;;;29003:1;28998:3;28994:11;28987:18;;29023:103;29122:3;29113:6;29105;29023:103;;29158:282;;29312:103;29411:3;29402:6;29394;29312:103;;29447:262;;29591:93;29680:3;29671:6;29591:93;;29716:213;29834:2;29819:18;;29848:71;29823:9;29892:6;29848:71;;29936:324;30082:2;30067:18;;30096:71;30071:9;30140:6;30096:71;;;30178:72;30246:2;30235:9;30231:18;30222:6;30178:72;;30267:435;30441:2;30426:18;;30455:71;30430:9;30499:6;30455:71;;;30537:72;30605:2;30594:9;30590:18;30581:6;30537:72;;;30620;30688:2;30677:9;30673:18;30664:6;30620:72;;30709:647;30933:3;30918:19;;30948:71;30922:9;30992:6;30948:71;;;31030:72;31098:2;31087:9;31083:18;31074:6;31030:72;;;31113;31181:2;31170:9;31166:18;31157:6;31113:72;;;31196;31264:2;31253:9;31249:18;31240:6;31196:72;;;31279:67;31341:3;31330:9;31326:19;31317:6;31279:67;;;30904:452;;;;;;;;;31363:771;31621:3;31606:19;;31636:71;31610:9;31680:6;31636:71;;;31718:72;31786:2;31775:9;31771:18;31762:6;31718:72;;;31801;31869:2;31858:9;31854:18;31845:6;31801:72;;;31884;31952:2;31941:9;31937:18;31928:6;31884:72;;;31967:73;32035:3;32024:9;32020:19;32011:6;31967:73;;;32051;32119:3;32108:9;32104:19;32095:6;32051:73;;;31592:542;;;;;;;;;;32141:408;32305:2;32290:18;;32319:71;32294:9;32363:6;32319:71;;;32438:9;32432:4;32428:20;32423:2;32412:9;32408:18;32401:48;32463:76;32534:4;32525:6;32463:76;;32556:324;32702:2;32687:18;;32716:71;32691:9;32760:6;32716:71;;;32798:72;32866:2;32855:9;32851:18;32842:6;32798:72;;32887:201;32999:2;32984:18;;33013:65;32988:9;33051:6;33013:65;;33095:213;33213:2;33198:18;;33227:71;33202:9;33271:6;33227:71;;33315:1139;33705:3;33690:19;;33720:71;33694:9;33764:6;33720:71;;;33802:72;33870:2;33859:9;33855:18;33846:6;33802:72;;;33885:66;33947:2;33936:9;33932:18;33923:6;33885:66;;;33962:72;34030:2;34019:9;34015:18;34006:6;33962:72;;;34045:119;34159:3;34148:9;34144:19;34135:6;34045:119;;;34175;34289:3;34278:9;34274:19;34265:6;34175:119;;;34343:9;34337:4;34333:20;34327:3;34316:9;34312:19;34305:49;34368:76;34439:4;34430:6;34368:76;;;34360:84;33676:778;-1:-1;;;;;;;;;33676:778;34461:297;34597:2;34611:47;;;34582:18;;34672:76;34582:18;34734:6;34672:76;;34765:261;34907:2;34892:18;;34921:95;34896:9;34989:6;34921:95;;35857:407;36048:2;36062:47;;;36033:18;;36123:131;36033:18;36123:131;;36271:407;36462:2;36476:47;;;36447:18;;36537:131;36447:18;36537:131;;36685:407;36876:2;36890:47;;;36861:18;;36951:131;36861:18;36951:131;;37099:407;37290:2;37304:47;;;37275:18;;37365:131;37275:18;37365:131;;37513:407;37704:2;37718:47;;;37689:18;;37779:131;37689:18;37779:131;;37927:407;38118:2;38132:47;;;38103:18;;38193:131;38103:18;38193:131;;38341:407;38532:2;38546:47;;;38517:18;;38607:131;38517:18;38607:131;;38755:407;38946:2;38960:47;;;38931:18;;39021:131;38931:18;39021:131;;39169:407;39360:2;39374:47;;;39345:18;;39435:131;39345:18;39435:131;;39583:407;39774:2;39788:47;;;39759:18;;39849:131;39759:18;39849:131;;39997:407;40188:2;40202:47;;;40173:18;;40263:131;40173:18;40263:131;;40411:407;40602:2;40616:47;;;40587:18;;40677:131;40587:18;40677:131;;40825:407;41016:2;41030:47;;;41001:18;;41091:131;41001:18;41091:131;;41239:407;41430:2;41444:47;;;41415:18;;41505:131;41415:18;41505:131;;41653:407;41844:2;41858:47;;;41829:18;;41919:131;41829:18;41919:131;;42067:407;42258:2;42272:47;;;42243:18;;42333:131;42243:18;42333:131;;42481:407;42672:2;42686:47;;;42657:18;;42747:131;42657:18;42747:131;;42895:407;43086:2;43100:47;;;43071:18;;43161:131;43071:18;43161:131;;43309:407;43500:2;43514:47;;;43485:18;;43575:131;43485:18;43575:131;;43723:407;43914:2;43928:47;;;43899:18;;43989:131;43899:18;43989:131;;44137:407;44328:2;44342:47;;;44313:18;;44403:131;44313:18;44403:131;;44551:407;44742:2;44756:47;;;44727:18;;44817:131;44727:18;44817:131;;44965:407;45156:2;45170:47;;;45141:18;;45231:131;45141:18;45231:131;;45379:407;45570:2;45584:47;;;45555:18;;45645:131;45555:18;45645:131;;45793:407;45984:2;45998:47;;;45969:18;;46059:131;45969:18;46059:131;;46207:407;46398:2;46412:47;;;46383:18;;46473:131;46383:18;46473:131;;46621:407;46812:2;46826:47;;;46797:18;;46887:131;46797:18;46887:131;;47035:407;47226:2;47240:47;;;47211:18;;47301:131;47211:18;47301:131;;47449:407;47640:2;47654:47;;;47625:18;;47715:131;47625:18;47715:131;;47863:407;48054:2;48068:47;;;48039:18;;48129:131;48039:18;48129:131;;48277:407;48468:2;48482:47;;;48453:18;;48543:131;48453:18;48543:131;;48911:324;49057:2;49042:18;;49071:71;49046:9;49115:6;49071:71;;49242:435;49416:2;49401:18;;49430:71;49405:9;49474:6;49430:71;;;49512:72;49580:2;49569:9;49565:18;49556:6;49512:72;;49684:205;49798:2;49783:18;;49812:67;49787:9;49852:6;49812:67;;49896:256;49958:2;49952:9;49984:17;;;50059:18;50044:34;;50080:22;;;50041:62;50038:2;;;50116:1;50113;50106:12;50038:2;50132;50125:22;49936:216;;-1:-1;49936:216;50159:321;;50302:18;50294:6;50291:30;50288:2;;;50334:1;50331;50324:12;50288:2;-1:-1;50465:4;50401;50378:17;;;;-1:-1;;50374:33;50455:15;;50225:255;50695:108;-1:-1;50789:4;;50767:36;50810:108;-1:-1;50904:4;;50882:36;50925:121;51012:12;;50983:63;51307:106;51403:4;51394:14;;51380:33;51832:162;51934:19;;;51983:4;51974:14;;51927:67;52327:91;;52389:24;52407:5;52389:24;;52425:85;52491:13;52484:21;;52467:43;52596:144;-1:-1;;;;;;52657:78;;52640:100;52825:121;-1:-1;;;;;52887:54;;52870:76;53032:81;53103:4;53092:16;;53075:38;53120:169;;53223:61;53278:5;53223:61;;53436:145;53517:6;53512:3;53507;53494:30;-1:-1;53573:1;53555:16;;53548:27;53487:94;53590:268;53655:1;53662:101;53676:6;53673:1;53670:13;53662:101;;;53743:11;;;53737:18;53724:11;;;53717:39;53698:2;53691:10;53662:101;;;53778:6;53775:1;53772:13;53769:2;;;-1:-1;;53843:1;53825:16;;53818:27;53639:219;53866:95;;53930:26;53950:5;53930:26;;53968:90;;54029:24;54047:5;54029:24;;54226:89;;54290:20;54304:5;54290:20;;54322:88;;54384:21;54399:5;54384:21;;54417:97;54505:2;54485:14;-1:-1;;54481:28;;54465:49;54522:96;54597:3;54593:15;;54565:53;54626:94;54700:2;54696:14;;54668:52;54728:117;54797:24;54815:5;54797:24;;;54790:5;54787:35;54777:2;;54836:1;54833;54826:12;54852:111;54918:21;54933:5;54918:21;;54970:117;55039:24;55057:5;55039:24;
Swarm Source
bzzr://0f78724654d7f31ad20e1b806e2962f95eceeb528a08ea5361163f9c180e3508
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.