Source Code
Latest 25 from a total of 188,166 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Compact Data | 11501410 | 1753 days ago | IN | 0 ETH | 0.00205673 | ||||
Set Compact Data | 11501398 | 1753 days ago | IN | 0 ETH | 0.00210348 | ||||
Set Compact Data | 11501393 | 1753 days ago | IN | 0 ETH | 0.00378626 | ||||
Set Compact Data | 11501388 | 1753 days ago | IN | 0 ETH | 0.00556253 | ||||
Set Compact Data | 11501383 | 1753 days ago | IN | 0 ETH | 0.00341231 | ||||
Set Compact Data | 11501379 | 1753 days ago | IN | 0 ETH | 0.00210348 | ||||
Set Compact Data | 11501375 | 1753 days ago | IN | 0 ETH | 0.00271115 | ||||
Set Compact Data | 11501371 | 1753 days ago | IN | 0 ETH | 0.00210348 | ||||
Set Compact Data | 11501365 | 1753 days ago | IN | 0 ETH | 0.00224371 | ||||
Set Compact Data | 11501360 | 1753 days ago | IN | 0 ETH | 0.00224371 | ||||
Set Compact Data | 11501355 | 1753 days ago | IN | 0 ETH | 0.00224371 | ||||
Set Compact Data | 11501350 | 1753 days ago | IN | 0 ETH | 0.00224371 | ||||
Set Compact Data | 11501347 | 1753 days ago | IN | 0 ETH | 0.00224371 | ||||
Set Compact Data | 11501340 | 1753 days ago | IN | 0 ETH | 0.00275789 | ||||
Set Compact Data | 11501335 | 1753 days ago | IN | 0 ETH | 0.00224371 | ||||
Set Compact Data | 11501327 | 1753 days ago | IN | 0 ETH | 0.00472114 | ||||
Set Compact Data | 11501324 | 1753 days ago | IN | 0 ETH | 0.00229045 | ||||
Set Compact Data | 11501314 | 1753 days ago | IN | 0 ETH | 0.00224371 | ||||
Set Compact Data | 11501309 | 1753 days ago | IN | 0 ETH | 0.00229045 | ||||
Set Compact Data | 11501302 | 1753 days ago | IN | 0 ETH | 0.00228986 | ||||
Set Compact Data | 11501299 | 1753 days ago | IN | 0 ETH | 0.00224313 | ||||
Set Compact Data | 11501296 | 1753 days ago | IN | 0 ETH | 0.00224371 | ||||
Set Compact Data | 11501289 | 1753 days ago | IN | 0 ETH | 0.00224371 | ||||
Set Compact Data | 11501285 | 1753 days ago | IN | 0 ETH | 0.00224371 | ||||
Set Compact Data | 11501281 | 1753 days ago | IN | 0 ETH | 0.00224371 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ConversionRates
Compiler Version
v0.4.18+commit.9cf6e910
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-06-26 */ // File: contracts/sol4/ERC20Interface.sol 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); } // File: contracts/sol4/Utils.sol pragma solidity 0.4.18; /// @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 } } // File: contracts/sol4/ConversionRatesInterface.sol pragma solidity 0.4.18; 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); } // File: contracts/sol4/PermissionGroups.sol 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; } } } } // File: contracts/sol4/Withdrawable.sol pragma solidity 0.4.18; /** * @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); } } // File: contracts/sol4/reserves/VolumeImbalanceRecorder.sol pragma solidity 0.4.18; 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; } } // File: contracts/sol4/reserves/fprConversionRate/ConversionRates.sol pragma solidity 0.4.18; 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); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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
6060604052600a6009556000600d55341561001957600080fd5b60405160208061312b8339810160405280805160008054600160a060020a03191633600160a060020a03908116919091179091559092508291508116151561006057600080fd5b60008054600160a060020a03909216600160a060020a03199092169190911790555061309a806100916000396000f3006060604052600436106101a85763ffffffff60e060020a60003504166301a12fd381146101ad57806314673d31146101ce578063158859f7146101ed578063162656941461020c5780631a4813d7146102315780631d6a8bda146103c957806326782247146103e857806327a099d8146104175780632ba996a51461047d5780633ccdbb2814610490578063408ee7fe146104b95780635085c9f1146104d857806362674e93146104eb57806364887334146105105780636c6295b8146105e8578063721bba59146105fe57806375829def1461063957806377f50f97146106585780637acc86781461066b5780637c423f541461068a5780638036d7571461069d57806380d8b380146106bc5780639870d7fe146107d9578063a7f43acd146107f8578063a80c609e1461080b578063ac8a584a1461082d578063b8e9c22e1461084c578063bc9cbcc814610876578063bfee356914610993578063c6fd2103146109bb578063ce56c454146109e3578063cf8fee1114610a05578063d48bfca714610a29578063e4a2ac6214610a48578063e7d4fd9114610ab6578063f851a44014610af9575b600080fd5b34156101b857600080fd5b6101cc600160a060020a0360043516610b0c565b005b34156101d957600080fd5b6101cc600160a060020a0360043516610c7c565b34156101f857600080fd5b6101cc600160a060020a0360043516610cb9565b341561021757600080fd5b61021f610d29565b60405190815260200160405180910390f35b341561023c57600080fd5b6101cc60046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001909190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610d2f95505050505050565b34156103d457600080fd5b6101cc600160a060020a0360043516610e95565b34156103f357600080fd5b6103fb610f21565b604051600160a060020a03909116815260200160405180910390f35b341561042257600080fd5b61042a610f30565b60405160208082528190810183818151815260200191508051906020019060200280838360005b83811015610469578082015183820152602001610451565b505050509050019250505060405180910390f35b341561048857600080fd5b61042a610f99565b341561049b57600080fd5b6101cc600160a060020a036004358116906024359060443516610fff565b34156104c457600080fd5b6101cc600160a060020a03600435166110f6565b34156104e357600080fd5b61021f6111f2565b34156104f657600080fd5b61021f600160a060020a03600435166024356044356111f8565b341561051b57600080fd5b6101cc600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506114ec95505050505050565b34156105f357600080fd5b6101cc60043561162d565b341561060957600080fd5b61061d600160a060020a036004351661164d565b6040519115158252151560208201526040908101905180910390f35b341561064457600080fd5b6101cc600160a060020a0360043516611675565b341561066357600080fd5b6101cc611710565b341561067657600080fd5b6101cc600160a060020a03600435166117aa565b341561069557600080fd5b61042a61188c565b34156106a857600080fd5b61021f600160a060020a03600435166118f2565b34156106c757600080fd5b6101cc60048035600160a060020a031690604460248035908101908301358060208082020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061193d95505050505050565b34156107e457600080fd5b6101cc600160a060020a0360043516611a85565b341561080357600080fd5b6103fb611b55565b341561081657600080fd5b61021f600160a060020a0360043516602435611b64565b341561083857600080fd5b6101cc600160a060020a0360043516611b81565b341561085757600080fd5b61021f600160a060020a03600435166024356044351515606435611ced565b341561088157600080fd5b6101cc60048035600160a060020a031690604460248035908101908301358060208082020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061228395505050505050565b341561099e57600080fd5b6101cc600160a060020a03600435166024356044356064356123b2565b34156109c657600080fd5b6101cc600160a060020a0360043516602435604435606435612420565b34156109ee57600080fd5b6101cc600435600160a060020a0360243516612460565b3415610a1057600080fd5b61021f600160a060020a036004351660243515156124f3565b3415610a3457600080fd5b6101cc600160a060020a0360043516612541565b3415610a5357600080fd5b610a67600160a060020a036004351661264e565b60405193845260208401929092527fff00000000000000000000000000000000000000000000000000000000000000908116604080850191909152911660608301526080909101905180910390f35b3415610ac157600080fd5b610ad5600160a060020a0360043516612712565b60405180848152602001838152602001828152602001935050505060405180910390f35b3415610b0457600080fd5b6103fb61273a565b6000805433600160a060020a03908116911614610b2857600080fd5b600160a060020a03821660009081526003602052604090205460ff161515610b4f57600080fd5b50600160a060020a0381166000908152600360205260408120805460ff191690555b600554811015610c785781600160a060020a0316600582815481101515610b9457fe5b600091825260209091200154600160a060020a03161415610c7057600580546000198101908110610bc157fe5b60009182526020909120015460058054600160a060020a039092169183908110610be757fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556005805490610c23906000198301612fa5565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051600160a060020a039092168252151560208201526040908101905180910390a1610c78565b600101610b71565b5050565b60005433600160a060020a03908116911614610c9757600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b600160a060020a03331660009081526003602052604090205460ff161515610ce057600080fd5b600160a060020a0381166000908152600b602052604090205460ff161515610d0757600080fd5b600160a060020a03166000908152600b60205260409020805461ff0019169055565b60095481565b600160a060020a03331660009081526002602052604081205460ff161515610d5657600080fd5b8651885114610d6457600080fd5b8551885114610d7257600080fd5b8451845114610d8057600080fd5b8151845114610d8e57600080fd5b5060005b8751811015610e7f57600b6000898381518110610dab57fe5b90602001906020020151600160a060020a0316815260208101919091526040016000205460ff161515610ddd57600080fd5b868181518110610de957fe5b90602001906020020151600b60008a8481518110610e0357fe5b90602001906020020151600160a060020a03168152602081019190915260400160002060030155858181518110610e3657fe5b90602001906020020151600b60008a8481518110610e5057fe5b90602001906020020151600160a060020a03168152602081019190915260400160002060040155600101610d92565b610e8b858585856114ec565b5050505050505050565b60005433600160a060020a03908116911614610eb057600080fd5b600160a060020a0381166000908152600b602052604090205460ff161515610ed757600080fd5b600160a060020a0381166000908152600660205260409020541515610efb57600080fd5b600160a060020a03166000908152600b60205260409020805461ff001916610100179055565b600154600160a060020a031681565b610f38612fce565b6004805480602002602001604051908101604052809291908181526020018280548015610f8e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f70575b505050505090505b90565b610fa1612fce565b600a805480602002602001604051908101604052809291908181526020018280548015610f8e57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610f70575050505050905090565b60005433600160a060020a0390811691161461101a57600080fd5b82600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561107757600080fd5b6102c65a03f1151561108857600080fd5b50505060405180519050151561109d57600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051600160a060020a03938416815260208101929092529091166040808301919091526060909101905180910390a1505050565b60005433600160a060020a0390811691161461111157600080fd5b600160a060020a03811660009081526003602052604090205460ff161561113757600080fd5b6005546032901061114757600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600360205260409020805460ff1916600190811790915560058054909181016111c68382612fa5565b5060009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055565b600d5481565b60008215156112235750600160a060020a0383166000908152600b60205260409020600501546114e5565b826001141561126657600160a060020a0384166000908152600b6020526040902060050180548390811061125357fe5b90600052602060002090015490506114e5565b82600214156112915750600160a060020a0383166000908152600b60205260409020600601546114e5565b82600314156112c157600160a060020a0384166000908152600b6020526040902060060180548390811061125357fe5b82600414156112ec5750600160a060020a0383166000908152600b60205260409020600701546114e5565b826005141561131c57600160a060020a0384166000908152600b6020526040902060070180548390811061125357fe5b82600614156113475750600160a060020a0383166000908152600b60205260409020600801546114e5565b826007141561137757600160a060020a0384166000908152600b6020526040902060080180548390811061125357fe5b82600814156113a25750600160a060020a0383166000908152600b60205260409020600901546114e5565b82600914156113d257600160a060020a0384166000908152600b6020526040902060090180548390811061125357fe5b82600a14156113fd5750600160a060020a0383166000908152600b60205260409020600a01546114e5565b82600b141561142d57600160a060020a0384166000908152600b60205260409020600a0180548390811061125357fe5b82600c14156114595750600160a060020a0383166000908152600b6020819052604090912001546114e5565b82600d141561148a57600160a060020a0384166000908152600b602081905260409091200180548390811061125357fe5b82600e14156114b55750600160a060020a0383166000908152600b60205260409020600c01546114e5565b82600f14156101a857600160a060020a0384166000908152600b60205260409020600c0180548390811061125357fe5b9392505050565b600160a060020a0333166000908152600260205260408120548190819060ff16151561151757600080fd5b855187511461152557600080fd5b865184511461153357600080fd5b63ffffffff85111561154457600080fd5b6e0100000000000000000000000000009250600091505b835182101561162457600c5484838151811061157357fe5b906020019060200201511061158757600080fd5b82830285028387848151811061159957fe5b9060200190602002015172010000000000000000000000000000000000009004028884815181106115c657fe5b90602001906020020151720100000000000000000000000000000000000090041717905080600c8584815181106115f957fe5b906020019060200201518154811061160d57fe5b60009182526020909120015560019091019061155b565b50505050505050565b60005433600160a060020a0390811691161461164857600080fd5b600955565b600160a060020a03166000908152600b602052604090205460ff808216926101009092041690565b60005433600160a060020a0390811691161461169057600080fd5b600160a060020a03811615156116a557600080fd5b6001547f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4090600160a060020a0316604051600160a060020a03909116815260200160405180910390a160018054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a0390811691161461172b57600080fd5b6001546000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed91600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a16001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b60005433600160a060020a039081169116146117c557600080fd5b600160a060020a03811615156117da57600080fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051600160a060020a03909116815260200160405180910390a16000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a160008054600160a060020a031916600160a060020a0392909216919091179055565b611894612fce565b6005805480602002602001604051908101604052809291908181526020018280548015610f8e57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610f70575050505050905090565b600160a060020a0381166000908152600b6020526040812060010154600c8054839290811061191d57fe5b906000526020600020900154905061193481612749565b91505b50919050565b600160a060020a03331660009081526002602052604090205460ff16151561196457600080fd5b825184511461197257600080fd5b805182511461198057600080fd5b600a8451111561198f57600080fd5b600a8251111561199e57600080fd5b600160a060020a0385166000908152600b602052604090205460ff1615156119c557600080fd5b6040805190810160409081528582526020808301869052600160a060020a0388166000908152600b90915220600501815181908051611a08929160200190612fe0565b50602082015181600101908051611a23929160200190612fe0565b509050506040805190810160409081528382526020808301849052600160a060020a0388166000908152600b90915220600701815181908051611a6a929160200190612fe0565b50602082015181600101908051610e8b929160200190612fe0565b60005433600160a060020a03908116911614611aa057600080fd5b600160a060020a03811660009081526002602052604090205460ff1615611ac657600080fd5b60045460329010611ad657600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600260205260409020805460ff1916600190811790915560048054909181016111c68382612fa5565b600e54600160a060020a031681565b600760209081526000928352604080842090915290825290205481565b6000805433600160a060020a03908116911614611b9d57600080fd5b600160a060020a03821660009081526002602052604090205460ff161515611bc457600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b600454811015610c785781600160a060020a0316600482815481101515611c0957fe5b600091825260209091200154600160a060020a03161415611ce557600480546000198101908110611c3657fe5b60009182526020909120015460048054600160a060020a039092169183908110611c5c57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600480546000190190611c989082612fa5565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051600160a060020a039092168252151560208201526040908101905180910390a1610c78565b600101611be6565b600160a060020a0384166000908152600b602052604081205481908190819081908190819081908190610100900460ff161515611d2d5760009850612273565b600160a060020a038d166000908152600660205260409020541515611d555760009850612273565b600160a060020a038d166000908152600b6020526040902060010154600c80549091908110611d8057fe5b9060005260206000209001549750611d9788612749565b60095490975087018c10611dae5760009850612273565b611db98d888e612756565b90965094508a15611ffd5750600160a060020a038c166000908152600b6020526040902060030154611ded888e600161278b565b91508160000b600a029250611e0281846127e4565b9050611e0f8d828c612830565b600160a060020a038e166000908152600b602052604090819020919b50968b01968b9550611efa91600501908051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611e9357602002820191906000526020600020905b815481526020019060010190808311611e7f575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611eeb57602002820191906000526020600020905b815481526020019060010190808311611ed7575b5050505050815250508b61285a565b9250611f0681846127e4565b600160a060020a038e166000908152600b602052604090819020919250611fea91600901908051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611f8357602002820191906000526020600020905b815481526020019060010190808311611f6f575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611fdb57602002820191906000526020600020905b815481526020019060010190808311611fc7575b5050505050815250508761285a565b9250611ff681846127e4565b905061222d565b50600160a060020a038c166000908152600b6020526040812060040154906120289089908f9061278b565b91508160000b600a02925061203d81846127e4565b600160a060020a038e166000908152600b6020526040908190206000198d0298890198965091925061212891600701908051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611e935760200282019190600052602060002090815481526020019060010190808311611e7f575050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611eeb5760200282019190600052602060002090815481526020019060010190808311611ed7575050505050815250508b61285a565b925061213481846127e4565b905061221e600b60008f600160a060020a0316600160a060020a03168152602001908152602001600020600b0160408051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611f835760200282019190600052602060002090815481526020019060010190808311611f6f575050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611fdb5760200282019190600052602060002090815481526020019060010190808311611fc7575050505050815250508761285a565b925061222a81846127e4565b90505b6122368d6128e2565b61223f87612900565b1061224d5760009850612273565b6122568d61291c565b612261858701612900565b1061226f5760009850612273565b8098505b5050505050505050949350505050565b600160a060020a03331660009081526002602052604090205460ff1615156122aa57600080fd5b82518451146122b857600080fd5b80518251146122c657600080fd5b600a845111156122d557600080fd5b600a825111156122e457600080fd5b600160a060020a0385166000908152600b602052604090205460ff16151561230b57600080fd5b6040805190810160409081528582526020808301869052600160a060020a0388166000908152600b9091522060090181518190805161234e929160200190612fe0565b50602082015181600101908051612369929160200190612fe0565b509050506040805190810160409081528382526020808301849052600160a060020a0388166000908152600b918290529190912001815181908051611a6a929160200190612fe0565b60005433600160a060020a039081169116146123cd57600080fd5b606060405190810160409081528482526020808301859052818301849052600160a060020a0387166000908152600690915220815181556020820151816001015560408201516002909101555050505050565b600e5433600160a060020a0390811691161461243b57600080fd5b81151561244e5761244b846118f2565b91505b61245a8484848461293a565b50505050565b60005433600160a060020a0390811691161461247b57600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f1935050505015156124ac57600080fd5b7fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de8282604051918252600160a060020a031660208201526040908101905180910390a15050565b6000811561251d5750600160a060020a0382166000908152600b602052604090206003015461253b565b50600160a060020a0382166000908152600b60205260409020600401545b92915050565b60005433600160a060020a0390811691161461255c57600080fd5b600160a060020a0381166000908152600b602052604090205460ff161561258257600080fd5b600160a060020a0381166000908152600b60205260409020805460ff19166001908117909155600a8054909181016125ba8382612fa5565b5060009182526020909120018054600160a060020a031916600160a060020a038316179055600d5415156125fc57600c8054906125fa9060018301612fa5565b505b600c54600160a060020a0382166000908152600b60205260409020600019909101600182810191909155600d546002909201829055600e910106600d5561264281612a6a565b61264b81612aa5565b50565b600160a060020a0381166000908152600b60205260408120548190819081908190819060ff16151561267f57600080fd5b5050600160a060020a0385166000908152600b602052604090206001810154600290910154600c8054839183916126cf9190849081106126bb57fe5b9060005260206000209001548a600161278b565b60f860020a026126fb600c868154811015156126e757fe5b9060005260206000209001548b600061278b565b60f860020a02955095509550955050509193509193565b600160a060020a03166000908152600660205260409020805460018201546002909201549092565b600054600160a060020a031681565b60e060020a81045b919050565b600160a060020a038316600090815260066020526040812054819061277c868686612b67565b90820297910295509350505050565b600160a060020a0382166000908152600b60205260408120600201548183156127b85750601281016127be565b50600481015b8581602081106127ca57fe5b1a60f860020a0260f860020a900492505b50509392505050565b60008069d3c21bcecceda10000008411156127fe57600080fd5b61270f1983121561280e57600080fd5b64174876e80083131561282057600080fd5b5050612710908101919091020490565b600080600061283e86612c55565b91506012905061285085828487612d0f565b9695505050505050565b60008060008460200151519150600090505b818110156128ba578451818151811061288157fe5b9060200190602002015184136128b257846020015181815181106128a157fe5b9060200190602002015192506128da565b60010161286c565b846020015160018303815181106128cd57fe5b9060200190602002015192505b505092915050565b600160a060020a031660009081526006602052604090206002015490565b60008082121561291557506000198102612751565b5080612751565b600160a060020a031660009081526006602052604090206001015490565b600080600061294761302b565b600160a060020a0388166000908152600660205260408120546005870695508881151561297057fe5b600160a060020a038b1660009081526007602090815260408083208a845290915281205492909105955093506129a590612da8565b91508582602001511415612a045786826060015114156129d9578382818151019052508360408301818151019052506129ff565b6129e4898888612e35565b84810160408401529250838281815101905250606082018790525b612a2e565b612a0f898888612b67565b8584526020840188905260608401899052858201604085015290935090505b612a3782612ebd565b600160a060020a039099166000908152600760209081526040808320978352969052949094209790975550505050505050565b60005b6005811015610c7857600160a060020a0382166000908152600760209081526040808320848452909152902060019081905501612a6d565b600160a060020a03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612aeb57600160a060020a03811660009081526008602052604090206012905561264b565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612b3157600080fd5b6102c65a03f11515612b4257600080fd5b5050506040518051600160a060020a0383166000908152600860205260409020555050565b6000806000806000806000612b7a61302b565b60009750600096506000955060009450899350889250600091505b6005821015612c3c57600160a060020a038b166000908152600760209081526040808320858452909152902054612bcb90612da8565b905082816020015111158015612be5575083816020015110155b15612bf1578051850194505b89816060015114612c0157612c31565b8581602001511015612c1257612c31565b80602001519550806040015197508881602001511415612c3157805196505b600190910190612b95565b871515612c47578497505b505050505050935093915050565b600080600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612c865760129150611937565b50600160a060020a03821660009081526008602052604090205480151561253b5782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612ced57600080fd5b6102c65a03f11515612cfe57600080fd5b505050604051805190509150611937565b60006b204fce5e3e25026110000000851115612d2a57600080fd5b69d3c21bcecceda1000000821115612d4157600080fd5b838310612d745760128484031115612d5857600080fd5b670de0b6b3a7640000858302858503600a0a025b049050612da0565b60128385031115612d8457600080fd5b828403600a0a670de0b6b3a764000002828602811515612d6c57fe5b949350505050565b612db061302b565b612db861302b565b67ffffffffffffffff83811660070b82526801000000000000000084041667ffffffffffffffff908116602083015270010000000000000000000000000000000084041660070b60408201527801000000000000000000000000000000000000000000000000830467ffffffffffffffff16606082015292915050565b600080612e4061302b565b83851115612e4d57600080fd5b60009250600091505b60058210156127db57600160a060020a0386166000908152600760209081526040808320858452909152902054612e8c90612da8565b905083816020015111158015612ea6575084816020015110155b15612eb2578051830192505b600190910190612e56565b600080678000000000000000835112612ed557600080fd5b677fffffffffffffff19835113612eeb57600080fd5b68010000000000000000836020015110612f0457600080fd5b678000000000000000604084015112612f1c57600080fd5b677fffffffffffffff19604084015113612f3557600080fd5b68010000000000000000836060015110612f4e57600080fd5b67ffffffffffffffff83511690506801000000000000000083602001510217680100000000000000008067ffffffffffffffff60408601511602021768010000000000000000808060608601510202021792915050565b815481835581811511612fc957600083815260209020612fc9918101908301613054565b505050565b60206040519081016040526000815290565b82805482825590600052602060002090810192821561301b579160200282015b8281111561301b578251825591602001919060010190613000565b50613027929150613054565b5090565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b610f9691905b80821115613027576000815560010161305a5600a165627a7a7230582013c0624ab26376d55c5b465df25d0ba2f79c07a504aab6f0bfe2f580620c032f0029000000000000000000000000d3cc03c1d1e9d46f28aebc4ba26c5990c7ffbc3e
Deployed Bytecode
0x6060604052600436106101a85763ffffffff60e060020a60003504166301a12fd381146101ad57806314673d31146101ce578063158859f7146101ed578063162656941461020c5780631a4813d7146102315780631d6a8bda146103c957806326782247146103e857806327a099d8146104175780632ba996a51461047d5780633ccdbb2814610490578063408ee7fe146104b95780635085c9f1146104d857806362674e93146104eb57806364887334146105105780636c6295b8146105e8578063721bba59146105fe57806375829def1461063957806377f50f97146106585780637acc86781461066b5780637c423f541461068a5780638036d7571461069d57806380d8b380146106bc5780639870d7fe146107d9578063a7f43acd146107f8578063a80c609e1461080b578063ac8a584a1461082d578063b8e9c22e1461084c578063bc9cbcc814610876578063bfee356914610993578063c6fd2103146109bb578063ce56c454146109e3578063cf8fee1114610a05578063d48bfca714610a29578063e4a2ac6214610a48578063e7d4fd9114610ab6578063f851a44014610af9575b600080fd5b34156101b857600080fd5b6101cc600160a060020a0360043516610b0c565b005b34156101d957600080fd5b6101cc600160a060020a0360043516610c7c565b34156101f857600080fd5b6101cc600160a060020a0360043516610cb9565b341561021757600080fd5b61021f610d29565b60405190815260200160405180910390f35b341561023c57600080fd5b6101cc60046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001909190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610d2f95505050505050565b34156103d457600080fd5b6101cc600160a060020a0360043516610e95565b34156103f357600080fd5b6103fb610f21565b604051600160a060020a03909116815260200160405180910390f35b341561042257600080fd5b61042a610f30565b60405160208082528190810183818151815260200191508051906020019060200280838360005b83811015610469578082015183820152602001610451565b505050509050019250505060405180910390f35b341561048857600080fd5b61042a610f99565b341561049b57600080fd5b6101cc600160a060020a036004358116906024359060443516610fff565b34156104c457600080fd5b6101cc600160a060020a03600435166110f6565b34156104e357600080fd5b61021f6111f2565b34156104f657600080fd5b61021f600160a060020a03600435166024356044356111f8565b341561051b57600080fd5b6101cc600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506114ec95505050505050565b34156105f357600080fd5b6101cc60043561162d565b341561060957600080fd5b61061d600160a060020a036004351661164d565b6040519115158252151560208201526040908101905180910390f35b341561064457600080fd5b6101cc600160a060020a0360043516611675565b341561066357600080fd5b6101cc611710565b341561067657600080fd5b6101cc600160a060020a03600435166117aa565b341561069557600080fd5b61042a61188c565b34156106a857600080fd5b61021f600160a060020a03600435166118f2565b34156106c757600080fd5b6101cc60048035600160a060020a031690604460248035908101908301358060208082020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061193d95505050505050565b34156107e457600080fd5b6101cc600160a060020a0360043516611a85565b341561080357600080fd5b6103fb611b55565b341561081657600080fd5b61021f600160a060020a0360043516602435611b64565b341561083857600080fd5b6101cc600160a060020a0360043516611b81565b341561085757600080fd5b61021f600160a060020a03600435166024356044351515606435611ced565b341561088157600080fd5b6101cc60048035600160a060020a031690604460248035908101908301358060208082020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061228395505050505050565b341561099e57600080fd5b6101cc600160a060020a03600435166024356044356064356123b2565b34156109c657600080fd5b6101cc600160a060020a0360043516602435604435606435612420565b34156109ee57600080fd5b6101cc600435600160a060020a0360243516612460565b3415610a1057600080fd5b61021f600160a060020a036004351660243515156124f3565b3415610a3457600080fd5b6101cc600160a060020a0360043516612541565b3415610a5357600080fd5b610a67600160a060020a036004351661264e565b60405193845260208401929092527fff00000000000000000000000000000000000000000000000000000000000000908116604080850191909152911660608301526080909101905180910390f35b3415610ac157600080fd5b610ad5600160a060020a0360043516612712565b60405180848152602001838152602001828152602001935050505060405180910390f35b3415610b0457600080fd5b6103fb61273a565b6000805433600160a060020a03908116911614610b2857600080fd5b600160a060020a03821660009081526003602052604090205460ff161515610b4f57600080fd5b50600160a060020a0381166000908152600360205260408120805460ff191690555b600554811015610c785781600160a060020a0316600582815481101515610b9457fe5b600091825260209091200154600160a060020a03161415610c7057600580546000198101908110610bc157fe5b60009182526020909120015460058054600160a060020a039092169183908110610be757fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556005805490610c23906000198301612fa5565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051600160a060020a039092168252151560208201526040908101905180910390a1610c78565b600101610b71565b5050565b60005433600160a060020a03908116911614610c9757600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b600160a060020a03331660009081526003602052604090205460ff161515610ce057600080fd5b600160a060020a0381166000908152600b602052604090205460ff161515610d0757600080fd5b600160a060020a03166000908152600b60205260409020805461ff0019169055565b60095481565b600160a060020a03331660009081526002602052604081205460ff161515610d5657600080fd5b8651885114610d6457600080fd5b8551885114610d7257600080fd5b8451845114610d8057600080fd5b8151845114610d8e57600080fd5b5060005b8751811015610e7f57600b6000898381518110610dab57fe5b90602001906020020151600160a060020a0316815260208101919091526040016000205460ff161515610ddd57600080fd5b868181518110610de957fe5b90602001906020020151600b60008a8481518110610e0357fe5b90602001906020020151600160a060020a03168152602081019190915260400160002060030155858181518110610e3657fe5b90602001906020020151600b60008a8481518110610e5057fe5b90602001906020020151600160a060020a03168152602081019190915260400160002060040155600101610d92565b610e8b858585856114ec565b5050505050505050565b60005433600160a060020a03908116911614610eb057600080fd5b600160a060020a0381166000908152600b602052604090205460ff161515610ed757600080fd5b600160a060020a0381166000908152600660205260409020541515610efb57600080fd5b600160a060020a03166000908152600b60205260409020805461ff001916610100179055565b600154600160a060020a031681565b610f38612fce565b6004805480602002602001604051908101604052809291908181526020018280548015610f8e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f70575b505050505090505b90565b610fa1612fce565b600a805480602002602001604051908101604052809291908181526020018280548015610f8e57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610f70575050505050905090565b60005433600160a060020a0390811691161461101a57600080fd5b82600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561107757600080fd5b6102c65a03f1151561108857600080fd5b50505060405180519050151561109d57600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051600160a060020a03938416815260208101929092529091166040808301919091526060909101905180910390a1505050565b60005433600160a060020a0390811691161461111157600080fd5b600160a060020a03811660009081526003602052604090205460ff161561113757600080fd5b6005546032901061114757600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600360205260409020805460ff1916600190811790915560058054909181016111c68382612fa5565b5060009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055565b600d5481565b60008215156112235750600160a060020a0383166000908152600b60205260409020600501546114e5565b826001141561126657600160a060020a0384166000908152600b6020526040902060050180548390811061125357fe5b90600052602060002090015490506114e5565b82600214156112915750600160a060020a0383166000908152600b60205260409020600601546114e5565b82600314156112c157600160a060020a0384166000908152600b6020526040902060060180548390811061125357fe5b82600414156112ec5750600160a060020a0383166000908152600b60205260409020600701546114e5565b826005141561131c57600160a060020a0384166000908152600b6020526040902060070180548390811061125357fe5b82600614156113475750600160a060020a0383166000908152600b60205260409020600801546114e5565b826007141561137757600160a060020a0384166000908152600b6020526040902060080180548390811061125357fe5b82600814156113a25750600160a060020a0383166000908152600b60205260409020600901546114e5565b82600914156113d257600160a060020a0384166000908152600b6020526040902060090180548390811061125357fe5b82600a14156113fd5750600160a060020a0383166000908152600b60205260409020600a01546114e5565b82600b141561142d57600160a060020a0384166000908152600b60205260409020600a0180548390811061125357fe5b82600c14156114595750600160a060020a0383166000908152600b6020819052604090912001546114e5565b82600d141561148a57600160a060020a0384166000908152600b602081905260409091200180548390811061125357fe5b82600e14156114b55750600160a060020a0383166000908152600b60205260409020600c01546114e5565b82600f14156101a857600160a060020a0384166000908152600b60205260409020600c0180548390811061125357fe5b9392505050565b600160a060020a0333166000908152600260205260408120548190819060ff16151561151757600080fd5b855187511461152557600080fd5b865184511461153357600080fd5b63ffffffff85111561154457600080fd5b6e0100000000000000000000000000009250600091505b835182101561162457600c5484838151811061157357fe5b906020019060200201511061158757600080fd5b82830285028387848151811061159957fe5b9060200190602002015172010000000000000000000000000000000000009004028884815181106115c657fe5b90602001906020020151720100000000000000000000000000000000000090041717905080600c8584815181106115f957fe5b906020019060200201518154811061160d57fe5b60009182526020909120015560019091019061155b565b50505050505050565b60005433600160a060020a0390811691161461164857600080fd5b600955565b600160a060020a03166000908152600b602052604090205460ff808216926101009092041690565b60005433600160a060020a0390811691161461169057600080fd5b600160a060020a03811615156116a557600080fd5b6001547f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4090600160a060020a0316604051600160a060020a03909116815260200160405180910390a160018054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a0390811691161461172b57600080fd5b6001546000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed91600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a16001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b60005433600160a060020a039081169116146117c557600080fd5b600160a060020a03811615156117da57600080fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051600160a060020a03909116815260200160405180910390a16000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a160008054600160a060020a031916600160a060020a0392909216919091179055565b611894612fce565b6005805480602002602001604051908101604052809291908181526020018280548015610f8e57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610f70575050505050905090565b600160a060020a0381166000908152600b6020526040812060010154600c8054839290811061191d57fe5b906000526020600020900154905061193481612749565b91505b50919050565b600160a060020a03331660009081526002602052604090205460ff16151561196457600080fd5b825184511461197257600080fd5b805182511461198057600080fd5b600a8451111561198f57600080fd5b600a8251111561199e57600080fd5b600160a060020a0385166000908152600b602052604090205460ff1615156119c557600080fd5b6040805190810160409081528582526020808301869052600160a060020a0388166000908152600b90915220600501815181908051611a08929160200190612fe0565b50602082015181600101908051611a23929160200190612fe0565b509050506040805190810160409081528382526020808301849052600160a060020a0388166000908152600b90915220600701815181908051611a6a929160200190612fe0565b50602082015181600101908051610e8b929160200190612fe0565b60005433600160a060020a03908116911614611aa057600080fd5b600160a060020a03811660009081526002602052604090205460ff1615611ac657600080fd5b60045460329010611ad657600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600260205260409020805460ff1916600190811790915560048054909181016111c68382612fa5565b600e54600160a060020a031681565b600760209081526000928352604080842090915290825290205481565b6000805433600160a060020a03908116911614611b9d57600080fd5b600160a060020a03821660009081526002602052604090205460ff161515611bc457600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b600454811015610c785781600160a060020a0316600482815481101515611c0957fe5b600091825260209091200154600160a060020a03161415611ce557600480546000198101908110611c3657fe5b60009182526020909120015460048054600160a060020a039092169183908110611c5c57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600480546000190190611c989082612fa5565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051600160a060020a039092168252151560208201526040908101905180910390a1610c78565b600101611be6565b600160a060020a0384166000908152600b602052604081205481908190819081908190819081908190610100900460ff161515611d2d5760009850612273565b600160a060020a038d166000908152600660205260409020541515611d555760009850612273565b600160a060020a038d166000908152600b6020526040902060010154600c80549091908110611d8057fe5b9060005260206000209001549750611d9788612749565b60095490975087018c10611dae5760009850612273565b611db98d888e612756565b90965094508a15611ffd5750600160a060020a038c166000908152600b6020526040902060030154611ded888e600161278b565b91508160000b600a029250611e0281846127e4565b9050611e0f8d828c612830565b600160a060020a038e166000908152600b602052604090819020919b50968b01968b9550611efa91600501908051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611e9357602002820191906000526020600020905b815481526020019060010190808311611e7f575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611eeb57602002820191906000526020600020905b815481526020019060010190808311611ed7575b5050505050815250508b61285a565b9250611f0681846127e4565b600160a060020a038e166000908152600b602052604090819020919250611fea91600901908051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611f8357602002820191906000526020600020905b815481526020019060010190808311611f6f575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611fdb57602002820191906000526020600020905b815481526020019060010190808311611fc7575b5050505050815250508761285a565b9250611ff681846127e4565b905061222d565b50600160a060020a038c166000908152600b6020526040812060040154906120289089908f9061278b565b91508160000b600a02925061203d81846127e4565b600160a060020a038e166000908152600b6020526040908190206000198d0298890198965091925061212891600701908051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611e935760200282019190600052602060002090815481526020019060010190808311611e7f575050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611eeb5760200282019190600052602060002090815481526020019060010190808311611ed7575050505050815250508b61285a565b925061213481846127e4565b905061221e600b60008f600160a060020a0316600160a060020a03168152602001908152602001600020600b0160408051908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015611f835760200282019190600052602060002090815481526020019060010190808311611f6f575050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611fdb5760200282019190600052602060002090815481526020019060010190808311611fc7575050505050815250508761285a565b925061222a81846127e4565b90505b6122368d6128e2565b61223f87612900565b1061224d5760009850612273565b6122568d61291c565b612261858701612900565b1061226f5760009850612273565b8098505b5050505050505050949350505050565b600160a060020a03331660009081526002602052604090205460ff1615156122aa57600080fd5b82518451146122b857600080fd5b80518251146122c657600080fd5b600a845111156122d557600080fd5b600a825111156122e457600080fd5b600160a060020a0385166000908152600b602052604090205460ff16151561230b57600080fd5b6040805190810160409081528582526020808301869052600160a060020a0388166000908152600b9091522060090181518190805161234e929160200190612fe0565b50602082015181600101908051612369929160200190612fe0565b509050506040805190810160409081528382526020808301849052600160a060020a0388166000908152600b918290529190912001815181908051611a6a929160200190612fe0565b60005433600160a060020a039081169116146123cd57600080fd5b606060405190810160409081528482526020808301859052818301849052600160a060020a0387166000908152600690915220815181556020820151816001015560408201516002909101555050505050565b600e5433600160a060020a0390811691161461243b57600080fd5b81151561244e5761244b846118f2565b91505b61245a8484848461293a565b50505050565b60005433600160a060020a0390811691161461247b57600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f1935050505015156124ac57600080fd5b7fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de8282604051918252600160a060020a031660208201526040908101905180910390a15050565b6000811561251d5750600160a060020a0382166000908152600b602052604090206003015461253b565b50600160a060020a0382166000908152600b60205260409020600401545b92915050565b60005433600160a060020a0390811691161461255c57600080fd5b600160a060020a0381166000908152600b602052604090205460ff161561258257600080fd5b600160a060020a0381166000908152600b60205260409020805460ff19166001908117909155600a8054909181016125ba8382612fa5565b5060009182526020909120018054600160a060020a031916600160a060020a038316179055600d5415156125fc57600c8054906125fa9060018301612fa5565b505b600c54600160a060020a0382166000908152600b60205260409020600019909101600182810191909155600d546002909201829055600e910106600d5561264281612a6a565b61264b81612aa5565b50565b600160a060020a0381166000908152600b60205260408120548190819081908190819060ff16151561267f57600080fd5b5050600160a060020a0385166000908152600b602052604090206001810154600290910154600c8054839183916126cf9190849081106126bb57fe5b9060005260206000209001548a600161278b565b60f860020a026126fb600c868154811015156126e757fe5b9060005260206000209001548b600061278b565b60f860020a02955095509550955050509193509193565b600160a060020a03166000908152600660205260409020805460018201546002909201549092565b600054600160a060020a031681565b60e060020a81045b919050565b600160a060020a038316600090815260066020526040812054819061277c868686612b67565b90820297910295509350505050565b600160a060020a0382166000908152600b60205260408120600201548183156127b85750601281016127be565b50600481015b8581602081106127ca57fe5b1a60f860020a0260f860020a900492505b50509392505050565b60008069d3c21bcecceda10000008411156127fe57600080fd5b61270f1983121561280e57600080fd5b64174876e80083131561282057600080fd5b5050612710908101919091020490565b600080600061283e86612c55565b91506012905061285085828487612d0f565b9695505050505050565b60008060008460200151519150600090505b818110156128ba578451818151811061288157fe5b9060200190602002015184136128b257846020015181815181106128a157fe5b9060200190602002015192506128da565b60010161286c565b846020015160018303815181106128cd57fe5b9060200190602002015192505b505092915050565b600160a060020a031660009081526006602052604090206002015490565b60008082121561291557506000198102612751565b5080612751565b600160a060020a031660009081526006602052604090206001015490565b600080600061294761302b565b600160a060020a0388166000908152600660205260408120546005870695508881151561297057fe5b600160a060020a038b1660009081526007602090815260408083208a845290915281205492909105955093506129a590612da8565b91508582602001511415612a045786826060015114156129d9578382818151019052508360408301818151019052506129ff565b6129e4898888612e35565b84810160408401529250838281815101905250606082018790525b612a2e565b612a0f898888612b67565b8584526020840188905260608401899052858201604085015290935090505b612a3782612ebd565b600160a060020a039099166000908152600760209081526040808320978352969052949094209790975550505050505050565b60005b6005811015610c7857600160a060020a0382166000908152600760209081526040808320848452909152902060019081905501612a6d565b600160a060020a03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612aeb57600160a060020a03811660009081526008602052604090206012905561264b565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612b3157600080fd5b6102c65a03f11515612b4257600080fd5b5050506040518051600160a060020a0383166000908152600860205260409020555050565b6000806000806000806000612b7a61302b565b60009750600096506000955060009450899350889250600091505b6005821015612c3c57600160a060020a038b166000908152600760209081526040808320858452909152902054612bcb90612da8565b905082816020015111158015612be5575083816020015110155b15612bf1578051850194505b89816060015114612c0157612c31565b8581602001511015612c1257612c31565b80602001519550806040015197508881602001511415612c3157805196505b600190910190612b95565b871515612c47578497505b505050505050935093915050565b600080600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612c865760129150611937565b50600160a060020a03821660009081526008602052604090205480151561253b5782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612ced57600080fd5b6102c65a03f11515612cfe57600080fd5b505050604051805190509150611937565b60006b204fce5e3e25026110000000851115612d2a57600080fd5b69d3c21bcecceda1000000821115612d4157600080fd5b838310612d745760128484031115612d5857600080fd5b670de0b6b3a7640000858302858503600a0a025b049050612da0565b60128385031115612d8457600080fd5b828403600a0a670de0b6b3a764000002828602811515612d6c57fe5b949350505050565b612db061302b565b612db861302b565b67ffffffffffffffff83811660070b82526801000000000000000084041667ffffffffffffffff908116602083015270010000000000000000000000000000000084041660070b60408201527801000000000000000000000000000000000000000000000000830467ffffffffffffffff16606082015292915050565b600080612e4061302b565b83851115612e4d57600080fd5b60009250600091505b60058210156127db57600160a060020a0386166000908152600760209081526040808320858452909152902054612e8c90612da8565b905083816020015111158015612ea6575084816020015110155b15612eb2578051830192505b600190910190612e56565b600080678000000000000000835112612ed557600080fd5b677fffffffffffffff19835113612eeb57600080fd5b68010000000000000000836020015110612f0457600080fd5b678000000000000000604084015112612f1c57600080fd5b677fffffffffffffff19604084015113612f3557600080fd5b68010000000000000000836060015110612f4e57600080fd5b67ffffffffffffffff83511690506801000000000000000083602001510217680100000000000000008067ffffffffffffffff60408601511602021768010000000000000000808060608601510202021792915050565b815481835581811511612fc957600083815260209020612fc9918101908301613054565b505050565b60206040519081016040526000815290565b82805482825590600052602060002090810192821561301b579160200282015b8281111561301b578251825591602001919060010190613000565b50613027929150613054565b5090565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b610f9691905b80821115613027576000815560010161305a5600a165627a7a7230582013c0624ab26376d55c5b465df25d0ba2f79c07a504aab6f0bfe2f580620c032f0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d3cc03c1d1e9d46f28aebc4ba26c5990c7ffbc3e
-----Decoded View---------------
Arg [0] : _admin (address): 0xD3CC03C1d1e9D46F28aebc4Ba26c5990c7FFbC3e
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d3cc03c1d1e9d46f28aebc4ba26c5990c7ffbc3e
Deployed Bytecode Sourcemap
17075:14314:0:-;;;;;;;;;-1:-1:-1;;;17075:14314:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6397:463;;;;;;;;;;-1:-1:-1;;;;;6397:463:0;;;;;;;23481:105;;;;;;;;;;-1:-1:-1;;;;;23481:105:0;;;;;23320:153;;;;;;;;;;-1:-1:-1;;;;;23320:153:0;;;;;18815:42;;;;;;;;;;;;;;;;;;;;;;;;;;;20943:767;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20943:767:0;;-1:-1:-1;20943:767:0;;-1:-1:-1;;;;;;20943:767:0;23091:221;;;;;;;;;;-1:-1:-1;;;;;23091:221:0;;;;;4021:27;;;;;;;;;;;;;;;-1:-1:-1;;;;;4021:27:0;;;;;;;;;;;;;;4632:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;29679:94:0;;;;;;;;;;;;8303:189;;;;;;;;;;-1:-1:-1;;;;;8303:189:0;;;;;;;;;;;;;6081:308;;;;;;;;;;-1:-1:-1;;;;;6081:308:0;;;;;19045:45;;;;;;;;;;;;27834:1574;;;;;;;;;;-1:-1:-1;;;;;27834:1574:0;;;;;;;;;20313:622;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20313:622:0;;-1:-1:-1;20313:622:0;;-1:-1:-1;;;;;;20313:622:0;22958:125;;;;;;;;;;;;;;27634:149;;;;;;;;;;-1:-1:-1;;;;;27634:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5050:187;;;;;;;;;;-1:-1:-1;;;;;5050:187:0;;;;;5819:194;;;;;;;;;;;;5418:223;;;;;;;;;;-1:-1:-1;;;;;5418:223:0;;;;;4738:96;;;;;;;;;;;;29458:213;;;;;;;;;;-1:-1:-1;;;;;29458:213:0;;;;;21718:603;;;;;;;;;;;;;-1:-1:-1;;;;;21718:603:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21718:603:0;;-1:-1:-1;21718:603:0;;-1:-1:-1;;;;;;21718:603:0;6929:319;;;;;;;;;;-1:-1:-1;;;;;6929:319:0;;;;;19097:30;;;;;;;;;;;;9571:65;;;;;;;;;;-1:-1:-1;;;;;9571:65:0;;;;;;;7256:481;;;;;;;;;;-1:-1:-1;;;;;7256:481:0;;;;;24026:2785;;;;;;;;;;-1:-1:-1;;;;;24026:2785:0;;;;;;;;;;;;;22329:621;;;;;;;;;;;;;-1:-1:-1;;;;;22329:621:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22329:621:0;;-1:-1:-1;22329:621:0;;-1:-1:-1;;;;;;22329:621:0;9782:412;;;;;;;;;;-1:-1:-1;;;;;9782:412:0;;;;;;;;;;;23594:378;;;;;;;;;;-1:-1:-1;;;;;23594:378:0;;;;;;;;;;;8604:153;;;;;;;;;;;;-1:-1:-1;;;;;8604:153:0;;;;;26864:212;;;;;;;;;;-1:-1:-1;;;;;26864:212:0;;;;;;;;;19644:661;;;;;;;;;;-1:-1:-1;;;;;19644:661:0;;;;;27084:542;;;;;;;;;;-1:-1:-1;;;;;27084:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10202:278;;;;;;;;;;-1:-1:-1;;;;;10202:278:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3994:20;;;;;;;;;;;;6397:463;6546:6;4414:5;;4400:10;-1:-1:-1;;;;;4400:19:0;;;4414:5;;4400:19;4392:28;;;;;;-1:-1:-1;;;;;6474:17:0;;;;;;:8;:17;;;;;;;;6466:26;;;;;;;;-1:-1:-1;;;;;;6503:17:0;;6523:5;6503:17;;;:8;:17;;;;;:25;;-1:-1:-1;;6503:25:0;;;6541:312;6562:13;:20;6558:24;;6541:312;;;6628:7;-1:-1:-1;;;;;6608:27:0;:13;6622:1;6608:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6608:16:0;:27;6604:238;;;6675:13;6689:20;;-1:-1:-1;;6689:24:0;;;6675:39;;;;;;;;;;;;;;;;6656:13;:16;;-1:-1:-1;;;;;6675:39:0;;;;6670:1;;6656:16;;;;;;;;;;;;;;;:58;;-1:-1:-1;;;;;;6656:58:0;-1:-1:-1;;;;;6656:58:0;;;;;;;;;;6733:13;:22;;;;;-1:-1:-1;;6733:22:0;;;:::i;:::-;;6774:28;6787:7;6796:5;6774:28;;-1:-1:-1;;;;;6774:28:0;;;;;;;;;;;;;;;;;;;;;;6821:5;;6604:238;6584:3;;6541:312;;;6397:463;;:::o;23481:105::-;4414:5;;4400:10;-1:-1:-1;;;;;4400:19:0;;;4414:5;;4400:19;4392:28;;;;;;23553:15;:25;;-1:-1:-1;;;;;;23553:25:0;-1:-1:-1;;;;;23553:25:0;;;;;;;;;;23481:105::o;23320:153::-;-1:-1:-1;;;;;4592:10:0;4583:20;;;;;:8;:20;;;;;;;;4575:29;;;;;;;;-1:-1:-1;;;;;23398:16:0;;;;;;:9;:16;;;;;:23;;;23390:32;;;;;;;;-1:-1:-1;;;;;23433:16:0;23460:5;23433:16;;;:9;:16;;;;;:32;;-1:-1:-1;;23433:32:0;;;23320:153::o;18815:42::-;;;;:::o;20943:767::-;-1:-1:-1;;;;;4501:10:0;4491:21;21406:8;4491:21;;;:9;:21;;;;;;;;4483:30;;;;;;;;21227:7;:14;21210:6;:13;:31;21202:40;;;;;;21278:8;:15;21261:6;:13;:32;21253:41;;;;;;21328:3;:10;21313:4;:11;:25;21305:34;;;;;;21373:7;:14;21358:4;:11;:29;21350:38;;;;;;-1:-1:-1;21417:1:0;21401:242;21426:6;:13;21420:3;:19;21401:242;;;21471:9;:22;21481:6;21488:3;21481:11;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21471:22:0;;;;;;;;;;;;-1:-1:-1;21471:22:0;:29;;;21463:38;;;;;;;;21553:7;21561:3;21553:12;;;;;;;;;;;;;;;;21516:9;:22;21526:6;21533:3;21526:11;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21516:22:0;;;;;;;;;;;;-1:-1:-1;21516:22:0;:34;;:49;21618:8;21627:3;21618:8;:13;;;;;;;;;;;;;;;21580:9;:22;21590:6;21597:3;21590:11;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21580:22:0;;;;;;;;;;;;-1:-1:-1;21580:22:0;:35;;:51;21441:5;;21401:242;;;21655:47;21670:3;21675:4;21681:11;21694:7;21655:14;:47::i;:::-;20943:767;;;;;;;;:::o;23091:221::-;4414:5;;4400:10;-1:-1:-1;;;;;4400:19:0;;;4414:5;;4400:19;4392:28;;;;;;-1:-1:-1;;;;;23166:16:0;;;;;;:9;:16;;;;;:23;;;23158:32;;;;;;;;-1:-1:-1;;;;;23209:23:0;;;;;;:16;:23;;;;;:47;:52;;23201:61;;;;;;-1:-1:-1;;;;;23273:16:0;;;;;:9;:16;;;;;:31;;-1:-1:-1;;23273:31:0;;;;;23091:221::o;4021:27::-;;;-1:-1:-1;;;;;4021:27:0;;:::o;4632:98::-;4679:9;;:::i;:::-;4708:14;4701:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4701:21:0;;;;;;;;;;;;;;;;;;;;;;;4632:98;;:::o;29679:94::-;29726:7;;:::i;:::-;29753:12;29746:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29746:19:0;;;;;;;;;;;;;;;;;;;;;;29679:94;:::o;8303:189::-;4414:5;;4400:10;-1:-1:-1;;;;;4400:19:0;;;4414:5;;4400:19;4392:28;;;;;;8406:5;-1:-1:-1;;;;;8406:14:0;;8421:6;8429;8406:30;;;;;;;;-1:-1:-1;;;8406:30:0;;;;;;-1:-1:-1;;;;;8406:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8398:39;;;;;;;;8448:36;8462:5;8469:6;8477;8448:36;;-1:-1:-1;;;;;8448:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8303:189;;;:::o;6081:308::-;4414:5;;4400:10;-1:-1:-1;;;;;4400:19:0;;;4414:5;;4400:19;4392:28;;;;;;-1:-1:-1;;;;;6158:20:0;;;;;;:8;:20;;;;;;;;6157:21;6149:30;;;;;;6221:13;:20;4269:2;6221:37;;6213:46;;;;;;6272:30;6285:10;6297:4;6272:30;;-1:-1:-1;;;;;6272:30:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6313:20:0;;;;;;:8;:20;;;;;:27;;-1:-1:-1;;6313:27:0;6336:4;6313:27;;;;;;6351:13;:30;;:13;;:30;;;:13;:30;;:::i;:::-;-1:-1:-1;6351:30:0;;;;;;;;;;;-1:-1:-1;;;;;;6351:30:0;-1:-1:-1;;;;;6351:30:0;;;;;;;;;;6081:308::o;19045:45::-;;;;:::o;27834:1574::-;27922:3;27942:12;;27938:78;;;-1:-1:-1;;;;;;27967:16:0;;;;;;:9;:16;;;;;:39;;:48;27956:60;;27938:78;28031:7;28042:1;28031:12;28027:73;;;-1:-1:-1;;;;;28052:16:0;;;;;;:9;:16;;;;;:39;;:48;;28094:5;;28052:48;;;;;;;;;;;;;;;28045:55;;;;28027:73;28115:7;28126:1;28115:12;28111:78;;;-1:-1:-1;;;;;;28140:16:0;;;;;;:9;:16;;;;;:41;;:48;28129:60;;28111:78;28204:7;28215:1;28204:12;28200:73;;;-1:-1:-1;;;;;28225:16:0;;;;;;:9;:16;;;;;:41;;:48;;28267:5;;28225:48;;;;;28200:73;28290:7;28301:1;28290:12;28286:79;;;-1:-1:-1;;;;;;28315:16:0;;;;;;:9;:16;;;;;:40;;:49;28304:61;;28286:79;28380:7;28391:1;28380:12;28376:74;;;-1:-1:-1;;;;;28401:16:0;;;;;;:9;:16;;;;;:40;;:49;;28444:5;;28401:49;;;;;28376:74;28465:7;28476:1;28465:12;28461:79;;;-1:-1:-1;;;;;;28490:16:0;;;;;;:9;:16;;;;;:42;;:49;28479:61;;28461:79;28555:7;28566:1;28555:12;28551:74;;;-1:-1:-1;;;;;28576:16:0;;;;;;:9;:16;;;;;:42;;:49;;28619:5;;28576:49;;;;;28551:74;28642:7;28653:1;28642:12;28638:84;;;-1:-1:-1;;;;;;28667:16:0;;;;;;:9;:16;;;;;:45;;:54;28656:66;;28638:84;28737:7;28748:1;28737:12;28733:79;;;-1:-1:-1;;;;;28758:16:0;;;;;;:9;:16;;;;;:45;;:54;;28806:5;;28758:54;;;;;28733:79;28827:7;28838:2;28827:13;28823:85;;;-1:-1:-1;;;;;;28853:16:0;;;;;;:9;:16;;;;;:47;;:54;28842:66;;28823:85;28923:7;28934:2;28923:13;28919:80;;;-1:-1:-1;;;;;28945:16:0;;;;;;:9;:16;;;;;:47;;:54;;28993:5;;28945:54;;;;;28919:80;29016:7;29027:2;29016:13;29012:86;;;-1:-1:-1;;;;;;29042:16:0;;;;;;:9;:16;;;;;;;;:46;:55;29031:67;;29012:86;29113:7;29124:2;29113:13;29109:81;;;-1:-1:-1;;;;;29135:16:0;;;;;;:9;:16;;;;;;;;:46;:55;;29184:5;;29135:55;;;;;29109:81;29205:7;29216:2;29205:13;29201:86;;;-1:-1:-1;;;;;;29231:16:0;;;;;;:9;:16;;;;;:48;;:55;29220:67;;29201:86;29302:7;29313:2;29302:13;29298:81;;;-1:-1:-1;;;;;29324:16:0;;;;;;:9;:16;;;;;:48;;:55;;29373:5;;29324:55;;;;;27834:1574;;;;;;:::o;20313:622::-;-1:-1:-1;;;;;4501:10:0;4491:21;20575:18;4491:21;;;:9;:21;;;;;;20575:18;;;;4491:21;;4483:30;;;;;;;;20457:4;:11;20443:3;:10;:25;20435:34;;;;;;20506:3;:10;20488:7;:14;:28;20480:37;;;;;;20551:10;20536:25;;;20528:34;;;;;;19237:37;;-1:-1:-1;20638:1:0;;-1:-1:-1;20624:304:0;20645:7;:14;20641:1;:18;20624:304;;;20702:21;:28;20689:7;20697:1;20689:7;:10;;;;;;;;;;;;;;;:41;20681:50;;;;;;20837:13;20821;:29;20806:11;:45;20789:13;20778:4;20783:1;20778:7;;;;;;;;;;;;;;;;20773:13;;;:29;20763:3;20767:1;20763:6;;;;;;;;;;;;;;;;20758:12;;;:44;:94;;-1:-1:-1;20758:94:0;20867:21;20889:7;20897:1;20889:7;:10;;;;;;;;;;;;;;;20867:33;;;;;;;;;;;;;;;;;:49;20661:3;;;;;20624:304;;;20313:622;;;;;;;:::o;22958:125::-;4414:5;;4400:10;-1:-1:-1;;;;;4400:19:0;;;4414:5;;4400:19;4392:28;;;;;;23039:25;:36;22958:125::o;27634:149::-;-1:-1:-1;;;;;27725:16:0;27694:4;27725:16;;;:9;:16;;;;;:23;;;;;;;27750:24;;;;;27634:149::o;5050:187::-;4414:5;;4400:10;-1:-1:-1;;;;;4400:19:0;;;4414:5;;4400:19;4392:28;;;;;;-1:-1:-1;;;;;5127:22:0;;;;5119:31;;;;;;5182:12;;5161:34;;-1:-1:-1;;;;;5182:12:0;5161:34;;-1:-1:-1;;;;;5161:34:0;;;;;;;;;;;;;;5206:12;:23;;-1:-1:-1;;;;;;5206:23:0;-1:-1:-1;;;;;5206:23:0;;;;;;;;;;5050:187::o;5819:194::-;5867:12;;5883:10;-1:-1:-1;;;;;5867:26:0;;;:12;;:26;5859:35;;;;;;5918:12;;;5932:5;5905:33;;-1:-1:-1;;;;;5918:12:0;;;;5932:5;5905:33;;-1:-1:-1;;;;;5905:33:0;;;;;;;;;;;;;;;;;;;;;;5957:12;;;;5949:20;;-1:-1:-1;;;;;;5949:20:0;;;-1:-1:-1;;;;;5957:12:0;;5949:20;;;;5980:25;;;5819:194::o;5418:223::-;4414:5;;4400:10;-1:-1:-1;;;;;4400:19:0;;;4414:5;;4400:19;4392:28;;;;;;-1:-1:-1;;;;;5502:22:0;;;;5494:31;;;;;;5536:30;5557:8;5536:30;;-1:-1:-1;;;;;5536:30:0;;;;;;;;;;;;;;5600:5;;5577:29;;5590:8;;-1:-1:-1;;;;;5600:5:0;5577:29;;-1:-1:-1;;;;;5577:29:0;;;;;;;;;;;;;;;;;;;;;;5617:5;:16;;-1:-1:-1;;;;;;5617:16:0;-1:-1:-1;;;;;5617:16:0;;;;;;;;;;5418:223::o;4738:96::-;4784:9;;:::i;:::-;4813:13;4806:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4806:20:0;;;;;;;;;;;;;;;;;;;;;;4738:96;:::o;29458:213::-;-1:-1:-1;;;;;29580:16:0;;29519:4;29580:16;;;:9;:16;;;;;:38;;;29558:21;:61;;29519:4;;29580:38;29558:61;;;;;;;;;;;;;;;29536:83;;29637:26;29651:11;29637:13;:26::i;:::-;29630:33;;29458:213;;;;;:::o;21718:603::-;-1:-1:-1;;;;;4501:10:0;4491:21;;;;;:9;:21;;;;;;;;4483:30;;;;;;;;21938:4;:11;21923:4;:11;:26;21915:35;;;;;;21985:5;:12;21969:5;:12;:28;21961:37;;;;;;19329:2;22017:4;:11;:36;;22009:45;;;;;;19329:2;22073:5;:12;:37;;22065:46;;;;;;-1:-1:-1;;;;;22130:16:0;;;;;;:9;:16;;;;;:23;;;22122:32;;;;;;;;22209:24;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22167:16:0;;-1:-1:-1;22167:16:0;;;:9;:16;;;;:39;;22209:24;22167:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;22287:26;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22244:16:0;;-1:-1:-1;22244:16:0;;;:9;:16;;;;:40;;22287:26;22244:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;6929:319::-;4414:5;;4400:10;-1:-1:-1;;;;;4400:19:0;;;4414:5;;4400:19;4392:28;;;;;;-1:-1:-1;;;;;7008:22:0;;;;;;:9;:22;;;;;;;;7007:23;6999:32;;;;;;7073:14;:21;4269:2;7073:38;;7065:47;;;;;;7125:32;7139:11;7152:4;7125:32;;-1:-1:-1;;;;;7125:32:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7168:22:0;;;;;;:9;:22;;;;;:29;;-1:-1:-1;;7168:29:0;7193:4;7168:29;;;;;;7208:14;:32;;:14;;:32;;;:14;:32;;:::i;19097:30::-;;;-1:-1:-1;;;;;19097:30:0;;:::o;9571:65::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;7256:481::-;7411:6;4414:5;;4400:10;-1:-1:-1;;;;;4400:19:0;;;4414:5;;4400:19;4392:28;;;;;;-1:-1:-1;;;;;7335:19:0;;;;;;:9;:19;;;;;;;;7327:28;;;;;;;;-1:-1:-1;;;;;;7366:19:0;;7388:5;7366:19;;;:9;:19;;;;;:27;;-1:-1:-1;;7366:27:0;;;7406:324;7427:14;:21;7423:25;;7406:324;;;7495:8;-1:-1:-1;;;;;7474:29:0;:14;7489:1;7474:17;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7474:17:0;:29;7470:249;;;7544:14;7559:21;;-1:-1:-1;;7559:25:0;;;7544:41;;;;;;;;;;;;;;;;7524:14;:17;;-1:-1:-1;;;;;7544:41:0;;;;7539:1;;7524:17;;;;;;;;;;;;;;;:61;;-1:-1:-1;;;;;;7524:61:0;-1:-1:-1;;;;;7524:61:0;;;;;;;;;;7604:14;:26;;-1:-1:-1;;7604:26:0;;;;;;:::i;:::-;;7649:30;7663:8;7673:5;7649:30;;-1:-1:-1;;;;;7649:30:0;;;;;;;;;;;;;;;;;;;;;;7698:5;;7470:249;7450:3;;7406:324;;24026:2785;-1:-1:-1;;;;;24181:16:0;;24121:4;24181:16;;;:9;:16;;;;;:24;24121:4;;;;;;;;;;;;;;;;24181:24;;;;;24180:25;24176:39;;;24214:1;24207:8;;;;24176:39;-1:-1:-1;;;;;24230:23:0;;;;;;:16;:23;;;;;:47;:52;24226:66;;;24291:1;24284:8;;;;24226:66;-1:-1:-1;;;;;24413:16:0;;;;;;:9;:16;;;;;:38;;;24391:21;:61;;:21;;24413:38;24391:61;;;;;;;;;;;;;;;24369:83;;24488:26;24502:11;24488:13;:26::i;:::-;24569:25;;24465:49;;-1:-1:-1;24551:43:0;;24529:65;;24525:79;;24603:1;24596:8;;;;24525:79;24755:56;24768:5;24775:15;24792:18;24755:12;:56::i;:::-;24720:91;;-1:-1:-1;24720:91:0;-1:-1:-1;24956:1654:0;;;;-1:-1:-1;;;;;;25024:16:0;;;;;;:9;:16;;;;;:28;;;25114:52;25141:11;25034:5;25161:4;25114:26;:52::i;:::-;25101:65;;25196:10;25192:15;;25210:2;25192:20;25181:31;;25234:22;25241:4;25247:8;25234:6;:22::i;:::-;25227:29;;25313;25325:5;25332:4;25338:3;25313:11;:29::i;:::-;-1:-1:-1;;;;;25506:16:0;;;;;;:9;:16;;;;;;;25307:35;;-1:-1:-1;25395:30:0;;;;25307:35;;-1:-1:-1;25486:70:0;;25506:39;;;:16;25486:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25551:3;25486:19;:70::i;:::-;25475:81;;25578:22;25585:4;25591:8;25578:6;:22::i;:::-;-1:-1:-1;;;;;25687:16:0;;;;;;:9;:16;;;;;;;25571:29;;-1:-1:-1;25667:82:0;;25687:45;;;:16;25667:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25734:14;25667:19;:82::i;:::-;25656:93;;25771:22;25778:4;25784:8;25771:6;:22::i;:::-;25764:29;;24956:1654;;;-1:-1:-1;;;;;;25870:16:0;;;;;;:9;:16;;;;;:29;;;;25961:53;;25988:11;;25880:5;;25961:26;:53::i;:::-;25948:66;;26044:10;26040:15;;26058:2;26040:20;26029:31;;26082:22;26089:4;26095:8;26082:6;:22::i;:::-;-1:-1:-1;;;;;26309:16:0;;;;;;:9;:16;;;;;;;-1:-1:-1;;26170:13:0;;26198:30;;;;26170:13;-1:-1:-1;26075:29:0;;-1:-1:-1;26289:71:0;;26309:40;;;:16;26289:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26355:3;26289:19;:71::i;:::-;26278:82;;26382:22;26389:4;26395:8;26382:6;:22::i;:::-;26375:29;;26471:83;26491:9;:16;26501:5;-1:-1:-1;;;;;26491:16:0;-1:-1:-1;;;;;26491:16:0;;;;;;;;;;;;:46;;26471:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26539:14;26471:19;:83::i;:::-;26460:94;;26576:22;26583:4;26589:8;26576:6;:22::i;:::-;26569:29;;24956:1654;26649:27;26670:5;26649:20;:27::i;:::-;26626:19;26630:14;26626:3;:19::i;:::-;:50;26622:64;;26685:1;26678:8;;;;26622:64;26739:30;26763:5;26739:23;:30::i;:::-;26701:34;26722:12;26705:14;:29;26701:3;:34::i;:::-;:68;26697:82;;26778:1;26771:8;;;;26697:82;26799:4;26792:11;;24026:2785;;;;;;;;;;;;;;;:::o;22329:621::-;-1:-1:-1;;;;;4501:10:0;4491:21;;;;;:9;:21;;;;;;;;4483:30;;;;;;;;22555:4;:11;22540:4;:11;:26;22532:35;;;;;;22602:5;:12;22586:5;:12;:28;22578:37;;;;;;19329:2;22634:4;:11;:36;;22626:45;;;;;;19329:2;22690:5;:12;:37;;22682:46;;;;;;-1:-1:-1;;;;;22747:16:0;;;;;;:9;:16;;;;;:23;;;22739:32;;;;;;;;22832:24;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22784:16:0;;-1:-1:-1;22784:16:0;;;:9;:16;;;;:45;;22832:24;22784:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;22916:26;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22867:16:0;;-1:-1:-1;22867:16:0;;;:9;:16;;;;;;;;:46;22916:26;22867:75;;;;;;;;;;;;:::i;9782:412::-;4414:5;;4400:10;-1:-1:-1;;;;;4400:19:0;;;4414:5;;4400:19;4392:28;;;;;;10038:148;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9999:23:0;;-1:-1:-1;9999:23:0;;;:16;:23;;;;10038:148;9999:187;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9782:412:0:o;23594:378::-;23785:15;;23771:10;-1:-1:-1;;;;;23771:29:0;;;23785:15;;23771:29;23763:38;;;;;;23818:20;;23814:69;;;23858:25;23877:5;23858:18;:25::i;:::-;23840:43;;23814:69;23903:61;23916:5;23923:9;23934:15;23951:12;23903;:61::i;:::-;23594:378;;;;:::o;8604:153::-;4414:5;;4400:10;-1:-1:-1;;;;;4400:19:0;;;4414:5;;4400:19;4392:28;;;;;;-1:-1:-1;;;;;8686:15:0;;:23;;;;8702:6;8686:23;;;;;;;;;;;;;;;;;;;;;;;;;;8720:29;8734:6;8742;8720:29;;;;;-1:-1:-1;;;;;8720:29:0;;;;;;;;;;;;;;;;8604:153;;:::o;26864:212::-;26929:4;26950:3;26946:122;;;-1:-1:-1;;;;;;26975:16:0;;;;;;:9;:16;;;;;:28;;;26968:35;;26946:122;-1:-1:-1;;;;;;27039:16:0;;;;;;:9;:16;;;;;:29;;;26946:122;26864:212;;;;:::o;19644:661::-;4414:5;;4400:10;-1:-1:-1;;;;;4400:19:0;;;4414:5;;4400:19;4392:28;;;;;;-1:-1:-1;;;;;19714:16:0;;;;;;:9;:16;;;;;:23;;;19713:24;19705:33;;;;;;-1:-1:-1;;;;;19749:16:0;;;;;;:9;:16;;;;;:30;;-1:-1:-1;;19749:30:0;19775:4;19749:30;;;;;;19790:12;:24;;:12;;:24;;;:12;:24;;:::i;:::-;-1:-1:-1;19790:24:0;;;;;;;;;;;-1:-1:-1;;;;;;19790:24:0;-1:-1:-1;;;;;19790:24:0;;;;;19831:29;;:34;19827:118;;;19882:21;:30;;;;;;;;;:::i;:::-;;19827:118;19998:21;:28;-1:-1:-1;;;;;19957:16:0;;;;;;:9;:16;;;;;-1:-1:-1;;19998:32:0;;;20029:1;19957:38;;;:73;;;;20082:29;;20041:38;;;;:70;;;19186:2;;20157:33;20156:64;20124:29;:96;20233:33;20260:5;20233:26;:33::i;:::-;20279:18;20291:5;20279:11;:18::i;:::-;19644:661;:::o;27084:542::-;-1:-1:-1;;;;;27184:16:0;;27141:4;27184:16;;;:9;:16;;;;;:23;27141:4;;;;;;;;;;27184:23;;27176:32;;;;;;;;-1:-1:-1;;;;;;;27239:16:0;;;;;;:9;:16;;;;;:38;;;;27307;;;;;27463:21;:33;;27239:38;;27307;;27436:74;;27463:21;27239:38;;27463:33;;;;;;;;;;;;;;;27498:5;27505:4;27436:26;:74::i;:::-;-1:-1:-1;;;27431:80:0;27531:75;27558:21;27580:10;27558:33;;;;;;;;;;;;;;;;;;;27593:5;27600;27531:26;:75::i;:::-;-1:-1:-1;;;27526:81:0;27358:260;;;;;;;;27084:542;;;;;;;:::o;10202:278::-;-1:-1:-1;;;;;10301:23:0;10264:4;10301:23;;;:16;:23;;;;;:47;;10367:44;;;;10430:41;;;;;10301:47;;10202:278::o;3994:20::-;;;-1:-1:-1;;;;;3994:20:0;;:::o;30043:215::-;-1:-1:-1;;;30205:45:0;;30043:215;;;;:::o;14726:530::-;-1:-1:-1;;;;;14928:23:0;;14842:18;14928:23;;;:16;:23;;;;;:47;14842:18;;15044:117;14945:5;15114:15;15148:12;15044:27;:117::i;:::-;15174:28;;;;15213:35;;;-1:-1:-1;14726:530:0;-1:-1:-1;;;;14726:530:0:o;30266:393::-;-1:-1:-1;;;;;30397:16:0;;30361:4;30397:16;;;:9;:16;;;;;:38;;;30361:4;30472:137;;;;-1:-1:-1;30507:31:0;:45;;30472:137;;;-1:-1:-1;30594:1:0;:15;;30472:137;30634:4;30639:10;30634:16;;;;;;;;-1:-1:-1;;;30634:16:0;-1:-1:-1;;;30629:22:0;;30622:29;;30266:393;;;;;;;;:::o;30932:293::-;30990:4;;1171:17;31015:16;;;31007:25;;;;;;-1:-1:-1;;31051:25:0;;;31043:34;;;;;;19382:8;31096:25;;;31088:34;;;;;;-1:-1:-1;;31149:9:0;31189:17;;;31177:30;;;;31176:41;;30932:293::o;29781:254::-;29861:4;29878:16;29926;29897:18;29909:5;29897:11;:18::i;:::-;29878:37;;1310:2;29926:31;;29977:50;29988:6;29996:11;30009;30022:4;29977:10;:50::i;:::-;29970:57;29781:254;-1:-1:-1;;;;;;29781:254:0:o;30667:257::-;30741:3;30757:8;30794;30768:1;:3;;;:10;30757:21;;30805:1;30794:12;;30789:98;30814:3;30808;:9;30789:98;;;30850:1;:3;30854;30850:8;;;;;;;;;;;;;;;;30845:13;;30841:34;;30867:1;:3;;;30871;30867:8;;;;;;;;;;;;;;;;30860:15;;;;30841:34;30819:5;;30789:98;;;30906:1;:3;;;30914:1;30910:3;:5;30906:10;;;;;;;;;;;;;;;;30899:17;;30667:257;;;;;;;:::o;15416:138::-;-1:-1:-1;;;;;15505:23:0;15481:4;15505:23;;;:16;:23;;;;;:41;;;;15416:138::o;31233:153::-;31275:4;31300:1;31296;:5;31292:86;;;-1:-1:-1;;;31328:6:0;;31316:19;;31292:86;-1:-1:-1;31376:1:0;31364:14;;15264:144;-1:-1:-1;;;;;15356:23:0;15332:4;15356:23;;;:16;:23;;;;;:44;;;;15264:144::o;10488:2047::-;10656:22;10726:21;10832:17;10866:42;;:::i;:::-;-1:-1:-1;;;;;10770:23:0;;11956:25;10770:23;;;:16;:23;;;;;:47;8964:1;10681:34;;;-1:-1:-1;10754:9:0;:64;;;;;;;-1:-1:-1;;;;;10949:25:0;;10852:1;10949:25;;;:18;:25;;;;;;;;:44;;;;;;;;;10754:64;;;;;-1:-1:-1;10852:1:0;-1:-1:-1;10924:70:0;;:24;:70::i;:::-;10866:128;;11116:12;11086:16;:26;;;:42;11082:1344;;;11195:15;11154:16;:36;;;11149:61;11145:733;;;11322:17;11275:16;11322:17;11275:16;:64;;;;-1:-1:-1;11401:17:0;11358:39;;;11401:17;11358:39;:60;;;;-1:-1:-1;11145:733:0;;;11544:57;11564:5;11571:15;11588:12;11544:19;:57::i;:::-;11662:38;;;11620:39;;;:80;11528:73;-1:-1:-1;11683:17:0;11620:16;11683:17;11620:16;11719:64;;;;-1:-1:-1;11802:36:0;;;:60;;;11145:733;11082:1344;;;12037:65;12065:5;12072:15;12089:12;12037:27;:65::i;:::-;12119:63;;;12197:26;;;:47;;;12259:36;;;:60;;;12376:38;;;12334:39;;;:80;11996:106;;-1:-1:-1;11996:106:0;-1:-1:-1;11082:1344:0;12485:42;12510:16;12485:24;:42::i;:::-;-1:-1:-1;;;;;12438:25:0;;;;;;;:18;:25;;;;;;;;:44;;;;;;;;;;:89;;;;-1:-1:-1;;;;;;;10488:2047:0:o;12543:184::-;12617:6;12612:108;8964:1;12629;:23;12612:108;;;-1:-1:-1;;;;;12674:25:0;;;;;;:18;:25;;;;;;;;:28;;;;;;;;12705:3;12674:34;;;;12654:3;12612:108;;1368:174;-1:-1:-1;;;;;1426:26:0;;966:44;1426:26;1422:112;;;-1:-1:-1;;;;;1454:15:0;;;;;;:8;:15;;;;;1310:2;1454:30;;1422:112;;;1518:5;-1:-1:-1;;;;;1518:14:0;;:16;;;;;;;;;;;-1:-1:-1;;;1518:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1500:15:0;;;;;;:8;:15;;;;;:34;-1:-1:-1;1368:174:0;:::o;13394:1324::-;13525:16;13543:25;13649:16;13680:20;13715:15;13759:13;13805:14;13886:38;;:::i;:::-;13601:1;13586:16;;13637:1;13613:25;;13668:1;13649:20;;13703:1;13680:24;;13733:15;13715:33;;13775:12;13759:28;;13822:1;13805:18;;13800:818;8964:1;13825:9;:31;13800:818;;;-1:-1:-1;;;;;13952:25:0;;;;;;:18;:25;;;;;;;;:36;;;;;;;;;13927:62;;:24;:62::i;:::-;13886:103;;14036:8;14010:12;:22;;;:34;;:74;;;;;14074:10;14048:12;:22;;;:36;;14010:74;14006:174;;;14125:12;:39;14105:59;;;;14006:174;14236:15;14200:12;:32;;;:51;14196:65;;14253:8;;14196:65;14305:11;14280:12;:22;;;:36;14276:50;;;14318:8;;14276:50;14357:12;:22;;;14343:36;;14409:12;:35;;;14394:50;;14495:12;14468;:22;;;14463:44;14459:148;;;14552:12;:39;14528:63;;14459:148;13858:11;;;;;13800:818;;;14634:17;;14630:81;;;14683:16;14668:31;;14630:81;13394:1324;;;;;;;;;;;;:::o;1550:479::-;1606:4;;-1:-1:-1;;;;;1627:26:0;;966:44;1627:26;1623:51;;;1310:2;1655:19;;;;1623:51;-1:-1:-1;;;;;;1729:15:0;;;;;;:8;:15;;;;;;1945:18;;1942:46;;;1972:5;-1:-1:-1;;;;;1972:14:0;;:16;;;;;;;;;;;-1:-1:-1;;;1972:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1965:23;;;;2037:569;2139:4;1106:6;2164:17;;;2156:26;;;;;;1171:17;2201:16;;;2193:25;;;;;;2235:26;;;2231:368;;1262:2;2287:25;;;2286:43;;2278:52;;;;;;1055:6;2353:13;;;2375:25;;;2370:2;:31;2353:49;2352:63;;2345:70;;;;2231:368;1262:2;2457:25;;;2456:43;;2448:52;;;;;;2573:11;2559;:25;2554:2;:31;1055:6;2541:45;2532:4;2523:6;:13;2522:65;;;;;;2231:368;2037:569;;;;;;:::o;16443:514::-;16511:18;;:::i;:::-;16542:30;;:::i;:::-;16638:12;16629:22;;;16619:34;;16585:68;;9006:7;16629:5;16694:16;16693:35;16681:49;;;;16664:14;;;:66;16791:19;16782:5;:29;16781:48;16771:60;;16741:27;;;:90;16891:30;16882:5;:40;16869:56;;16842:24;;;:83;:24;16443:514;-1:-1:-1;;16443:514:0:o;12735:651::-;12831:16;12992:14;13073:38;;:::i;:::-;12922:22;;;;12914:31;;;;;;12973:1;12958:16;;13009:1;12992:18;;12987:392;8964:1;13012:9;:31;12987:392;;;-1:-1:-1;;;;;13139:25:0;;;;;;:18;:25;;;;;;;;:36;;;;;;;;;13114:62;;:24;:62::i;:::-;13073:103;;13223:8;13197:12;:22;;;:34;;:74;;;;;13261:10;13235:12;:22;;;:36;;13197:74;13193:175;;;13312:12;:39;13292:60;;;;13193:175;13045:11;;;;;12987:392;;15562:873;15643:4;;15738:12;15700:4;:31;:51;15692:60;;;;;;-1:-1:-1;;15771:4:0;:31;:61;15763:70;;;;;;9006:7;15852:4;:14;;;:25;15844:34;;;;;;15931:12;15897:27;;;;:47;15889:56;;;;;;-1:-1:-1;;15964:27:0;;;;:57;15956:66;;;;;;9006:7;16041:4;:24;;;:35;16033:44;;;;;;16169:12;16133:4;:31;16128:54;16114:68;;9006:7;16203:4;:14;;;:25;16193:35;9006:7;;16287:12;16255:27;;;;16250:50;16249:63;:74;16239:84;9006:7;;;16344:24;;;;:35;:46;:57;16334:67;;15562:873;-1:-1:-1;;15562:873:0:o;17075:14314::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17075:14314:0;;;-1:-1:-1;17075:14314:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://13c0624ab26376d55c5b465df25d0ba2f79c07a504aab6f0bfe2f580620c032f
Loading...
Loading
Loading...
Loading

Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.