More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 137 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 16130568 | 697 days ago | IN | 0 ETH | 0.00273348 | ||||
Claim | 16130548 | 697 days ago | IN | 0 ETH | 0.02393066 | ||||
Bid Ratio | 12586537 | 1244 days ago | IN | 0 ETH | 0.01921804 | ||||
Claim | 12546443 | 1251 days ago | IN | 0 ETH | 0.01687945 | ||||
Claim | 12542781 | 1251 days ago | IN | 0 ETH | 0.00715344 | ||||
Claim | 12542781 | 1251 days ago | IN | 0 ETH | 0.00715344 | ||||
Claim | 12542781 | 1251 days ago | IN | 0 ETH | 0.00715344 | ||||
Claim | 12538475 | 1252 days ago | IN | 0 ETH | 0.03110401 | ||||
Claim | 12483279 | 1260 days ago | IN | 0 ETH | 0.00959881 | ||||
Claim | 12469593 | 1263 days ago | IN | 0 ETH | 0.01840293 | ||||
Claim | 12469580 | 1263 days ago | IN | 0 ETH | 0.0184062 | ||||
Claim | 12469117 | 1263 days ago | IN | 0 ETH | 0.02952908 | ||||
Bid Ratio | 12451865 | 1265 days ago | IN | 0 ETH | 0.10232274 | ||||
Bid Ratio | 12449940 | 1266 days ago | IN | 0 ETH | 0.24703975 | ||||
Bid Ratio | 12449940 | 1266 days ago | IN | 0 ETH | 0.24669444 | ||||
Bid Ratio | 12449940 | 1266 days ago | IN | 0 ETH | 0.24634913 | ||||
Bid Ratio | 12449940 | 1266 days ago | IN | 0 ETH | 0.24600382 | ||||
Bid Ratio | 12449939 | 1266 days ago | IN | 0 ETH | 0.24565851 | ||||
Bid Ratio | 12449939 | 1266 days ago | IN | 0 ETH | 0.24531321 | ||||
Bid Ratio | 12449939 | 1266 days ago | IN | 0 ETH | 0.2449679 | ||||
Bid Ratio | 12449939 | 1266 days ago | IN | 0 ETH | 0.24462259 | ||||
Bid Ratio | 12449939 | 1266 days ago | IN | 0 ETH | 0.24427728 | ||||
Bid Ratio | 12449939 | 1266 days ago | IN | 0 ETH | 0.20933169 | ||||
Bid Ratio | 12449939 | 1266 days ago | IN | 0 ETH | 0.20903536 | ||||
Bid Ratio | 12449930 | 1266 days ago | IN | 0 ETH | 0.26049251 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12086101 | 1322 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
HGateKeeper
Compiler Version
v0.5.10+commit.5a6ea5b1
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-22 */ // File: contracts/utils/Ownable.sol pragma solidity >=0.4.21 <0.6.0; contract Ownable { address private _contract_owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = msg.sender; _contract_owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _contract_owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_contract_owner == msg.sender, "Ownable: caller is not the owner"); _; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_contract_owner, newOwner); _contract_owner = newOwner; } } // File: contracts/utils/SafeMath.sol pragma solidity >=0.4.21 <0.6.0; library SafeMath { function safeAdd(uint a, uint b) public pure returns (uint c) { c = a + b; require(c >= a, "add"); } function safeSub(uint a, uint b) public pure returns (uint c) { require(b <= a, "sub"); c = a - b; } function safeMul(uint a, uint b) public pure returns (uint c) { c = a * b; require(a == 0 || c / a == b, "mul"); } function safeDiv(uint a, uint b) public pure returns (uint c) { require(b > 0, "div"); c = a / b; } } // File: contracts/utils/Address.sol pragma solidity >=0.4.21 <0.6.0; library Address { function isContract(address account) internal view returns (bool) { bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != 0x0 && codehash != accountHash); } function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: contracts/erc20/IERC20.sol pragma solidity >=0.4.21 <0.6.0; interface IERC20 { 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); } // File: contracts/erc20/SafeERC20.sol pragma solidity >=0.4.21 <0.6.0; 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).safeAdd(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).safeSub(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function callOptionalReturn(IERC20 token, bytes memory data) private { require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "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"); } } } // File: contracts/utils/AddressArray.sol pragma solidity >=0.4.21 <0.6.0; library AddressArray{ function exists(address[] memory self, address addr) public pure returns(bool){ for (uint i = 0; i< self.length;i++){ if (self[i]==addr){ return true; } } return false; } function index_of(address[] memory self, address addr) public pure returns(uint){ for (uint i = 0; i< self.length;i++){ if (self[i]==addr){ return i; } } require(false, "AddressArray:index_of, not exist"); } function remove(address[] storage self, address addr) public returns(bool){ uint index = index_of(self, addr); self[index] = self[self.length - 1]; delete self[self.length-1]; self.length--; return true; } } // File: contracts/erc20/ERC20Impl.sol pragma solidity >=0.4.21 <0.6.0; contract ApproveAndCallFallBack { function receiveApproval( address from, uint256 _amount, address _token, bytes memory _data ) public; } contract TransferEventCallBack{ function onTransfer(address _from, address _to, uint256 _amount) public; } contract ERC20Base { string public name; //The Token's name: e.g. GTToken uint8 public decimals; //Number of decimals of the smallest unit string public symbol; //An identifier: e.g. REP string public version = "GTT_0.1"; //An arbitrary versioning scheme using AddressArray for address[]; address[] public transferListeners; //////////////// // Events //////////////// event Transfer(address indexed _from, address indexed _to, uint256 _amount); event Approval( address indexed _owner, address indexed _spender, uint256 _amount ); event NewTransferListener(address _addr); event RemoveTransferListener(address _addr); /// @dev `Checkpoint` is the structure that attaches a block number to a /// given value, the block number attached is the one that last changed the /// value struct Checkpoint { // `fromBlock` is the block number that the value was generated from uint128 fromBlock; // `value` is the amount of tokens at a specific block number uint128 value; } // `parentToken` is the Token address that was cloned to produce this token; // it will be 0x0 for a token that was not cloned ERC20Base public parentToken; // `parentSnapShotBlock` is the block number from the Parent Token that was // used to determine the initial distribution of the Clone Token uint public parentSnapShotBlock; // `creationBlock` is the block number that the Clone Token was created uint public creationBlock; // `balances` is the map that tracks the balance of each address, in this // contract when the balance changes the block number that the change // occurred is also included in the map mapping (address => Checkpoint[]) balances; // `allowed` tracks any extra transfer rights as in all ERC20 tokens mapping (address => mapping (address => uint256)) allowed; // Tracks the history of the `totalSupply` of the token Checkpoint[] totalSupplyHistory; // Flag that determines if the token is transferable or not. bool public transfersEnabled; //////////////// // Constructor //////////////// /// @notice Constructor to create a ERC20Base /// @param _parentToken Address of the parent token, set to 0x0 if it is a /// new token /// @param _parentSnapShotBlock Block of the parent token that will /// determine the initial distribution of the clone token, set to 0 if it /// is a new token /// @param _tokenName Name of the new token /// @param _decimalUnits Number of decimals of the new token /// @param _tokenSymbol Token Symbol for the new token /// @param _transfersEnabled If true, tokens will be able to be transferred constructor( ERC20Base _parentToken, uint _parentSnapShotBlock, string memory _tokenName, uint8 _decimalUnits, string memory _tokenSymbol, bool _transfersEnabled ) public { name = _tokenName; // Set the name decimals = _decimalUnits; // Set the decimals symbol = _tokenSymbol; // Set the symbol parentToken = _parentToken; parentSnapShotBlock = _parentSnapShotBlock; transfersEnabled = _transfersEnabled; creationBlock = block.number; } /////////////////// // ERC20 Methods /////////////////// /// @notice Send `_amount` tokens to `_to` from `msg.sender` /// @param _to The address of the recipient /// @param _amount The amount of tokens to be transferred /// @return Whether the transfer was successful or not function transfer(address _to, uint256 _amount) public returns (bool success) { require(transfersEnabled); return doTransfer(msg.sender, _to, _amount); } /// @notice Send `_amount` tokens to `_to` from `_from` on the condition it /// is approved by `_from` /// @param _from The address holding the tokens being transferred /// @param _to The address of the recipient /// @param _amount The amount of tokens to be transferred /// @return True if the transfer was successful function transferFrom(address _from, address _to, uint256 _amount) public returns (bool success) { require(transfersEnabled); // The standard ERC 20 transferFrom functionality if (allowed[_from][msg.sender] < _amount) return false; allowed[_from][msg.sender] -= _amount; return doTransfer(_from, _to, _amount); } /// @dev This is the actual transfer function in the token contract, it can /// only be called by other functions in this contract. /// @param _from The address holding the tokens being transferred /// @param _to The address of the recipient /// @param _amount The amount of tokens to be transferred /// @return True if the transfer was successful function doTransfer(address _from, address _to, uint _amount) internal returns(bool) { if (_amount == 0) { return true; } require(parentSnapShotBlock < block.number); // Do not allow transfer to 0x0 or the token contract itself require((_to != address(0)) && (_to != address(this))); // If the amount being transfered is more than the balance of the // account the transfer returns false uint256 previousBalanceFrom = balanceOfAt(_from, block.number); if (previousBalanceFrom < _amount) { return false; } // First update the balance array with the new value for the address // sending the tokens updateValueAtNow(balances[_from], previousBalanceFrom - _amount); // Then update the balance array with the new value for the address // receiving the tokens uint256 previousBalanceTo = balanceOfAt(_to, block.number); require(previousBalanceTo + _amount >= previousBalanceTo); // Check for overflow updateValueAtNow(balances[_to], previousBalanceTo + _amount); // An event to make the transfer easy to find on the blockchain emit Transfer(_from, _to, _amount); return true; } /// @param _owner The address that's balance is being requested /// @return The balance of `_owner` at the current block function balanceOf(address _owner) public view returns (uint256 balance) { return balanceOfAt(_owner, block.number); } /// @notice `msg.sender` approves `_spender` to spend `_amount` tokens on /// its behalf. This is a modified version of the ERC20 approve function /// to be a little bit safer /// @param _spender The address of the account able to transfer the tokens /// @param _amount The amount of tokens to be approved for transfer /// @return True if the approval was successful function approve(address _spender, uint256 _amount) public returns (bool success) { require(transfersEnabled); // To change the approve amount you first have to reduce the addresses` // allowance to zero by calling `approve(_spender,0)` if it is not // already 0 to mitigate the race condition described here: // https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 require((_amount == 0) || (allowed[msg.sender][_spender] == 0)); allowed[msg.sender][_spender] = _amount; emit Approval(msg.sender, _spender, _amount); return true; } /// @dev This function makes it easy to read the `allowed[]` map /// @param _owner The address of the account that owns the token /// @param _spender The address of the account able to transfer the tokens /// @return Amount of remaining tokens of _owner that _spender is allowed /// to spend function allowance(address _owner, address _spender) public view returns (uint256 remaining) { return allowed[_owner][_spender]; } /// @notice `msg.sender` approves `_spender` to send `_amount` tokens on /// its behalf, and then a function is triggered in the contract that is /// being approved, `_spender`. This allows users to use their tokens to /// interact with contracts in one function call instead of two /// @param _spender The address of the contract able to transfer the tokens /// @param _amount The amount of tokens to be approved for transfer /// @return True if the function call was successful function approveAndCall(ApproveAndCallFallBack _spender, uint256 _amount, bytes memory _extraData) public returns (bool success) { require(approve(address(_spender), _amount)); _spender.receiveApproval( msg.sender, _amount, address(this), _extraData ); return true; } /// @dev This function makes it easy to get the total number of tokens /// @return The total number of tokens function totalSupply() public view returns (uint) { return totalSupplyAt(block.number); } //////////////// // Query balance and totalSupply in History //////////////// /// @dev Queries the balance of `_owner` at a specific `_blockNumber` /// @param _owner The address from which the balance will be retrieved /// @param _blockNumber The block number when the balance is queried /// @return The balance at `_blockNumber` function balanceOfAt(address _owner, uint _blockNumber) public view returns (uint) { // These next few lines are used when the balance of the token is // requested before a check point was ever created for this token, it // requires that the `parentToken.balanceOfAt` be queried at the // genesis block for that token as this contains initial balance of // this token if ((balances[_owner].length == 0) || (balances[_owner][0].fromBlock > _blockNumber)) { if (address(parentToken) != address(0)) { return parentToken.balanceOfAt(_owner, min(_blockNumber, parentSnapShotBlock)); } else { // Has no parent return 0; } // This will return the expected balance during normal situations } else { return getValueAt(balances[_owner], _blockNumber); } } /// @notice Total amount of tokens at a specific `_blockNumber`. /// @param _blockNumber The block number when the totalSupply is queried /// @return The total amount of tokens at `_blockNumber` function totalSupplyAt(uint _blockNumber) public view returns(uint) { // These next few lines are used when the totalSupply of the token is // requested before a check point was ever created for this token, it // requires that the `parentToken.totalSupplyAt` be queried at the // genesis block for this token as that contains totalSupply of this // token at this block number. if ((totalSupplyHistory.length == 0) || (totalSupplyHistory[0].fromBlock > _blockNumber)) { if (address(parentToken) != address(0)) { return parentToken.totalSupplyAt(min(_blockNumber, parentSnapShotBlock)); } else { return 0; } // This will return the expected totalSupply during normal situations } else { return getValueAt(totalSupplyHistory, _blockNumber); } } //////////////// // Generate and destroy tokens //////////////// /// @notice Generates `_amount` tokens that are assigned to `_owner` /// @param _owner The address that will be assigned the new tokens /// @param _amount The quantity of tokens generated /// @return True if the tokens are generated correctly function _generateTokens(address _owner, uint _amount) internal returns (bool) { uint curTotalSupply = totalSupply(); require(curTotalSupply + _amount >= curTotalSupply); // Check for overflow uint previousBalanceTo = balanceOf(_owner); require(previousBalanceTo + _amount >= previousBalanceTo); // Check for overflow updateValueAtNow(totalSupplyHistory, curTotalSupply + _amount); updateValueAtNow(balances[_owner], previousBalanceTo + _amount); emit Transfer(address(0), _owner, _amount); return true; } /// @notice Burns `_amount` tokens from `_owner` /// @param _owner The address that will lose the tokens /// @param _amount The quantity of tokens to burn /// @return True if the tokens are burned correctly function _destroyTokens(address _owner, uint _amount) internal returns (bool) { uint curTotalSupply = totalSupply(); require(curTotalSupply >= _amount); uint previousBalanceFrom = balanceOf(_owner); require(previousBalanceFrom >= _amount); updateValueAtNow(totalSupplyHistory, curTotalSupply - _amount); updateValueAtNow(balances[_owner], previousBalanceFrom - _amount); emit Transfer(_owner, address(0), _amount); return true; } //////////////// // Enable tokens transfers //////////////// /// @notice Enables token holders to transfer their tokens freely if true /// @param _transfersEnabled True if transfers are allowed in the clone function _enableTransfers(bool _transfersEnabled) internal { transfersEnabled = _transfersEnabled; } //////////////// // Internal helper functions to query and set a value in a snapshot array //////////////// /// @dev `getValueAt` retrieves the number of tokens at a given block number /// @param checkpoints The history of values being queried /// @param _block The block number to retrieve the value at /// @return The number of tokens being queried function getValueAt(Checkpoint[] storage checkpoints, uint _block) internal view returns (uint) { if (checkpoints.length == 0) return 0; // Shortcut for the actual value if (_block >= checkpoints[checkpoints.length-1].fromBlock) return checkpoints[checkpoints.length-1].value; if (_block < checkpoints[0].fromBlock) return 0; // Binary search of the value in the array uint min = 0; uint max = checkpoints.length-1; while (max > min) { uint mid = (max + min + 1) / 2; if (checkpoints[mid].fromBlock<=_block) { min = mid; } else { max = mid-1; } } return checkpoints[min].value; } /// @dev `updateValueAtNow` used to update the `balances` map and the /// `totalSupplyHistory` /// @param checkpoints The history of data being updated /// @param _value The new number of tokens function updateValueAtNow(Checkpoint[] storage checkpoints, uint _value) internal { if ((checkpoints.length == 0) || (checkpoints[checkpoints.length - 1].fromBlock < block.number)) { Checkpoint storage newCheckPoint = checkpoints[checkpoints.length++]; newCheckPoint.fromBlock = uint128(block.number); newCheckPoint.value = uint128(_value); } else { Checkpoint storage oldCheckPoint = checkpoints[checkpoints.length - 1]; oldCheckPoint.value = uint128(_value); } } function onTransferDone(address _from, address _to, uint256 _amount) internal { for(uint i = 0; i < transferListeners.length; i++){ TransferEventCallBack t = TransferEventCallBack(transferListeners[i]); t.onTransfer(_from, _to, _amount); } } function _addTransferListener(address _addr) internal { transferListeners.push(_addr); emit NewTransferListener(_addr); } function _removeTransferListener(address _addr) internal{ transferListeners.remove(_addr); emit RemoveTransferListener(_addr); } /// @dev Helper function to return a min betwen the two uints function min(uint a, uint b) pure internal returns (uint) { return a < b ? a : b; } //function () external payable { //require(false, "cannot transfer ether to this contract"); //} } // File: contracts/ystream/IYieldStream.sol pragma solidity >=0.4.21 <0.6.0; contract IYieldStream{ string public name; function target_token() public view returns(address); function getVirtualPrice() public view returns(uint256); function getDecimal() public pure returns(uint256); function getPriceDecimal() public pure returns(uint256); } // File: contracts/core/HEnv.sol pragma solidity >=0.4.21 <0.6.0; contract HEnv is Ownable{ address public token_addr; address public fee_pool_addr; uint256 public ratio_base; uint256 public bid_fee_ratio; uint256 public withdraw_fee_ratio; uint256 public cancel_fee_ratio; constructor(address _target_token) public{ token_addr = _target_token; ratio_base = 100000000; } function changeFeePoolAddr(address _new) public onlyOwner{ fee_pool_addr = _new; } function changeBidFeeRatio(uint256 _ratio) public onlyOwner{ bid_fee_ratio = _ratio; } function changeWithdrawFeeRatio(uint256 _ratio) public onlyOwner{ withdraw_fee_ratio = _ratio; } function changeCancelFeeRatio(uint256 _ratio) public onlyOwner{ cancel_fee_ratio = _ratio; } } contract HEnvFactory{ event NewHEnv(address addr); function createHEnv(address _target_token) public returns (address){ HEnv env = new HEnv(_target_token); env.transferOwnership(msg.sender); emit NewHEnv(address(env)); return address(env); } } // File: contracts/core/HPeriod.sol pragma solidity >=0.4.21 <0.6.0; contract HPeriod{ using SafeMath for uint; uint256 period_start_block; uint256 period_block_num; uint256 period_gap_block; struct period_info{ uint256 period; uint256 start_block; uint256 end_block; // [start_block, end_block) } mapping (uint256 => period_info) all_periods; uint256 current_period; bool is_gapping; constructor(uint256 _start_block, uint256 _period_block_num, uint256 _gap_block_num) public{ period_start_block = _start_block; period_block_num = _period_block_num; period_gap_block = _gap_block_num; current_period = 0; is_gapping = true; } function _end_current_and_start_new_period() internal returns(bool){ require(block.number >= period_start_block, "1st period not start yet"); if(is_gapping){ if(current_period == 0 || block.number.safeSub(all_periods[current_period].end_block) >= period_gap_block){ current_period = current_period + 1; all_periods[current_period].period = current_period; all_periods[current_period].start_block = block.number; is_gapping = false; return true; } }else{ if(block.number.safeSub(all_periods[current_period].start_block) >= period_block_num){ all_periods[current_period].end_block = block.number; is_gapping = true; } } return false; } event HPeriodChanged(uint256 old, uint256 new_period); function _change_period(uint256 _period) internal{ uint256 old = period_block_num; period_block_num = _period; emit HPeriodChanged(old, period_block_num); } function getCurrentPeriodStartBlock() public view returns(uint256){ (, uint256 s, ) = getPeriodInfo(current_period); return s; } function getPeriodInfo(uint256 period) public view returns(uint256 p, uint256 s, uint256 e){ p = all_periods[period].period; s = all_periods[period].start_block; e = all_periods[period].end_block; } function getParamPeriodStartBlock() public view returns(uint256){ return period_start_block; } function getParamPeriodBlockNum() public view returns(uint256){ return period_block_num; } function getParamPeriodGapNum() public view returns(uint256){ return period_gap_block; } function getCurrentPeriod() public view returns(uint256){ return current_period; } function isPeriodEnd(uint256 _period) public view returns(bool){ return all_periods[_period].end_block != 0; } function isPeriodStart(uint256 _period) public view returns(bool){ return all_periods[_period].start_block != 0; } } // File: contracts/core/HPeriodToken.sol pragma solidity >=0.4.21 <0.6.0; contract HTokenFactoryInterface{ function createFixedRatioToken(address _token_addr, uint256 _period, uint256 _ratio, string memory _postfix) public returns(address); function createFloatingToken(address _token_addr, uint256 _period, string memory _postfix) public returns(address); } contract HTokenInterface{ function mint(address addr, uint256 amount)public; function burnFrom(address addr, uint256 amount) public; uint256 public period_number; uint256 public ratio; // 0 is for floating uint256 public underlying_balance; function setUnderlyingBalance(uint256 _balance) public; function setTargetToken(address _target) public; } contract HPeriodToken is HPeriod, Ownable{ struct period_token_info{ address[] period_tokens; mapping(bytes32 => address) hash_to_tokens; } mapping (uint256 => period_token_info) all_period_tokens; HTokenFactoryInterface public token_factory; address public target_token; constructor(address _target_token, uint256 _start_block, uint256 _period, uint256 _gap, address _factory) HPeriod(_start_block, _period, _gap) public{ target_token = _target_token; token_factory = HTokenFactoryInterface(_factory); } function uint2str(uint256 i) internal pure returns (string memory c) { if (i == 0) return "0"; uint256 j = i; uint256 length; while (j != 0){ length++; j /= 10; } bytes memory bstr = new bytes(length); uint256 k = length - 1; while (i != 0){ bstr[k--] = byte(48 + uint8(i % 10)); i /= 10; } c = string(bstr); } function getOrCreateToken(uint ratio) public onlyOwner returns(address, bool){ _end_current_and_start_new_period(); uint256 p = getCurrentPeriod(); bytes32 h = keccak256(abi.encodePacked(target_token, getParamPeriodBlockNum(), ratio, p + 1)); address c = address(0x0); period_token_info storage pi = all_period_tokens[p + 1]; bool s = false; if(pi.hash_to_tokens[h] == address(0x0)){ if(ratio == 0){ c = token_factory.createFloatingToken(target_token, p + 1, uint2str(getParamPeriodBlockNum())); } else{ c = token_factory.createFixedRatioToken(target_token, p + 1, ratio, uint2str(getParamPeriodBlockNum())); } HTokenInterface(c).setTargetToken(target_token); Ownable ow = Ownable(c); ow.transferOwnership(owner()); pi.period_tokens.push(c); pi.hash_to_tokens[h] = c; s = true; } c = pi.hash_to_tokens[h]; return(c, s); } function updatePeriodStatus() public onlyOwner returns(bool){ return _end_current_and_start_new_period(); } function isPeriodTokenValid(address _token_addr) public view returns(bool){ HTokenInterface hti = HTokenInterface(_token_addr); bytes32 h = keccak256(abi.encodePacked(target_token, getParamPeriodBlockNum(), hti.ratio(), hti.period_number())); period_token_info storage pi = all_period_tokens[hti.period_number()]; if(pi.hash_to_tokens[h] == _token_addr){ return true; } return false; } function totalAtPeriodWithRatio(uint256 _period, uint256 _ratio) public view returns(uint256) { bytes32 h = keccak256(abi.encodePacked(target_token, getParamPeriodBlockNum(), _ratio, _period)); period_token_info storage pi = all_period_tokens[_period]; address c = pi.hash_to_tokens[h]; if(c == address(0x0)) return 0; IERC20 e = IERC20(c); return e.totalSupply(); } function htokenAtPeriodWithRatio(uint256 _period, uint256 _ratio) public view returns(address){ bytes32 h = keccak256(abi.encodePacked(target_token, getParamPeriodBlockNum(), _ratio, _period)); period_token_info storage pi = all_period_tokens[_period]; address c = pi.hash_to_tokens[h]; return c; } } contract HPeriodTokenFactory{ event NewPeriodToken(address addr); function createPeriodToken(address _target_token, uint256 _start_block, uint256 _period, uint256 _gap, address _token_factory) public returns(address){ HPeriodToken pt = new HPeriodToken(_target_token, _start_block, _period, _gap, _token_factory); pt.transferOwnership(msg.sender); emit NewPeriodToken(address(pt)); return address(pt); } } // File: contracts/core/HGateKeeper.sol pragma solidity >=0.4.21 <0.6.0; contract HDispatcherInterface{ function getYieldStream(address _token_addr) public view returns (IYieldStream); } contract TokenBankInterface{ function issue(address payable _to, uint _amount) public returns(bool success); } contract ClaimHandlerInterface{ function handle_create_contract(address from, address lop_token_addr) public; function handle_claim(address from, address lp_token_addr, uint256 amount) public; } contract HGateKeeper is Ownable{ using SafeERC20 for IERC20; using SafeMath for uint256; HDispatcherInterface public dispatcher; address public target_token; HEnv public env; HPeriodToken public period_token; ClaimHandlerInterface public claim_handler; address public yield_interest_pool; uint256 public settled_period; uint256 public max_amount; struct period_price_info{ uint256 start_price; uint256 end_price; } mapping (uint256 => uint256) public period_token_amount; mapping (uint256 => period_price_info) public period_prices; constructor(address _token_addr, address _env, address _dispatcher, address _period_token) public{ target_token = _token_addr; env = HEnv(_env); dispatcher = HDispatcherInterface(_dispatcher); period_token = HPeriodToken(_period_token); settled_period = 0; } event ChangeClaimHandler(address old, address _new); function changeClaimHandler(address handler) public onlyOwner{ address old = address(claim_handler); claim_handler = ClaimHandlerInterface(handler); emit ChangeClaimHandler(old, handler); } event ChangeMaxAmount(uint256 old, uint256 _new); function set_max_amount(uint _amount) public onlyOwner{ uint256 old = max_amount; max_amount = _amount; emit ChangeMaxAmount(old, max_amount); } event HorizonBid(address from, uint256 amount, uint256 ratio, address lp_token_addr); function bidRatio(uint256 _amount, uint256 _ratio) public returns(address lp_token_addr){ require(_ratio == 0 || isSupportRatio(_ratio), "not support ratio"); (address addr, bool created) = period_token.getOrCreateToken(_ratio); if(created){ if(claim_handler != ClaimHandlerInterface(0x0)){ claim_handler.handle_create_contract(msg.sender, addr); } } if(max_amount > 0){ require(_amount <= max_amount, "too large amount"); require(_amount.safeAdd(IERC20(addr).balanceOf(msg.sender)) <= max_amount, "please use another wallet"); } _check_period(); ///* require(IERC20(target_token).allowance(msg.sender, address(this)) >= _amount, "not enough allowance"); uint _before = IERC20(target_token).balanceOf(address(this)); IERC20(target_token).safeTransferFrom(msg.sender, address(this), _amount); uint256 _after = IERC20(target_token).balanceOf(address(this)); _amount = _after.safeSub(_before); // Additional check for deflationary tokens uint256 decimal = dispatcher.getYieldStream(target_token).getDecimal(); require(decimal <= 1e18, "decimal too large"); uint256 shares = _amount.safeMul(1e18).safeDiv(decimal); uint256 period = HTokenInterface(addr).period_number(); period_token_amount[period] = period_token_amount[period].safeAdd(_amount); HTokenInterface(addr).mint(msg.sender, shares); emit HorizonBid(msg.sender, _amount, _ratio, addr); return addr; //*/ } function bidFloating(uint256 _amount) public returns(address lp_token_addr){ return bidRatio(_amount, 0); } event CancelBid(address from, uint256 amount, uint256 fee, address _lp_token_addr); function cancelBid(address _lp_token_addr) public{ bool is_valid = period_token.isPeriodTokenValid(_lp_token_addr); require(is_valid, "invalid lp token address"); uint256 amount = IERC20(_lp_token_addr).balanceOf(msg.sender); require(amount > 0, "no bid at this period"); _check_period(); uint256 period = HTokenInterface(_lp_token_addr).period_number(); require(period_token.getCurrentPeriod() < period, "period sealed already"); HTokenInterface(_lp_token_addr).burnFrom(msg.sender, amount); uint256 decimal = dispatcher.getYieldStream(target_token).getDecimal(); uint256 target_amount = amount.safeMul(decimal).safeDiv(1e18); period_token_amount[period] = period_token_amount[period].safeSub(target_amount); if(env.cancel_fee_ratio() != 0 && env.fee_pool_addr() != address(0x0)){ uint256 fee = target_amount.safeMul(env.cancel_fee_ratio()).safeDiv(env.ratio_base()); uint256 recv = target_amount.safeSub(fee); IERC20(target_token).safeTransfer(msg.sender, recv); IERC20(target_token).safeTransfer(env.fee_pool_addr(), fee); emit CancelBid(msg.sender, recv, fee, _lp_token_addr); }else{ IERC20(target_token).safeTransfer(msg.sender, target_amount); emit CancelBid(msg.sender, target_amount, 0, _lp_token_addr); } } function changeBid(address _lp_token_addr, uint256 _new_amount, uint256 _new_ratio) public{ cancelBid(_lp_token_addr); bidRatio(_new_amount, _new_ratio); } event HorizonClaim(address from, address _lp_token_addr, uint256 amount, uint256 fee); function claim(address _lp_token_addr, uint256 _amount) public { bool is_valid = period_token.isPeriodTokenValid(_lp_token_addr); require(is_valid, "invalid lp token address"); uint256 amount = IERC20(_lp_token_addr).balanceOf(msg.sender); require(amount >= _amount, "no enough bid at this period"); _check_period(); require(period_token.isPeriodEnd(HTokenInterface(_lp_token_addr).period_number()), "period not end"); uint total = IERC20(_lp_token_addr).totalSupply(); uint underly = HTokenInterface(_lp_token_addr).underlying_balance(); HTokenInterface(_lp_token_addr).burnFrom(msg.sender, _amount); uint t = _amount.safeMul(underly).safeDiv(total); HTokenInterface(_lp_token_addr).setUnderlyingBalance(underly.safeSub(t)); if(env.withdraw_fee_ratio() != 0 && env.fee_pool_addr() != address(0x0)){ uint256 fee = t.safeMul(env.withdraw_fee_ratio()).safeDiv(env.ratio_base()); uint256 recv = t.safeSub(fee); IERC20(target_token).safeTransfer(msg.sender, recv); IERC20(target_token).safeTransfer(env.fee_pool_addr(), fee); emit HorizonClaim(msg.sender, _lp_token_addr, recv, fee); }else{ IERC20(target_token).safeTransfer(msg.sender, t); emit HorizonClaim(msg.sender, _lp_token_addr, t, 0); } if(claim_handler != ClaimHandlerInterface(0x0)){ claim_handler.handle_claim(msg.sender, _lp_token_addr, _amount); } } function claimAllAndBidForNext(address _lp_token_addr, uint256 _ratio, uint256 _next_bid_amount) public{ uint256 amount = IERC20(_lp_token_addr).balanceOf(msg.sender); claim(_lp_token_addr, amount); uint256 new_amount = IERC20(target_token).balanceOf(msg.sender); if(new_amount > _next_bid_amount){ new_amount = _next_bid_amount; } bidRatio(new_amount, _ratio); } function _check_period() internal{ period_token.updatePeriodStatus(); uint256 new_period = period_token.getCurrentPeriod(); if(period_prices[new_period].start_price == 0){ period_prices[new_period].start_price = dispatcher.getYieldStream(target_token).getVirtualPrice(); } if(period_token.isPeriodEnd(settled_period + 1)){ _settle_period(settled_period + 1); } } mapping (uint256 => bool) public support_ratios; uint256[] public sratios; event SupportRatiosChanged(uint256[] rs); function resetSupportRatios(uint256[] memory rs) public onlyOwner{ for(uint i = 0; i < sratios.length; i++){ delete support_ratios[sratios[i]]; } delete sratios; for(uint i = 0; i < rs.length; i++){ if(i > 0){ require(rs[i] > rs[i-1], "should be ascend"); } sratios.push(rs[i]); support_ratios[rs[i]] = true; } emit SupportRatiosChanged(sratios); } function isSupportRatio(uint256 r) public view returns(bool){ for(uint i = 0; i < sratios.length; i++){ if(sratios[i] == r){ return true; } } return false; } function updatePeriodStatus() public{ _check_period(); } function _settle_period(uint256 _period) internal{ if(period_prices[_period].end_price== 0){ period_prices[_period].end_price= dispatcher.getYieldStream(target_token).getVirtualPrice(); } uint256 tdecimal = dispatcher.getYieldStream(target_token).getDecimal(); uint256 left = period_token_amount[_period].safeMul(period_prices[_period].end_price.safeSub(period_prices[_period].start_price)); uint256 s = 0; address fht = period_token.htokenAtPeriodWithRatio(_period, 0); for(uint256 i = 0; i < sratios.length; i++){ uint256 t = period_token.totalAtPeriodWithRatio(_period, sratios[i]).safeMul(tdecimal).safeDiv(1e18); uint256 nt = t.safeMul(period_prices[_period].start_price).safeMul(sratios[i]).safeDiv(env.ratio_base()); address c = period_token.htokenAtPeriodWithRatio(_period, sratios[i]); if(c != address(0x0)){ if(nt > left){ nt = left; } left = left.safeSub(nt); t = t.safeMul(period_prices[_period].start_price).safeAdd(nt).safeDiv(period_prices[_period].end_price); HTokenInterface(c).setUnderlyingBalance(t); s = s.safeAdd(t); } } if(fht != address(0x0)){ left = period_token_amount[_period].safeSub(s); HTokenInterface(fht).setUnderlyingBalance(left); s = s.safeAdd(left); } if(s < period_token_amount[_period]){ s = period_token_amount[_period].safeSub(s); require(yield_interest_pool != address(0x0), "invalid yield interest pool"); IERC20(target_token).safeTransfer(yield_interest_pool, s); } settled_period = _period; } event ChangeYieldInterestPool(address old, address _new); function changeYieldPool(address _pool) onlyOwner public{ require(_pool != address(0x0), "invalid pool"); address old = yield_interest_pool; yield_interest_pool = _pool; emit ChangeYieldInterestPool(old, _pool); } } contract HGateKeeperFactory is Ownable{ event NewGateKeeper(address addr); function createGateKeeperForPeriod(address _env_addr, address _dispatcher, address _period_token) public returns(address){ HEnv e = HEnv(_env_addr); HGateKeeper gk = new HGateKeeper(e.token_addr(), _env_addr, _dispatcher, _period_token); gk.transferOwnership(msg.sender); emit NewGateKeeper(address(gk)); return address(gk); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"period_token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"handler","type":"address"}],"name":"changeClaimHandler","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"max_amount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"period_token_amount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"updatePeriodStatus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_lp_token_addr","type":"address"},{"name":"_ratio","type":"uint256"},{"name":"_next_bid_amount","type":"uint256"}],"name":"claimAllAndBidForNext","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"r","type":"uint256"}],"name":"isSupportRatio","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_lp_token_addr","type":"address"}],"name":"cancelBid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"claim_handler","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"rs","type":"uint256[]"}],"name":"resetSupportRatios","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"set_max_amount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_lp_token_addr","type":"address"},{"name":"_new_amount","type":"uint256"},{"name":"_new_ratio","type":"uint256"}],"name":"changeBid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"settled_period","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"env","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"yield_interest_pool","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"sratios","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"bidFloating","outputs":[{"name":"lp_token_addr","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"support_ratios","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_lp_token_addr","type":"address"},{"name":"_amount","type":"uint256"}],"name":"claim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dispatcher","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pool","type":"address"}],"name":"changeYieldPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"period_prices","outputs":[{"name":"start_price","type":"uint256"},{"name":"end_price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"},{"name":"_ratio","type":"uint256"}],"name":"bidRatio","outputs":[{"name":"lp_token_addr","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"target_token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_token_addr","type":"address"},{"name":"_env","type":"address"},{"name":"_dispatcher","type":"address"},{"name":"_period_token","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"old","type":"address"},{"indexed":false,"name":"_new","type":"address"}],"name":"ChangeClaimHandler","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"old","type":"uint256"},{"indexed":false,"name":"_new","type":"uint256"}],"name":"ChangeMaxAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"ratio","type":"uint256"},{"indexed":false,"name":"lp_token_addr","type":"address"}],"name":"HorizonBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"fee","type":"uint256"},{"indexed":false,"name":"_lp_token_addr","type":"address"}],"name":"CancelBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"_lp_token_addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"fee","type":"uint256"}],"name":"HorizonClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"rs","type":"uint256[]"}],"name":"SupportRatiosChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"old","type":"address"},{"indexed":false,"name":"_new","type":"address"}],"name":"ChangeYieldInterestPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051620041a6380380620041a68339818101604052608081101561003557600080fd5b5080516020820151604080840151606090940151600080546001600160a01b0319163390811782559251949593949192918291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600280546001600160a01b039586166001600160a01b031991821617909155600380549486169482169490941790935560018054928516928416929092179091556004805491909316911617905560006007556140b480620000f26000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80638ec4255f116100de578063aad3ec9611610097578063dbd9d77211610071578063dbd9d77214610471578063e31d48ad146104a7578063f2fde38b146104ca578063f51f7496146104f05761018d565b8063aad3ec9614610417578063cb7e905714610443578063d70d642c1461044b5761018d565b80638ec4255f146103a85780639dca0032146103b05780639ff60825146103b8578063a1054449146103c0578063a15143cd146103dd578063a915190d146103fa5761018d565b8063390f28af1161014b5780634b832735116101255780634b832735146102ae5780635a2dfd4914610351578063856c19311461036e5780638da5cb5b146103a05761018d565b8063390f28af1461024f5780633f3a502714610280578063485040fb146102a65761018d565b8062300a45146101925780630ab505b8146101b65780631a34fe81146101de57806321ace470146101f85780632e96b1191461021557806335b0186b1461021d575b600080fd5b61019a6104f8565b604080516001600160a01b039092168252519081900360200190f35b6101dc600480360360208110156101cc57600080fd5b50356001600160a01b0316610507565b005b6101e66105b7565b60408051918252519081900360200190f35b6101e66004803603602081101561020e57600080fd5b50356105bd565b6101dc6105cf565b6101dc6004803603606081101561023357600080fd5b506001600160a01b0381351690602081013590604001356105d9565b61026c6004803603602081101561026557600080fd5b50356106f1565b604080519115158252519081900360200190f35b6101dc6004803603602081101561029657600080fd5b50356001600160a01b031661073b565b61019a611204565b6101dc600480360360208110156102c457600080fd5b8101906020810181356401000000008111156102df57600080fd5b8201836020820111156102f157600080fd5b8035906020019184602083028401116401000000008311171561031357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611213945050505050565b6101dc6004803603602081101561036757600080fd5b5035611423565b6101dc6004803603606081101561038457600080fd5b506001600160a01b0381351690602081013590604001356114b7565b61019a6114d0565b6101e66114e0565b61019a6114e6565b61019a6114f5565b6101e6600480360360208110156103d657600080fd5b5035611504565b61019a600480360360208110156103f357600080fd5b5035611522565b61026c6004803603602081101561041057600080fd5b5035611535565b6101dc6004803603604081101561042d57600080fd5b506001600160a01b03813516906020013561154a565b61019a612094565b6101dc6004803603602081101561046157600080fd5b50356001600160a01b03166120a3565b61048e6004803603602081101561048757600080fd5b503561219d565b6040805192835260208301919091528051918290030190f35b61019a600480360360408110156104bd57600080fd5b50803590602001356121b6565b6101dc600480360360208110156104e057600080fd5b50356001600160a01b0316612b56565b61019a612baf565b6004546001600160a01b031681565b6000546001600160a01b03163314610554576040805162461bcd60e51b81526020600482018190526024820152600080516020614036833981519152604482015290519081900360640190fd5b600580546001600160a01b038381166001600160a01b0319831681179093556040805191909216808252602082019390935281517fcad549da2d36afbab0724050a4aad5b767ad5affe3e8fff14dc3ceb87174c2e4929181900390910190a15050565b60085481565b60096020526000908152604090205481565b6105d7612bbe565b565b604080516370a0823160e01b815233600482015290516000916001600160a01b038616916370a0823191602480820192602092909190829003018186803b15801561062357600080fd5b505afa158015610637573d6000803e3d6000fd5b505050506040513d602081101561064d57600080fd5b5051905061065b848261154a565b600254604080516370a0823160e01b815233600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d60208110156106d057600080fd5b50519050828111156106df5750815b6106e981856121b6565b505050505050565b6000805b600c548110156107305782600c828154811061070d57fe5b90600052602060002001541415610728576001915050610736565b6001016106f5565b50600090505b919050565b60048054604080516317f4ab1760e01b81526001600160a01b03858116948201949094529051600093909216916317f4ab1791602480820192602092909190829003018186803b15801561078e57600080fd5b505afa1580156107a2573d6000803e3d6000fd5b505050506040513d60208110156107b857600080fd5b5051905080610809576040805162461bcd60e51b8152602060048201526018602482015277696e76616c6964206c7020746f6b656e206164647265737360401b604482015290519081900360640190fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b15801561085357600080fd5b505afa158015610867573d6000803e3d6000fd5b505050506040513d602081101561087d57600080fd5b50519050806108cb576040805162461bcd60e51b81526020600482015260156024820152741b9bc8189a5908185d081d1a1a5cc81c195c9a5bd9605a1b604482015290519081900360640190fd5b6108d3612bbe565b6000836001600160a01b031663599b83fa6040518163ffffffff1660e01b815260040160206040518083038186803b15801561090e57600080fd5b505afa158015610922573d6000803e3d6000fd5b505050506040513d602081101561093857600080fd5b50516004805460408051630430a36960e11b8152905193945084936001600160a01b039092169263086146d2928282019260209290829003018186803b15801561098157600080fd5b505afa158015610995573d6000803e3d6000fd5b505050506040513d60208110156109ab57600080fd5b5051106109f7576040805162461bcd60e51b8152602060048201526015602482015274706572696f64207365616c656420616c726561647960581b604482015290519081900360640190fd5b6040805163079cc67960e41b81523360048201526024810184905290516001600160a01b038616916379cc679091604480830192600092919082900301818387803b158015610a4557600080fd5b505af1158015610a59573d6000803e3d6000fd5b505060015460025460408051638b6ea7bb60e01b81526001600160a01b039283166004820152905160009550919092169250638b6ea7bb91602480820192602092909190829003018186803b158015610ab157600080fd5b505afa158015610ac5573d6000803e3d6000fd5b505050506040513d6020811015610adb57600080fd5b505160408051630d33843160e21b815290516001600160a01b03909216916334ce10c491600480820192602092909190829003018186803b158015610b1f57600080fd5b505afa158015610b33573d6000803e3d6000fd5b505050506040513d6020811015610b4957600080fd5b50516040805163682e3c6d60e11b815260048101869052602481018390529051919250600091730836e32f1f91db939d58a0763cbd38a28a8688fa9163d05c78da916044808301926020929190829003018186803b158015610baa57600080fd5b505af4158015610bbe573d6000803e3d6000fd5b505050506040513d6020811015610bd457600080fd5b505160408051632d64c7df60e21b81526004810192909252670de0b6b3a7640000602483015251730836e32f1f91db939d58a0763cbd38a28a8688fa9163b5931f7c916044808301926020929190829003018186803b158015610c3657600080fd5b505af4158015610c4a573d6000803e3d6000fd5b505050506040513d6020811015610c6057600080fd5b50516000848152600960209081526040918290205482516314527a3d60e31b81526004810191909152602481018490529151929350730836e32f1f91db939d58a0763cbd38a28a8688fa9263a293d1e8926044808201939291829003018186803b158015610ccd57600080fd5b505af4158015610ce1573d6000803e3d6000fd5b505050506040513d6020811015610cf757600080fd5b50516000848152600960209081526040918290209290925560035481516336b650bf60e11b815291516001600160a01b0390911692636d6ca17e9260048082019391829003018186803b158015610d4d57600080fd5b505afa158015610d61573d6000803e3d6000fd5b505050506040513d6020811015610d7757600080fd5b505115801590610dff5750600354604080516346cc0e0d60e01b815290516000926001600160a01b0316916346cc0e0d916004808301926020929190829003018186803b158015610dc757600080fd5b505afa158015610ddb573d6000803e3d6000fd5b505050506040513d6020811015610df157600080fd5b50516001600160a01b031614155b1561119057600354604080516336b650bf60e11b81529051600092730836e32f1f91db939d58a0763cbd38a28a8688fa9263d05c78da9286926001600160a01b031691636d6ca17e916004808301926020929190829003018186803b158015610e6757600080fd5b505afa158015610e7b573d6000803e3d6000fd5b505050506040513d6020811015610e9157600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152516044808301926020929190829003018186803b158015610ed857600080fd5b505af4158015610eec573d6000803e3d6000fd5b505050506040513d6020811015610f0257600080fd5b50516003546040805163039dd49d60e21b81529051730836e32f1f91db939d58a0763cbd38a28a8688fa9363b5931f7c9390926001600160a01b0390911691630e77527491600480820192602092909190829003018186803b158015610f6757600080fd5b505afa158015610f7b573d6000803e3d6000fd5b505050506040513d6020811015610f9157600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152516044808301926020929190829003018186803b158015610fd857600080fd5b505af4158015610fec573d6000803e3d6000fd5b505050506040513d602081101561100257600080fd5b5051604080516314527a3d60e31b815260048101859052602481018390529051919250600091730836e32f1f91db939d58a0763cbd38a28a8688fa9163a293d1e8916044808301926020929190829003018186803b15801561106357600080fd5b505af4158015611077573d6000803e3d6000fd5b505050506040513d602081101561108d57600080fd5b50516002549091506110af906001600160a01b0316338363ffffffff612e4d16565b600354604080516346cc0e0d60e01b8152905161113a926001600160a01b0316916346cc0e0d916004808301926020929190829003018186803b1580156110f557600080fd5b505afa158015611109573d6000803e3d6000fd5b505050506040513d602081101561111f57600080fd5b50516002546001600160a01b0316908463ffffffff612e4d16565b60408051338152602081018390528082018490526001600160a01b038a16606082015290517ff374f92bc383bc88bd0e236b68be15d31b4a66cec5df7cca73c02c451422b0f09181900360800190a150506106e9565b6002546111ad906001600160a01b0316338363ffffffff612e4d16565b60408051338152602081018390526000818301526001600160a01b038816606082015290517ff374f92bc383bc88bd0e236b68be15d31b4a66cec5df7cca73c02c451422b0f09181900360800190a1505050505050565b6005546001600160a01b031681565b6000546001600160a01b03163314611260576040805162461bcd60e51b81526020600482018190526024820152600080516020614036833981519152604482015290519081900360640190fd5b60005b600c548110156112a957600b6000600c838154811061127e57fe5b600091825260208083209091015483528201929092526040019020805460ff19169055600101611263565b506112b6600c6000613fd8565b60005b81518110156113a9578015611338578160018203815181106112d757fe5b60200260200101518282815181106112eb57fe5b602002602001015111611338576040805162461bcd60e51b815260206004820152601060248201526f1cda1bdd5b1908189948185cd8d95b9960821b604482015290519081900360640190fd5b600c82828151811061134657fe5b6020908102919091018101518254600181810185556000948552928420015583519091600b9185908590811061137857fe5b6020908102919091018101518252810191909152604001600020805460ff19169115159190911790556001016112b9565b507f83fe8649d01435d9da2bb5a1107711cd2b3a3cf482768c13067fb12752c76829600c6040518080602001828103825283818154815260200191508054801561141257602002820191906000526020600020905b8154815260200190600101908083116113fe575b50509250505060405180910390a150565b6000546001600160a01b03163314611470576040805162461bcd60e51b81526020600482018190526024820152600080516020614036833981519152604482015290519081900360640190fd5b6008805490829055604080518281526020810184905281517fda1ac08e19cf366ae5b5feb717776ca672304e55946e9640989edad1d94900b5929181900390910190a15050565b6114c08361073b565b6114ca82826121b6565b50505050565b6000546001600160a01b03165b90565b60075481565b6003546001600160a01b031681565b6006546001600160a01b031681565b600c818154811061151157fe5b600091825260209091200154905081565b600061152f8260006121b6565b92915050565b600b6020526000908152604090205460ff1681565b60048054604080516317f4ab1760e01b81526001600160a01b03868116948201949094529051600093909216916317f4ab1791602480820192602092909190829003018186803b15801561159d57600080fd5b505afa1580156115b1573d6000803e3d6000fd5b505050506040513d60208110156115c757600080fd5b5051905080611618576040805162461bcd60e51b8152602060048201526018602482015277696e76616c6964206c7020746f6b656e206164647265737360401b604482015290519081900360640190fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038616916370a0823191602480820192602092909190829003018186803b15801561166257600080fd5b505afa158015611676573d6000803e3d6000fd5b505050506040513d602081101561168c57600080fd5b50519050828110156116e5576040805162461bcd60e51b815260206004820152601c60248201527f6e6f20656e6f75676820626964206174207468697320706572696f6400000000604482015290519081900360640190fd5b6116ed612bbe565b6004805460408051632ccdc1fd60e11b815290516001600160a01b0392831693639e9307f89389169263599b83fa9281830192602092829003018186803b15801561173757600080fd5b505afa15801561174b573d6000803e3d6000fd5b505050506040513d602081101561176157600080fd5b5051604080516001600160e01b031960e085901b1681526004810192909252516024808301926020929190829003018186803b1580156117a057600080fd5b505afa1580156117b4573d6000803e3d6000fd5b505050506040513d60208110156117ca57600080fd5b505161180e576040805162461bcd60e51b815260206004820152600e60248201526d1c195c9a5bd9081b9bdd08195b9960921b604482015290519081900360640190fd5b6000846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561184957600080fd5b505afa15801561185d573d6000803e3d6000fd5b505050506040513d602081101561187357600080fd5b5051604080516325788f6d60e01b815290519192506000916001600160a01b038816916325788f6d916004808301926020929190829003018186803b1580156118bb57600080fd5b505afa1580156118cf573d6000803e3d6000fd5b505050506040513d60208110156118e557600080fd5b50516040805163079cc67960e41b81523360048201526024810188905290519192506001600160a01b038816916379cc67909160448082019260009290919082900301818387803b15801561193957600080fd5b505af115801561194d573d6000803e3d6000fd5b50505050600085730836e32f1f91db939d58a0763cbd38a28a8688fa63d05c78da9091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156119ac57600080fd5b505af41580156119c0573d6000803e3d6000fd5b505050506040513d60208110156119d657600080fd5b505160408051632d64c7df60e21b815260048101929092526024820185905251730836e32f1f91db939d58a0763cbd38a28a8688fa9163b5931f7c916044808301926020929190829003018186803b158015611a3157600080fd5b505af4158015611a45573d6000803e3d6000fd5b505050506040513d6020811015611a5b57600080fd5b5051604080516314527a3d60e31b8152600481018590526024810183905290519192506001600160a01b0389169163dcc1692991730836e32f1f91db939d58a0763cbd38a28a8688fa9163a293d1e891604480820192602092909190829003018186803b158015611acb57600080fd5b505af4158015611adf573d6000803e3d6000fd5b505050506040513d6020811015611af557600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015611b3557600080fd5b505af1158015611b49573d6000803e3d6000fd5b50505050600360009054906101000a90046001600160a01b03166001600160a01b03166370f9e52f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b9b57600080fd5b505afa158015611baf573d6000803e3d6000fd5b505050506040513d6020811015611bc557600080fd5b505115801590611c4d5750600354604080516346cc0e0d60e01b815290516000926001600160a01b0316916346cc0e0d916004808301926020929190829003018186803b158015611c1557600080fd5b505afa158015611c29573d6000803e3d6000fd5b505050506040513d6020811015611c3f57600080fd5b50516001600160a01b031614155b15611f9957600354604080516370f9e52f60e01b81529051600092730836e32f1f91db939d58a0763cbd38a28a8688fa9263d05c78da9286926001600160a01b0316916370f9e52f916004808301926020929190829003018186803b158015611cb557600080fd5b505afa158015611cc9573d6000803e3d6000fd5b505050506040513d6020811015611cdf57600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152516044808301926020929190829003018186803b158015611d2657600080fd5b505af4158015611d3a573d6000803e3d6000fd5b505050506040513d6020811015611d5057600080fd5b50516003546040805163039dd49d60e21b81529051730836e32f1f91db939d58a0763cbd38a28a8688fa9363b5931f7c9390926001600160a01b0390911691630e77527491600480820192602092909190829003018186803b158015611db557600080fd5b505afa158015611dc9573d6000803e3d6000fd5b505050506040513d6020811015611ddf57600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152516044808301926020929190829003018186803b158015611e2657600080fd5b505af4158015611e3a573d6000803e3d6000fd5b505050506040513d6020811015611e5057600080fd5b5051604080516314527a3d60e31b815260048101859052602481018390529051919250600091730836e32f1f91db939d58a0763cbd38a28a8688fa9163a293d1e8916044808301926020929190829003018186803b158015611eb157600080fd5b505af4158015611ec5573d6000803e3d6000fd5b505050506040513d6020811015611edb57600080fd5b5051600254909150611efd906001600160a01b0316338363ffffffff612e4d16565b600354604080516346cc0e0d60e01b81529051611f43926001600160a01b0316916346cc0e0d916004808301926020929190829003018186803b1580156110f557600080fd5b604080513381526001600160a01b038b1660208201528082018390526060810184905290517f196b9a835b8ddc6f4190f9ecf4d1788a7ef43c114f3f21bb69b85b7bc35456db9181900360800190a15050612006565b600254611fb6906001600160a01b0316338363ffffffff612e4d16565b604080513381526001600160a01b03891660208201528082018390526000606082015290517f196b9a835b8ddc6f4190f9ecf4d1788a7ef43c114f3f21bb69b85b7bc35456db9181900360800190a15b6005546001600160a01b03161561208b57600554604080516327f2f38b60e11b81523360048201526001600160a01b038a81166024830152604482018a905291519190921691634fe5e71691606480830192600092919082900301818387803b15801561207257600080fd5b505af1158015612086573d6000803e3d6000fd5b505050505b50505050505050565b6001546001600160a01b031681565b6000546001600160a01b031633146120f0576040805162461bcd60e51b81526020600482018190526024820152600080516020614036833981519152604482015290519081900360640190fd5b6001600160a01b03811661213a576040805162461bcd60e51b815260206004820152600c60248201526b1a5b9d985b1a59081c1bdbdb60a21b604482015290519081900360640190fd5b600680546001600160a01b038381166001600160a01b0319831681179093556040805191909216808252602082019390935281517f652007bf928e65eb823aa08d80f212e3dda774b35be23c9d5345aee033ca8ba9929181900390910190a15050565b600a602052600090815260409020805460019091015482565b60008115806121c957506121c9826106f1565b61220e576040805162461bcd60e51b81526020600482015260116024820152706e6f7420737570706f727420726174696f60781b604482015290519081900360640190fd5b6004805460408051631103b6ab60e01b8152928301859052805160009384936001600160a01b031692631103b6ab9260248084019382900301818787803b15801561225857600080fd5b505af115801561226c573d6000803e3d6000fd5b505050506040513d604081101561228257600080fd5b50805160209091015190925090508015612314576005546001600160a01b031615612314576005546040805163071a099360e21b81523360048201526001600160a01b03858116602483015291519190921691631c68264c91604480830192600092919082900301818387803b1580156122fb57600080fd5b505af115801561230f573d6000803e3d6000fd5b505050505b600854156124be57600854851115612366576040805162461bcd60e51b815260206004820152601060248201526f1d1bdbc81b185c99d948185b5bdd5b9d60821b604482015290519081900360640190fd5b600854604080516370a0823160e01b81523360048201529051730836e32f1f91db939d58a0763cbd38a28a8688fa9163e6cb90139189916001600160a01b038816916370a0823191602480820192602092909190829003018186803b1580156123ce57600080fd5b505afa1580156123e2573d6000803e3d6000fd5b505050506040513d60208110156123f857600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152516044808301926020929190829003018186803b15801561243f57600080fd5b505af4158015612453573d6000803e3d6000fd5b505050506040513d602081101561246957600080fd5b505111156124be576040805162461bcd60e51b815260206004820152601960248201527f706c656173652075736520616e6f746865722077616c6c657400000000000000604482015290519081900360640190fd5b6124c6612bbe565b60025460408051636eb1769f60e11b8152336004820152306024820152905187926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b15801561251657600080fd5b505afa15801561252a573d6000803e3d6000fd5b505050506040513d602081101561254057600080fd5b5051101561258c576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f75676820616c6c6f77616e636560601b604482015290519081900360640190fd5b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156125d757600080fd5b505afa1580156125eb573d6000803e3d6000fd5b505050506040513d602081101561260157600080fd5b5051600254909150612624906001600160a01b031633308963ffffffff612ea416565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561266f57600080fd5b505afa158015612683573d6000803e3d6000fd5b505050506040513d602081101561269957600080fd5b5051604080516314527a3d60e31b815260048101839052602481018590529051919250730836e32f1f91db939d58a0763cbd38a28a8688fa9163a293d1e891604480820192602092909190829003018186803b1580156126f857600080fd5b505af415801561270c573d6000803e3d6000fd5b505050506040513d602081101561272257600080fd5b505160015460025460408051638b6ea7bb60e01b81526001600160a01b0392831660048201529051939a506000939190921691638b6ea7bb916024808301926020929190829003018186803b15801561277a57600080fd5b505afa15801561278e573d6000803e3d6000fd5b505050506040513d60208110156127a457600080fd5b505160408051630d33843160e21b815290516001600160a01b03909216916334ce10c491600480820192602092909190829003018186803b1580156127e857600080fd5b505afa1580156127fc573d6000803e3d6000fd5b505050506040513d602081101561281257600080fd5b50519050670de0b6b3a7640000811115612867576040805162461bcd60e51b8152602060048201526011602482015270646563696d616c20746f6f206c6172676560781b604482015290519081900360640190fd5b600088730836e32f1f91db939d58a0763cbd38a28a8688fa63d05c78da9091670de0b6b3a76400006040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156128ca57600080fd5b505af41580156128de573d6000803e3d6000fd5b505050506040513d60208110156128f457600080fd5b505160408051632d64c7df60e21b815260048101929092526024820184905251730836e32f1f91db939d58a0763cbd38a28a8688fa9163b5931f7c916044808301926020929190829003018186803b15801561294f57600080fd5b505af4158015612963573d6000803e3d6000fd5b505050506040513d602081101561297957600080fd5b505160408051632ccdc1fd60e11b815290519192506000916001600160a01b0389169163599b83fa916004808301926020929190829003018186803b1580156129c157600080fd5b505afa1580156129d5573d6000803e3d6000fd5b505050506040513d60208110156129eb57600080fd5b505160008181526009602090815260409182902054825163e6cb901360e01b81526004810191909152602481018e90529151929350730836e32f1f91db939d58a0763cbd38a28a8688fa9263e6cb9013926044808201939291829003018186803b158015612a5857600080fd5b505af4158015612a6c573d6000803e3d6000fd5b505050506040513d6020811015612a8257600080fd5b50516000828152600960205260408082209290925581516340c10f1960e01b81523360048201526024810185905291516001600160a01b038a16926340c10f1992604480830193919282900301818387803b158015612ae057600080fd5b505af1158015612af4573d6000803e3d6000fd5b505060408051338152602081018e90528082018d90526001600160a01b038b16606082015290517f742c09c9d5cc7bf5493cf3d9a71592931c4d1d565ec72314a58715d0385182a59350908190036080019150a1509498975050505050505050565b6000546001600160a01b03163314612ba3576040805162461bcd60e51b81526020600482018190526024820152600080516020614036833981519152604482015290519081900360640190fd5b612bac81612efe565b50565b6002546001600160a01b031681565b6004805460408051632e96b11960e01b815290516001600160a01b0390921692632e96b1199282820192602092908290030181600087803b158015612c0257600080fd5b505af1158015612c16573d6000803e3d6000fd5b505050506040513d6020811015612c2c57600080fd5b50506004805460408051630430a36960e11b815290516000936001600160a01b039093169263086146d292808201926020929091829003018186803b158015612c7457600080fd5b505afa158015612c88573d6000803e3d6000fd5b505050506040513d6020811015612c9e57600080fd5b50516000818152600a6020526040902054909150612db05760015460025460408051638b6ea7bb60e01b81526001600160a01b03928316600482015290519190921691638b6ea7bb916024808301926020929190829003018186803b158015612d0657600080fd5b505afa158015612d1a573d6000803e3d6000fd5b505050506040513d6020811015612d3057600080fd5b50516040805163712d52fd60e11b815290516001600160a01b039092169163e25aa5fa91600480820192602092909190829003018186803b158015612d7457600080fd5b505afa158015612d88573d6000803e3d6000fd5b505050506040513d6020811015612d9e57600080fd5b50516000828152600a60205260409020555b600460009054906101000a90046001600160a01b03166001600160a01b0316639e9307f86007546001016040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612e0e57600080fd5b505afa158015612e22573d6000803e3d6000fd5b505050506040513d6020811015612e3857600080fd5b505115612bac57612bac600754600101612f9e565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612e9f908490613de4565b505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526114ca908590613de4565b6001600160a01b038116612f435760405162461bcd60e51b81526004018080602001828103825260268152602001806140106026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600a60205260409020600101546130b15760015460025460408051638b6ea7bb60e01b81526001600160a01b03928316600482015290519190921691638b6ea7bb916024808301926020929190829003018186803b15801561300457600080fd5b505afa158015613018573d6000803e3d6000fd5b505050506040513d602081101561302e57600080fd5b50516040805163712d52fd60e11b815290516001600160a01b039092169163e25aa5fa91600480820192602092909190829003018186803b15801561307257600080fd5b505afa158015613086573d6000803e3d6000fd5b505050506040513d602081101561309c57600080fd5b50516000828152600a60205260409020600101555b60015460025460408051638b6ea7bb60e01b81526001600160a01b03928316600482015290516000939290921691638b6ea7bb91602480820192602092909190829003018186803b15801561310557600080fd5b505afa158015613119573d6000803e3d6000fd5b505050506040513d602081101561312f57600080fd5b505160408051630d33843160e21b815290516001600160a01b03909216916334ce10c491600480820192602092909190829003018186803b15801561317357600080fd5b505afa158015613187573d6000803e3d6000fd5b505050506040513d602081101561319d57600080fd5b5051600083815260096020908152604080832054600a83528184206001810154905483516314527a3d60e31b81526004810192909252602482015291519495509293730836e32f1f91db939d58a0763cbd38a28a8688fa9363d05c78da939092859263a293d1e892604480840193919291829003018186803b15801561322257600080fd5b505af4158015613236573d6000803e3d6000fd5b505050506040513d602081101561324c57600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152516044808301926020929190829003018186803b15801561329357600080fd5b505af41580156132a7573d6000803e3d6000fd5b505050506040513d60208110156132bd57600080fd5b50516004805460408051639a47903d60e01b815292830187905260006024840181905290519394509283926001600160a01b0390921691639a47903d916044808301926020929190829003018186803b15801561331957600080fd5b505afa15801561332d573d6000803e3d6000fd5b505050506040513d602081101561334357600080fd5b5051905060005b600c54811015613b1b57600454600c80546000926001600160a01b03169163366bd121918a91908690811061337b57fe5b90600052602060002001546040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156133c157600080fd5b505afa1580156133d5573d6000803e3d6000fd5b505050506040513d60208110156133eb57600080fd5b50516040805163682e3c6d60e11b815260048101929092526024820188905251730836e32f1f91db939d58a0763cbd38a28a8688fa9163d05c78da916044808301926020929190829003018186803b15801561344657600080fd5b505af415801561345a573d6000803e3d6000fd5b505050506040513d602081101561347057600080fd5b505160408051632d64c7df60e21b81526004810192909252670de0b6b3a7640000602483015251730836e32f1f91db939d58a0763cbd38a28a8688fa9163b5931f7c916044808301926020929190829003018186803b1580156134d257600080fd5b505af41580156134e6573d6000803e3d6000fd5b505050506040513d60208110156134fc57600080fd5b50516000888152600a6020908152604080832054815163682e3c6d60e11b815260048101869052602481019190915290519394509192730836e32f1f91db939d58a0763cbd38a28a8688fa9263d05c78da926044808301939192829003018186803b15801561356a57600080fd5b505af415801561357e573d6000803e3d6000fd5b505050506040513d602081101561359457600080fd5b5051600c8054730836e32f1f91db939d58a0763cbd38a28a8688fa9263d05c78da929091879081106135c257fe5b90600052602060002001546040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561360857600080fd5b505af415801561361c573d6000803e3d6000fd5b505050506040513d602081101561363257600080fd5b50516003546040805163039dd49d60e21b81529051730836e32f1f91db939d58a0763cbd38a28a8688fa9363b5931f7c9390926001600160a01b0390911691630e77527491600480820192602092909190829003018186803b15801561369757600080fd5b505afa1580156136ab573d6000803e3d6000fd5b505050506040513d60208110156136c157600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152516044808301926020929190829003018186803b15801561370857600080fd5b505af415801561371c573d6000803e3d6000fd5b505050506040513d602081101561373257600080fd5b5051600454600c80549293506000926001600160a01b0390921691639a47903d918c918890811061375f57fe5b90600052602060002001546040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156137a557600080fd5b505afa1580156137b9573d6000803e3d6000fd5b505050506040513d60208110156137cf57600080fd5b505190506001600160a01b03811615613b1057868211156137ee578691505b604080516314527a3d60e31b815260048101899052602481018490529051730836e32f1f91db939d58a0763cbd38a28a8688fa9163a293d1e8916044808301926020929190829003018186803b15801561384757600080fd5b505af415801561385b573d6000803e3d6000fd5b505050506040513d602081101561387157600080fd5b505160008a8152600a602090815260409182902054825163682e3c6d60e11b81526004810188905260248101919091529151929950730836e32f1f91db939d58a0763cbd38a28a8688fa9263d05c78da926044808201939291829003018186803b1580156138de57600080fd5b505af41580156138f2573d6000803e3d6000fd5b505050506040513d602081101561390857600080fd5b50516040805163e6cb901360e01b815260048101929092526024820184905251730836e32f1f91db939d58a0763cbd38a28a8688fa9163e6cb9013916044808301926020929190829003018186803b15801561396357600080fd5b505af4158015613977573d6000803e3d6000fd5b505050506040513d602081101561398d57600080fd5b505160008a8152600a6020908152604091829020600101548251632d64c7df60e21b8152600481019490945260248401529051730836e32f1f91db939d58a0763cbd38a28a8688fa9263b5931f7c926044808301939192829003018186803b1580156139f857600080fd5b505af4158015613a0c573d6000803e3d6000fd5b505050506040513d6020811015613a2257600080fd5b50516040805163dcc1692960e01b81526004810183905290519194506001600160a01b0383169163dcc169299160248082019260009290919082900301818387803b158015613a7057600080fd5b505af1158015613a84573d6000803e3d6000fd5b50506040805163e6cb901360e01b8152600481018a9052602481018790529051730836e32f1f91db939d58a0763cbd38a28a8688fa935063e6cb901392506044808301926020929190829003018186803b158015613ae157600080fd5b505af4158015613af5573d6000803e3d6000fd5b505050506040513d6020811015613b0b57600080fd5b505195505b50505060010161334a565b506001600160a01b03811615613cab576000858152600960209081526040918290205482516314527a3d60e31b81526004810191909152602481018590529151730836e32f1f91db939d58a0763cbd38a28a8688fa9263a293d1e8926044808301939192829003018186803b158015613b9357600080fd5b505af4158015613ba7573d6000803e3d6000fd5b505050506040513d6020811015613bbd57600080fd5b50516040805163dcc1692960e01b81526004810183905290519194506001600160a01b0383169163dcc169299160248082019260009290919082900301818387803b158015613c0b57600080fd5b505af1158015613c1f573d6000803e3d6000fd5b50506040805163e6cb901360e01b815260048101869052602481018790529051730836e32f1f91db939d58a0763cbd38a28a8688fa935063e6cb901392506044808301926020929190829003018186803b158015613c7c57600080fd5b505af4158015613c90573d6000803e3d6000fd5b505050506040513d6020811015613ca657600080fd5b505191505b600085815260096020526040902054821015613dd8576000858152600960209081526040918290205482516314527a3d60e31b81526004810191909152602481018590529151730836e32f1f91db939d58a0763cbd38a28a8688fa9263a293d1e8926044808301939192829003018186803b158015613d2957600080fd5b505af4158015613d3d573d6000803e3d6000fd5b505050506040513d6020811015613d5357600080fd5b50516006549092506001600160a01b0316613db5576040805162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207969656c6420696e74657265737420706f6f6c0000000000604482015290519081900360640190fd5b600654600254613dd8916001600160a01b0391821691168463ffffffff612e4d16565b50505060079190915550565b613df6826001600160a01b0316613f9c565b613e47576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613e855780518252601f199092019160209182019101613e66565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613ee7576040519150601f19603f3d011682016040523d82523d6000602084013e613eec565b606091505b509150915081613f43576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156114ca57808060200190516020811015613f5f57600080fd5b50516114ca5760405162461bcd60e51b815260040180806020018281038252602a815260200180614056602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590613fd05750808214155b949350505050565b5080546000825590600052602060002090810190612bac91906114dd91905b8082111561400b5760008155600101613ff7565b509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72305820ed8551ea6de30db057149822b91e105cabce63e705eb93262afa536e8724443064736f6c634300050a00320000000000000000000000005dbcf33d8c2e976c6b560249878e6f1491bca25c0000000000000000000000000d9ba4125d0465b918d89033d8937233181097bb0000000000000000000000004775d2b1a3f582b3153e8b78a5c5337036d35f5400000000000000000000000092a5935d6d741c59aeffc705afa1266441670498
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018d5760003560e01c80638ec4255f116100de578063aad3ec9611610097578063dbd9d77211610071578063dbd9d77214610471578063e31d48ad146104a7578063f2fde38b146104ca578063f51f7496146104f05761018d565b8063aad3ec9614610417578063cb7e905714610443578063d70d642c1461044b5761018d565b80638ec4255f146103a85780639dca0032146103b05780639ff60825146103b8578063a1054449146103c0578063a15143cd146103dd578063a915190d146103fa5761018d565b8063390f28af1161014b5780634b832735116101255780634b832735146102ae5780635a2dfd4914610351578063856c19311461036e5780638da5cb5b146103a05761018d565b8063390f28af1461024f5780633f3a502714610280578063485040fb146102a65761018d565b8062300a45146101925780630ab505b8146101b65780631a34fe81146101de57806321ace470146101f85780632e96b1191461021557806335b0186b1461021d575b600080fd5b61019a6104f8565b604080516001600160a01b039092168252519081900360200190f35b6101dc600480360360208110156101cc57600080fd5b50356001600160a01b0316610507565b005b6101e66105b7565b60408051918252519081900360200190f35b6101e66004803603602081101561020e57600080fd5b50356105bd565b6101dc6105cf565b6101dc6004803603606081101561023357600080fd5b506001600160a01b0381351690602081013590604001356105d9565b61026c6004803603602081101561026557600080fd5b50356106f1565b604080519115158252519081900360200190f35b6101dc6004803603602081101561029657600080fd5b50356001600160a01b031661073b565b61019a611204565b6101dc600480360360208110156102c457600080fd5b8101906020810181356401000000008111156102df57600080fd5b8201836020820111156102f157600080fd5b8035906020019184602083028401116401000000008311171561031357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611213945050505050565b6101dc6004803603602081101561036757600080fd5b5035611423565b6101dc6004803603606081101561038457600080fd5b506001600160a01b0381351690602081013590604001356114b7565b61019a6114d0565b6101e66114e0565b61019a6114e6565b61019a6114f5565b6101e6600480360360208110156103d657600080fd5b5035611504565b61019a600480360360208110156103f357600080fd5b5035611522565b61026c6004803603602081101561041057600080fd5b5035611535565b6101dc6004803603604081101561042d57600080fd5b506001600160a01b03813516906020013561154a565b61019a612094565b6101dc6004803603602081101561046157600080fd5b50356001600160a01b03166120a3565b61048e6004803603602081101561048757600080fd5b503561219d565b6040805192835260208301919091528051918290030190f35b61019a600480360360408110156104bd57600080fd5b50803590602001356121b6565b6101dc600480360360208110156104e057600080fd5b50356001600160a01b0316612b56565b61019a612baf565b6004546001600160a01b031681565b6000546001600160a01b03163314610554576040805162461bcd60e51b81526020600482018190526024820152600080516020614036833981519152604482015290519081900360640190fd5b600580546001600160a01b038381166001600160a01b0319831681179093556040805191909216808252602082019390935281517fcad549da2d36afbab0724050a4aad5b767ad5affe3e8fff14dc3ceb87174c2e4929181900390910190a15050565b60085481565b60096020526000908152604090205481565b6105d7612bbe565b565b604080516370a0823160e01b815233600482015290516000916001600160a01b038616916370a0823191602480820192602092909190829003018186803b15801561062357600080fd5b505afa158015610637573d6000803e3d6000fd5b505050506040513d602081101561064d57600080fd5b5051905061065b848261154a565b600254604080516370a0823160e01b815233600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d60208110156106d057600080fd5b50519050828111156106df5750815b6106e981856121b6565b505050505050565b6000805b600c548110156107305782600c828154811061070d57fe5b90600052602060002001541415610728576001915050610736565b6001016106f5565b50600090505b919050565b60048054604080516317f4ab1760e01b81526001600160a01b03858116948201949094529051600093909216916317f4ab1791602480820192602092909190829003018186803b15801561078e57600080fd5b505afa1580156107a2573d6000803e3d6000fd5b505050506040513d60208110156107b857600080fd5b5051905080610809576040805162461bcd60e51b8152602060048201526018602482015277696e76616c6964206c7020746f6b656e206164647265737360401b604482015290519081900360640190fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b15801561085357600080fd5b505afa158015610867573d6000803e3d6000fd5b505050506040513d602081101561087d57600080fd5b50519050806108cb576040805162461bcd60e51b81526020600482015260156024820152741b9bc8189a5908185d081d1a1a5cc81c195c9a5bd9605a1b604482015290519081900360640190fd5b6108d3612bbe565b6000836001600160a01b031663599b83fa6040518163ffffffff1660e01b815260040160206040518083038186803b15801561090e57600080fd5b505afa158015610922573d6000803e3d6000fd5b505050506040513d602081101561093857600080fd5b50516004805460408051630430a36960e11b8152905193945084936001600160a01b039092169263086146d2928282019260209290829003018186803b15801561098157600080fd5b505afa158015610995573d6000803e3d6000fd5b505050506040513d60208110156109ab57600080fd5b5051106109f7576040805162461bcd60e51b8152602060048201526015602482015274706572696f64207365616c656420616c726561647960581b604482015290519081900360640190fd5b6040805163079cc67960e41b81523360048201526024810184905290516001600160a01b038616916379cc679091604480830192600092919082900301818387803b158015610a4557600080fd5b505af1158015610a59573d6000803e3d6000fd5b505060015460025460408051638b6ea7bb60e01b81526001600160a01b039283166004820152905160009550919092169250638b6ea7bb91602480820192602092909190829003018186803b158015610ab157600080fd5b505afa158015610ac5573d6000803e3d6000fd5b505050506040513d6020811015610adb57600080fd5b505160408051630d33843160e21b815290516001600160a01b03909216916334ce10c491600480820192602092909190829003018186803b158015610b1f57600080fd5b505afa158015610b33573d6000803e3d6000fd5b505050506040513d6020811015610b4957600080fd5b50516040805163682e3c6d60e11b815260048101869052602481018390529051919250600091730836e32f1f91db939d58a0763cbd38a28a8688fa9163d05c78da916044808301926020929190829003018186803b158015610baa57600080fd5b505af4158015610bbe573d6000803e3d6000fd5b505050506040513d6020811015610bd457600080fd5b505160408051632d64c7df60e21b81526004810192909252670de0b6b3a7640000602483015251730836e32f1f91db939d58a0763cbd38a28a8688fa9163b5931f7c916044808301926020929190829003018186803b158015610c3657600080fd5b505af4158015610c4a573d6000803e3d6000fd5b505050506040513d6020811015610c6057600080fd5b50516000848152600960209081526040918290205482516314527a3d60e31b81526004810191909152602481018490529151929350730836e32f1f91db939d58a0763cbd38a28a8688fa9263a293d1e8926044808201939291829003018186803b158015610ccd57600080fd5b505af4158015610ce1573d6000803e3d6000fd5b505050506040513d6020811015610cf757600080fd5b50516000848152600960209081526040918290209290925560035481516336b650bf60e11b815291516001600160a01b0390911692636d6ca17e9260048082019391829003018186803b158015610d4d57600080fd5b505afa158015610d61573d6000803e3d6000fd5b505050506040513d6020811015610d7757600080fd5b505115801590610dff5750600354604080516346cc0e0d60e01b815290516000926001600160a01b0316916346cc0e0d916004808301926020929190829003018186803b158015610dc757600080fd5b505afa158015610ddb573d6000803e3d6000fd5b505050506040513d6020811015610df157600080fd5b50516001600160a01b031614155b1561119057600354604080516336b650bf60e11b81529051600092730836e32f1f91db939d58a0763cbd38a28a8688fa9263d05c78da9286926001600160a01b031691636d6ca17e916004808301926020929190829003018186803b158015610e6757600080fd5b505afa158015610e7b573d6000803e3d6000fd5b505050506040513d6020811015610e9157600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152516044808301926020929190829003018186803b158015610ed857600080fd5b505af4158015610eec573d6000803e3d6000fd5b505050506040513d6020811015610f0257600080fd5b50516003546040805163039dd49d60e21b81529051730836e32f1f91db939d58a0763cbd38a28a8688fa9363b5931f7c9390926001600160a01b0390911691630e77527491600480820192602092909190829003018186803b158015610f6757600080fd5b505afa158015610f7b573d6000803e3d6000fd5b505050506040513d6020811015610f9157600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152516044808301926020929190829003018186803b158015610fd857600080fd5b505af4158015610fec573d6000803e3d6000fd5b505050506040513d602081101561100257600080fd5b5051604080516314527a3d60e31b815260048101859052602481018390529051919250600091730836e32f1f91db939d58a0763cbd38a28a8688fa9163a293d1e8916044808301926020929190829003018186803b15801561106357600080fd5b505af4158015611077573d6000803e3d6000fd5b505050506040513d602081101561108d57600080fd5b50516002549091506110af906001600160a01b0316338363ffffffff612e4d16565b600354604080516346cc0e0d60e01b8152905161113a926001600160a01b0316916346cc0e0d916004808301926020929190829003018186803b1580156110f557600080fd5b505afa158015611109573d6000803e3d6000fd5b505050506040513d602081101561111f57600080fd5b50516002546001600160a01b0316908463ffffffff612e4d16565b60408051338152602081018390528082018490526001600160a01b038a16606082015290517ff374f92bc383bc88bd0e236b68be15d31b4a66cec5df7cca73c02c451422b0f09181900360800190a150506106e9565b6002546111ad906001600160a01b0316338363ffffffff612e4d16565b60408051338152602081018390526000818301526001600160a01b038816606082015290517ff374f92bc383bc88bd0e236b68be15d31b4a66cec5df7cca73c02c451422b0f09181900360800190a1505050505050565b6005546001600160a01b031681565b6000546001600160a01b03163314611260576040805162461bcd60e51b81526020600482018190526024820152600080516020614036833981519152604482015290519081900360640190fd5b60005b600c548110156112a957600b6000600c838154811061127e57fe5b600091825260208083209091015483528201929092526040019020805460ff19169055600101611263565b506112b6600c6000613fd8565b60005b81518110156113a9578015611338578160018203815181106112d757fe5b60200260200101518282815181106112eb57fe5b602002602001015111611338576040805162461bcd60e51b815260206004820152601060248201526f1cda1bdd5b1908189948185cd8d95b9960821b604482015290519081900360640190fd5b600c82828151811061134657fe5b6020908102919091018101518254600181810185556000948552928420015583519091600b9185908590811061137857fe5b6020908102919091018101518252810191909152604001600020805460ff19169115159190911790556001016112b9565b507f83fe8649d01435d9da2bb5a1107711cd2b3a3cf482768c13067fb12752c76829600c6040518080602001828103825283818154815260200191508054801561141257602002820191906000526020600020905b8154815260200190600101908083116113fe575b50509250505060405180910390a150565b6000546001600160a01b03163314611470576040805162461bcd60e51b81526020600482018190526024820152600080516020614036833981519152604482015290519081900360640190fd5b6008805490829055604080518281526020810184905281517fda1ac08e19cf366ae5b5feb717776ca672304e55946e9640989edad1d94900b5929181900390910190a15050565b6114c08361073b565b6114ca82826121b6565b50505050565b6000546001600160a01b03165b90565b60075481565b6003546001600160a01b031681565b6006546001600160a01b031681565b600c818154811061151157fe5b600091825260209091200154905081565b600061152f8260006121b6565b92915050565b600b6020526000908152604090205460ff1681565b60048054604080516317f4ab1760e01b81526001600160a01b03868116948201949094529051600093909216916317f4ab1791602480820192602092909190829003018186803b15801561159d57600080fd5b505afa1580156115b1573d6000803e3d6000fd5b505050506040513d60208110156115c757600080fd5b5051905080611618576040805162461bcd60e51b8152602060048201526018602482015277696e76616c6964206c7020746f6b656e206164647265737360401b604482015290519081900360640190fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038616916370a0823191602480820192602092909190829003018186803b15801561166257600080fd5b505afa158015611676573d6000803e3d6000fd5b505050506040513d602081101561168c57600080fd5b50519050828110156116e5576040805162461bcd60e51b815260206004820152601c60248201527f6e6f20656e6f75676820626964206174207468697320706572696f6400000000604482015290519081900360640190fd5b6116ed612bbe565b6004805460408051632ccdc1fd60e11b815290516001600160a01b0392831693639e9307f89389169263599b83fa9281830192602092829003018186803b15801561173757600080fd5b505afa15801561174b573d6000803e3d6000fd5b505050506040513d602081101561176157600080fd5b5051604080516001600160e01b031960e085901b1681526004810192909252516024808301926020929190829003018186803b1580156117a057600080fd5b505afa1580156117b4573d6000803e3d6000fd5b505050506040513d60208110156117ca57600080fd5b505161180e576040805162461bcd60e51b815260206004820152600e60248201526d1c195c9a5bd9081b9bdd08195b9960921b604482015290519081900360640190fd5b6000846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561184957600080fd5b505afa15801561185d573d6000803e3d6000fd5b505050506040513d602081101561187357600080fd5b5051604080516325788f6d60e01b815290519192506000916001600160a01b038816916325788f6d916004808301926020929190829003018186803b1580156118bb57600080fd5b505afa1580156118cf573d6000803e3d6000fd5b505050506040513d60208110156118e557600080fd5b50516040805163079cc67960e41b81523360048201526024810188905290519192506001600160a01b038816916379cc67909160448082019260009290919082900301818387803b15801561193957600080fd5b505af115801561194d573d6000803e3d6000fd5b50505050600085730836e32f1f91db939d58a0763cbd38a28a8688fa63d05c78da9091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156119ac57600080fd5b505af41580156119c0573d6000803e3d6000fd5b505050506040513d60208110156119d657600080fd5b505160408051632d64c7df60e21b815260048101929092526024820185905251730836e32f1f91db939d58a0763cbd38a28a8688fa9163b5931f7c916044808301926020929190829003018186803b158015611a3157600080fd5b505af4158015611a45573d6000803e3d6000fd5b505050506040513d6020811015611a5b57600080fd5b5051604080516314527a3d60e31b8152600481018590526024810183905290519192506001600160a01b0389169163dcc1692991730836e32f1f91db939d58a0763cbd38a28a8688fa9163a293d1e891604480820192602092909190829003018186803b158015611acb57600080fd5b505af4158015611adf573d6000803e3d6000fd5b505050506040513d6020811015611af557600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015611b3557600080fd5b505af1158015611b49573d6000803e3d6000fd5b50505050600360009054906101000a90046001600160a01b03166001600160a01b03166370f9e52f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b9b57600080fd5b505afa158015611baf573d6000803e3d6000fd5b505050506040513d6020811015611bc557600080fd5b505115801590611c4d5750600354604080516346cc0e0d60e01b815290516000926001600160a01b0316916346cc0e0d916004808301926020929190829003018186803b158015611c1557600080fd5b505afa158015611c29573d6000803e3d6000fd5b505050506040513d6020811015611c3f57600080fd5b50516001600160a01b031614155b15611f9957600354604080516370f9e52f60e01b81529051600092730836e32f1f91db939d58a0763cbd38a28a8688fa9263d05c78da9286926001600160a01b0316916370f9e52f916004808301926020929190829003018186803b158015611cb557600080fd5b505afa158015611cc9573d6000803e3d6000fd5b505050506040513d6020811015611cdf57600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152516044808301926020929190829003018186803b158015611d2657600080fd5b505af4158015611d3a573d6000803e3d6000fd5b505050506040513d6020811015611d5057600080fd5b50516003546040805163039dd49d60e21b81529051730836e32f1f91db939d58a0763cbd38a28a8688fa9363b5931f7c9390926001600160a01b0390911691630e77527491600480820192602092909190829003018186803b158015611db557600080fd5b505afa158015611dc9573d6000803e3d6000fd5b505050506040513d6020811015611ddf57600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152516044808301926020929190829003018186803b158015611e2657600080fd5b505af4158015611e3a573d6000803e3d6000fd5b505050506040513d6020811015611e5057600080fd5b5051604080516314527a3d60e31b815260048101859052602481018390529051919250600091730836e32f1f91db939d58a0763cbd38a28a8688fa9163a293d1e8916044808301926020929190829003018186803b158015611eb157600080fd5b505af4158015611ec5573d6000803e3d6000fd5b505050506040513d6020811015611edb57600080fd5b5051600254909150611efd906001600160a01b0316338363ffffffff612e4d16565b600354604080516346cc0e0d60e01b81529051611f43926001600160a01b0316916346cc0e0d916004808301926020929190829003018186803b1580156110f557600080fd5b604080513381526001600160a01b038b1660208201528082018390526060810184905290517f196b9a835b8ddc6f4190f9ecf4d1788a7ef43c114f3f21bb69b85b7bc35456db9181900360800190a15050612006565b600254611fb6906001600160a01b0316338363ffffffff612e4d16565b604080513381526001600160a01b03891660208201528082018390526000606082015290517f196b9a835b8ddc6f4190f9ecf4d1788a7ef43c114f3f21bb69b85b7bc35456db9181900360800190a15b6005546001600160a01b03161561208b57600554604080516327f2f38b60e11b81523360048201526001600160a01b038a81166024830152604482018a905291519190921691634fe5e71691606480830192600092919082900301818387803b15801561207257600080fd5b505af1158015612086573d6000803e3d6000fd5b505050505b50505050505050565b6001546001600160a01b031681565b6000546001600160a01b031633146120f0576040805162461bcd60e51b81526020600482018190526024820152600080516020614036833981519152604482015290519081900360640190fd5b6001600160a01b03811661213a576040805162461bcd60e51b815260206004820152600c60248201526b1a5b9d985b1a59081c1bdbdb60a21b604482015290519081900360640190fd5b600680546001600160a01b038381166001600160a01b0319831681179093556040805191909216808252602082019390935281517f652007bf928e65eb823aa08d80f212e3dda774b35be23c9d5345aee033ca8ba9929181900390910190a15050565b600a602052600090815260409020805460019091015482565b60008115806121c957506121c9826106f1565b61220e576040805162461bcd60e51b81526020600482015260116024820152706e6f7420737570706f727420726174696f60781b604482015290519081900360640190fd5b6004805460408051631103b6ab60e01b8152928301859052805160009384936001600160a01b031692631103b6ab9260248084019382900301818787803b15801561225857600080fd5b505af115801561226c573d6000803e3d6000fd5b505050506040513d604081101561228257600080fd5b50805160209091015190925090508015612314576005546001600160a01b031615612314576005546040805163071a099360e21b81523360048201526001600160a01b03858116602483015291519190921691631c68264c91604480830192600092919082900301818387803b1580156122fb57600080fd5b505af115801561230f573d6000803e3d6000fd5b505050505b600854156124be57600854851115612366576040805162461bcd60e51b815260206004820152601060248201526f1d1bdbc81b185c99d948185b5bdd5b9d60821b604482015290519081900360640190fd5b600854604080516370a0823160e01b81523360048201529051730836e32f1f91db939d58a0763cbd38a28a8688fa9163e6cb90139189916001600160a01b038816916370a0823191602480820192602092909190829003018186803b1580156123ce57600080fd5b505afa1580156123e2573d6000803e3d6000fd5b505050506040513d60208110156123f857600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152516044808301926020929190829003018186803b15801561243f57600080fd5b505af4158015612453573d6000803e3d6000fd5b505050506040513d602081101561246957600080fd5b505111156124be576040805162461bcd60e51b815260206004820152601960248201527f706c656173652075736520616e6f746865722077616c6c657400000000000000604482015290519081900360640190fd5b6124c6612bbe565b60025460408051636eb1769f60e11b8152336004820152306024820152905187926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b15801561251657600080fd5b505afa15801561252a573d6000803e3d6000fd5b505050506040513d602081101561254057600080fd5b5051101561258c576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f75676820616c6c6f77616e636560601b604482015290519081900360640190fd5b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156125d757600080fd5b505afa1580156125eb573d6000803e3d6000fd5b505050506040513d602081101561260157600080fd5b5051600254909150612624906001600160a01b031633308963ffffffff612ea416565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561266f57600080fd5b505afa158015612683573d6000803e3d6000fd5b505050506040513d602081101561269957600080fd5b5051604080516314527a3d60e31b815260048101839052602481018590529051919250730836e32f1f91db939d58a0763cbd38a28a8688fa9163a293d1e891604480820192602092909190829003018186803b1580156126f857600080fd5b505af415801561270c573d6000803e3d6000fd5b505050506040513d602081101561272257600080fd5b505160015460025460408051638b6ea7bb60e01b81526001600160a01b0392831660048201529051939a506000939190921691638b6ea7bb916024808301926020929190829003018186803b15801561277a57600080fd5b505afa15801561278e573d6000803e3d6000fd5b505050506040513d60208110156127a457600080fd5b505160408051630d33843160e21b815290516001600160a01b03909216916334ce10c491600480820192602092909190829003018186803b1580156127e857600080fd5b505afa1580156127fc573d6000803e3d6000fd5b505050506040513d602081101561281257600080fd5b50519050670de0b6b3a7640000811115612867576040805162461bcd60e51b8152602060048201526011602482015270646563696d616c20746f6f206c6172676560781b604482015290519081900360640190fd5b600088730836e32f1f91db939d58a0763cbd38a28a8688fa63d05c78da9091670de0b6b3a76400006040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156128ca57600080fd5b505af41580156128de573d6000803e3d6000fd5b505050506040513d60208110156128f457600080fd5b505160408051632d64c7df60e21b815260048101929092526024820184905251730836e32f1f91db939d58a0763cbd38a28a8688fa9163b5931f7c916044808301926020929190829003018186803b15801561294f57600080fd5b505af4158015612963573d6000803e3d6000fd5b505050506040513d602081101561297957600080fd5b505160408051632ccdc1fd60e11b815290519192506000916001600160a01b0389169163599b83fa916004808301926020929190829003018186803b1580156129c157600080fd5b505afa1580156129d5573d6000803e3d6000fd5b505050506040513d60208110156129eb57600080fd5b505160008181526009602090815260409182902054825163e6cb901360e01b81526004810191909152602481018e90529151929350730836e32f1f91db939d58a0763cbd38a28a8688fa9263e6cb9013926044808201939291829003018186803b158015612a5857600080fd5b505af4158015612a6c573d6000803e3d6000fd5b505050506040513d6020811015612a8257600080fd5b50516000828152600960205260408082209290925581516340c10f1960e01b81523360048201526024810185905291516001600160a01b038a16926340c10f1992604480830193919282900301818387803b158015612ae057600080fd5b505af1158015612af4573d6000803e3d6000fd5b505060408051338152602081018e90528082018d90526001600160a01b038b16606082015290517f742c09c9d5cc7bf5493cf3d9a71592931c4d1d565ec72314a58715d0385182a59350908190036080019150a1509498975050505050505050565b6000546001600160a01b03163314612ba3576040805162461bcd60e51b81526020600482018190526024820152600080516020614036833981519152604482015290519081900360640190fd5b612bac81612efe565b50565b6002546001600160a01b031681565b6004805460408051632e96b11960e01b815290516001600160a01b0390921692632e96b1199282820192602092908290030181600087803b158015612c0257600080fd5b505af1158015612c16573d6000803e3d6000fd5b505050506040513d6020811015612c2c57600080fd5b50506004805460408051630430a36960e11b815290516000936001600160a01b039093169263086146d292808201926020929091829003018186803b158015612c7457600080fd5b505afa158015612c88573d6000803e3d6000fd5b505050506040513d6020811015612c9e57600080fd5b50516000818152600a6020526040902054909150612db05760015460025460408051638b6ea7bb60e01b81526001600160a01b03928316600482015290519190921691638b6ea7bb916024808301926020929190829003018186803b158015612d0657600080fd5b505afa158015612d1a573d6000803e3d6000fd5b505050506040513d6020811015612d3057600080fd5b50516040805163712d52fd60e11b815290516001600160a01b039092169163e25aa5fa91600480820192602092909190829003018186803b158015612d7457600080fd5b505afa158015612d88573d6000803e3d6000fd5b505050506040513d6020811015612d9e57600080fd5b50516000828152600a60205260409020555b600460009054906101000a90046001600160a01b03166001600160a01b0316639e9307f86007546001016040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612e0e57600080fd5b505afa158015612e22573d6000803e3d6000fd5b505050506040513d6020811015612e3857600080fd5b505115612bac57612bac600754600101612f9e565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612e9f908490613de4565b505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526114ca908590613de4565b6001600160a01b038116612f435760405162461bcd60e51b81526004018080602001828103825260268152602001806140106026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600a60205260409020600101546130b15760015460025460408051638b6ea7bb60e01b81526001600160a01b03928316600482015290519190921691638b6ea7bb916024808301926020929190829003018186803b15801561300457600080fd5b505afa158015613018573d6000803e3d6000fd5b505050506040513d602081101561302e57600080fd5b50516040805163712d52fd60e11b815290516001600160a01b039092169163e25aa5fa91600480820192602092909190829003018186803b15801561307257600080fd5b505afa158015613086573d6000803e3d6000fd5b505050506040513d602081101561309c57600080fd5b50516000828152600a60205260409020600101555b60015460025460408051638b6ea7bb60e01b81526001600160a01b03928316600482015290516000939290921691638b6ea7bb91602480820192602092909190829003018186803b15801561310557600080fd5b505afa158015613119573d6000803e3d6000fd5b505050506040513d602081101561312f57600080fd5b505160408051630d33843160e21b815290516001600160a01b03909216916334ce10c491600480820192602092909190829003018186803b15801561317357600080fd5b505afa158015613187573d6000803e3d6000fd5b505050506040513d602081101561319d57600080fd5b5051600083815260096020908152604080832054600a83528184206001810154905483516314527a3d60e31b81526004810192909252602482015291519495509293730836e32f1f91db939d58a0763cbd38a28a8688fa9363d05c78da939092859263a293d1e892604480840193919291829003018186803b15801561322257600080fd5b505af4158015613236573d6000803e3d6000fd5b505050506040513d602081101561324c57600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152516044808301926020929190829003018186803b15801561329357600080fd5b505af41580156132a7573d6000803e3d6000fd5b505050506040513d60208110156132bd57600080fd5b50516004805460408051639a47903d60e01b815292830187905260006024840181905290519394509283926001600160a01b0390921691639a47903d916044808301926020929190829003018186803b15801561331957600080fd5b505afa15801561332d573d6000803e3d6000fd5b505050506040513d602081101561334357600080fd5b5051905060005b600c54811015613b1b57600454600c80546000926001600160a01b03169163366bd121918a91908690811061337b57fe5b90600052602060002001546040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156133c157600080fd5b505afa1580156133d5573d6000803e3d6000fd5b505050506040513d60208110156133eb57600080fd5b50516040805163682e3c6d60e11b815260048101929092526024820188905251730836e32f1f91db939d58a0763cbd38a28a8688fa9163d05c78da916044808301926020929190829003018186803b15801561344657600080fd5b505af415801561345a573d6000803e3d6000fd5b505050506040513d602081101561347057600080fd5b505160408051632d64c7df60e21b81526004810192909252670de0b6b3a7640000602483015251730836e32f1f91db939d58a0763cbd38a28a8688fa9163b5931f7c916044808301926020929190829003018186803b1580156134d257600080fd5b505af41580156134e6573d6000803e3d6000fd5b505050506040513d60208110156134fc57600080fd5b50516000888152600a6020908152604080832054815163682e3c6d60e11b815260048101869052602481019190915290519394509192730836e32f1f91db939d58a0763cbd38a28a8688fa9263d05c78da926044808301939192829003018186803b15801561356a57600080fd5b505af415801561357e573d6000803e3d6000fd5b505050506040513d602081101561359457600080fd5b5051600c8054730836e32f1f91db939d58a0763cbd38a28a8688fa9263d05c78da929091879081106135c257fe5b90600052602060002001546040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561360857600080fd5b505af415801561361c573d6000803e3d6000fd5b505050506040513d602081101561363257600080fd5b50516003546040805163039dd49d60e21b81529051730836e32f1f91db939d58a0763cbd38a28a8688fa9363b5931f7c9390926001600160a01b0390911691630e77527491600480820192602092909190829003018186803b15801561369757600080fd5b505afa1580156136ab573d6000803e3d6000fd5b505050506040513d60208110156136c157600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526024830191909152516044808301926020929190829003018186803b15801561370857600080fd5b505af415801561371c573d6000803e3d6000fd5b505050506040513d602081101561373257600080fd5b5051600454600c80549293506000926001600160a01b0390921691639a47903d918c918890811061375f57fe5b90600052602060002001546040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156137a557600080fd5b505afa1580156137b9573d6000803e3d6000fd5b505050506040513d60208110156137cf57600080fd5b505190506001600160a01b03811615613b1057868211156137ee578691505b604080516314527a3d60e31b815260048101899052602481018490529051730836e32f1f91db939d58a0763cbd38a28a8688fa9163a293d1e8916044808301926020929190829003018186803b15801561384757600080fd5b505af415801561385b573d6000803e3d6000fd5b505050506040513d602081101561387157600080fd5b505160008a8152600a602090815260409182902054825163682e3c6d60e11b81526004810188905260248101919091529151929950730836e32f1f91db939d58a0763cbd38a28a8688fa9263d05c78da926044808201939291829003018186803b1580156138de57600080fd5b505af41580156138f2573d6000803e3d6000fd5b505050506040513d602081101561390857600080fd5b50516040805163e6cb901360e01b815260048101929092526024820184905251730836e32f1f91db939d58a0763cbd38a28a8688fa9163e6cb9013916044808301926020929190829003018186803b15801561396357600080fd5b505af4158015613977573d6000803e3d6000fd5b505050506040513d602081101561398d57600080fd5b505160008a8152600a6020908152604091829020600101548251632d64c7df60e21b8152600481019490945260248401529051730836e32f1f91db939d58a0763cbd38a28a8688fa9263b5931f7c926044808301939192829003018186803b1580156139f857600080fd5b505af4158015613a0c573d6000803e3d6000fd5b505050506040513d6020811015613a2257600080fd5b50516040805163dcc1692960e01b81526004810183905290519194506001600160a01b0383169163dcc169299160248082019260009290919082900301818387803b158015613a7057600080fd5b505af1158015613a84573d6000803e3d6000fd5b50506040805163e6cb901360e01b8152600481018a9052602481018790529051730836e32f1f91db939d58a0763cbd38a28a8688fa935063e6cb901392506044808301926020929190829003018186803b158015613ae157600080fd5b505af4158015613af5573d6000803e3d6000fd5b505050506040513d6020811015613b0b57600080fd5b505195505b50505060010161334a565b506001600160a01b03811615613cab576000858152600960209081526040918290205482516314527a3d60e31b81526004810191909152602481018590529151730836e32f1f91db939d58a0763cbd38a28a8688fa9263a293d1e8926044808301939192829003018186803b158015613b9357600080fd5b505af4158015613ba7573d6000803e3d6000fd5b505050506040513d6020811015613bbd57600080fd5b50516040805163dcc1692960e01b81526004810183905290519194506001600160a01b0383169163dcc169299160248082019260009290919082900301818387803b158015613c0b57600080fd5b505af1158015613c1f573d6000803e3d6000fd5b50506040805163e6cb901360e01b815260048101869052602481018790529051730836e32f1f91db939d58a0763cbd38a28a8688fa935063e6cb901392506044808301926020929190829003018186803b158015613c7c57600080fd5b505af4158015613c90573d6000803e3d6000fd5b505050506040513d6020811015613ca657600080fd5b505191505b600085815260096020526040902054821015613dd8576000858152600960209081526040918290205482516314527a3d60e31b81526004810191909152602481018590529151730836e32f1f91db939d58a0763cbd38a28a8688fa9263a293d1e8926044808301939192829003018186803b158015613d2957600080fd5b505af4158015613d3d573d6000803e3d6000fd5b505050506040513d6020811015613d5357600080fd5b50516006549092506001600160a01b0316613db5576040805162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207969656c6420696e74657265737420706f6f6c0000000000604482015290519081900360640190fd5b600654600254613dd8916001600160a01b0391821691168463ffffffff612e4d16565b50505060079190915550565b613df6826001600160a01b0316613f9c565b613e47576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613e855780518252601f199092019160209182019101613e66565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613ee7576040519150601f19603f3d011682016040523d82523d6000602084013e613eec565b606091505b509150915081613f43576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156114ca57808060200190516020811015613f5f57600080fd5b50516114ca5760405162461bcd60e51b815260040180806020018281038252602a815260200180614056602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590613fd05750808214155b949350505050565b5080546000825590600052602060002090810190612bac91906114dd91905b8082111561400b5760008155600101613ff7565b509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72305820ed8551ea6de30db057149822b91e105cabce63e705eb93262afa536e8724443064736f6c634300050a0032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005dbcf33d8c2e976c6b560249878e6f1491bca25c0000000000000000000000000d9ba4125d0465b918d89033d8937233181097bb0000000000000000000000004775d2b1a3f582b3153e8b78a5c5337036d35f5400000000000000000000000092a5935d6d741c59aeffc705afa1266441670498
-----Decoded View---------------
Arg [0] : _token_addr (address): 0x5dbcF33D8c2E976c6b560249878e6F1491Bca25c
Arg [1] : _env (address): 0x0D9ba4125d0465B918D89033d8937233181097Bb
Arg [2] : _dispatcher (address): 0x4775D2B1A3f582b3153e8B78a5C5337036D35f54
Arg [3] : _period_token (address): 0x92a5935d6D741c59aeFFC705AfA1266441670498
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000005dbcf33d8c2e976c6b560249878e6f1491bca25c
Arg [1] : 0000000000000000000000000d9ba4125d0465b918d89033d8937233181097bb
Arg [2] : 0000000000000000000000004775d2b1a3f582b3153e8b78a5c5337036d35f54
Arg [3] : 00000000000000000000000092a5935d6d741c59aeffc705afa1266441670498
Deployed Bytecode Sourcemap
33098:9950:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33098:9950:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33295:32;;;:::i;:::-;;;;-1:-1:-1;;;;;33295:32:0;;;;;;;;;;;;;;34046:207;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34046:207:0;-1:-1:-1;;;;;34046:207:0;;:::i;:::-;;33454:25;;;:::i;:::-;;;;;;;;;;;;;;;;33570:55;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33570:55:0;;:::i;41004:64::-;;;:::i;39410:408::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39410:408:0;;-1:-1:-1;;;;;39410:408:0;;;;;;;;;;;:::i;40800:198::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40800:198:0;;:::i;:::-;;;;;;;;;;;;;;;;;;36315:1363;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36315:1363:0;-1:-1:-1;;;;;36315:1363:0;;:::i;33332:42::-;;;:::i;40369:425::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40369:425:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;40369:425:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40369:425:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;40369:425:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;40369:425:0;;-1:-1:-1;40369:425:0;;-1:-1:-1;;;;;40369:425:0:i;34312:162::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34312:162:0;;:::i;37684:168::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37684:168:0;;-1:-1:-1;;;;;37684:168:0;;;;;;;;;;;:::i;582:88::-;;;:::i;33420:29::-;;;:::i;33273:15::-;;;:::i;33379:34::-;;;:::i;40293:24::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40293:24:0;;:::i;36107:115::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36107:115:0;;:::i;40241:47::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40241:47:0;;:::i;37948:1456::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37948:1456:0;;-1:-1:-1;;;;;37948:1456:0;;;;;;:::i;33198:38::-;;;:::i;42807:236::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42807:236:0;-1:-1:-1;;;;;42807:236:0;;:::i;33630:59::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33630:59:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34569:1532;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34569:1532:0;;;;;;;:::i;1044:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1044:109:0;-1:-1:-1;;;;;1044:109:0;;:::i;33241:27::-;;;:::i;33295:32::-;;;-1:-1:-1;;;;;33295:32:0;;:::o;34046:207::-;803:15;;-1:-1:-1;;;;;803:15:0;822:10;803:29;795:74;;;;;-1:-1:-1;;;795:74:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;795:74:0;;;;;;;;;;;;;;;34136:13;;;-1:-1:-1;;;;;34157:46:0;;;-1:-1:-1;;;;;;34157:46:0;;;;;;;34215:32;;;34136:13;;;;34215:32;;;;;;;;;;;;;;;;;;;;;;;880:1;34046:207;:::o;33454:25::-;;;;:::o;33570:55::-;;;;;;;;;;;;;:::o;41004:64::-;41047:15;:13;:15::i;:::-;41004:64::o;39410:408::-;39540:44;;;-1:-1:-1;;;39540:44:0;;39573:10;39540:44;;;;;;-1:-1:-1;;;;;;;39540:32:0;;;-1:-1:-1;;39540:44:0;;;;;;;;;;;;;;;:32;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;39540:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39540:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39540:44:0;;-1:-1:-1;39591:29:0;39597:14;39540:44;39591:5;:29::i;:::-;39657:12;;39650:42;;;-1:-1:-1;;;39650:42:0;;39681:10;39650:42;;;;;;-1:-1:-1;;;;;;;39657:12:0;;-1:-1:-1;;39650:42:0;;;;;;;;;;;;;;39657:12;39650:42;;;5:2:-1;;;;30:1;27;20:12;5:2;39650:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39650:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39650:42:0;;-1:-1:-1;39702:29:0;;;39699:79;;;-1:-1:-1;39754:16:0;39699:79;39784:28;39793:10;39805:6;39784:8;:28::i;:::-;;39410:408;;;;;:::o;40800:198::-;40855:4;;40867:107;40887:7;:14;40883:18;;40867:107;;;40933:1;40919:7;40927:1;40919:10;;;;;;;;;;;;;;;;:15;40916:51;;;40953:4;40946:11;;;;;40916:51;40903:3;;40867:107;;;;40987:5;40980:12;;40800:198;;;;:::o;36315:1363::-;36387:12;;;:47;;;-1:-1:-1;;;36387:47:0;;-1:-1:-1;;;;;36387:47:0;;;;;;;;;;;;-1:-1:-1;;36387:12:0;;;;-1:-1:-1;;36387:47:0;;;;;;;;;;;;;;;:12;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;36387:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36387:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36387:47:0;;-1:-1:-1;36387:47:0;36441:45;;;;;-1:-1:-1;;;36441:45:0;;;;;;;;;;;;-1:-1:-1;;;36441:45:0;;;;;;;;;;;;;;;36510:44;;;-1:-1:-1;;;36510:44:0;;36543:10;36510:44;;;;;;-1:-1:-1;;;;;;;36510:32:0;;;-1:-1:-1;;36510:44:0;;;;;;;;;;;;;;;:32;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;36510:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36510:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36510:44:0;;-1:-1:-1;36569:10:0;36561:44;;;;;-1:-1:-1;;;36561:44:0;;;;;;;;;;;;-1:-1:-1;;;36561:44:0;;;;;;;;;;;;;;;36614:15;:13;:15::i;:::-;36638:14;36671;-1:-1:-1;;;;;36655:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36655:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36655:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36655:47:0;36717:12;;;:31;;;-1:-1:-1;;;36717:31:0;;;;36655:47;;-1:-1:-1;36655:47:0;;-1:-1:-1;;;;;36717:12:0;;;;:29;;:31;;;;36655:47;;36717:31;;;;;;:12;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;36717:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36717:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36717:31:0;:40;36709:86;;;;;-1:-1:-1;;;36709:86:0;;;;;;;;;;;;-1:-1:-1;;;36709:86:0;;;;;;;;;;;;;;;36804:60;;;-1:-1:-1;;;36804:60:0;;36845:10;36804:60;;;;;;;;;;;;-1:-1:-1;;;;;36804:40:0;;;;;:60;;;;;-1:-1:-1;;36804:60:0;;;;;;;-1:-1:-1;36804:40:0;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;36804:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;36891:10:0;;36917:12;;36891:39;;;-1:-1:-1;;;36891:39:0;;-1:-1:-1;;;;;36917:12:0;;;36891:39;;;;;;-1:-1:-1;;;36891:10:0;;;;;-1:-1:-1;;;36891:39:0;;;;;;;;;;;;;;;:10;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;36891:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36891:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36891:39:0;:52;;;-1:-1:-1;;;36891:52:0;;;;-1:-1:-1;;;;;36891:50:0;;;;;;:52;;;;;:39;;:52;;;;;;;;:50;:52;;;5:2:-1;;;;30:1;27;20:12;5:2;36891:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36891:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36891:52:0;36976:23;;;-1:-1:-1;;;36976:23:0;;;;;;;;;;;;;;;;36891:52;;-1:-1:-1;;;36976:14:0;;;;:23;;;;;36891:52;;36976:23;;;;;;;:14;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;36976:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36976:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36976:23:0;:37;;;-1:-1:-1;;;36976:37:0;;;;;;;;;37008:4;36976:37;;;;;:31;;;;:37;;;;;:23;;:37;;;;;;;:31;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;36976:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36976:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36976:37:0;37052:27;;;;:19;36976:37;37052:27;;;;;;;;;:50;;-1:-1:-1;;;37052:50:0;;;;;;;;;;;;;;;;;36976:37;;-1:-1:-1;37052:35:0;;;;:50;;;;;36976:37;37052:50;;;;;;:35;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;37052:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37052:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37052:50:0;37022:27;;;;:19;37052:50;37022:27;;;;;;;;:80;;;;37112:3;;:22;;-1:-1:-1;;;37112:22:0;;;;-1:-1:-1;;;;;37112:3:0;;;;:20;;:22;;;;;;;;;;;:3;:22;;;5:2:-1;;;;30:1;27;20:12;5:2;37112:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37112:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37112:22:0;:27;;;;:66;;-1:-1:-1;37143:3:0;;:19;;;-1:-1:-1;;;37143:19:0;;;;37174:3;;-1:-1:-1;;;;;37143:3:0;;-1:-1:-1;;37143:19:0;;;;;;;;;;;;;;:3;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;37143:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37143:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37143:19:0;-1:-1:-1;;;;;37143:35:0;;;37112:66;37109:562;;;37224:3;;:22;;;-1:-1:-1;;;37224:22:0;;;;37188:11;;37202:21;;;;:13;;-1:-1:-1;;;;;37224:3:0;;:20;;:22;;;;;;;;;;;;;;:3;:22;;;5:2:-1;;;;30:1;27;20:12;5:2;37224:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37224:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37224:22:0;37202:45;;;-1:-1:-1;37202:45:0;;;-1:-1:-1;;;;;;37202:45:0;;;;;;;;;;;;;;;;;;;;;;;37224:22;;37202:45;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;37202:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37202:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37202:45:0;37256:3;;:16;;;-1:-1:-1;;;37256:16:0;;;;37202:53;;;;:45;;-1:-1:-1;;;;;37256:3:0;;;;:14;;:16;;;;;37202:45;;37256:16;;;;;;;;:3;:16;;;5:2:-1;;;;30:1;27;20:12;5:2;37256:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37256:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37256:16:0;37202:71;;;-1:-1:-1;37202:71:0;;;-1:-1:-1;;;;;;37202:71:0;;;;;;;;;;;;;;;;;;;;;;;37256:16;;37202:71;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;37202:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37202:71:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37202:71:0;37297:26;;;-1:-1:-1;;;37297:26:0;;;;;;;;;;;;;;;;37202:71;;-1:-1:-1;;;37297:21:0;;;;:26;;;;;37202:71;;37297:26;;;;;;;:21;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;37297:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37297:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37297:26:0;37339:12;;37297:26;;-1:-1:-1;37332:51:0;;-1:-1:-1;;;;;37339:12:0;37366:10;37297:26;37332:33;:51::i;:::-;37426:3;;:19;;;-1:-1:-1;;;37426:19:0;;;;37392:59;;-1:-1:-1;;;;;37426:3:0;;-1:-1:-1;;37426:19:0;;;;;;;;;;;;;;:3;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;37426:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37426:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37426:19:0;37399:12;;-1:-1:-1;;;;;37399:12:0;;37447:3;37392:33;:59::i;:::-;37465:48;;;37475:10;37465:48;;;;;;;;;;;;;;-1:-1:-1;;;;;37465:48:0;;;;;;;;;;;;;;;;;37109:562;;;;;37541:12;;37534:60;;-1:-1:-1;;;;;37541:12:0;37568:10;37580:13;37534:33;:60::i;:::-;37608:55;;;37618:10;37608:55;;;;;;;;-1:-1:-1;37608:55:0;;;;-1:-1:-1;;;;;37608:55:0;;;;;;;;;;;;;;;;;36315:1363;;;;;;:::o;33332:42::-;;;-1:-1:-1;;;;;33332:42:0;;:::o;40369:425::-;803:15;;-1:-1:-1;;;;;803:15:0;822:10;803:29;795:74;;;;;-1:-1:-1;;;795:74:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;795:74:0;;;;;;;;;;;;;;;40445:6;40441:90;40461:7;:14;40457:18;;40441:90;;;40497:14;:26;40512:7;40520:1;40512:10;;;;;;;;;;;;;;;;;;;;40497:26;;;;;;;;;;;;40490:33;;-1:-1:-1;;40490:33:0;;;;40477:3;40441:90;;;-1:-1:-1;40537:14:0;40544:7;;40537:14;:::i;:::-;40562:6;40558:190;40578:2;:9;40574:1;:13;40558:190;;;40605:5;;40602:74;;40638:2;40643:1;40641;:3;40638:7;;;;;;;;;;;;;;40630:2;40633:1;40630:5;;;;;;;;;;;;;;:15;40622:44;;;;;-1:-1:-1;;;40622:44:0;;;;;;;;;;;;-1:-1:-1;;;40622:44:0;;;;;;;;;;;;;;;40684:7;40697:2;40700:1;40697:5;;;;;;;;;;;;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;40684:19:0;;;;;;;;40727:5;;39:1:-1;;40712:14:0;;40727:2;;40730:1;;40727:5;;;;;;;;;;;;;;;;;40712:21;;;;;;;;;;-1:-1:-1;40712:21:0;:28;;-1:-1:-1;;40712:28:0;;;;;;;;;;-1:-1:-1;40589:3:0;40558:190;;;;40759:29;40780:7;40759:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40369:425;:::o;34312:162::-;803:15;;-1:-1:-1;;;;;803:15:0;822:10;803:29;795:74;;;;;-1:-1:-1;;;795:74:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;795:74:0;;;;;;;;;;;;;;;34387:10;;;34404:20;;;;34436:32;;;;;;;;;;;;;;;;;;;;;;;;;880:1;34312:162;:::o;37684:168::-;37781:25;37791:14;37781:9;:25::i;:::-;37813:33;37822:11;37835:10;37813:8;:33::i;:::-;;37684:168;;;:::o;582:88::-;620:7;647:15;-1:-1:-1;;;;;647:15:0;582:88;;:::o;33420:29::-;;;;:::o;33273:15::-;;;-1:-1:-1;;;;;33273:15:0;;:::o;33379:34::-;;;-1:-1:-1;;;;;33379:34:0;;:::o;40293:24::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40293:24:0;:::o;36107:115::-;36160:21;36196:20;36205:7;36214:1;36196:8;:20::i;:::-;36189:27;36107:115;-1:-1:-1;;36107:115:0:o;40241:47::-;;;;;;;;;;;;;;;:::o;37948:1456::-;38034:12;;;:47;;;-1:-1:-1;;;38034:47:0;;-1:-1:-1;;;;;38034:47:0;;;;;;;;;;;;-1:-1:-1;;38034:12:0;;;;-1:-1:-1;;38034:47:0;;;;;;;;;;;;;;;:12;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;38034:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38034:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38034:47:0;;-1:-1:-1;38034:47:0;38088:45;;;;;-1:-1:-1;;;38088:45:0;;;;;;;;;;;;-1:-1:-1;;;38088:45:0;;;;;;;;;;;;;;;38157:44;;;-1:-1:-1;;;38157:44:0;;38190:10;38157:44;;;;;;-1:-1:-1;;;;;;;38157:32:0;;;-1:-1:-1;;38157:44:0;;;;;;;;;;;;;;;:32;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;38157:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38157:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38157:44:0;;-1:-1:-1;38216:17:0;;;;38208:58;;;;;-1:-1:-1;;;38208:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38275:15;:13;:15::i;:::-;38305:12;;;38330:47;;;-1:-1:-1;;;38330:47:0;;;;-1:-1:-1;;;;;38305:12:0;;;;:24;;38330:45;;;;;:47;;;;;;;;;;;:45;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;38330:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38330:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38330:47:0;38305:73;;;-1:-1:-1;38305:73:0;;;-1:-1:-1;;;;;;38305:73:0;;;;;;;;;;;;;;;;38330:47;;38305:73;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;38305:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38305:73:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38305:73:0;38297:100;;;;;-1:-1:-1;;;38297:100:0;;;;;;;;;;;;-1:-1:-1;;;38297:100:0;;;;;;;;;;;;;;;38406:10;38426:14;-1:-1:-1;;;;;38419:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38419:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38419:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38419:36:0;38477:52;;;-1:-1:-1;;;38477:52:0;;;;38419:36;;-1:-1:-1;38462:12:0;;-1:-1:-1;;;;;38477:50:0;;;-1:-1:-1;;38477:52:0;;;;;38419:36;;38477:52;;;;;;;:50;:52;;;5:2:-1;;;;30:1;27;20:12;5:2;38477:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38477:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38477:52:0;38536:61;;;-1:-1:-1;;;38536:61:0;;38577:10;38536:61;;;;;;;;;;;;38477:52;;-1:-1:-1;;;;;;38536:40:0;;;;;:61;;;;;-1:-1:-1;;38536:61:0;;;;;;;;-1:-1:-1;38536:40:0;:61;;;5:2:-1;;;;30:1;27;20:12;5:2;38536:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38536:61:0;;;;38604:6;38613:7;:15;;;;38629:7;38613:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38613:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38613:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38613:24:0;:39;;;-1:-1:-1;;;38613:39:0;;;;;;;;;;;;;;;;:32;;;;:39;;;;;:24;;:39;;;;;;;:32;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;38613:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38613:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38613:39:0;38712:18;;;-1:-1:-1;;;38712:18:0;;;;;;;;;;;;;;;;38613:39;;-1:-1:-1;;;;;;38659:52:0;;;;;38712:15;;;;:18;;;;;38613:39;;38712:18;;;;;;;;:15;:18;;;5:2:-1;;;;30:1;27;20:12;5:2;38712:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38712:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38712:18:0;38659:72;;;-1:-1:-1;38659:72:0;;;-1:-1:-1;;;;;;38659:72:0;;;;;;;;;;;;;;;;-1:-1:-1;;38659:72:0;;;;;;;-1:-1:-1;38659:72:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;38659:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;38743:3:0;;:24;;;-1:-1:-1;;;38743:24:0;;;;-1:-1:-1;;;;;38743:3:0;;;;-1:-1:-1;38743:22:0;;-1:-1:-1;38743:24:0;;;;;;;;;;;;;;;:3;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;38743:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38743:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38743:24:0;:29;;;;:68;;-1:-1:-1;38776:3:0;;:19;;;-1:-1:-1;;;38776:19:0;;;;38807:3;;-1:-1:-1;;;;;38776:3:0;;-1:-1:-1;;38776:19:0;;;;;;;;;;;;;;:3;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;38776:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38776:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38776:19:0;-1:-1:-1;;;;;38776:35:0;;;38743:68;38740:524;;;38845:3;;:24;;;-1:-1:-1;;;38845:24:0;;;;38821:11;;38835:9;;;;:1;;-1:-1:-1;;;;;38845:3:0;;-1:-1:-1;;38845:24:0;;;;;;;;;;;;;;:3;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;38845:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38845:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38845:24:0;38835:35;;;-1:-1:-1;38835:35:0;;;-1:-1:-1;;;;;;38835:35:0;;;;;;;;;;;;;;;;;;;;;;;38845:24;;38835:35;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;38835:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38835:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38835:35:0;38879:3;;:16;;;-1:-1:-1;;;38879:16:0;;;;38835:43;;;;:35;;-1:-1:-1;;;;;38879:3:0;;;;:14;;:16;;;;;38835:35;;38879:16;;;;;;;;:3;:16;;;5:2:-1;;;;30:1;27;20:12;5:2;38879:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38879:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38879:16:0;38835:61;;;-1:-1:-1;38835:61:0;;;-1:-1:-1;;;;;;38835:61:0;;;;;;;;;;;;;;;;;;;;;;;38879:16;;38835:61;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;38835:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38835:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38835:61:0;38920:14;;;-1:-1:-1;;;38920:14:0;;;;;;;;;;;;;;;;38835:61;;-1:-1:-1;;;38920:9:0;;;;:14;;;;;38835:61;;38920:14;;;;;;;:9;:14;;;5:2:-1;;;;30:1;27;20:12;5:2;38920:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38920:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38920:14:0;38950:12;;38920:14;;-1:-1:-1;38943:51:0;;-1:-1:-1;;;;;38950:12:0;38977:10;38920:14;38943:33;:51::i;:::-;39037:3;;:19;;;-1:-1:-1;;;39037:19:0;;;;39003:59;;-1:-1:-1;;;;;39037:3:0;;-1:-1:-1;;39037:19:0;;;;;;;;;;;;;;:3;:19;;;5:2:-1;;;;30:1;27;20:12;39003:59:0;39076:51;;;39089:10;39076:51;;-1:-1:-1;;;;;39076:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38740:524;;;;;39155:12;;39148:48;;-1:-1:-1;;;;;39155:12:0;39182:10;39194:1;39148:33;:48::i;:::-;39210:46;;;39223:10;39210:46;;-1:-1:-1;;;;;39210:46:0;;;;;;;;;;;;-1:-1:-1;39210:46:0;;;;;;;;;;;;;;;38740:524;39275:13;;-1:-1:-1;;;;;39275:13:0;:43;39272:127;;39328:13;;:63;;;-1:-1:-1;;;39328:63:0;;39355:10;39328:63;;;;-1:-1:-1;;;;;39328:63:0;;;;;;;;;;;;;;;:13;;;;;:26;;:63;;;;;-1:-1:-1;;39328:63:0;;;;;;;-1:-1:-1;39328:13:0;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;39328:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39328:63:0;;;;39272:127;37948:1456;;;;;;;:::o;33198:38::-;;;-1:-1:-1;;;;;33198:38:0;;:::o;42807:236::-;803:15;;-1:-1:-1;;;;;803:15:0;822:10;803:29;795:74;;;;;-1:-1:-1;;;795:74:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;795:74:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42878:21:0;;42870:46;;;;;-1:-1:-1;;;42870:46:0;;;;;;;;;;;;-1:-1:-1;;;42870:46:0;;;;;;;;;;;;;;;42937:19;;;-1:-1:-1;;;;;42963:27:0;;;-1:-1:-1;;;;;;42963:27:0;;;;;;;43002:35;;;42937:19;;;;43002:35;;;;;;;;;;;;;;;;;;;;;;;880:1;42807:236;:::o;33630:59::-;;;;;;;;;;;;;;;;;;;:::o;34569:1532::-;34635:21;34672:11;;;:37;;;34687:22;34702:6;34687:14;:22::i;:::-;34664:67;;;;;-1:-1:-1;;;34664:67:0;;;;;;;;;;;;-1:-1:-1;;;34664:67:0;;;;;;;;;;;;;;;34769:12;;;:37;;;-1:-1:-1;;;34769:37:0;;;;;;;;;;-1:-1:-1;;;;;;;;;34769:12:0;;-1:-1:-1;;34769:37:0;;;;;;;;;;-1:-1:-1;34769:12:0;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;34769:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34769:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34769:37:0;;;;;;;;;-1:-1:-1;34769:37:0;-1:-1:-1;34815:149:0;;;;34838:13;;-1:-1:-1;;;;;34838:13:0;:43;34835:122;;34893:13;;:54;;;-1:-1:-1;;;34893:54:0;;34930:10;34893:54;;;;-1:-1:-1;;;;;34893:54:0;;;;;;;;;:13;;;;;:36;;:54;;;;;-1:-1:-1;;34893:54:0;;;;;;;-1:-1:-1;34893:13:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;34893:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34893:54:0;;;;34835:122;34975:10;;:14;34972:197;;35018:10;;35007:7;:21;;34999:50;;;;;-1:-1:-1;;;34999:50:0;;;;;;;;;;;;-1:-1:-1;;;34999:50:0;;;;;;;;;;;;;;;35121:10;;35082:34;;;-1:-1:-1;;;35082:34:0;;35105:10;35082:34;;;;;;35066:15;;;;:7;;-1:-1:-1;;;;;35082:22:0;;;-1:-1:-1;;35082:34:0;;;;;;;;;;;;;;;:22;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;35082:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35082:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35082:34:0;35066:51;;;-1:-1:-1;35066:51:0;;;-1:-1:-1;;;;;;35066:51:0;;;;;;;;;;;;;;;;;;;;;;;35082:34;;35066:51;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;35066:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35066:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35066:51:0;:65;;35058:103;;;;;-1:-1:-1;;;35058:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35179:15;:13;:15::i;:::-;35228:12;;35221:57;;;-1:-1:-1;;;35221:57:0;;35252:10;35221:57;;;;35272:4;35221:57;;;;;;35282:7;;-1:-1:-1;;;;;35228:12:0;;35221:30;;:57;;;;;;;;;;;;;;35228:12;35221:57;;;5:2:-1;;;;30:1;27;20:12;5:2;35221:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35221:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35221:57:0;:68;;35213:101;;;;;-1:-1:-1;;;35213:101:0;;;;;;;;;;;;-1:-1:-1;;;35213:101:0;;;;;;;;;;;;;;;35343:12;;35336:45;;;-1:-1:-1;;;35336:45:0;;35375:4;35336:45;;;;;;-1:-1:-1;;;;;;;35343:12:0;;-1:-1:-1;;35336:45:0;;;;;;;;;;;;;;35343:12;35336:45;;;5:2:-1;;;;30:1;27;20:12;5:2;35336:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35336:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35336:45:0;35395:12;;35336:45;;-1:-1:-1;35388:73:0;;-1:-1:-1;;;;;35395:12:0;35426:10;35446:4;35453:7;35388:37;:73::i;:::-;35492:12;;35485:45;;;-1:-1:-1;;;35485:45:0;;35524:4;35485:45;;;;;;-1:-1:-1;;;;;;;35492:12:0;;-1:-1:-1;;35485:45:0;;;;;;;;;;;;;;35492:12;35485:45;;;5:2:-1;;;;30:1;27;20:12;5:2;35485:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35485:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35485:45:0;35547:23;;;-1:-1:-1;;;35547:23:0;;;;;;;;;;;;;;;;35485:45;;-1:-1:-1;35547:14:0;;;;:23;;;;;35485:45;;35547:23;;;;;;;;:14;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;35547:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35547:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35547:23:0;35641:10;;35667:12;;35641:39;;;-1:-1:-1;;;35641:39:0;;-1:-1:-1;;;;;35667:12:0;;;35641:39;;;;;;35547:23;;-1:-1:-1;;;35641:10:0;;;;;-1:-1:-1;;35641:39:0;;;;;35547:23;;35641:39;;;;;;;:10;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;35641:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35641:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35641:39:0;:52;;;-1:-1:-1;;;35641:52:0;;;;-1:-1:-1;;;;;35641:50:0;;;;;;:52;;;;;:39;;:52;;;;;;;;:50;:52;;;5:2:-1;;;;30:1;27;20:12;5:2;35641:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35641:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35641:52:0;;-1:-1:-1;35719:4:0;35708:15;;;35700:45;;;;;-1:-1:-1;;;35700:45:0;;;;;;;;;;;;-1:-1:-1;;;35700:45:0;;;;;;;;;;;;;;;35752:14;35769:7;:15;;;;35785:4;35769:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35769:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35769:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35769:21:0;:38;;;-1:-1:-1;;;35769:38:0;;;;;;;;;;;;;;;;:29;;;;:38;;;;;:21;;:38;;;;;;;:29;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;35769:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35769:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35769:38:0;35833:37;;;-1:-1:-1;;;35833:37:0;;;;35769:38;;-1:-1:-1;35816:14:0;;-1:-1:-1;;;;;35833:35:0;;;;;:37;;;;;35769:38;;35833:37;;;;;;;:35;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;35833:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35833:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35833:37:0;35907:27;;;;:19;35833:37;35907:27;;;;;;;;;:44;;-1:-1:-1;;;35907:44:0;;;;;;;;;;;;;;;;;35833:37;;-1:-1:-1;35907:35:0;;-1:-1:-1;;35907:44:0;;;;;35833:37;35907:44;;;;;;:35;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;35907:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35907:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35907:44:0;35877:27;;;;:19;35907:44;35877:27;;;;;:74;;;;35962:46;;-1:-1:-1;;;35962:46:0;;35989:10;35962:46;;;;;;;;;;;;-1:-1:-1;;;;;35962:26:0;;;-1:-1:-1;;35962:46:0;;;;;35877:27;;35962:46;;;;;35877:27;35962:26;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;35962:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;36022:45:0;;;36033:10;36022:45;;;;;;;;;;;;;;-1:-1:-1;;;;;36022:45:0;;;;;;;;;;-1:-1:-1;36022:45:0;;;;;;;-1:-1:-1;36022:45:0;-1:-1:-1;36081:4:0;;34569:1532;-1:-1:-1;;;;;;;;34569:1532:0:o;1044:109::-;803:15;;-1:-1:-1;;;;;803:15:0;822:10;803:29;795:74;;;;;-1:-1:-1;;;795:74:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;795:74:0;;;;;;;;;;;;;;;1117:28;1136:8;1117:18;:28::i;:::-;1044:109;:::o;33241:27::-;;;-1:-1:-1;;;;;33241:27:0;;:::o;39824:411::-;39864:12;;;:33;;;-1:-1:-1;;;39864:33:0;;;;-1:-1:-1;;;;;39864:12:0;;;;-1:-1:-1;;39864:33:0;;;;;;;;;;;;:12;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;39864:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39864:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;39927:12:0;;;:31;;;-1:-1:-1;;;39927:31:0;;;;39906:18;;-1:-1:-1;;;;;39927:12:0;;;;:29;;:31;;;;39864:33;;39927:31;;;;;;;:12;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;39927:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39927:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39927:31:0;39968:25;;;;:13;39927:31;39968:25;;;;:37;39927:31;;-1:-1:-1;39965:160:0;;40060:10;;40086:12;;40060:39;;;-1:-1:-1;;;40060:39:0;;-1:-1:-1;;;;;40086:12:0;;;40060:39;;;;;;:10;;;;;-1:-1:-1;;40060:39:0;;;;;;;;;;;;;;:10;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;40060:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40060:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40060:39:0;:57;;;-1:-1:-1;;;40060:57:0;;;;-1:-1:-1;;;;;40060:55:0;;;;;;:57;;;;;:39;;:57;;;;;;;;:55;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;40060:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40060:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40060:57:0;40020:25;;;;:13;40060:57;40020:25;;;;:97;39965:160;40134:12;;;40159:14;;40134:44;;;-1:-1:-1;;;40134:44:0;;:12;40159:18;;;40134:44;;;;;;;;;-1:-1:-1;;;;;40134:12:0;;;;:24;;:44;;;;;;;;;;;;;;:12;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;40134:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40134:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40134:44:0;40131:99;;;40188:34;40203:14;;40220:1;40203:18;40188:14;:34::i;4062:176::-;4171:58;;;-1:-1:-1;;;;;4171:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;4171:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;4145:85:0;;4164:5;;4145:18;:85::i;:::-;4062:176;;;:::o;4246:204::-;4373:68;;;-1:-1:-1;;;;;4373:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;4373:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;4347:95:0;;4366:5;;4347:18;:95::i;1259:247::-;-1:-1:-1;;;;;1333:22:0;;1325:73;;;;-1:-1:-1;;;1325:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1435:15;;;1414:47;;-1:-1:-1;;;;;1414:47:0;;;;1435:15;;;1414:47;;;1472:15;:26;;-1:-1:-1;;;;;;1472:26:0;-1:-1:-1;;;;;1472:26:0;;;;;;;;;;1259:247::o;41074:1666::-;41133:22;;;;:13;:22;;;;;:32;;;41130:148;;41213:10;;41239:12;;41213:39;;;-1:-1:-1;;;41213:39:0;;-1:-1:-1;;;;;41239:12:0;;;41213:39;;;;;;:10;;;;;-1:-1:-1;;41213:39:0;;;;;;;;;;;;;;:10;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;41213:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41213:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41213:39:0;:57;;;-1:-1:-1;;;41213:57:0;;;;-1:-1:-1;;;;;41213:55:0;;;;;;:57;;;;;:39;;:57;;;;;;;;:55;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;41213:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41213:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41213:57:0;41179:22;;;;:13;41213:57;41179:22;;;;:32;;:91;41130:148;41307:10;;41333:12;;41307:39;;;-1:-1:-1;;;41307:39:0;;-1:-1:-1;;;;;41333:12:0;;;41307:39;;;;;;-1:-1:-1;;41307:10:0;;;;;-1:-1:-1;;41307:39:0;;;;;;;;;;;;;;;:10;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;41307:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41307:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41307:39:0;:52;;;-1:-1:-1;;;41307:52:0;;;;-1:-1:-1;;;;;41307:50:0;;;;;;:52;;;;;:39;;:52;;;;;;;;:50;:52;;;5:2:-1;;;;30:1;27;20:12;5:2;41307:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41307:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41307:52:0;41366:12;41381:28;;;:19;41307:52;41381:28;;;;;;;;41418:13;:22;;;;;:32;;;;41459:34;;41418:76;;-1:-1:-1;;;41418:76:0;;;;;;;;;;;;;;;41307:52;;-1:-1:-1;41366:12:0;;41381:36;;;;:28;;:36;;41418:40;;:76;;;;;41307:52;;41418:76;;;;;;41381:36;41418:76;;;5:2:-1;;;;30:1;27;20:12;5:2;41418:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41418:76:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41418:76:0;41381:114;;;-1:-1:-1;41381:114:0;;;-1:-1:-1;;;;;;41381:114:0;;;;;;;;;;;;;;;;;;;;;;;41418:76;;41381:114;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;41381:114:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41381:114:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41381:114:0;41538:12;;;:48;;;-1:-1:-1;;;41538:48:0;;;;;;;;-1:-1:-1;41538:48:0;;;;;;;;41381:114;;-1:-1:-1;;;;;;;;;41538:12:0;;;;-1:-1:-1;;41538:48:0;;;;;41381:114;;41538:48;;;;;;;:12;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;41538:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41538:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41538:48:0;;-1:-1:-1;41599:9:0;41595:677;41618:7;:14;41614:18;;41595:677;;;41659:12;;41704:7;:10;;41647:9;;-1:-1:-1;;;;;41659:12:0;;:35;;41695:7;;41704;41712:1;;41704:10;;;;;;;;;;;;;;41659:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41659:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41659:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41659:56:0;:74;;;-1:-1:-1;;;41659:74:0;;;;;;;;;;;;;;;;:64;;;;:74;;;;;:56;;:74;;;;;;;:64;:74;;;5:2:-1;;;;30:1;27;20:12;5:2;41659:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41659:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41659:74:0;:88;;;-1:-1:-1;;;41659:88:0;;;;;;;;;41742:4;41659:88;;;;;:82;;;;:88;;;;;:74;;:88;;;;;;;:82;:88;;;5:2:-1;;;;30:1;27;20:12;5:2;41659:88:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41659:88:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41659:88:0;41756:10;41779:22;;;:13;41659:88;41779:22;;;;;;;:34;41769:45;;-1:-1:-1;;;41769:45:0;;;;;;;;;;;;;;;;;41659:88;;-1:-1:-1;41756:10:0;;41769:9;;;;:45;;;;;41659:88;;41769:45;;;;;:9;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;41769:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41769:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41769:45:0;41823:7;:10;;41769:53;;;;:45;;41831:1;;41823:10;;;;;;;;;;;;;;41769:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41769:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41769:65:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41769:65:0;41843:3;;:16;;;-1:-1:-1;;;41843:16:0;;;;41769:73;;;;:65;;-1:-1:-1;;;;;41843:3:0;;;;:14;;:16;;;;;41769:65;;41843:16;;;;;;;;:3;:16;;;5:2:-1;;;;30:1;27;20:12;5:2;41843:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41843:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41843:16:0;41769:91;;;-1:-1:-1;41769:91:0;;;-1:-1:-1;;;;;;41769:91:0;;;;;;;;;;;;;;;;;;;;;;;41843:16;;41769:91;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;41769:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41769:91:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41769:91:0;41883:12;;41929:7;:10;;41769:91;;-1:-1:-1;41871:9:0;;-1:-1:-1;;;;;41883:12:0;;;;:36;;41920:7;;41937:1;;41929:10;;;;;;;;;;;;;;41883:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41883:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41883:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41883:57:0;;-1:-1:-1;;;;;;41952:17:0;;;41949:316;;41989:4;41984:2;:9;41981:47;;;42012:4;42007:9;;41981:47;42045:16;;;-1:-1:-1;;;42045:16:0;;;;;;;;;;;;;;;;:12;;;;:16;;;;;;;;;;;;;;:12;:16;;;5:2:-1;;;;30:1;27;20:12;5:2;42045:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42045:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42045:16:0;42086:22;;;;:13;42045:16;42086:22;;;;;;;;:34;42076:45;;-1:-1:-1;;;42076:45:0;;;;;;;;;;;;;;;;;42045:16;;-1:-1:-1;42076:9:0;;;;:45;;;;;42045:16;42076:45;;;;;;:9;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;42076:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42076:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42076:45:0;:57;;;-1:-1:-1;;;42076:57:0;;;;;;;;;;;;;;;;:53;;-1:-1:-1;;42076:57:0;;;;;:45;;:57;;;;;;;:53;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;42076:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42076:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42076:57:0;42142:22;;;;:13;42076:57;42142:22;;;;;;;;:32;;;42076:99;;-1:-1:-1;;;42076:99:0;;;;;;;;;;;;;;;:65;;;;:99;;;;;:57;;:99;;;;;:65;:99;;;5:2:-1;;;;30:1;27;20:12;5:2;42076:99:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42076:99:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42076:99:0;42186:42;;;-1:-1:-1;;;42186:42:0;;;;;;;;;;42076:99;;-1:-1:-1;;;;;;42186:39:0;;;-1:-1:-1;;42186:42:0;;;;;-1:-1:-1;;42186:42:0;;;;;;;;-1:-1:-1;42186:39:0;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;42186:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42243:12:0;;;-1:-1:-1;;;42243:12:0;;;;;;;;;;;;;;;;:9;;-1:-1:-1;;;;42243:12:0;;;;;;;;;;;;;;:9;:12;;;5:2:-1;;;;30:1;27;20:12;5:2;42243:12:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42243:12:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42243:12:0;;-1:-1:-1;41949:316:0;-1:-1:-1;;;41634:3:0;;41595:677;;;-1:-1:-1;;;;;;42283:19:0;;;42280:170;;42319:28;;;;:19;:28;;;;;;;;;;:39;;-1:-1:-1;;;42319:39:0;;;;;;;;;;;;;;;;;:36;;;;:39;;;;;:28;;:39;;;;;:36;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;42319:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42319:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42319:39:0;42367:47;;;-1:-1:-1;;;42367:47:0;;;;;;;;;;42319:39;;-1:-1:-1;;;;;;42367:41:0;;;-1:-1:-1;;42367:47:0;;;;;-1:-1:-1;;42367:47:0;;;;;;;;-1:-1:-1;42367:41:0;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;42367:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42427:15:0;;;-1:-1:-1;;;42427:15:0;;;;;;;;;;;;;;;;:9;;-1:-1:-1;;;;42427:15:0;;;;;;;;;;;;;;:9;:15;;;5:2:-1;;;;30:1;27;20:12;5:2;42427:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42427:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42427:15:0;;-1:-1:-1;42280:170:0;42463:28;;;;:19;:28;;;;;;42459:32;;42456:246;;;42505:28;;;;:19;:28;;;;;;;;;;:39;;-1:-1:-1;;;42505:39:0;;;;;;;;;;;;;;;;;:36;;;;:39;;;;;:28;;:39;;;;;:36;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;42505:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42505:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42505:39:0;42561:19;;42505:39;;-1:-1:-1;;;;;;42561:19:0;42553:75;;;;;-1:-1:-1;;;42553:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42671:19;;42644:12;;42637:57;;-1:-1:-1;;;;;42644:12:0;;;;42671:19;42692:1;42637:33;:57::i;:::-;-1:-1:-1;;;42710:14:0;:24;;;;-1:-1:-1;41074:1666:0:o;5405:598::-;5493:27;-1:-1:-1;;;;;5493:25:0;;;:27::i;:::-;5485:71;;;;;-1:-1:-1;;;5485:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5630:12;5644:23;5679:5;-1:-1:-1;;;;;5671:19:0;5691:4;5671:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;5671:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;5629:67:0;;;;5715:7;5707:52;;;;;-1:-1:-1;;;5707:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5776:17;;:21;5772:224;;5918:10;5907:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5907:30:0;5899:85;;;;-1:-1:-1;;;5899:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2243:374;2303:4;2526:20;;2369:66;2566:15;;;;;:42;;;2597:11;2585:8;:23;;2566:42;2558:51;2243:374;-1:-1:-1;;;;2243:374:0:o;33098:9950::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://ed8551ea6de30db057149822b91e105cabce63e705eb93262afa536e87244430
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.