Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 363,061 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Compact Data | 11994542 | 1386 days ago | IN | 0 ETH | 0.00463072 | ||||
Set Compact Data | 11994528 | 1386 days ago | IN | 0 ETH | 0.00466265 | ||||
Set Compact Data | 11994506 | 1386 days ago | IN | 0 ETH | 0.00463072 | ||||
Set Compact Data | 11994503 | 1386 days ago | IN | 0 ETH | 0.00495008 | ||||
Set Compact Data | 11994498 | 1386 days ago | IN | 0 ETH | 0.00578041 | ||||
Set Compact Data | 11994497 | 1386 days ago | IN | 0 ETH | 0.0048862 | ||||
Set Compact Data | 11994492 | 1386 days ago | IN | 0 ETH | 0.00578041 | ||||
Set Compact Data | 11994487 | 1386 days ago | IN | 0 ETH | 0.00578041 | ||||
Set Compact Data | 11994486 | 1386 days ago | IN | 0 ETH | 0.00447104 | ||||
Set Compact Data | 11994485 | 1386 days ago | IN | 0 ETH | 0.00495008 | ||||
Set Compact Data | 11994484 | 1386 days ago | IN | 0 ETH | 0.00578041 | ||||
Set Compact Data | 11994480 | 1386 days ago | IN | 0 ETH | 0.00447104 | ||||
Set Compact Data | 11994475 | 1386 days ago | IN | 0 ETH | 0.00578041 | ||||
Set Compact Data | 11994473 | 1386 days ago | IN | 0 ETH | 0.00578041 | ||||
Set Compact Data | 11994472 | 1386 days ago | IN | 0 ETH | 0.00578041 | ||||
Set Compact Data | 11994470 | 1386 days ago | IN | 0 ETH | 0.00447104 | ||||
Set Compact Data | 11994464 | 1386 days ago | IN | 0 ETH | 0.00475846 | ||||
Set Compact Data | 11994461 | 1386 days ago | IN | 0 ETH | 0.0047904 | ||||
Set Compact Data | 11994456 | 1386 days ago | IN | 0 ETH | 0.00578041 | ||||
Set Compact Data | 11994450 | 1386 days ago | IN | 0 ETH | 0.0047904 | ||||
Set Compact Data | 11994445 | 1386 days ago | IN | 0 ETH | 0.00434329 | ||||
Set Compact Data | 11994440 | 1386 days ago | IN | 0 ETH | 0.00392812 | ||||
Set Compact Data | 11994438 | 1386 days ago | IN | 0 ETH | 0.00578041 | ||||
Set Compact Data | 11994436 | 1386 days ago | IN | 0 ETH | 0.00578041 | ||||
Set Compact Data | 11994434 | 1386 days ago | IN | 0 ETH | 0.00396006 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ConversionRates
Compiler Version
v0.4.18+commit.9cf6e910
Contract Source Code (Solidity Multiple files format)
pragma solidity 0.4.18; import "../../ERC20Interface.sol"; import "../../Utils.sol"; import "../../ConversionRatesInterface.sol"; import "../VolumeImbalanceRecorder.sol"; contract ConversionRates is ConversionRatesInterface, VolumeImbalanceRecorder, Utils { // bps - basic rate steps. one step is 1 / 10000 of the rate. struct StepFunction { int[] x; // quantity for each step. Quantity of each step includes previous steps. int[] y; // rate change per quantity step in bps. } struct TokenData { bool listed; // was added to reserve bool enabled; // whether trade is enabled // position in the compact data uint compactDataArrayIndex; uint compactDataFieldIndex; // rate data. base and changes according to quantity and reserve balance. // generally speaking. Sell rate is 1 / buy rate i.e. the buy in the other direction. uint baseBuyRate; // in PRECISION units. see KyberConstants uint baseSellRate; // PRECISION units. without (sell / buy) spread it is 1 / baseBuyRate StepFunction buyRateQtyStepFunction; // in bps. higher quantity - bigger the rate. StepFunction sellRateQtyStepFunction;// in bps. higher the qua StepFunction buyRateImbalanceStepFunction; // in BPS. higher reserve imbalance - bigger the rate. StepFunction sellRateImbalanceStepFunction; } /* this is the data for tokenRatesCompactData but solidity compiler optimizer is sub-optimal, and cannot write this structure in a single storage write so we represent it as bytes32 and do the byte tricks ourselves. struct TokenRatesCompactData { bytes14 buy; // change buy rate of token from baseBuyRate in 10 bps bytes14 sell; // change sell rate of token from baseSellRate in 10 bps uint32 blockNumber; } */ uint public validRateDurationInBlocks = 10; // rates are valid for this amount of blocks ERC20[] internal listedTokens; mapping(address=>TokenData) internal tokenData; bytes32[] internal tokenRatesCompactData; uint public numTokensInCurrentCompactData = 0; address public reserveContract; uint constant internal NUM_TOKENS_IN_COMPACT_DATA = 14; uint constant internal BYTES_14_OFFSET = (2 ** (8 * NUM_TOKENS_IN_COMPACT_DATA)); uint constant internal MAX_STEPS_IN_FUNCTION = 10; int constant internal MAX_BPS_ADJUSTMENT = 10 ** 11; // 1B % int constant internal MIN_BPS_ADJUSTMENT = -100 * 100; // cannot go down by more than 100% function ConversionRates(address _admin) public VolumeImbalanceRecorder(_admin) { } // solhint-disable-line no-empty-blocks function addToken(ERC20 token) public onlyAdmin { require(!tokenData[token].listed); tokenData[token].listed = true; listedTokens.push(token); if (numTokensInCurrentCompactData == 0) { tokenRatesCompactData.length++; // add new structure } tokenData[token].compactDataArrayIndex = tokenRatesCompactData.length - 1; tokenData[token].compactDataFieldIndex = numTokensInCurrentCompactData; numTokensInCurrentCompactData = (numTokensInCurrentCompactData + 1) % NUM_TOKENS_IN_COMPACT_DATA; setGarbageToVolumeRecorder(token); setDecimals(token); } function setCompactData(bytes14[] buy, bytes14[] sell, uint blockNumber, uint[] indices) public onlyOperator { require(buy.length == sell.length); require(indices.length == buy.length); require(blockNumber <= 0xFFFFFFFF); uint bytes14Offset = BYTES_14_OFFSET; for (uint i = 0; i < indices.length; i++) { require(indices[i] < tokenRatesCompactData.length); uint data = uint(buy[i]) | uint(sell[i]) * bytes14Offset | (blockNumber * (bytes14Offset * bytes14Offset)); tokenRatesCompactData[indices[i]] = bytes32(data); } } function setBaseRate( ERC20[] tokens, uint[] baseBuy, uint[] baseSell, bytes14[] buy, bytes14[] sell, uint blockNumber, uint[] indices ) public onlyOperator { require(tokens.length == baseBuy.length); require(tokens.length == baseSell.length); require(sell.length == buy.length); require(sell.length == indices.length); for (uint ind = 0; ind < tokens.length; ind++) { require(tokenData[tokens[ind]].listed); tokenData[tokens[ind]].baseBuyRate = baseBuy[ind]; tokenData[tokens[ind]].baseSellRate = baseSell[ind]; } setCompactData(buy, sell, blockNumber, indices); } function setQtyStepFunction( ERC20 token, int[] xBuy, int[] yBuy, int[] xSell, int[] ySell ) public onlyOperator { require(xBuy.length == yBuy.length); require(xSell.length == ySell.length); require(xBuy.length <= MAX_STEPS_IN_FUNCTION); require(xSell.length <= MAX_STEPS_IN_FUNCTION); require(tokenData[token].listed); tokenData[token].buyRateQtyStepFunction = StepFunction(xBuy, yBuy); tokenData[token].sellRateQtyStepFunction = StepFunction(xSell, ySell); } function setImbalanceStepFunction( ERC20 token, int[] xBuy, int[] yBuy, int[] xSell, int[] ySell ) public onlyOperator { require(xBuy.length == yBuy.length); require(xSell.length == ySell.length); require(xBuy.length <= MAX_STEPS_IN_FUNCTION); require(xSell.length <= MAX_STEPS_IN_FUNCTION); require(tokenData[token].listed); tokenData[token].buyRateImbalanceStepFunction = StepFunction(xBuy, yBuy); tokenData[token].sellRateImbalanceStepFunction = StepFunction(xSell, ySell); } function setValidRateDurationInBlocks(uint duration) public onlyAdmin { validRateDurationInBlocks = duration; } function enableTokenTrade(ERC20 token) public onlyAdmin { require(tokenData[token].listed); require(tokenControlInfo[token].minimalRecordResolution != 0); tokenData[token].enabled = true; } function disableTokenTrade(ERC20 token) public onlyAlerter { require(tokenData[token].listed); tokenData[token].enabled = false; } function setReserveAddress(address reserve) public onlyAdmin { reserveContract = reserve; } function recordImbalance( ERC20 token, int buyAmount, uint rateUpdateBlock, uint currentBlock ) public { require(msg.sender == reserveContract); if (rateUpdateBlock == 0) rateUpdateBlock = getRateUpdateBlock(token); return addImbalance(token, buyAmount, rateUpdateBlock, currentBlock); } /* solhint-disable function-max-lines */ function getRate(ERC20 token, uint currentBlockNumber, bool buy, uint qty) public view returns(uint) { // check if trade is enabled if (!tokenData[token].enabled) return 0; if (tokenControlInfo[token].minimalRecordResolution == 0) return 0; // token control info not set // get rate update block bytes32 compactData = tokenRatesCompactData[tokenData[token].compactDataArrayIndex]; uint updateRateBlock = getLast4Bytes(compactData); if (currentBlockNumber >= updateRateBlock + validRateDurationInBlocks) return 0; // rate is expired // check imbalance int totalImbalance; int blockImbalance; (totalImbalance, blockImbalance) = getImbalance(token, updateRateBlock, currentBlockNumber); // calculate actual rate int imbalanceQty; int extraBps; int8 rateUpdate; uint rate; if (buy) { // start with base rate rate = tokenData[token].baseBuyRate; // add rate update rateUpdate = getRateByteFromCompactData(compactData, token, true); extraBps = int(rateUpdate) * 10; rate = addBps(rate, extraBps); // compute token qty qty = getTokenQty(token, rate, qty); imbalanceQty = int(qty); totalImbalance += imbalanceQty; // add qty overhead extraBps = executeStepFunction(tokenData[token].buyRateQtyStepFunction, int(qty)); rate = addBps(rate, extraBps); // add imbalance overhead extraBps = executeStepFunction(tokenData[token].buyRateImbalanceStepFunction, totalImbalance); rate = addBps(rate, extraBps); } else { // start with base rate rate = tokenData[token].baseSellRate; // add rate update rateUpdate = getRateByteFromCompactData(compactData, token, false); extraBps = int(rateUpdate) * 10; rate = addBps(rate, extraBps); // compute token qty imbalanceQty = -1 * int(qty); totalImbalance += imbalanceQty; // add qty overhead extraBps = executeStepFunction(tokenData[token].sellRateQtyStepFunction, int(qty)); rate = addBps(rate, extraBps); // add imbalance overhead extraBps = executeStepFunction(tokenData[token].sellRateImbalanceStepFunction, totalImbalance); rate = addBps(rate, extraBps); } if (abs(totalImbalance) >= getMaxTotalImbalance(token)) return 0; if (abs(blockImbalance + imbalanceQty) >= getMaxPerBlockImbalance(token)) return 0; return rate; } /* solhint-enable function-max-lines */ function getBasicRate(ERC20 token, bool buy) public view returns(uint) { if (buy) return tokenData[token].baseBuyRate; else return tokenData[token].baseSellRate; } function getCompactData(ERC20 token) public view returns(uint, uint, byte, byte) { require(tokenData[token].listed); uint arrayIndex = tokenData[token].compactDataArrayIndex; uint fieldOffset = tokenData[token].compactDataFieldIndex; return ( arrayIndex, fieldOffset, byte(getRateByteFromCompactData(tokenRatesCompactData[arrayIndex], token, true)), byte(getRateByteFromCompactData(tokenRatesCompactData[arrayIndex], token, false)) ); } function getTokenBasicData(ERC20 token) public view returns(bool, bool) { return (tokenData[token].listed, tokenData[token].enabled); } /* solhint-disable code-complexity */ function getStepFunctionData(ERC20 token, uint command, uint param) public view returns(int) { if (command == 0) return int(tokenData[token].buyRateQtyStepFunction.x.length); if (command == 1) return tokenData[token].buyRateQtyStepFunction.x[param]; if (command == 2) return int(tokenData[token].buyRateQtyStepFunction.y.length); if (command == 3) return tokenData[token].buyRateQtyStepFunction.y[param]; if (command == 4) return int(tokenData[token].sellRateQtyStepFunction.x.length); if (command == 5) return tokenData[token].sellRateQtyStepFunction.x[param]; if (command == 6) return int(tokenData[token].sellRateQtyStepFunction.y.length); if (command == 7) return tokenData[token].sellRateQtyStepFunction.y[param]; if (command == 8) return int(tokenData[token].buyRateImbalanceStepFunction.x.length); if (command == 9) return tokenData[token].buyRateImbalanceStepFunction.x[param]; if (command == 10) return int(tokenData[token].buyRateImbalanceStepFunction.y.length); if (command == 11) return tokenData[token].buyRateImbalanceStepFunction.y[param]; if (command == 12) return int(tokenData[token].sellRateImbalanceStepFunction.x.length); if (command == 13) return tokenData[token].sellRateImbalanceStepFunction.x[param]; if (command == 14) return int(tokenData[token].sellRateImbalanceStepFunction.y.length); if (command == 15) return tokenData[token].sellRateImbalanceStepFunction.y[param]; revert(); } /* solhint-enable code-complexity */ function getRateUpdateBlock(ERC20 token) public view returns(uint) { bytes32 compactData = tokenRatesCompactData[tokenData[token].compactDataArrayIndex]; return getLast4Bytes(compactData); } function getListedTokens() public view returns(ERC20[]) { return listedTokens; } function getTokenQty(ERC20 token, uint ethQty, uint rate) internal view returns(uint) { uint dstDecimals = getDecimals(token); uint srcDecimals = ETH_DECIMALS; return calcDstQty(ethQty, srcDecimals, dstDecimals, rate); } function getLast4Bytes(bytes32 b) internal pure returns(uint) { // cannot trust compiler with not turning bit operations into EXP opcode return uint(b) / (BYTES_14_OFFSET * BYTES_14_OFFSET); } function getRateByteFromCompactData(bytes32 data, ERC20 token, bool buy) internal view returns(int8) { uint fieldOffset = tokenData[token].compactDataFieldIndex; uint byteOffset; if (buy) byteOffset = 32 - NUM_TOKENS_IN_COMPACT_DATA + fieldOffset; else byteOffset = 4 + fieldOffset; return int8(data[byteOffset]); } function executeStepFunction(StepFunction f, int x) internal pure returns(int) { uint len = f.y.length; for (uint ind = 0; ind < len; ind++) { if (x <= f.x[ind]) return f.y[ind]; } return f.y[len-1]; } function addBps(uint rate, int bps) internal pure returns(uint) { require(rate <= MAX_RATE); require(bps >= MIN_BPS_ADJUSTMENT); require(bps <= MAX_BPS_ADJUSTMENT); uint maxBps = 100 * 100; return (rate * uint(int(maxBps) + bps)) / maxBps; } function abs(int x) internal pure returns(uint) { if (x < 0) return uint(-1 * x); else return uint(x); } }
pragma solidity 0.4.18; import "./ERC20Interface.sol"; interface ConversionRatesInterface { function recordImbalance( ERC20 token, int buyAmount, uint rateUpdateBlock, uint currentBlock ) public; function getRate(ERC20 token, uint currentBlockNumber, bool buy, uint qty) public view returns(uint); }
pragma solidity 0.4.18; // https://github.com/ethereum/EIPs/issues/20 interface ERC20 { function totalSupply() public view returns (uint supply); function balanceOf(address _owner) public view returns (uint balance); function transfer(address _to, uint _value) public returns (bool success); function transferFrom(address _from, address _to, uint _value) public returns (bool success); function approve(address _spender, uint _value) public returns (bool success); function allowance(address _owner, address _spender) public view returns (uint remaining); function decimals() public view returns(uint digits); event Approval(address indexed _owner, address indexed _spender, uint _value); }
pragma solidity 0.4.18; contract PermissionGroups { address public admin; address public pendingAdmin; mapping(address=>bool) internal operators; mapping(address=>bool) internal alerters; address[] internal operatorsGroup; address[] internal alertersGroup; uint constant internal MAX_GROUP_SIZE = 50; function PermissionGroups() public { admin = msg.sender; } modifier onlyAdmin() { require(msg.sender == admin); _; } modifier onlyOperator() { require(operators[msg.sender]); _; } modifier onlyAlerter() { require(alerters[msg.sender]); _; } function getOperators () external view returns(address[]) { return operatorsGroup; } function getAlerters () external view returns(address[]) { return alertersGroup; } event TransferAdminPending(address pendingAdmin); /** * @dev Allows the current admin to set the pendingAdmin address. * @param newAdmin The address to transfer ownership to. */ function transferAdmin(address newAdmin) public onlyAdmin { require(newAdmin != address(0)); TransferAdminPending(pendingAdmin); pendingAdmin = newAdmin; } /** * @dev Allows the current admin to set the admin in one tx. Useful initial deployment. * @param newAdmin The address to transfer ownership to. */ function transferAdminQuickly(address newAdmin) public onlyAdmin { require(newAdmin != address(0)); TransferAdminPending(newAdmin); AdminClaimed(newAdmin, admin); admin = newAdmin; } event AdminClaimed( address newAdmin, address previousAdmin); /** * @dev Allows the pendingAdmin address to finalize the change admin process. */ function claimAdmin() public { require(pendingAdmin == msg.sender); AdminClaimed(pendingAdmin, admin); admin = pendingAdmin; pendingAdmin = address(0); } event AlerterAdded (address newAlerter, bool isAdd); function addAlerter(address newAlerter) public onlyAdmin { require(!alerters[newAlerter]); // prevent duplicates. require(alertersGroup.length < MAX_GROUP_SIZE); AlerterAdded(newAlerter, true); alerters[newAlerter] = true; alertersGroup.push(newAlerter); } function removeAlerter (address alerter) public onlyAdmin { require(alerters[alerter]); alerters[alerter] = false; for (uint i = 0; i < alertersGroup.length; ++i) { if (alertersGroup[i] == alerter) { alertersGroup[i] = alertersGroup[alertersGroup.length - 1]; alertersGroup.length--; AlerterAdded(alerter, false); break; } } } event OperatorAdded(address newOperator, bool isAdd); function addOperator(address newOperator) public onlyAdmin { require(!operators[newOperator]); // prevent duplicates. require(operatorsGroup.length < MAX_GROUP_SIZE); OperatorAdded(newOperator, true); operators[newOperator] = true; operatorsGroup.push(newOperator); } function removeOperator (address operator) public onlyAdmin { require(operators[operator]); operators[operator] = false; for (uint i = 0; i < operatorsGroup.length; ++i) { if (operatorsGroup[i] == operator) { operatorsGroup[i] = operatorsGroup[operatorsGroup.length - 1]; operatorsGroup.length -= 1; OperatorAdded(operator, false); break; } } } }
pragma solidity 0.4.18; import "./ERC20Interface.sol"; /// @title Kyber constants contract contract Utils { ERC20 constant internal ETH_TOKEN_ADDRESS = ERC20(0x00eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee); uint constant internal PRECISION = (10**18); uint constant internal MAX_QTY = (10**28); // 10B tokens uint constant internal MAX_RATE = (PRECISION * 10**6); // up to 1M tokens per ETH uint constant internal MAX_DECIMALS = 18; uint constant internal ETH_DECIMALS = 18; mapping(address=>uint) internal decimals; function setDecimals(ERC20 token) internal { if (token == ETH_TOKEN_ADDRESS) decimals[token] = ETH_DECIMALS; else decimals[token] = token.decimals(); } function getDecimals(ERC20 token) internal view returns(uint) { if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access uint tokenDecimals = decimals[token]; // technically, there might be token with decimals 0 // moreover, very possible that old tokens have decimals 0 // these tokens will just have higher gas fees. if(tokenDecimals == 0) return token.decimals(); return tokenDecimals; } function calcDstQty(uint srcQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) { require(srcQty <= MAX_QTY); require(rate <= MAX_RATE); if (dstDecimals >= srcDecimals) { require((dstDecimals - srcDecimals) <= MAX_DECIMALS); return (srcQty * rate * (10**(dstDecimals - srcDecimals))) / PRECISION; } else { require((srcDecimals - dstDecimals) <= MAX_DECIMALS); return (srcQty * rate) / (PRECISION * (10**(srcDecimals - dstDecimals))); } } function calcSrcQty(uint dstQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) { require(dstQty <= MAX_QTY); require(rate <= MAX_RATE); //source quantity is rounded up. to avoid dest quantity being too low. uint numerator; uint denominator; if (srcDecimals >= dstDecimals) { require((srcDecimals - dstDecimals) <= MAX_DECIMALS); numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals))); denominator = rate; } else { require((dstDecimals - srcDecimals) <= MAX_DECIMALS); numerator = (PRECISION * dstQty); denominator = (rate * (10**(dstDecimals - srcDecimals))); } return (numerator + denominator - 1) / denominator; //avoid rounding down errors } }
pragma solidity 0.4.18; import "../ERC20Interface.sol"; import "../Withdrawable.sol"; contract VolumeImbalanceRecorder is Withdrawable { uint constant internal SLIDING_WINDOW_SIZE = 5; uint constant internal POW_2_64 = 2 ** 64; struct TokenControlInfo { uint minimalRecordResolution; // can be roughly 1 cent uint maxPerBlockImbalance; // in twei resolution uint maxTotalImbalance; // max total imbalance (between rate updates) // before halting trade } mapping(address => TokenControlInfo) internal tokenControlInfo; struct TokenImbalanceData { int lastBlockBuyUnitsImbalance; uint lastBlock; int totalBuyUnitsImbalance; uint lastRateUpdateBlock; } mapping(address => mapping(uint=>uint)) public tokenImbalanceData; function VolumeImbalanceRecorder(address _admin) public { require(_admin != address(0)); admin = _admin; } function setTokenControlInfo( ERC20 token, uint minimalRecordResolution, uint maxPerBlockImbalance, uint maxTotalImbalance ) public onlyAdmin { tokenControlInfo[token] = TokenControlInfo( minimalRecordResolution, maxPerBlockImbalance, maxTotalImbalance ); } function getTokenControlInfo(ERC20 token) public view returns(uint, uint, uint) { return (tokenControlInfo[token].minimalRecordResolution, tokenControlInfo[token].maxPerBlockImbalance, tokenControlInfo[token].maxTotalImbalance); } function addImbalance( ERC20 token, int buyAmount, uint rateUpdateBlock, uint currentBlock ) internal { uint currentBlockIndex = currentBlock % SLIDING_WINDOW_SIZE; int recordedBuyAmount = int(buyAmount / int(tokenControlInfo[token].minimalRecordResolution)); int prevImbalance = 0; TokenImbalanceData memory currentBlockData = decodeTokenImbalanceData(tokenImbalanceData[token][currentBlockIndex]); // first scenario - this is not the first tx in the current block if (currentBlockData.lastBlock == currentBlock) { if (uint(currentBlockData.lastRateUpdateBlock) == rateUpdateBlock) { // just increase imbalance currentBlockData.lastBlockBuyUnitsImbalance += recordedBuyAmount; currentBlockData.totalBuyUnitsImbalance += recordedBuyAmount; } else { // imbalance was changed in the middle of the block prevImbalance = getImbalanceInRange(token, rateUpdateBlock, currentBlock); currentBlockData.totalBuyUnitsImbalance = int(prevImbalance) + recordedBuyAmount; currentBlockData.lastBlockBuyUnitsImbalance += recordedBuyAmount; currentBlockData.lastRateUpdateBlock = uint(rateUpdateBlock); } } else { // first tx in the current block int currentBlockImbalance; (prevImbalance, currentBlockImbalance) = getImbalanceSinceRateUpdate(token, rateUpdateBlock, currentBlock); currentBlockData.lastBlockBuyUnitsImbalance = recordedBuyAmount; currentBlockData.lastBlock = uint(currentBlock); currentBlockData.lastRateUpdateBlock = uint(rateUpdateBlock); currentBlockData.totalBuyUnitsImbalance = int(prevImbalance) + recordedBuyAmount; } tokenImbalanceData[token][currentBlockIndex] = encodeTokenImbalanceData(currentBlockData); } function setGarbageToVolumeRecorder(ERC20 token) internal { for (uint i = 0; i < SLIDING_WINDOW_SIZE; i++) { tokenImbalanceData[token][i] = 0x1; } } function getImbalanceInRange(ERC20 token, uint startBlock, uint endBlock) internal view returns(int buyImbalance) { // check the imbalance in the sliding window require(startBlock <= endBlock); buyImbalance = 0; for (uint windowInd = 0; windowInd < SLIDING_WINDOW_SIZE; windowInd++) { TokenImbalanceData memory perBlockData = decodeTokenImbalanceData(tokenImbalanceData[token][windowInd]); if (perBlockData.lastBlock <= endBlock && perBlockData.lastBlock >= startBlock) { buyImbalance += int(perBlockData.lastBlockBuyUnitsImbalance); } } } function getImbalanceSinceRateUpdate(ERC20 token, uint rateUpdateBlock, uint currentBlock) internal view returns(int buyImbalance, int currentBlockImbalance) { buyImbalance = 0; currentBlockImbalance = 0; uint latestBlock = 0; int imbalanceInRange = 0; uint startBlock = rateUpdateBlock; uint endBlock = currentBlock; for (uint windowInd = 0; windowInd < SLIDING_WINDOW_SIZE; windowInd++) { TokenImbalanceData memory perBlockData = decodeTokenImbalanceData(tokenImbalanceData[token][windowInd]); if (perBlockData.lastBlock <= endBlock && perBlockData.lastBlock >= startBlock) { imbalanceInRange += perBlockData.lastBlockBuyUnitsImbalance; } if (perBlockData.lastRateUpdateBlock != rateUpdateBlock) continue; if (perBlockData.lastBlock < latestBlock) continue; latestBlock = perBlockData.lastBlock; buyImbalance = perBlockData.totalBuyUnitsImbalance; if (uint(perBlockData.lastBlock) == currentBlock) { currentBlockImbalance = perBlockData.lastBlockBuyUnitsImbalance; } } if (buyImbalance == 0) { buyImbalance = imbalanceInRange; } } function getImbalance(ERC20 token, uint rateUpdateBlock, uint currentBlock) internal view returns(int totalImbalance, int currentBlockImbalance) { int resolution = int(tokenControlInfo[token].minimalRecordResolution); (totalImbalance, currentBlockImbalance) = getImbalanceSinceRateUpdate( token, rateUpdateBlock, currentBlock); totalImbalance *= resolution; currentBlockImbalance *= resolution; } function getMaxPerBlockImbalance(ERC20 token) internal view returns(uint) { return tokenControlInfo[token].maxPerBlockImbalance; } function getMaxTotalImbalance(ERC20 token) internal view returns(uint) { return tokenControlInfo[token].maxTotalImbalance; } function encodeTokenImbalanceData(TokenImbalanceData data) internal pure returns(uint) { // check for overflows require(data.lastBlockBuyUnitsImbalance < int(POW_2_64 / 2)); require(data.lastBlockBuyUnitsImbalance > int(-1 * int(POW_2_64) / 2)); require(data.lastBlock < POW_2_64); require(data.totalBuyUnitsImbalance < int(POW_2_64 / 2)); require(data.totalBuyUnitsImbalance > int(-1 * int(POW_2_64) / 2)); require(data.lastRateUpdateBlock < POW_2_64); // do encoding uint result = uint(data.lastBlockBuyUnitsImbalance) & (POW_2_64 - 1); result |= data.lastBlock * POW_2_64; result |= (uint(data.totalBuyUnitsImbalance) & (POW_2_64 - 1)) * POW_2_64 * POW_2_64; result |= data.lastRateUpdateBlock * POW_2_64 * POW_2_64 * POW_2_64; return result; } function decodeTokenImbalanceData(uint input) internal pure returns(TokenImbalanceData) { TokenImbalanceData memory data; data.lastBlockBuyUnitsImbalance = int(int64(input & (POW_2_64 - 1))); data.lastBlock = uint(uint64((input / POW_2_64) & (POW_2_64 - 1))); data.totalBuyUnitsImbalance = int(int64((input / (POW_2_64 * POW_2_64)) & (POW_2_64 - 1))); data.lastRateUpdateBlock = uint(uint64((input / (POW_2_64 * POW_2_64 * POW_2_64)))); return data; } }
pragma solidity 0.4.18; import "./ERC20Interface.sol"; import "./PermissionGroups.sol"; /** * @title Contracts that should be able to recover tokens or ethers * @author Ilan Doron * @dev This allows to recover any tokens or Ethers received in a contract. * This will prevent any accidental loss of tokens. */ contract Withdrawable is PermissionGroups { event TokenWithdraw(ERC20 token, uint amount, address sendTo); /** * @dev Withdraw all ERC20 compatible tokens * @param token ERC20 The address of the token contract */ function withdrawToken(ERC20 token, uint amount, address sendTo) external onlyAdmin { require(token.transfer(sendTo, amount)); TokenWithdraw(token, amount, sendTo); } event EtherWithdraw(uint amount, address sendTo); /** * @dev Withdraw Ethers */ function withdrawEther(uint amount, address sendTo) external onlyAdmin { sendTo.transfer(amount); EtherWithdraw(amount, sendTo); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"alerter","type":"address"}],"name":"removeAlerter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"reserve","type":"address"}],"name":"setReserveAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"disableTokenTrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"validRateDurationInBlocks","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokens","type":"address[]"},{"name":"baseBuy","type":"uint256[]"},{"name":"baseSell","type":"uint256[]"},{"name":"buy","type":"bytes14[]"},{"name":"sell","type":"bytes14[]"},{"name":"blockNumber","type":"uint256"},{"name":"indices","type":"uint256[]"}],"name":"setBaseRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"enableTokenTrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOperators","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getListedTokens","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"},{"name":"sendTo","type":"address"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newAlerter","type":"address"}],"name":"addAlerter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"numTokensInCurrentCompactData","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"command","type":"uint256"},{"name":"param","type":"uint256"}],"name":"getStepFunctionData","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"buy","type":"bytes14[]"},{"name":"sell","type":"bytes14[]"},{"name":"blockNumber","type":"uint256"},{"name":"indices","type":"uint256[]"}],"name":"setCompactData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"duration","type":"uint256"}],"name":"setValidRateDurationInBlocks","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"getTokenBasicData","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"transferAdminQuickly","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAlerters","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"getRateUpdateBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"xBuy","type":"int256[]"},{"name":"yBuy","type":"int256[]"},{"name":"xSell","type":"int256[]"},{"name":"ySell","type":"int256[]"}],"name":"setQtyStepFunction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reserveContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"tokenImbalanceData","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"currentBlockNumber","type":"uint256"},{"name":"buy","type":"bool"},{"name":"qty","type":"uint256"}],"name":"getRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"xBuy","type":"int256[]"},{"name":"yBuy","type":"int256[]"},{"name":"xSell","type":"int256[]"},{"name":"ySell","type":"int256[]"}],"name":"setImbalanceStepFunction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"minimalRecordResolution","type":"uint256"},{"name":"maxPerBlockImbalance","type":"uint256"},{"name":"maxTotalImbalance","type":"uint256"}],"name":"setTokenControlInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"buyAmount","type":"int256"},{"name":"rateUpdateBlock","type":"uint256"},{"name":"currentBlock","type":"uint256"}],"name":"recordImbalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"sendTo","type":"address"}],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"buy","type":"bool"}],"name":"getBasicRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"addToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"getCompactData","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"bytes1"},{"name":"","type":"bytes1"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"getTokenControlInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_admin","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"sendTo","type":"address"}],"name":"TokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"sendTo","type":"address"}],"name":"EtherWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"pendingAdmin","type":"address"}],"name":"TransferAdminPending","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAdmin","type":"address"},{"indexed":false,"name":"previousAdmin","type":"address"}],"name":"AdminClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAlerter","type":"address"},{"indexed":false,"name":"isAdd","type":"bool"}],"name":"AlerterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOperator","type":"address"},{"indexed":false,"name":"isAdd","type":"bool"}],"name":"OperatorAdded","type":"event"}]
Contract Creation Code
6060604052600a6009556000600d55341561001957600080fd5b60405160208061312b8339810160405280805160008054600160a060020a03191633600160a060020a03908116919091179091559092508291508116151561006057600080fd5b60008054600160a060020a03909216600160a060020a03199092169190911790555061309a806100916000396000f3006060604052600436106101a85763ffffffff60e060020a60003504166301a12fd381146101ad57806314673d31146101ce578063158859f7146101ed578063162656941461020c5780631a4813d7146102315780631d6a8bda146103c957806326782247146103e857806327a099d8146104175780632ba996a51461047d5780633ccdbb2814610490578063408ee7fe146104b95780635085c9f1146104d857806362674e93146104eb57806364887334146105105780636c6295b8146105e8578063721bba59146105fe57806375829def1461063957806377f50f97146106585780637acc86781461066b5780637c423f541461068a5780638036d7571461069d57806380d8b380146106bc5780639870d7fe146107d9578063a7f43acd146107f8578063a80c609e1461080b578063ac8a584a1461082d578063b8e9c22e1461084c578063bc9cbcc814610876578063bfee356914610993578063c6fd2103146109bb578063ce56c454146109e3578063cf8fee1114610a05578063d48bfca714610a29578063e4a2ac6214610a48578063e7d4fd9114610ab6578063f851a44014610af9575b600080fd5b34156101b857600080fd5b6101cc600160a060020a0360043516610b0c565b005b34156101d957600080fd5b6101cc600160a060020a0360043516610c7c565b34156101f857600080fd5b6101cc600160a060020a0360043516610cb9565b341561021757600080fd5b61021f610d29565b60405190815260200160405180910390f35b341561023c57600080fd5b6101cc60046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001909190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610d2f95505050505050565b34156103d457600080fd5b6101cc600160a060020a0360043516610e95565b34156103f357600080fd5b6103fb610f21565b604051600160a060020a03909116815260200160405180910390f35b341561042257600080fd5b61042a610f30565b60405160208082528190810183818151815260200191508051906020019060200280838360005b83811015610469578082015183820152602001610451565b505050509050019250505060405180910390f35b341561048857600080fd5b61042a610f99565b341561049b57600080fd5b6101cc600160a060020a036004358116906024359060443516610fff565b34156104c457600080fd5b6101cc600160a060020a03600435166110f6565b34156104e357600080fd5b61021f6111f2565b34156104f657600080fd5b61021f600160a060020a03600435166024356044356111f8565b341561051b57600080fd5b6101cc600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506114ec95505050505050565b34156105f357600080fd5b6101cc60043561162d565b341561060957600080fd5b61061d600160a060020a036004351661164d565b6040519115158252151560208201526040908101905180910390f35b341561064457600080fd5b6101cc600160a060020a0360043516611675565b341561066357600080fd5b6101cc611710565b341561067657600080fd5b6101cc600160a060020a03600435166117aa565b341561069557600080fd5b61042a61188c565b34156106a857600080fd5b61021f600160a060020a03600435166118f2565b34156106c757600080fd5b6101cc60048035600160a060020a031690604460248035908101908301358060208082020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061193d95505050505050565b34156107e457600080fd5b6101cc600160a060020a0360043516611a85565b341561080357600080fd5b6103fb611b55565b341561081657600080fd5b61021f600160a060020a0360043516602435611b64565b341561083857600080fd5b6101cc600160a060020a0360043516611b81565b341561085757600080fd5b61021f600160a060020a03600435166024356044351515606435611ced565b341561088157600080fd5b6101cc60048035600160a060020a031690604460248035908101908301358060208082020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061228395505050505050565b341561099e57600080fd5b6101cc600160a060020a03600435166024356044356064356123b2565b34156109c657600080fd5b6101cc600160a060020a0360043516602435604435606435612420565b34156109ee57600080fd5b6101cc600435600160a060020a0360243516612460565b3415610a1057600080fd5b61021f600160a060020a036004351660243515156124f3565b3415610a3457600080fd5b6101cc600160a060020a0360043516612541565b3415610a5357600080fd5b610a67600160a060020a036004351661264e565b60405193845260208401929092527fff00000000000000000000000000000000000000000000000000000000000000908116604080850191909152911660608301526080909101905180910390f35b3415610ac157600080fd5b610ad5600160a060020a0360043516612712565b60405180848152602001838152602001828152602001935050505060405180910390f35b3415610b0457600080fd5b6103fb61273a565b6000805433600160a060020a03908116911614610b2857600080fd5b600160a060020a03821660009081526003602052604090205460ff161515610b4f57600080fd5b50600160a060020a0381166000908152600360205260408120805460ff191690555b600554811015610c785781600160a060020a0316600582815481101515610b9457fe5b600091825260209091200154600160a060020a03161415610c7057600580546000198101908110610bc157fe5b60009182526020909120015460058054600160a060020a039092169183908110610be757fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556005805490610c23906000198301612fa5565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051600160a060020a039092168252151560208201526040908101905180910390a1610c78565b600101610b71565b5050565b60005433600160a060020a03908116911614610c9757600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b600160a060020a03331660009081526003602052604090205460ff161515610ce057600080fd5b600160a060020a0381166000908152600b602052604090205460ff161515610d0757600080fd5b600160a060020a03166000908152600b60205260409020805461ff0019169055565b60095481565b600160a060020a03331660009081526002602052604081205460ff161515610d5657600080fd5b8651885114610d6457600080fd5b8551885114610d7257600080fd5b8451845114610d8057600080fd5b8151845114610d8e57600080fd5b5060005b8751811015610e7f57600b6000898381518110610dab57fe5b90602001906020020151600160a060020a0316815260208101919091526040016000205460ff161515610ddd57600080fd5b868181518110610de957fe5b90602001906020020151600b60008a8481518110610e0357fe5b90602001906020020151600160a060020a03168152602081019190915260400160002060030155858181518110610e3657fe5b90602001906020020151600b60008a8481518110610e5057fe5b90602001906020020151600160a060020a03168152602081019190915260400160002060040155600101610d92565b610e8b858585856114ec565b5050505050505050565b60005433600160a060020a03908116911614610eb057600080fd5b600160a060020a0381166000908152600b602052604090205460ff161515610ed757600080fd5b600160a060020a0381166000908152600660205260409020541515610efb57600080fd5b600160a060020a03166000908152600b60205260409020805461ff001916610100179055565b600154600160a060020a031681565b610f38612fce565b6004805480602002602001604051908101604052809291908181526020018280548015610f8e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f70575b505050505090505b90565b610fa1612fce565b600a805480602002602001604051908101604052809291908181526020018280548015610f8e57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610f70575050505050905090565b60005433600160a060020a0390811691161461101a57600080fd5b82600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561107757600080fd5b6102c65a03f1151561108857600080fd5b50505060405180519050151561109d57600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051600160a060020a03938416815260208101929092529091166040808301919091526060909101905180910390a1505050565b60005433600160a060020a0390811691161461111157600080fd5b600160a060020a03811660009081526003602052604090205460ff161561113757600080fd5b6005546032901061114757600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600360205260409020805460ff1916600190811790915560058054909181016111c68382612fa5565b5060009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055565b600d5481565b60008215156112235750600160a060020a0383166000908152600b60205260409020600501546114e5565b826001141561126657600160a060020a0384166000908152600b6020526040902060050180548390811061125357fe5b90600052602060002090015490506114e5565b82600214156112915750600160a060020a0383166000908152600b60205260409020600601546114e5565b82600314156112c157600160a060020a0384166000908152600b6020526040902060060180548390811061125357fe5b82600414156112ec5750600160a060020a0383166000908152600b60205260409020600701546114e5565b826005141561131c57600160a060020a0384166000908152600b6020526040902060070180548390811061125357fe5b82600614156113475750600160a060020a0383166000908152600b60205260409020600801546114e5565b826007141561137757600160a060020a0384166000908152600b6020526040902060080180548390811061125357fe5b82600814156113a25750600160a060020a0383166000908152600b60205260409020600901546114e5565b82600914156113d257600160a060020a0384166000908152600b6020526040902060090180548390811061125357fe5b82600a14156113fd5750600160a060020a0383166000908152600b60205260409020600a01546114e5565b82600b141561142d57600160a060020a0384166000908152600b60205260409020600a0180548390811061125357fe5b82600c14156114595750600160a060020a0383166000908152600b6020819052604090912001546114e5565b82600d141561148a57600160a060020a0384166000908152600b602081905260409091200180548390811061125357fe5b82600e14156114b55750600160a060020a0383166000908152600b60205260409020600c01546114e5565b82600f14156101a857600160a060020a0384166000908152600b60205260409020600c0180548390811061125357fe5b9392505050565b600160a060020a0333166000908152600260205260408120548190819060ff16151561151757600080fd5b855187511461152557600080fd5b865184511461153357600080fd5b63ffffffff85111561154457600080fd5b6e0100000000000000000000000000009250600091505b835182101561162457600c5484838151811061157357fe5b906020019060200201511061158757600080fd5b82830285028387848151811061159957fe5b9060200190602002015172010000000000000000000000000000000000009004028884815181106115c657fe5b90602001906020020151720100000000000000000000000000000000000090041717905080600c8584815181106115f957fe5b906020019060200201518154811061160d57fe5b60009182526020909120015560019091019061155b565b50505050505050565b60005433600160a060020a0390811691161461164857600080fd5b600955565b600160a060020a03166000908152600b602052604090205460ff808216926101009092041690565b60005433600160a060020a0390811691161461169057600080fd5b600160a060020a03811615156116a557600080fd5b6001547f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4090600160a060020a0316604051600160a060020a03909116815260200160405180910390a160018054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a0390811691161461172b57600080fd5b6001546000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed91600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a16001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b60005433600160a060020a039081169116146117c557600080fd5b600160a060020a03811615156117da57600080fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051600160a060020a03909116815260200160405180910390a16000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a160008054600160a060020a031916600160a060020a0392909216919091179055565b611894612fce565b6005805480602002602001604051908101604052809291908181526020018280548015610f8e57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610f70575050505050905090565b600160a060020a0381166000908152600b6020526040812060010154600c8054839290811061191d57fe5b906000526020600020900154905061193481612749565b91505b50919050565b600160a060020a03331660009081526002602052604090205460ff16151561196457600080fd5b825184511461197257600080fd5b805182511461198057600080fd5b600a8451111561198f57600080fd5b600a8251111561199e57600080fd5b600160a060020a0385166000908152600b602052604090205460ff1615156119c557600080fd5b6040805190810160409081528582526020808301869052600160a060020a0388166000908152600b90915220600501815181908051611a08929160200190612fe0565b50602082015181600101908051611a23929160200190612fe0565b509050506040805190810160409081528382526020808301849052600160a060020a0388166000908152600b90915220600701815181908051611a6a929160200190612fe0565b50602082015181600101908051610e8b929160200190612fe0565b60005433600160a060020a03908116911614611aa057600080fd5b600160a060020a03811660009081526002602052604090205460ff1615611ac657600080fd5b60045460329010611ad657600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600260205260409020805460ff1916600190811790915560048054909181016111c68382612fa5565b600e54600160a060020a031681565b600760209081526000928352604080842090915290825290205481565b6000805433600160a060020a03908116911614611b9d57600080fd5b600160a060020a03821660009081526002602052604090205460ff161515611bc457600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b600454811015610c785781600160a060020a0316600482815481101515611c0957fe5b600091825260209091200154600160a060020a03161415611ce557600480546000198101908110611c3657fe5b60009182526020909120015460048054600160a060020a039092169183908110611c5c57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600480546000190190611c989082612fa5565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051600160a060020a039092168252151560208201526040908101905180910390a1610c78565b600101611be6565b600160a060020a0384166000908152600b602052604081205481908190819081908190819081908190610100900460ff161515611d2d5760009850612273565b600160a060020a038d166000908152600660205260409020541515611d555760009850612273565b600160a060020a038d166000908152600b6020526040902060010154600c80549091908110611d8057fe5b9060005260206000209001549750611d9788612749565b60095490975087018c10611dae5760009850612273565b611db98d888e612756565b90965094508a15611ffd5750600160a060020a038c166000908152600b6020526040902060030154611ded888e600161278b565b91508160000b600a029250611e0281846127e4565b9050611e0f8d828c612830565b600160a060020a038e166000908152600b602052604090819020919b50968b01968b9550611efa91600501908051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611e9357602002820191906000526020600020905b815481526020019060010190808311611e7f575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611eeb57602002820191906000526020600020905b815481526020019060010190808311611ed7575b5050505050815250508b61285a565b9250611f0681846127e4565b600160a060020a038e166000908152600b602052604090819020919250611fea91600901908051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611f8357602002820191906000526020600020905b815481526020019060010190808311611f6f575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611fdb57602002820191906000526020600020905b815481526020019060010190808311611fc7575b5050505050815250508761285a565b9250611ff681846127e4565b905061222d565b50600160a060020a038c166000908152600b6020526040812060040154906120289089908f9061278b565b91508160000b600a02925061203d81846127e4565b600160a060020a038e166000908152600b6020526040908190206000198d0298890198965091925061212891600701908051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611e935760200282019190600052602060002090815481526020019060010190808311611e7f575050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611eeb5760200282019190600052602060002090815481526020019060010190808311611ed7575050505050815250508b61285a565b925061213481846127e4565b905061221e600b60008f600160a060020a0316600160a060020a03168152602001908152602001600020600b0160408051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611f835760200282019190600052602060002090815481526020019060010190808311611f6f575050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611fdb5760200282019190600052602060002090815481526020019060010190808311611fc7575050505050815250508761285a565b925061222a81846127e4565b90505b6122368d6128e2565b61223f87612900565b1061224d5760009850612273565b6122568d61291c565b612261858701612900565b1061226f5760009850612273565b8098505b5050505050505050949350505050565b600160a060020a03331660009081526002602052604090205460ff1615156122aa57600080fd5b82518451146122b857600080fd5b80518251146122c657600080fd5b600a845111156122d557600080fd5b600a825111156122e457600080fd5b600160a060020a0385166000908152600b602052604090205460ff16151561230b57600080fd5b6040805190810160409081528582526020808301869052600160a060020a0388166000908152600b9091522060090181518190805161234e929160200190612fe0565b50602082015181600101908051612369929160200190612fe0565b509050506040805190810160409081528382526020808301849052600160a060020a0388166000908152600b918290529190912001815181908051611a6a929160200190612fe0565b60005433600160a060020a039081169116146123cd57600080fd5b606060405190810160409081528482526020808301859052818301849052600160a060020a0387166000908152600690915220815181556020820151816001015560408201516002909101555050505050565b600e5433600160a060020a0390811691161461243b57600080fd5b81151561244e5761244b846118f2565b91505b61245a8484848461293a565b50505050565b60005433600160a060020a0390811691161461247b57600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f1935050505015156124ac57600080fd5b7fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de8282604051918252600160a060020a031660208201526040908101905180910390a15050565b6000811561251d5750600160a060020a0382166000908152600b602052604090206003015461253b565b50600160a060020a0382166000908152600b60205260409020600401545b92915050565b60005433600160a060020a0390811691161461255c57600080fd5b600160a060020a0381166000908152600b602052604090205460ff161561258257600080fd5b600160a060020a0381166000908152600b60205260409020805460ff19166001908117909155600a8054909181016125ba8382612fa5565b5060009182526020909120018054600160a060020a031916600160a060020a038316179055600d5415156125fc57600c8054906125fa9060018301612fa5565b505b600c54600160a060020a0382166000908152600b60205260409020600019909101600182810191909155600d546002909201829055600e910106600d5561264281612a6a565b61264b81612aa5565b50565b600160a060020a0381166000908152600b60205260408120548190819081908190819060ff16151561267f57600080fd5b5050600160a060020a0385166000908152600b602052604090206001810154600290910154600c8054839183916126cf9190849081106126bb57fe5b9060005260206000209001548a600161278b565b60f860020a026126fb600c868154811015156126e757fe5b9060005260206000209001548b600061278b565b60f860020a02955095509550955050509193509193565b600160a060020a03166000908152600660205260409020805460018201546002909201549092565b600054600160a060020a031681565b60e060020a81045b919050565b600160a060020a038316600090815260066020526040812054819061277c868686612b67565b90820297910295509350505050565b600160a060020a0382166000908152600b60205260408120600201548183156127b85750601281016127be565b50600481015b8581602081106127ca57fe5b1a60f860020a0260f860020a900492505b50509392505050565b60008069d3c21bcecceda10000008411156127fe57600080fd5b61270f1983121561280e57600080fd5b64174876e80083131561282057600080fd5b5050612710908101919091020490565b600080600061283e86612c55565b91506012905061285085828487612d0f565b9695505050505050565b60008060008460200151519150600090505b818110156128ba578451818151811061288157fe5b9060200190602002015184136128b257846020015181815181106128a157fe5b9060200190602002015192506128da565b60010161286c565b846020015160018303815181106128cd57fe5b9060200190602002015192505b505092915050565b600160a060020a031660009081526006602052604090206002015490565b60008082121561291557506000198102612751565b5080612751565b600160a060020a031660009081526006602052604090206001015490565b600080600061294761302b565b600160a060020a0388166000908152600660205260408120546005870695508881151561297057fe5b600160a060020a038b1660009081526007602090815260408083208a845290915281205492909105955093506129a590612da8565b91508582602001511415612a045786826060015114156129d9578382818151019052508360408301818151019052506129ff565b6129e4898888612e35565b84810160408401529250838281815101905250606082018790525b612a2e565b612a0f898888612b67565b8584526020840188905260608401899052858201604085015290935090505b612a3782612ebd565b600160a060020a039099166000908152600760209081526040808320978352969052949094209790975550505050505050565b60005b6005811015610c7857600160a060020a0382166000908152600760209081526040808320848452909152902060019081905501612a6d565b600160a060020a03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612aeb57600160a060020a03811660009081526008602052604090206012905561264b565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612b3157600080fd5b6102c65a03f11515612b4257600080fd5b5050506040518051600160a060020a0383166000908152600860205260409020555050565b6000806000806000806000612b7a61302b565b60009750600096506000955060009450899350889250600091505b6005821015612c3c57600160a060020a038b166000908152600760209081526040808320858452909152902054612bcb90612da8565b905082816020015111158015612be5575083816020015110155b15612bf1578051850194505b89816060015114612c0157612c31565b8581602001511015612c1257612c31565b80602001519550806040015197508881602001511415612c3157805196505b600190910190612b95565b871515612c47578497505b505050505050935093915050565b600080600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612c865760129150611937565b50600160a060020a03821660009081526008602052604090205480151561253b5782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612ced57600080fd5b6102c65a03f11515612cfe57600080fd5b505050604051805190509150611937565b60006b204fce5e3e25026110000000851115612d2a57600080fd5b69d3c21bcecceda1000000821115612d4157600080fd5b838310612d745760128484031115612d5857600080fd5b670de0b6b3a7640000858302858503600a0a025b049050612da0565b60128385031115612d8457600080fd5b828403600a0a670de0b6b3a764000002828602811515612d6c57fe5b949350505050565b612db061302b565b612db861302b565b67ffffffffffffffff83811660070b82526801000000000000000084041667ffffffffffffffff908116602083015270010000000000000000000000000000000084041660070b60408201527801000000000000000000000000000000000000000000000000830467ffffffffffffffff16606082015292915050565b600080612e4061302b565b83851115612e4d57600080fd5b60009250600091505b60058210156127db57600160a060020a0386166000908152600760209081526040808320858452909152902054612e8c90612da8565b905083816020015111158015612ea6575084816020015110155b15612eb2578051830192505b600190910190612e56565b600080678000000000000000835112612ed557600080fd5b677fffffffffffffff19835113612eeb57600080fd5b68010000000000000000836020015110612f0457600080fd5b678000000000000000604084015112612f1c57600080fd5b677fffffffffffffff19604084015113612f3557600080fd5b68010000000000000000836060015110612f4e57600080fd5b67ffffffffffffffff83511690506801000000000000000083602001510217680100000000000000008067ffffffffffffffff60408601511602021768010000000000000000808060608601510202021792915050565b815481835581811511612fc957600083815260209020612fc9918101908301613054565b505050565b60206040519081016040526000815290565b82805482825590600052602060002090810192821561301b579160200282015b8281111561301b578251825591602001919060010190613000565b50613027929150613054565b5090565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b610f9691905b80821115613027576000815560010161305a5600a165627a7a72305820272979d574a58445059369ef882278910978e5812673eb18faa6a78257f979e20029000000000000000000000000189ea49c4d5717ab6f7566deaf0690b9504087bd
Deployed Bytecode
0x6060604052600436106101a85763ffffffff60e060020a60003504166301a12fd381146101ad57806314673d31146101ce578063158859f7146101ed578063162656941461020c5780631a4813d7146102315780631d6a8bda146103c957806326782247146103e857806327a099d8146104175780632ba996a51461047d5780633ccdbb2814610490578063408ee7fe146104b95780635085c9f1146104d857806362674e93146104eb57806364887334146105105780636c6295b8146105e8578063721bba59146105fe57806375829def1461063957806377f50f97146106585780637acc86781461066b5780637c423f541461068a5780638036d7571461069d57806380d8b380146106bc5780639870d7fe146107d9578063a7f43acd146107f8578063a80c609e1461080b578063ac8a584a1461082d578063b8e9c22e1461084c578063bc9cbcc814610876578063bfee356914610993578063c6fd2103146109bb578063ce56c454146109e3578063cf8fee1114610a05578063d48bfca714610a29578063e4a2ac6214610a48578063e7d4fd9114610ab6578063f851a44014610af9575b600080fd5b34156101b857600080fd5b6101cc600160a060020a0360043516610b0c565b005b34156101d957600080fd5b6101cc600160a060020a0360043516610c7c565b34156101f857600080fd5b6101cc600160a060020a0360043516610cb9565b341561021757600080fd5b61021f610d29565b60405190815260200160405180910390f35b341561023c57600080fd5b6101cc60046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001909190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610d2f95505050505050565b34156103d457600080fd5b6101cc600160a060020a0360043516610e95565b34156103f357600080fd5b6103fb610f21565b604051600160a060020a03909116815260200160405180910390f35b341561042257600080fd5b61042a610f30565b60405160208082528190810183818151815260200191508051906020019060200280838360005b83811015610469578082015183820152602001610451565b505050509050019250505060405180910390f35b341561048857600080fd5b61042a610f99565b341561049b57600080fd5b6101cc600160a060020a036004358116906024359060443516610fff565b34156104c457600080fd5b6101cc600160a060020a03600435166110f6565b34156104e357600080fd5b61021f6111f2565b34156104f657600080fd5b61021f600160a060020a03600435166024356044356111f8565b341561051b57600080fd5b6101cc600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506114ec95505050505050565b34156105f357600080fd5b6101cc60043561162d565b341561060957600080fd5b61061d600160a060020a036004351661164d565b6040519115158252151560208201526040908101905180910390f35b341561064457600080fd5b6101cc600160a060020a0360043516611675565b341561066357600080fd5b6101cc611710565b341561067657600080fd5b6101cc600160a060020a03600435166117aa565b341561069557600080fd5b61042a61188c565b34156106a857600080fd5b61021f600160a060020a03600435166118f2565b34156106c757600080fd5b6101cc60048035600160a060020a031690604460248035908101908301358060208082020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061193d95505050505050565b34156107e457600080fd5b6101cc600160a060020a0360043516611a85565b341561080357600080fd5b6103fb611b55565b341561081657600080fd5b61021f600160a060020a0360043516602435611b64565b341561083857600080fd5b6101cc600160a060020a0360043516611b81565b341561085757600080fd5b61021f600160a060020a03600435166024356044351515606435611ced565b341561088157600080fd5b6101cc60048035600160a060020a031690604460248035908101908301358060208082020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061228395505050505050565b341561099e57600080fd5b6101cc600160a060020a03600435166024356044356064356123b2565b34156109c657600080fd5b6101cc600160a060020a0360043516602435604435606435612420565b34156109ee57600080fd5b6101cc600435600160a060020a0360243516612460565b3415610a1057600080fd5b61021f600160a060020a036004351660243515156124f3565b3415610a3457600080fd5b6101cc600160a060020a0360043516612541565b3415610a5357600080fd5b610a67600160a060020a036004351661264e565b60405193845260208401929092527fff00000000000000000000000000000000000000000000000000000000000000908116604080850191909152911660608301526080909101905180910390f35b3415610ac157600080fd5b610ad5600160a060020a0360043516612712565b60405180848152602001838152602001828152602001935050505060405180910390f35b3415610b0457600080fd5b6103fb61273a565b6000805433600160a060020a03908116911614610b2857600080fd5b600160a060020a03821660009081526003602052604090205460ff161515610b4f57600080fd5b50600160a060020a0381166000908152600360205260408120805460ff191690555b600554811015610c785781600160a060020a0316600582815481101515610b9457fe5b600091825260209091200154600160a060020a03161415610c7057600580546000198101908110610bc157fe5b60009182526020909120015460058054600160a060020a039092169183908110610be757fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556005805490610c23906000198301612fa5565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051600160a060020a039092168252151560208201526040908101905180910390a1610c78565b600101610b71565b5050565b60005433600160a060020a03908116911614610c9757600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b600160a060020a03331660009081526003602052604090205460ff161515610ce057600080fd5b600160a060020a0381166000908152600b602052604090205460ff161515610d0757600080fd5b600160a060020a03166000908152600b60205260409020805461ff0019169055565b60095481565b600160a060020a03331660009081526002602052604081205460ff161515610d5657600080fd5b8651885114610d6457600080fd5b8551885114610d7257600080fd5b8451845114610d8057600080fd5b8151845114610d8e57600080fd5b5060005b8751811015610e7f57600b6000898381518110610dab57fe5b90602001906020020151600160a060020a0316815260208101919091526040016000205460ff161515610ddd57600080fd5b868181518110610de957fe5b90602001906020020151600b60008a8481518110610e0357fe5b90602001906020020151600160a060020a03168152602081019190915260400160002060030155858181518110610e3657fe5b90602001906020020151600b60008a8481518110610e5057fe5b90602001906020020151600160a060020a03168152602081019190915260400160002060040155600101610d92565b610e8b858585856114ec565b5050505050505050565b60005433600160a060020a03908116911614610eb057600080fd5b600160a060020a0381166000908152600b602052604090205460ff161515610ed757600080fd5b600160a060020a0381166000908152600660205260409020541515610efb57600080fd5b600160a060020a03166000908152600b60205260409020805461ff001916610100179055565b600154600160a060020a031681565b610f38612fce565b6004805480602002602001604051908101604052809291908181526020018280548015610f8e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f70575b505050505090505b90565b610fa1612fce565b600a805480602002602001604051908101604052809291908181526020018280548015610f8e57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610f70575050505050905090565b60005433600160a060020a0390811691161461101a57600080fd5b82600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561107757600080fd5b6102c65a03f1151561108857600080fd5b50505060405180519050151561109d57600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051600160a060020a03938416815260208101929092529091166040808301919091526060909101905180910390a1505050565b60005433600160a060020a0390811691161461111157600080fd5b600160a060020a03811660009081526003602052604090205460ff161561113757600080fd5b6005546032901061114757600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600360205260409020805460ff1916600190811790915560058054909181016111c68382612fa5565b5060009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055565b600d5481565b60008215156112235750600160a060020a0383166000908152600b60205260409020600501546114e5565b826001141561126657600160a060020a0384166000908152600b6020526040902060050180548390811061125357fe5b90600052602060002090015490506114e5565b82600214156112915750600160a060020a0383166000908152600b60205260409020600601546114e5565b82600314156112c157600160a060020a0384166000908152600b6020526040902060060180548390811061125357fe5b82600414156112ec5750600160a060020a0383166000908152600b60205260409020600701546114e5565b826005141561131c57600160a060020a0384166000908152600b6020526040902060070180548390811061125357fe5b82600614156113475750600160a060020a0383166000908152600b60205260409020600801546114e5565b826007141561137757600160a060020a0384166000908152600b6020526040902060080180548390811061125357fe5b82600814156113a25750600160a060020a0383166000908152600b60205260409020600901546114e5565b82600914156113d257600160a060020a0384166000908152600b6020526040902060090180548390811061125357fe5b82600a14156113fd5750600160a060020a0383166000908152600b60205260409020600a01546114e5565b82600b141561142d57600160a060020a0384166000908152600b60205260409020600a0180548390811061125357fe5b82600c14156114595750600160a060020a0383166000908152600b6020819052604090912001546114e5565b82600d141561148a57600160a060020a0384166000908152600b602081905260409091200180548390811061125357fe5b82600e14156114b55750600160a060020a0383166000908152600b60205260409020600c01546114e5565b82600f14156101a857600160a060020a0384166000908152600b60205260409020600c0180548390811061125357fe5b9392505050565b600160a060020a0333166000908152600260205260408120548190819060ff16151561151757600080fd5b855187511461152557600080fd5b865184511461153357600080fd5b63ffffffff85111561154457600080fd5b6e0100000000000000000000000000009250600091505b835182101561162457600c5484838151811061157357fe5b906020019060200201511061158757600080fd5b82830285028387848151811061159957fe5b9060200190602002015172010000000000000000000000000000000000009004028884815181106115c657fe5b90602001906020020151720100000000000000000000000000000000000090041717905080600c8584815181106115f957fe5b906020019060200201518154811061160d57fe5b60009182526020909120015560019091019061155b565b50505050505050565b60005433600160a060020a0390811691161461164857600080fd5b600955565b600160a060020a03166000908152600b602052604090205460ff808216926101009092041690565b60005433600160a060020a0390811691161461169057600080fd5b600160a060020a03811615156116a557600080fd5b6001547f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4090600160a060020a0316604051600160a060020a03909116815260200160405180910390a160018054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a0390811691161461172b57600080fd5b6001546000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed91600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a16001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b60005433600160a060020a039081169116146117c557600080fd5b600160a060020a03811615156117da57600080fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051600160a060020a03909116815260200160405180910390a16000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a160008054600160a060020a031916600160a060020a0392909216919091179055565b611894612fce565b6005805480602002602001604051908101604052809291908181526020018280548015610f8e57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610f70575050505050905090565b600160a060020a0381166000908152600b6020526040812060010154600c8054839290811061191d57fe5b906000526020600020900154905061193481612749565b91505b50919050565b600160a060020a03331660009081526002602052604090205460ff16151561196457600080fd5b825184511461197257600080fd5b805182511461198057600080fd5b600a8451111561198f57600080fd5b600a8251111561199e57600080fd5b600160a060020a0385166000908152600b602052604090205460ff1615156119c557600080fd5b6040805190810160409081528582526020808301869052600160a060020a0388166000908152600b90915220600501815181908051611a08929160200190612fe0565b50602082015181600101908051611a23929160200190612fe0565b509050506040805190810160409081528382526020808301849052600160a060020a0388166000908152600b90915220600701815181908051611a6a929160200190612fe0565b50602082015181600101908051610e8b929160200190612fe0565b60005433600160a060020a03908116911614611aa057600080fd5b600160a060020a03811660009081526002602052604090205460ff1615611ac657600080fd5b60045460329010611ad657600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600260205260409020805460ff1916600190811790915560048054909181016111c68382612fa5565b600e54600160a060020a031681565b600760209081526000928352604080842090915290825290205481565b6000805433600160a060020a03908116911614611b9d57600080fd5b600160a060020a03821660009081526002602052604090205460ff161515611bc457600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b600454811015610c785781600160a060020a0316600482815481101515611c0957fe5b600091825260209091200154600160a060020a03161415611ce557600480546000198101908110611c3657fe5b60009182526020909120015460048054600160a060020a039092169183908110611c5c57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600480546000190190611c989082612fa5565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051600160a060020a039092168252151560208201526040908101905180910390a1610c78565b600101611be6565b600160a060020a0384166000908152600b602052604081205481908190819081908190819081908190610100900460ff161515611d2d5760009850612273565b600160a060020a038d166000908152600660205260409020541515611d555760009850612273565b600160a060020a038d166000908152600b6020526040902060010154600c80549091908110611d8057fe5b9060005260206000209001549750611d9788612749565b60095490975087018c10611dae5760009850612273565b611db98d888e612756565b90965094508a15611ffd5750600160a060020a038c166000908152600b6020526040902060030154611ded888e600161278b565b91508160000b600a029250611e0281846127e4565b9050611e0f8d828c612830565b600160a060020a038e166000908152600b602052604090819020919b50968b01968b9550611efa91600501908051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611e9357602002820191906000526020600020905b815481526020019060010190808311611e7f575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611eeb57602002820191906000526020600020905b815481526020019060010190808311611ed7575b5050505050815250508b61285a565b9250611f0681846127e4565b600160a060020a038e166000908152600b602052604090819020919250611fea91600901908051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611f8357602002820191906000526020600020905b815481526020019060010190808311611f6f575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611fdb57602002820191906000526020600020905b815481526020019060010190808311611fc7575b5050505050815250508761285a565b9250611ff681846127e4565b905061222d565b50600160a060020a038c166000908152600b6020526040812060040154906120289089908f9061278b565b91508160000b600a02925061203d81846127e4565b600160a060020a038e166000908152600b6020526040908190206000198d0298890198965091925061212891600701908051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611e935760200282019190600052602060002090815481526020019060010190808311611e7f575050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611eeb5760200282019190600052602060002090815481526020019060010190808311611ed7575050505050815250508b61285a565b925061213481846127e4565b905061221e600b60008f600160a060020a0316600160a060020a03168152602001908152602001600020600b0160408051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611f835760200282019190600052602060002090815481526020019060010190808311611f6f575050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611fdb5760200282019190600052602060002090815481526020019060010190808311611fc7575050505050815250508761285a565b925061222a81846127e4565b90505b6122368d6128e2565b61223f87612900565b1061224d5760009850612273565b6122568d61291c565b612261858701612900565b1061226f5760009850612273565b8098505b5050505050505050949350505050565b600160a060020a03331660009081526002602052604090205460ff1615156122aa57600080fd5b82518451146122b857600080fd5b80518251146122c657600080fd5b600a845111156122d557600080fd5b600a825111156122e457600080fd5b600160a060020a0385166000908152600b602052604090205460ff16151561230b57600080fd5b6040805190810160409081528582526020808301869052600160a060020a0388166000908152600b9091522060090181518190805161234e929160200190612fe0565b50602082015181600101908051612369929160200190612fe0565b509050506040805190810160409081528382526020808301849052600160a060020a0388166000908152600b918290529190912001815181908051611a6a929160200190612fe0565b60005433600160a060020a039081169116146123cd57600080fd5b606060405190810160409081528482526020808301859052818301849052600160a060020a0387166000908152600690915220815181556020820151816001015560408201516002909101555050505050565b600e5433600160a060020a0390811691161461243b57600080fd5b81151561244e5761244b846118f2565b91505b61245a8484848461293a565b50505050565b60005433600160a060020a0390811691161461247b57600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f1935050505015156124ac57600080fd5b7fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de8282604051918252600160a060020a031660208201526040908101905180910390a15050565b6000811561251d5750600160a060020a0382166000908152600b602052604090206003015461253b565b50600160a060020a0382166000908152600b60205260409020600401545b92915050565b60005433600160a060020a0390811691161461255c57600080fd5b600160a060020a0381166000908152600b602052604090205460ff161561258257600080fd5b600160a060020a0381166000908152600b60205260409020805460ff19166001908117909155600a8054909181016125ba8382612fa5565b5060009182526020909120018054600160a060020a031916600160a060020a038316179055600d5415156125fc57600c8054906125fa9060018301612fa5565b505b600c54600160a060020a0382166000908152600b60205260409020600019909101600182810191909155600d546002909201829055600e910106600d5561264281612a6a565b61264b81612aa5565b50565b600160a060020a0381166000908152600b60205260408120548190819081908190819060ff16151561267f57600080fd5b5050600160a060020a0385166000908152600b602052604090206001810154600290910154600c8054839183916126cf9190849081106126bb57fe5b9060005260206000209001548a600161278b565b60f860020a026126fb600c868154811015156126e757fe5b9060005260206000209001548b600061278b565b60f860020a02955095509550955050509193509193565b600160a060020a03166000908152600660205260409020805460018201546002909201549092565b600054600160a060020a031681565b60e060020a81045b919050565b600160a060020a038316600090815260066020526040812054819061277c868686612b67565b90820297910295509350505050565b600160a060020a0382166000908152600b60205260408120600201548183156127b85750601281016127be565b50600481015b8581602081106127ca57fe5b1a60f860020a0260f860020a900492505b50509392505050565b60008069d3c21bcecceda10000008411156127fe57600080fd5b61270f1983121561280e57600080fd5b64174876e80083131561282057600080fd5b5050612710908101919091020490565b600080600061283e86612c55565b91506012905061285085828487612d0f565b9695505050505050565b60008060008460200151519150600090505b818110156128ba578451818151811061288157fe5b9060200190602002015184136128b257846020015181815181106128a157fe5b9060200190602002015192506128da565b60010161286c565b846020015160018303815181106128cd57fe5b9060200190602002015192505b505092915050565b600160a060020a031660009081526006602052604090206002015490565b60008082121561291557506000198102612751565b5080612751565b600160a060020a031660009081526006602052604090206001015490565b600080600061294761302b565b600160a060020a0388166000908152600660205260408120546005870695508881151561297057fe5b600160a060020a038b1660009081526007602090815260408083208a845290915281205492909105955093506129a590612da8565b91508582602001511415612a045786826060015114156129d9578382818151019052508360408301818151019052506129ff565b6129e4898888612e35565b84810160408401529250838281815101905250606082018790525b612a2e565b612a0f898888612b67565b8584526020840188905260608401899052858201604085015290935090505b612a3782612ebd565b600160a060020a039099166000908152600760209081526040808320978352969052949094209790975550505050505050565b60005b6005811015610c7857600160a060020a0382166000908152600760209081526040808320848452909152902060019081905501612a6d565b600160a060020a03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612aeb57600160a060020a03811660009081526008602052604090206012905561264b565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612b3157600080fd5b6102c65a03f11515612b4257600080fd5b5050506040518051600160a060020a0383166000908152600860205260409020555050565b6000806000806000806000612b7a61302b565b60009750600096506000955060009450899350889250600091505b6005821015612c3c57600160a060020a038b166000908152600760209081526040808320858452909152902054612bcb90612da8565b905082816020015111158015612be5575083816020015110155b15612bf1578051850194505b89816060015114612c0157612c31565b8581602001511015612c1257612c31565b80602001519550806040015197508881602001511415612c3157805196505b600190910190612b95565b871515612c47578497505b505050505050935093915050565b600080600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612c865760129150611937565b50600160a060020a03821660009081526008602052604090205480151561253b5782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612ced57600080fd5b6102c65a03f11515612cfe57600080fd5b505050604051805190509150611937565b60006b204fce5e3e25026110000000851115612d2a57600080fd5b69d3c21bcecceda1000000821115612d4157600080fd5b838310612d745760128484031115612d5857600080fd5b670de0b6b3a7640000858302858503600a0a025b049050612da0565b60128385031115612d8457600080fd5b828403600a0a670de0b6b3a764000002828602811515612d6c57fe5b949350505050565b612db061302b565b612db861302b565b67ffffffffffffffff83811660070b82526801000000000000000084041667ffffffffffffffff908116602083015270010000000000000000000000000000000084041660070b60408201527801000000000000000000000000000000000000000000000000830467ffffffffffffffff16606082015292915050565b600080612e4061302b565b83851115612e4d57600080fd5b60009250600091505b60058210156127db57600160a060020a0386166000908152600760209081526040808320858452909152902054612e8c90612da8565b905083816020015111158015612ea6575084816020015110155b15612eb2578051830192505b600190910190612e56565b600080678000000000000000835112612ed557600080fd5b677fffffffffffffff19835113612eeb57600080fd5b68010000000000000000836020015110612f0457600080fd5b678000000000000000604084015112612f1c57600080fd5b677fffffffffffffff19604084015113612f3557600080fd5b68010000000000000000836060015110612f4e57600080fd5b67ffffffffffffffff83511690506801000000000000000083602001510217680100000000000000008067ffffffffffffffff60408601511602021768010000000000000000808060608601510202021792915050565b815481835581811511612fc957600083815260209020612fc9918101908301613054565b505050565b60206040519081016040526000815290565b82805482825590600052602060002090810192821561301b579160200282015b8281111561301b578251825591602001919060010190613000565b50613027929150613054565b5090565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b610f9691905b80821115613027576000815560010161305a5600a165627a7a72305820272979d574a58445059369ef882278910978e5812673eb18faa6a78257f979e20029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000189ea49c4d5717ab6f7566deaf0690b9504087bd
-----Decoded View---------------
Arg [0] : _admin (address): 0x189ea49c4D5717AB6f7566deAf0690B9504087bD
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000189ea49c4d5717ab6f7566deaf0690b9504087bd
Deployed Bytecode Sourcemap
175:13949:0:-;;;;;;;;;-1:-1:-1;;;175:13949:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2381:451:3;;;;;;;;;;-1:-1:-1;;;;;2381:451:3;;;;;;;6414:103:0;;;;;;;;;;-1:-1:-1;;;;;6414:103:0;;;;;6258:150;;;;;;;;;;-1:-1:-1;;;;;6258:150:0;;;;;1879:42;;;;;;;;;;;;;;;;;;;;;;;;;;;3957:743;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3957:743:0;;-1:-1:-1;3957:743:0;;-1:-1:-1;;;;;;3957:743:0;6035:217;;;;;;;;;;-1:-1:-1;;;;;6035:217:0;;;;;85:27:3;;;;;;;;;;;;;;;-1:-1:-1;;;;;85:27:3;;;;;;;;;;;;;;670:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;12465:92:0;;;;;;;;;;;;560:186:6;;;;;;;;;;-1:-1:-1;;;;;560:186:6;;;;;;;;;;;;;2074:301:3;;;;;;;;;;-1:-1:-1;;;;;2074:301:3;;;;;2105:45:0;;;;;;;;;;;;10650:1552;;;;;;;;;;-1:-1:-1;;;;;10650:1552:0;;;;;;;;;3342:609;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3342:609:0;;-1:-1:-1;3342:609:0;;-1:-1:-1;;;;;;3342:609:0;5906:123;;;;;;;;;;;;;;10455:147;;;;;;;;;;-1:-1:-1;;;;;10455:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1074:183:3;;;;;;;;;;-1:-1:-1;;;;;1074:183:3;;;;;1821:189;;;;;;;;;;;;1432:218;;;;;;;;;;-1:-1:-1;;;;;1432:218:3;;;;;772:94;;;;;;;;;;;;12249:210:0;;;;;;;;;;-1:-1:-1;;;;;12249:210:0;;;;;4706:585;;;;;;;;;;;;;-1:-1:-1;;;;;4706:585:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4706:585:0;;-1:-1:-1;4706:585:0;;-1:-1:-1;;;;;;4706:585:0;2897:312:3;;;;;;;;;;-1:-1:-1;;;;;2897:312:3;;;;;2156:30:0;;;;;;;;;;;;778:65:5;;;;;;;;;;-1:-1:-1;;;;;778:65:5;;;;;;;3215:469:3;;;;;;;;;;-1:-1:-1;;;;;3215:469:3;;;;;6939:2717:0;;;;;;;;;;-1:-1:-1;;;;;6939:2717:0;;;;;;;;;;;;;5297:603;;;;;;;;;;;;;-1:-1:-1;;;;;5297:603:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5297:603:0;;-1:-1:-1;5297:603:0;;-1:-1:-1;;;;;;5297:603:0;982:397:5;;;;;;;;;;-1:-1:-1;;;;;982:397:5;;;;;;;;;;;6523:365:0;;;;;;;;;;-1:-1:-1;;;;;6523:365:0;;;;;;;;;;;851:150:6;;;;;;;;;;;;-1:-1:-1;;;;;851:150:6;;;;;9706:207:0;;;;;;;;;;-1:-1:-1;;;;;9706:207:0;;;;;;;;;2693:643;;;;;;;;;;-1:-1:-1;;;;;2693:643:0;;;;;9919:530;;;;;;;;;;-1:-1:-1;;;;;9919:530:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1385:274:5;;;;;;;;;;-1:-1:-1;;;;;1385:274:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59:20:3;;;;;;;;;;;;2381:451;2526:6;466:5;;452:10;-1:-1:-1;;;;;452:19:3;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;2457:17:3;;;;;;:8;:17;;;;;;;;2449:26;;;;;;;;-1:-1:-1;;;;;;2485:17:3;;2505:5;2485:17;;;:8;:17;;;;;:25;;-1:-1:-1;;2485:25:3;;;2521:305;2542:13;:20;2538:24;;2521:305;;;2607:7;-1:-1:-1;;;;;2587:27:3;:13;2601:1;2587:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2587:16:3;:27;2583:233;;;2653:13;2667:20;;-1:-1:-1;;2667:24:3;;;2653:39;;;;;;;;;;;;;;;;2634:13;:16;;-1:-1:-1;;;;;2653:39:3;;;;2648:1;;2634:16;;;;;;;;;;;;;;;:58;;-1:-1:-1;;;;;;2634:58:3;-1:-1:-1;;;;;2634:58:3;;;;;;;;;;2710:13;:22;;;;;-1:-1:-1;;2710:22:3;;;:::i;:::-;;2750:28;2763:7;2772:5;2750:28;;-1:-1:-1;;;;;2750:28:3;;;;;;;;;;;;;;;;;;;;;;2796:5;;2583:233;2564:3;;2521:305;;;2381:451;;:::o;6414:103:0:-;466:5:3;;452:10;-1:-1:-1;;;;;452:19:3;;;466:5;;452:19;444:28;;;;;;6485:15:0;:25;;-1:-1:-1;;;;;;6485:25:0;-1:-1:-1;;;;;6485:25:0;;;;;;;;;;6414:103::o;6258:150::-;-1:-1:-1;;;;;634:10:3;625:20;;;;;:8;:20;;;;;;;;617:29;;;;;;;;-1:-1:-1;;;;;6335:16:0;;;;;;:9;:16;;;;;:23;;;6327:32;;;;;;;;-1:-1:-1;;;;;6369:16:0;6396:5;6369:16;;;:9;:16;;;;;:32;;-1:-1:-1;;6369:32:0;;;6258:150::o;1879:42::-;;;;:::o;3957:743::-;-1:-1:-1;;;;;548:10:3;538:21;4403:8:0;538:21:3;;;:9;:21;;;;;;;;530:30;;;;;;;;4229:7:0;:14;4212:6;:13;:31;4204:40;;;;;;4279:8;:15;4262:6;:13;:32;4254:41;;;;;;4328:3;:10;4313:4;:11;:25;4305:34;;;;;;4372:7;:14;4357:4;:11;:29;4349:38;;;;;;-1:-1:-1;4414:1:0;4398:238;4423:6;:13;4417:3;:19;4398:238;;;4467:9;:22;4477:6;4484:3;4477:11;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4467:22:0;;;;;;;;;;;;-1:-1:-1;4467:22:0;:29;;;4459:38;;;;;;;;4548:7;4556:3;4548:12;;;;;;;;;;;;;;;;4511:9;:22;4521:6;4528:3;4521:11;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4511:22:0;;;;;;;;;;;;-1:-1:-1;4511:22:0;:34;;:49;4612:8;4621:3;4612:8;:13;;;;;;;;;;;;;;;4574:9;:22;4584:6;4591:3;4584:11;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4574:22:0;;;;;;;;;;;;-1:-1:-1;4574:22:0;:35;;:51;4438:5;;4398:238;;;4646:47;4661:3;4666:4;4672:11;4685:7;4646:14;:47::i;:::-;3957:743;;;;;;;;:::o;6035:217::-;466:5:3;;452:10;-1:-1:-1;;;;;452:19:3;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;6109:16:0;;;;;;:9;:16;;;;;:23;;;6101:32;;;;;;;;-1:-1:-1;;;;;6151:23:0;;;;;;:16;:23;;;;;:47;:52;;6143:61;;;;;;-1:-1:-1;;;;;6214:16:0;;;;;:9;:16;;;;;:31;;-1:-1:-1;;6214:31:0;;;;;6035:217::o;85:27:3:-;;;-1:-1:-1;;;;;85:27:3;;:::o;670:96::-;717:9;;:::i;:::-;745:14;738:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;738:21:3;;;;;;;;;;;;;;;;;;;;;;;670:96;;:::o;12465:92:0:-;12512:7;;:::i;:::-;12538:12;12531:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12531:19:0;;;;;;;;;;;;;;;;;;;;;;12465:92;:::o;560:186:6:-;466:5:3;;452:10;-1:-1:-1;;;;;452:19:3;;;466:5;;452:19;444:28;;;;;;662:5:6;-1:-1:-1;;;;;662:14:6;;677:6;685;662:30;;;;;;;;-1:-1:-1;;;662:30:6;;;;;;-1:-1:-1;;;;;662:30:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;654:39;;;;;;;;703:36;717:5;724:6;732;703:36;;-1:-1:-1;;;;;703:36:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;560:186;;;:::o;2074:301:3:-;466:5;;452:10;-1:-1:-1;;;;;452:19:3;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;2150:20:3;;;;;;:8;:20;;;;;;;;2149:21;2141:30;;;;;;2212:13;:20;328:2;2212:37;;2204:46;;;;;;2261:30;2274:10;2286:4;2261:30;;-1:-1:-1;;;;;2261:30:3;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2301:20:3;;;;;;:8;:20;;;;;:27;;-1:-1:-1;;2301:27:3;2324:4;2301:27;;;;;;2338:13;:30;;:13;;:30;;;:13;:30;;:::i;:::-;-1:-1:-1;2338:30:3;;;;;;;;;;;-1:-1:-1;;;;;;2338:30:3;-1:-1:-1;;;;;2338:30:3;;;;;;;;;;2074:301::o;2105:45:0:-;;;;:::o;10650:1552::-;10738:3;10757:12;;10753:78;;;-1:-1:-1;;;;;;10782:16:0;;;;;;:9;:16;;;;;:39;;:48;10771:60;;10753:78;10845:7;10856:1;10845:12;10841:73;;;-1:-1:-1;;;;;10866:16:0;;;;;;:9;:16;;;;;:39;;:48;;10908:5;;10866:48;;;;;;;;;;;;;;;10859:55;;;;10841:73;10928:7;10939:1;10928:12;10924:78;;;-1:-1:-1;;;;;;10953:16:0;;;;;;:9;:16;;;;;:41;;:48;10942:60;;10924:78;11016:7;11027:1;11016:12;11012:73;;;-1:-1:-1;;;;;11037:16:0;;;;;;:9;:16;;;;;:41;;:48;;11079:5;;11037:48;;;;;11012:73;11100:7;11111:1;11100:12;11096:79;;;-1:-1:-1;;;;;;11125:16:0;;;;;;:9;:16;;;;;:40;;:49;11114:61;;11096:79;11189:7;11200:1;11189:12;11185:74;;;-1:-1:-1;;;;;11210:16:0;;;;;;:9;:16;;;;;:40;;:49;;11253:5;;11210:49;;;;;11185:74;11273:7;11284:1;11273:12;11269:79;;;-1:-1:-1;;;;;;11298:16:0;;;;;;:9;:16;;;;;:42;;:49;11287:61;;11269:79;11362:7;11373:1;11362:12;11358:74;;;-1:-1:-1;;;;;11383:16:0;;;;;;:9;:16;;;;;:42;;:49;;11426:5;;11383:49;;;;;11358:74;11447:7;11458:1;11447:12;11443:84;;;-1:-1:-1;;;;;;11472:16:0;;;;;;:9;:16;;;;;:45;;:54;11461:66;;11443:84;11541:7;11552:1;11541:12;11537:79;;;-1:-1:-1;;;;;11562:16:0;;;;;;:9;:16;;;;;:45;;:54;;11610:5;;11562:54;;;;;11537:79;11630:7;11641:2;11630:13;11626:85;;;-1:-1:-1;;;;;;11656:16:0;;;;;;:9;:16;;;;;:47;;:54;11645:66;;11626:85;11725:7;11736:2;11725:13;11721:80;;;-1:-1:-1;;;;;11747:16:0;;;;;;:9;:16;;;;;:47;;:54;;11795:5;;11747:54;;;;;11721:80;11816:7;11827:2;11816:13;11812:86;;;-1:-1:-1;;;;;;11842:16:0;;;;;;:9;:16;;;;;;;;:46;:55;11831:67;;11812:86;11912:7;11923:2;11912:13;11908:81;;;-1:-1:-1;;;;;11934:16:0;;;;;;:9;:16;;;;;;;;:46;:55;;11983:5;;11934:55;;;;;11908:81;12003:7;12014:2;12003:13;11999:86;;;-1:-1:-1;;;;;;12029:16:0;;;;;;:9;:16;;;;;:48;;:55;12018:67;;11999:86;12099:7;12110:2;12099:13;12095:81;;;-1:-1:-1;;;;;12121:16:0;;;;;;:9;:16;;;;;:48;;:55;;12170:5;;12121:55;;;;;10650:1552;;;;;;:::o;3342:609::-;-1:-1:-1;;;;;548:10:3;538:21;3598:18:0;538:21:3;;;:9;:21;;;;;;3598:18:0;;;;538:21:3;;530:30;;;;;;;;3484:4:0;:11;3470:3;:10;:25;3462:34;;;;;;3532:3;:10;3514:7;:14;:28;3506:37;;;;;;3576:10;3561:25;;;3553:34;;;;;;2294:37;;-1:-1:-1;3659:1:0;;-1:-1:-1;3645:300:0;3666:7;:14;3662:1;:18;3645:300;;;3722:21;:28;3709:7;3717:1;3709:7;:10;;;;;;;;;;;;;;;:41;3701:50;;;;;;3856:13;3840;:29;3825:11;:45;3808:13;3797:4;3802:1;3797:7;;;;;;;;;;;;;;;;3792:13;;;:29;3782:3;3786:1;3782:6;;;;;;;;;;;;;;;;3777:12;;;:44;:94;;-1:-1:-1;3777:94:0;3885:21;3907:7;3915:1;3907:7;:10;;;;;;;;;;;;;;;3885:33;;;;;;;;;;;;;;;;;:49;3682:3;;;;;3645:300;;;3342:609;;;;;;;:::o;5906:123::-;466:5:3;;452:10;-1:-1:-1;;;;;452:19:3;;;466:5;;452:19;444:28;;;;;;5986:25:0;:36;5906:123::o;10455:147::-;-1:-1:-1;;;;;10545:16:0;10515:4;10545:16;;;:9;:16;;;;;:23;;;;;;;10570:24;;;;;10455:147::o;1074:183:3:-;466:5;;452:10;-1:-1:-1;;;;;452:19:3;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;1150:22:3;;;;1142:31;;;;;;1204:12;;1183:34;;-1:-1:-1;;;;;1204:12:3;1183:34;;-1:-1:-1;;;;;1183:34:3;;;;;;;;;;;;;;1227:12;:23;;-1:-1:-1;;;;;;1227:23:3;-1:-1:-1;;;;;1227:23:3;;;;;;;;;;1074:183::o;1821:189::-;1868:12;;1884:10;-1:-1:-1;;;;;1868:26:3;;;:12;;:26;1860:35;;;;;;1918:12;;;1932:5;1905:33;;-1:-1:-1;;;;;1918:12:3;;;;1932:5;1905:33;;-1:-1:-1;;;;;1905:33:3;;;;;;;;;;;;;;;;;;;;;;1956:12;;;;1948:20;;-1:-1:-1;;;;;;1948:20:3;;;-1:-1:-1;;;;;1956:12:3;;1948:20;;;;1978:25;;;1821:189::o;1432:218::-;466:5;;452:10;-1:-1:-1;;;;;452:19:3;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;1515:22:3;;;;1507:31;;;;;;1548:30;1569:8;1548:30;;-1:-1:-1;;;;;1548:30:3;;;;;;;;;;;;;;1611:5;;1588:29;;1601:8;;-1:-1:-1;;;;;1611:5:3;1588:29;;-1:-1:-1;;;;;1588:29:3;;;;;;;;;;;;;;;;;;;;;;1627:5;:16;;-1:-1:-1;;;;;;1627:16:3;-1:-1:-1;;;;;1627:16:3;;;;;;;;;;1432:218::o;772:94::-;818:9;;:::i;:::-;846:13;839:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;839:20:3;;;;;;;;;;;;;;;;;;;;;;772:94;:::o;12249:210:0:-;-1:-1:-1;;;;;12370:16:0;;12310:4;12370:16;;;:9;:16;;;;;:38;;;12348:21;:61;;12310:4;;12370:38;12348:61;;;;;;;;;;;;;;;12326:83;;12426:26;12440:11;12426:13;:26::i;:::-;12419:33;;12249:210;;;;;:::o;4706:585::-;-1:-1:-1;;;;;548:10:3;538:21;;;;;:9;:21;;;;;;;;530:30;;;;;;;;4916:4:0;:11;4901:4;:11;:26;4893:35;;;;;;4962:5;:12;4946:5;:12;:28;4938:37;;;;;;2385:2;4993:4;:11;:36;;4985:45;;;;;;2385:2;5048:5;:12;:37;;5040:46;;;;;;-1:-1:-1;;;;;5104:16:0;;;;;;:9;:16;;;;;:23;;;5096:32;;;;;;;;5181:24;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5139:16:0;;-1:-1:-1;5139:16:0;;;:9;:16;;;;:39;;5181:24;5139:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;5258:26;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5215:16:0;;-1:-1:-1;5215:16:0;;;:9;:16;;;;:40;;5258:26;5215:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;2897:312:3:-;466:5;;452:10;-1:-1:-1;;;;;452:19:3;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;2975:22:3;;;;;;:9;:22;;;;;;;;2974:23;2966:32;;;;;;3039:14;:21;328:2;3039:38;;3031:47;;;;;;3089:32;3103:11;3116:4;3089:32;;-1:-1:-1;;;;;3089:32:3;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3131:22:3;;;;;;:9;:22;;;;;:29;;-1:-1:-1;;3131:29:3;3156:4;3131:29;;;;;;3170:14;:32;;:14;;:32;;;:14;:32;;:::i;2156:30:0:-;;;-1:-1:-1;;;;;2156:30:0;;:::o;778:65:5:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;3215:469:3:-;3366:6;466:5;;452:10;-1:-1:-1;;;;;452:19:3;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;3293:19:3;;;;;;:9;:19;;;;;;;;3285:28;;;;;;;;-1:-1:-1;;;;;;3323:19:3;;3345:5;3323:19;;;:9;:19;;;;;:27;;-1:-1:-1;;3323:27:3;;;3361:317;3382:14;:21;3378:25;;3361:317;;;3449:8;-1:-1:-1;;;;;3428:29:3;:14;3443:1;3428:17;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3428:17:3;:29;3424:244;;;3497:14;3512:21;;-1:-1:-1;;3512:25:3;;;3497:41;;;;;;;;;;;;;;;;3477:14;:17;;-1:-1:-1;;;;;3497:41:3;;;;3492:1;;3477:17;;;;;;;;;;;;;;;:61;;-1:-1:-1;;;;;;3477:61:3;-1:-1:-1;;;;;3477:61:3;;;;;;;;;;3556:14;:26;;-1:-1:-1;;3556:26:3;;;;;;:::i;:::-;;3600:30;3614:8;3624:5;3600:30;;-1:-1:-1;;;;;3600:30:3;;;;;;;;;;;;;;;;;;;;;;3648:5;;3424:244;3405:3;;3361:317;;6939:2717:0;-1:-1:-1;;;;;7092:16:0;;7034:4;7092:16;;;:9;:16;;;;;:24;7034:4;;;;;;;;;;;;;;;;7092:24;;;;;7091:25;7087:39;;;7125:1;7118:8;;;;7087:39;-1:-1:-1;;;;;7140:23:0;;;;;;:16;:23;;;;;:47;:52;7136:66;;;7201:1;7194:8;;;;7136:66;-1:-1:-1;;;;;7320:16:0;;;;;;:9;:16;;;;;:38;;;7298:21;:61;;:21;;7320:38;7298:61;;;;;;;;;;;;;;;7276:83;;7393:26;7407:11;7393:13;:26::i;:::-;7473:25;;7370:49;;-1:-1:-1;7455:43:0;;7433:65;;7429:79;;7507:1;7500:8;;;;7429:79;7655:56;7668:5;7675:15;7692:18;7655:12;:56::i;:::-;7620:91;;-1:-1:-1;7620:91:0;-1:-1:-1;7848:1613:0;;;;-1:-1:-1;;;;;;7914:16:0;;;;;;:9;:16;;;;;:28;;;8001:52;8028:11;7924:5;8048:4;8001:26;:52::i;:::-;7988:65;;8082:10;8078:15;;8096:2;8078:20;8067:31;;8119:22;8126:4;8132:8;8119:6;:22::i;:::-;8112:29;;8195;8207:5;8214:4;8220:3;8195:11;:29::i;:::-;-1:-1:-1;;;;;8383:16:0;;;;;;:9;:16;;;;;;;8189:35;;-1:-1:-1;8275:30:0;;;;8189:35;;-1:-1:-1;8363:70:0;;8383:39;;;:16;8363:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8428:3;8363:19;:70::i;:::-;8352:81;;8454:22;8461:4;8467:8;8454:6;:22::i;:::-;-1:-1:-1;;;;;8560:16:0;;;;;;:9;:16;;;;;;;8447:29;;-1:-1:-1;8540:82:0;;8560:45;;;:16;8540:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8607:14;8540:19;:82::i;:::-;8529:93;;8643:22;8650:4;8656:8;8643:6;:22::i;:::-;8636:29;;7848:1613;;;-1:-1:-1;;;;;;8739:16:0;;;;;;:9;:16;;;;;:29;;;;8827:53;;8854:11;;8749:5;;8827:26;:53::i;:::-;8814:66;;8909:10;8905:15;;8923:2;8905:20;8894:31;;8946:22;8953:4;8959:8;8946:6;:22::i;:::-;-1:-1:-1;;;;;9166:16:0;;;;;;:9;:16;;;;;;;-1:-1:-1;;9031:13:0;;9058:30;;;;9031:13;-1:-1:-1;8939:29:0;;-1:-1:-1;9146:71:0;;9166:40;;;:16;9146:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9212:3;9146:19;:71::i;:::-;9135:82;;9238:22;9245:4;9251:8;9238:6;:22::i;:::-;9231:29;;9324:83;9344:9;:16;9354:5;-1:-1:-1;;;;;9344:16:0;-1:-1:-1;;;;;9344:16:0;;;;;;;;;;;;:46;;9324:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9392:14;9324:19;:83::i;:::-;9313:94;;9428:22;9435:4;9441:8;9428:6;:22::i;:::-;9421:29;;7848:1613;9498:27;9519:5;9498:20;:27::i;:::-;9475:19;9479:14;9475:3;:19::i;:::-;:50;9471:64;;9534:1;9527:8;;;;9471:64;9587:30;9611:5;9587:23;:30::i;:::-;9549:34;9570:12;9553:14;:29;9549:3;:34::i;:::-;:68;9545:82;;9626:1;9619:8;;;;9545:82;9645:4;9638:11;;6939:2717;;;;;;;;;;;;;;;:::o;5297:603::-;-1:-1:-1;;;;;548:10:3;538:21;;;;;:9;:21;;;;;;;;530:30;;;;;;;;5513:4:0;:11;5498:4;:11;:26;5490:35;;;;;;5559:5;:12;5543:5;:12;:28;5535:37;;;;;;2385:2;5590:4;:11;:36;;5582:45;;;;;;2385:2;5645:5;:12;:37;;5637:46;;;;;;-1:-1:-1;;;;;5701:16:0;;;;;;:9;:16;;;;;:23;;;5693:32;;;;;;;;5784:24;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5736:16:0;;-1:-1:-1;5736:16:0;;;:9;:16;;;;:45;;5784:24;5736:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;5867:26;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5818:16:0;;-1:-1:-1;5818:16:0;;;:9;:16;;;;;;;;:46;5867:26;5818:75;;;;;;;;;;;;:::i;982:397:5:-;466:5:3;;452:10;-1:-1:-1;;;;;452:19:3;;;466:5;;452:19;444:28;;;;;;1228:144:5;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1190:23:5;;-1:-1:-1;1190:23:5;;;:16;:23;;;;1228:144;1190:182;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;982:397:5:o;6523:365:0:-;6706:15;;6692:10;-1:-1:-1;;;;;6692:29:0;;;6706:15;;6692:29;6684:38;;;;;;6737:20;;6733:69;;;6777:25;6796:5;6777:18;:25::i;:::-;6759:43;;6733:69;6820:61;6833:5;6840:9;6851:15;6868:12;6820;:61::i;:::-;6523:365;;;;:::o;851:150:6:-;466:5:3;;452:10;-1:-1:-1;;;;;452:19:3;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;932:15:6;;:23;;;;948:6;932:23;;;;;;;;;;;;;;;;;;;;;;;;;;965:29;979:6;987;965:29;;;;;-1:-1:-1;;;;;965:29:6;;;;;;;;;;;;;;;;851:150;;:::o;9706:207:0:-;9771:4;9791:3;9787:119;;;-1:-1:-1;;;;;;9815:16:0;;;;;;:9;:16;;;;;:28;;;9808:35;;9787:119;-1:-1:-1;;;;;;9877:16:0;;;;;;:9;:16;;;;;:29;;;9787:119;9706:207;;;;:::o;2693:643::-;466:5:3;;452:10;-1:-1:-1;;;;;452:19:3;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;2761:16:0;;;;;;:9;:16;;;;;:23;;;2760:24;2752:33;;;;;;-1:-1:-1;;;;;2795:16:0;;;;;;:9;:16;;;;;:30;;-1:-1:-1;;2795:30:0;2821:4;2795:30;;;;;;2835:12;:24;;:12;;:24;;;:12;:24;;:::i;:::-;-1:-1:-1;2835:24:0;;;;;;;;;;;-1:-1:-1;;;;;;2835:24:0;-1:-1:-1;;;;;2835:24:0;;;;;2874:29;;:34;2870:116;;;2924:21;:30;;;;;;;;;:::i;:::-;;2870:116;3037:21;:28;-1:-1:-1;;;;;2996:16:0;;;;;;:9;:16;;;;;-1:-1:-1;;3037:32:0;;;3068:1;2996:38;;;:73;;;;3120:29;;3079:38;;;;:70;;;2244:2;;3193:33;3192:64;3160:29;:96;3267:33;3294:5;3267:26;:33::i;:::-;3311:18;3323:5;3311:11;:18::i;:::-;2693:643;:::o;9919:530::-;-1:-1:-1;;;;;10018:16:0;;9976:4;10018:16;;;:9;:16;;;;;:23;9976:4;;;;;;;;;;10018:23;;10010:32;;;;;;;;-1:-1:-1;;;;;;;10071:16:0;;;;;;:9;:16;;;;;:38;;;;10138;;;;;10289:21;:33;;10071:38;;10138;;10262:74;;10289:21;10071:38;;10289:33;;;;;;;;;;;;;;;10324:5;10331:4;10262:26;:74::i;:::-;-1:-1:-1;;;10257:80:0;10356:75;10383:21;10405:10;10383:33;;;;;;;;;;;;;;;;;;;10418:5;10425;10356:26;:75::i;:::-;-1:-1:-1;;;10351:81:0;10187:255;;;;;;;;9919:530;;;;;;;:::o;1385:274:5:-;-1:-1:-1;;;;;1483:23:5;1447:4;1483:23;;;:16;:23;;;;;:47;;1548:44;;;;1610:41;;;;;1483:47;;1385:274::o;59:20:3:-;;;-1:-1:-1;;;;;59:20:3;;:::o;12818:212:0:-;-1:-1:-1;;;12978:45:0;;12818:212;;;;:::o;5806:515:5:-;-1:-1:-1;;;;;6003:23:5;;5920:18;6003:23;;;:16;:23;;;;;:47;5920:18;;6116:114;6020:5;6184:15;6217:12;6116:27;:114::i;:::-;6241:28;;;;6279:35;;;-1:-1:-1;5806:515:5;-1:-1:-1;;;;5806:515:5:o;13036:384:0:-;-1:-1:-1;;;;;13166:16:0;;13131:4;13166:16;;;:9;:16;;;;;:38;;;13131:4;13239:134;;;;-1:-1:-1;13273:31:0;:45;;13239:134;;;-1:-1:-1;13358:1:0;:15;;13239:134;13396:4;13401:10;13396:16;;;;;;;;-1:-1:-1;;;13396:16:0;-1:-1:-1;;;13391:22:0;;13384:29;;13036:384;;;;;;;;:::o;13682:286::-;13740:4;;369:17:4;13764:16:0;;;13756:25;;;;;;-1:-1:-1;;13799:25:0;;;13791:34;;;;;;2437:8;13843:25;;;13835:34;;;;;;-1:-1:-1;;13894:9:0;13933:17;;;13921:30;;;;13920:41;;13682:286::o;12563:249::-;12643:4;12659:16;12706;12678:18;12690:5;12678:11;:18::i;:::-;12659:37;;506:2:4;12706:31:0;;12755:50;12766:6;12774:11;12787;12800:4;12755:10;:50::i;:::-;12748:57;12563:249;-1:-1:-1;;;;;;12563:249:0:o;13426:250::-;13500:3;13515:8;13551;13526:1;:3;;;:10;13515:21;;13562:1;13551:12;;13546:96;13571:3;13565;:9;13546:96;;;13606:1;:3;13610;13606:8;;;;;;;;;;;;;;;;13601:13;;13597:34;;13623:1;:3;;;13627;13623:8;;;;;;;;;;;;;;;;13616:15;;;;13597:34;13576:5;;13546:96;;;13659:1;:3;;;13667:1;13663:3;:5;13659:10;;;;;;;;;;;;;;;;13652:17;;13426:250;;;;;;;:::o;6475:136:5:-;-1:-1:-1;;;;;6563:23:5;6540:4;6563:23;;;:16;:23;;;;;:41;;;;6475:136::o;13974:148:0:-;14016:4;14040:1;14036;:5;14032:83;;;-1:-1:-1;;;14067:6:0;;14055:19;;14032:83;-1:-1:-1;14113:1:0;14101:14;;6327:142:5;-1:-1:-1;;;;;6418:23:5;6395:4;6418:23;;;:16;:23;;;;;:44;;;;6327:142::o;1665:2006::-;1825:22;1894:21;1998:17;2030:42;;:::i;:::-;-1:-1:-1;;;;;1938:23:5;;3102:25;1938:23;;;:16;:23;;;;;:47;191:1;1850:34;;;-1:-1:-1;1922:9:5;:64;;;;;;;-1:-1:-1;;;;;2112:25:5;;2018:1;2112:25;;;:18;:25;;;;;;;;:44;;;;;;;;;1922:64;;;;;-1:-1:-1;2018:1:5;-1:-1:-1;2087:70:5;;:24;:70::i;:::-;2030:127;;2276:12;2246:16;:26;;;:42;2242:1323;;;2354:15;2313:16;:36;;;2308:61;2304:723;;;2479:17;2432:16;2479:17;2432:16;:64;;;;-1:-1:-1;2557:17:5;2514:39;;;2557:17;2514:39;:60;;;;-1:-1:-1;2304:723:5;;;2697:57;2717:5;2724:15;2741:12;2697:19;:57::i;:::-;2814:38;;;2772:39;;;:80;2681:73;-1:-1:-1;2835:17:5;2772:16;2835:17;2772:16;2870:64;;;;-1:-1:-1;2952:36:5;;;:60;;;2304:723;2242:1323;;;3182:65;3210:5;3217:15;3234:12;3182:27;:65::i;:::-;3262:63;;;3339:26;;;:47;;;3400:36;;;:60;;;3516:38;;;3474:39;;;:80;3141:106;;-1:-1:-1;3141:106:5;-1:-1:-1;2242:1323:5;3622:42;3647:16;3622:24;:42::i;:::-;-1:-1:-1;;;;;3575:25:5;;;;;;;:18;:25;;;;;;;;:44;;;;;;;;;;:89;;;;-1:-1:-1;;;;;;;1665:2006:5:o;3677:180::-;3750:6;3745:106;191:1;3762;:23;3745:106;;;-1:-1:-1;;;;;3806:25:5;;;;;;:18;:25;;;;;;;;:28;;;;;;;;3837:3;3806:34;;;;3787:3;3745:106;;561:171:4;-1:-1:-1;;;;;618:26:4;;167:44;618:26;614:111;;;-1:-1:-1;;;;;646:15:4;;;;;;:8;:15;;;;;506:2;646:30;;614:111;;;709:5;-1:-1:-1;;;;;709:14:4;;:16;;;;;;;;;;;-1:-1:-1;;;709:16:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;691:15:4;;;;;;:8;:15;;;;;:34;-1:-1:-1;561:171:4;:::o;4507:1293:5:-;4636:16;4654:25;4756:16;4786:20;4820:15;4863:13;4907:14;4987:38;;:::i;:::-;4710:1;4695:16;;4745:1;4721:25;;4775:1;4756:20;;4809:1;4786:24;;4838:15;4820:33;;4879:12;4863:28;;4924:1;4907:18;;4902:803;191:1;4927:9;:31;4902:803;;;-1:-1:-1;;;;;5053:25:5;;;;;;:18;:25;;;;;;;;:36;;;;;;;;;5028:62;;:24;:62::i;:::-;4987:103;;5135:8;5109:12;:22;;;:34;;:74;;;;;5173:10;5147:12;:22;;;:36;;5109:74;5105:172;;;5223:12;:39;5203:59;;;;5105:172;5331:15;5295:12;:32;;;:51;5291:65;;5348:8;;5291:65;5399:11;5374:12;:22;;;:36;5370:50;;;5412:8;;5370:50;5449:12;:22;;;5435:36;;5500:12;:35;;;5485:50;;5585:12;5558;:22;;;5553:44;5549:146;;;5641:12;:39;5617:63;;5549:146;4960:11;;;;;4902:803;;;5719:17;;5715:79;;;5767:16;5752:31;;5715:79;4507:1293;;;;;;;;;;;;:::o;738:470:4:-;794:4;;-1:-1:-1;;;;;814:26:4;;167:44;814:26;810:51;;;506:2;842:19;;;;810:51;-1:-1:-1;;;;;;915:15:4;;;;;;:8;:15;;;;;;1127:18;;1124:46;;;1154:5;-1:-1:-1;;;;;1154:14:4;;:16;;;;;;;;;;;-1:-1:-1;;;1154:16:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1147:23;;;;1214:558;1316:4;305:6;1340:17;;;1332:26;;;;;;369:17;1376:16;;;1368:25;;;;;;1408:26;;;1404:362;;459:2;1459:25;;;1458:43;;1450:52;;;;;;255:6;1524:13;;;1546:25;;;1541:2;:31;1524:49;1523:63;;1516:70;;;;1404:362;459:2;1626:25;;;1625:43;;1617:52;;;;;;1741:11;1727;:25;1722:2;:31;255:6;1709:45;1700:4;1691:6;:13;1690:65;;;;;;1404:362;1214:558;;;;;;:::o;7480:505:5:-;7548:18;;:::i;:::-;7578:30;;:::i;:::-;7672:12;7663:22;;;7653:34;;7619:68;;232:7;7663:5;7727:16;7726:35;7714:49;;;;7697:14;;;:66;7823:19;7814:5;:29;7813:48;7803:60;;7773:27;;;:90;7922:30;7913:5;:40;7900:56;;7873:24;;;:83;:24;7480:505;-1:-1:-1;;7480:505:5:o;3863:638::-;3959:16;4114:14;4194:38;;:::i;:::-;4048:22;;;;4040:31;;;;;;4097:1;4082:16;;4131:1;4114:18;;4109:386;191:1;4134:9;:31;4109:386;;;-1:-1:-1;;;;;4260:25:5;;;;;;:18;:25;;;;;;;;:36;;;;;;;;;4235:62;;:24;:62::i;:::-;4194:103;;4342:8;4316:12;:22;;;:34;;:74;;;;;4380:10;4354:12;:22;;;:36;;4316:74;4312:173;;;4430:12;:39;4410:60;;;;4312:173;4167:11;;;;;4109:386;;6617:857;6698:4;;6791:12;6753:4;:31;:51;6745:60;;;;;;-1:-1:-1;;6823:4:5;:31;:61;6815:70;;;;;;232:7;6903:4;:14;;;:25;6895:34;;;;;;6981:12;6947:27;;;;:47;6939:56;;;;;;-1:-1:-1;;7013:27:5;;;;:57;7005:66;;;;;;232:7;7089:4;:24;;;:35;7081:44;;;;;;7214:12;7178:4;:31;7173:54;7159:68;;232:7;7247:4;:14;;;:25;7237:35;232:7;;7330:12;7298:27;;;;7293:50;7292:63;:74;7282:84;232:7;;;7386:24;;;;:35;:46;:57;7376:67;;6617:857;-1:-1:-1;;6617:857:5:o;175:13949:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;175:13949:0;;;-1:-1:-1;175:13949:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://272979d574a58445059369ef882278910978e5812673eb18faa6a78257f979e2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.