Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Multichain Info
Latest 25 from a total of 2,162 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 13833853 | 989 days ago | IN | 0 ETH | 0.00308239 | ||||
Deposit | 13670327 | 1015 days ago | IN | 0 ETH | 0.01547663 | ||||
Deposit | 13670283 | 1015 days ago | IN | 0 ETH | 0.01746914 | ||||
Deposit | 13670277 | 1015 days ago | IN | 0 ETH | 0.01655438 | ||||
Deposit | 13670095 | 1015 days ago | IN | 0 ETH | 0.01410805 | ||||
Redeem | 13544806 | 1035 days ago | IN | 0 ETH | 0.00684357 | ||||
Redeem | 13541749 | 1035 days ago | IN | 0 ETH | 0.01019958 | ||||
Redeem | 13525528 | 1038 days ago | IN | 0 ETH | 0.00977537 | ||||
Redeem | 13522771 | 1038 days ago | IN | 0 ETH | 0.00742714 | ||||
Redeem | 13521709 | 1038 days ago | IN | 0 ETH | 0.02636805 | ||||
Redeem | 13520981 | 1038 days ago | IN | 0 ETH | 0.01578559 | ||||
Redeem | 13520658 | 1038 days ago | IN | 0 ETH | 0.00825413 | ||||
Redeem | 13518931 | 1039 days ago | IN | 0 ETH | 0.00973755 | ||||
Redeem | 13518931 | 1039 days ago | IN | 0 ETH | 0.00795765 | ||||
Redeem | 13518931 | 1039 days ago | IN | 0 ETH | 0.00795765 | ||||
Redeem | 13518916 | 1039 days ago | IN | 0 ETH | 0.00890868 | ||||
Redeem | 13518901 | 1039 days ago | IN | 0 ETH | 0.00986432 | ||||
Redeem | 13517519 | 1039 days ago | IN | 0 ETH | 0.02771052 | ||||
Redeem | 13516557 | 1039 days ago | IN | 0 ETH | 0.01130719 | ||||
Redeem | 13516549 | 1039 days ago | IN | 0 ETH | 0.009408 | ||||
Redeem | 13515459 | 1039 days ago | IN | 0 ETH | 0.01053545 | ||||
Redeem | 13514549 | 1039 days ago | IN | 0 ETH | 0.0124525 | ||||
Redeem | 13514250 | 1039 days ago | IN | 0 ETH | 0.01194472 | ||||
Redeem | 13514250 | 1039 days ago | IN | 0 ETH | 0.01194472 | ||||
Redeem | 13514250 | 1039 days ago | IN | 0 ETH | 0.01194472 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
OlympusBondDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-03 */ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; // Contract logic @ line 607 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 ( bool ); function valueOf( address _token, uint _amount ) external view returns ( uint value_ ); } interface IBondCalculator { function valuation( address _LP, uint _amount ) external view returns ( uint ); function markdown( address _LP ) external view returns ( uint ); } interface IStaking { function stake( uint _amount, address _recipient ) external returns ( bool ); } interface IStakingHelper { function stake( uint _amount, address _recipient ) external; } contract OlympusBondDepository 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 OHM; // token given as payment for bond address public immutable principle; // token used to create bond address public immutable treasury; // mints OHM when receives principle address public immutable DAO; // receives profit share from bond bool public immutable isLiquidityBond; // LP and Reserve bonds are treated slightly different address public immutable bondCalculator; // calculates value of LP tokens address public staking; // to auto-stake payout address public stakingHelper; // to stake and claim if no staking warmup bool public useHelper; Terms public terms; // stores terms for new bonds Adjust public adjustment; // stores adjustment to BCV data mapping( address => Bond ) public bondInfo; // stores bond information for depositors uint public totalDebt; // total value of outstanding bonds; used for pricing uint public lastDecay; // reference block for debt decay /* ======== 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 struct Bond { uint payout; // OHM remaining to be paid 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 ( address _OHM, address _principle, address _treasury, address _DAO, address _bondCalculator ) { require( _OHM != address(0) ); OHM = _OHM; require( _principle != address(0) ); principle = _principle; require( _treasury != address(0) ); treasury = _treasury; require( _DAO != address(0) ); DAO = _DAO; // bondCalculator should be address(0) if not LP bond bondCalculator = _bondCalculator; isLiquidityBond = ( _bondCalculator != address(0) ); } /** * @notice initializes bond parameters * @param _controlVariable uint * @param _vestingTerm 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() { require( terms.controlVariable == 0, "Bonds must be initialized from 0" ); 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 } /** * @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 36 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; } } /** * @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() { require( _increment <= terms.controlVariable.mul( 25 ).div( 1000 ), "Increment too large" ); adjustment = Adjust({ add: _addition, rate: _increment, target: _target, buffer: _buffer, lastBlock: block.number }); } /** * @notice set contract for auto stake * @param _staking address * @param _helper bool */ function setStaking( address _staking, bool _helper ) external onlyPolicy() { require( _staking != address(0) ); if ( _helper ) { useHelper = true; stakingHelper = _staking; } else { useHelper = false; staking = _staking; } } /* ======== USER FUNCTIONS ======== */ /** * @notice deposit bond * @param _amount uint * @param _maxPrice uint * @param _depositor address * @return uint */ function deposit( uint _amount, uint _maxPrice, address _depositor ) external returns ( uint ) { require( _depositor != address(0), "Invalid address" ); decayDebt(); require( totalDebt <= terms.maxDebt, "Max capacity reached" ); uint priceInUSD = bondPriceInUSD(); // Stored in bond info uint nativePrice = _bondPrice(); require( _maxPrice >= nativePrice, "Slippage limit: more than max price" ); // slippage protection uint value = ITreasury( treasury ).valueOf( principle, _amount ); uint payout = payoutFor( value ); // payout to bonder is computed require( payout >= 10000000, "Bond too small" ); // must be > 0.01 OHM ( underflow protection ) require( payout <= maxPayout(), "Bond too large"); // size protection because there is no slippage // profits are calculated uint fee = payout.mul( terms.fee ).div( 10000 ); uint profit = value.sub( payout ).sub( fee ); /** principle is transferred in approved and deposited into the treasury, returning (_amount - profit) OHM */ IERC20( principle ).safeTransferFrom( msg.sender, address(this), _amount ); IERC20( principle ).approve( address( treasury ), _amount ); ITreasury( treasury ).deposit( _amount, principle, profit ); if ( fee != 0 ) { // fee is transferred to dao IERC20( OHM ).safeTransfer( DAO, fee ); } // total debt is increased totalDebt = totalDebt.add( value ); // depositor info is stored bondInfo[ _depositor ] = Bond({ payout: bondInfo[ _depositor ].payout.add( payout ), vesting: terms.vestingTerm, 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 * @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) if ( percentVested >= 10000 ) { // if fully vested delete bondInfo[ _recipient ]; // delete user info emit BondRedeemed( _recipient, info.payout, 0 ); // emit bond data return stakeOrSend( _recipient, _stake, info.payout ); // pay user everything due } else { // if unfinished // calculate payout vested uint payout = info.payout.mul( percentVested ).div( 10000 ); // store updated deposit info bondInfo[ _recipient ] = Bond({ payout: info.payout.sub( payout ), vesting: info.vesting.sub( block.number.sub( info.lastBlock ) ), lastBlock: block.number, pricePaid: info.pricePaid }); emit BondRedeemed( _recipient, payout, bondInfo[ _recipient ].payout ); return stakeOrSend( _recipient, _stake, payout ); } } /* ======== INTERNAL HELPER FUNCTIONS ======== */ /** * @notice allow user to stake payout automatically * @param _stake bool * @param _amount uint * @return uint */ function stakeOrSend( address _recipient, bool _stake, uint _amount ) internal returns ( uint ) { if ( !_stake ) { // if user does not want to stake IERC20( OHM ).transfer( _recipient, _amount ); // send payout } else { // if user wants to stake if ( useHelper ) { // use if staking warmup is 0 IERC20( OHM ).approve( stakingHelper, _amount ); IStakingHelper( stakingHelper ).stake( _amount, _recipient ); } else { IERC20( OHM ).approve( staking, _amount ); IStaking( staking ).stake( _amount, _recipient ); } } return _amount; } /** * @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( OHM ).totalSupply().mul( terms.maxPayout ).div( 100000 ); } /** * @notice calculate interest due for new bond * @param _value uint * @return uint */ function payoutFor( uint _value ) public view returns ( uint ) { return FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e16 ); } /** * @notice calculate current bond premium * @return price_ uint */ function bondPrice() public view returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } } /** * @notice calculate current bond price and remove floor if above * @return price_ uint */ function _bondPrice() internal returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } else if ( terms.minimumPrice != 0 ) { terms.minimumPrice = 0; } } /** * @notice converts bond price to DAI value * @return price_ uint */ function bondPriceInUSD() public view returns ( uint price_ ) { if( isLiquidityBond ) { price_ = bondPrice().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 100 ); } else { price_ = bondPrice().mul( 10 ** IERC20( principle ).decimals() ).div( 100 ); } } /** * @notice calculate current ratio of debt to OHM supply * @return debtRatio_ uint */ function debtRatio() public view returns ( uint debtRatio_ ) { uint supply = IERC20( OHM ).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 OHM available for claim by depositor * @param _depositor address * @return pendingPayout_ uint */ function pendingPayoutFor( address _depositor ) external view returns ( uint pendingPayout_ ) { uint percentVested = percentVestedFor( _depositor ); uint payout = bondInfo[ _depositor ].payout; if ( percentVested >= 10000 ) { pendingPayout_ = payout; } else { pendingPayout_ = payout.mul( percentVested ).div( 10000 ); } } /* ======= AUXILLIARY ======= */ /** * @notice allow anyone to send lost tokens (excluding principle or OHM) to the DAO * @return bool */ function recoverLostToken( address _token ) external returns ( bool ) { require( _token != OHM ); 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":"address","name":"_OHM","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":"OHM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"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":"","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":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"pendingPayoutFor","outputs":[{"internalType":"uint256","name":"pendingPayout_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"percentVestedFor","outputs":[{"internalType":"uint256","name":"percentVested_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverLostToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum OlympusBondDepository.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"},{"internalType":"bool","name":"_helper","type":"bool"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"standardizedDebtRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"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":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useHelper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101406040523480156200001257600080fd5b506040516200466738038062004667833981810160405260a08110156200003857600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200016757600080fd5b8473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620001d957600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200024b57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002bd57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561010081151560f81b81525050505050505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c6142226200044560003980611b5a52806125a552806128b1525080611b2c52806125745280612be752508061235d52806126c052806127bf5250806118c15280611edc52806121ac528061225d5250806109a75280611b965280611c6f5280611f1852806121295280612170528061229a52806125e1528061276352508061237f52806126e4528061270a52806129085280612c845280612e855280612f6c528061310b52506142226000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80637927ebf811610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b1461090f578063e0176de81461092d578063e392a2621461094b578063f5c2ab5b14610969578063fc7b9c181461098757610211565b8063cea55f5714610840578063d4d863ce1461085e578063d5025625146108ae578063d7969060146108ef57610211565b806398fabd3a116100f457806398fabd3a146106dd578063a6c41fec14610711578063b4abccba14610745578063c5332b7c1461079f578063cd1234b3146107d357610211565b80637927ebf8146105f3578063844b5c7c146106355780638dbdbe6d14610653578063904b3ece146106bf57610211565b8063451ee4a1116101a85780635a96ac0a116101775780635a96ac0a146104f957806361d027b3146105035780637153500814610537578063759076e5146105a157806377b81895146105bf57610211565b8063451ee4a1146103ed57806346f68ee9146104295780634cf088d91461046d578063507930ec146104a157610211565b80631a3d0068116101e45780631a3d0068146102e05780631e321a0f1461032e5780631feed31f146103695780632f3f470a146103cd57610211565b8063016a42841461021657806301b88ee81461024a5780630505c8c9146102a2578063089208d8146102d6575b600080fd5b61021e6109a5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61028c6004803603602081101561026057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109c9565b6040518082815260200191505060405180910390f35b6102aa610a60565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102de610a89565b005b61032c600480360360808110156102f657600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610c08565b005b6103676004803603604081101561034457600080fd5b81019080803560ff16906020019092919080359060200190929190505050610de7565b005b6103b76004803603604081101561037f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506110ac565b6040518082815260200191505060405180910390f35b6103d56113c4565b60405180821515815260200191505060405180910390f35b6103f56113d7565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b61046b6004803603602081101561043f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611408565b005b61047561160d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104e3600480360360208110156104b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611633565b6040518082815260200191505060405180910390f35b610501611719565b005b61050b6118bf565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61059f600480360360e081101561054d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291905050506118e3565b005b6105a9611aa4565b6040518082815260200191505060405180910390f35b6105c7611ac7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61061f6004803603602081101561060957600080fd5b8101908080359060200190929190505050611aed565b6040518082815260200191505060405180910390f35b61063d611b28565b6040518082815260200191505060405180910390f35b6106a96004803603606081101561066957600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d3e565b6040518082815260200191505060405180910390f35b6106c7612570565b6040518082815260200191505060405180910390f35b6106e56126be565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107196126e2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107876004803603602081101561075b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612706565b60405180821515815260200191505060405180910390f35b6107a76128af565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610815600480360360208110156107e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128d3565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610848612903565b6040518082815260200191505060405180910390f35b6108ac6004803603604081101561087457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506129f8565b005b6108b6612bbb565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b6108f7612be5565b60405180821515815260200191505060405180910390f35b610917612c09565b6040518082815260200191505060405180910390f35b610935612c70565b6040518082815260200191505060405180910390f35b610953612d44565b6040518082815260200191505060405180910390f35b610971612da0565b6040518082815260200191505060405180910390f35b61098f612da6565b6040518082815260200191505060405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806109d583611633565b90506000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506127108210610a2f57809250610a59565b610a56612710610a488484612dac90919063ffffffff16565b612e3290919063ffffffff16565b92505b5050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610cf66103e8610ce86019600460000154612dac90919063ffffffff16565b612e3290919063ffffffff16565b831115610d6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600a60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ea8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006003811115610eb557fe5b826003811115610ec157fe5b1415610f3157612710811015610f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061419f6024913960400191505060405180910390fd5b806004600101819055506110a8565b60016003811115610f3e57fe5b826003811115610f4a57fe5b1415610fd7576103e8811115610fc8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b806004600301819055506110a7565b60026003811115610fe457fe5b826003811115610ff057fe5b141561107c5761271081111561106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b8060048001819055506110a6565b60038081111561108857fe5b82600381111561109457fe5b14156110a557806004600501819055505b5b5b5b5050565b60006110b6614093565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061113585611633565b9050612710811061121557600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550508473ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b183600001516000604051808381526020018281526020019250505060405180910390a261120c85858460000151612e7c565b925050506113be565b6000611242612710611234848660000151612dac90919063ffffffff16565b612e3290919063ffffffff16565b905060405180608001604052806112668386600001516132d390919063ffffffff16565b81526020016112986112858660400151436132d390919063ffffffff16565b86602001516132d390919063ffffffff16565b81526020014381526020018460600151815250600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050508573ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b182600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808381526020018281526020019250505060405180910390a26113b8868683612e7c565b93505050505b92915050565b600360149054906101000a900460ff1681565b600a8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561154f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140ed6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061163d614093565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905060006116ca8260400151436132d390919063ffffffff16565b9050600082602001519050600081111561170c57611705816116f761271085612dac90919063ffffffff16565b612e3290919063ffffffff16565b9350611711565b600093505b505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806141136022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060046000015414611a1f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f426f6e6473206d75737420626520696e697469616c697a65642066726f6d203081525060200191505060405180910390fd5b6040518060c00160405280888152602001878152602001868152602001858152602001848152602001838152506004600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050806010819055504360118190555050505050505050565b6000611ac2611ab1612d44565b6010546132d390919063ffffffff16565b905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611b21662386f26fc10000611b13611b0e85611b09612c09565b61331d565b6135fe565b612e3290919063ffffffff16565b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000015611c6557611c5e6064611c507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bff57600080fd5b505afa158015611c13573d6000803e3d6000fd5b505050506040513d6020811015611c2957600080fd5b8101908080519060200190929190505050611c42612c09565b612dac90919063ffffffff16565b612e3290919063ffffffff16565b9050611d3b565b611d386064611d2a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611cd357600080fd5b505afa158015611ce7573d6000803e3d6000fd5b505050506040513d6020811015611cfd57600080fd5b810190808051906020019092919050505060ff16600a0a611d1c612c09565b612dac90919063ffffffff16565b612e3290919063ffffffff16565b90505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611de2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611dea61363a565b6004600501546010541115611e67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000611e71611b28565b90506000611e7d613665565b905080851015611ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061417c6023913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631eec5a9a7f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015611f8957600080fd5b505afa158015611f9d573d6000803e3d6000fd5b505050506040513d6020811015611fb357600080fd5b810190808051906020019092919050505090506000611fd182611aed565b90506298968081101561204c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b612054612c70565b8111156120c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b60006120f66127106120e8600480015485612dac90919063ffffffff16565b612e3290919063ffffffff16565b9050600061211f8261211185876132d390919063ffffffff16565b6132d390919063ffffffff16565b905061216e33308c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166136ea909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561221f57600080fd5b505af1158015612233573d6000803e3d6000fd5b505050506040513d602081101561224957600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f0000000000000000000000000000000000000000000000000000000000000000846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561231457600080fd5b505af1158015612328573d6000803e3d6000fd5b505050506040513d602081101561233e57600080fd5b810190808051906020019092919050505050600082146123c4576123c37f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166137ab9092919063ffffffff16565b5b6123d98460105461384d90919063ffffffff16565b601081905550604051806080016040528061243f85600f60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461384d90919063ffffffff16565b8152602001600460010154815260200143815260200187815250600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050856124dc6004600101544361384d90919063ffffffff16565b847f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58d6040518082815260200191505060405180910390a461251c612903565b612524613665565b61252c611b28565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a46125606138d5565b8296505050505050509392505050565b60007f0000000000000000000000000000000000000000000000000000000000000000156126b0576126a9633b9aca0061269b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561264a57600080fd5b505afa15801561265e573d6000803e3d6000fd5b505050506040513d602081101561267457600080fd5b810190808051906020019092919050505061268d612903565b612dac90919063ffffffff16565b612e3290919063ffffffff16565b90506126bb565b6126b8612903565b90505b90565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561276157600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127ba57600080fd5b6128a67f00000000000000000000000000000000000000000000000000000000000000008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561284557600080fd5b505afa158015612859573d6000803e3d6000fd5b505050506040513d602081101561286f57600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff166137ab9092919063ffffffff16565b60019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561296c57600080fd5b505afa158015612980573d6000803e3d6000fd5b505050506040513d602081101561299657600080fd5b810190808051906020019092919050505090506129f2670de0b6b3a76400006129e46129df6129d9633b9aca006129cb611aa4565b612dac90919063ffffffff16565b8561331d565b6135fe565b612e3290919063ffffffff16565b91505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ab9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612af357600080fd5b8015612b5a576001600360146101000a81548160ff02191690831515021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612bb7565b6000600360146101000a81548160ff02191690831515021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60048060000154908060010154908060020154908060030154908060040154908060050154905086565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000612c5562989680612c47633b9aca00612c39612c25612903565b600460000154612dac90919063ffffffff16565b61384d90919063ffffffff16565b612e3290919063ffffffff16565b9050600460020154811015612c6d5760046002015490505b90565b6000612d3f620186a0612d316004600301547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612ce857600080fd5b505afa158015612cfc573d6000803e3d6000fd5b505050506040513d6020811015612d1257600080fd5b8101908080519060200190929190505050612dac90919063ffffffff16565b612e3290919063ffffffff16565b905090565b600080612d5c601154436132d390919063ffffffff16565b9050612d8a600460010154612d7c83601054612dac90919063ffffffff16565b612e3290919063ffffffff16565b9150601054821115612d9c5760105491505b5090565b60115481565b60105481565b600080831415612dbf5760009050612e2c565b6000828402905082848281612dd057fe5b0414612e27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061415b6021913960400191505060405180910390fd5b809150505b92915050565b6000612e7483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a3b565b905092915050565b600082612f55577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f1457600080fd5b505af1158015612f28573d6000803e3d6000fd5b505050506040513d6020811015612f3e57600080fd5b8101908080519060200190929190505050506132c9565b600360149054906101000a900460ff1615613109577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561301d57600080fd5b505af1158015613031573d6000803e3d6000fd5b505050506040513d602081101561304757600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156130ec57600080fd5b505af1158015613100573d6000803e3d6000fd5b505050506132c8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156131bc57600080fd5b505af11580156131d0573d6000803e3d6000fd5b505050506040513d60208110156131e657600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050506040513d60208110156132b557600080fd5b8101908080519060200190929190505050505b5b8190509392505050565b600061331583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b01565b905092915050565b6133256140bb565b6000821161337e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806141356026913960400191505060405180910390fd5b60008314156133bc57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090506135f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff1683116134f557600082607060ff1685901b8161340957fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156134c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150506135f8565b6000613511846e01000000000000000000000000000085613bc1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156135c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161363257fe5b049050919050565b613656613645612d44565b6010546132d390919063ffffffff16565b60108190555043601181905550565b60006136b1629896806136a3633b9aca00613695613681612903565b600460000154612dac90919063ffffffff16565b61384d90919063ffffffff16565b612e3290919063ffffffff16565b90506004600201548110156136cd5760046002015490506136e7565b6000600460020154146136e65760006004600201819055505b5b90565b6137a5846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c83565b50505050565b6138488363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c83565b505050565b6000808284019050838110156138cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006138f4600a60030154600a6004015461384d90919063ffffffff16565b90506000600a600101541415801561390c5750804310155b15613a385760006004600001549050600a60000160009054906101000a900460ff161561397b57613950600a6001015460046000015461384d90919063ffffffff16565b600460000181905550600a6002015460046000015410613976576000600a600101819055505b6139bf565b613998600a600101546004600001546132d390919063ffffffff16565b600460000181905550600a60020154600460000154116139be576000600a600101819055505b5b43600a600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600460000154600a60010154600a60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290613ae7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613aac578082015181840152602081019050613a91565b50505050905090810190601f168015613ad95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613af357fe5b049050809150509392505050565b6000838311158290613bae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b73578082015181840152602081019050613b58565b50505050905090810190601f168015613ba05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000613bd08686613d72565b9150915060008480613bde57fe5b868809905082811115613bf2576001820391505b8083039250848210613c6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b613c77838387613dc5565b93505050509392505050565b6060613ce5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613e629092919063ffffffff16565b9050600081511115613d6d57808060200190516020811015613d0657600080fd5b8101908080519060200190929190505050613d6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806141c3602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80613d9f57fe5b84860990508385029250828103915082811015613dbd576001820391505b509250929050565b6000808260000383169050808381613dd957fe5b049250808581613de557fe5b0494506001818260000381613df657fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060613e718484600085613e7a565b90509392505050565b6060613e8585614080565b613ef7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613f475780518252602082019150602081019050602083039250613f24565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613fa9576040519150601f19603f3d011682016040523d82523d6000602084013e613fae565b606091505b50915091508115613fc3578092505050614078565b600081511115613fd65780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561403d578082015181840152602081019050614022565b50505050905090810190601f16801561406a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122050af99a4d75bfbac53caf440eee6de90a50bdad5ae39ff4ab16733d386d9e96564736f6c63430007050033000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899000000000000000000000000fdf12d1f85b5082877a6e070524f50f6c84faa6b00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b000000000000000000000000caaa6a2d4b26067a391e7b7d65c16bb2d5fa571a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c80637927ebf811610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b1461090f578063e0176de81461092d578063e392a2621461094b578063f5c2ab5b14610969578063fc7b9c181461098757610211565b8063cea55f5714610840578063d4d863ce1461085e578063d5025625146108ae578063d7969060146108ef57610211565b806398fabd3a116100f457806398fabd3a146106dd578063a6c41fec14610711578063b4abccba14610745578063c5332b7c1461079f578063cd1234b3146107d357610211565b80637927ebf8146105f3578063844b5c7c146106355780638dbdbe6d14610653578063904b3ece146106bf57610211565b8063451ee4a1116101a85780635a96ac0a116101775780635a96ac0a146104f957806361d027b3146105035780637153500814610537578063759076e5146105a157806377b81895146105bf57610211565b8063451ee4a1146103ed57806346f68ee9146104295780634cf088d91461046d578063507930ec146104a157610211565b80631a3d0068116101e45780631a3d0068146102e05780631e321a0f1461032e5780631feed31f146103695780632f3f470a146103cd57610211565b8063016a42841461021657806301b88ee81461024a5780630505c8c9146102a2578063089208d8146102d6575b600080fd5b61021e6109a5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61028c6004803603602081101561026057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109c9565b6040518082815260200191505060405180910390f35b6102aa610a60565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102de610a89565b005b61032c600480360360808110156102f657600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610c08565b005b6103676004803603604081101561034457600080fd5b81019080803560ff16906020019092919080359060200190929190505050610de7565b005b6103b76004803603604081101561037f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506110ac565b6040518082815260200191505060405180910390f35b6103d56113c4565b60405180821515815260200191505060405180910390f35b6103f56113d7565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b61046b6004803603602081101561043f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611408565b005b61047561160d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104e3600480360360208110156104b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611633565b6040518082815260200191505060405180910390f35b610501611719565b005b61050b6118bf565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61059f600480360360e081101561054d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291905050506118e3565b005b6105a9611aa4565b6040518082815260200191505060405180910390f35b6105c7611ac7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61061f6004803603602081101561060957600080fd5b8101908080359060200190929190505050611aed565b6040518082815260200191505060405180910390f35b61063d611b28565b6040518082815260200191505060405180910390f35b6106a96004803603606081101561066957600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d3e565b6040518082815260200191505060405180910390f35b6106c7612570565b6040518082815260200191505060405180910390f35b6106e56126be565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107196126e2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107876004803603602081101561075b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612706565b60405180821515815260200191505060405180910390f35b6107a76128af565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610815600480360360208110156107e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128d3565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610848612903565b6040518082815260200191505060405180910390f35b6108ac6004803603604081101561087457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506129f8565b005b6108b6612bbb565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b6108f7612be5565b60405180821515815260200191505060405180910390f35b610917612c09565b6040518082815260200191505060405180910390f35b610935612c70565b6040518082815260200191505060405180910390f35b610953612d44565b6040518082815260200191505060405180910390f35b610971612da0565b6040518082815260200191505060405180910390f35b61098f612da6565b6040518082815260200191505060405180910390f35b7f000000000000000000000000fdf12d1f85b5082877a6e070524f50f6c84faa6b81565b6000806109d583611633565b90506000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506127108210610a2f57809250610a59565b610a56612710610a488484612dac90919063ffffffff16565b612e3290919063ffffffff16565b92505b5050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610cf66103e8610ce86019600460000154612dac90919063ffffffff16565b612e3290919063ffffffff16565b831115610d6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600a60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ea8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006003811115610eb557fe5b826003811115610ec157fe5b1415610f3157612710811015610f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061419f6024913960400191505060405180910390fd5b806004600101819055506110a8565b60016003811115610f3e57fe5b826003811115610f4a57fe5b1415610fd7576103e8811115610fc8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b806004600301819055506110a7565b60026003811115610fe457fe5b826003811115610ff057fe5b141561107c5761271081111561106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b8060048001819055506110a6565b60038081111561108857fe5b82600381111561109457fe5b14156110a557806004600501819055505b5b5b5b5050565b60006110b6614093565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061113585611633565b9050612710811061121557600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550508473ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b183600001516000604051808381526020018281526020019250505060405180910390a261120c85858460000151612e7c565b925050506113be565b6000611242612710611234848660000151612dac90919063ffffffff16565b612e3290919063ffffffff16565b905060405180608001604052806112668386600001516132d390919063ffffffff16565b81526020016112986112858660400151436132d390919063ffffffff16565b86602001516132d390919063ffffffff16565b81526020014381526020018460600151815250600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050508573ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b182600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808381526020018281526020019250505060405180910390a26113b8868683612e7c565b93505050505b92915050565b600360149054906101000a900460ff1681565b600a8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561154f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140ed6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061163d614093565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905060006116ca8260400151436132d390919063ffffffff16565b9050600082602001519050600081111561170c57611705816116f761271085612dac90919063ffffffff16565b612e3290919063ffffffff16565b9350611711565b600093505b505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806141136022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e881565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060046000015414611a1f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f426f6e6473206d75737420626520696e697469616c697a65642066726f6d203081525060200191505060405180910390fd5b6040518060c00160405280888152602001878152602001868152602001858152602001848152602001838152506004600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050806010819055504360118190555050505050505050565b6000611ac2611ab1612d44565b6010546132d390919063ffffffff16565b905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611b21662386f26fc10000611b13611b0e85611b09612c09565b61331d565b6135fe565b612e3290919063ffffffff16565b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000115611c6557611c5e6064611c507f000000000000000000000000caaa6a2d4b26067a391e7b7d65c16bb2d5fa571a73ffffffffffffffffffffffffffffffffffffffff166332da80a37f000000000000000000000000fdf12d1f85b5082877a6e070524f50f6c84faa6b6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bff57600080fd5b505afa158015611c13573d6000803e3d6000fd5b505050506040513d6020811015611c2957600080fd5b8101908080519060200190929190505050611c42612c09565b612dac90919063ffffffff16565b612e3290919063ffffffff16565b9050611d3b565b611d386064611d2a7f000000000000000000000000fdf12d1f85b5082877a6e070524f50f6c84faa6b73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611cd357600080fd5b505afa158015611ce7573d6000803e3d6000fd5b505050506040513d6020811015611cfd57600080fd5b810190808051906020019092919050505060ff16600a0a611d1c612c09565b612dac90919063ffffffff16565b612e3290919063ffffffff16565b90505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611de2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611dea61363a565b6004600501546010541115611e67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000611e71611b28565b90506000611e7d613665565b905080851015611ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061417c6023913960400191505060405180910390fd5b60007f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e873ffffffffffffffffffffffffffffffffffffffff16631eec5a9a7f000000000000000000000000fdf12d1f85b5082877a6e070524f50f6c84faa6b896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015611f8957600080fd5b505afa158015611f9d573d6000803e3d6000fd5b505050506040513d6020811015611fb357600080fd5b810190808051906020019092919050505090506000611fd182611aed565b90506298968081101561204c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b612054612c70565b8111156120c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b60006120f66127106120e8600480015485612dac90919063ffffffff16565b612e3290919063ffffffff16565b9050600061211f8261211185876132d390919063ffffffff16565b6132d390919063ffffffff16565b905061216e33308c7f000000000000000000000000fdf12d1f85b5082877a6e070524f50f6c84faa6b73ffffffffffffffffffffffffffffffffffffffff166136ea909392919063ffffffff16565b7f000000000000000000000000fdf12d1f85b5082877a6e070524f50f6c84faa6b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e88c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561221f57600080fd5b505af1158015612233573d6000803e3d6000fd5b505050506040513d602081101561224957600080fd5b8101908080519060200190929190505050507f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e873ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f000000000000000000000000fdf12d1f85b5082877a6e070524f50f6c84faa6b846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561231457600080fd5b505af1158015612328573d6000803e3d6000fd5b505050506040513d602081101561233e57600080fd5b810190808051906020019092919050505050600082146123c4576123c37f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b837f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166137ab9092919063ffffffff16565b5b6123d98460105461384d90919063ffffffff16565b601081905550604051806080016040528061243f85600f60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461384d90919063ffffffff16565b8152602001600460010154815260200143815260200187815250600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050856124dc6004600101544361384d90919063ffffffff16565b847f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58d6040518082815260200191505060405180910390a461251c612903565b612524613665565b61252c611b28565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a46125606138d5565b8296505050505050509392505050565b60007f0000000000000000000000000000000000000000000000000000000000000001156126b0576126a9633b9aca0061269b7f000000000000000000000000caaa6a2d4b26067a391e7b7d65c16bb2d5fa571a73ffffffffffffffffffffffffffffffffffffffff166332da80a37f000000000000000000000000fdf12d1f85b5082877a6e070524f50f6c84faa6b6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561264a57600080fd5b505afa15801561265e573d6000803e3d6000fd5b505050506040513d602081101561267457600080fd5b810190808051906020019092919050505061268d612903565b612dac90919063ffffffff16565b612e3290919063ffffffff16565b90506126bb565b6126b8612903565b90505b90565b7f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b81565b7f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89981565b60007f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561276157600080fd5b7f000000000000000000000000fdf12d1f85b5082877a6e070524f50f6c84faa6b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127ba57600080fd5b6128a67f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561284557600080fd5b505afa158015612859573d6000803e3d6000fd5b505050506040513d602081101561286f57600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff166137ab9092919063ffffffff16565b60019050919050565b7f000000000000000000000000caaa6a2d4b26067a391e7b7d65c16bb2d5fa571a81565b600f6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000807f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561296c57600080fd5b505afa158015612980573d6000803e3d6000fd5b505050506040513d602081101561299657600080fd5b810190808051906020019092919050505090506129f2670de0b6b3a76400006129e46129df6129d9633b9aca006129cb611aa4565b612dac90919063ffffffff16565b8561331d565b6135fe565b612e3290919063ffffffff16565b91505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ab9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612af357600080fd5b8015612b5a576001600360146101000a81548160ff02191690831515021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612bb7565b6000600360146101000a81548160ff02191690831515021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60048060000154908060010154908060020154908060030154908060040154908060050154905086565b7f000000000000000000000000000000000000000000000000000000000000000181565b6000612c5562989680612c47633b9aca00612c39612c25612903565b600460000154612dac90919063ffffffff16565b61384d90919063ffffffff16565b612e3290919063ffffffff16565b9050600460020154811015612c6d5760046002015490505b90565b6000612d3f620186a0612d316004600301547f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612ce857600080fd5b505afa158015612cfc573d6000803e3d6000fd5b505050506040513d6020811015612d1257600080fd5b8101908080519060200190929190505050612dac90919063ffffffff16565b612e3290919063ffffffff16565b905090565b600080612d5c601154436132d390919063ffffffff16565b9050612d8a600460010154612d7c83601054612dac90919063ffffffff16565b612e3290919063ffffffff16565b9150601054821115612d9c5760105491505b5090565b60115481565b60105481565b600080831415612dbf5760009050612e2c565b6000828402905082848281612dd057fe5b0414612e27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061415b6021913960400191505060405180910390fd5b809150505b92915050565b6000612e7483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a3b565b905092915050565b600082612f55577f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f1457600080fd5b505af1158015612f28573d6000803e3d6000fd5b505050506040513d6020811015612f3e57600080fd5b8101908080519060200190929190505050506132c9565b600360149054906101000a900460ff1615613109577f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561301d57600080fd5b505af1158015613031573d6000803e3d6000fd5b505050506040513d602081101561304757600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156130ec57600080fd5b505af1158015613100573d6000803e3d6000fd5b505050506132c8565b7f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156131bc57600080fd5b505af11580156131d0573d6000803e3d6000fd5b505050506040513d60208110156131e657600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050506040513d60208110156132b557600080fd5b8101908080519060200190929190505050505b5b8190509392505050565b600061331583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b01565b905092915050565b6133256140bb565b6000821161337e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806141356026913960400191505060405180910390fd5b60008314156133bc57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090506135f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff1683116134f557600082607060ff1685901b8161340957fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156134c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150506135f8565b6000613511846e01000000000000000000000000000085613bc1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156135c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161363257fe5b049050919050565b613656613645612d44565b6010546132d390919063ffffffff16565b60108190555043601181905550565b60006136b1629896806136a3633b9aca00613695613681612903565b600460000154612dac90919063ffffffff16565b61384d90919063ffffffff16565b612e3290919063ffffffff16565b90506004600201548110156136cd5760046002015490506136e7565b6000600460020154146136e65760006004600201819055505b5b90565b6137a5846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c83565b50505050565b6138488363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c83565b505050565b6000808284019050838110156138cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006138f4600a60030154600a6004015461384d90919063ffffffff16565b90506000600a600101541415801561390c5750804310155b15613a385760006004600001549050600a60000160009054906101000a900460ff161561397b57613950600a6001015460046000015461384d90919063ffffffff16565b600460000181905550600a6002015460046000015410613976576000600a600101819055505b6139bf565b613998600a600101546004600001546132d390919063ffffffff16565b600460000181905550600a60020154600460000154116139be576000600a600101819055505b5b43600a600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600460000154600a60010154600a60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290613ae7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613aac578082015181840152602081019050613a91565b50505050905090810190601f168015613ad95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613af357fe5b049050809150509392505050565b6000838311158290613bae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b73578082015181840152602081019050613b58565b50505050905090810190601f168015613ba05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000613bd08686613d72565b9150915060008480613bde57fe5b868809905082811115613bf2576001820391505b8083039250848210613c6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b613c77838387613dc5565b93505050509392505050565b6060613ce5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613e629092919063ffffffff16565b9050600081511115613d6d57808060200190516020811015613d0657600080fd5b8101908080519060200190929190505050613d6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806141c3602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80613d9f57fe5b84860990508385029250828103915082811015613dbd576001820391505b509250929050565b6000808260000383169050808381613dd957fe5b049250808581613de557fe5b0494506001818260000381613df657fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060613e718484600085613e7a565b90509392505050565b6060613e8585614080565b613ef7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613f475780518252602082019150602081019050602083039250613f24565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613fa9576040519150601f19603f3d011682016040523d82523d6000602084013e613fae565b606091505b50915091508115613fc3578092505050614078565b600081511115613fd65780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561403d578082015181840152602081019050614022565b50505050905090810190601f16801561406a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122050af99a4d75bfbac53caf440eee6de90a50bdad5ae39ff4ab16733d386d9e96564736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899000000000000000000000000fdf12d1f85b5082877a6e070524f50f6c84faa6b00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b000000000000000000000000caaa6a2d4b26067a391e7b7d65c16bb2d5fa571a
-----Decoded View---------------
Arg [0] : _OHM (address): 0x383518188C0C6d7730D91b2c03a03C837814a899
Arg [1] : _principle (address): 0xfDf12D1F85b5082877A6E070524f50F6c84FAa6b
Arg [2] : _treasury (address): 0x31F8Cc382c9898b273eff4e0b7626a6987C846E8
Arg [3] : _DAO (address): 0x245cc372C84B3645Bf0Ffe6538620B04a217988B
Arg [4] : _bondCalculator (address): 0xcaaA6a2d4B26067a391E7B7D65C16bb2d5FA571A
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899
Arg [1] : 000000000000000000000000fdf12d1f85b5082877a6e070524f50f6c84faa6b
Arg [2] : 00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8
Arg [3] : 000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b
Arg [4] : 000000000000000000000000caaa6a2d4b26067a391e7b7d65c16bb2d5fa571a
Deployed Bytecode Sourcemap
21328:17257:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22043:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37730:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;725:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;950:158;;;:::i;:::-;;26870:466;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25960:714;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30416:1206;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22573:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22658:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1116:260;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22442:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37131:427;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1388:221;;;:::i;:::-;;22113:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25045:669;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36474:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22495:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34150:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35254:331;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28016:2249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36100:275;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22190:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21973;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38314:268;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22361:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22724:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35709:270;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27469:318;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22603:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22262:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34416:261;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33881:140;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36682:286;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22899:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22817;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22043:34;;;:::o;37730:400::-;37802:19;37835:18;37856:30;37874:10;37856:16;:30::i;:::-;37835:51;;37897:11;37911:8;:22;37921:10;37911:22;;;;;;;;;;;;;;;:29;;;37897:43;;37975:5;37958:13;:22;37953:170;;38015:6;37998:23;;37953:170;;;38071:40;38104:5;38071:27;38083:13;38071:6;:10;;:27;;;;:::i;:::-;:31;;:40;;;;:::i;:::-;38054:57;;37953:170;37730:400;;;;;:::o;725:89::-;773:7;800:6;;;;;;;;;;;793:13;;725:89;:::o;950:158::-;874:10;864:20;;:6;;;;;;;;;;:20;;;855:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1066:1:::1;1033:37;;1050:6;::::0;::::1;;;;;;;;1033:37;;;;;;;;;;;;1098:1;1081:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;950:158::o:0;26870:466::-;874:10;864:20;;:6;;;;;;;;;;:20;;;855:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27057:43:::1;27094:4;27057:31;27084:2;27057:5;:21;;;:25;;:31;;;;:::i;:::-;:35;;:43;;;;:::i;:::-;27043:10;:57;;27034:91;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27151:177;;;;;;;;27178:9;27151:177;;;;;;27208:10;27151:177;;;;27241:7;27151:177;;;;27271:7;27151:177;;;;27304:12;27151:177;;::::0;27138:10:::1;:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26870:466:::0;;;;:::o;25960:714::-;874:10;864:20;;:6;;;;;;;;;;:20;;;855:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26072:17:::1;26058:31;;;;;;;;:10;:31;;;;;;;;;26053:614;;;26131:5;26121:6;:15;;26112:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26213:6;26193:5;:17;;:26;;;;26053:614;;;26256:16;26242:30;;;;;;;;:10;:30;;;;;;;;;26237:430;;;26314:4;26304:6;:14;;26295:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26389:6;26371:5;:15;;:24;;;;26237:430;;;26432:13;26418:27;;;;;;;;:10;:27;;;;;;;;;26413:254;;;26487:5;26477:6;:15;;26468:58;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26553:6;26541:5;:9:::0;::::1;:18;;;;26413:254;;;26596:14;26582:28:::0;::::1;;;;;;;:10;:28;;;;;;;;;26577:90;;;26649:6;26633:5;:13;;:22;;;;26577:90;26413:254;26237:430;26053:614;25960:714:::0;;:::o;30416:1206::-;30486:4;30512:16;;:::i;:::-;30531:8;:22;30541:10;30531:22;;;;;;;;;;;;;;;30512:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30564:18;30585:30;30603:10;30585:16;:30::i;:::-;30564:51;;30710:5;30693:13;:22;30688:927;;30759:8;:22;30769:10;30759:22;;;;;;;;;;;;;;;;30752:29;;;;;;;;;;;;;;;;;;;;;;;;;;30835:10;30821:42;;;30847:4;:11;;;30860:1;30821:42;;;;;;;;;;;;;;;;;;;;;;;;30903:46;30916:10;30928:6;30936:4;:11;;;30903;:46::i;:::-;30896:53;;;;;;30688:927;31068:11;31082:45;31120:5;31082:32;31099:13;31082:4;:11;;;:15;;:32;;;;:::i;:::-;:36;;:45;;;;:::i;:::-;31068:59;;31212:241;;;;;;;;31244:25;31261:6;31244:4;:11;;;:15;;:25;;;;:::i;:::-;31212:241;;;;31297:54;31315:34;31333:4;:14;;;31315:12;:16;;:34;;;;:::i;:::-;31297:4;:12;;;:16;;:54;;;;:::i;:::-;31212:241;;;;31381:12;31212:241;;;;31423:4;:14;;;31212:241;;;31187:8;:22;31197:10;31187:22;;;;;;;;;;;;;;;:266;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31489:10;31475:65;;;31501:6;31509:8;:22;31519:10;31509:22;;;;;;;;;;;;;;;:29;;;31475:65;;;;;;;;;;;;;;;;;;;;;;;;31562:41;31575:10;31587:6;31595;31562:11;:41::i;:::-;31555:48;;;;;30416:1206;;;;;:::o;22573:21::-;;;;;;;;;;;;;:::o;22658:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1116:260::-;874:10;864:20;;:6;;;;;;;;;;:20;;;855:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1239:1:::1;1218:23;;:9;:23;;;;1209:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1325:9;1300:36;;1317:6;::::0;::::1;;;;;;;;1300:36;;;;;;;;;;;;1359:9;1347;;:21;;;;;;;;;;;;;;;;;;1116:260:::0;:::o;22442:22::-;;;;;;;;;;;;;:::o;37131:427::-;37201:19;37234:16;;:::i;:::-;37253:8;:22;37263:10;37253:22;;;;;;;;;;;;;;;37234:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37286:20;37309:34;37327:4;:14;;;37309:12;:16;;:34;;;;:::i;:::-;37286:57;;37354:12;37369:4;:12;;;37354:27;;37409:1;37399:7;:11;37394:157;;;37445:43;37479:7;37445:28;37466:5;37445:15;:19;;:28;;;;:::i;:::-;:32;;:43;;;;:::i;:::-;37428:60;;37394:157;;;37538:1;37521:18;;37394:157;37131:427;;;;;;:::o;1388:221::-;1472:9;;;;;;;;;;;1458:23;;:10;:23;;;1449:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1561:9;;;;;;;;;;;1536:36;;1553:6;;;;;;;;;;1536:36;;;;;;;;;;;;1592:9;;;;;;;;;;;1583:6;;:18;;;;;;;;;;;;;;;;;;1388:221::o;22113:33::-;;;:::o;25045:669::-;874:10;864:20;;:6;;;;;;;;;;:20;;;855:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25337:1:::1;25312:5;:21;;;:26;25303:73;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;25395:241;;;;;;;;25434:16;25395:241;;;;25478:12;25395:241;;;;25519:13;25395:241;;;;25558:10;25395:241;;;;25588:4;25395:241;;;;25616:8;25395:241;;::::0;25387:5:::1;:249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25659:12;25647:9;:24;;;;25694:12;25682:9;:24;;;;25045:669:::0;;;;;;;:::o;36474:106::-;36519:4;36544:28;36559:11;:9;:11::i;:::-;36544:9;;:13;;:28;;;;:::i;:::-;36537:35;;36474:106;:::o;22495:28::-;;;;;;;;;;;;;:::o;34150:161::-;34206:4;34231:72;34297:4;34231:60;:42;34252:6;34260:11;:9;:11::i;:::-;34231:19;:42::i;:::-;:58;:60::i;:::-;:64;;:72;;;;:::i;:::-;34224:79;;34150:161;;;:::o;35254:331::-;35302:11;35331:15;35327:251;;;35373:85;35453:3;35373:74;35407:14;35390:42;;;35434:9;35390:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35373:11;:9;:11::i;:::-;:15;;:74;;;;:::i;:::-;:78;;:85;;;;:::i;:::-;35364:94;;35327:251;;;35500:66;35561:3;35500:55;35531:9;35523:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35517:36;;:2;:36;35500:11;:9;:11::i;:::-;:15;;:55;;;;:::i;:::-;:59;;:66;;;;:::i;:::-;35491:75;;35327:251;35254:331;:::o;28016:2249::-;28138:4;28187:1;28165:24;;:10;:24;;;;28156:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28223:11;:9;:11::i;:::-;28267:5;:13;;;28254:9;;:26;;28245:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28327:15;28345:16;:14;:16::i;:::-;28327:34;;28395:16;28414:12;:10;:12::i;:::-;28395:31;;28461:11;28448:9;:24;;28439:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28549:10;28573:8;28562:29;;;28593:9;28604:7;28562:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28549:64;;28624:11;28638:18;28649:5;28638:9;:18::i;:::-;28624:32;;28720:8;28710:6;:18;;28701:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28825:11;:9;:11::i;:::-;28815:6;:21;;28806:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28951:8;28962:36;28991:5;28962:23;28974:5;:9;;;28962:6;:10;;:23;;;;:::i;:::-;:27;;:36;;;;:::i;:::-;28951:47;;29009:11;29023:30;29048:3;29023:19;29034:6;29023:5;:9;;:19;;;;:::i;:::-;:23;;:30;;;;:::i;:::-;29009:44;;29234:74;29272:10;29292:4;29299:7;29242:9;29234:36;;;;:74;;;;;;:::i;:::-;29327:9;29319:27;;;29357:8;29369:7;29319:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29400:8;29389:29;;;29420:7;29429:9;29440:6;29389:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29481:1;29474:3;:8;29469:112;;29530:38;29558:3;29563;29538;29530:26;;;;:38;;;;;:::i;:::-;29469:112;29649:22;29664:5;29649:9;;:13;;:22;;;;:::i;:::-;29637:9;:34;;;;29763:199;;;;;;;;29792:43;29827:6;29792:8;:22;29802:10;29792:22;;;;;;;;;;;;;;;:29;;;:33;;:43;;;;:::i;:::-;29763:199;;;;29859:5;:17;;;29763:199;;;;29902:12;29763:199;;;;29940:10;29763:199;;;29738:8;:22;29748:10;29738:22;;;;;;;;;;;;;;;:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30088:10;30049:37;30067:5;:17;;;30049:12;:16;;:37;;;;:::i;:::-;30041:6;30019:81;30032:7;30019:81;;;;;;;;;;;;;;;;;;30166:11;:9;:11::i;:::-;30152:12;:10;:12::i;:::-;30134:16;:14;:16::i;:::-;30116:63;;;;;;;;;;30192:8;:6;:8::i;:::-;30250:6;30243:13;;;;;;;;28016:2249;;;;;:::o;36100:275::-;36157:4;36180:15;36175:193;;;36220:85;36300:3;36220:74;36254:14;36237:42;;;36281:9;36237:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36220:11;:9;:11::i;:::-;:15;;:74;;;;:::i;:::-;:78;;:85;;;;:::i;:::-;36213:92;;;;36175:193;36345:11;:9;:11::i;:::-;36338:18;;36100:275;;:::o;22190:28::-;;;:::o;21973:::-;;;:::o;38314:268::-;38377:4;38414:3;38404:13;;:6;:13;;;;38395:24;;;;;;38449:9;38439:19;;:6;:19;;;;38430:30;;;;;;38471:81;38502:3;38515:6;38507:26;;;38543:4;38507:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38479:6;38471:29;;;;:81;;;;;:::i;:::-;38570:4;38563:11;;38314:268;;;:::o;22361:39::-;;;:::o;22724:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35709:270::-;35752:15;35784:11;35806:3;35798:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35784:41;;35849:122;35965:4;35849:110;:92;35884:24;35903:3;35884:13;:11;:13::i;:::-;:17;;:24;;;;:::i;:::-;35924:6;35849:19;:92::i;:::-;:108;:110::i;:::-;:114;;:122;;;;:::i;:::-;35836:135;;35709:270;;:::o;27469:318::-;874:10;864:20;;:6;;;;;;;;;;:20;;;855:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27585:1:::1;27565:22;;:8;:22;;;;27556:33;;;::::0;::::1;;27605:7;27600:180;;;27642:4;27630:9;;:16;;;;;;;;;;;;;;;;;;27677:8;27661:13;;:24;;;;;;;;;;;;;;;;;;27600:180;;;27730:5;27718:9;;:17;;;;;;;;;;;;;;;;;;27760:8;27750:7;;:18;;;;;;;;;;;;;;;;;;27600:180;27469:318:::0;;:::o;22603:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22262:37::-;;;:::o;34416:261::-;34459:11;34501:69;34565:3;34501:58;34547:10;34501:40;34528:11;:9;:11::i;:::-;34501:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;:62;;:69;;;;:::i;:::-;34492:78;;34595:5;:18;;;34586:6;:27;34581:89;;;34640:5;:18;;;34631:27;;34581:89;34416:261;:::o;33881:140::-;33924:4;33949:64;34005:6;33949:50;33982:5;:15;;;33957:3;33949:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;:50;;;;:::i;:::-;:54;;:64;;;;:::i;:::-;33942:71;;33881:140;:::o;36682:286::-;36725:11;36750:20;36773:29;36791:9;;36773:12;:16;;:29;;;;:::i;:::-;36750:52;;36822:57;36860:5;:17;;;36822:32;36837:15;36822:9;;:13;;:32;;;;:::i;:::-;:36;;:57;;;;:::i;:::-;36813:66;;36904:9;;36895:6;:18;36890:71;;;36940:9;;36931:18;;36890:71;36682:286;;:::o;22899:21::-;;;;:::o;22817:::-;;;;:::o;2175:250::-;2233:7;2262:1;2257;:6;2253:47;;;2287:1;2280:8;;;;2253:47;2312:9;2328:1;2324;:5;2312:17;;2357:1;2352;2348;:5;;;;;;:10;2340:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2416:1;2409:8;;;2175:250;;;;;:::o;2433:132::-;2491:7;2518:39;2522:1;2525;2518:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2511:46;;2433:132;;;;:::o;31852:690::-;31941:4;31965:6;31959:551;;32031:3;32023:22;;;32047:10;32059:7;32023:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31959:551;;;32147:9;;;;;;;;;;;32142:357;;;32216:3;32208:21;;;32231:13;;;;;;;;;;;32246:7;32208:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32290:13;;;;;;;;;;;32274:37;;;32313:7;32322:10;32274:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32142:357;;;32383:3;32375:21;;;32398:7;;;;;;;;;;;32407;32375:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32445:7;;;;;;;;;;;32435:25;;;32462:7;32471:10;32435:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32142:357;31959:551;32527:7;32520:14;;31852:690;;;;;:::o;1831:136::-;1889:7;1916:43;1920:1;1923;1916:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1909:50;;1831:136;;;;:::o;19988:719::-;20069:16;;:::i;:::-;20120:1;20106:11;:15;20098:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20192:1;20179:9;:14;20175:50;;;20202:23;;;;;;;;20223:1;20202:23;;;;;20195:30;;;;20175:50;20263:2;20242:24;;:9;:24;20238:462;;20283:14;20328:11;19414:3;20301:23;;:9;:23;;20300:39;;;;;;20283:56;;20380:2;20362:21;;:6;:21;;20354:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20440:26;;;;;;;;20458:6;20440:26;;;;;20433:33;;;;;20238:462;20499:14;20516:45;20532:9;19456:31;20549:11;20516:15;:45::i;:::-;20499:62;;20602:2;20584:21;;:6;:21;;20576:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20662:26;;;;;;;;20680:6;20662:26;;;;;20655:33;;;19988:719;;;;;:::o;19843:137::-;19914:4;19956:16;19945:4;:7;;;19940:13;;:32;;;;;;19933:39;;19843:137;;;:::o;33612:124::-;33665:28;33680:11;:9;:11::i;:::-;33665:9;;:13;;:28;;;;:::i;:::-;33653:9;:40;;;;33716:12;33704:9;:24;;;;33612:124::o;34804:345::-;34845:11;34879:69;34943:3;34879:58;34925:10;34879:40;34906:11;:9;:11::i;:::-;34879:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;:62;;:69;;;;:::i;:::-;34870:78;;34973:5;:18;;;34964:6;:27;34959:183;;;35018:5;:18;;;35009:27;;34959:183;;;35089:1;35067:5;:18;;;:23;35062:80;;35129:1;35108:5;:18;;:22;;;;35062:80;34959:183;34804:345;:::o;16525:205::-;16626:96;16646:5;16676:27;;;16705:4;16711:2;16715:5;16653:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16626:19;:96::i;:::-;16525:205;;;;:::o;16340:177::-;16423:86;16443:5;16473:23;;;16498:2;16502:5;16450:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16423:19;:86::i;:::-;16340:177;;;:::o;1642:181::-;1700:7;1720:9;1736:1;1732;:5;1720:17;;1761:1;1756;:6;;1748:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1814:1;1807:8;;;1642:181;;;;:::o;32634:917::-;32672:19;32694:45;32720:10;:17;;;32694:10;:20;;;:24;;:45;;;;:::i;:::-;32672:67;;32773:1;32754:10;:15;;;:20;;:54;;;;;32794:14;32778:12;:30;;32754:54;32750:794;;;32826:12;32841:5;:21;;;32826:36;;32882:10;:14;;;;;;;;;;;;32877:494;;;32942:44;32969:10;:15;;;32942:5;:21;;;:25;;:44;;;;:::i;:::-;32918:5;:21;;:68;;;;33035:10;:17;;;33010:5;:21;;;:42;33005:112;;33096:1;33078:10;:15;;:19;;;;33005:112;32877:494;;;33181:44;33208:10;:15;;;33181:5;:21;;;:25;;:44;;;;:::i;:::-;33157:5;:21;;:68;;;;33274:10;:17;;;33249:5;:21;;;:42;33244:112;;33335:1;33317:10;:15;;:19;;;;33244:112;32877:494;33408:12;33385:10;:20;;:35;;;;33440:92;33467:7;33476:5;:21;;;33499:10;:15;;;33516:10;:14;;;;;;;;;;;;33440:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32750:794;;32634:917;:::o;2573:189::-;2659:7;2691:1;2687;:5;2694:12;2679:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2718:9;2734:1;2730;:5;;;;;;2718:17;;2753:1;2746:8;;;2573:189;;;;;:::o;1975:192::-;2061:7;2094:1;2089;:6;;2097:12;2081:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2121:9;2137:1;2133;:5;2121:17;;2158:1;2151:8;;;1975:192;;;;;:::o;18888:347::-;18994:7;19015:9;19026;19039:13;19047:1;19050;19039:7;:13::i;:::-;19014:38;;;;19063:10;19089:1;19076:15;;;;;19086:1;19083;19076:15;19063:28;;19111:1;19106:2;:6;19102:18;;;19119:1;19114:6;;;;19102:18;19136:2;19131:7;;;;19161:1;19157;:5;19149:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19211:16;19219:1;19222;19225;19211:7;:16::i;:::-;19204:23;;;;;18888:347;;;;;:::o;17729:420::-;17812:23;17838:69;17866:4;17838:69;;;;;;;;;;;;;;;;;17846:5;17838:27;;;;:69;;;;;:::i;:::-;17812:95;;17942:1;17922:10;:17;:21;17918:224;;;18064:10;18053:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18045:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17918:224;17729:420;;;:::o;18180:210::-;18241:9;18252;18274:10;18308:2;18287:25;;;;;18297:1;18294;18287:25;18274:38;;18331:1;18327;:5;18323:9;;18352:1;18347:2;:6;18343:10;;18373:1;18368:2;:6;18364:18;;;18381:1;18376:6;;;;18364:18;18180:210;;;;;;:::o;18398:482::-;18504:7;18524:12;18544:1;18543:2;;18539:1;:6;18524:21;;18561:4;18556:9;;;;;;;;;18581:4;18576:9;;;;;;;;;18623:1;18616:4;18608;18607:5;;18606:14;;;;;;:18;18601:1;:24;18596:29;;;;18636:9;18648:1;18636:13;;18673:1;18669;:5;18665:1;:9;18660:14;;;;18698:1;18694;:5;18690:1;:9;18685:14;;;;18723:1;18719;:5;18715:1;:9;18710:14;;;;18748:1;18744;:5;18740:1;:9;18735:14;;;;18773:1;18769;:5;18765:1;:9;18760:14;;;;18798:1;18794;:5;18790:1;:9;18785:14;;;;18823:1;18819;:5;18815:1;:9;18810:14;;;;18848:1;18844;:5;18840:1;:9;18835:14;;;;18871:1;18867;:5;18860:12;;;;18398:482;;;;;:::o;4274:196::-;4377:12;4409:53;4432:6;4440:4;4446:1;4449:12;4409:22;:53::i;:::-;4402:60;;4274:196;;;;;:::o;5250:979::-;5380:12;5413:18;5424:6;5413:10;:18::i;:::-;5405:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5539:12;5553:23;5580:6;:11;;5600:8;5611:4;5580:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5538:78;;;;5631:7;5627:595;;;5662:10;5655:17;;;;;;5627:595;5796:1;5776:10;:17;:21;5772:439;;;6039:10;6033:17;6100:15;6087:10;6083:2;6079:19;6072:44;5987:148;6182:12;6175:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5250:979;;;;;;;:::o;3447:233::-;3507:4;3526:12;3637:7;3625:20;3617:28;;3671:1;3664:4;:8;3657:15;;;3447:233;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://50af99a4d75bfbac53caf440eee6de90a50bdad5ae39ff4ab16733d386d9e965
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.