More Info
Private Name Tags
ContractCreator:
TokenTracker
Latest 25 from a total of 8,177 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 45111874 | 588 days ago | IN | 0 FTM | 0.00295515 | ||||
Redeem | 37706737 | 691 days ago | IN | 0 FTM | 0.02181819 | ||||
Redeem | 35705530 | 718 days ago | IN | 0 FTM | 0.00571831 | ||||
Redeem | 34557665 | 731 days ago | IN | 0 FTM | 0.0081721 | ||||
Redeem | 31064539 | 771 days ago | IN | 0 FTM | 0.01166068 | ||||
Redeem | 30883187 | 773 days ago | IN | 0 FTM | 0.00829965 | ||||
Redeem | 29718651 | 785 days ago | IN | 0 FTM | 0.012388 | ||||
Redeem | 29219286 | 790 days ago | IN | 0 FTM | 0.04217721 | ||||
Redeem | 29094439 | 792 days ago | IN | 0 FTM | 0.00743607 | ||||
Redeem | 28171582 | 801 days ago | IN | 0 FTM | 0.02014134 | ||||
Redeem | 27879172 | 804 days ago | IN | 0 FTM | 0.01496528 | ||||
Redeem | 27874561 | 804 days ago | IN | 0 FTM | 0.01564011 | ||||
Redeem | 27857479 | 804 days ago | IN | 0 FTM | 0.01903127 | ||||
Redeem | 27647755 | 806 days ago | IN | 0 FTM | 0.01335487 | ||||
Redeem | 27565745 | 807 days ago | IN | 0 FTM | 0.01472231 | ||||
Redeem | 27395902 | 809 days ago | IN | 0 FTM | 0.01411688 | ||||
Redeem | 27385758 | 809 days ago | IN | 0 FTM | 0.02745594 | ||||
Redeem | 27071150 | 812 days ago | IN | 0 FTM | 0.01243842 | ||||
Redeem | 27056323 | 813 days ago | IN | 0 FTM | 0.01177986 | ||||
Redeem | 27024971 | 813 days ago | IN | 0 FTM | 0.01452664 | ||||
Redeem | 27009382 | 813 days ago | IN | 0 FTM | 0.01129671 | ||||
Redeem | 26966607 | 813 days ago | IN | 0 FTM | 0.0068864 | ||||
Redeem | 26966259 | 813 days ago | IN | 0 FTM | 0.00712021 | ||||
Redeem | 26960562 | 813 days ago | IN | 0 FTM | 0.00757762 | ||||
Redeem | 26953640 | 814 days ago | IN | 0 FTM | 0.0080649 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
22952375 | 855 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
HectorBondStakeDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-11-24 */ // 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 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 ( uint send_ ); 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 ); function claim( address _recipient ) external; } interface ISHEC { function gonsForBalance( uint amount ) external view returns ( uint ); function balanceForGons( uint gons ) external view returns ( uint ); } contract HectorBondStakeDepository is Ownable { using FixedPoint for *; using SafeERC20 for IERC20; using SafeMath for uint; /* ======== 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 HEC; // intermediate reward token from treasury address public immutable sHEC; // token given as payment for bond address public immutable principle; // token used to create bond address public immutable treasury; // mints HEC 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 stake and claim if no staking warmup 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 uint public lastDecay; // reference block for debt decay uint public totalPrinciple; // total principle bonded through this depository string internal name_; //name of this bond /* ======== STRUCTS ======== */ // Info for creating new bonds struct Terms { uint controlVariable; // scaling variable for price uint vestingTerm; // in blocks 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 } // Info for bond holder with gons struct Bond { uint gonsPayout; // sHEC gons remaining to be paid uint hecPayout; //hec amount at the moment of bond uint vesting; // Blocks left to vest uint lastBlock; // Last interaction uint pricePaid; // In DAI, for front end viewing } // Info for incremental adjustments to control variable struct Adjust { bool add; // addition or subtraction uint rate; // increment uint target; // BCV when adjustment finished uint buffer; // minimum length (in blocks) between adjustments uint lastBlock; // block when last adjustment made } /* ======== INITIALIZATION ======== */ constructor ( string memory _name, address _HEC, address _sHEC, address _principle, address _treasury, address _DAO, address _bondCalculator ) { require( _HEC != address(0) ); HEC = _HEC; require( _sHEC != address(0) ); sHEC = _sHEC; 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) ); name_ = _name; } /** * @notice initializes bond parameters * @param _controlVariable uint * @param _vestingTerm uint * @param _minimumPrice uint * @param _maxPayout uint * @param _fee uint * @param _maxDebt uint * @param _initialDebt uint */ function initializeBondTerms( uint _controlVariable, uint _vestingTerm, uint _minimumPrice, uint _maxPayout, uint _fee, uint _maxDebt, uint _initialDebt ) external onlyPolicy() { terms = Terms ({ controlVariable: _controlVariable, vestingTerm: _vestingTerm, minimumPrice: _minimumPrice, maxPayout: _maxPayout, fee: _fee, maxDebt: _maxDebt }); totalDebt = _initialDebt; lastDecay = block.number; } /* ======== 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 >= 10000, "Vesting must be longer than 3 hours" ); terms.vestingTerm = _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, uint _buffer ) external onlyPolicy() { adjustment = Adjust({ add: _addition, rate: _increment, target: _target, buffer: _buffer, lastBlock: block.number }); } /** * @notice set contract for auto stake * @param _staking address */ function setStaking( address _staking) external onlyPolicy() { require( _staking != address(0) ); 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 >= _bondPrice(), "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 HEC ( 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) HEC */ IERC20( principle ).safeTransferFrom( msg.sender, address(this), _amount ); IERC20( principle ).approve( address( treasury ), _amount ); ITreasury( treasury ).deposit( _amount, principle, profit ); totalPrinciple=totalPrinciple.add(_amount); if ( fee != 0 ) { // fee is transferred to dao IERC20( HEC ).safeTransfer( DAO, fee ); } // total debt is increased totalDebt = totalDebt.add( value ); //TODO //uint stakeAmount = totalBond.sub(fee); IERC20( HEC ).approve( staking, payout ); IStaking( staking ).stake( payout, address(this) ); IStaking( staking ).claim( address(this) ); uint stakeGons=ISHEC(sHEC).gonsForBalance(payout); // depositor info is stored _bondInfo[ _depositor ] = Bond({ gonsPayout: _bondInfo[ _depositor ].gonsPayout.add( stakeGons ), hecPayout: _bondInfo[ _depositor ].hecPayout.add( payout ), vesting: terms.vestingTerm, lastBlock: block.number, pricePaid: priceInUSD }); // indexed events are emitted emit BondCreated( _amount, payout, block.number.add( terms.vestingTerm ), priceInUSD ); emit BondPriceChanged( bondPriceInUSD(), _bondPrice(), debtRatio() ); adjust(); // control variable is adjusted return payout; } /** * @notice redeem bond for user, keep the parameter bool _stake for compatibility of redeem helper * @param _recipient address * @param _stake bool * @return uint */ function redeem( address _recipient, bool _stake) external returns ( uint ) { Bond memory info = _bondInfo[ _recipient ]; uint percentVested = percentVestedFor( _recipient ); // (blocks since last interaction / vesting term remaining) require ( percentVested >= 10000 ,"not yet fully vested") ; // if fully vested delete _bondInfo[ _recipient ]; // delete user info uint _amount = ISHEC(sHEC).balanceForGons(info.gonsPayout); emit BondRedeemed( _recipient, _amount, 0 ); // emit bond data IERC20( sHEC ).transfer( _recipient, _amount ); // pay user everything due return _amount; } /* ======== INTERNAL HELPER FUNCTIONS ======== */ /** * @notice makes incremental adjustment to control variable */ function adjust() internal { uint blockCanAdjust = adjustment.lastBlock.add( adjustment.buffer ); if( adjustment.rate != 0 && block.number >= blockCanAdjust ) { 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.lastBlock = block.number; emit ControlVariableAdjustment( initial, terms.controlVariable, adjustment.rate, adjustment.add ); } } /** * @notice reduce total debt */ function decayDebt() internal { totalDebt = totalDebt.sub( debtDecay() ); lastDecay = block.number; } /* ======== VIEW FUNCTIONS ======== */ /** * @notice determine maximum bond size * @return uint */ function maxPayout() public view returns ( uint ) { return IERC20( HEC ).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 return bond info with latest sHEC balance calculated from gons * @param _depositor address * @return payout uint * @return vesting uint * @return lastBlock uint * @return pricePaid uint */ function bondInfo(address _depositor) public view returns ( uint payout,uint vesting,uint lastBlock,uint pricePaid ) { Bond memory info = _bondInfo[ _depositor ]; payout=ISHEC(sHEC).balanceForGons(info.gonsPayout); vesting=info.vesting; lastBlock=info.lastBlock; pricePaid=info.pricePaid; } /** * @notice calculate current ratio of debt to HEC supply * @return debtRatio_ uint */ function debtRatio() public view returns ( uint debtRatio_ ) { uint supply = IERC20( HEC ).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_ ) { uint blocksSinceLast = block.number.sub( lastDecay ); decay_ = totalDebt.mul( blocksSinceLast ).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 blocksSinceLast = block.number.sub( bond.lastBlock ); uint vesting = bond.vesting; if ( vesting > 0 ) { percentVested_ = blocksSinceLast.mul( 10000 ).div( vesting ); } else { percentVested_ = 0; } } /** * @notice calculate amount of HEC 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 = ISHEC(sHEC).balanceForGons(_bondInfo[ _depositor ].gonsPayout); if ( percentVested >= 10000 ) { pendingPayout_ = payout; } else { pendingPayout_ = 0; } } /** * @notice show the name of current bond * @return _name string */ function name() public view returns (string memory _name) { return name_; } /* ======= AUXILLIARY ======= */ /** * @notice allow anyone to send lost tokens (excluding principle or HEC) to the DAO * @return bool */ function recoverLostToken( address _token ) external returns ( bool ) { require( _token != HEC ); require( _token != sHEC ); 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
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_HEC","type":"address"},{"internalType":"address","name":"_sHEC","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":"HEC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_bondInfo","outputs":[{"internalType":"uint256","name":"gonsPayout","type":"uint256"},{"internalType":"uint256","name":"hecPayout","type":"uint256"},{"internalType":"uint256","name":"vesting","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"}],"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":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"vesting","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"}],"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":"_vestingTerm","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"}],"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":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"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":[],"name":"sHEC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum HectorBondStakeDepository.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"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","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":"vestingTerm","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"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPrinciple","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101606040523480156200001257600080fd5b5060405162004a8038038062004a80833981810160405260e08110156200003857600080fd5b81019080805160405193929190846401000000008211156200005957600080fd5b838201915060208201858111156200007057600080fd5b82518660018202830111640100000000821117156200008e57600080fd5b8083526020830192505050908051906020019080838360005b83811015620000c4578082015181840152602081019050620000a7565b50505050905090810190601f168015620000f25780820380516001836020036101000a031916815260200191505b50604052602001805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156200022e57600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415620002a057600080fd5b8473ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156200031257600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200038457600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003f657600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561012081151560f81b815250508660129080519060200190620004be929190620004cc565b505050505050505062000582565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000504576000855562000550565b82601f106200051f57805160ff191683800117855562000550565b8280016001018555821562000550579182015b828111156200054f57825182559160200191906001019062000532565b5b5090506200055f919062000563565b5090565b5b808211156200057e57600081600090555060010162000564565b5090565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160f81c6101405160601c6144096200067760003980611cd15280612be75280612f4c525080611ca35280612bb652806132205250806124eb5280612d265280612e5a525080611ad3528061204e528061231f52806123d0525080610aa65280611d0d5280611de6528061208a528061229c52806122e3528061240d5280612c235280612dfe525080610ada52806113db52806114e45280611aaf52806127d25280612da5528061303252508061250d528061256f5280612d025280612d4c528061310452806132bc52506144096000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c8063839c278811610130578063c6b2c4cd116100b8578063d7ccfb0b1161007c578063d7ccfb0b14610a0e578063e0176de814610a2c578063e392a26214610a4a578063f5c2ab5b14610a68578063fc7b9c1814610a8657610227565b8063c6b2c4cd146108ae578063cd1234b314610922578063cea55f571461098f578063d5025625146109ad578063d7969060146109ee57610227565b8063904b3ece116100ff578063904b3ece1461079a5780639854278e146107b857806398fabd3a146107ec578063b4abccba14610820578063c5332b7c1461087a57610227565b8063839c2788146106ae578063844b5c7c146106cc5780638dbdbe6d146106ea5780638ff390991461075657610227565b806346f68ee9116101b35780635d0afda9116101825780635d0afda91461057c57806361d027b3146105b057806371535008146105e4578063759076e51461064e5780637927ebf81461066c57610227565b806346f68ee9146104a25780634cf088d9146104e6578063507930ec1461051a5780635a96ac0a1461057257610227565b8063089208d8116101fa578063089208d81461036f5780631a3d0068146103795780631e321a0f146103c75780631feed31f14610402578063451ee4a11461046657610227565b8063016a42841461022c57806301b88ee8146102605780630505c8c9146102b857806306fdde03146102ec575b600080fd5b610234610aa4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102a26004803603602081101561027657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ac8565b6040518082815260200191505060405180910390f35b6102c0610be5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102f4610c0e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610334578082015181840152602081019050610319565b50505050905090810190601f1680156103615780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610377610cb0565b005b6103c56004803603608081101561038f57600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610e2f565b005b610400600480360360408110156103dd57600080fd5b81019080803560ff16906020019092919080359060200190929190505050610f6c565b005b6104506004803603604081101561041857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611260565b6040518082815260200191505060405180910390f35b61046e6115bb565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6104e4600480360360208110156104b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115ec565b005b6104ee6117f1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61055c6004803603602081101561053057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611817565b6040518082815260200191505060405180910390f35b61057a611907565b005b610584611aad565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105b8611ad1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61064c600480360360e08110156105fa57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611af5565b005b610656611c3b565b6040518082815260200191505060405180910390f35b6106986004803603602081101561068257600080fd5b8101908080359060200190929190505050611c5e565b6040518082815260200191505060405180910390f35b6106b6611c99565b6040518082815260200191505060405180910390f35b6106d4611c9f565b6040518082815260200191505060405180910390f35b6107406004803603606081101561070057600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611eb5565b6040518082815260200191505060405180910390f35b6107986004803603602081101561076c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a73565b005b6107a2612bb2565b6040518082815260200191505060405180910390f35b6107c0612d00565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107f4612d24565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108626004803603602081101561083657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d48565b60405180821515815260200191505060405180910390f35b610882612f4a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108f0600480360360208110156108c457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f6e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6109646004803603602081101561093857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fa4565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6109976130ff565b6040518082815260200191505060405180910390f35b6109b56131f4565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b6109f661321e565b60405180821515815260200191505060405180910390f35b610a16613242565b6040518082815260200191505060405180910390f35b610a346132a9565b6040518082815260200191505060405180910390f35b610a5261337c565b6040518082815260200191505060405180910390f35b610a706133d8565b6040518082815260200191505060405180910390f35b610a8e6133de565b6040518082815260200191505060405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b600080610ad483611817565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637965d56d600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610b8b57600080fd5b505afa158015610b9f573d6000803e3d6000fd5b505050506040513d6020811015610bb557600080fd5b810190808051906020019092919050505090506127108210610bd957809250610bde565b600092505b5050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060128054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ca65780601f10610c7b57610100808354040283529160200191610ca6565b820191906000526020600020905b815481529060010190602001808311610c8957829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d71576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ef0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600960008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461102d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600481111561103a57fe5b82600481111561104657fe5b14156110b6576127108110156110a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806143646023913960400191505060405180910390fd5b8060036001018190555061125c565b600160048111156110c357fe5b8260048111156110cf57fe5b141561115b576103e881111561114d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b80600380018190555061125b565b6002600481111561116857fe5b82600481111561117457fe5b1415611201576127108111156111f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b8060036004018190555061125a565b6003600481111561120e57fe5b82600481111561121a57fe5b141561122f5780600360050181905550611259565b60048081111561123b57fe5b82600481111561124757fe5b141561125857806003600201819055505b5b5b5b5b5050565b600061126a614274565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905060006112f385611817565b905061271081101561136d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f74207965742066756c6c792076657374656400000000000000000000000081525060200191505060405180910390fd5b600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160009055600282016000905560038201600090556004820160009055505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637965d56d84600001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561144e57600080fd5b505afa158015611462573d6000803e3d6000fd5b505050506040513d602081101561147857600080fd5b810190808051906020019092919050505090508573ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1826000604051808381526020018281526020019250505060405180910390a27f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561157357600080fd5b505af1158015611587573d6000803e3d6000fd5b505050506040513d602081101561159d57600080fd5b81019080805190602001909291905050505080935050505092915050565b60098060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611733576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806142d56026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611821614274565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905060006118b88260600151436133e490919063ffffffff16565b905060008260400151905060008111156118fa576118f3816118e56127108561342e90919063ffffffff16565b6134b490919063ffffffff16565b93506118ff565b600093505b505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806142fb6022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bb6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6040518060c00160405280888152602001878152602001868152602001858152602001848152602001838152506003600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015590505080600f819055504360108190555050505050505050565b6000611c59611c4861337c565b600f546133e490919063ffffffff16565b905090565b6000611c92662386f26fc10000611c84611c7f85611c7a613242565b6134fe565b6137df565b6134b490919063ffffffff16565b9050919050565b60115481565b60007f000000000000000000000000000000000000000000000000000000000000000015611ddc57611dd56064611dc77f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611d7657600080fd5b505afa158015611d8a573d6000803e3d6000fd5b505050506040513d6020811015611da057600080fd5b8101908080519060200190929190505050611db9613242565b61342e90919063ffffffff16565b6134b490919063ffffffff16565b9050611eb2565b611eaf6064611ea17f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611e4a57600080fd5b505afa158015611e5e573d6000803e3d6000fd5b505050506040513d6020811015611e7457600080fd5b810190808051906020019092919050505060ff16600a0a611e93613242565b61342e90919063ffffffff16565b6134b490919063ffffffff16565b90505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611f6161381b565b600360050154600f541115611fde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000611fe8611c9f565b9050611ff2613846565b84101561204a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806143876023913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631eec5a9a7f0000000000000000000000000000000000000000000000000000000000000000886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156120fb57600080fd5b505afa15801561210f573d6000803e3d6000fd5b505050506040513d602081101561212557600080fd5b81019080805190602001909291905050509050600061214382611c5e565b9050629896808110156121be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b6121c66132a9565b81111561223b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b600061226961271061225b6003600401548561342e90919063ffffffff16565b6134b490919063ffffffff16565b905060006122928261228485876133e490919063ffffffff16565b6133e490919063ffffffff16565b90506122e133308b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166138cb909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561239257600080fd5b505af11580156123a6573d6000803e3d6000fd5b505050506040513d60208110156123bc57600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bc157ac18a7f0000000000000000000000000000000000000000000000000000000000000000846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561248757600080fd5b505af115801561249b573d6000803e3d6000fd5b505050506040513d60208110156124b157600080fd5b8101908080519060200190929190505050506124d88960115461398c90919063ffffffff16565b60118190555060008214612552576125517f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16613a149092919063ffffffff16565b5b61256784600f5461398c90919063ffffffff16565b600f819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561262057600080fd5b505af1158015612634573d6000803e3d6000fd5b505050506040513d602081101561264a57600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775784306040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156126ef57600080fd5b505af1158015612703573d6000803e3d6000fd5b505050506040513d602081101561271957600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e83409a306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156127b657600080fd5b505af11580156127ca573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631bd39674856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561284157600080fd5b505afa158015612855573d6000803e3d6000fd5b505050506040513d602081101561286b57600080fd5b810190808051906020019092919050505090506040518060a001604052806128de83600e60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461398c90919063ffffffff16565b815260200161293886600e60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461398c90919063ffffffff16565b8152602001600360010154815260200143815260200187815250600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040155905050856129df6003600101544361398c90919063ffffffff16565b857f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58d6040518082815260200191505060405180910390a4612a1f6130ff565b612a27613846565b612a2f611c9f565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a4612a63613ab6565b8396505050505050509392505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b6e57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f000000000000000000000000000000000000000000000000000000000000000015612cf257612ceb633b9aca00612cdd7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612c8c57600080fd5b505afa158015612ca0573d6000803e3d6000fd5b505050506040513d6020811015612cb657600080fd5b8101908080519060200190929190505050612ccf6130ff565b61342e90919063ffffffff16565b6134b490919063ffffffff16565b9050612cfd565b612cfa6130ff565b90505b90565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612da357600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dfc57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e5557600080fd5b612f417f00000000000000000000000000000000000000000000000000000000000000008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ee057600080fd5b505afa158015612ef4573d6000803e3d6000fd5b505050506040513d6020811015612f0a57600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff16613a149092919063ffffffff16565b60019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600e6020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b600080600080612fb2614274565b600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637965d56d82600001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156130a557600080fd5b505afa1580156130b9573d6000803e3d6000fd5b505050506040513d60208110156130cf57600080fd5b81019080805190602001909291905050509450806040015193508060600151925080608001519150509193509193565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561316857600080fd5b505afa15801561317c573d6000803e3d6000fd5b505050506040513d602081101561319257600080fd5b810190808051906020019092919050505090506131ee670de0b6b3a76400006131e06131db6131d5633b9aca006131c7611c3b565b61342e90919063ffffffff16565b856134fe565b6137df565b6134b490919063ffffffff16565b91505090565b60038060000154908060010154908060020154908060030154908060040154908060050154905086565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061328e62989680613280633b9aca0061327261325e6130ff565b60036000015461342e90919063ffffffff16565b61398c90919063ffffffff16565b6134b490919063ffffffff16565b90506003600201548110156132a65760036002015490505b90565b6000613377620186a061336960038001547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561332057600080fd5b505afa158015613334573d6000803e3d6000fd5b505050506040513d602081101561334a57600080fd5b810190808051906020019092919050505061342e90919063ffffffff16565b6134b490919063ffffffff16565b905090565b600080613394601054436133e490919063ffffffff16565b90506133c26003600101546133b483600f5461342e90919063ffffffff16565b6134b490919063ffffffff16565b9150600f548211156133d457600f5491505b5090565b60105481565b600f5481565b600061342683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c1c565b905092915050565b60008083141561344157600090506134ae565b600082840290508284828161345257fe5b04146134a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806143436021913960400191505060405180910390fd5b809150505b92915050565b60006134f683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613cdc565b905092915050565b6135066142a3565b6000821161355f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061431d6026913960400191505060405180910390fd5b600083141561359d57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090506137d9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff1683116136d657600082607060ff1685901b816135ea57fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156136a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150506137d9565b60006136f2846e01000000000000000000000000000085613da2565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156137a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161381357fe5b049050919050565b61383761382661337c565b600f546133e490919063ffffffff16565b600f8190555043601081905550565b600061389262989680613884633b9aca006138766138626130ff565b60036000015461342e90919063ffffffff16565b61398c90919063ffffffff16565b6134b490919063ffffffff16565b90506003600201548110156138ae5760036002015490506138c8565b6000600360020154146138c75760006003600201819055505b5b90565b613986846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613e64565b50505050565b600080828401905083811015613a0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613ab18363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613e64565b505050565b6000613ad560096003015460096004015461398c90919063ffffffff16565b9050600060096001015414158015613aed5750804310155b15613c195760006003600001549050600960000160009054906101000a900460ff1615613b5c57613b3160096001015460036000015461398c90919063ffffffff16565b60036000018190555060096002015460036000015410613b575760006009600101819055505b613ba0565b613b796009600101546003600001546133e490919063ffffffff16565b60036000018190555060096002015460036000015411613b9f5760006009600101819055505b5b436009600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600360000154600960010154600960000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b6000838311158290613cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c8e578082015181840152602081019050613c73565b50505050905090810190601f168015613cbb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290613d88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d4d578082015181840152602081019050613d32565b50505050905090810190601f168015613d7a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613d9457fe5b049050809150509392505050565b6000806000613db18686613f53565b9150915060008480613dbf57fe5b868809905082811115613dd3576001820391505b8083039250848210613e4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b613e58838387613fa6565b93505050509392505050565b6060613ec6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140439092919063ffffffff16565b9050600081511115613f4e57808060200190516020811015613ee757600080fd5b8101908080519060200190929190505050613f4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806143aa602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80613f8057fe5b84860990508385029250828103915082811015613f9e576001820391505b509250929050565b6000808260000383169050808381613fba57fe5b049250808581613fc657fe5b0494506001818260000381613fd757fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060614052848460008561405b565b90509392505050565b606061406685614261565b6140d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106141285780518252602082019150602081019050602083039250614105565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461418a576040519150601f19603f3d011682016040523d82523d6000602084013e61418f565b606091505b509150915081156141a4578092505050614259565b6000815111156141b75780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561421e578082015181840152602081019050614203565b50505050905090810190601f16801561424b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7756657374696e67206d757374206265206c6f6e676572207468616e203320686f757273536c697070616765206c696d69743a206d6f7265207468616e206d61782070726963655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220c8a2032de9985cfe5da4bce7092dae057b68309be591d40d04d9b3c5ecb887e964736f6c6343000705003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000005c4fdfc5233f935f20d2adba572f770c2e377ab000000000000000000000000075bdef24285013387a47775828bec90b91ca9a5f0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e000000000000000000000000cb54ea94191b280c296e6ff0e37c7e76ad42dc6a000000000000000000000000677d6ec74fa352d4ef9b1886f6155384acd70d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056461693434000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c8063839c278811610130578063c6b2c4cd116100b8578063d7ccfb0b1161007c578063d7ccfb0b14610a0e578063e0176de814610a2c578063e392a26214610a4a578063f5c2ab5b14610a68578063fc7b9c1814610a8657610227565b8063c6b2c4cd146108ae578063cd1234b314610922578063cea55f571461098f578063d5025625146109ad578063d7969060146109ee57610227565b8063904b3ece116100ff578063904b3ece1461079a5780639854278e146107b857806398fabd3a146107ec578063b4abccba14610820578063c5332b7c1461087a57610227565b8063839c2788146106ae578063844b5c7c146106cc5780638dbdbe6d146106ea5780638ff390991461075657610227565b806346f68ee9116101b35780635d0afda9116101825780635d0afda91461057c57806361d027b3146105b057806371535008146105e4578063759076e51461064e5780637927ebf81461066c57610227565b806346f68ee9146104a25780634cf088d9146104e6578063507930ec1461051a5780635a96ac0a1461057257610227565b8063089208d8116101fa578063089208d81461036f5780631a3d0068146103795780631e321a0f146103c75780631feed31f14610402578063451ee4a11461046657610227565b8063016a42841461022c57806301b88ee8146102605780630505c8c9146102b857806306fdde03146102ec575b600080fd5b610234610aa4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102a26004803603602081101561027657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ac8565b6040518082815260200191505060405180910390f35b6102c0610be5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102f4610c0e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610334578082015181840152602081019050610319565b50505050905090810190601f1680156103615780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610377610cb0565b005b6103c56004803603608081101561038f57600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610e2f565b005b610400600480360360408110156103dd57600080fd5b81019080803560ff16906020019092919080359060200190929190505050610f6c565b005b6104506004803603604081101561041857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611260565b6040518082815260200191505060405180910390f35b61046e6115bb565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6104e4600480360360208110156104b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115ec565b005b6104ee6117f1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61055c6004803603602081101561053057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611817565b6040518082815260200191505060405180910390f35b61057a611907565b005b610584611aad565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105b8611ad1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61064c600480360360e08110156105fa57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611af5565b005b610656611c3b565b6040518082815260200191505060405180910390f35b6106986004803603602081101561068257600080fd5b8101908080359060200190929190505050611c5e565b6040518082815260200191505060405180910390f35b6106b6611c99565b6040518082815260200191505060405180910390f35b6106d4611c9f565b6040518082815260200191505060405180910390f35b6107406004803603606081101561070057600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611eb5565b6040518082815260200191505060405180910390f35b6107986004803603602081101561076c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a73565b005b6107a2612bb2565b6040518082815260200191505060405180910390f35b6107c0612d00565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107f4612d24565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108626004803603602081101561083657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d48565b60405180821515815260200191505060405180910390f35b610882612f4a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108f0600480360360208110156108c457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f6e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6109646004803603602081101561093857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fa4565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6109976130ff565b6040518082815260200191505060405180910390f35b6109b56131f4565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b6109f661321e565b60405180821515815260200191505060405180910390f35b610a16613242565b6040518082815260200191505060405180910390f35b610a346132a9565b6040518082815260200191505060405180910390f35b610a5261337c565b6040518082815260200191505060405180910390f35b610a706133d8565b6040518082815260200191505060405180910390f35b610a8e6133de565b6040518082815260200191505060405180910390f35b7f0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e81565b600080610ad483611817565b905060007f00000000000000000000000075bdef24285013387a47775828bec90b91ca9a5f73ffffffffffffffffffffffffffffffffffffffff16637965d56d600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610b8b57600080fd5b505afa158015610b9f573d6000803e3d6000fd5b505050506040513d6020811015610bb557600080fd5b810190808051906020019092919050505090506127108210610bd957809250610bde565b600092505b5050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060128054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ca65780601f10610c7b57610100808354040283529160200191610ca6565b820191906000526020600020905b815481529060010190602001808311610c8957829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d71576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ef0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600960008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461102d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600481111561103a57fe5b82600481111561104657fe5b14156110b6576127108110156110a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806143646023913960400191505060405180910390fd5b8060036001018190555061125c565b600160048111156110c357fe5b8260048111156110cf57fe5b141561115b576103e881111561114d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b80600380018190555061125b565b6002600481111561116857fe5b82600481111561117457fe5b1415611201576127108111156111f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b8060036004018190555061125a565b6003600481111561120e57fe5b82600481111561121a57fe5b141561122f5780600360050181905550611259565b60048081111561123b57fe5b82600481111561124757fe5b141561125857806003600201819055505b5b5b5b5b5050565b600061126a614274565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905060006112f385611817565b905061271081101561136d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f74207965742066756c6c792076657374656400000000000000000000000081525060200191505060405180910390fd5b600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160009055600282016000905560038201600090556004820160009055505060007f00000000000000000000000075bdef24285013387a47775828bec90b91ca9a5f73ffffffffffffffffffffffffffffffffffffffff16637965d56d84600001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561144e57600080fd5b505afa158015611462573d6000803e3d6000fd5b505050506040513d602081101561147857600080fd5b810190808051906020019092919050505090508573ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1826000604051808381526020018281526020019250505060405180910390a27f00000000000000000000000075bdef24285013387a47775828bec90b91ca9a5f73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561157357600080fd5b505af1158015611587573d6000803e3d6000fd5b505050506040513d602081101561159d57600080fd5b81019080805190602001909291905050505080935050505092915050565b60098060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611733576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806142d56026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611821614274565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905060006118b88260600151436133e490919063ffffffff16565b905060008260400151905060008111156118fa576118f3816118e56127108561342e90919063ffffffff16565b6134b490919063ffffffff16565b93506118ff565b600093505b505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806142fb6022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f00000000000000000000000075bdef24285013387a47775828bec90b91ca9a5f81565b7f000000000000000000000000cb54ea94191b280c296e6ff0e37c7e76ad42dc6a81565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bb6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6040518060c00160405280888152602001878152602001868152602001858152602001848152602001838152506003600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015590505080600f819055504360108190555050505050505050565b6000611c59611c4861337c565b600f546133e490919063ffffffff16565b905090565b6000611c92662386f26fc10000611c84611c7f85611c7a613242565b6134fe565b6137df565b6134b490919063ffffffff16565b9050919050565b60115481565b60007f000000000000000000000000000000000000000000000000000000000000000015611ddc57611dd56064611dc77f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611d7657600080fd5b505afa158015611d8a573d6000803e3d6000fd5b505050506040513d6020811015611da057600080fd5b8101908080519060200190929190505050611db9613242565b61342e90919063ffffffff16565b6134b490919063ffffffff16565b9050611eb2565b611eaf6064611ea17f0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611e4a57600080fd5b505afa158015611e5e573d6000803e3d6000fd5b505050506040513d6020811015611e7457600080fd5b810190808051906020019092919050505060ff16600a0a611e93613242565b61342e90919063ffffffff16565b6134b490919063ffffffff16565b90505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611f6161381b565b600360050154600f541115611fde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000611fe8611c9f565b9050611ff2613846565b84101561204a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806143876023913960400191505060405180910390fd5b60007f000000000000000000000000cb54ea94191b280c296e6ff0e37c7e76ad42dc6a73ffffffffffffffffffffffffffffffffffffffff16631eec5a9a7f0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156120fb57600080fd5b505afa15801561210f573d6000803e3d6000fd5b505050506040513d602081101561212557600080fd5b81019080805190602001909291905050509050600061214382611c5e565b9050629896808110156121be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b6121c66132a9565b81111561223b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b600061226961271061225b6003600401548561342e90919063ffffffff16565b6134b490919063ffffffff16565b905060006122928261228485876133e490919063ffffffff16565b6133e490919063ffffffff16565b90506122e133308b7f0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e73ffffffffffffffffffffffffffffffffffffffff166138cb909392919063ffffffff16565b7f0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e73ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000cb54ea94191b280c296e6ff0e37c7e76ad42dc6a8b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561239257600080fd5b505af11580156123a6573d6000803e3d6000fd5b505050506040513d60208110156123bc57600080fd5b8101908080519060200190929190505050507f000000000000000000000000cb54ea94191b280c296e6ff0e37c7e76ad42dc6a73ffffffffffffffffffffffffffffffffffffffff1663bc157ac18a7f0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561248757600080fd5b505af115801561249b573d6000803e3d6000fd5b505050506040513d60208110156124b157600080fd5b8101908080519060200190929190505050506124d88960115461398c90919063ffffffff16565b60118190555060008214612552576125517f000000000000000000000000677d6ec74fa352d4ef9b1886f6155384acd70d90837f0000000000000000000000005c4fdfc5233f935f20d2adba572f770c2e377ab073ffffffffffffffffffffffffffffffffffffffff16613a149092919063ffffffff16565b5b61256784600f5461398c90919063ffffffff16565b600f819055507f0000000000000000000000005c4fdfc5233f935f20d2adba572f770c2e377ab073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561262057600080fd5b505af1158015612634573d6000803e3d6000fd5b505050506040513d602081101561264a57600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775784306040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156126ef57600080fd5b505af1158015612703573d6000803e3d6000fd5b505050506040513d602081101561271957600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e83409a306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156127b657600080fd5b505af11580156127ca573d6000803e3d6000fd5b5050505060007f00000000000000000000000075bdef24285013387a47775828bec90b91ca9a5f73ffffffffffffffffffffffffffffffffffffffff16631bd39674856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561284157600080fd5b505afa158015612855573d6000803e3d6000fd5b505050506040513d602081101561286b57600080fd5b810190808051906020019092919050505090506040518060a001604052806128de83600e60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461398c90919063ffffffff16565b815260200161293886600e60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461398c90919063ffffffff16565b8152602001600360010154815260200143815260200187815250600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040155905050856129df6003600101544361398c90919063ffffffff16565b857f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58d6040518082815260200191505060405180910390a4612a1f6130ff565b612a27613846565b612a2f611c9f565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a4612a63613ab6565b8396505050505050509392505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b6e57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f000000000000000000000000000000000000000000000000000000000000000015612cf257612ceb633b9aca00612cdd7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612c8c57600080fd5b505afa158015612ca0573d6000803e3d6000fd5b505050506040513d6020811015612cb657600080fd5b8101908080519060200190929190505050612ccf6130ff565b61342e90919063ffffffff16565b6134b490919063ffffffff16565b9050612cfd565b612cfa6130ff565b90505b90565b7f0000000000000000000000005c4fdfc5233f935f20d2adba572f770c2e377ab081565b7f000000000000000000000000677d6ec74fa352d4ef9b1886f6155384acd70d9081565b60007f0000000000000000000000005c4fdfc5233f935f20d2adba572f770c2e377ab073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612da357600080fd5b7f00000000000000000000000075bdef24285013387a47775828bec90b91ca9a5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dfc57600080fd5b7f0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e5557600080fd5b612f417f000000000000000000000000677d6ec74fa352d4ef9b1886f6155384acd70d908373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ee057600080fd5b505afa158015612ef4573d6000803e3d6000fd5b505050506040513d6020811015612f0a57600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff16613a149092919063ffffffff16565b60019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600e6020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b600080600080612fb2614274565b600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090507f00000000000000000000000075bdef24285013387a47775828bec90b91ca9a5f73ffffffffffffffffffffffffffffffffffffffff16637965d56d82600001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156130a557600080fd5b505afa1580156130b9573d6000803e3d6000fd5b505050506040513d60208110156130cf57600080fd5b81019080805190602001909291905050509450806040015193508060600151925080608001519150509193509193565b6000807f0000000000000000000000005c4fdfc5233f935f20d2adba572f770c2e377ab073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561316857600080fd5b505afa15801561317c573d6000803e3d6000fd5b505050506040513d602081101561319257600080fd5b810190808051906020019092919050505090506131ee670de0b6b3a76400006131e06131db6131d5633b9aca006131c7611c3b565b61342e90919063ffffffff16565b856134fe565b6137df565b6134b490919063ffffffff16565b91505090565b60038060000154908060010154908060020154908060030154908060040154908060050154905086565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061328e62989680613280633b9aca0061327261325e6130ff565b60036000015461342e90919063ffffffff16565b61398c90919063ffffffff16565b6134b490919063ffffffff16565b90506003600201548110156132a65760036002015490505b90565b6000613377620186a061336960038001547f0000000000000000000000005c4fdfc5233f935f20d2adba572f770c2e377ab073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561332057600080fd5b505afa158015613334573d6000803e3d6000fd5b505050506040513d602081101561334a57600080fd5b810190808051906020019092919050505061342e90919063ffffffff16565b6134b490919063ffffffff16565b905090565b600080613394601054436133e490919063ffffffff16565b90506133c26003600101546133b483600f5461342e90919063ffffffff16565b6134b490919063ffffffff16565b9150600f548211156133d457600f5491505b5090565b60105481565b600f5481565b600061342683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c1c565b905092915050565b60008083141561344157600090506134ae565b600082840290508284828161345257fe5b04146134a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806143436021913960400191505060405180910390fd5b809150505b92915050565b60006134f683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613cdc565b905092915050565b6135066142a3565b6000821161355f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061431d6026913960400191505060405180910390fd5b600083141561359d57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090506137d9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff1683116136d657600082607060ff1685901b816135ea57fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156136a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150506137d9565b60006136f2846e01000000000000000000000000000085613da2565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156137a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161381357fe5b049050919050565b61383761382661337c565b600f546133e490919063ffffffff16565b600f8190555043601081905550565b600061389262989680613884633b9aca006138766138626130ff565b60036000015461342e90919063ffffffff16565b61398c90919063ffffffff16565b6134b490919063ffffffff16565b90506003600201548110156138ae5760036002015490506138c8565b6000600360020154146138c75760006003600201819055505b5b90565b613986846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613e64565b50505050565b600080828401905083811015613a0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613ab18363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613e64565b505050565b6000613ad560096003015460096004015461398c90919063ffffffff16565b9050600060096001015414158015613aed5750804310155b15613c195760006003600001549050600960000160009054906101000a900460ff1615613b5c57613b3160096001015460036000015461398c90919063ffffffff16565b60036000018190555060096002015460036000015410613b575760006009600101819055505b613ba0565b613b796009600101546003600001546133e490919063ffffffff16565b60036000018190555060096002015460036000015411613b9f5760006009600101819055505b5b436009600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600360000154600960010154600960000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b6000838311158290613cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c8e578082015181840152602081019050613c73565b50505050905090810190601f168015613cbb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290613d88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d4d578082015181840152602081019050613d32565b50505050905090810190601f168015613d7a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613d9457fe5b049050809150509392505050565b6000806000613db18686613f53565b9150915060008480613dbf57fe5b868809905082811115613dd3576001820391505b8083039250848210613e4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b613e58838387613fa6565b93505050509392505050565b6060613ec6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140439092919063ffffffff16565b9050600081511115613f4e57808060200190516020811015613ee757600080fd5b8101908080519060200190929190505050613f4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806143aa602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80613f8057fe5b84860990508385029250828103915082811015613f9e576001820391505b509250929050565b6000808260000383169050808381613fba57fe5b049250808581613fc657fe5b0494506001818260000381613fd757fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060614052848460008561405b565b90509392505050565b606061406685614261565b6140d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106141285780518252602082019150602081019050602083039250614105565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461418a576040519150601f19603f3d011682016040523d82523d6000602084013e61418f565b606091505b509150915081156141a4578092505050614259565b6000815111156141b75780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561421e578082015181840152602081019050614203565b50505050905090810190601f16801561424b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7756657374696e67206d757374206265206c6f6e676572207468616e203320686f757273536c697070616765206c696d69743a206d6f7265207468616e206d61782070726963655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220c8a2032de9985cfe5da4bce7092dae057b68309be591d40d04d9b3c5ecb887e964736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000005c4fdfc5233f935f20d2adba572f770c2e377ab000000000000000000000000075bdef24285013387a47775828bec90b91ca9a5f0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e000000000000000000000000cb54ea94191b280c296e6ff0e37c7e76ad42dc6a000000000000000000000000677d6ec74fa352d4ef9b1886f6155384acd70d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056461693434000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): dai44
Arg [1] : _HEC (address): 0x5C4FDfc5233f935f20D2aDbA572F770c2E377Ab0
Arg [2] : _sHEC (address): 0x75bdeF24285013387A47775828bEC90b91Ca9a5F
Arg [3] : _principle (address): 0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E
Arg [4] : _treasury (address): 0xCB54EA94191B280C296E6ff0E37c7e76Ad42dC6A
Arg [5] : _DAO (address): 0x677d6EC74fA352D4Ef9B1886F6155384aCD70D90
Arg [6] : _bondCalculator (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000005c4fdfc5233f935f20d2adba572f770c2e377ab0
Arg [2] : 00000000000000000000000075bdef24285013387a47775828bec90b91ca9a5f
Arg [3] : 0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e
Arg [4] : 000000000000000000000000cb54ea94191b280c296e6ff0e37c7e76ad42dc6a
Arg [5] : 000000000000000000000000677d6ec74fa352d4ef9b1886f6155384acd70d90
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 6461693434000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
21429:17269:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22227:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37617:394;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;693:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38118;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;918:158;;;:::i;:::-;;27355:361;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26341:818;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31085:668;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22755:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1084:260;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22626:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37017:428;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1356:221;;;:::i;:::-;;22156:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22297:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25500:585;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36360:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33428:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23065:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34532:331;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28191:2676;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27820:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35986:275;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22078:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22374;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38391:304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22545:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22821:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35131:340;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35595:270;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22700:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22446:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33694:261;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33159:140;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36568:286;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22997:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22915;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22227:34;;;:::o;37617:394::-;37689:19;37722:18;37743:30;37761:10;37743:16;:30::i;:::-;37722:51;;37784:11;37804:4;37798:26;;;37825:9;:23;37836:10;37825:23;;;;;;;;;;;;;;;:34;;;37798:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37784:76;;37895:5;37878:13;:22;37873:131;;37935:6;37918:23;;37873:131;;;37991:1;37974:18;;37873:131;37617:394;;;;;:::o;693:89::-;741:7;768:6;;;;;;;;;;;761:13;;693:89;:::o;38118:::-;38155:19;38194:5;38187:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38118: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;27355:361::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27531:177:::1;;;;;;;;27558:9;27531:177;;;;;;27588:10;27531:177;;;;27621:7;27531:177;;;;27651:7;27531:177;;;;27684:12;27531:177;;::::0;27518:10:::1;:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27355:361:::0;;;;:::o;26341:818::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26453:17:::1;26439:31;;;;;;;;:10;:31;;;;;;;;;26434:718;;;26512:5;26502:6;:15;;26493:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26593:6;26573:5;:17;;:26;;;;26434:718;;;26636:16;26622:30;;;;;;;;:10;:30;;;;;;;;;26617:535;;;26694:4;26684:6;:14;;26675:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26769:6;26751:5;:15:::0;::::1;:24;;;;26617:535;;;26812:13;26798:27;;;;;;;;:10;:27;;;;;;;;;26793:359;;;26867:5;26857:6;:15;;26848:58;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26933:6;26921:5;:9;;:18;;;;26793:359;;;26976:14;26962:28;;;;;;;;:10;:28;;;;;;;;;26957:195;;;27029:6;27013:5;:13;;:22;;;;26957:195;;;27072:18;27058:32:::0;::::1;;;;;;;:10;:32;;;;;;;;;27053:99;;;27134:6;27113:5;:18;;:27;;;;27053:99;26957:195;26793:359;26617:535;26434:718;26341:818:::0;;:::o;31085:668::-;31154:4;31180:16;;:::i;:::-;31199:9;:23;31210:10;31199:23;;;;;;;;;;;;;;;31180:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31233:18;31254:30;31272:10;31254:16;:30::i;:::-;31233:51;;31384:5;31367:13;:22;;31357:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31452:9;:23;31463:10;31452:23;;;;;;;;;;;;;;;;31445:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31506:12;31527:4;31521:26;;;31548:4;:15;;;31521:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31506:58;;31594:10;31580:38;;;31606:7;31615:1;31580:38;;;;;;;;;;;;;;;;;;;;;;;;31655:4;31647:23;;;31672:10;31684:7;31647:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31738:7;31731:14;;;;;31085:668;;;;:::o;22755: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;22626:22::-;;;;;;;;;;;;;:::o;37017:428::-;37087:19;37120:16;;:::i;:::-;37139:9;:23;37150:10;37139:23;;;;;;;;;;;;;;;37120:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37173:20;37196:34;37214:4;:14;;;37196:12;:16;;:34;;;;:::i;:::-;37173:57;;37241:12;37256:4;:12;;;37241:27;;37296:1;37286:7;:11;37281:157;;;37332:43;37366:7;37332:28;37353:5;37332:15;:19;;:28;;;;:::i;:::-;:32;;:43;;;;:::i;:::-;37315:60;;37281:157;;;37425:1;37408:18;;37281:157;37017:428;;;;;;:::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;22156:29::-;;;:::o;22297:33::-;;;:::o;25500:585::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25766:241:::1;;;;;;;;25805:16;25766:241;;;;25849:12;25766:241;;;;25890:13;25766:241;;;;25929:10;25766:241;;;;25959:4;25766:241;;;;25987:8;25766:241;;::::0;25758:5:::1;:249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26030:12;26018:9;:24;;;;26065:12;26053:9;:24;;;;25500:585:::0;;;;;;;:::o;36360:106::-;36405:4;36430:28;36445:11;:9;:11::i;:::-;36430:9;;:13;;:28;;;;:::i;:::-;36423:35;;36360:106;:::o;33428:161::-;33484:4;33509:72;33575:4;33509:60;:42;33530:6;33538:11;:9;:11::i;:::-;33509:19;:42::i;:::-;:58;:60::i;:::-;:64;;:72;;;;:::i;:::-;33502:79;;33428:161;;;:::o;23065:26::-;;;;:::o;34532:331::-;34580:11;34609:15;34605:251;;;34651:85;34731:3;34651:74;34685:14;34668:42;;;34712:9;34668:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34651:11;:9;:11::i;:::-;:15;;:74;;;;:::i;:::-;:78;;:85;;;;:::i;:::-;34642:94;;34605:251;;;34778:66;34839:3;34778:55;34809:9;34801:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34795:36;;:2;:36;34778:11;:9;:11::i;:::-;:15;;:55;;;;:::i;:::-;:59;;:66;;;;:::i;:::-;34769:75;;34605:251;34532:331;:::o;28191:2676::-;28313:4;28362:1;28340:24;;:10;:24;;;;28331:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28398:11;:9;:11::i;:::-;28442:5;:13;;;28429:9;;:26;;28420:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28502:15;28520:16;:14;:16::i;:::-;28502:34;;28638:12;:10;:12::i;:::-;28625:9;:25;;28616:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28727:10;28751:8;28740:29;;;28771:9;28782:7;28740:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28727:64;;28802:11;28816:18;28827:5;28816:9;:18::i;:::-;28802:32;;28898:8;28888:6;:18;;28879:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29003:11;:9;:11::i;:::-;28993:6;:21;;28984:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29129:8;29140:36;29169:5;29140:23;29152:5;:9;;;29140:6;:10;;:23;;;;:::i;:::-;:27;;:36;;;;:::i;:::-;29129:47;;29187:11;29201:30;29226:3;29201:19;29212:6;29201:5;:9;;:19;;;;:::i;:::-;:23;;:30;;;;:::i;:::-;29187:44;;29412:74;29450:10;29470:4;29477:7;29420:9;29412:36;;;;:74;;;;;;:::i;:::-;29505:9;29497:27;;;29535:8;29547:7;29497:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29578:8;29567:29;;;29598:7;29607:9;29618:6;29567:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29662:27;29681:7;29662:14;;:18;;:27;;;;:::i;:::-;29647:14;:42;;;;29722:1;29715:3;:8;29710:112;;29771:38;29799:3;29804;29779;29771:26;;;;:38;;;;;:::i;:::-;29710:112;29890:22;29905:5;29890:9;;:13;;:22;;;;:::i;:::-;29878:9;:34;;;;29998:3;29990:21;;;30013:7;;;;;;;;;;;30022:6;29990:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30051:7;;;;;;;;;;;30041:25;;;30068:6;30084:4;30041:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30112:7;;;;;;;;;;;30102:25;;;30137:4;30102:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30155:14;30176:4;30170:26;;;30197:6;30170:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30155:49;;30280:284;;;;;;;;30313:51;30353:9;30313;:23;30324:10;30313:23;;;;;;;;;;;;;;;:34;;;:38;;:51;;;;:::i;:::-;30280:284;;;;30390:47;30429:6;30390:9;:23;30401:10;30390:23;;;;;;;;;;;;;;;:33;;;:37;;:47;;;;:::i;:::-;30280:284;;;;30461:5;:17;;;30280:284;;;;30504:12;30280:284;;;;30542:10;30280:284;;;30254:9;:23;30265:10;30254:23;;;;;;;;;;;;;;;:310;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30690:10;30651:37;30669:5;:17;;;30651:12;:16;;:37;;;;:::i;:::-;30643:6;30621:81;30634:7;30621:81;;;;;;;;;;;;;;;;;;30768:11;:9;:11::i;:::-;30754:12;:10;:12::i;:::-;30736:16;:14;:16::i;:::-;30718:63;;;;;;;;;;30794:8;:6;:8::i;:::-;30852:6;30845:13;;;;;;;;28191:2676;;;;;:::o;27820:142::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27921:1:::1;27901:22;;:8;:22;;;;27892:33;;;::::0;::::1;;27946:8;27936:7;;:18;;;;;;;;;;;;;;;;;;27820:142:::0;:::o;35986:275::-;36043:4;36066:15;36061:193;;;36106:85;36186:3;36106:74;36140:14;36123:42;;;36167:9;36123:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36106:11;:9;:11::i;:::-;:15;;:74;;;;:::i;:::-;:78;;:85;;;;:::i;:::-;36099:92;;;;36061:193;36231:11;:9;:11::i;:::-;36224:18;;35986:275;;:::o;22078:28::-;;;:::o;22374:::-;;;:::o;38391:304::-;38454:4;38491:3;38481:13;;:6;:13;;;;38472:24;;;;;;38526:4;38516:14;;:6;:14;;;;38507:25;;;;;;38562:9;38552:19;;:6;:19;;;;38543:30;;;;;;38584:81;38615:3;38628:6;38620:26;;;38656:4;38620:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38592:6;38584:29;;;;:81;;;;;:::i;:::-;38683:4;38676:11;;38391:304;;;:::o;22545:39::-;;;:::o;22821:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35131:340::-;35191:11;35203:12;35216:14;35231;35259:16;;:::i;:::-;35278:9;:23;35289:10;35278:23;;;;;;;;;;;;;;;35259:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35325:4;35319:26;;;35346:4;:15;;;35319:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35312:50;;35381:4;:12;;;35373:20;;35414:4;:14;;;35404:24;;35449:4;:14;;;35439:24;;35131:340;;;;;;:::o;35595:270::-;35638:15;35670:11;35692:3;35684:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35670:41;;35735:122;35851:4;35735:110;:92;35770:24;35789:3;35770:13;:11;:13::i;:::-;:17;;:24;;;;:::i;:::-;35810:6;35735:19;:92::i;:::-;:108;:110::i;:::-;:114;;:122;;;;:::i;:::-;35722:135;;35595:270;;:::o;22700:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22446:37::-;;;:::o;33694:261::-;33737:11;33779:69;33843:3;33779:58;33825:10;33779:40;33806:11;:9;:11::i;:::-;33779:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;:62;;:69;;;;:::i;:::-;33770:78;;33873:5;:18;;;33864:6;:27;33859:89;;;33918:5;:18;;;33909:27;;33859:89;33694:261;:::o;33159:140::-;33202:4;33227:64;33283:6;33227:50;33260:5;:15;;;33235:3;33227:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;:50;;;;:::i;:::-;:54;;:64;;;;:::i;:::-;33220:71;;33159:140;:::o;36568:286::-;36611:11;36636:20;36659:29;36677:9;;36659:12;:16;;:29;;;;:::i;:::-;36636:52;;36708:57;36746:5;:17;;;36708:32;36723:15;36708:9;;:13;;:32;;;;:::i;:::-;:36;;:57;;;;:::i;:::-;36699:66;;36790:9;;36781:6;:18;36776:71;;;36826:9;;36817:18;;36776:71;36568:286;;:::o;22997:21::-;;;;:::o;22915:::-;;;;:::o;1799:136::-;1857:7;1884:43;1888:1;1891;1884:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1877:50;;1799:136;;;;:::o;2143:250::-;2201:7;2230:1;2225;:6;2221:47;;;2255:1;2248:8;;;;2221:47;2280:9;2296:1;2292;:5;2280:17;;2325:1;2320;2316;:5;;;;;;:10;2308:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2384:1;2377:8;;;2143:250;;;;;:::o;2401:132::-;2459:7;2486:39;2490:1;2493;2486:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2479:46;;2401:132;;;;:::o;19956:719::-;20037:16;;:::i;:::-;20088:1;20074:11;:15;20066:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20160:1;20147:9;:14;20143:50;;;20170:23;;;;;;;;20191:1;20170:23;;;;;20163:30;;;;20143:50;20231:2;20210:24;;:9;:24;20206:462;;20251:14;20296:11;19382:3;20269:23;;:9;:23;;20268:39;;;;;;20251:56;;20348:2;20330:21;;:6;:21;;20322:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20408:26;;;;;;;;20426:6;20408:26;;;;;20401:33;;;;;20206:462;20467:14;20484:45;20500:9;19424:31;20517:11;20484:15;:45::i;:::-;20467:62;;20570:2;20552:21;;:6;:21;;20544:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20630:26;;;;;;;;20648:6;20630:26;;;;;20623:33;;;19956:719;;;;;:::o;19811:137::-;19882:4;19924:16;19913:4;:7;;;19908:13;;:32;;;;;;19901:39;;19811:137;;;:::o;32890:124::-;32943:28;32958:11;:9;:11::i;:::-;32943:9;;:13;;:28;;;;:::i;:::-;32931:9;:40;;;;32994:12;32982:9;:24;;;;32890:124::o;34082:345::-;34123:11;34157:69;34221:3;34157:58;34203:10;34157:40;34184:11;:9;:11::i;:::-;34157:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;:62;;:69;;;;:::i;:::-;34148:78;;34251:5;:18;;;34242:6;:27;34237:183;;;34296:5;:18;;;34287:27;;34237:183;;;34367:1;34345:5;:18;;;:23;34340:80;;34407:1;34386:5;:18;;:22;;;;34340:80;34237:183;34082:345;:::o;16493:205::-;16594:96;16614:5;16644:27;;;16673:4;16679:2;16683:5;16621:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16594:19;:96::i;:::-;16493:205;;;;:::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;16308:177::-;16391:86;16411:5;16441:23;;;16466:2;16470:5;16418:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16391:19;:86::i;:::-;16308:177;;;:::o;31912:917::-;31950:19;31972:45;31998:10;:17;;;31972:10;:20;;;:24;;:45;;;;:::i;:::-;31950:67;;32051:1;32032:10;:15;;;:20;;:54;;;;;32072:14;32056:12;:30;;32032:54;32028:794;;;32104:12;32119:5;:21;;;32104:36;;32160:10;:14;;;;;;;;;;;;32155:494;;;32220:44;32247:10;:15;;;32220:5;:21;;;:25;;:44;;;;:::i;:::-;32196:5;:21;;:68;;;;32313:10;:17;;;32288:5;:21;;;:42;32283:112;;32374:1;32356:10;:15;;:19;;;;32283:112;32155:494;;;32459:44;32486:10;:15;;;32459:5;:21;;;:25;;:44;;;;:::i;:::-;32435:5;:21;;:68;;;;32552:10;:17;;;32527:5;:21;;;:42;32522:112;;32613:1;32595:10;:15;;:19;;;;32522:112;32155:494;32686:12;32663:10;:20;;:35;;;;32718:92;32745:7;32754:5;:21;;;32777:10;:15;;;32794:10;:14;;;;;;;;;;;;32718:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32028:794;;31912:917;:::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;2541:189::-;2627:7;2659:1;2655;:5;2662:12;2647:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2686:9;2702:1;2698;:5;;;;;;2686:17;;2721:1;2714:8;;;2541:189;;;;;:::o;18856:347::-;18962:7;18983:9;18994;19007:13;19015:1;19018;19007:7;:13::i;:::-;18982:38;;;;19031:10;19057:1;19044:15;;;;;19054:1;19051;19044:15;19031:28;;19079:1;19074:2;:6;19070:18;;;19087:1;19082:6;;;;19070:18;19104:2;19099:7;;;;19129:1;19125;:5;19117:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19179:16;19187:1;19190;19193;19179:7;:16::i;:::-;19172:23;;;;;18856:347;;;;;:::o;17697:420::-;17780:23;17806:69;17834:4;17806:69;;;;;;;;;;;;;;;;;17814:5;17806:27;;;;:69;;;;;:::i;:::-;17780:95;;17910:1;17890:10;:17;:21;17886:224;;;18032:10;18021:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18013:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17886:224;17697:420;;;:::o;18148:210::-;18209:9;18220;18242:10;18276:2;18255:25;;;;;18265:1;18262;18255:25;18242:38;;18299:1;18295;:5;18291:9;;18320:1;18315:2;:6;18311:10;;18341:1;18336:2;:6;18332:18;;;18349:1;18344:6;;;;18332:18;18148:210;;;;;;:::o;18366:482::-;18472:7;18492:12;18512:1;18511:2;;18507:1;:6;18492:21;;18529:4;18524:9;;;;;;;;;18549:4;18544:9;;;;;;;;;18591:1;18584:4;18576;18575:5;;18574:14;;;;;;:18;18569:1;:24;18564:29;;;;18604:9;18616:1;18604:13;;18641:1;18637;:5;18633:1;:9;18628:14;;;;18666:1;18662;:5;18658:1;:9;18653:14;;;;18691:1;18687;:5;18683:1;:9;18678:14;;;;18716:1;18712;:5;18708:1;:9;18703:14;;;;18741:1;18737;:5;18733:1;:9;18728:14;;;;18766:1;18762;:5;18758:1;:9;18753:14;;;;18791:1;18787;:5;18783:1;:9;18778:14;;;;18816:1;18812;:5;18808:1;:9;18803:14;;;;18839:1;18835;:5;18828:12;;;;18366:482;;;;;:::o;4242:196::-;4345:12;4377:53;4400:6;4408:4;4414:1;4417:12;4377:22;:53::i;:::-;4370:60;;4242:196;;;;;:::o;5218:979::-;5348:12;5381:18;5392:6;5381:10;:18::i;:::-;5373:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5507:12;5521:23;5548:6;:11;;5568:8;5579:4;5548:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5506:78;;;;5599:7;5595:595;;;5630:10;5623:17;;;;;;5595:595;5764:1;5744:10;:17;:21;5740:439;;;6007:10;6001:17;6068:15;6055:10;6051:2;6047:19;6040:44;5955:148;6150:12;6143:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5218:979;;;;;;;:::o;3415:233::-;3475:4;3494:12;3605:7;3593:20;3585:28;;3639:1;3632:4;:8;3625:15;;;3415:233;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://c8a2032de9985cfe5da4bce7092dae057b68309be591d40d04d9b3c5ecb887e9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
FTM | 100.00% | $7.23 | 1,015.2484 | $7,340.25 |
[ Download: CSV Export ]
[ 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.