More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 37,922 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 51808038 | 190 days ago | IN | 0 AVAX | 0.00230772 | ||||
Redeem | 40265381 | 467 days ago | IN | 0 AVAX | 0.00785518 | ||||
Redeem | 34325888 | 607 days ago | IN | 0 AVAX | 0.00797375 | ||||
Redeem | 34325849 | 607 days ago | IN | 0 AVAX | 0.00663831 | ||||
Redeem | 34283983 | 608 days ago | IN | 0 AVAX | 0.00830833 | ||||
Redeem | 16641331 | 1029 days ago | IN | 0 AVAX | 0.00173079 | ||||
Redeem | 15157444 | 1064 days ago | IN | 0 AVAX | 0.00173079 | ||||
Redeem | 11092087 | 1159 days ago | IN | 0 AVAX | 0.00346158 | ||||
Set Bond Terms | 11002575 | 1161 days ago | IN | 0 AVAX | 0.00098827 | ||||
Redeem | 10742076 | 1167 days ago | IN | 0 AVAX | 0.00381137 | ||||
Set Adjustment | 10295955 | 1178 days ago | IN | 0 AVAX | 0.0015505 | ||||
Redeem | 10195615 | 1180 days ago | IN | 0 AVAX | 0.00740481 | ||||
Set Bond Terms | 10030501 | 1184 days ago | IN | 0 AVAX | 0.00073115 | ||||
Redeem | 9882357 | 1187 days ago | IN | 0 AVAX | 0.02151711 | ||||
Redeem | 9875377 | 1187 days ago | IN | 0 AVAX | 0.00740481 | ||||
Redeem | 9863605 | 1188 days ago | IN | 0 AVAX | 0.00764628 | ||||
Redeem | 9861370 | 1188 days ago | IN | 0 AVAX | 0.00736605 | ||||
Redeem | 9856904 | 1188 days ago | IN | 0 AVAX | 0.00224379 | ||||
Redeem | 9837494 | 1188 days ago | IN | 0 AVAX | 0.00743793 | ||||
Redeem | 9836161 | 1188 days ago | IN | 0 AVAX | 0.00222281 | ||||
Redeem | 9827392 | 1188 days ago | IN | 0 AVAX | 0.00736605 | ||||
Redeem | 9823896 | 1188 days ago | IN | 0 AVAX | 0.00791781 | ||||
Redeem | 9823714 | 1188 days ago | IN | 0 AVAX | 0.00736605 | ||||
Redeem | 9822967 | 1189 days ago | IN | 0 AVAX | 0.00736605 | ||||
Redeem | 9813221 | 1189 days ago | IN | 0 AVAX | 0.00736605 |
Loading...
Loading
Contract Name:
TimeBondDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at snowscan.xyz on 2021-11-07 */ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; interface IOwnable { function policy() external view returns (address); function renounceManagement() external; function pushManagement( address newOwner_ ) external; function pullManagement() external; } contract Ownable is IOwnable { address internal _owner; address internal _newOwner; event OwnershipPushed(address indexed previousOwner, address indexed newOwner); event OwnershipPulled(address indexed previousOwner, address indexed newOwner); constructor () { _owner = msg.sender; emit OwnershipPushed( address(0), _owner ); } function policy() public view override returns (address) { return _owner; } modifier onlyPolicy() { require( _owner == msg.sender, "Ownable: caller is not the owner" ); _; } function renounceManagement() public virtual override onlyPolicy() { emit OwnershipPushed( _owner, address(0) ); _owner = address(0); } function pushManagement( address newOwner_ ) public virtual override onlyPolicy() { require( newOwner_ != address(0), "Ownable: new owner is the zero address"); emit OwnershipPushed( _owner, newOwner_ ); _newOwner = newOwner_; } function pullManagement() public virtual override { require( msg.sender == _newOwner, "Ownable: must be new owner to pull"); emit OwnershipPulled( _owner, _newOwner ); _owner = _newOwner; } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function sub32(uint32 a, uint32 b) internal pure returns (uint32) { return sub32(a, b, "SafeMath: subtraction overflow"); } function sub32(uint32 a, uint32 b, string memory errorMessage) internal pure returns (uint32) { require(b <= a, errorMessage); uint32 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function sqrrt(uint256 a) internal pure returns (uint c) { if (a > 3) { c = a; uint b = add( div( a, 2), 1 ); while (b < c) { c = b; b = div( add( div( a, b ), b), 2 ); } } else if (a != 0) { c = 1; } } } library Address { function isContract(address account) internal view returns (bool) { uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns(bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function addressToString(address _address) internal pure returns(string memory) { bytes32 _bytes = bytes32(uint256(_address)); bytes memory HEX = "0123456789abcdef"; bytes memory _addr = new bytes(42); _addr[0] = '0'; _addr[1] = 'x'; for(uint256 i = 0; i < 20; i++) { _addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)]; _addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)]; } return string(_addr); } } interface IERC20 { function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } abstract contract ERC20 is IERC20 { using SafeMath for uint256; // TODO comment actual hash value. bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" ); mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowances; uint256 internal _totalSupply; string internal _name; string internal _symbol; uint8 internal _decimals; constructor (string memory name_, string memory symbol_, uint8 decimals_) { _name = name_; _symbol = symbol_; _decimals = decimals_; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view override returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(msg.sender, spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, _allowances[sender][msg.sender] .sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender] .sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint(address account_, uint256 ammount_) internal virtual { require(account_ != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address( this ), account_, ammount_); _totalSupply = _totalSupply.add(ammount_); _balances[account_] = _balances[account_].add(ammount_); emit Transfer(address( this ), account_, ammount_); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { } } interface IERC2612Permit { function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function nonces(address owner) external view returns (uint256); } library Counters { using SafeMath for uint256; struct Counter { uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } abstract contract ERC20Permit is ERC20, IERC2612Permit { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; bytes32 public DOMAIN_SEPARATOR; constructor() { uint256 chainID; assembly { chainID := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name())), keccak256(bytes("1")), // Version chainID, address(this) ) ); } function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "Permit: expired deadline"); bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline)); bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct)); address signer = ecrecover(_hash, v, r, s); require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature"); _nonces[owner].increment(); _approve(owner, spender, amount); } function nonces(address owner) public view override returns (uint256) { return _nonces[owner].current(); } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) .sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } library FullMath { function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) { uint256 mm = mulmod(x, y, uint256(-1)); l = x * y; h = mm - l; if (mm < l) h -= 1; } function fullDiv( uint256 l, uint256 h, uint256 d ) private pure returns (uint256) { uint256 pow2 = d & -d; d /= pow2; l /= pow2; l += h * ((-pow2) / pow2 + 1); uint256 r = 1; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; return l * r; } function mulDiv( uint256 x, uint256 y, uint256 d ) internal pure returns (uint256) { (uint256 l, uint256 h) = fullMul(x, y); uint256 mm = mulmod(x, y, d); if (mm > l) h -= 1; l -= mm; require(h < d, 'FullMath::mulDiv: overflow'); return fullDiv(l, h, d); } } library FixedPoint { struct uq112x112 { uint224 _x; } struct uq144x112 { uint256 _x; } uint8 private constant RESOLUTION = 112; uint256 private constant Q112 = 0x10000000000000000000000000000; uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000; uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits) function decode(uq112x112 memory self) internal pure returns (uint112) { return uint112(self._x >> RESOLUTION); } function decode112with18(uq112x112 memory self) internal pure returns (uint) { return uint(self._x) / 5192296858534827; } function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, 'FixedPoint::fraction: division by zero'); if (numerator == 0) return FixedPoint.uq112x112(0); if (numerator <= uint144(-1)) { uint256 result = (numerator << RESOLUTION) / denominator; require(result <= uint224(-1), 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } else { uint256 result = FullMath.mulDiv(numerator, Q112, denominator); require(result <= uint224(-1), 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } } } interface ITreasury { function deposit( uint _amount, address _token, uint _profit ) external returns ( bool ); function valueOf( address _token, uint _amount ) external view returns ( uint value_ ); } interface IBondCalculator { function valuation( address _LP, uint _amount ) external view returns ( uint ); function markdown( address _LP ) external view returns ( uint ); } interface IStaking { function stake( uint _amount, address _recipient ) external returns ( bool ); } interface IStakingHelper { function stake( uint _amount, address _recipient ) external; } contract TimeBondDepository is Ownable { using FixedPoint for *; using SafeERC20 for IERC20; using SafeMath for uint; using SafeMath for uint32; /* ======== EVENTS ======== */ event BondCreated( uint deposit, uint indexed payout, uint indexed expires, uint indexed priceInUSD ); event BondRedeemed( address indexed recipient, uint payout, uint remaining ); event BondPriceChanged( uint indexed priceInUSD, uint indexed internalPrice, uint indexed debtRatio ); event ControlVariableAdjustment( uint initialBCV, uint newBCV, uint adjustment, bool addition ); /* ======== STATE VARIABLES ======== */ address public immutable Time; // token given as payment for bond address public immutable principle; // token used to create bond address public immutable treasury; // mints OHM when receives principle address public immutable DAO; // receives profit share from bond bool public immutable isLiquidityBond; // LP and Reserve bonds are treated slightly different address public immutable bondCalculator; // calculates value of LP tokens address public staking; // to auto-stake payout address public stakingHelper; // to stake and claim if no staking warmup bool public useHelper; Terms public terms; // stores terms for new bonds Adjust public adjustment; // stores adjustment to BCV data mapping( address => Bond ) public bondInfo; // stores bond information for depositors uint public totalDebt; // total value of outstanding bonds; used for pricing uint32 public lastDecay; // reference time for debt decay /* ======== STRUCTS ======== */ // Info for creating new bonds struct Terms { uint controlVariable; // scaling variable for price uint minimumPrice; // vs principle value uint maxPayout; // in thousandths of a %. i.e. 500 = 0.5% uint fee; // as % of bond payout, in hundreths. ( 500 = 5% = 0.05 for every 1 paid) uint maxDebt; // 9 decimal debt ratio, max % total supply created as debt uint32 vestingTerm; // in seconds } // Info for bond holder struct Bond { uint payout; // OHM remaining to be paid uint pricePaid; // In DAI, for front end viewing uint32 lastTime; // Last interaction uint32 vesting; // Seconds left to vest } // Info for incremental adjustments to control variable struct Adjust { bool add; // addition or subtraction uint rate; // increment uint target; // BCV when adjustment finished uint32 buffer; // minimum length (in seconds) between adjustments uint32 lastTime; // time when last adjustment made } /* ======== INITIALIZATION ======== */ constructor ( address _Time, address _principle, address _treasury, address _DAO, address _bondCalculator ) { require( _Time != address(0) ); Time = _Time; require( _principle != address(0) ); principle = _principle; require( _treasury != address(0) ); treasury = _treasury; require( _DAO != address(0) ); DAO = _DAO; // bondCalculator should be address(0) if not LP bond bondCalculator = _bondCalculator; isLiquidityBond = ( _bondCalculator != address(0) ); } /** * @notice initializes bond parameters * @param _controlVariable uint * @param _vestingTerm uint32 * @param _minimumPrice uint * @param _maxPayout uint * @param _fee uint * @param _maxDebt uint * @param _initialDebt uint */ function initializeBondTerms( uint _controlVariable, uint _minimumPrice, uint _maxPayout, uint _fee, uint _maxDebt, uint _initialDebt, uint32 _vestingTerm ) external onlyPolicy() { require( terms.controlVariable == 0, "Bonds must be initialized from 0" ); terms = Terms ({ controlVariable: _controlVariable, minimumPrice: _minimumPrice, maxPayout: _maxPayout, fee: _fee, maxDebt: _maxDebt, vestingTerm: _vestingTerm }); totalDebt = _initialDebt; lastDecay = uint32(block.timestamp); } /* ======== POLICY FUNCTIONS ======== */ enum PARAMETER { VESTING, PAYOUT, FEE, DEBT, MINPRICE } /** * @notice set parameters for new bonds * @param _parameter PARAMETER * @param _input uint */ function setBondTerms ( PARAMETER _parameter, uint _input ) external onlyPolicy() { if ( _parameter == PARAMETER.VESTING ) { // 0 require( _input >= 129600, "Vesting must be longer than 36 hours" ); terms.vestingTerm = uint32(_input); } else if ( _parameter == PARAMETER.PAYOUT ) { // 1 require( _input <= 1000, "Payout cannot be above 1 percent" ); terms.maxPayout = _input; } else if ( _parameter == PARAMETER.FEE ) { // 2 require( _input <= 10000, "DAO fee cannot exceed payout" ); terms.fee = _input; } else if ( _parameter == PARAMETER.DEBT ) { // 3 terms.maxDebt = _input; } else if ( _parameter == PARAMETER.MINPRICE ) { // 4 terms.minimumPrice = _input; } } /** * @notice set control variable adjustment * @param _addition bool * @param _increment uint * @param _target uint * @param _buffer uint */ function setAdjustment ( bool _addition, uint _increment, uint _target, uint32 _buffer ) external onlyPolicy() { adjustment = Adjust({ add: _addition, rate: _increment, target: _target, buffer: _buffer, lastTime: uint32(block.timestamp) }); } /** * @notice set contract for auto stake * @param _staking address * @param _helper bool */ function setStaking( address _staking, bool _helper ) external onlyPolicy() { require( _staking != address(0) ); if ( _helper ) { useHelper = true; stakingHelper = _staking; } else { useHelper = false; staking = _staking; } } /* ======== USER FUNCTIONS ======== */ /** * @notice deposit bond * @param _amount uint * @param _maxPrice uint * @param _depositor address * @return uint */ function deposit( uint _amount, uint _maxPrice, address _depositor ) external returns ( uint ) { require( _depositor != address(0), "Invalid address" ); decayDebt(); require( totalDebt <= terms.maxDebt, "Max capacity reached" ); uint priceInUSD = bondPriceInUSD(); // Stored in bond info uint nativePrice = _bondPrice(); require( _maxPrice >= nativePrice, "Slippage limit: more than max price" ); // slippage protection uint value = ITreasury( treasury ).valueOf( principle, _amount ); uint payout = payoutFor( value ); // payout to bonder is computed require( payout >= 10000000, "Bond too small" ); // must be > 0.01 OHM ( underflow protection ) require( payout <= maxPayout(), "Bond too large"); // size protection because there is no slippage // profits are calculated uint fee = payout.mul( terms.fee ).div( 10000 ); uint profit = value.sub( payout ).sub( fee ); /** principle is transferred in approved and deposited into the treasury, returning (_amount - profit) OHM */ IERC20( principle ).safeTransferFrom( msg.sender, address(this), _amount ); IERC20( principle ).approve( address( treasury ), _amount ); ITreasury( treasury ).deposit( _amount, principle, profit ); if ( fee != 0 ) { // fee is transferred to dao IERC20( Time ).safeTransfer( DAO, fee ); } // total debt is increased totalDebt = totalDebt.add( value ); // depositor info is stored bondInfo[ _depositor ] = Bond({ payout: bondInfo[ _depositor ].payout.add( payout ), vesting: terms.vestingTerm, lastTime: uint32(block.timestamp), pricePaid: priceInUSD }); // indexed events are emitted emit BondCreated( _amount, payout, block.timestamp.add( terms.vestingTerm ), priceInUSD ); emit BondPriceChanged( bondPriceInUSD(), _bondPrice(), debtRatio() ); adjust(); // control variable is adjusted return payout; } /** * @notice redeem bond for user * @param _recipient address * @param _stake bool * @return uint */ function redeem( address _recipient, bool _stake ) external returns ( uint ) { Bond memory info = bondInfo[ _recipient ]; // (seconds since last interaction / vesting term remaining) uint percentVested = percentVestedFor( _recipient ); if ( percentVested >= 10000 ) { // if fully vested delete bondInfo[ _recipient ]; // delete user info emit BondRedeemed( _recipient, info.payout, 0 ); // emit bond data return stakeOrSend( _recipient, _stake, info.payout ); // pay user everything due } else { // if unfinished // calculate payout vested uint payout = info.payout.mul( percentVested ).div( 10000 ); // store updated deposit info bondInfo[ _recipient ] = Bond({ payout: info.payout.sub( payout ), vesting: info.vesting.sub32( uint32( block.timestamp ).sub32( info.lastTime ) ), lastTime: uint32(block.timestamp), pricePaid: info.pricePaid }); emit BondRedeemed( _recipient, payout, bondInfo[ _recipient ].payout ); return stakeOrSend( _recipient, _stake, payout ); } } /* ======== INTERNAL HELPER FUNCTIONS ======== */ /** * @notice allow user to stake payout automatically * @param _stake bool * @param _amount uint * @return uint */ function stakeOrSend( address _recipient, bool _stake, uint _amount ) internal returns ( uint ) { if ( !_stake ) { // if user does not want to stake IERC20( Time ).transfer( _recipient, _amount ); // send payout } else { // if user wants to stake if ( useHelper ) { // use if staking warmup is 0 IERC20( Time ).approve( stakingHelper, _amount ); IStakingHelper( stakingHelper ).stake( _amount, _recipient ); } else { IERC20( Time ).approve( staking, _amount ); IStaking( staking ).stake( _amount, _recipient ); } } return _amount; } /** * @notice makes incremental adjustment to control variable */ function adjust() internal { uint timeCanAdjust = adjustment.lastTime.add( adjustment.buffer ); if( adjustment.rate != 0 && block.timestamp >= timeCanAdjust ) { uint initial = terms.controlVariable; if ( adjustment.add ) { terms.controlVariable = terms.controlVariable.add( adjustment.rate ); if ( terms.controlVariable >= adjustment.target ) { adjustment.rate = 0; } } else { terms.controlVariable = terms.controlVariable.sub( adjustment.rate ); if ( terms.controlVariable <= adjustment.target ) { adjustment.rate = 0; } } adjustment.lastTime = uint32(block.timestamp); emit ControlVariableAdjustment( initial, terms.controlVariable, adjustment.rate, adjustment.add ); } } /** * @notice reduce total debt */ function decayDebt() internal { totalDebt = totalDebt.sub( debtDecay() ); lastDecay = uint32(block.timestamp); } /* ======== VIEW FUNCTIONS ======== */ /** * @notice determine maximum bond size * @return uint */ function maxPayout() public view returns ( uint ) { return IERC20( Time ).totalSupply().mul( terms.maxPayout ).div( 100000 ); } /** * @notice calculate interest due for new bond * @param _value uint * @return uint */ function payoutFor( uint _value ) public view returns ( uint ) { return FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e16 ); } /** * @notice calculate current bond premium * @return price_ uint */ function bondPrice() public view returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } } /** * @notice calculate current bond price and remove floor if above * @return price_ uint */ function _bondPrice() internal returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } else if ( terms.minimumPrice != 0 ) { terms.minimumPrice = 0; } } /** * @notice converts bond price to DAI value * @return price_ uint */ function bondPriceInUSD() public view returns ( uint price_ ) { if( isLiquidityBond ) { price_ = bondPrice().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 100 ); } else { price_ = bondPrice().mul( 10 ** IERC20( principle ).decimals() ).div( 100 ); } } /** * @notice calculate current ratio of debt to OHM supply * @return debtRatio_ uint */ function debtRatio() public view returns ( uint debtRatio_ ) { uint supply = IERC20( Time ).totalSupply(); debtRatio_ = FixedPoint.fraction( currentDebt().mul( 1e9 ), supply ).decode112with18().div( 1e18 ); } /** * @notice debt ratio in same terms for reserve or liquidity bonds * @return uint */ function standardizedDebtRatio() external view returns ( uint ) { if ( isLiquidityBond ) { return debtRatio().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 1e9 ); } else { return debtRatio(); } } /** * @notice calculate debt factoring in decay * @return uint */ function currentDebt() public view returns ( uint ) { return totalDebt.sub( debtDecay() ); } /** * @notice amount to decay total debt by * @return decay_ uint */ function debtDecay() public view returns ( uint decay_ ) { uint32 timeSinceLast = uint32(block.timestamp).sub32( lastDecay ); decay_ = totalDebt.mul( timeSinceLast ).div( terms.vestingTerm ); if ( decay_ > totalDebt ) { decay_ = totalDebt; } } /** * @notice calculate how far into vesting a depositor is * @param _depositor address * @return percentVested_ uint */ function percentVestedFor( address _depositor ) public view returns ( uint percentVested_ ) { Bond memory bond = bondInfo[ _depositor ]; uint secondsSinceLast = uint32(block.timestamp).sub( bond.lastTime ); uint vesting = bond.vesting; if ( vesting > 0 ) { percentVested_ = secondsSinceLast.mul( 10000 ).div( vesting ); } else { percentVested_ = 0; } } /** * @notice calculate amount of OHM available for claim by depositor * @param _depositor address * @return pendingPayout_ uint */ function pendingPayoutFor( address _depositor ) external view returns ( uint pendingPayout_ ) { uint percentVested = percentVestedFor( _depositor ); uint payout = bondInfo[ _depositor ].payout; if ( percentVested >= 10000 ) { pendingPayout_ = payout; } else { pendingPayout_ = payout.mul( percentVested ).div( 10000 ); } } /* ======= AUXILLIARY ======= */ /** * @notice allow anyone to send lost tokens (excluding principle or OHM) to the DAO * @return bool */ function recoverLostToken( address _token ) external returns ( bool ) { require( _token != Time ); require( _token != principle ); IERC20( _token ).safeTransfer( DAO, IERC20( _token ).balanceOf( address(this) ) ); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_Time","type":"address"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_bondCalculator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"}],"name":"BondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"internalPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"debtRatio","type":"uint256"}],"name":"BondPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remaining","type":"uint256"}],"name":"BondRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"initialBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adjustment","type":"uint256"},{"indexed":false,"internalType":"bool","name":"addition","type":"bool"}],"name":"ControlVariableAdjustment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Time","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint32","name":"buffer","type":"uint32"},{"internalType":"uint32","name":"lastTime","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"},{"internalType":"uint32","name":"lastTime","type":"uint32"},{"internalType":"uint32","name":"vesting","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPriceInUSD","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtDecay","outputs":[{"internalType":"uint256","name":"decay_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtRatio","outputs":[{"internalType":"uint256","name":"debtRatio_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxPrice","type":"uint256"},{"internalType":"address","name":"_depositor","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_initialDebt","type":"uint256"},{"internalType":"uint32","name":"_vestingTerm","type":"uint32"}],"name":"initializeBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isLiquidityBond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDecay","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"pendingPayoutFor","outputs":[{"internalType":"uint256","name":"pendingPayout_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"percentVestedFor","outputs":[{"internalType":"uint256","name":"percentVested_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverLostToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint32","name":"_buffer","type":"uint32"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum TimeBondDepository.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"},{"internalType":"bool","name":"_helper","type":"bool"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"standardizedDebtRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"},{"internalType":"uint32","name":"vestingTerm","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useHelper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101406040523480156200001257600080fd5b5060405162004a3438038062004a34833981810160405260a08110156200003857600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200016757600080fd5b8473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620001d957600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200024b57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002bd57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561010081151560f81b81525050505050505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c6145ef620004456000398061194652806123fd528061286852508061191852806123cc5280612dcc5250806121495280612518528061277652508061186e5280611cc75280611f9852806120495250806109d752806119825280611a5b5280611d035280611f155280611f5c52806120865280612439528061271a52508061216b52806126c152806128df5280612e695280612fcf52806130d052806131b7528061335652506145ef6000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80638dbdbe6d11610125578063d4d863ce116100ad578063e0176de81161007c578063e0176de814610923578063e392a26214610941578063f5c2ab5b1461095f578063f8e157ea14610983578063fc7b9c18146109b757610211565b8063d4d863ce1461084e578063d50256251461089e578063d7969060146108e5578063d7ccfb0b1461090557610211565b8063b4abccba116100f4578063b4abccba146106b9578063c5332b7c14610713578063cd1234b314610747578063cea55f57146107c0578063cf37a891146107de57610211565b80638dbdbe6d146105a7578063904b3ece1461061357806398fabd3a14610631578063ae9832cf1461066557610211565b806346f68ee9116101a857806361d027b31161017757806361d027b3146104c1578063759076e5146104f557806377b81895146105135780637927ebf814610547578063844b5c7c1461058957610211565b806346f68ee9146103e75780634cf088d91461042b578063507930ec1461045f5780635a96ac0a146104b757610211565b80631e321a0f116101e45780631e321a0f146102e05780631feed31f1461031b5780632f3f470a1461037f578063451ee4a11461039f57610211565b8063016a42841461021657806301b88ee81461024a5780630505c8c9146102a2578063089208d8146102d6575b600080fd5b61021e6109d5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61028c6004803603602081101561026057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109f9565b6040518082815260200191505060405180910390f35b6102aa610a90565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102de610ab9565b005b610319600480360360408110156102f657600080fd5b81019080803560ff16906020019092919080359060200190929190505050610c38565b005b6103696004803603604081101561033157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050610f47565b6040518082815260200191505060405180910390f35b610387611307565b60405180821515815260200191505060405180910390f35b6103a761131a565b6040518086151581526020018581526020018481526020018363ffffffff1681526020018263ffffffff1681526020019550505050505060405180910390f35b610429600480360360208110156103fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061136b565b005b610433611570565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104a16004803603602081101561047557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611596565b6040518082815260200191505060405180910390f35b6104bf6116c6565b005b6104c961186c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104fd611890565b6040518082815260200191505060405180910390f35b61051b6118b3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105736004803603602081101561055d57600080fd5b81019080803590602001909291905050506118d9565b6040518082815260200191505060405180910390f35b610591611914565b6040518082815260200191505060405180910390f35b6105fd600480360360608110156105bd57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b2a565b6040518082815260200191505060405180910390f35b61061b6123c8565b6040518082815260200191505060405180910390f35b610639612516565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106b76004803603608081101561067b57600080fd5b810190808035151590602001909291908035906020019092919080359060200190929190803563ffffffff16906020019092919050505061253a565b005b6106fb600480360360208110156106cf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126bd565b60405180821515815260200191505060405180910390f35b61071b612866565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107896004803603602081101561075d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061288a565b604051808581526020018481526020018363ffffffff1681526020018263ffffffff16815260200194505050505060405180910390f35b6107c86128da565b6040518082815260200191505060405180910390f35b61084c600480360360e08110156107f457600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803563ffffffff1690602001909291905050506129cf565b005b61089c6004803603604081101561086457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612bcd565b005b6108a6612d90565b604051808781526020018681526020018581526020018481526020018381526020018263ffffffff168152602001965050505050505060405180910390f35b6108ed612dca565b60405180821515815260200191505060405180910390f35b61090d612dee565b6040518082815260200191505060405180910390f35b61092b612e55565b6040518082815260200191505060405180910390f35b610949612f29565b6040518082815260200191505060405180910390f35b610967612fb7565b604051808263ffffffff16815260200191505060405180910390f35b61098b612fcd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109bf612ff1565b6040518082815260200191505060405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b600080610a0583611596565b90506000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506127108210610a5f57809250610a89565b610a86612710610a788484612ff790919063ffffffff16565b61307d90919063ffffffff16565b92505b5050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b7a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cf9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006004811115610d0657fe5b826004811115610d1257fe5b1415610d9d576201fa40811015610d74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061456c6024913960400191505060405180910390fd5b80600460050160006101000a81548163ffffffff021916908363ffffffff160217905550610f43565b60016004811115610daa57fe5b826004811115610db657fe5b1415610e43576103e8811115610e34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b80600460020181905550610f42565b60026004811115610e5057fe5b826004811115610e5c57fe5b1415610ee957612710811115610eda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b80600460030181905550610f41565b60036004811115610ef657fe5b826004811115610f0257fe5b1415610f1657806004800181905550610f40565b600480811115610f2257fe5b826004811115610f2e57fe5b1415610f3f57806004600101819055505b5b5b5b5b5050565b6000610f51614454565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900463ffffffff1663ffffffff1663ffffffff16815250509050600061100885611596565b9050612710811061110657600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160006101000a81549063ffffffff02191690556002820160046101000a81549063ffffffff021916905550508473ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b183600001516000604051808381526020018281526020019250505060405180910390a26110fd858584600001516130c7565b92505050611301565b6000611133612710611125848660000151612ff790919063ffffffff16565b61307d90919063ffffffff16565b9050604051806080016040528061115783866000015161351e90919063ffffffff16565b8152602001846020015181526020014263ffffffff1681526020016111ab61119286604001514263ffffffff1661356890919063ffffffff16565b866060015163ffffffff1661356890919063ffffffff16565b63ffffffff16815250600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548163ffffffff021916908363ffffffff16021790555060608201518160020160046101000a81548163ffffffff021916908363ffffffff1602179055509050508573ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b182600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808381526020018281526020019250505060405180910390a26112fb8686836130c7565b93505050505b92915050565b600360149054906101000a900460ff1681565b600a8060000160009054906101000a900460ff16908060010154908060020154908060030160009054906101000a900463ffffffff16908060030160049054906101000a900463ffffffff16905085565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806144ba6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006115a0614454565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900463ffffffff1663ffffffff1663ffffffff168152505090506000611671826040015163ffffffff164263ffffffff1661351e90919063ffffffff16565b90506000826060015163ffffffff16905060008111156116b9576116b2816116a461271085612ff790919063ffffffff16565b61307d90919063ffffffff16565b93506116be565b600093505b505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461176c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806144e06022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006118ae61189d612f29565b600f5461351e90919063ffffffff16565b905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061190d662386f26fc100006118ff6118fa856118f5612dee565b6135b2565b613893565b61307d90919063ffffffff16565b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000015611a5157611a4a6064611a3c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119eb57600080fd5b505afa1580156119ff573d6000803e3d6000fd5b505050506040513d6020811015611a1557600080fd5b8101908080519060200190929190505050611a2e612dee565b612ff790919063ffffffff16565b61307d90919063ffffffff16565b9050611b27565b611b246064611b167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611abf57600080fd5b505afa158015611ad3573d6000803e3d6000fd5b505050506040513d6020811015611ae957600080fd5b810190808051906020019092919050505060ff16600a0a611b08612dee565b612ff790919063ffffffff16565b61307d90919063ffffffff16565b90505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611bd66138cf565b6004800154600f541115611c52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000611c5c611914565b90506000611c68613914565b905080851015611cc3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806145496023913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631eec5a9a7f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015611d7457600080fd5b505afa158015611d88573d6000803e3d6000fd5b505050506040513d6020811015611d9e57600080fd5b810190808051906020019092919050505090506000611dbc826118d9565b905062989680811015611e37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b611e3f612e55565b811115611eb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b6000611ee2612710611ed460046003015485612ff790919063ffffffff16565b61307d90919063ffffffff16565b90506000611f0b82611efd858761351e90919063ffffffff16565b61351e90919063ffffffff16565b9050611f5a33308c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16613999909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561200b57600080fd5b505af115801561201f573d6000803e3d6000fd5b505050506040513d602081101561203557600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f0000000000000000000000000000000000000000000000000000000000000000846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561210057600080fd5b505af1158015612114573d6000803e3d6000fd5b505050506040513d602081101561212a57600080fd5b810190808051906020019092919050505050600082146121b0576121af7f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16613a5a9092919063ffffffff16565b5b6121c584600f54613afc90919063ffffffff16565b600f81905550604051806080016040528061222b85600e60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613afc90919063ffffffff16565b81526020018781526020014263ffffffff168152602001600460050160009054906101000a900463ffffffff1663ffffffff16815250600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548163ffffffff021916908363ffffffff16021790555060608201518160020160046101000a81548163ffffffff021916908363ffffffff16021790555090505085612334600460050160009054906101000a900463ffffffff1663ffffffff1642613afc90919063ffffffff16565b847f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58d6040518082815260200191505060405180910390a46123746128da565b61237c613914565b612384611914565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a46123b8613b84565b8296505050505050509392505050565b60007f00000000000000000000000000000000000000000000000000000000000000001561250857612501633b9aca006124f37f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156124a257600080fd5b505afa1580156124b6573d6000803e3d6000fd5b505050506040513d60208110156124cc57600080fd5b81019080805190602001909291905050506124e56128da565b612ff790919063ffffffff16565b61307d90919063ffffffff16565b9050612513565b6125106128da565b90505b90565b7f000000000000000000000000000000000000000000000000000000000000000081565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6040518060a0016040528085151581526020018481526020018381526020018263ffffffff1681526020014263ffffffff16815250600a60008201518160000160006101000a81548160ff021916908315150217905550602082015181600101556040820151816002015560608201518160030160006101000a81548163ffffffff021916908363ffffffff16021790555060808201518160030160046101000a81548163ffffffff021916908363ffffffff16021790555090505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561271857600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561277157600080fd5b61285d7f00000000000000000000000000000000000000000000000000000000000000008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156127fc57600080fd5b505afa158015612810573d6000803e3d6000fd5b505050506040513d602081101561282657600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff16613a5a9092919063ffffffff16565b60019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600e6020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900463ffffffff16908060020160049054906101000a900463ffffffff16905084565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561294357600080fd5b505afa158015612957573d6000803e3d6000fd5b505050506040513d602081101561296d57600080fd5b810190808051906020019092919050505090506129c9670de0b6b3a76400006129bb6129b66129b0633b9aca006129a2611890565b612ff790919063ffffffff16565b856135b2565b613893565b61307d90919063ffffffff16565b91505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060046000015414612b0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f426f6e6473206d75737420626520696e697469616c697a65642066726f6d203081525060200191505060405180910390fd5b6040518060c001604052808881526020018781526020018681526020018581526020018481526020018263ffffffff168152506004600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548163ffffffff021916908363ffffffff16021790555090505081600f8190555042601060006101000a81548163ffffffff021916908363ffffffff16021790555050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cc857600080fd5b8015612d2f576001600360146101000a81548160ff02191690831515021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612d8c565b6000600360146101000a81548160ff02191690831515021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60048060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900463ffffffff16905086565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000612e3a62989680612e2c633b9aca00612e1e612e0a6128da565b600460000154612ff790919063ffffffff16565b613afc90919063ffffffff16565b61307d90919063ffffffff16565b9050600460010154811015612e525760046001015490505b90565b6000612f24620186a0612f166004600201547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612ecd57600080fd5b505afa158015612ee1573d6000803e3d6000fd5b505050506040513d6020811015612ef757600080fd5b8101908080519060200190929190505050612ff790919063ffffffff16565b61307d90919063ffffffff16565b905090565b600080612f57601060009054906101000a900463ffffffff164263ffffffff1661356890919063ffffffff16565b9050612fa1600460050160009054906101000a900463ffffffff1663ffffffff16612f938363ffffffff16600f54612ff790919063ffffffff16565b61307d90919063ffffffff16565b9150600f54821115612fb357600f5491505b5090565b601060009054906101000a900463ffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f5481565b60008083141561300a5760009050613077565b600082840290508284828161301b57fe5b0414613072576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806145286021913960400191505060405180910390fd5b809150505b92915050565b60006130bf83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d30565b905092915050565b6000826131a0577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561315f57600080fd5b505af1158015613173573d6000803e3d6000fd5b505050506040513d602081101561318957600080fd5b810190808051906020019092919050505050613514565b600360149054906101000a900460ff1615613354577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561326857600080fd5b505af115801561327c573d6000803e3d6000fd5b505050506040513d602081101561329257600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561333757600080fd5b505af115801561334b573d6000803e3d6000fd5b50505050613513565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561340757600080fd5b505af115801561341b573d6000803e3d6000fd5b505050506040513d602081101561343157600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156134d657600080fd5b505af11580156134ea573d6000803e3d6000fd5b505050506040513d602081101561350057600080fd5b8101908080519060200190929190505050505b5b8190509392505050565b600061356083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613df6565b905092915050565b60006135aa83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613eb6565b905092915050565b6135ba614488565b60008211613613576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806145026026913960400191505060405180910390fd5b600083141561365157604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250905061388d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff16831161378a57600082607060ff1685901b8161369e57fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525091505061388d565b60006137a6846e01000000000000000000000000000085613f82565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681111561385c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16816138c757fe5b049050919050565b6138eb6138da612f29565b600f5461351e90919063ffffffff16565b600f8190555042601060006101000a81548163ffffffff021916908363ffffffff160217905550565b600061396062989680613952633b9aca006139446139306128da565b600460000154612ff790919063ffffffff16565b613afc90919063ffffffff16565b61307d90919063ffffffff16565b905060046001015481101561397c576004600101549050613996565b6000600460010154146139955760006004600101819055505b5b90565b613a54846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614044565b50505050565b613af78363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614044565b505050565b600080828401905083811015613b7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000613bcf600a60030160009054906101000a900463ffffffff1663ffffffff16600a60030160049054906101000a900463ffffffff1663ffffffff16613afc90919063ffffffff16565b90506000600a6001015414158015613be75750804210155b15613d2d5760006004600001549050600a60000160009054906101000a900460ff1615613c5657613c2b600a60010154600460000154613afc90919063ffffffff16565b600460000181905550600a6002015460046000015410613c51576000600a600101819055505b613c9a565b613c73600a6001015460046000015461351e90919063ffffffff16565b600460000181905550600a6002015460046000015411613c99576000600a600101819055505b5b42600a60030160046101000a81548163ffffffff021916908363ffffffff1602179055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600460000154600a60010154600a60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290613ddc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613da1578082015181840152602081019050613d86565b50505050905090810190601f168015613dce5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613de857fe5b049050809150509392505050565b6000838311158290613ea3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613e68578082015181840152602081019050613e4d565b50505050905090810190601f168015613e955780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008363ffffffff168363ffffffff1611158290613f6f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f34578082015181840152602081019050613f19565b50505050905090810190601f168015613f615780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000613f918686614133565b9150915060008480613f9f57fe5b868809905082811115613fb3576001820391505b808303925084821061402d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b614038838387614186565b93505050509392505050565b60606140a6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166142239092919063ffffffff16565b905060008151111561412e578080602001905160208110156140c757600080fd5b810190808051906020019092919050505061412d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614590602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061416057fe5b8486099050838502925082810391508281101561417e576001820391505b509250929050565b600080826000038316905080838161419a57fe5b0492508085816141a657fe5b04945060018182600003816141b757fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060614232848460008561423b565b90509392505050565b606061424685614441565b6142b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061430857805182526020820191506020810190506020830392506142e5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461436a576040519150601f19603f3d011682016040523d82523d6000602084013e61436f565b606091505b50915091508115614384578092505050614439565b6000815111156143975780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156143fe5780820151818401526020810190506143e3565b50505050905090810190601f16801561442b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b60405180608001604052806000815260200160008152602001600063ffffffff168152602001600063ffffffff1681525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220e9153584c6599770afd11ea7be7a84f054bf7b62dd2866f052805e17bfe8eb6a64736f6c634300070500330000000000000000000000007d1232b90d3f809a54eeaeebc639c62df8a8942f000000000000000000000000425c45adfb53861e5db8f17d9b072ab60d4404d8000000000000000000000000a82422a5fd4f9cb85cd4aac393cd3296a27dd873000000000000000000000000561c56b6ea927c157a9f51fcccfa50b777c1ea7c000000000000000000000000f1ac1ed0ef7f61223df64e52a6e6e1d6ca6f992b
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c80638dbdbe6d11610125578063d4d863ce116100ad578063e0176de81161007c578063e0176de814610923578063e392a26214610941578063f5c2ab5b1461095f578063f8e157ea14610983578063fc7b9c18146109b757610211565b8063d4d863ce1461084e578063d50256251461089e578063d7969060146108e5578063d7ccfb0b1461090557610211565b8063b4abccba116100f4578063b4abccba146106b9578063c5332b7c14610713578063cd1234b314610747578063cea55f57146107c0578063cf37a891146107de57610211565b80638dbdbe6d146105a7578063904b3ece1461061357806398fabd3a14610631578063ae9832cf1461066557610211565b806346f68ee9116101a857806361d027b31161017757806361d027b3146104c1578063759076e5146104f557806377b81895146105135780637927ebf814610547578063844b5c7c1461058957610211565b806346f68ee9146103e75780634cf088d91461042b578063507930ec1461045f5780635a96ac0a146104b757610211565b80631e321a0f116101e45780631e321a0f146102e05780631feed31f1461031b5780632f3f470a1461037f578063451ee4a11461039f57610211565b8063016a42841461021657806301b88ee81461024a5780630505c8c9146102a2578063089208d8146102d6575b600080fd5b61021e6109d5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61028c6004803603602081101561026057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109f9565b6040518082815260200191505060405180910390f35b6102aa610a90565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102de610ab9565b005b610319600480360360408110156102f657600080fd5b81019080803560ff16906020019092919080359060200190929190505050610c38565b005b6103696004803603604081101561033157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050610f47565b6040518082815260200191505060405180910390f35b610387611307565b60405180821515815260200191505060405180910390f35b6103a761131a565b6040518086151581526020018581526020018481526020018363ffffffff1681526020018263ffffffff1681526020019550505050505060405180910390f35b610429600480360360208110156103fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061136b565b005b610433611570565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104a16004803603602081101561047557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611596565b6040518082815260200191505060405180910390f35b6104bf6116c6565b005b6104c961186c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104fd611890565b6040518082815260200191505060405180910390f35b61051b6118b3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105736004803603602081101561055d57600080fd5b81019080803590602001909291905050506118d9565b6040518082815260200191505060405180910390f35b610591611914565b6040518082815260200191505060405180910390f35b6105fd600480360360608110156105bd57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b2a565b6040518082815260200191505060405180910390f35b61061b6123c8565b6040518082815260200191505060405180910390f35b610639612516565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106b76004803603608081101561067b57600080fd5b810190808035151590602001909291908035906020019092919080359060200190929190803563ffffffff16906020019092919050505061253a565b005b6106fb600480360360208110156106cf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126bd565b60405180821515815260200191505060405180910390f35b61071b612866565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107896004803603602081101561075d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061288a565b604051808581526020018481526020018363ffffffff1681526020018263ffffffff16815260200194505050505060405180910390f35b6107c86128da565b6040518082815260200191505060405180910390f35b61084c600480360360e08110156107f457600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803563ffffffff1690602001909291905050506129cf565b005b61089c6004803603604081101561086457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612bcd565b005b6108a6612d90565b604051808781526020018681526020018581526020018481526020018381526020018263ffffffff168152602001965050505050505060405180910390f35b6108ed612dca565b60405180821515815260200191505060405180910390f35b61090d612dee565b6040518082815260200191505060405180910390f35b61092b612e55565b6040518082815260200191505060405180910390f35b610949612f29565b6040518082815260200191505060405180910390f35b610967612fb7565b604051808263ffffffff16815260200191505060405180910390f35b61098b612fcd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109bf612ff1565b6040518082815260200191505060405180910390f35b7f000000000000000000000000425c45adfb53861e5db8f17d9b072ab60d4404d881565b600080610a0583611596565b90506000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506127108210610a5f57809250610a89565b610a86612710610a788484612ff790919063ffffffff16565b61307d90919063ffffffff16565b92505b5050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b7a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cf9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006004811115610d0657fe5b826004811115610d1257fe5b1415610d9d576201fa40811015610d74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061456c6024913960400191505060405180910390fd5b80600460050160006101000a81548163ffffffff021916908363ffffffff160217905550610f43565b60016004811115610daa57fe5b826004811115610db657fe5b1415610e43576103e8811115610e34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b80600460020181905550610f42565b60026004811115610e5057fe5b826004811115610e5c57fe5b1415610ee957612710811115610eda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b80600460030181905550610f41565b60036004811115610ef657fe5b826004811115610f0257fe5b1415610f1657806004800181905550610f40565b600480811115610f2257fe5b826004811115610f2e57fe5b1415610f3f57806004600101819055505b5b5b5b5b5050565b6000610f51614454565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900463ffffffff1663ffffffff1663ffffffff16815250509050600061100885611596565b9050612710811061110657600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160006101000a81549063ffffffff02191690556002820160046101000a81549063ffffffff021916905550508473ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b183600001516000604051808381526020018281526020019250505060405180910390a26110fd858584600001516130c7565b92505050611301565b6000611133612710611125848660000151612ff790919063ffffffff16565b61307d90919063ffffffff16565b9050604051806080016040528061115783866000015161351e90919063ffffffff16565b8152602001846020015181526020014263ffffffff1681526020016111ab61119286604001514263ffffffff1661356890919063ffffffff16565b866060015163ffffffff1661356890919063ffffffff16565b63ffffffff16815250600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548163ffffffff021916908363ffffffff16021790555060608201518160020160046101000a81548163ffffffff021916908363ffffffff1602179055509050508573ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b182600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808381526020018281526020019250505060405180910390a26112fb8686836130c7565b93505050505b92915050565b600360149054906101000a900460ff1681565b600a8060000160009054906101000a900460ff16908060010154908060020154908060030160009054906101000a900463ffffffff16908060030160049054906101000a900463ffffffff16905085565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806144ba6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006115a0614454565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900463ffffffff1663ffffffff1663ffffffff168152505090506000611671826040015163ffffffff164263ffffffff1661351e90919063ffffffff16565b90506000826060015163ffffffff16905060008111156116b9576116b2816116a461271085612ff790919063ffffffff16565b61307d90919063ffffffff16565b93506116be565b600093505b505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461176c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806144e06022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000a82422a5fd4f9cb85cd4aac393cd3296a27dd87381565b60006118ae61189d612f29565b600f5461351e90919063ffffffff16565b905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061190d662386f26fc100006118ff6118fa856118f5612dee565b6135b2565b613893565b61307d90919063ffffffff16565b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000115611a5157611a4a6064611a3c7f000000000000000000000000f1ac1ed0ef7f61223df64e52a6e6e1d6ca6f992b73ffffffffffffffffffffffffffffffffffffffff166332da80a37f000000000000000000000000425c45adfb53861e5db8f17d9b072ab60d4404d86040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119eb57600080fd5b505afa1580156119ff573d6000803e3d6000fd5b505050506040513d6020811015611a1557600080fd5b8101908080519060200190929190505050611a2e612dee565b612ff790919063ffffffff16565b61307d90919063ffffffff16565b9050611b27565b611b246064611b167f000000000000000000000000425c45adfb53861e5db8f17d9b072ab60d4404d873ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611abf57600080fd5b505afa158015611ad3573d6000803e3d6000fd5b505050506040513d6020811015611ae957600080fd5b810190808051906020019092919050505060ff16600a0a611b08612dee565b612ff790919063ffffffff16565b61307d90919063ffffffff16565b90505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611bd66138cf565b6004800154600f541115611c52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000611c5c611914565b90506000611c68613914565b905080851015611cc3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806145496023913960400191505060405180910390fd5b60007f000000000000000000000000a82422a5fd4f9cb85cd4aac393cd3296a27dd87373ffffffffffffffffffffffffffffffffffffffff16631eec5a9a7f000000000000000000000000425c45adfb53861e5db8f17d9b072ab60d4404d8896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015611d7457600080fd5b505afa158015611d88573d6000803e3d6000fd5b505050506040513d6020811015611d9e57600080fd5b810190808051906020019092919050505090506000611dbc826118d9565b905062989680811015611e37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b611e3f612e55565b811115611eb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b6000611ee2612710611ed460046003015485612ff790919063ffffffff16565b61307d90919063ffffffff16565b90506000611f0b82611efd858761351e90919063ffffffff16565b61351e90919063ffffffff16565b9050611f5a33308c7f000000000000000000000000425c45adfb53861e5db8f17d9b072ab60d4404d873ffffffffffffffffffffffffffffffffffffffff16613999909392919063ffffffff16565b7f000000000000000000000000425c45adfb53861e5db8f17d9b072ab60d4404d873ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000a82422a5fd4f9cb85cd4aac393cd3296a27dd8738c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561200b57600080fd5b505af115801561201f573d6000803e3d6000fd5b505050506040513d602081101561203557600080fd5b8101908080519060200190929190505050507f000000000000000000000000a82422a5fd4f9cb85cd4aac393cd3296a27dd87373ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f000000000000000000000000425c45adfb53861e5db8f17d9b072ab60d4404d8846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561210057600080fd5b505af1158015612114573d6000803e3d6000fd5b505050506040513d602081101561212a57600080fd5b810190808051906020019092919050505050600082146121b0576121af7f000000000000000000000000561c56b6ea927c157a9f51fcccfa50b777c1ea7c837f0000000000000000000000007d1232b90d3f809a54eeaeebc639c62df8a8942f73ffffffffffffffffffffffffffffffffffffffff16613a5a9092919063ffffffff16565b5b6121c584600f54613afc90919063ffffffff16565b600f81905550604051806080016040528061222b85600e60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613afc90919063ffffffff16565b81526020018781526020014263ffffffff168152602001600460050160009054906101000a900463ffffffff1663ffffffff16815250600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548163ffffffff021916908363ffffffff16021790555060608201518160020160046101000a81548163ffffffff021916908363ffffffff16021790555090505085612334600460050160009054906101000a900463ffffffff1663ffffffff1642613afc90919063ffffffff16565b847f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58d6040518082815260200191505060405180910390a46123746128da565b61237c613914565b612384611914565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a46123b8613b84565b8296505050505050509392505050565b60007f00000000000000000000000000000000000000000000000000000000000000011561250857612501633b9aca006124f37f000000000000000000000000f1ac1ed0ef7f61223df64e52a6e6e1d6ca6f992b73ffffffffffffffffffffffffffffffffffffffff166332da80a37f000000000000000000000000425c45adfb53861e5db8f17d9b072ab60d4404d86040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156124a257600080fd5b505afa1580156124b6573d6000803e3d6000fd5b505050506040513d60208110156124cc57600080fd5b81019080805190602001909291905050506124e56128da565b612ff790919063ffffffff16565b61307d90919063ffffffff16565b9050612513565b6125106128da565b90505b90565b7f000000000000000000000000561c56b6ea927c157a9f51fcccfa50b777c1ea7c81565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6040518060a0016040528085151581526020018481526020018381526020018263ffffffff1681526020014263ffffffff16815250600a60008201518160000160006101000a81548160ff021916908315150217905550602082015181600101556040820151816002015560608201518160030160006101000a81548163ffffffff021916908363ffffffff16021790555060808201518160030160046101000a81548163ffffffff021916908363ffffffff16021790555090505050505050565b60007f0000000000000000000000007d1232b90d3f809a54eeaeebc639c62df8a8942f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561271857600080fd5b7f000000000000000000000000425c45adfb53861e5db8f17d9b072ab60d4404d873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561277157600080fd5b61285d7f000000000000000000000000561c56b6ea927c157a9f51fcccfa50b777c1ea7c8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156127fc57600080fd5b505afa158015612810573d6000803e3d6000fd5b505050506040513d602081101561282657600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff16613a5a9092919063ffffffff16565b60019050919050565b7f000000000000000000000000f1ac1ed0ef7f61223df64e52a6e6e1d6ca6f992b81565b600e6020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900463ffffffff16908060020160049054906101000a900463ffffffff16905084565b6000807f0000000000000000000000007d1232b90d3f809a54eeaeebc639c62df8a8942f73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561294357600080fd5b505afa158015612957573d6000803e3d6000fd5b505050506040513d602081101561296d57600080fd5b810190808051906020019092919050505090506129c9670de0b6b3a76400006129bb6129b66129b0633b9aca006129a2611890565b612ff790919063ffffffff16565b856135b2565b613893565b61307d90919063ffffffff16565b91505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060046000015414612b0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f426f6e6473206d75737420626520696e697469616c697a65642066726f6d203081525060200191505060405180910390fd5b6040518060c001604052808881526020018781526020018681526020018581526020018481526020018263ffffffff168152506004600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548163ffffffff021916908363ffffffff16021790555090505081600f8190555042601060006101000a81548163ffffffff021916908363ffffffff16021790555050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cc857600080fd5b8015612d2f576001600360146101000a81548160ff02191690831515021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612d8c565b6000600360146101000a81548160ff02191690831515021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60048060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900463ffffffff16905086565b7f000000000000000000000000000000000000000000000000000000000000000181565b6000612e3a62989680612e2c633b9aca00612e1e612e0a6128da565b600460000154612ff790919063ffffffff16565b613afc90919063ffffffff16565b61307d90919063ffffffff16565b9050600460010154811015612e525760046001015490505b90565b6000612f24620186a0612f166004600201547f0000000000000000000000007d1232b90d3f809a54eeaeebc639c62df8a8942f73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612ecd57600080fd5b505afa158015612ee1573d6000803e3d6000fd5b505050506040513d6020811015612ef757600080fd5b8101908080519060200190929190505050612ff790919063ffffffff16565b61307d90919063ffffffff16565b905090565b600080612f57601060009054906101000a900463ffffffff164263ffffffff1661356890919063ffffffff16565b9050612fa1600460050160009054906101000a900463ffffffff1663ffffffff16612f938363ffffffff16600f54612ff790919063ffffffff16565b61307d90919063ffffffff16565b9150600f54821115612fb357600f5491505b5090565b601060009054906101000a900463ffffffff1681565b7f0000000000000000000000007d1232b90d3f809a54eeaeebc639c62df8a8942f81565b600f5481565b60008083141561300a5760009050613077565b600082840290508284828161301b57fe5b0414613072576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806145286021913960400191505060405180910390fd5b809150505b92915050565b60006130bf83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d30565b905092915050565b6000826131a0577f0000000000000000000000007d1232b90d3f809a54eeaeebc639c62df8a8942f73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561315f57600080fd5b505af1158015613173573d6000803e3d6000fd5b505050506040513d602081101561318957600080fd5b810190808051906020019092919050505050613514565b600360149054906101000a900460ff1615613354577f0000000000000000000000007d1232b90d3f809a54eeaeebc639c62df8a8942f73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561326857600080fd5b505af115801561327c573d6000803e3d6000fd5b505050506040513d602081101561329257600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561333757600080fd5b505af115801561334b573d6000803e3d6000fd5b50505050613513565b7f0000000000000000000000007d1232b90d3f809a54eeaeebc639c62df8a8942f73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561340757600080fd5b505af115801561341b573d6000803e3d6000fd5b505050506040513d602081101561343157600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156134d657600080fd5b505af11580156134ea573d6000803e3d6000fd5b505050506040513d602081101561350057600080fd5b8101908080519060200190929190505050505b5b8190509392505050565b600061356083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613df6565b905092915050565b60006135aa83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613eb6565b905092915050565b6135ba614488565b60008211613613576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806145026026913960400191505060405180910390fd5b600083141561365157604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250905061388d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff16831161378a57600082607060ff1685901b8161369e57fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525091505061388d565b60006137a6846e01000000000000000000000000000085613f82565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681111561385c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16816138c757fe5b049050919050565b6138eb6138da612f29565b600f5461351e90919063ffffffff16565b600f8190555042601060006101000a81548163ffffffff021916908363ffffffff160217905550565b600061396062989680613952633b9aca006139446139306128da565b600460000154612ff790919063ffffffff16565b613afc90919063ffffffff16565b61307d90919063ffffffff16565b905060046001015481101561397c576004600101549050613996565b6000600460010154146139955760006004600101819055505b5b90565b613a54846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614044565b50505050565b613af78363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614044565b505050565b600080828401905083811015613b7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000613bcf600a60030160009054906101000a900463ffffffff1663ffffffff16600a60030160049054906101000a900463ffffffff1663ffffffff16613afc90919063ffffffff16565b90506000600a6001015414158015613be75750804210155b15613d2d5760006004600001549050600a60000160009054906101000a900460ff1615613c5657613c2b600a60010154600460000154613afc90919063ffffffff16565b600460000181905550600a6002015460046000015410613c51576000600a600101819055505b613c9a565b613c73600a6001015460046000015461351e90919063ffffffff16565b600460000181905550600a6002015460046000015411613c99576000600a600101819055505b5b42600a60030160046101000a81548163ffffffff021916908363ffffffff1602179055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600460000154600a60010154600a60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290613ddc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613da1578082015181840152602081019050613d86565b50505050905090810190601f168015613dce5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613de857fe5b049050809150509392505050565b6000838311158290613ea3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613e68578082015181840152602081019050613e4d565b50505050905090810190601f168015613e955780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008363ffffffff168363ffffffff1611158290613f6f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f34578082015181840152602081019050613f19565b50505050905090810190601f168015613f615780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000613f918686614133565b9150915060008480613f9f57fe5b868809905082811115613fb3576001820391505b808303925084821061402d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b614038838387614186565b93505050509392505050565b60606140a6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166142239092919063ffffffff16565b905060008151111561412e578080602001905160208110156140c757600080fd5b810190808051906020019092919050505061412d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614590602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061416057fe5b8486099050838502925082810391508281101561417e576001820391505b509250929050565b600080826000038316905080838161419a57fe5b0492508085816141a657fe5b04945060018182600003816141b757fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060614232848460008561423b565b90509392505050565b606061424685614441565b6142b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061430857805182526020820191506020810190506020830392506142e5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461436a576040519150601f19603f3d011682016040523d82523d6000602084013e61436f565b606091505b50915091508115614384578092505050614439565b6000815111156143975780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156143fe5780820151818401526020810190506143e3565b50505050905090810190601f16801561442b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b60405180608001604052806000815260200160008152602001600063ffffffff168152602001600063ffffffff1681525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220e9153584c6599770afd11ea7be7a84f054bf7b62dd2866f052805e17bfe8eb6a64736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007d1232b90d3f809a54eeaeebc639c62df8a8942f000000000000000000000000425c45adfb53861e5db8f17d9b072ab60d4404d8000000000000000000000000a82422a5fd4f9cb85cd4aac393cd3296a27dd873000000000000000000000000561c56b6ea927c157a9f51fcccfa50b777c1ea7c000000000000000000000000f1ac1ed0ef7f61223df64e52a6e6e1d6ca6f992b
-----Decoded View---------------
Arg [0] : _Time (address): 0x7d1232B90D3F809A54eeaeeBC639C62dF8a8942f
Arg [1] : _principle (address): 0x425c45adFB53861e5Db8F17D9b072Ab60D4404D8
Arg [2] : _treasury (address): 0xa82422A5FD4F9cB85cD4aAc393cD3296A27dD873
Arg [3] : _DAO (address): 0x561c56b6ea927c157A9F51fCcCfa50B777c1EA7C
Arg [4] : _bondCalculator (address): 0xf1AC1eD0Ef7F61223df64e52A6E6E1d6Ca6f992b
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000007d1232b90d3f809a54eeaeebc639c62df8a8942f
Arg [1] : 000000000000000000000000425c45adfb53861e5db8f17d9b072ab60d4404d8
Arg [2] : 000000000000000000000000a82422a5fd4f9cb85cd4aac393cd3296a27dd873
Arg [3] : 000000000000000000000000561c56b6ea927c157a9f51fcccfa50b777c1ea7c
Arg [4] : 000000000000000000000000f1ac1ed0ef7f61223df64e52a6e6e1d6ca6f992b
Deployed Bytecode Sourcemap
21917:17449:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22662:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38510:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;693:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;918:158;;;:::i;:::-;;26619:828;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31113:1240;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23192:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23277:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1084:260;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23061:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37899:439;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1356:221;;;:::i;:::-;;22732:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37231:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23114:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34906:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36010:331;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28699:2263;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36857:275;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22809:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27643:376;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39094:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22980:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23343:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36465:271;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25681:682;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28152:318;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23222:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22881:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35172:261;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34636:141;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37439:297;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23518:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22591:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23436:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22662:34;;;:::o;38510:400::-;38582:19;38615:18;38636:30;38654:10;38636:16;:30::i;:::-;38615:51;;38677:11;38691:8;:22;38701:10;38691:22;;;;;;;;;;;;;;;:29;;;38677:43;;38755:5;38738:13;:22;38733:170;;38795:6;38778:23;;38733:170;;;38851:40;38884:5;38851:27;38863:13;38851:6;:10;;:27;;;;:::i;:::-;:31;;:40;;;;:::i;:::-;38834:57;;38733:170;38510:400;;;;;:::o;693:89::-;741:7;768:6;;;;;;;;;;;761:13;;693:89;:::o;918:158::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1034:1:::1;1001:37;;1018:6;::::0;::::1;;;;;;;;1001:37;;;;;;;;;;;;1066:1;1049:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;918:158::o:0;26619:828::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26731:17:::1;26717:31;;;;;;;;:10;:31;;;;;;;;;26712:728;;;26790:6;26780;:16;;26771:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26880:6;26853:5;:17;;;:34;;;;;;;;;;;;;;;;;;26712:728;;;26924:16;26910:30;;;;;;;;:10;:30;;;;;;;;;26905:535;;;26982:4;26972:6;:14;;26963:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27057:6;27039:5;:15;;:24;;;;26905:535;;;27100:13;27086:27;;;;;;;;:10;:27;;;;;;;;;27081:359;;;27155:5;27145:6;:15;;27136:58;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27221:6;27209:5;:9;;:18;;;;27081:359;;;27264:14;27250:28;;;;;;;;:10;:28;;;;;;;;;27245:195;;;27317:6;27301:5;:13:::0;::::1;:22;;;;27245:195;;;27360:18;27346:32:::0;::::1;;;;;;;:10;:32;;;;;;;;;27341:99;;;27422:6;27401:5;:18;;:27;;;;27341:99;27245:195;27081:359;26905:535;26712:728;26619:828:::0;;:::o;31113:1240::-;31183:4;31209:16;;:::i;:::-;31228:8;:22;31238:10;31228:22;;;;;;;;;;;;;;;31209:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31331:18;31352:30;31370:10;31352:16;:30::i;:::-;31331:51;;31417:5;31400:13;:22;31395:951;;31466:8;:22;31476:10;31466:22;;;;;;;;;;;;;;;;31459:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31542:10;31528:42;;;31554:4;:11;;;31567:1;31528:42;;;;;;;;;;;;;;;;;;;;;;;;31610:46;31623:10;31635:6;31643:4;:11;;;31610;:46::i;:::-;31603:53;;;;;;31395:951;31775:11;31789:45;31827:5;31789:32;31806:13;31789:4;:11;;;:15;;:32;;;;:::i;:::-;:36;;:45;;;;:::i;:::-;31775:59;;31917:267;;;;;;;;31949:25;31966:6;31949:4;:11;;;:15;;:25;;;;:::i;:::-;31917:267;;;;32154:4;:14;;;31917:267;;;;32108:15;31917:267;;;;;;32002:70;32022:48;32055:4;:13;;;32030:15;32022:31;;;;:48;;;;:::i;:::-;32002:4;:12;;;:18;;;;:70;;;;:::i;:::-;31917:267;;;;;31892:8;:22;31902:10;31892:22;;;;;;;;;;;;;;;:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32220:10;32206:65;;;32232:6;32240:8;:22;32250:10;32240:22;;;;;;;;;;;;;;;:29;;;32206:65;;;;;;;;;;;;;;;;;;;;;;;;32293:41;32306:10;32318:6;32326;32293:11;:41::i;:::-;32286:48;;;;;31113:1240;;;;;:::o;23192:21::-;;;;;;;;;;;;;:::o;23277:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1084:260::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1207:1:::1;1186:23;;:9;:23;;;;1177:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1293:9;1268:36;;1285:6;::::0;::::1;;;;;;;;1268:36;;;;;;;;;;;;1327:9;1315;;:21;;;;;;;;;;;;;;;;;;1084:260:::0;:::o;23061:22::-;;;;;;;;;;;;;:::o;37899:439::-;37969:19;38002:16;;:::i;:::-;38021:8;:22;38031:10;38021:22;;;;;;;;;;;;;;;38002:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38054:21;38078:44;38107:4;:13;;;38078:44;;38085:15;38078:27;;;;:44;;;;:::i;:::-;38054:68;;38133:12;38148:4;:12;;;38133:27;;;;38188:1;38178:7;:11;38173:158;;;38224:44;38259:7;38224:29;38246:5;38224:16;:20;;:29;;;;:::i;:::-;:33;;:44;;;;:::i;:::-;38207:61;;38173:158;;;38318:1;38301:18;;38173:158;37899:439;;;;;;:::o;1356:221::-;1440:9;;;;;;;;;;;1426:23;;:10;:23;;;1417:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1529:9;;;;;;;;;;;1504:36;;1521:6;;;;;;;;;;1504:36;;;;;;;;;;;;1560:9;;;;;;;;;;;1551:6;;:18;;;;;;;;;;;;;;;;;;1356:221::o;22732:33::-;;;:::o;37231:106::-;37276:4;37301:28;37316:11;:9;:11::i;:::-;37301:9;;:13;;:28;;;;:::i;:::-;37294:35;;37231:106;:::o;23114:28::-;;;;;;;;;;;;;:::o;34906:161::-;34962:4;34987:72;35053:4;34987:60;:42;35008:6;35016:11;:9;:11::i;:::-;34987:19;:42::i;:::-;:58;:60::i;:::-;:64;;:72;;;;:::i;:::-;34980:79;;34906:161;;;:::o;36010:331::-;36058:11;36087:15;36083:251;;;36129:85;36209:3;36129:74;36163:14;36146:42;;;36190:9;36146:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36129:11;:9;:11::i;:::-;:15;;:74;;;;:::i;:::-;:78;;:85;;;;:::i;:::-;36120:94;;36083:251;;;36256:66;36317:3;36256:55;36287:9;36279:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36273:36;;:2;:36;36256:11;:9;:11::i;:::-;:15;;:55;;;;:::i;:::-;:59;;:66;;;;:::i;:::-;36247:75;;36083:251;36010:331;:::o;28699:2263::-;28821:4;28870:1;28848:24;;:10;:24;;;;28839:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28906:11;:9;:11::i;:::-;28950:5;:13;;;28937:9;;:26;;28928:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29010:15;29028:16;:14;:16::i;:::-;29010:34;;29078:16;29097:12;:10;:12::i;:::-;29078:31;;29144:11;29131:9;:24;;29122:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29232:10;29256:8;29245:29;;;29276:9;29287:7;29245:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29232:64;;29307:11;29321:18;29332:5;29321:9;:18::i;:::-;29307:32;;29403:8;29393:6;:18;;29384:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29508:11;:9;:11::i;:::-;29498:6;:21;;29489:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29634:8;29645:36;29674:5;29645:23;29657:5;:9;;;29645:6;:10;;:23;;;;:::i;:::-;:27;;:36;;;;:::i;:::-;29634:47;;29692:11;29706:30;29731:3;29706:19;29717:6;29706:5;:9;;:19;;;;:::i;:::-;:23;;:30;;;;:::i;:::-;29692:44;;29917:74;29955:10;29975:4;29982:7;29925:9;29917:36;;;;:74;;;;;;:::i;:::-;30010:9;30002:27;;;30040:8;30052:7;30002:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30083:8;30072:29;;;30103:7;30112:9;30123:6;30072:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30164:1;30157:3;:8;30152:113;;30213:39;30242:3;30247;30221:4;30213:27;;;;:39;;;;;:::i;:::-;30152:113;30333:22;30348:5;30333:9;;:13;;:22;;;;:::i;:::-;30321:9;:34;;;;30447:209;;;;;;;;30476:43;30511:6;30476:8;:22;30486:10;30476:22;;;;;;;;;;;;;;;:29;;;:33;;:43;;;;:::i;:::-;30447:209;;;;30634:10;30447:209;;;;30592:15;30447:209;;;;;;30543:5;:17;;;;;;;;;;;;30447:209;;;;;30422:8;:22;30432:10;30422:22;;;;;;;;;;;;;;;:234;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30785:10;30743:40;30764:5;:17;;;;;;;;;;;;30743:40;;:15;:19;;:40;;;;:::i;:::-;30735:6;30713:84;30726:7;30713:84;;;;;;;;;;;;;;;;;;30863:11;:9;:11::i;:::-;30849:12;:10;:12::i;:::-;30831:16;:14;:16::i;:::-;30813:63;;;;;;;;;;30889:8;:6;:8::i;:::-;30947:6;30940:13;;;;;;;;28699:2263;;;;;:::o;36857:275::-;36914:4;36937:15;36932:193;;;36977:85;37057:3;36977:74;37011:14;36994:42;;;37038:9;36994:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36977:11;:9;:11::i;:::-;:15;;:74;;;;:::i;:::-;:78;;:85;;;;:::i;:::-;36970:92;;;;36932:193;37102:11;:9;:11::i;:::-;37095:18;;36857:275;;:::o;22809:28::-;;;:::o;27643:376::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27824:187:::1;;;;;;;;27851:9;27824:187;;;;;;27881:10;27824:187;;;;27914:7;27824:187;;;;27944:7;27824:187;;;;;;27983:15;27824:187;;;;::::0;27811:10:::1;:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27643:376:::0;;;;:::o;39094:269::-;39157:4;39194;39184:14;;:6;:14;;;;39175:25;;;;;;39230:9;39220:19;;:6;:19;;;;39211:30;;;;;;39252:81;39283:3;39296:6;39288:26;;;39324:4;39288:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39260:6;39252:29;;;;:81;;;;;:::i;:::-;39351:4;39344:11;;39094:269;;;:::o;22980:39::-;;;:::o;23343:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36465:271::-;36508:15;36540:11;36562:4;36554:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36540:42;;36606:122;36722:4;36606:110;:92;36641:24;36660:3;36641:13;:11;:13::i;:::-;:17;;:24;;;;:::i;:::-;36681:6;36606:19;:92::i;:::-;:108;:110::i;:::-;:114;;:122;;;;:::i;:::-;36593:135;;36465:271;;:::o;25681:682::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25975:1:::1;25950:5;:21;;;:26;25941:73;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26033:241;;;;;;;;26072:16;26033:241;;;;26117:13;26033:241;;;;26156:10;26033:241;;;;26186:4;26033:241;;;;26214:8;26033:241;;;;26250:12;26033:241;;;;::::0;26025:5:::1;:249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26297:12;26285:9;:24;;;;26339:15;26320:9;;:35;;;;;;;;;;;;;;;;;;25681:682:::0;;;;;;;:::o;28152:318::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28268:1:::1;28248:22;;:8;:22;;;;28239:33;;;::::0;::::1;;28288:7;28283:180;;;28325:4;28313:9;;:16;;;;;;;;;;;;;;;;;;28360:8;28344:13;;:24;;;;;;;;;;;;;;;;;;28283:180;;;28413:5;28401:9;;:17;;;;;;;;;;;;;;;;;;28443:8;28433:7;;:18;;;;;;;;;;;;;;;;;;28283:180;28152:318:::0;;:::o;23222:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22881:37::-;;;:::o;35172:261::-;35215:11;35257:69;35321:3;35257:58;35303:10;35257:40;35284:11;:9;:11::i;:::-;35257:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;:62;;:69;;;;:::i;:::-;35248:78;;35351:5;:18;;;35342:6;:27;35337:89;;;35396:5;:18;;;35387:27;;35337:89;35172:261;:::o;34636:141::-;34679:4;34704:65;34761:6;34704:51;34738:5;:15;;;34712:4;34704:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;:51;;;;:::i;:::-;:55;;:65;;;;:::i;:::-;34697:72;;34636:141;:::o;37439:297::-;37482:11;37507:20;37530:42;37561:9;;;;;;;;;;;37537:15;37530:29;;;;:42;;;;:::i;:::-;37507:65;;37592:55;37628:5;:17;;;;;;;;;;;;37592:55;;:30;37607:13;37592:30;;:9;;:13;;:30;;;;:::i;:::-;:34;;:55;;;;:::i;:::-;37583:64;;37672:9;;37663:6;:18;37658:71;;;37708:9;;37699:18;;37658:71;37439:297;;:::o;23518:23::-;;;;;;;;;;;;;:::o;22591:29::-;;;:::o;23436:21::-;;;;:::o;2486:250::-;2544:7;2573:1;2568;:6;2564:47;;;2598:1;2591:8;;;;2564:47;2623:9;2639:1;2635;:5;2623:17;;2668:1;2663;2659;:5;;;;;;:10;2651:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2727:1;2720:8;;;2486:250;;;;;:::o;2744:132::-;2802:7;2829:39;2833:1;2836;2829:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2822:46;;2744:132;;;;:::o;32583:693::-;32672:4;32696:6;32690:554;;32762:4;32754:23;;;32779:10;32791:7;32754:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32690:554;;;32879:9;;;;;;;;;;;32874:359;;;32948:4;32940:22;;;32964:13;;;;;;;;;;;32979:7;32940:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33023:13;;;;;;;;;;;33007:37;;;33046:7;33055:10;33007:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32874:359;;;33116:4;33108:22;;;33132:7;;;;;;;;;;;33141;33108:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33179:7;;;;;;;;;;;33169:25;;;33196:7;33205:10;33169:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32874:359;32690:554;33261:7;33254:14;;32583:693;;;;;:::o;1799:136::-;1857:7;1884:43;1888:1;1891;1884:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1877:50;;1799:136;;;;:::o;2143:137::-;2201:6;2227:45;2233:1;2236;2227:45;;;;;;;;;;;;;;;;;:5;:45::i;:::-;2220:52;;2143:137;;;;:::o;20577:719::-;20658:16;;:::i;:::-;20709:1;20695:11;:15;20687:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20781:1;20768:9;:14;20764:50;;;20791:23;;;;;;;;20812:1;20791:23;;;;;20784:30;;;;20764:50;20852:2;20831:24;;:9;:24;20827:462;;20872:14;20917:11;20003:3;20890:23;;:9;:23;;20889:39;;;;;;20872:56;;20969:2;20951:21;;:6;:21;;20943:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21029:26;;;;;;;;21047:6;21029:26;;;;;21022:33;;;;;20827:462;21088:14;21105:45;21121:9;20045:31;21138:11;21105:15;:45::i;:::-;21088:62;;21191:2;21173:21;;:6;:21;;21165:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21251:26;;;;;;;;21269:6;21251:26;;;;;21244:33;;;20577:719;;;;;:::o;20432:137::-;20503:4;20545:16;20534:4;:7;;;20529:13;;:32;;;;;;20522:39;;20432:137;;;:::o;34356:135::-;34409:28;34424:11;:9;:11::i;:::-;34409:9;;:13;;:28;;;;:::i;:::-;34397:9;:40;;;;34467:15;34448:9;;:35;;;;;;;;;;;;;;;;;;34356:135::o;35560:345::-;35601:11;35635:69;35699:3;35635:58;35681:10;35635:40;35662:11;:9;:11::i;:::-;35635:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;:62;;:69;;;;:::i;:::-;35626:78;;35729:5;:18;;;35720:6;:27;35715:183;;;35774:5;:18;;;35765:27;;35715:183;;;35845:1;35823:5;:18;;;:23;35818:80;;35885:1;35864:5;:18;;:22;;;;35818:80;35715:183;35560:345;:::o;17100:205::-;17201:96;17221:5;17251:27;;;17280:4;17286:2;17290:5;17228:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17201:19;:96::i;:::-;17100:205;;;;:::o;16915:177::-;16998:86;17018:5;17048:23;;;17073:2;17077:5;17025:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16998:19;:86::i;:::-;16915:177;;;:::o;1610:181::-;1668:7;1688:9;1704:1;1700;:5;1688:17;;1729:1;1724;:6;;1716:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1782:1;1775:8;;;1610:181;;;;:::o;33368:927::-;33406:18;33427:44;33452:10;:17;;;;;;;;;;;;33427:44;;:10;:19;;;;;;;;;;;;:23;;;;:44;;;;:::i;:::-;33406:65;;33505:1;33486:10;:15;;;:20;;:56;;;;;33529:13;33510:15;:32;;33486:56;33482:806;;;33560:12;33575:5;:21;;;33560:36;;33616:10;:14;;;;;;;;;;;;33611:494;;;33676:44;33703:10;:15;;;33676:5;:21;;;:25;;:44;;;;:::i;:::-;33652:5;:21;;:68;;;;33769:10;:17;;;33744:5;:21;;;:42;33739:112;;33830:1;33812:10;:15;;:19;;;;33739:112;33611:494;;;33915:44;33942:10;:15;;;33915:5;:21;;;:25;;:44;;;;:::i;:::-;33891:5;:21;;:68;;;;34008:10;:17;;;33983:5;:21;;;:42;33978:112;;34069:1;34051:10;:15;;:19;;;;33978:112;33611:494;34148:15;34119:10;:19;;;:45;;;;;;;;;;;;;;;;;;34184:92;34211:7;34220:5;:21;;;34243:10;:15;;;34260:10;:14;;;;;;;;;;;;34184:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33482:806;;33368:927;:::o;2884:189::-;2970:7;3002:1;2998;:5;3005:12;2990:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3029:9;3045:1;3041;:5;;;;;;3029:17;;3064:1;3057:8;;;2884:189;;;;;:::o;1943:192::-;2029:7;2062:1;2057;:6;;2065:12;2049:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2089:9;2105:1;2101;:5;2089:17;;2126:1;2119:8;;;1943:192;;;;;:::o;2288:190::-;2374:6;2406:1;2401:6;;:1;:6;;;;2409:12;2393:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2433:8;2448:1;2444;:5;2433:16;;2469:1;2462:8;;;2288:190;;;;;:::o;19477:347::-;19583:7;19604:9;19615;19628:13;19636:1;19639;19628:7;:13::i;:::-;19603:38;;;;19652:10;19678:1;19665:15;;;;;19675:1;19672;19665:15;19652:28;;19700:1;19695:2;:6;19691:18;;;19708:1;19703:6;;;;19691:18;19725:2;19720:7;;;;19750:1;19746;:5;19738:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19800:16;19808:1;19811;19814;19800:7;:16::i;:::-;19793:23;;;;;19477:347;;;;;:::o;18318:420::-;18401:23;18427:69;18455:4;18427:69;;;;;;;;;;;;;;;;;18435:5;18427:27;;;;:69;;;;;:::i;:::-;18401:95;;18531:1;18511:10;:17;:21;18507:224;;;18653:10;18642:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18634:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18507:224;18318:420;;;:::o;18769:210::-;18830:9;18841;18863:10;18897:2;18876:25;;;;;18886:1;18883;18876:25;18863:38;;18920:1;18916;:5;18912:9;;18941:1;18936:2;:6;18932:10;;18962:1;18957:2;:6;18953:18;;;18970:1;18965:6;;;;18953:18;18769:210;;;;;;:::o;18987:482::-;19093:7;19113:12;19133:1;19132:2;;19128:1;:6;19113:21;;19150:4;19145:9;;;;;;;;;19170:4;19165:9;;;;;;;;;19212:1;19205:4;19197;19196:5;;19195:14;;;;;;:18;19190:1;:24;19185:29;;;;19225:9;19237:1;19225:13;;19262:1;19258;:5;19254:1;:9;19249:14;;;;19287:1;19283;:5;19279:1;:9;19274:14;;;;19312:1;19308;:5;19304:1;:9;19299:14;;;;19337:1;19333;:5;19329:1;:9;19324:14;;;;19362:1;19358;:5;19354:1;:9;19349:14;;;;19387:1;19383;:5;19379:1;:9;19374:14;;;;19412:1;19408;:5;19404:1;:9;19399:14;;;;19437:1;19433;:5;19429:1;:9;19424:14;;;;19460:1;19456;:5;19449:12;;;;18987:482;;;;;:::o;4585:232::-;4724:12;4756:53;4779:6;4787:4;4793:1;4796:12;4756:22;:53::i;:::-;4749:60;;4585:232;;;;;:::o;5643:1025::-;5819:12;5852:18;5863:6;5852:10;:18::i;:::-;5844:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5978:12;5992:23;6019:6;:11;;6039:8;6050:4;6019:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5977:78;;;;6070:7;6066:595;;;6101:10;6094:17;;;;;;6066:595;6235:1;6215:10;:17;:21;6211:439;;;6478:10;6472:17;6539:15;6526:10;6522:2;6518:19;6511:44;6426:148;6621:12;6614:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5643:1025;;;;;;;:::o;3758:233::-;3818:4;3837:12;3948:7;3936:20;3928:28;;3982:1;3975:4;:8;3968:15;;;3758:233;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://e9153584c6599770afd11ea7be7a84f054bf7b62dd2866f052805e17bfe8eb6a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.