More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 58 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Token | 10200391 | 1562 days ago | IN | 0 ETH | 0.00090321 | ||||
Withdraw Knc Fee | 10200386 | 1562 days ago | IN | 0 ETH | 0.00089822 | ||||
Cancel Token To ... | 10200376 | 1562 days ago | IN | 0 ETH | 0.00134641 | ||||
Cancel Token To ... | 10200372 | 1562 days ago | IN | 0 ETH | 0.00212641 | ||||
Cancel Token To ... | 10200363 | 1562 days ago | IN | 0 ETH | 0.00251511 | ||||
Update Token To ... | 10125553 | 1574 days ago | IN | 0 ETH | 0.00153712 | ||||
Withdraw Knc Fee | 10097952 | 1578 days ago | IN | 0 ETH | 0.00094345 | ||||
Submit Token To ... | 10037780 | 1588 days ago | IN | 0 ETH | 0.00088611 | ||||
Submit Token To ... | 10037772 | 1588 days ago | IN | 0 ETH | 0.00103059 | ||||
Cancel Token To ... | 10036406 | 1588 days ago | IN | 0 ETH | 0.00116142 | ||||
Submit Token To ... | 9998922 | 1594 days ago | IN | 0 ETH | 0.00069488 | ||||
Submit Token To ... | 9998918 | 1594 days ago | IN | 0 ETH | 0.0009728 | ||||
Deposit Knc For ... | 9998909 | 1594 days ago | IN | 0 ETH | 0.00072376 | ||||
Deposit Token | 9998888 | 1594 days ago | IN | 0 ETH | 0.00086282 | ||||
Withdraw Token | 9947952 | 1601 days ago | IN | 0 ETH | 0.00041658 | ||||
Withdraw Knc Fee | 9947951 | 1601 days ago | IN | 0 ETH | 0.00029613 | ||||
Cancel Token To ... | 9947947 | 1601 days ago | IN | 0 ETH | 0.00053714 | ||||
Cancel Token To ... | 9947945 | 1601 days ago | IN | 0 ETH | 0.00109367 | ||||
Submit Token To ... | 9902841 | 1608 days ago | IN | 0 ETH | 0.00038859 | ||||
Update Token To ... | 9902829 | 1608 days ago | IN | 0 ETH | 0.00049686 | ||||
Submit Token To ... | 9902815 | 1608 days ago | IN | 0 ETH | 0.00052556 | ||||
Deposit Token | 9902805 | 1608 days ago | IN | 0 ETH | 0.00057175 | ||||
Deposit Knc For ... | 9902703 | 1608 days ago | IN | 0 ETH | 0.00045338 | ||||
Withdraw Token | 9650664 | 1647 days ago | IN | 0 ETH | 0.00018801 | ||||
Withdraw Knc Fee | 9650659 | 1647 days ago | IN | 0 ETH | 0.00019081 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
9041517 | 1747 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
OrderbookReserve
Compiler Version
v0.4.18+commit.9cf6e910
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-12-04 */ // File: contracts/reserves/orderBookReserve/permissionless/OrderListInterface.sol pragma solidity 0.4.18; interface OrderListInterface { function getOrderDetails(uint32 orderId) public view returns (address, uint128, uint128, uint32, uint32); function add(address maker, uint32 orderId, uint128 srcAmount, uint128 dstAmount) public returns (bool); function remove(uint32 orderId) public returns (bool); function update(uint32 orderId, uint128 srcAmount, uint128 dstAmount) public returns (bool); function getFirstOrder() public view returns(uint32 orderId, bool isEmpty); function allocateIds(uint32 howMany) public returns(uint32); function findPrevOrderId(uint128 srcAmount, uint128 dstAmount) public view returns(uint32); function addAfterId(address maker, uint32 orderId, uint128 srcAmount, uint128 dstAmount, uint32 prevId) public returns (bool); function updateWithPositionHint(uint32 orderId, uint128 srcAmount, uint128 dstAmount, uint32 prevId) public returns(bool, uint); } // File: contracts/reserves/orderBookReserve/permissionless/OrderIdManager.sol pragma solidity 0.4.18; contract OrderIdManager { struct OrderIdData { uint32 firstOrderId; uint takenBitmap; } uint constant public NUM_ORDERS = 32; function fetchNewOrderId(OrderIdData storage freeOrders) internal returns(uint32) { uint orderBitmap = freeOrders.takenBitmap; uint bitPointer = 1; for (uint i = 0; i < NUM_ORDERS; ++i) { if ((orderBitmap & bitPointer) == 0) { freeOrders.takenBitmap = orderBitmap | bitPointer; return(uint32(uint(freeOrders.firstOrderId) + i)); } bitPointer *= 2; } revert(); } /// @dev mark order as free to use. function releaseOrderId(OrderIdData storage freeOrders, uint32 orderId) internal returns(bool) { require(orderId >= freeOrders.firstOrderId); require(orderId < (freeOrders.firstOrderId + NUM_ORDERS)); uint orderBitNum = uint(orderId) - uint(freeOrders.firstOrderId); uint bitPointer = uint(1) << orderBitNum; require(bitPointer & freeOrders.takenBitmap > 0); freeOrders.takenBitmap &= ~bitPointer; return true; } function allocateOrderIds( OrderIdData storage makerOrders, uint32 firstAllocatedId ) internal returns(bool) { if (makerOrders.firstOrderId > 0) { return false; } makerOrders.firstOrderId = firstAllocatedId; makerOrders.takenBitmap = 0; return true; } function orderAllocationRequired(OrderIdData storage freeOrders) internal view returns (bool) { if (freeOrders.firstOrderId == 0) return true; return false; } function getNumActiveOrderIds(OrderIdData storage makerOrders) internal view returns (uint numActiveOrders) { for (uint i = 0; i < NUM_ORDERS; ++i) { if ((makerOrders.takenBitmap & (uint(1) << i)) > 0) numActiveOrders++; } } } // File: contracts/reserves/orderBookReserve/permissionless/OrderListFactoryInterface.sol pragma solidity 0.4.18; interface OrderListFactoryInterface { function newOrdersContract(address admin) public returns(OrderListInterface); } // File: contracts/reserves/orderBookReserve/permissionless/OrderbookReserveInterface.sol pragma solidity 0.4.18; interface OrderbookReserveInterface { function init() public returns(bool); function kncRateBlocksTrade() public view returns(bool); } // File: contracts/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/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/Utils2.sol pragma solidity 0.4.18; contract Utils2 is Utils { /// @dev get the balance of a user. /// @param token The token type /// @return The balance function getBalance(ERC20 token, address user) public view returns(uint) { if (token == ETH_TOKEN_ADDRESS) return user.balance; else return token.balanceOf(user); } function getDecimalsSafe(ERC20 token) internal returns(uint) { if (decimals[token] == 0) { setDecimals(token); } return decimals[token]; } function calcDestAmount(ERC20 src, ERC20 dest, uint srcAmount, uint rate) internal view returns(uint) { return calcDstQty(srcAmount, getDecimals(src), getDecimals(dest), rate); } function calcSrcAmount(ERC20 src, ERC20 dest, uint destAmount, uint rate) internal view returns(uint) { return calcSrcQty(destAmount, getDecimals(src), getDecimals(dest), rate); } function calcRateFromQty(uint srcAmount, uint destAmount, uint srcDecimals, uint dstDecimals) internal pure returns(uint) { require(srcAmount <= MAX_QTY); require(destAmount <= MAX_QTY); if (dstDecimals >= srcDecimals) { require((dstDecimals - srcDecimals) <= MAX_DECIMALS); return (destAmount * PRECISION / ((10 ** (dstDecimals - srcDecimals)) * srcAmount)); } else { require((srcDecimals - dstDecimals) <= MAX_DECIMALS); return (destAmount * PRECISION * (10 ** (srcDecimals - dstDecimals)) / srcAmount); } } } // File: contracts/KyberReserveInterface.sol pragma solidity 0.4.18; /// @title Kyber Reserve contract interface KyberReserveInterface { function trade( ERC20 srcToken, uint srcAmount, ERC20 destToken, address destAddress, uint conversionRate, bool validate ) public payable returns(bool); function getConversionRate(ERC20 src, ERC20 dest, uint srcQty, uint blockNumber) public view returns(uint); } // File: contracts/reserves/orderBookReserve/permissionless/OrderbookReserve.sol pragma solidity 0.4.18; contract FeeBurnerRateInterface { uint public kncPerEthRatePrecision; } interface MedianizerInterface { function peek() public view returns (bytes32, bool); } contract OrderbookReserve is OrderIdManager, Utils2, KyberReserveInterface, OrderbookReserveInterface { uint public constant BURN_TO_STAKE_FACTOR = 5; // stake per order must be xfactor expected burn amount. uint public constant MAX_BURN_FEE_BPS = 100; // 1% uint public constant MIN_REMAINING_ORDER_RATIO = 2; // Ratio between min new order value and min order value. uint public constant MAX_USD_PER_ETH = 100000; // Above this value price is surely compromised. uint32 constant public TAIL_ID = 1; // tail Id in order list contract uint32 constant public HEAD_ID = 2; // head Id in order list contract struct OrderLimits { uint minNewOrderSizeUsd; // Basis for setting min new order size Eth uint maxOrdersPerTrade; // Limit number of iterated orders per trade / getRate loops. uint minNewOrderSizeWei; // Below this value can't create new order. uint minOrderSizeWei; // below this value order will be removed. } uint public kncPerEthBaseRatePrecision; // according to base rate all stakes are calculated. struct ExternalContracts { ERC20 kncToken; // not constant. to enable testing while not on main net ERC20 token; // only supported token. FeeBurnerRateInterface feeBurner; address kyberNetwork; MedianizerInterface medianizer; // price feed Eth - USD from maker DAO. OrderListFactoryInterface orderListFactory; } //struct for getOrderData() return value. used only in memory. struct OrderData { address maker; uint32 nextId; bool isLastOrder; uint128 srcAmount; uint128 dstAmount; } OrderLimits public limits; ExternalContracts public contracts; // sorted lists of orders. one list for token to Eth, other for Eth to token. // Each order is added in the correct position in the list to keep it sorted. OrderListInterface public tokenToEthList; OrderListInterface public ethToTokenList; //funds data mapping(address => mapping(address => uint)) public makerFunds; // deposited maker funds. mapping(address => uint) public makerKnc; // for knc staking. mapping(address => uint) public makerTotalOrdersWei; // per maker how many Wei in orders, for stake calculation. uint public makerBurnFeeBps; // knc burn fee per order that is taken. //each maker will have orders that will be reused. mapping(address => OrderIdData) public makerOrdersTokenToEth; mapping(address => OrderIdData) public makerOrdersEthToToken; function OrderbookReserve( ERC20 knc, ERC20 reserveToken, address burner, address network, MedianizerInterface medianizer, OrderListFactoryInterface factory, uint minNewOrderUsd, uint maxOrdersPerTrade, uint burnFeeBps ) public { require(knc != address(0)); require(reserveToken != address(0)); require(burner != address(0)); require(network != address(0)); require(medianizer != address(0)); require(factory != address(0)); require(burnFeeBps != 0); require(burnFeeBps <= MAX_BURN_FEE_BPS); require(maxOrdersPerTrade != 0); require(minNewOrderUsd > 0); contracts.kyberNetwork = network; contracts.feeBurner = FeeBurnerRateInterface(burner); contracts.medianizer = medianizer; contracts.orderListFactory = factory; contracts.kncToken = knc; contracts.token = reserveToken; makerBurnFeeBps = burnFeeBps; limits.minNewOrderSizeUsd = minNewOrderUsd; limits.maxOrdersPerTrade = maxOrdersPerTrade; require(setMinOrderSizeEth()); require(contracts.kncToken.approve(contracts.feeBurner, (2**255))); //can only support tokens with decimals() API setDecimals(contracts.token); kncPerEthBaseRatePrecision = contracts.feeBurner.kncPerEthRatePrecision(); } ///@dev separate init function for this contract, if this init is in the C'tor. gas consumption too high. function init() public returns(bool) { if ((tokenToEthList != address(0)) && (ethToTokenList != address(0))) return true; if ((tokenToEthList != address(0)) || (ethToTokenList != address(0))) revert(); tokenToEthList = contracts.orderListFactory.newOrdersContract(this); ethToTokenList = contracts.orderListFactory.newOrdersContract(this); return true; } function setKncPerEthBaseRate() public { uint kncPerEthRatePrecision = contracts.feeBurner.kncPerEthRatePrecision(); if (kncPerEthRatePrecision < kncPerEthBaseRatePrecision) { kncPerEthBaseRatePrecision = kncPerEthRatePrecision; } } function getConversionRate(ERC20 src, ERC20 dst, uint srcQty, uint blockNumber) public view returns(uint) { require((src == ETH_TOKEN_ADDRESS) || (dst == ETH_TOKEN_ADDRESS)); require((src == contracts.token) || (dst == contracts.token)); require(srcQty <= MAX_QTY); if (kncRateBlocksTrade() || (srcQty == 0)) return 0; blockNumber; // in this reserve no order expiry == no use for blockNumber. here to avoid compiler warning. //user order ETH -> token is matched with maker order token -> ETH OrderListInterface list = (src == ETH_TOKEN_ADDRESS) ? tokenToEthList : ethToTokenList; uint32 orderId; OrderData memory orderData; uint128 userRemainingSrcQty = uint128(srcQty); uint128 totalUserDstAmount = 0; uint maxOrders = limits.maxOrdersPerTrade; for ( (orderId, orderData.isLastOrder) = list.getFirstOrder(); ((userRemainingSrcQty > 0) && (!orderData.isLastOrder) && (maxOrders-- > 0)); orderId = orderData.nextId ) { orderData = getOrderData(list, orderId); // maker dst quantity is the requested quantity he wants to receive. user src quantity is what user gives. // so user src quantity is matched with maker dst quantity if (orderData.dstAmount <= userRemainingSrcQty) { totalUserDstAmount += orderData.srcAmount; userRemainingSrcQty -= orderData.dstAmount; } else { totalUserDstAmount += uint128(uint(orderData.srcAmount) * uint(userRemainingSrcQty) / uint(orderData.dstAmount)); userRemainingSrcQty = 0; } } if (userRemainingSrcQty != 0) return 0; //not enough tokens to exchange. return calcRateFromQty(srcQty, totalUserDstAmount, getDecimals(src), getDecimals(dst)); } event OrderbookReserveTrade(ERC20 srcToken, ERC20 dstToken, uint srcAmount, uint dstAmount); function trade( ERC20 srcToken, uint srcAmount, ERC20 dstToken, address dstAddress, uint conversionRate, bool validate ) public payable returns(bool) { require(msg.sender == contracts.kyberNetwork); require((srcToken == ETH_TOKEN_ADDRESS) || (dstToken == ETH_TOKEN_ADDRESS)); require((srcToken == contracts.token) || (dstToken == contracts.token)); require(srcAmount <= MAX_QTY); conversionRate; validate; if (srcToken == ETH_TOKEN_ADDRESS) { require(msg.value == srcAmount); } else { require(msg.value == 0); require(srcToken.transferFrom(msg.sender, this, srcAmount)); } uint totalDstAmount = doTrade( srcToken, srcAmount, dstToken ); require(conversionRate <= calcRateFromQty(srcAmount, totalDstAmount, getDecimals(srcToken), getDecimals(dstToken))); //all orders were successfully taken. send to dstAddress if (dstToken == ETH_TOKEN_ADDRESS) { dstAddress.transfer(totalDstAmount); } else { require(dstToken.transfer(dstAddress, totalDstAmount)); } OrderbookReserveTrade(srcToken, dstToken, srcAmount, totalDstAmount); return true; } function doTrade( ERC20 srcToken, uint srcAmount, ERC20 dstToken ) internal returns(uint) { OrderListInterface list = (srcToken == ETH_TOKEN_ADDRESS) ? tokenToEthList : ethToTokenList; uint32 orderId; OrderData memory orderData; uint128 userRemainingSrcQty = uint128(srcAmount); uint128 totalUserDstAmount = 0; for ( (orderId, orderData.isLastOrder) = list.getFirstOrder(); ((userRemainingSrcQty > 0) && (!orderData.isLastOrder)); orderId = orderData.nextId ) { // maker dst quantity is the requested quantity he wants to receive. user src quantity is what user gives. // so user src quantity is matched with maker dst quantity orderData = getOrderData(list, orderId); if (orderData.dstAmount <= userRemainingSrcQty) { totalUserDstAmount += orderData.srcAmount; userRemainingSrcQty -= orderData.dstAmount; require(takeFullOrder({ maker: orderData.maker, orderId: orderId, userSrc: srcToken, userDst: dstToken, userSrcAmount: orderData.dstAmount, userDstAmount: orderData.srcAmount })); } else { uint128 partialDstQty = uint128(uint(orderData.srcAmount) * uint(userRemainingSrcQty) / uint(orderData.dstAmount)); totalUserDstAmount += partialDstQty; require(takePartialOrder({ maker: orderData.maker, orderId: orderId, userSrc: srcToken, userDst: dstToken, userPartialSrcAmount: userRemainingSrcQty, userTakeDstAmount: partialDstQty, orderSrcAmount: orderData.srcAmount, orderDstAmount: orderData.dstAmount })); userRemainingSrcQty = 0; } } require(userRemainingSrcQty == 0 && totalUserDstAmount > 0); return totalUserDstAmount; } ///@param srcAmount is the token amount that will be payed. must be deposited before hand in the makers account. ///@param dstAmount is the eth amount the maker expects to get for his tokens. function submitTokenToEthOrder(uint128 srcAmount, uint128 dstAmount) public returns(bool) { return submitTokenToEthOrderWHint(srcAmount, dstAmount, 0); } function submitTokenToEthOrderWHint(uint128 srcAmount, uint128 dstAmount, uint32 hintPrevOrder) public returns(bool) { uint32 newId = fetchNewOrderId(makerOrdersTokenToEth[msg.sender]); return addOrder(false, newId, srcAmount, dstAmount, hintPrevOrder); } ///@param srcAmount is the Ether amount that will be payed, must be deposited before hand. ///@param dstAmount is the token amount the maker expects to get for his Ether. function submitEthToTokenOrder(uint128 srcAmount, uint128 dstAmount) public returns(bool) { return submitEthToTokenOrderWHint(srcAmount, dstAmount, 0); } function submitEthToTokenOrderWHint(uint128 srcAmount, uint128 dstAmount, uint32 hintPrevOrder) public returns(bool) { uint32 newId = fetchNewOrderId(makerOrdersEthToToken[msg.sender]); return addOrder(true, newId, srcAmount, dstAmount, hintPrevOrder); } ///@dev notice here a batch of orders represented in arrays. order x is represented by x cells of all arrays. ///@dev all arrays expected to the same length. ///@param isEthToToken per each order. is order x eth to token (= src is Eth) or vice versa. ///@param srcAmount per each order. source amount for order x. ///@param dstAmount per each order. destination amount for order x. ///@param hintPrevOrder per each order what is the order it should be added after in ordered list. 0 for no hint. ///@param isAfterPrevOrder per each order, set true if should be added in list right after previous added order. function addOrderBatch(bool[] isEthToToken, uint128[] srcAmount, uint128[] dstAmount, uint32[] hintPrevOrder, bool[] isAfterPrevOrder) public returns(bool) { require(isEthToToken.length == hintPrevOrder.length); require(isEthToToken.length == dstAmount.length); require(isEthToToken.length == srcAmount.length); require(isEthToToken.length == isAfterPrevOrder.length); address maker = msg.sender; uint32 prevId; uint32 newId = 0; for (uint i = 0; i < isEthToToken.length; ++i) { prevId = isAfterPrevOrder[i] ? newId : hintPrevOrder[i]; newId = fetchNewOrderId(isEthToToken[i] ? makerOrdersEthToToken[maker] : makerOrdersTokenToEth[maker]); require(addOrder(isEthToToken[i], newId, srcAmount[i], dstAmount[i], prevId)); } return true; } function updateTokenToEthOrder(uint32 orderId, uint128 newSrcAmount, uint128 newDstAmount) public returns(bool) { require(updateTokenToEthOrderWHint(orderId, newSrcAmount, newDstAmount, 0)); return true; } function updateTokenToEthOrderWHint( uint32 orderId, uint128 newSrcAmount, uint128 newDstAmount, uint32 hintPrevOrder ) public returns(bool) { require(updateOrder(false, orderId, newSrcAmount, newDstAmount, hintPrevOrder)); return true; } function updateEthToTokenOrder(uint32 orderId, uint128 newSrcAmount, uint128 newDstAmount) public returns(bool) { return updateEthToTokenOrderWHint(orderId, newSrcAmount, newDstAmount, 0); } function updateEthToTokenOrderWHint( uint32 orderId, uint128 newSrcAmount, uint128 newDstAmount, uint32 hintPrevOrder ) public returns(bool) { require(updateOrder(true, orderId, newSrcAmount, newDstAmount, hintPrevOrder)); return true; } function updateOrderBatch(bool[] isEthToToken, uint32[] orderId, uint128[] newSrcAmount, uint128[] newDstAmount, uint32[] hintPrevOrder) public returns(bool) { require(isEthToToken.length == orderId.length); require(isEthToToken.length == newSrcAmount.length); require(isEthToToken.length == newDstAmount.length); require(isEthToToken.length == hintPrevOrder.length); for (uint i = 0; i < isEthToToken.length; ++i) { require(updateOrder(isEthToToken[i], orderId[i], newSrcAmount[i], newDstAmount[i], hintPrevOrder[i])); } return true; } event TokenDeposited(address indexed maker, uint amount); function depositToken(address maker, uint amount) public { require(maker != address(0)); require(amount < MAX_QTY); require(contracts.token.transferFrom(msg.sender, this, amount)); makerFunds[maker][contracts.token] += amount; TokenDeposited(maker, amount); } event EtherDeposited(address indexed maker, uint amount); function depositEther(address maker) public payable { require(maker != address(0)); makerFunds[maker][ETH_TOKEN_ADDRESS] += msg.value; EtherDeposited(maker, msg.value); } event KncFeeDeposited(address indexed maker, uint amount); // knc will be staked per order. part of the amount will be used as fee. function depositKncForFee(address maker, uint amount) public { require(maker != address(0)); require(amount < MAX_QTY); require(contracts.kncToken.transferFrom(msg.sender, this, amount)); makerKnc[maker] += amount; KncFeeDeposited(maker, amount); if (orderAllocationRequired(makerOrdersTokenToEth[maker])) { require(allocateOrderIds( makerOrdersTokenToEth[maker], /* makerOrders */ tokenToEthList.allocateIds(uint32(NUM_ORDERS)) /* firstAllocatedId */ )); } if (orderAllocationRequired(makerOrdersEthToToken[maker])) { require(allocateOrderIds( makerOrdersEthToToken[maker], /* makerOrders */ ethToTokenList.allocateIds(uint32(NUM_ORDERS)) /* firstAllocatedId */ )); } } function withdrawToken(uint amount) public { address maker = msg.sender; uint makerFreeAmount = makerFunds[maker][contracts.token]; require(makerFreeAmount >= amount); makerFunds[maker][contracts.token] -= amount; require(contracts.token.transfer(maker, amount)); } function withdrawEther(uint amount) public { address maker = msg.sender; uint makerFreeAmount = makerFunds[maker][ETH_TOKEN_ADDRESS]; require(makerFreeAmount >= amount); makerFunds[maker][ETH_TOKEN_ADDRESS] -= amount; maker.transfer(amount); } function withdrawKncFee(uint amount) public { address maker = msg.sender; require(makerKnc[maker] >= amount); require(makerUnlockedKnc(maker) >= amount); makerKnc[maker] -= amount; require(contracts.kncToken.transfer(maker, amount)); } function cancelTokenToEthOrder(uint32 orderId) public returns(bool) { require(cancelOrder(false, orderId)); return true; } function cancelEthToTokenOrder(uint32 orderId) public returns(bool) { require(cancelOrder(true, orderId)); return true; } function setMinOrderSizeEth() public returns(bool) { //get eth to $ from maker dao; bytes32 usdPerEthInWei; bool valid; (usdPerEthInWei, valid) = contracts.medianizer.peek(); require(valid); // ensuring that there is no underflow or overflow possible, // even if the price is compromised uint usdPerEth = uint(usdPerEthInWei) / (1 ether); require(usdPerEth != 0); require(usdPerEth < MAX_USD_PER_ETH); // set Eth order limits according to price uint minNewOrderSizeWei = limits.minNewOrderSizeUsd * PRECISION * (1 ether) / uint(usdPerEthInWei); limits.minNewOrderSizeWei = minNewOrderSizeWei; limits.minOrderSizeWei = limits.minNewOrderSizeWei / MIN_REMAINING_ORDER_RATIO; return true; } ///@dev Each maker stakes per order KNC that is factor of the required burn amount. ///@dev If Knc per Eth rate becomes lower by more then factor, stake will not be enough and trade will be blocked. function kncRateBlocksTrade() public view returns (bool) { return (contracts.feeBurner.kncPerEthRatePrecision() > kncPerEthBaseRatePrecision * BURN_TO_STAKE_FACTOR); } function getTokenToEthAddOrderHint(uint128 srcAmount, uint128 dstAmount) public view returns (uint32) { require(dstAmount >= limits.minNewOrderSizeWei); return tokenToEthList.findPrevOrderId(srcAmount, dstAmount); } function getEthToTokenAddOrderHint(uint128 srcAmount, uint128 dstAmount) public view returns (uint32) { require(srcAmount >= limits.minNewOrderSizeWei); return ethToTokenList.findPrevOrderId(srcAmount, dstAmount); } function getTokenToEthUpdateOrderHint(uint32 orderId, uint128 srcAmount, uint128 dstAmount) public view returns (uint32) { require(dstAmount >= limits.minNewOrderSizeWei); uint32 prevId = tokenToEthList.findPrevOrderId(srcAmount, dstAmount); address add; uint128 noUse; uint32 next; if (prevId == orderId) { (add, noUse, noUse, prevId, next) = tokenToEthList.getOrderDetails(orderId); } return prevId; } function getEthToTokenUpdateOrderHint(uint32 orderId, uint128 srcAmount, uint128 dstAmount) public view returns (uint32) { require(srcAmount >= limits.minNewOrderSizeWei); uint32 prevId = ethToTokenList.findPrevOrderId(srcAmount, dstAmount); address add; uint128 noUse; uint32 next; if (prevId == orderId) { (add, noUse, noUse, prevId, next) = ethToTokenList.getOrderDetails(orderId); } return prevId; } function getTokenToEthOrder(uint32 orderId) public view returns ( address _maker, uint128 _srcAmount, uint128 _dstAmount, uint32 _prevId, uint32 _nextId ) { return tokenToEthList.getOrderDetails(orderId); } function getEthToTokenOrder(uint32 orderId) public view returns ( address _maker, uint128 _srcAmount, uint128 _dstAmount, uint32 _prevId, uint32 _nextId ) { return ethToTokenList.getOrderDetails(orderId); } function makerRequiredKncStake(address maker) public view returns (uint) { return(calcKncStake(makerTotalOrdersWei[maker])); } function makerUnlockedKnc(address maker) public view returns (uint) { uint requiredKncStake = makerRequiredKncStake(maker); if (requiredKncStake > makerKnc[maker]) return 0; return (makerKnc[maker] - requiredKncStake); } function calcKncStake(uint weiAmount) public view returns(uint) { return(calcBurnAmount(weiAmount) * BURN_TO_STAKE_FACTOR); } function calcBurnAmount(uint weiAmount) public view returns(uint) { return(weiAmount * makerBurnFeeBps * kncPerEthBaseRatePrecision / (10000 * PRECISION)); } function calcBurnAmountFromFeeBurner(uint weiAmount) public view returns(uint) { return(weiAmount * makerBurnFeeBps * contracts.feeBurner.kncPerEthRatePrecision() / (10000 * PRECISION)); } ///@dev This function is not fully optimized gas wise. Consider before calling on chain. function getEthToTokenMakerOrderIds(address maker) public view returns(uint32[] orderList) { OrderIdData storage makerOrders = makerOrdersEthToToken[maker]; orderList = new uint32[](getNumActiveOrderIds(makerOrders)); uint activeOrder = 0; for (uint32 i = 0; i < NUM_ORDERS; ++i) { if ((makerOrders.takenBitmap & (uint(1) << i) > 0)) orderList[activeOrder++] = makerOrders.firstOrderId + i; } } ///@dev This function is not fully optimized gas wise. Consider before calling on chain. function getTokenToEthMakerOrderIds(address maker) public view returns(uint32[] orderList) { OrderIdData storage makerOrders = makerOrdersTokenToEth[maker]; orderList = new uint32[](getNumActiveOrderIds(makerOrders)); uint activeOrder = 0; for (uint32 i = 0; i < NUM_ORDERS; ++i) { if ((makerOrders.takenBitmap & (uint(1) << i) > 0)) orderList[activeOrder++] = makerOrders.firstOrderId + i; } } ///@dev This function is not fully optimized gas wise. Consider before calling on chain. function getEthToTokenOrderList() public view returns(uint32[] orderList) { OrderListInterface list = ethToTokenList; return getList(list); } ///@dev This function is not fully optimized gas wise. Consider before calling on chain. function getTokenToEthOrderList() public view returns(uint32[] orderList) { OrderListInterface list = tokenToEthList; return getList(list); } event NewLimitOrder( address indexed maker, uint32 orderId, bool isEthToToken, uint128 srcAmount, uint128 dstAmount, bool addedWithHint ); function addOrder(bool isEthToToken, uint32 newId, uint128 srcAmount, uint128 dstAmount, uint32 hintPrevOrder) internal returns(bool) { require(srcAmount < MAX_QTY); require(dstAmount < MAX_QTY); address maker = msg.sender; require(secureAddOrderFunds(maker, isEthToToken, srcAmount, dstAmount)); require(validateLegalRate(srcAmount, dstAmount, isEthToToken)); bool addedWithHint = false; OrderListInterface list = isEthToToken ? ethToTokenList : tokenToEthList; if (hintPrevOrder != 0) { addedWithHint = list.addAfterId(maker, newId, srcAmount, dstAmount, hintPrevOrder); } if (!addedWithHint) { require(list.add(maker, newId, srcAmount, dstAmount)); } NewLimitOrder(maker, newId, isEthToToken, srcAmount, dstAmount, addedWithHint); return true; } event OrderUpdated( address indexed maker, bool isEthToToken, uint orderId, uint128 srcAmount, uint128 dstAmount, bool updatedWithHint ); function updateOrder(bool isEthToToken, uint32 orderId, uint128 newSrcAmount, uint128 newDstAmount, uint32 hintPrevOrder) internal returns(bool) { require(newSrcAmount < MAX_QTY); require(newDstAmount < MAX_QTY); address maker; uint128 currDstAmount; uint128 currSrcAmount; uint32 noUse; uint noUse2; require(validateLegalRate(newSrcAmount, newDstAmount, isEthToToken)); OrderListInterface list = isEthToToken ? ethToTokenList : tokenToEthList; (maker, currSrcAmount, currDstAmount, noUse, noUse) = list.getOrderDetails(orderId); require(maker == msg.sender); if (!secureUpdateOrderFunds(maker, isEthToToken, currSrcAmount, currDstAmount, newSrcAmount, newDstAmount)) { return false; } bool updatedWithHint = false; if (hintPrevOrder != 0) { (updatedWithHint, noUse2) = list.updateWithPositionHint(orderId, newSrcAmount, newDstAmount, hintPrevOrder); } if (!updatedWithHint) { require(list.update(orderId, newSrcAmount, newDstAmount)); } OrderUpdated(maker, isEthToToken, orderId, newSrcAmount, newDstAmount, updatedWithHint); return true; } event OrderCanceled(address indexed maker, bool isEthToToken, uint32 orderId, uint128 srcAmount, uint dstAmount); function cancelOrder(bool isEthToToken, uint32 orderId) internal returns(bool) { address maker = msg.sender; OrderListInterface list = isEthToToken ? ethToTokenList : tokenToEthList; OrderData memory orderData = getOrderData(list, orderId); require(orderData.maker == maker); uint weiAmount = isEthToToken ? orderData.srcAmount : orderData.dstAmount; require(releaseOrderStakes(maker, weiAmount, 0)); require(removeOrder(list, maker, isEthToToken ? ETH_TOKEN_ADDRESS : contracts.token, orderId)); //funds go back to makers account makerFunds[maker][isEthToToken ? ETH_TOKEN_ADDRESS : contracts.token] += orderData.srcAmount; OrderCanceled(maker, isEthToToken, orderId, orderData.srcAmount, orderData.dstAmount); return true; } ///@param maker is the maker of this order ///@param isEthToToken which order type the maker is updating / adding ///@param srcAmount is the orders src amount (token or ETH) could be negative if funds are released. function bindOrderFunds(address maker, bool isEthToToken, int srcAmount) internal returns(bool) { address fundsAddress = isEthToToken ? ETH_TOKEN_ADDRESS : contracts.token; if (srcAmount < 0) { makerFunds[maker][fundsAddress] += uint(-srcAmount); } else { require(makerFunds[maker][fundsAddress] >= uint(srcAmount)); makerFunds[maker][fundsAddress] -= uint(srcAmount); } return true; } ///@param maker is the maker address ///@param weiAmount is the wei amount inside order that should result in knc staking function bindOrderStakes(address maker, int weiAmount) internal returns(bool) { if (weiAmount < 0) { uint decreaseWeiAmount = uint(-weiAmount); if (decreaseWeiAmount > makerTotalOrdersWei[maker]) decreaseWeiAmount = makerTotalOrdersWei[maker]; makerTotalOrdersWei[maker] -= decreaseWeiAmount; return true; } require(makerKnc[maker] >= calcKncStake(makerTotalOrdersWei[maker] + uint(weiAmount))); makerTotalOrdersWei[maker] += uint(weiAmount); return true; } ///@dev if totalWeiAmount is 0 we only release stakes. ///@dev if totalWeiAmount == weiForBurn. all staked amount will be burned. so no knc returned to maker ///@param maker is the maker address ///@param totalWeiAmount is total wei amount that was released from order - including taken wei amount. ///@param weiForBurn is the part in order wei amount that was taken and should result in burning. function releaseOrderStakes(address maker, uint totalWeiAmount, uint weiForBurn) internal returns(bool) { require(weiForBurn <= totalWeiAmount); if (totalWeiAmount > makerTotalOrdersWei[maker]) { makerTotalOrdersWei[maker] = 0; } else { makerTotalOrdersWei[maker] -= totalWeiAmount; } if (weiForBurn == 0) return true; uint burnAmount = calcBurnAmountFromFeeBurner(weiForBurn); require(makerKnc[maker] >= burnAmount); makerKnc[maker] -= burnAmount; return true; } ///@dev funds are valid only when required knc amount can be staked for this order. function secureAddOrderFunds(address maker, bool isEthToToken, uint128 srcAmount, uint128 dstAmount) internal returns(bool) { uint weiAmount = isEthToToken ? srcAmount : dstAmount; require(weiAmount >= limits.minNewOrderSizeWei); require(bindOrderFunds(maker, isEthToToken, int(srcAmount))); require(bindOrderStakes(maker, int(weiAmount))); return true; } ///@dev funds are valid only when required knc amount can be staked for this order. function secureUpdateOrderFunds(address maker, bool isEthToToken, uint128 prevSrcAmount, uint128 prevDstAmount, uint128 newSrcAmount, uint128 newDstAmount) internal returns(bool) { uint weiAmount = isEthToToken ? newSrcAmount : newDstAmount; int weiDiff = isEthToToken ? (int(newSrcAmount) - int(prevSrcAmount)) : (int(newDstAmount) - int(prevDstAmount)); require(weiAmount >= limits.minNewOrderSizeWei); require(bindOrderFunds(maker, isEthToToken, int(newSrcAmount) - int(prevSrcAmount))); require(bindOrderStakes(maker, weiDiff)); return true; } event FullOrderTaken(address maker, uint32 orderId, bool isEthToToken); function takeFullOrder( address maker, uint32 orderId, ERC20 userSrc, ERC20 userDst, uint128 userSrcAmount, uint128 userDstAmount ) internal returns (bool) { OrderListInterface list = (userSrc == ETH_TOKEN_ADDRESS) ? tokenToEthList : ethToTokenList; //userDst == maker source require(removeOrder(list, maker, userDst, orderId)); FullOrderTaken(maker, orderId, userSrc == ETH_TOKEN_ADDRESS); return takeOrder(maker, userSrc, userSrcAmount, userDstAmount, 0); } event PartialOrderTaken(address maker, uint32 orderId, bool isEthToToken, bool isRemoved); function takePartialOrder( address maker, uint32 orderId, ERC20 userSrc, ERC20 userDst, uint128 userPartialSrcAmount, uint128 userTakeDstAmount, uint128 orderSrcAmount, uint128 orderDstAmount ) internal returns(bool) { require(userPartialSrcAmount < orderDstAmount); require(userTakeDstAmount < orderSrcAmount); //must reuse parameters, otherwise stack too deep error. orderSrcAmount -= userTakeDstAmount; orderDstAmount -= userPartialSrcAmount; OrderListInterface list = (userSrc == ETH_TOKEN_ADDRESS) ? tokenToEthList : ethToTokenList; uint weiValueNotReleasedFromOrder = (userSrc == ETH_TOKEN_ADDRESS) ? orderDstAmount : orderSrcAmount; uint additionalReleasedWei = 0; if (weiValueNotReleasedFromOrder < limits.minOrderSizeWei) { // remaining order amount too small. remove order and add remaining funds to free funds makerFunds[maker][userDst] += orderSrcAmount; additionalReleasedWei = weiValueNotReleasedFromOrder; //for remove order we give makerSrc == userDst require(removeOrder(list, maker, userDst, orderId)); } else { bool isSuccess; // update order values, taken order is always first order (isSuccess,) = list.updateWithPositionHint(orderId, orderSrcAmount, orderDstAmount, HEAD_ID); require(isSuccess); } PartialOrderTaken(maker, orderId, userSrc == ETH_TOKEN_ADDRESS, additionalReleasedWei > 0); //stakes are returned for unused wei value return(takeOrder(maker, userSrc, userPartialSrcAmount, userTakeDstAmount, additionalReleasedWei)); } function takeOrder( address maker, ERC20 userSrc, uint userSrcAmount, uint userDstAmount, uint additionalReleasedWei ) internal returns(bool) { uint weiAmount = userSrc == (ETH_TOKEN_ADDRESS) ? userSrcAmount : userDstAmount; //token / eth already collected. just update maker balance makerFunds[maker][userSrc] += userSrcAmount; // send dst tokens in one batch. not here //handle knc stakes and fee. releasedWeiValue was released and not traded. return releaseOrderStakes(maker, (weiAmount + additionalReleasedWei), weiAmount); } function removeOrder( OrderListInterface list, address maker, ERC20 makerSrc, uint32 orderId ) internal returns(bool) { require(list.remove(orderId)); OrderIdData storage orders = (makerSrc == ETH_TOKEN_ADDRESS) ? makerOrdersEthToToken[maker] : makerOrdersTokenToEth[maker]; require(releaseOrderId(orders, orderId)); return true; } function getList(OrderListInterface list) internal view returns(uint32[] memory orderList) { OrderData memory orderData; uint32 orderId; bool isEmpty; (orderId, isEmpty) = list.getFirstOrder(); if (isEmpty) return(new uint32[](0)); uint numOrders = 0; for (; !orderData.isLastOrder; orderId = orderData.nextId) { orderData = getOrderData(list, orderId); numOrders++; } orderList = new uint32[](numOrders); (orderId, orderData.isLastOrder) = list.getFirstOrder(); for (uint i = 0; i < numOrders; i++) { orderList[i] = orderId; orderData = getOrderData(list, orderId); orderId = orderData.nextId; } } function getOrderData(OrderListInterface list, uint32 orderId) internal view returns (OrderData data) { uint32 prevId; (data.maker, data.srcAmount, data.dstAmount, prevId, data.nextId) = list.getOrderDetails(orderId); data.isLastOrder = (data.nextId == TAIL_ID); } function validateLegalRate (uint srcAmount, uint dstAmount, bool isEthToToken) internal view returns(bool) { uint rate; /// notice, rate is calculated from taker perspective, /// for taker amounts are opposite. order srcAmount will be DstAmount for taker. if (isEthToToken) { rate = calcRateFromQty(dstAmount, srcAmount, getDecimals(contracts.token), ETH_DECIMALS); } else { rate = calcRateFromQty(dstAmount, srcAmount, ETH_DECIMALS, getDecimals(contracts.token)); } if (rate > MAX_RATE) return false; return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"NUM_ORDERS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"},{"name":"hintPrevOrder","type":"uint32"}],"name":"submitEthToTokenOrderWHint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"weiAmount","type":"uint256"}],"name":"calcBurnAmountFromFeeBurner","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"orderId","type":"uint32"},{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"}],"name":"getEthToTokenUpdateOrderHint","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"makerKnc","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"makerOrdersTokenToEth","outputs":[{"name":"firstOrderId","type":"uint32"},{"name":"takenBitmap","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"maker","type":"address"},{"name":"amount","type":"uint256"}],"name":"depositToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kncPerEthBaseRatePrecision","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"}],"name":"getTokenToEthAddOrderHint","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BURN_TO_STAKE_FACTOR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"isEthToToken","type":"bool[]"},{"name":"srcAmount","type":"uint128[]"},{"name":"dstAmount","type":"uint128[]"},{"name":"hintPrevOrder","type":"uint32[]"},{"name":"isAfterPrevOrder","type":"bool[]"}],"name":"addOrderBatch","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"maker","type":"address"}],"name":"depositEther","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"MIN_REMAINING_ORDER_RATIO","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"makerOrdersEthToToken","outputs":[{"name":"firstOrderId","type":"uint32"},{"name":"takenBitmap","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"orderId","type":"uint32"},{"name":"newSrcAmount","type":"uint128"},{"name":"newDstAmount","type":"uint128"},{"name":"hintPrevOrder","type":"uint32"}],"name":"updateEthToTokenOrderWHint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"orderId","type":"uint32"}],"name":"cancelTokenToEthOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"maker","type":"address"}],"name":"getEthToTokenMakerOrderIds","outputs":[{"name":"orderList","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTokenToEthOrderList","outputs":[{"name":"orderList","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"}],"name":"getEthToTokenAddOrderHint","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_USD_PER_ETH","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenToEthList","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"contracts","outputs":[{"name":"kncToken","type":"address"},{"name":"token","type":"address"},{"name":"feeBurner","type":"address"},{"name":"kyberNetwork","type":"address"},{"name":"medianizer","type":"address"},{"name":"orderListFactory","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"orderId","type":"uint32"}],"name":"getTokenToEthOrder","outputs":[{"name":"_maker","type":"address"},{"name":"_srcAmount","type":"uint128"},{"name":"_dstAmount","type":"uint128"},{"name":"_prevId","type":"uint32"},{"name":"_nextId","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"srcToken","type":"address"},{"name":"srcAmount","type":"uint256"},{"name":"dstToken","type":"address"},{"name":"dstAddress","type":"address"},{"name":"conversionRate","type":"uint256"},{"name":"validate","type":"bool"}],"name":"trade","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"}],"name":"submitTokenToEthOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"}],"name":"submitEthToTokenOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BURN_FEE_BPS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dst","type":"address"},{"name":"srcQty","type":"uint256"},{"name":"blockNumber","type":"uint256"}],"name":"getConversionRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setKncPerEthBaseRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"weiAmount","type":"uint256"}],"name":"calcKncStake","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"orderId","type":"uint32"},{"name":"newSrcAmount","type":"uint128"},{"name":"newDstAmount","type":"uint128"}],"name":"updateEthToTokenOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"weiAmount","type":"uint256"}],"name":"calcBurnAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"limits","outputs":[{"name":"minNewOrderSizeUsd","type":"uint256"},{"name":"maxOrdersPerTrade","type":"uint256"},{"name":"minNewOrderSizeWei","type":"uint256"},{"name":"minOrderSizeWei","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"maker","type":"address"}],"name":"makerUnlockedKnc","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"orderId","type":"uint32"},{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"}],"name":"getTokenToEthUpdateOrderHint","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"orderId","type":"uint32"},{"name":"newSrcAmount","type":"uint128"},{"name":"newDstAmount","type":"uint128"},{"name":"hintPrevOrder","type":"uint32"}],"name":"updateTokenToEthOrderWHint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"withdrawKncFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"orderId","type":"uint32"},{"name":"newSrcAmount","type":"uint128"},{"name":"newDstAmount","type":"uint128"}],"name":"updateTokenToEthOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"},{"name":"hintPrevOrder","type":"uint32"}],"name":"submitTokenToEthOrderWHint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setMinOrderSizeEth","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"maker","type":"address"}],"name":"getTokenToEthMakerOrderIds","outputs":[{"name":"orderList","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"maker","type":"address"}],"name":"makerRequiredKncStake","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"orderId","type":"uint32"}],"name":"getEthToTokenOrder","outputs":[{"name":"_maker","type":"address"},{"name":"_srcAmount","type":"uint128"},{"name":"_dstAmount","type":"uint128"},{"name":"_prevId","type":"uint32"},{"name":"_nextId","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"HEAD_ID","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"makerTotalOrdersWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"maker","type":"address"},{"name":"amount","type":"uint256"}],"name":"depositKncForFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"makerFunds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"makerBurnFeeBps","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TAIL_ID","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"init","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kncRateBlocksTrade","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"isEthToToken","type":"bool[]"},{"name":"orderId","type":"uint32[]"},{"name":"newSrcAmount","type":"uint128[]"},{"name":"newDstAmount","type":"uint128[]"},{"name":"hintPrevOrder","type":"uint32[]"}],"name":"updateOrderBatch","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getEthToTokenOrderList","outputs":[{"name":"orderList","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"orderId","type":"uint32"}],"name":"cancelEthToTokenOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ethToTokenList","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"knc","type":"address"},{"name":"reserveToken","type":"address"},{"name":"burner","type":"address"},{"name":"network","type":"address"},{"name":"medianizer","type":"address"},{"name":"factory","type":"address"},{"name":"minNewOrderUsd","type":"uint256"},{"name":"maxOrdersPerTrade","type":"uint256"},{"name":"burnFeeBps","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"srcToken","type":"address"},{"indexed":false,"name":"dstToken","type":"address"},{"indexed":false,"name":"srcAmount","type":"uint256"},{"indexed":false,"name":"dstAmount","type":"uint256"}],"name":"OrderbookReserveTrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"EtherDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"KncFeeDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"orderId","type":"uint32"},{"indexed":false,"name":"isEthToToken","type":"bool"},{"indexed":false,"name":"srcAmount","type":"uint128"},{"indexed":false,"name":"dstAmount","type":"uint128"},{"indexed":false,"name":"addedWithHint","type":"bool"}],"name":"NewLimitOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"isEthToToken","type":"bool"},{"indexed":false,"name":"orderId","type":"uint256"},{"indexed":false,"name":"srcAmount","type":"uint128"},{"indexed":false,"name":"dstAmount","type":"uint128"},{"indexed":false,"name":"updatedWithHint","type":"bool"}],"name":"OrderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"isEthToToken","type":"bool"},{"indexed":false,"name":"orderId","type":"uint32"},{"indexed":false,"name":"srcAmount","type":"uint128"},{"indexed":false,"name":"dstAmount","type":"uint256"}],"name":"OrderCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"maker","type":"address"},{"indexed":false,"name":"orderId","type":"uint32"},{"indexed":false,"name":"isEthToToken","type":"bool"}],"name":"FullOrderTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"maker","type":"address"},{"indexed":false,"name":"orderId","type":"uint32"},{"indexed":false,"name":"isEthToToken","type":"bool"},{"indexed":false,"name":"isRemoved","type":"bool"}],"name":"PartialOrderTaken","type":"event"}]
Contract Creation Code
606060405234156200001057600080fd5b60405161012080620046e1833981016040528080519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051915050600160a060020a03891615156200007657600080fd5b600160a060020a03881615156200008c57600080fd5b600160a060020a0387161515620000a257600080fd5b600160a060020a0386161515620000b857600080fd5b600160a060020a0385161515620000ce57600080fd5b600160a060020a0384161515620000e457600080fd5b801515620000f157600080fd5b60648111156200010057600080fd5b8115156200010d57600080fd5b600083116200011b57600080fd5b60098054600160a060020a0319908116600160a060020a03898116919091179092556008805482168a8416179055600a80548216888416179055600b805482168784161790556006805482168c841617905560078054909116918a16919091179055601181905560028390556003829055620001a46401000000006200032d8102620020801704565b1515620001b057600080fd5b600654600854600160a060020a039182169163095ea7b391167f80000000000000000000000000000000000000000000000000000000000000006000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200025057600080fd5b6102c65a03f115156200026257600080fd5b5050506040518051905015156200027857600080fd5b6007546200029d90600160a060020a0316640100000000620040bb6200042e82021704565b600854600160a060020a031663301254166000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515620002ff57600080fd5b6102c65a03f115156200031157600080fd5b5050506040518051600155506200050e98505050505050505050565b600a546000908190819081908190600160a060020a03166359e02dd782604051604001526040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016040805180830381600087803b15156200039857600080fd5b6102c65a03f11515620003aa57600080fd5b505050604051805190602001805191955090935050821515620003cc57600080fd5b670de0b6b3a764000084049150811515620003e657600080fd5b620186a08210620003f657600080fd5b60025484906ec097ce7bc90715b34b9f1000000000028115156200041657fe5b04600481905560029004600555506001949350505050565b600160a060020a03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156200047657600160a060020a0381166000908152602081905260409020601290556200050b565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515620004d657600080fd5b6102c65a03f11515620004e857600080fd5b5050506040518051600160a060020a038316600090815260208190526040902055505b50565b6141c3806200051e6000396000f30060606040526004361061029a5763ffffffff60e060020a60003504166304068ae2811461029f57806314fd6da0146102c4578063269fe82e146103065780632ac1db5a1461031c5780632b4d53031461036357806330cbb66f14610382578063338b5dea146103c05780633b443e3b146103e45780633bed33ce146103f7578063411273d81461040d57806344909b741461043257806350baa6221461044557806350d91deb1461045b57806352802121146105aa578063541e15b6146105be57806357df82e0146105d15780635cd36325146105f05780635e310670146106275780635ff468571461064357806362bb7533146106b557806362c5aecc146106c8578063685e7fc2146106ed578063690d986b146107005780636c0f79b61461072f5780636c3aacf9146107875780636cf69811146107f1578063744fa2c81461081d57806374d88c50146108425780637a03b624146108675780637cd442721461087a5780637f18b569146108a55780638108592c146108b857806384d062b4146108ce578063853717bb146108fc578063860aefcf146109125780638b7d6b05146109505780638fb2fbe11461096f57806390f3dd331461099d57806392418cf6146109d4578063971e668f146109ea5780639d0d647314610a185780639ebbf23114610a465780639f7ba82814610a59578063a9055b8114610a78578063abdde3d114610a97578063b7b2c52514610ab3578063ba6b0fa014610ac6578063bc1f71e114610ae5578063c01a3cd214610b07578063c444214a14610b2c578063d11dfdec14610b3f578063d4fac45d14610b52578063e1c7392a14610b77578063e934853214610b8a578063f2e9135014610b9d578063f67e8db214610cec578063f719254d14610cff578063fe459fdf14610d1b575b600080fd5b34156102aa57600080fd5b6102b2610d2e565b60405190815260200160405180910390f35b34156102cf57600080fd5b6102f26001608060020a036004358116906024351663ffffffff60443516610d33565b604051901515815260200160405180910390f35b341561031157600080fd5b6102b2600435610d71565b341561032757600080fd5b61034a63ffffffff600435166001608060020a0360243581169060443516610dfa565b60405163ffffffff909116815260200160405180910390f35b341561036e57600080fd5b6102b2600160a060020a0360043516610f4f565b341561038d57600080fd5b6103a1600160a060020a0360043516610f61565b60405163ffffffff909216825260208201526040908101905180910390f35b34156103cb57600080fd5b6103e2600160a060020a0360043516602435610f83565b005b34156103ef57600080fd5b6102b26110aa565b341561040257600080fd5b6103e26004356110b0565b341561041857600080fd5b61034a6001608060020a0360043581169060243516611156565b341561043d57600080fd5b6102b26111f5565b341561045057600080fd5b6103e26004356111fa565b341561046657600080fd5b6102f26004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506112e095505050505050565b6103e2600160a060020a0360043516611435565b34156105c957600080fd5b6102b26114ba565b34156105dc57600080fd5b6103a1600160a060020a03600435166114bf565b34156105fb57600080fd5b6102f263ffffffff6004358116906001608060020a0360243581169160443590911690606435166114e1565b341561063257600080fd5b6102f263ffffffff60043516611508565b341561064e57600080fd5b610662600160a060020a0360043516611528565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156106a1578082015183820152602001610689565b505050509050019250505060405180910390f35b34156106c057600080fd5b6106626115ea565b34156106d357600080fd5b61034a6001608060020a036004358116906024351661160d565b34156106f857600080fd5b6102b2611689565b341561070b57600080fd5b610713611690565b604051600160a060020a03909116815260200160405180910390f35b341561073a57600080fd5b61074261169f565b604051600160a060020a0396871681529486166020860152928516604080860191909152918516606085015284166080840152921660a082015260c001905180910390f35b341561079257600080fd5b6107a363ffffffff600435166116d1565b604051600160a060020a0390951685526001608060020a0393841660208601529190921660408085019190915263ffffffff92831660608501529116608083015260a0909101905180910390f35b6102f2600160a060020a03600435811690602435906044358116906064351660843560a4351515611772565b341561082857600080fd5b6102f26001608060020a0360043581169060243516611a64565b341561084d57600080fd5b6102f26001608060020a0360043581169060243516611a79565b341561087257600080fd5b6102b2611a87565b341561088557600080fd5b6102b2600160a060020a0360043581169060243516604435606435611a8c565b34156108b057600080fd5b6103e2611d09565b34156108c357600080fd5b6102b2600435611d83565b34156108d957600080fd5b6102f263ffffffff600435166001608060020a0360243581169060443516611d97565b341561090757600080fd5b6102b2600435611da6565b341561091d57600080fd5b610925611dc3565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b341561095b57600080fd5b6102b2600160a060020a0360043516611dd2565b341561097a57600080fd5b61034a63ffffffff600435166001608060020a0360243581169060443516611e2f565b34156109a857600080fd5b6102f263ffffffff6004358116906001608060020a036024358116916044359091169060643516611f38565b34156109df57600080fd5b6103e2600435611f48565b34156109f557600080fd5b6102f263ffffffff600435166001608060020a0360243581169060443516612029565b3415610a2357600080fd5b6102f26001608060020a036004358116906024351663ffffffff6044351661204d565b3415610a5157600080fd5b6102f2612080565b3415610a6457600080fd5b610662600160a060020a0360043516612162565b3415610a8357600080fd5b6102b2600160a060020a036004351661221c565b3415610aa257600080fd5b6107a363ffffffff6004351661223e565b3415610abe57600080fd5b61034a6114ba565b3415610ad157600080fd5b6102b2600160a060020a036004351661229b565b3415610af057600080fd5b6103e2600160a060020a03600435166024356122ad565b3415610b1257600080fd5b6102b2600160a060020a036004358116906024351661251d565b3415610b3757600080fd5b6102b261253a565b3415610b4a57600080fd5b61034a612540565b3415610b5d57600080fd5b6102b2600160a060020a0360043581169060243516612545565b3415610b8257600080fd5b6102f26125f0565b3415610b9557600080fd5b6102f261278e565b3415610ba857600080fd5b6102f260046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061280095505050505050565b3415610cf757600080fd5b6106626128de565b3415610d0a57600080fd5b6102f263ffffffff600435166128fb565b3415610d2657600080fd5b610713612908565b602081565b600160a060020a03331660009081526013602052604081208190610d5690612917565b9050610d6660018287878761295c565b91505b509392505050565b60085460009069021e19e0c9bab240000090600160a060020a0316633012541683604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610dc757600080fd5b6102c65a03f11515610dd857600080fd5b50505060405180519050601154840202811515610df157fe5b0490505b919050565b60008060008060006002800154876001608060020a031610151515610e1e57600080fd5b600d54600160a060020a03166385fcb4a8888860006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b1515610e7f57600080fd5b6102c65a03f11515610e9057600080fd5b5050506040518051905093508763ffffffff168463ffffffff161415610f4357600d54600160a060020a03166361592b8589600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b1515610f0357600080fd5b6102c65a03f11515610f1457600080fd5b505050604051805190602001805190602001805190602001805190602001805191985093965091945090925050505b50919695505050505050565b600f6020526000908152604090205481565b6012602052600090815260409020805460019091015463ffffffff9091169082565b600160a060020a0382161515610f9857600080fd5b6b204fce5e3e250261100000008110610fb057600080fd5b600754600160a060020a03166323b872dd33308460006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561101c57600080fd5b6102c65a03f1151561102d57600080fd5b50505060405180519050151561104257600080fd5b600160a060020a038083166000818152600e602090815260408083206007549095168352939052829020805484019055907fbc7c8a4d8049a3f99a02f2a20640c206a2e4d3f2fa54fd20da9f01fda3620cda9083905190815260200160405180910390a25050565b60015481565b33600160a060020a0381166000908152600e602090815260408083206000805160206141788339815191528452909152902054828110156110f057600080fd5b600160a060020a0382166000818152600e602090815260408083206000805160206141788339815191528452909152908190208054869003905584156108fc0290859051600060405180830381858888f19350505050151561115157600080fd5b505050565b6004546000906001608060020a038316101561117157600080fd5b600c54600160a060020a03166385fcb4a8848460006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b15156111d257600080fd5b6102c65a03f115156111e357600080fd5b50505060405180519150505b92915050565b600581565b33600160a060020a038181166000908152600e60209081526040808320600754909416835292905220548281101561123157600080fd5b600160a060020a038083166000908152600e60209081526040808320600780548616855292528083208054889003905590549092169163a9059cbb918591879190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156112ba57600080fd5b6102c65a03f115156112cb57600080fd5b50505060405180519050151561115157600080fd5b600080600080600086518a51146112f657600080fd5b87518a511461130457600080fd5b88518a511461131257600080fd5b85518a511461132057600080fd5b5033925060009050805b89518110156114255785818151811061133f57fe5b906020019060200201516113685786818151811061135957fe5b9060200190602002015161136a565b815b92506113c48a828151811061137b57fe5b906020019060200201516113a657600160a060020a03851660009081526012602052604090206113bf565b600160a060020a03851660009081526013602052604090205b612917565b91506114128a82815181106113d557fe5b90602001906020020151838b84815181106113ec57fe5b906020019060200201518b858151811061140257fe5b906020019060200201518761295c565b151561141d57600080fd5b60010161132a565b5060019998505050505050505050565b600160a060020a038116151561144a57600080fd5b600160a060020a0381166000818152600e602090815260408083206000805160206141788339815191528452909152908190208054349081019091557f939e51ac2fd009b158d6344f7e68a83d8d18d9b0cc88cf514aac6aaa9cad2a18915190815260200160405180910390a250565b600281565b6013602052600090815260409020805460019091015463ffffffff9091169082565b60006114f1600186868686612be8565b15156114fc57600080fd5b5060015b949350505050565b6000611515600083612f0b565b151561152057600080fd5b506001919050565b61153061407b565b600160a060020a03821660009081526013602052604081209080611553836130cc565b6040518059106115605750595b9080825280602002602001820160405250935060009150600090505b60208163ffffffff1610156115e25760008163ffffffff1660019060020a0284600101541611156115da578254600183019263ffffffff9091168201908590815181106115c557fe5b63ffffffff9092166020928302909101909101525b60010161157c565b505050919050565b6115f261407b565b600c54600160a060020a0316611607816130fe565b91505090565b6004546000906001608060020a038416101561162857600080fd5b600d54600160a060020a03166385fcb4a8848460006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b15156111d257600080fd5b620186a081565b600c54600160a060020a031681565b600654600754600854600954600a54600b54600160a060020a0395861695948516949384169392831692918216911686565b600c546000908190819081908190600160a060020a03166361592b85878360405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b151561172e57600080fd5b6102c65a03f1151561173f57600080fd5b5050506040518051906020018051906020018051906020018051906020018051949b939a50919850965091945092505050565b600954600090819033600160a060020a0390811691161461179257600080fd5b600160a060020a03881660008051602061417883398151915214806117cd5750600160a060020a038616600080516020614178833981519152145b15156117d857600080fd5b600754600160a060020a03898116911614806118015750600754600160a060020a038781169116145b151561180c57600080fd5b6b204fce5e3e2502611000000087111561182557600080fd5b600160a060020a03881660008051602061417883398151915214156118555734871461185057600080fd5b6118f0565b341561186057600080fd5b87600160a060020a03166323b872dd33308a60006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b15156118ca57600080fd5b6102c65a03f115156118db57600080fd5b5050506040518051905015156118f057600080fd5b6118fb8888886132bc565b9050611919878261190b8b6134b0565b6119148a6134b0565b613564565b84111561192557600080fd5b600160a060020a038616600080516020614178833981519152141561197a57600160a060020a03851681156108fc0282604051600060405180830381858888f19350505050151561197557600080fd5b6119fd565b85600160a060020a031663a9059cbb868360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156119d757600080fd5b6102c65a03f115156119e857600080fd5b5050506040518051905015156119fd57600080fd5b7f36cfc7e9779b5ccf22f92f2f0d9adf9c74df05ab07de27c8cb508020389f9adc88878984604051600160a060020a0394851681529290931660208301526040808301919091526060820192909252608001905180910390a1506001979650505050505050565b6000611a728383600061204d565b9392505050565b6000611a7283836000610d33565b606481565b6000806000611a9961408d565b60008080600160a060020a038b166000805160206141788339815191521480611ad85750600160a060020a038a16600080516020614178833981519152145b1515611ae357600080fd5b600754600160a060020a038c811691161480611b0c5750600754600160a060020a038b81169116145b1515611b1757600080fd5b6b204fce5e3e25026110000000891115611b3057600080fd5b611b3861278e565b80611b41575088155b15611b4f5760009650611cfb565b600160a060020a038b1660008051602061417883398151915214611b7e57600d54600160a060020a0316611b8b565b600c54600160a060020a03165b600354909650899350600092509050600160a060020a03861663a3fb591783604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b1515611bde57600080fd5b6102c65a03f11515611bef57600080fd5b5050506040518051906020018051151560408701525094505b6000836001608060020a0316118015611c2357508360400151155b8015611c355750600019810190600090115b15611cc057611c4486866135ff565b9350826001608060020a031684608001516001608060020a031611611c7a57836060015182019150836080015183039250611cb4565b83608001516001608060020a0316836001608060020a031685606001516001608060020a031602811515611caa57fe5b0482019150600092505b83602001519450611c08565b6001608060020a03831615611cd85760009650611cfb565b611cf889836001608060020a0316611cef8e6134b0565b6119148e6134b0565b96505b505050505050949350505050565b600854600090600160a060020a0316633012541682604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611d5357600080fd5b6102c65a03f11515611d6457600080fd5b505050604051805190509050600154811015611d805760018190555b50565b60006005611d9083611da6565b0292915050565b600061150084848460006114e1565b60015460115460009169021e19e0c9bab240000091840202610df1565b60025460035460045460055484565b600080611dde8361221c565b600160a060020a0384166000908152600f6020526040902054909150811115611e0a5760009150611e29565b600160a060020a0383166000908152600f602052604090205481900391505b50919050565b60008060008060006002800154866001608060020a031610151515611e5357600080fd5b600c54600160a060020a03166385fcb4a8888860006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b1515611eb457600080fd5b6102c65a03f11515611ec557600080fd5b5050506040518051905093508763ffffffff168463ffffffff161415610f4357600c54600160a060020a03166361592b8589600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b1515610f0357600080fd5b60006114f1600086868686612be8565b33600160a060020a0381166000908152600f602052604090205482901015611f6f57600080fd5b81611f7982611dd2565b1015611f8457600080fd5b600160a060020a038082166000908152600f6020526040808220805486900390556006549092169163a9059cbb918491869190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611fff57600080fd5b6102c65a03f1151561201057600080fd5b50505060405180519050151561202557600080fd5b5050565b60006120388484846000611f38565b151561204357600080fd5b5060019392505050565b600160a060020a0333166000908152601260205260408120819061207090612917565b9050610d6660008287878761295c565b600a546000908190819081908190600160a060020a03166359e02dd782604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b15156120d157600080fd5b6102c65a03f115156120e257600080fd5b50505060405180519060200180519195509093505082151561210357600080fd5b670de0b6b3a76400008404915081151561211c57600080fd5b620186a0821061212b57600080fd5b60025484906ec097ce7bc90715b34b9f10000000000281151561214a57fe5b04600481905560029004600555506001949350505050565b61216a61407b565b600160a060020a0382166000908152601260205260408120908061218d836130cc565b60405180591061219a5750595b9080825280602002602001820160405250935060009150600090505b60208163ffffffff1610156115e25760008163ffffffff1660019060020a028460010154161115612214578254600183019263ffffffff9091168201908590815181106121ff57fe5b63ffffffff9092166020928302909101909101525b6001016121b6565b600160a060020a0381166000908152601060205260408120546111ef90611d83565b600d546000908190819081908190600160a060020a03166361592b85878360405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b151561172e57600080fd5b60106020526000908152604090205481565b600160a060020a03821615156122c257600080fd5b6b204fce5e3e2502611000000081106122da57600080fd5b600654600160a060020a03166323b872dd33308460006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561234657600080fd5b6102c65a03f1151561235757600080fd5b50505060405180519050151561236c57600080fd5b600160a060020a0382166000818152600f6020526040908190208054840190557f7616f7b36d352f805882b5e6af4b72e6d1f325e5d73feef17ba9f064468498769083905190815260200160405180910390a2600160a060020a03821660009081526012602052604090206123e0906136d9565b1561247e57600160a060020a038083166000908152601260209081526040808320600c54612473959194911692631f38c35892909190516020015260405163ffffffff83811660e060020a028252919091166004820152602401602060405180830381600087803b151561245357600080fd5b6102c65a03f1151561246457600080fd5b505050604051805190506136fa565b151561247e57600080fd5b600160a060020a038216600090815260136020526040902061249f906136d9565b1561202557600160a060020a038083166000908152601360209081526040808320600d54612512959194911692631f38c35892909190516020015260405163ffffffff83811660e060020a028252919091166004820152602401602060405180830381600087803b151561245357600080fd5b151561202557600080fd5b600e60209081526000928352604080842090915290825290205481565b60115481565b600181565b6000600160a060020a03831660008051602061417883398151915214156125775750600160a060020a038116316111ef565b82600160a060020a03166370a082318360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156125ce57600080fd5b6102c65a03f115156125df57600080fd5b5050506040518051905090506111ef565b600c54600090600160a060020a0316158015906126175750600d54600160a060020a031615155b156126245750600161278b565b600c54600160a060020a03161515806126475750600d54600160a060020a031615155b1561265157600080fd5b600b54600160a060020a031663fccf6e673060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156126aa57600080fd5b6102c65a03f115156126bb57600080fd5b5050506040518051600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03928316179055600b5416905063fccf6e673060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561273f57600080fd5b6102c65a03f1151561275057600080fd5b5050506040518051600d805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905550600190505b90565b60015460085460009160050290600160a060020a0316633012541683604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156127df57600080fd5b6102c65a03f115156127f057600080fd5b5050506040518051905011905090565b600080855187511461281157600080fd5b845187511461281f57600080fd5b835187511461282d57600080fd5b825187511461283b57600080fd5b5060005b86518110156128d1576128be87828151811061285757fe5b9060200190602002015187838151811061286d57fe5b9060200190602002015187848151811061288357fe5b9060200190602002015187858151811061289957fe5b906020019060200201518786815181106128af57fe5b90602001906020020151612be8565b15156128c957600080fd5b60010161283f565b5060019695505050505050565b6128e661407b565b600d54600160a060020a0316611607816130fe565b6000611515600183612f0b565b600d54600160a060020a031681565b600180820154600091825b602081101561029a57828216151561294d578282176001860155845463ffffffff16810193506115e2565b60029190910290600101612922565b60008080806b204fce5e3e250261100000006001608060020a0388161061298257600080fd5b6b204fce5e3e250261100000006001608060020a038716106129a357600080fd5b3392506129b2838a8989613736565b15156129bd57600080fd5b6129da876001608060020a0316876001608060020a03168b6137a3565b15156129e557600080fd5b60009150886129ff57600c54600160a060020a0316612a0c565b600d54600160a060020a03165b905063ffffffff851615612abb5780600160a060020a031663a5da0bf5848a8a8a8a60006040516020015260405163ffffffff87811660e060020a028252600160a060020a0396909616600482015293851660248501526001608060020a03928316604485015291166064830152909116608482015260a401602060405180830381600087803b1515612a9e57600080fd5b6102c65a03f11515612aaf57600080fd5b50505060405180519250505b811515612b655780600160a060020a031663c92ba8b2848a8a8a60006040516020015260405163ffffffff86811660e060020a028252600160a060020a039590951660048201529290931660248301526001608060020a0390811660448301529091166064820152608401602060405180830381600087803b1515612b3f57600080fd5b6102c65a03f11515612b5057600080fd5b505050604051805190501515612b6557600080fd5b82600160a060020a03167f2fb3fe66d41cb2d1b0d335656d86e7c779ebdc34c6f6fc806d35790a30be0e6d898b8a8a8760405163ffffffff909516855292151560208501526001608060020a0391821660408086019190915291166060840152901515608083015260a0909101905180910390a250600198975050505050505050565b6000808080808080806b204fce5e3e250261100000006001608060020a038c1610612c1257600080fd5b6b204fce5e3e250261100000006001608060020a038b1610612c3357600080fd5b612c508b6001608060020a03168b6001608060020a03168f6137a3565b1515612c5b57600080fd5b8c612c7157600c54600160a060020a0316612c7e565b600d54600160a060020a03165b915081600160a060020a03166361592b858d600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b1515612cd157600080fd5b6102c65a03f11515612ce257600080fd5b505050604051805190602001805190602001805190602001805190602001805150939a5090985090965094505033600160a060020a0390811690881614612d2857600080fd5b612d36878e87898f8f613815565b1515612d455760009750612efb565b50600063ffffffff891615612dec5781600160a060020a031663a590529e8d8d8d8d60006040516040015260405163ffffffff86811660e060020a02825294851660048201526001608060020a039384166024820152919092166044820152911660648201526084016040805180830381600087803b1515612dc657600080fd5b6102c65a03f11515612dd757600080fd5b50505060405180519060200180519450909150505b801515612e825781600160a060020a031663cb2f7b878d8d8d60006040516020015260405163ffffffff85811660e060020a0282529390931660048401526001608060020a039182166024840152166044820152606401602060405180830381600087803b1515612e5c57600080fd5b6102c65a03f11515612e6d57600080fd5b505050604051805190501515612e8257600080fd5b86600160a060020a03167f2bf327e052ee7ab98550e3d864a5b2a61f7737dc75cbcaada4e55f88222ebbd78e8e8e8e86604051941515855263ffffffff90931660208501526001608060020a0391821660408086019190915291166060840152901515608083015260a0909101905180910390a2600197505b5050505050505095945050505050565b6000806000612f1861408d565b600033935086612f3357600c54600160a060020a0316612f40565b600d54600160a060020a03165b9250612f4c83876135ff565b9150600160a060020a0384168251600160a060020a031614612f6d57600080fd5b86612f7c578160800151612f82565b81606001515b6001608060020a03169050612f99848260006138c7565b1515612fa457600080fd5b612fd5838589612fbf57600754600160a060020a0316612fcf565b6000805160206141788339815191525b896139a2565b1515612fe057600080fd5b8160600151600160a060020a0385166000908152600e602052604081206001608060020a039290921691908961302157600754600160a060020a0316613031565b6000805160206141788339815191525b600160a060020a0390811682526020820192909252604001600020805490920190915584167f179f16fddc625e40df9cb92cfcea70d64a6262c82b7a769e52996b1ff511ff56888860608601518660800151604051931515845263ffffffff90921660208401526001608060020a03908116604080850191909152911660608301526080909101905180910390a25060019695505050505050565b6000805b6020811015611e295760008160019060020a0284600101541611156130f6576001909101905b6001016130d0565b61310661407b565b61310e61408d565b60008060008086600160a060020a031663a3fb59176000604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b151561315957600080fd5b6102c65a03f1151561316a57600080fd5b50505060405180519060200180519195509093505082156131ac5760006040518059106131945750595b908082528060200260200182016040525095506132b2565b600091505b846040015115156131da576131c687856135ff565b9450600190910190602085015193506131b1565b816040518059106131e85750595b9080825280602002602001820160405250955086600160a060020a031663a3fb59176000604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b151561324057600080fd5b6102c65a03f1151561325157600080fd5b505050604051805190602001805115156040880152509350600090505b818110156132b2578386828151811061328357fe5b63ffffffff9092166020928302909101909101526132a187856135ff565b94508460200151935060010161326e565b5050505050919050565b60008060006132c961408d565b60008080600160a060020a038a16600080516020614178833981519152146132fc57600d54600160a060020a0316613309565b600c54600160a060020a03165b95508892506000915085600160a060020a031663a3fb59176000604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b151561335757600080fd5b6102c65a03f1151561336857600080fd5b5050506040518051906020018051151560408701525094505b6000836001608060020a031611801561339c57508360400151155b1561346f576133ab86866135ff565b9350826001608060020a031684608001516001608060020a031611613403578360600151820191508360800151909203916133f38451868c8b88608001518960600151613a7b565b15156133fe57600080fd5b613463565b83608001516001608060020a0316836001608060020a031685606001516001608060020a03160281151561343357fe5b049182019190506134538451868c8b87868a606001518b60800151613b70565b151561345e57600080fd5b600092505b83602001519450613381565b6001608060020a03831615801561348f57506000826001608060020a0316115b151561349a57600080fd5b506001608060020a031698975050505050505050565b600080600160a060020a03831660008051602061417883398151915214156134db5760129150611e29565b50600160a060020a0382166000908152602081905260409020548015156111ef5782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561354257600080fd5b6102c65a03f1151561355357600080fd5b505050604051805190509150611e29565b60006b204fce5e3e2502611000000085111561357f57600080fd5b6b204fce5e3e2502611000000084111561359857600080fd5b8282106135d357601283830311156135af57600080fd5b84838303600a0a02670de0b6b3a764000085028115156135cb57fe5b049050611500565b601282840311156135e357600080fd5b84828403600a0a670de0b6b3a76400008602028115156135cb57fe5b61360761408d565b600083600160a060020a03166361592b8584600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b151561365a57600080fd5b6102c65a03f1151561366b57600080fd5b505050604051805190602001805190602001805190602001805190602001805163ffffffff16602088019081526001608060020a039384166080890152939092166060870152600160a060020a039093168552509091506001905163ffffffff161460408301525092915050565b805460009063ffffffff1615156136f257506001610df5565b506000919050565b815460009063ffffffff1681901115613715575060006111ef565b50815463ffffffff191663ffffffff91909116178155600060019182015590565b600080846137445782613746565b835b6004546001608060020a0391909116915081101561376357600080fd5b6137778686866001608060020a0316613dd3565b151561378257600080fd5b61378c8682613ea9565b151561379757600080fd5b50600195945050505050565b60008082156137d7576007546137d090859087906137c990600160a060020a03166134b0565b6012613564565b90506137fa565b6007546137f7908590879060129061191490600160a060020a03166134b0565b90505b69d3c21bcecceda10000008111156114fc5760009150610d69565b6000806000876138255783613827565b845b6001608060020a031691508761385157856001608060020a0316846001608060020a031603613867565b866001608060020a0316856001608060020a0316035b60045490915082101561387957600080fd5b6138988989896001608060020a0316886001608060020a031603613dd3565b15156138a357600080fd5b6138ad8982613ea9565b15156138b857600080fd5b50600198975050505050505050565b600080838311156138d757600080fd5b600160a060020a03851660009081526010602052604090205484111561391557600160a060020a038516600090815260106020526040812055613935565b600160a060020a0385166000908152601060205260409020805485900390555b8215156139455760019150610d69565b61394e83610d71565b600160a060020a0386166000908152600f60205260409020549091508190101561397757600080fd5b600160a060020a0385166000908152600f602052604090208054829003905560019150509392505050565b60008085600160a060020a031662d84fd88460006040516020015260405163ffffffff83811660e060020a028252919091166004820152602401602060405180830381600087803b15156139f557600080fd5b6102c65a03f11515613a0657600080fd5b505050604051805190501515613a1b57600080fd5b600160a060020a03841660008051602061417883398151915214613a5657600160a060020a0385166000908152601260205260409020613a6f565b600160a060020a03851660009081526013602052604090205b905061378c8184613f90565b600080600160a060020a03861660008051602061417883398151915214613aad57600d54600160a060020a0316613aba565b600c54600160a060020a03165b9050613ac88189878a6139a2565b1515613ad357600080fd5b7ffc2eaa59b7259e4eb0ce92d7a86fce8b0fb67fade6f9f69df98f4771035a50c28888600160a060020a03891660008051602061417883398151915214604051600160a060020a03909316835263ffffffff909116602083015215156040808301919091526060909101905180910390a1613b648887866001608060020a0316866001608060020a0316600061400d565b98975050505050505050565b6000808080806001608060020a03808716908a1610613b8e57600080fd5b6001608060020a0380881690891610613ba657600080fd5b95879003959488900394600160a060020a038b1660008051602061417883398151915214613bdf57600d54600160a060020a0316613bec565b600c54600160a060020a03165b9350600160a060020a038b1660008051602061417883398151915214613c125786613c14565b855b6001608060020a0316925060009150600260030154831015613c8357600160a060020a03808e166000908152600e60209081526040808320938e1683529290522080546001608060020a038916019055829150613c73848e8c8f6139a2565b1515613c7e57600080fd5b613d26565b83600160a060020a031663a590529e8d8989600260006040516040015260405163ffffffff86811660e060020a02825294851660048201526001608060020a039384166024820152919092166044820152911660648201526084016040805180830381600087803b1515613cf657600080fd5b6102c65a03f11515613d0757600080fd5b50505060405180519060200180515090915050801515613d2657600080fd5b7fd499cca7d46b5236c2cb522ceec930ccf485eefca1f0472c020a1b7328bf06438d8d600160a060020a038e166000805160206141788339815191521460008611604051600160a060020a03909416845263ffffffff9092166020840152151560408084019190915290151560608301526080909101905180910390a1613dc28d8c8b6001608060020a03168b6001608060020a03168661400d565b9d9c50505050505050505050505050565b60008083613dec57600754600160a060020a0316613dfc565b6000805160206141788339815191525b90506000831215613e3e57600160a060020a038581166000908152600e60209081526040808320938516835292905290812080549185900390910190556114fc565b600160a060020a038086166000908152600e602090815260408083209385168352929052205483901015613e7157600080fd5b600160a060020a038086166000908152600e602090815260408083209385168352929052208054849003905560019150509392505050565b6000806000831215613f1e5750600160a060020a0383166000908152601060205260408120549083900390811115613ef65750600160a060020a0383166000908152601060205260409020545b600160a060020a03841660009081526010602052604090208054829003905560019150613f89565b600160a060020a038416600090815260106020526040902054613f42908401611d83565b600160a060020a0385166000908152600f60205260409020541015613f6657600080fd5b600160a060020a0384166000908152601060205260409020805484019055600191505b5092915050565b81546000908190819063ffffffff9081169085161015613faf57600080fd5b845463ffffffff90811660200190851610613fc957600080fd5b50508254600184015463ffffffff9182169184169190910390600282900a90600090821611613ff757600080fd5b6001808601805483191690559250505092915050565b600080600160a060020a038616600080516020614178833981519152146140345783614036565b845b600160a060020a038089166000908152600e60209081526040808320938b16835292905220805487019055905061407087848301836138c7565b979650505050505050565b60206040519081016040526000815290565b60a0604051908101604090815260008083526020830181905290820181905260608201819052608082015290565b600160a060020a03811660008051602061417883398151915214156140fb57600160a060020a038116600090815260208190526040902060129055611d80565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561414157600080fd5b6102c65a03f1151561415257600080fd5b5050506040518051600160a060020a03831660009081526020819052604090205550505600000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea165627a7a723058207eb541f3d1a2548f0c8d7e0ff28ca2edb63374d5242dead60640e16d719ac99d0029000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd2000000000000000000000000000e8d6b471e332f140e7d9dbb99e5e3822f728da60000000000000000000000008007aa43792a392b221dc091bdb2191e5ff626d100000000000000000000000065bf64ff5f51272f729bdcd7acfb00677ced86cd000000000000000000000000729d19f657bd0614b4985cf1d82531c67569197b000000000000000000000000aba982e0190e27a32400a622fe016a44c4ffab6800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000019
Deployed Bytecode
0x60606040526004361061029a5763ffffffff60e060020a60003504166304068ae2811461029f57806314fd6da0146102c4578063269fe82e146103065780632ac1db5a1461031c5780632b4d53031461036357806330cbb66f14610382578063338b5dea146103c05780633b443e3b146103e45780633bed33ce146103f7578063411273d81461040d57806344909b741461043257806350baa6221461044557806350d91deb1461045b57806352802121146105aa578063541e15b6146105be57806357df82e0146105d15780635cd36325146105f05780635e310670146106275780635ff468571461064357806362bb7533146106b557806362c5aecc146106c8578063685e7fc2146106ed578063690d986b146107005780636c0f79b61461072f5780636c3aacf9146107875780636cf69811146107f1578063744fa2c81461081d57806374d88c50146108425780637a03b624146108675780637cd442721461087a5780637f18b569146108a55780638108592c146108b857806384d062b4146108ce578063853717bb146108fc578063860aefcf146109125780638b7d6b05146109505780638fb2fbe11461096f57806390f3dd331461099d57806392418cf6146109d4578063971e668f146109ea5780639d0d647314610a185780639ebbf23114610a465780639f7ba82814610a59578063a9055b8114610a78578063abdde3d114610a97578063b7b2c52514610ab3578063ba6b0fa014610ac6578063bc1f71e114610ae5578063c01a3cd214610b07578063c444214a14610b2c578063d11dfdec14610b3f578063d4fac45d14610b52578063e1c7392a14610b77578063e934853214610b8a578063f2e9135014610b9d578063f67e8db214610cec578063f719254d14610cff578063fe459fdf14610d1b575b600080fd5b34156102aa57600080fd5b6102b2610d2e565b60405190815260200160405180910390f35b34156102cf57600080fd5b6102f26001608060020a036004358116906024351663ffffffff60443516610d33565b604051901515815260200160405180910390f35b341561031157600080fd5b6102b2600435610d71565b341561032757600080fd5b61034a63ffffffff600435166001608060020a0360243581169060443516610dfa565b60405163ffffffff909116815260200160405180910390f35b341561036e57600080fd5b6102b2600160a060020a0360043516610f4f565b341561038d57600080fd5b6103a1600160a060020a0360043516610f61565b60405163ffffffff909216825260208201526040908101905180910390f35b34156103cb57600080fd5b6103e2600160a060020a0360043516602435610f83565b005b34156103ef57600080fd5b6102b26110aa565b341561040257600080fd5b6103e26004356110b0565b341561041857600080fd5b61034a6001608060020a0360043581169060243516611156565b341561043d57600080fd5b6102b26111f5565b341561045057600080fd5b6103e26004356111fa565b341561046657600080fd5b6102f26004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506112e095505050505050565b6103e2600160a060020a0360043516611435565b34156105c957600080fd5b6102b26114ba565b34156105dc57600080fd5b6103a1600160a060020a03600435166114bf565b34156105fb57600080fd5b6102f263ffffffff6004358116906001608060020a0360243581169160443590911690606435166114e1565b341561063257600080fd5b6102f263ffffffff60043516611508565b341561064e57600080fd5b610662600160a060020a0360043516611528565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156106a1578082015183820152602001610689565b505050509050019250505060405180910390f35b34156106c057600080fd5b6106626115ea565b34156106d357600080fd5b61034a6001608060020a036004358116906024351661160d565b34156106f857600080fd5b6102b2611689565b341561070b57600080fd5b610713611690565b604051600160a060020a03909116815260200160405180910390f35b341561073a57600080fd5b61074261169f565b604051600160a060020a0396871681529486166020860152928516604080860191909152918516606085015284166080840152921660a082015260c001905180910390f35b341561079257600080fd5b6107a363ffffffff600435166116d1565b604051600160a060020a0390951685526001608060020a0393841660208601529190921660408085019190915263ffffffff92831660608501529116608083015260a0909101905180910390f35b6102f2600160a060020a03600435811690602435906044358116906064351660843560a4351515611772565b341561082857600080fd5b6102f26001608060020a0360043581169060243516611a64565b341561084d57600080fd5b6102f26001608060020a0360043581169060243516611a79565b341561087257600080fd5b6102b2611a87565b341561088557600080fd5b6102b2600160a060020a0360043581169060243516604435606435611a8c565b34156108b057600080fd5b6103e2611d09565b34156108c357600080fd5b6102b2600435611d83565b34156108d957600080fd5b6102f263ffffffff600435166001608060020a0360243581169060443516611d97565b341561090757600080fd5b6102b2600435611da6565b341561091d57600080fd5b610925611dc3565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b341561095b57600080fd5b6102b2600160a060020a0360043516611dd2565b341561097a57600080fd5b61034a63ffffffff600435166001608060020a0360243581169060443516611e2f565b34156109a857600080fd5b6102f263ffffffff6004358116906001608060020a036024358116916044359091169060643516611f38565b34156109df57600080fd5b6103e2600435611f48565b34156109f557600080fd5b6102f263ffffffff600435166001608060020a0360243581169060443516612029565b3415610a2357600080fd5b6102f26001608060020a036004358116906024351663ffffffff6044351661204d565b3415610a5157600080fd5b6102f2612080565b3415610a6457600080fd5b610662600160a060020a0360043516612162565b3415610a8357600080fd5b6102b2600160a060020a036004351661221c565b3415610aa257600080fd5b6107a363ffffffff6004351661223e565b3415610abe57600080fd5b61034a6114ba565b3415610ad157600080fd5b6102b2600160a060020a036004351661229b565b3415610af057600080fd5b6103e2600160a060020a03600435166024356122ad565b3415610b1257600080fd5b6102b2600160a060020a036004358116906024351661251d565b3415610b3757600080fd5b6102b261253a565b3415610b4a57600080fd5b61034a612540565b3415610b5d57600080fd5b6102b2600160a060020a0360043581169060243516612545565b3415610b8257600080fd5b6102f26125f0565b3415610b9557600080fd5b6102f261278e565b3415610ba857600080fd5b6102f260046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061280095505050505050565b3415610cf757600080fd5b6106626128de565b3415610d0a57600080fd5b6102f263ffffffff600435166128fb565b3415610d2657600080fd5b610713612908565b602081565b600160a060020a03331660009081526013602052604081208190610d5690612917565b9050610d6660018287878761295c565b91505b509392505050565b60085460009069021e19e0c9bab240000090600160a060020a0316633012541683604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610dc757600080fd5b6102c65a03f11515610dd857600080fd5b50505060405180519050601154840202811515610df157fe5b0490505b919050565b60008060008060006002800154876001608060020a031610151515610e1e57600080fd5b600d54600160a060020a03166385fcb4a8888860006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b1515610e7f57600080fd5b6102c65a03f11515610e9057600080fd5b5050506040518051905093508763ffffffff168463ffffffff161415610f4357600d54600160a060020a03166361592b8589600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b1515610f0357600080fd5b6102c65a03f11515610f1457600080fd5b505050604051805190602001805190602001805190602001805190602001805191985093965091945090925050505b50919695505050505050565b600f6020526000908152604090205481565b6012602052600090815260409020805460019091015463ffffffff9091169082565b600160a060020a0382161515610f9857600080fd5b6b204fce5e3e250261100000008110610fb057600080fd5b600754600160a060020a03166323b872dd33308460006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561101c57600080fd5b6102c65a03f1151561102d57600080fd5b50505060405180519050151561104257600080fd5b600160a060020a038083166000818152600e602090815260408083206007549095168352939052829020805484019055907fbc7c8a4d8049a3f99a02f2a20640c206a2e4d3f2fa54fd20da9f01fda3620cda9083905190815260200160405180910390a25050565b60015481565b33600160a060020a0381166000908152600e602090815260408083206000805160206141788339815191528452909152902054828110156110f057600080fd5b600160a060020a0382166000818152600e602090815260408083206000805160206141788339815191528452909152908190208054869003905584156108fc0290859051600060405180830381858888f19350505050151561115157600080fd5b505050565b6004546000906001608060020a038316101561117157600080fd5b600c54600160a060020a03166385fcb4a8848460006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b15156111d257600080fd5b6102c65a03f115156111e357600080fd5b50505060405180519150505b92915050565b600581565b33600160a060020a038181166000908152600e60209081526040808320600754909416835292905220548281101561123157600080fd5b600160a060020a038083166000908152600e60209081526040808320600780548616855292528083208054889003905590549092169163a9059cbb918591879190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156112ba57600080fd5b6102c65a03f115156112cb57600080fd5b50505060405180519050151561115157600080fd5b600080600080600086518a51146112f657600080fd5b87518a511461130457600080fd5b88518a511461131257600080fd5b85518a511461132057600080fd5b5033925060009050805b89518110156114255785818151811061133f57fe5b906020019060200201516113685786818151811061135957fe5b9060200190602002015161136a565b815b92506113c48a828151811061137b57fe5b906020019060200201516113a657600160a060020a03851660009081526012602052604090206113bf565b600160a060020a03851660009081526013602052604090205b612917565b91506114128a82815181106113d557fe5b90602001906020020151838b84815181106113ec57fe5b906020019060200201518b858151811061140257fe5b906020019060200201518761295c565b151561141d57600080fd5b60010161132a565b5060019998505050505050505050565b600160a060020a038116151561144a57600080fd5b600160a060020a0381166000818152600e602090815260408083206000805160206141788339815191528452909152908190208054349081019091557f939e51ac2fd009b158d6344f7e68a83d8d18d9b0cc88cf514aac6aaa9cad2a18915190815260200160405180910390a250565b600281565b6013602052600090815260409020805460019091015463ffffffff9091169082565b60006114f1600186868686612be8565b15156114fc57600080fd5b5060015b949350505050565b6000611515600083612f0b565b151561152057600080fd5b506001919050565b61153061407b565b600160a060020a03821660009081526013602052604081209080611553836130cc565b6040518059106115605750595b9080825280602002602001820160405250935060009150600090505b60208163ffffffff1610156115e25760008163ffffffff1660019060020a0284600101541611156115da578254600183019263ffffffff9091168201908590815181106115c557fe5b63ffffffff9092166020928302909101909101525b60010161157c565b505050919050565b6115f261407b565b600c54600160a060020a0316611607816130fe565b91505090565b6004546000906001608060020a038416101561162857600080fd5b600d54600160a060020a03166385fcb4a8848460006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b15156111d257600080fd5b620186a081565b600c54600160a060020a031681565b600654600754600854600954600a54600b54600160a060020a0395861695948516949384169392831692918216911686565b600c546000908190819081908190600160a060020a03166361592b85878360405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b151561172e57600080fd5b6102c65a03f1151561173f57600080fd5b5050506040518051906020018051906020018051906020018051906020018051949b939a50919850965091945092505050565b600954600090819033600160a060020a0390811691161461179257600080fd5b600160a060020a03881660008051602061417883398151915214806117cd5750600160a060020a038616600080516020614178833981519152145b15156117d857600080fd5b600754600160a060020a03898116911614806118015750600754600160a060020a038781169116145b151561180c57600080fd5b6b204fce5e3e2502611000000087111561182557600080fd5b600160a060020a03881660008051602061417883398151915214156118555734871461185057600080fd5b6118f0565b341561186057600080fd5b87600160a060020a03166323b872dd33308a60006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b15156118ca57600080fd5b6102c65a03f115156118db57600080fd5b5050506040518051905015156118f057600080fd5b6118fb8888886132bc565b9050611919878261190b8b6134b0565b6119148a6134b0565b613564565b84111561192557600080fd5b600160a060020a038616600080516020614178833981519152141561197a57600160a060020a03851681156108fc0282604051600060405180830381858888f19350505050151561197557600080fd5b6119fd565b85600160a060020a031663a9059cbb868360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156119d757600080fd5b6102c65a03f115156119e857600080fd5b5050506040518051905015156119fd57600080fd5b7f36cfc7e9779b5ccf22f92f2f0d9adf9c74df05ab07de27c8cb508020389f9adc88878984604051600160a060020a0394851681529290931660208301526040808301919091526060820192909252608001905180910390a1506001979650505050505050565b6000611a728383600061204d565b9392505050565b6000611a7283836000610d33565b606481565b6000806000611a9961408d565b60008080600160a060020a038b166000805160206141788339815191521480611ad85750600160a060020a038a16600080516020614178833981519152145b1515611ae357600080fd5b600754600160a060020a038c811691161480611b0c5750600754600160a060020a038b81169116145b1515611b1757600080fd5b6b204fce5e3e25026110000000891115611b3057600080fd5b611b3861278e565b80611b41575088155b15611b4f5760009650611cfb565b600160a060020a038b1660008051602061417883398151915214611b7e57600d54600160a060020a0316611b8b565b600c54600160a060020a03165b600354909650899350600092509050600160a060020a03861663a3fb591783604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b1515611bde57600080fd5b6102c65a03f11515611bef57600080fd5b5050506040518051906020018051151560408701525094505b6000836001608060020a0316118015611c2357508360400151155b8015611c355750600019810190600090115b15611cc057611c4486866135ff565b9350826001608060020a031684608001516001608060020a031611611c7a57836060015182019150836080015183039250611cb4565b83608001516001608060020a0316836001608060020a031685606001516001608060020a031602811515611caa57fe5b0482019150600092505b83602001519450611c08565b6001608060020a03831615611cd85760009650611cfb565b611cf889836001608060020a0316611cef8e6134b0565b6119148e6134b0565b96505b505050505050949350505050565b600854600090600160a060020a0316633012541682604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611d5357600080fd5b6102c65a03f11515611d6457600080fd5b505050604051805190509050600154811015611d805760018190555b50565b60006005611d9083611da6565b0292915050565b600061150084848460006114e1565b60015460115460009169021e19e0c9bab240000091840202610df1565b60025460035460045460055484565b600080611dde8361221c565b600160a060020a0384166000908152600f6020526040902054909150811115611e0a5760009150611e29565b600160a060020a0383166000908152600f602052604090205481900391505b50919050565b60008060008060006002800154866001608060020a031610151515611e5357600080fd5b600c54600160a060020a03166385fcb4a8888860006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b1515611eb457600080fd5b6102c65a03f11515611ec557600080fd5b5050506040518051905093508763ffffffff168463ffffffff161415610f4357600c54600160a060020a03166361592b8589600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b1515610f0357600080fd5b60006114f1600086868686612be8565b33600160a060020a0381166000908152600f602052604090205482901015611f6f57600080fd5b81611f7982611dd2565b1015611f8457600080fd5b600160a060020a038082166000908152600f6020526040808220805486900390556006549092169163a9059cbb918491869190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611fff57600080fd5b6102c65a03f1151561201057600080fd5b50505060405180519050151561202557600080fd5b5050565b60006120388484846000611f38565b151561204357600080fd5b5060019392505050565b600160a060020a0333166000908152601260205260408120819061207090612917565b9050610d6660008287878761295c565b600a546000908190819081908190600160a060020a03166359e02dd782604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b15156120d157600080fd5b6102c65a03f115156120e257600080fd5b50505060405180519060200180519195509093505082151561210357600080fd5b670de0b6b3a76400008404915081151561211c57600080fd5b620186a0821061212b57600080fd5b60025484906ec097ce7bc90715b34b9f10000000000281151561214a57fe5b04600481905560029004600555506001949350505050565b61216a61407b565b600160a060020a0382166000908152601260205260408120908061218d836130cc565b60405180591061219a5750595b9080825280602002602001820160405250935060009150600090505b60208163ffffffff1610156115e25760008163ffffffff1660019060020a028460010154161115612214578254600183019263ffffffff9091168201908590815181106121ff57fe5b63ffffffff9092166020928302909101909101525b6001016121b6565b600160a060020a0381166000908152601060205260408120546111ef90611d83565b600d546000908190819081908190600160a060020a03166361592b85878360405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b151561172e57600080fd5b60106020526000908152604090205481565b600160a060020a03821615156122c257600080fd5b6b204fce5e3e2502611000000081106122da57600080fd5b600654600160a060020a03166323b872dd33308460006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561234657600080fd5b6102c65a03f1151561235757600080fd5b50505060405180519050151561236c57600080fd5b600160a060020a0382166000818152600f6020526040908190208054840190557f7616f7b36d352f805882b5e6af4b72e6d1f325e5d73feef17ba9f064468498769083905190815260200160405180910390a2600160a060020a03821660009081526012602052604090206123e0906136d9565b1561247e57600160a060020a038083166000908152601260209081526040808320600c54612473959194911692631f38c35892909190516020015260405163ffffffff83811660e060020a028252919091166004820152602401602060405180830381600087803b151561245357600080fd5b6102c65a03f1151561246457600080fd5b505050604051805190506136fa565b151561247e57600080fd5b600160a060020a038216600090815260136020526040902061249f906136d9565b1561202557600160a060020a038083166000908152601360209081526040808320600d54612512959194911692631f38c35892909190516020015260405163ffffffff83811660e060020a028252919091166004820152602401602060405180830381600087803b151561245357600080fd5b151561202557600080fd5b600e60209081526000928352604080842090915290825290205481565b60115481565b600181565b6000600160a060020a03831660008051602061417883398151915214156125775750600160a060020a038116316111ef565b82600160a060020a03166370a082318360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156125ce57600080fd5b6102c65a03f115156125df57600080fd5b5050506040518051905090506111ef565b600c54600090600160a060020a0316158015906126175750600d54600160a060020a031615155b156126245750600161278b565b600c54600160a060020a03161515806126475750600d54600160a060020a031615155b1561265157600080fd5b600b54600160a060020a031663fccf6e673060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156126aa57600080fd5b6102c65a03f115156126bb57600080fd5b5050506040518051600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03928316179055600b5416905063fccf6e673060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561273f57600080fd5b6102c65a03f1151561275057600080fd5b5050506040518051600d805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905550600190505b90565b60015460085460009160050290600160a060020a0316633012541683604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156127df57600080fd5b6102c65a03f115156127f057600080fd5b5050506040518051905011905090565b600080855187511461281157600080fd5b845187511461281f57600080fd5b835187511461282d57600080fd5b825187511461283b57600080fd5b5060005b86518110156128d1576128be87828151811061285757fe5b9060200190602002015187838151811061286d57fe5b9060200190602002015187848151811061288357fe5b9060200190602002015187858151811061289957fe5b906020019060200201518786815181106128af57fe5b90602001906020020151612be8565b15156128c957600080fd5b60010161283f565b5060019695505050505050565b6128e661407b565b600d54600160a060020a0316611607816130fe565b6000611515600183612f0b565b600d54600160a060020a031681565b600180820154600091825b602081101561029a57828216151561294d578282176001860155845463ffffffff16810193506115e2565b60029190910290600101612922565b60008080806b204fce5e3e250261100000006001608060020a0388161061298257600080fd5b6b204fce5e3e250261100000006001608060020a038716106129a357600080fd5b3392506129b2838a8989613736565b15156129bd57600080fd5b6129da876001608060020a0316876001608060020a03168b6137a3565b15156129e557600080fd5b60009150886129ff57600c54600160a060020a0316612a0c565b600d54600160a060020a03165b905063ffffffff851615612abb5780600160a060020a031663a5da0bf5848a8a8a8a60006040516020015260405163ffffffff87811660e060020a028252600160a060020a0396909616600482015293851660248501526001608060020a03928316604485015291166064830152909116608482015260a401602060405180830381600087803b1515612a9e57600080fd5b6102c65a03f11515612aaf57600080fd5b50505060405180519250505b811515612b655780600160a060020a031663c92ba8b2848a8a8a60006040516020015260405163ffffffff86811660e060020a028252600160a060020a039590951660048201529290931660248301526001608060020a0390811660448301529091166064820152608401602060405180830381600087803b1515612b3f57600080fd5b6102c65a03f11515612b5057600080fd5b505050604051805190501515612b6557600080fd5b82600160a060020a03167f2fb3fe66d41cb2d1b0d335656d86e7c779ebdc34c6f6fc806d35790a30be0e6d898b8a8a8760405163ffffffff909516855292151560208501526001608060020a0391821660408086019190915291166060840152901515608083015260a0909101905180910390a250600198975050505050505050565b6000808080808080806b204fce5e3e250261100000006001608060020a038c1610612c1257600080fd5b6b204fce5e3e250261100000006001608060020a038b1610612c3357600080fd5b612c508b6001608060020a03168b6001608060020a03168f6137a3565b1515612c5b57600080fd5b8c612c7157600c54600160a060020a0316612c7e565b600d54600160a060020a03165b915081600160a060020a03166361592b858d600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b1515612cd157600080fd5b6102c65a03f11515612ce257600080fd5b505050604051805190602001805190602001805190602001805190602001805150939a5090985090965094505033600160a060020a0390811690881614612d2857600080fd5b612d36878e87898f8f613815565b1515612d455760009750612efb565b50600063ffffffff891615612dec5781600160a060020a031663a590529e8d8d8d8d60006040516040015260405163ffffffff86811660e060020a02825294851660048201526001608060020a039384166024820152919092166044820152911660648201526084016040805180830381600087803b1515612dc657600080fd5b6102c65a03f11515612dd757600080fd5b50505060405180519060200180519450909150505b801515612e825781600160a060020a031663cb2f7b878d8d8d60006040516020015260405163ffffffff85811660e060020a0282529390931660048401526001608060020a039182166024840152166044820152606401602060405180830381600087803b1515612e5c57600080fd5b6102c65a03f11515612e6d57600080fd5b505050604051805190501515612e8257600080fd5b86600160a060020a03167f2bf327e052ee7ab98550e3d864a5b2a61f7737dc75cbcaada4e55f88222ebbd78e8e8e8e86604051941515855263ffffffff90931660208501526001608060020a0391821660408086019190915291166060840152901515608083015260a0909101905180910390a2600197505b5050505050505095945050505050565b6000806000612f1861408d565b600033935086612f3357600c54600160a060020a0316612f40565b600d54600160a060020a03165b9250612f4c83876135ff565b9150600160a060020a0384168251600160a060020a031614612f6d57600080fd5b86612f7c578160800151612f82565b81606001515b6001608060020a03169050612f99848260006138c7565b1515612fa457600080fd5b612fd5838589612fbf57600754600160a060020a0316612fcf565b6000805160206141788339815191525b896139a2565b1515612fe057600080fd5b8160600151600160a060020a0385166000908152600e602052604081206001608060020a039290921691908961302157600754600160a060020a0316613031565b6000805160206141788339815191525b600160a060020a0390811682526020820192909252604001600020805490920190915584167f179f16fddc625e40df9cb92cfcea70d64a6262c82b7a769e52996b1ff511ff56888860608601518660800151604051931515845263ffffffff90921660208401526001608060020a03908116604080850191909152911660608301526080909101905180910390a25060019695505050505050565b6000805b6020811015611e295760008160019060020a0284600101541611156130f6576001909101905b6001016130d0565b61310661407b565b61310e61408d565b60008060008086600160a060020a031663a3fb59176000604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b151561315957600080fd5b6102c65a03f1151561316a57600080fd5b50505060405180519060200180519195509093505082156131ac5760006040518059106131945750595b908082528060200260200182016040525095506132b2565b600091505b846040015115156131da576131c687856135ff565b9450600190910190602085015193506131b1565b816040518059106131e85750595b9080825280602002602001820160405250955086600160a060020a031663a3fb59176000604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b151561324057600080fd5b6102c65a03f1151561325157600080fd5b505050604051805190602001805115156040880152509350600090505b818110156132b2578386828151811061328357fe5b63ffffffff9092166020928302909101909101526132a187856135ff565b94508460200151935060010161326e565b5050505050919050565b60008060006132c961408d565b60008080600160a060020a038a16600080516020614178833981519152146132fc57600d54600160a060020a0316613309565b600c54600160a060020a03165b95508892506000915085600160a060020a031663a3fb59176000604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b151561335757600080fd5b6102c65a03f1151561336857600080fd5b5050506040518051906020018051151560408701525094505b6000836001608060020a031611801561339c57508360400151155b1561346f576133ab86866135ff565b9350826001608060020a031684608001516001608060020a031611613403578360600151820191508360800151909203916133f38451868c8b88608001518960600151613a7b565b15156133fe57600080fd5b613463565b83608001516001608060020a0316836001608060020a031685606001516001608060020a03160281151561343357fe5b049182019190506134538451868c8b87868a606001518b60800151613b70565b151561345e57600080fd5b600092505b83602001519450613381565b6001608060020a03831615801561348f57506000826001608060020a0316115b151561349a57600080fd5b506001608060020a031698975050505050505050565b600080600160a060020a03831660008051602061417883398151915214156134db5760129150611e29565b50600160a060020a0382166000908152602081905260409020548015156111ef5782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561354257600080fd5b6102c65a03f1151561355357600080fd5b505050604051805190509150611e29565b60006b204fce5e3e2502611000000085111561357f57600080fd5b6b204fce5e3e2502611000000084111561359857600080fd5b8282106135d357601283830311156135af57600080fd5b84838303600a0a02670de0b6b3a764000085028115156135cb57fe5b049050611500565b601282840311156135e357600080fd5b84828403600a0a670de0b6b3a76400008602028115156135cb57fe5b61360761408d565b600083600160a060020a03166361592b8584600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b151561365a57600080fd5b6102c65a03f1151561366b57600080fd5b505050604051805190602001805190602001805190602001805190602001805163ffffffff16602088019081526001608060020a039384166080890152939092166060870152600160a060020a039093168552509091506001905163ffffffff161460408301525092915050565b805460009063ffffffff1615156136f257506001610df5565b506000919050565b815460009063ffffffff1681901115613715575060006111ef565b50815463ffffffff191663ffffffff91909116178155600060019182015590565b600080846137445782613746565b835b6004546001608060020a0391909116915081101561376357600080fd5b6137778686866001608060020a0316613dd3565b151561378257600080fd5b61378c8682613ea9565b151561379757600080fd5b50600195945050505050565b60008082156137d7576007546137d090859087906137c990600160a060020a03166134b0565b6012613564565b90506137fa565b6007546137f7908590879060129061191490600160a060020a03166134b0565b90505b69d3c21bcecceda10000008111156114fc5760009150610d69565b6000806000876138255783613827565b845b6001608060020a031691508761385157856001608060020a0316846001608060020a031603613867565b866001608060020a0316856001608060020a0316035b60045490915082101561387957600080fd5b6138988989896001608060020a0316886001608060020a031603613dd3565b15156138a357600080fd5b6138ad8982613ea9565b15156138b857600080fd5b50600198975050505050505050565b600080838311156138d757600080fd5b600160a060020a03851660009081526010602052604090205484111561391557600160a060020a038516600090815260106020526040812055613935565b600160a060020a0385166000908152601060205260409020805485900390555b8215156139455760019150610d69565b61394e83610d71565b600160a060020a0386166000908152600f60205260409020549091508190101561397757600080fd5b600160a060020a0385166000908152600f602052604090208054829003905560019150509392505050565b60008085600160a060020a031662d84fd88460006040516020015260405163ffffffff83811660e060020a028252919091166004820152602401602060405180830381600087803b15156139f557600080fd5b6102c65a03f11515613a0657600080fd5b505050604051805190501515613a1b57600080fd5b600160a060020a03841660008051602061417883398151915214613a5657600160a060020a0385166000908152601260205260409020613a6f565b600160a060020a03851660009081526013602052604090205b905061378c8184613f90565b600080600160a060020a03861660008051602061417883398151915214613aad57600d54600160a060020a0316613aba565b600c54600160a060020a03165b9050613ac88189878a6139a2565b1515613ad357600080fd5b7ffc2eaa59b7259e4eb0ce92d7a86fce8b0fb67fade6f9f69df98f4771035a50c28888600160a060020a03891660008051602061417883398151915214604051600160a060020a03909316835263ffffffff909116602083015215156040808301919091526060909101905180910390a1613b648887866001608060020a0316866001608060020a0316600061400d565b98975050505050505050565b6000808080806001608060020a03808716908a1610613b8e57600080fd5b6001608060020a0380881690891610613ba657600080fd5b95879003959488900394600160a060020a038b1660008051602061417883398151915214613bdf57600d54600160a060020a0316613bec565b600c54600160a060020a03165b9350600160a060020a038b1660008051602061417883398151915214613c125786613c14565b855b6001608060020a0316925060009150600260030154831015613c8357600160a060020a03808e166000908152600e60209081526040808320938e1683529290522080546001608060020a038916019055829150613c73848e8c8f6139a2565b1515613c7e57600080fd5b613d26565b83600160a060020a031663a590529e8d8989600260006040516040015260405163ffffffff86811660e060020a02825294851660048201526001608060020a039384166024820152919092166044820152911660648201526084016040805180830381600087803b1515613cf657600080fd5b6102c65a03f11515613d0757600080fd5b50505060405180519060200180515090915050801515613d2657600080fd5b7fd499cca7d46b5236c2cb522ceec930ccf485eefca1f0472c020a1b7328bf06438d8d600160a060020a038e166000805160206141788339815191521460008611604051600160a060020a03909416845263ffffffff9092166020840152151560408084019190915290151560608301526080909101905180910390a1613dc28d8c8b6001608060020a03168b6001608060020a03168661400d565b9d9c50505050505050505050505050565b60008083613dec57600754600160a060020a0316613dfc565b6000805160206141788339815191525b90506000831215613e3e57600160a060020a038581166000908152600e60209081526040808320938516835292905290812080549185900390910190556114fc565b600160a060020a038086166000908152600e602090815260408083209385168352929052205483901015613e7157600080fd5b600160a060020a038086166000908152600e602090815260408083209385168352929052208054849003905560019150509392505050565b6000806000831215613f1e5750600160a060020a0383166000908152601060205260408120549083900390811115613ef65750600160a060020a0383166000908152601060205260409020545b600160a060020a03841660009081526010602052604090208054829003905560019150613f89565b600160a060020a038416600090815260106020526040902054613f42908401611d83565b600160a060020a0385166000908152600f60205260409020541015613f6657600080fd5b600160a060020a0384166000908152601060205260409020805484019055600191505b5092915050565b81546000908190819063ffffffff9081169085161015613faf57600080fd5b845463ffffffff90811660200190851610613fc957600080fd5b50508254600184015463ffffffff9182169184169190910390600282900a90600090821611613ff757600080fd5b6001808601805483191690559250505092915050565b600080600160a060020a038616600080516020614178833981519152146140345783614036565b845b600160a060020a038089166000908152600e60209081526040808320938b16835292905220805487019055905061407087848301836138c7565b979650505050505050565b60206040519081016040526000815290565b60a0604051908101604090815260008083526020830181905290820181905260608201819052608082015290565b600160a060020a03811660008051602061417883398151915214156140fb57600160a060020a038116600090815260208190526040902060129055611d80565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561414157600080fd5b6102c65a03f1151561415257600080fd5b5050506040518051600160a060020a03831660009081526020819052604090205550505600000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea165627a7a723058207eb541f3d1a2548f0c8d7e0ff28ca2edb63374d5242dead60640e16d719ac99d0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd2000000000000000000000000000E8d6b471e332F140e7d9dbB99E5E3822F728DA60000000000000000000000008007aa43792A392b221DC091bdb2191E5fF626d100000000000000000000000065bF64Ff5f51272f729BDcD7AcFB00677ced86Cd000000000000000000000000729d19f657bd0614b4985cf1d82531c67569197b000000000000000000000000aba982e0190e27a32400a622fe016a44c4ffab6800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000019
-----Decoded View---------------
Arg [0] : knc (address): 0xdd974D5C2e2928deA5F71b9825b8b646686BD200
Arg [1] : reserveToken (address): 0x0E8d6b471e332F140e7d9dbB99E5E3822F728DA6
Arg [2] : burner (address): 0x8007aa43792A392b221DC091bdb2191E5fF626d1
Arg [3] : network (address): 0x65bF64Ff5f51272f729BDcD7AcFB00677ced86Cd
Arg [4] : medianizer (address): 0x729D19f657BD0614b4985Cf1D82531c67569197B
Arg [5] : factory (address): 0xABa982e0190e27a32400a622fe016A44c4fFab68
Arg [6] : minNewOrderUsd (uint256): 1000
Arg [7] : maxOrdersPerTrade (uint256): 5
Arg [8] : burnFeeBps (uint256): 25
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd200
Arg [1] : 0000000000000000000000000E8d6b471e332F140e7d9dbB99E5E3822F728DA6
Arg [2] : 0000000000000000000000008007aa43792A392b221DC091bdb2191E5fF626d1
Arg [3] : 00000000000000000000000065bF64Ff5f51272f729BDcD7AcFB00677ced86Cd
Arg [4] : 000000000000000000000000729d19f657bd0614b4985cf1d82531c67569197b
Arg [5] : 000000000000000000000000aba982e0190e27a32400a622fe016a44c4ffab68
Arg [6] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000019
Deployed Bytecode Sourcemap
9722:37452:0:-;;;;;;;;;-1:-1:-1;;;9722:37452:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1297:36;;;;;;;;;;;;;;;;;;;;;;;;;;;21599:300;;;;;;;;;;-1:-1:-1;;;;;21599:300:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32449:202;;;;;;;;;;;;;;30528:529;;;;;;;;;;;;;;-1:-1:-1;;;;;30528:529:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11955:40;;;;;;;;;;-1:-1:-1;;;;;11955:40:0;;;;;12289:60;;;;;;;;;;-1:-1:-1;;;;;12289:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25368:313;;;;;;;;;;-1:-1:-1;;;;;25368:313:0;;;;;;;;;10774:38;;;;;;;;;;;;27335:301;;;;;;;;;;;;;;29499:238;;;;;;;;;;-1:-1:-1;;;;;29499:238:0;;;;;;;;;;9833:45;;;;;;;;;;;;27004:323;;;;;;;;;;;;;;22551:907;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22551:907:0;;-1:-1:-1;22551:907:0;;-1:-1:-1;;;;;;22551:907:0;25754:204;;-1:-1:-1;;;;;25754:204:0;;;;;10010:50;;;;;;;;;;;;12356:60;;;;;;;;;;-1:-1:-1;;;;;12356:60:0;;;;;24293:324;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24293:324:0;;;;;;;;;;;;;;;;27953:145;;;;;;;;;;;;;;;;32753:459;;;;;;;;;;-1:-1:-1;;;;;32753:459:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;34141:164:0;;;;;;;;;;;;29745:238;;;;;;;;;;-1:-1:-1;;;;;29745:238:0;;;;;;;;;;10125:45;;;;;;;;;;;;11746:40;;;;;;;;;;;;;;;-1:-1:-1;;;;;11746:40:0;;;;;;;;;;;;;;11537:34;;;;;;;;;;;;;;;-1:-1:-1;;;;;11537:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31065:317;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31065:317:0;;;;;-1:-1:-1;;;;;31065:317:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16793:1439;;-1:-1:-1;;;;;16793:1439:0;;;;;;;;;;;;;;;;;;;;;;;;20713:190;;;;;;;;;;-1:-1:-1;;;;;20713:190:0;;;;;;;;;;21401;;;;;;;;;;-1:-1:-1;;;;;21401:190:0;;;;;;;;;;9947:43;;;;;;;;;;;;14728:1957;;;;;;;;;;-1:-1:-1;;;;;14728:1957:0;;;;;;;;;;;;;;14443:277;;;;;;;;;;;;32123:139;;;;;;;;;;;;;;24058:227;;;;;;;;;;;;;;-1:-1:-1;;;;;24058:227:0;;;;;;;;;;32270:171;;;;;;;;;;;;;;11505:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31863:252;;;;;;;;;;-1:-1:-1;;;;;31863:252:0;;;;;29991:529;;;;;;;;;;;;;;-1:-1:-1;;;;;29991:529:0;;;;;;;;;;23725:325;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23725:325:0;;;;;;;;;;;;;;;;27644:301;;;;;;;;;;;;;;23466:251;;;;;;;;;;;;;;-1:-1:-1;;;;;23466:251:0;;;;;;;;;;20911:301;;;;;;;;;;-1:-1:-1;;;;;20911:301:0;;;;;;;;;;;;;;28258:835;;;;;;;;;;;;33314:459;;;;;;;;;;-1:-1:-1;;;;;33314:459:0;;;;;31715:140;;;;;;;;;;-1:-1:-1;;;;;31715:140:0;;;;;31390:317;;;;;;;;;;;;;;;;10316:34;;;;;;;;;;;;12033:51;;;;;;;;;;-1:-1:-1;;;;;12033:51:0;;;;;26110:886;;;;;;;;;;-1:-1:-1;;;;;26110:886:0;;;;;;;11860:62;;;;;;;;;;-1:-1:-1;;;;;11860:62:0;;;;;;;;;;12153:27;;;;;;;;;;;;10233:34;;;;;;;;;;;;7454:213;;;;;;;;;;-1:-1:-1;;;;;7454:213:0;;;;;;;;;;14027:408;;;;;;;;;;;;29310:181;;;;;;;;;;;;24625:670;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24625:670:0;;-1:-1:-1;24625:670:0;;-1:-1:-1;;;;;;24625:670:0;33875:164;;;;;;;;;;;;28106:144;;;;;;;;;;;;;;;;11793:40;;;;;;;;;;;;1297:36;1331:2;1297:36;:::o;21599:300::-;-1:-1:-1;;;;;21803:10:0;21781:33;21728:4;21781:33;;;:21;:33;;;;;21728:4;;21765:50;;:15;:50::i;:::-;21750:65;;21833:58;21842:4;21848:5;21855:9;21866;21877:13;21833:8;:58::i;:::-;21826:65;;21599:300;;;;;;;:::o;32449:202::-;32576:19;;32522:4;;32624:17;;-1:-1:-1;;;;;32576:19:0;:42;32522:4;32576:44;;;;;;;;;;-1:-1:-1;;;32576:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32558:15;;32546:9;:27;:74;:96;;;;;;;;32539:104;;32449:202;;;;:::o;30528:529::-;30668:6;30750:13;30829:11;30851:13;30875:11;30713:6;:25;;;30700:9;-1:-1:-1;;;;;30700:38:0;;;30692:47;;;;;;;;30766:14;;-1:-1:-1;;;;;30766:14:0;:30;30797:9;30808;30766:14;:52;;;;;;;-1:-1:-1;;;30766:52:0;;;;;;-1:-1:-1;;;;;30766:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30750:68;;30913:7;30903:17;;:6;:17;;;30899:125;;;30973:14;;-1:-1:-1;;;;;30973:14:0;:30;31004:7;30973:14;:39;;;;;;;;;;;-1:-1:-1;;;30973:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30937:75;;-1:-1:-1;30937:75:0;;-1:-1:-1;30937:75:0;;-1:-1:-1;30973:39:0;;-1:-1:-1;;;30899:125:0;-1:-1:-1;31043:6:0;;30528:529;-1:-1:-1;;;;;;30528:529:0:o;11955:40::-;;;;;;;;;;;;;:::o;12289:60::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;25368:313::-;-1:-1:-1;;;;;25444:19:0;;;;25436:28;;;;;;4873:6;25483:16;;25475:25;;;;;;25521:15;;-1:-1:-1;;;;;25521:15:0;:28;25550:10;25562:4;25568:6;25521:15;:54;;;;;;;-1:-1:-1;;;25521:54:0;;;;;;-1:-1:-1;;;;;25521:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25513:63;;;;;;;;-1:-1:-1;;;;;25589:17:0;;;;;;;:10;:17;;;;;;;;25607:15;;;;;25589:34;;;;;;;;:44;;;;;;:17;25644:29;;25627:6;;25644:29;;;;;;;;;;;;;25368:313;;:::o;10774:38::-;;;;:::o;27335:301::-;27407:10;-1:-1:-1;;;;;27451:17:0;;27391:13;27451:17;;;:10;:17;;;;;;;;-1:-1:-1;;;;;;;;;;;27451:36:0;;;;;;;;27508:25;;;;27500:34;;;;;;-1:-1:-1;;;;;27547:17:0;;;;;;:10;:17;;;;;;;;-1:-1:-1;;;;;;;;;;;27547:36:0;;;;;;;;;:46;;;;;;;27606:22;;;;;27587:6;;27606:22;;;;;;;;;;;;;;;;;;;;;;;;;27335:301;;;:::o;29499:238::-;29633:25;;29593:6;;-1:-1:-1;;;;;29620:38:0;;;;29612:47;;;;;;29677:14;;-1:-1:-1;;;;;29677:14:0;:30;29708:9;29719;29677:14;:52;;;;;;;-1:-1:-1;;;29677:52:0;;;;;;-1:-1:-1;;;;;29677:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29499:238:0;;;;;:::o;9833:45::-;9877:1;9833:45;:::o;27004:323::-;27076:10;-1:-1:-1;;;;;27120:17:0;;;27060:13;27120:17;;;:10;:17;;;;;;;;27138:15;;;;;27120:34;;;;;;;27175:25;;;;27167:34;;;;;;-1:-1:-1;;;;;27214:17:0;;;;;;;:10;:17;;;;;;;;27232:15;;;;;27214:34;;;;;;;:44;;;;;;;27279:15;;;;;;:24;;27225:5;;27252:6;;27214:17;27279:39;;;;;;-1:-1:-1;;;27279:39:0;;;;;;-1:-1:-1;;;;;27279:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27271:48;;;;;;;22551:907;22728:4;22999:13;23036;23060:12;23094:6;22781:13;:20;22758:12;:19;:43;22750:52;;;;;;22844:9;:16;22821:12;:19;:39;22813:48;;;;;;22903:9;:16;22880:12;:19;:39;22872:48;;;;;;22962:16;:23;22939:12;:19;:46;22931:55;;;;;;-1:-1:-1;23015:10:0;;-1:-1:-1;23075:1:0;;-1:-1:-1;23075:1:0;23089:338;23110:12;:19;23106:1;:23;23089:338;;;23160:16;23177:1;23160:19;;;;;;;;;;;;;;;;:46;;23190:13;23204:1;23190:16;;;;;;;;;;;;;;;;23160:46;;;23182:5;23160:46;23151:55;;23229:94;23245:12;23258:1;23245:15;;;;;;;;;;;;;;;;:77;;-1:-1:-1;;;;;23294:28:0;;;;;;:21;:28;;;;;23245:77;;;-1:-1:-1;;;;;23263:28:0;;;;;;:21;:28;;;;;23245:77;23229:15;:94::i;:::-;23221:102;;23346:68;23355:12;23368:1;23355:15;;;;;;;;;;;;;;;;23372:5;23379:9;23389:1;23379:12;;;;;;;;;;;;;;;;23393:9;23403:1;23393:12;;;;;;;;;;;;;;;;23407:6;23346:8;:68::i;:::-;23338:77;;;;;;;;23131:3;;23089:338;;;-1:-1:-1;23446:4:0;;22551:907;-1:-1:-1;;;;;;;;;22551:907:0:o;25754:204::-;-1:-1:-1;;;;;25825:19:0;;;;25817:28;;;;;;-1:-1:-1;;;;;25858:17:0;;;;;;:10;:17;;;;;;;;-1:-1:-1;;;;;;;;;;;25858:36:0;;;;;;;;;:49;;25898:9;25858:49;;;;;;25918:32;;;;;;;;;;;;;;;25754:204;:::o;10010:50::-;10059:1;10010:50;:::o;12356:60::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;24293:324::-;24487:4;24517:69;24529:4;24535:7;24544:12;24558;24572:13;24517:11;:69::i;:::-;24509:78;;;;;;;;-1:-1:-1;24605:4:0;24293:324;;;;;;;:::o;27953:145::-;28015:4;28040:27;28052:5;28059:7;28040:11;:27::i;:::-;28032:36;;;;;;;;-1:-1:-1;28086:4:0;27953:145;;;:::o;32753:459::-;32824:18;;:::i;:::-;-1:-1:-1;;;;;32889:28:0;;32855:31;32889:28;;;:21;:28;;;;;;32855:31;32953:33;32889:28;32953:20;:33::i;:::-;32940:47;;;;;;;;;;;;;;;;;;;;;;;;32928:59;;33017:1;32998:20;;33047:1;33036:12;;33031:174;1331:2;33050:1;:14;;;33031:174;;;33134:1;33129;33118:12;;33123:1;33118:12;;;;33091:11;:23;;;:40;:44;33086:107;;;33165:24;;;33148:13;;;33165:24;;;;:28;;;33138:9;;;:24;;;;;;;:55;;;;:24;;;;;;;;;;:55;33086:107;33066:3;;33031:174;;;32753:459;;;;;;:::o;34141:164::-;34195:18;;:::i;:::-;34252:14;;-1:-1:-1;;;;;34252:14:0;34284:13;34252:14;34284:7;:13::i;:::-;34277:20;;34141:164;;:::o;29745:238::-;29879:25;;29839:6;;-1:-1:-1;;;;;29866:38:0;;;;29858:47;;;;;;29923:14;;-1:-1:-1;;;;;29923:14:0;:30;29954:9;29965;29923:14;:52;;;;;;;-1:-1:-1;;;29923:52:0;;;;;;-1:-1:-1;;;;;29923:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10125:45;10164:6;10125:45;:::o;11746:40::-;;;-1:-1:-1;;;;;11746:40:0;;:::o;11537:34::-;;;;;;;;;;;;;-1:-1:-1;;;;;11537:34:0;;;;;;;;;;;;;;;;;;;;;;:::o;31065:317::-;31335:14;;31162;;;;;;;;;;-1:-1:-1;;;;;31335:14:0;:30;31366:7;31162:14;31335:39;;;;;;;;;;;-1:-1:-1;;;31335:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31328:46;;;;-1:-1:-1;31328:46:0;;-1:-1:-1;31328:46:0;-1:-1:-1;31335:39:0;;-1:-1:-1;31065:317:0;-1:-1:-1;;;31065:317:0:o;16793:1439::-;17067:22;;17023:4;;;;17053:10;-1:-1:-1;;;;;17053:36:0;;;17067:22;;17053:36;17045:45;;;;;;-1:-1:-1;;;;;17110:29:0;;-1:-1:-1;;;;;;;;;;;17110:29:0;;17109:66;;-1:-1:-1;;;;;;17145:29:0;;-1:-1:-1;;;;;;;;;;;17145:29:0;17109:66;17101:75;;;;;;;;17208:15;;-1:-1:-1;;;;;17196:27:0;;;17208:15;;17196:27;;17195:62;;-1:-1:-1;17241:15:0;;-1:-1:-1;;;;;17229:27:0;;;17241:15;;17229:27;17195:62;17187:71;;;;;;;;4873:6;17277:20;;;17269:29;;;;;;-1:-1:-1;;;;;17361:29:0;;-1:-1:-1;;;;;;;;;;;17361:29:0;17357:223;;;17415:9;:22;;17407:31;;;;;;17357:223;;;17479:9;:14;17471:23;;;;;;17517:8;-1:-1:-1;;;;;17517:21:0;;17539:10;17551:4;17557:9;17517:50;;;;;;;;-1:-1:-1;;;17517:50:0;;;;;;-1:-1:-1;;;;;17517:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17509:59;;;;;;;;17614:104;17640:8;17667:9;17695:8;17614:7;:104::i;:::-;17592:126;;17757:101;17773:9;17784:14;17800:21;17812:8;17800:11;:21::i;:::-;17836;17848:8;17836:11;:21::i;:::-;17757:15;:101::i;:::-;17739:119;;;17731:128;;;;;;-1:-1:-1;;;;;17942:29:0;;-1:-1:-1;;;;;;;;;;;17942:29:0;17938:184;;;-1:-1:-1;;;;;17988:19:0;;:35;;;;18008:14;17988:35;;;;;;;;;;;;;;;;;;;;;;;;;;17938:184;;;18064:8;-1:-1:-1;;;;;18064:17:0;;18082:10;18094:14;18064:45;;;;;;;;-1:-1:-1;;;18064:45:0;;;;;;-1:-1:-1;;;;;18064:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18056:54;;;;;;;;18134:68;18156:8;18166;18176:9;18187:14;18134:68;;-1:-1:-1;;;;;18134:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18220:4:0;;16793:1439;-1:-1:-1;;;;;;;16793:1439:0:o;20713:190::-;20815:4;20844:51;20871:9;20882;20893:1;20844:26;:51::i;:::-;20837:58;20713:190;-1:-1:-1;;;20713:190:0:o;21401:::-;21503:4;21532:51;21559:9;21570;21581:1;21532:26;:51::i;9947:43::-;9987:3;9947:43;:::o;14728:1957::-;14828:4;15290:23;15389:14;15414:26;;:::i;:::-;15453:27;;;-1:-1:-1;;;;;14854:24:0;;-1:-1:-1;;;;;;;;;;;14854:24:0;;14853:56;;-1:-1:-1;;;;;;14884:24:0;;-1:-1:-1;;;;;;;;;;;14884:24:0;14853:56;14845:65;;;;;;;;14937:15;;-1:-1:-1;;;;;14930:22:0;;;14937:15;;14930:22;;14929:52;;-1:-1:-1;14965:15:0;;-1:-1:-1;;;;;14958:22:0;;;14965:15;;14958:22;14929:52;14921:61;;;;;;;;4873:6;15001:17;;;14993:26;;;;;;15036:20;:18;:20::i;:::-;:37;;;-1:-1:-1;15061:11:0;;15036:37;15032:51;;;15082:1;15075:8;;;;15032:51;-1:-1:-1;;;;;15317:24:0;;-1:-1:-1;;;;;;;;;;;15317:24:0;15316:60;;15362:14;;-1:-1:-1;;;;;15362:14:0;15316:60;;;15345:14;;-1:-1:-1;;;;;15345:14:0;15316:60;15567:24;;15290:86;;-1:-1:-1;15491:6:0;;-1:-1:-1;15538:1:0;;-1:-1:-1;15567:24:0;-1:-1:-1;;;;;;15658:18:0;;;15538:1;15658:20;;;;;;;;;;-1:-1:-1;;;15658:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15623:55;;15633:21;;;15623:55;-1:-1:-1;15623:55:0;-1:-1:-1;15604:891:0;15717:1;15695:19;-1:-1:-1;;;;;15695:23:0;;15694:53;;;;;15725:9;:21;;;15724:22;15694:53;:74;;;;-1:-1:-1;;;15752:11:0;;;15766:1;15752:15;;15694:74;15604:891;;;15849:27;15862:4;15868:7;15849:12;:27::i;:::-;15837:39;;16110:19;-1:-1:-1;;;;;16087:42:0;:9;:19;;;-1:-1:-1;;;;;16087:42:0;;16083:401;;16172:9;:19;;;16150:41;;;;16233:9;:19;;;16210:42;;;;16083:401;;;16405:9;:19;;;-1:-1:-1;;;;;16400:25:0;16356:19;-1:-1:-1;;;;;16351:25:0;16328:9;:19;;;-1:-1:-1;;;;;16323:25:0;:53;:102;;;;;;;;16293:133;;;;16467:1;16445:23;;16083:401;15794:9;:16;;;15784:26;;15604:891;;;-1:-1:-1;;;;;16511:24:0;;;16507:38;;16544:1;16537:8;;;;16507:38;16598:79;16614:6;16622:18;-1:-1:-1;;;;;16598:79:0;16642:16;16654:3;16642:11;:16::i;:::-;16660;16672:3;16660:11;:16::i;16598:79::-;16591:86;;14728:1957;;;;;;;;;;;;;:::o;14443:277::-;14523:19;;14493:27;;-1:-1:-1;;;;;14523:19:0;:42;14493:27;14523:44;;;;;;;;;;-1:-1:-1;;;14523:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14493:74;;14607:26;;14582:22;:51;14578:135;;;14650:26;:51;;;14578:135;14443:277;:::o;32123:139::-;32181:4;9877:1;32205:25;32220:9;32205:14;:25::i;:::-;:48;;32123:139;-1:-1:-1;;32123:139:0:o;24058:227::-;24182:4;24211:66;24238:7;24247:12;24261;24275:1;24211:26;:66::i;32270:171::-;32384:26;;32366:15;;32330:4;;32414:17;;32354:27;;:56;:78;;11505:25;;;;;;;;;;:::o;31863:252::-;31925:4;31942:21;31966:28;31988:5;31966:21;:28::i;:::-;-1:-1:-1;;;;;32028:15:0;;;;;;:8;:15;;;;;;31942:52;;-1:-1:-1;32009:34:0;;32005:48;;;32052:1;32045:8;;;;32005:48;-1:-1:-1;;;;;32072:15:0;;;;;;:8;:15;;;;;;:34;;;;-1:-1:-1;31863:252:0;;;;;:::o;29991:529::-;30131:6;30213:13;30292:11;30314:13;30338:11;30176:6;:25;;;30163:9;-1:-1:-1;;;;;30163:38:0;;;30155:47;;;;;;;;30229:14;;-1:-1:-1;;;;;30229:14:0;:30;30260:9;30271;30229:14;:52;;;;;;;-1:-1:-1;;;30229:52:0;;;;;;-1:-1:-1;;;;;30229:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30213:68;;30376:7;30366:17;;:6;:17;;;30362:125;;;30436:14;;-1:-1:-1;;;;;30436:14:0;:30;30467:7;30436:14;:39;;;;;;;;;;;-1:-1:-1;;;30436:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23725:325;23919:4;23949:70;23961:5;23968:7;23977:12;23991;24005:13;23949:11;:70::i;27644:301::-;27717:10;-1:-1:-1;;;;;27756:15:0;;27701:13;27756:15;;;:8;:15;;;;;;:25;;;;27748:34;;;;;;27828:6;27801:23;27818:5;27801:16;:23::i;:::-;:33;;27793:42;;;;;;-1:-1:-1;;;;;27848:15:0;;;;;;;:8;:15;;;;;;:25;;;;;;;27894:9;:18;;;;;:27;;27857:5;;27867:6;;27848:15;27894:42;;;;;;-1:-1:-1;;;27894:42:0;;;;;;-1:-1:-1;;;;;27894:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27886:51;;;;;;;;27644:301;;:::o;23466:251::-;23590:4;23620:66;23647:7;23656:12;23670;23684:1;23620:26;:66::i;:::-;23612:75;;;;;;;;-1:-1:-1;23705:4:0;23466:251;;;;;:::o;20911:301::-;-1:-1:-1;;;;;21115:10:0;21093:33;21040:4;21093:33;;;:21;:33;;;;;21040:4;;21077:50;;:15;:50::i;:::-;21062:65;;21145:59;21154:5;21161;21168:9;21179;21190:13;21145:8;:59::i;28258:835::-;28440:20;;28303:4;;;;;;;;;;-1:-1:-1;;;;;28440:20:0;:25;28303:4;28440:27;;;;;;;;;;-1:-1:-1;;;28440:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28414:53;;-1:-1:-1;28440:27:0;;-1:-1:-1;;28478:14:0;;;;;;;;;28661:7;28642:14;28637:32;;-1:-1:-1;28688:14:0;;;28680:23;;;;;;10164:6;28722:27;;28714:36;;;;;;28841:6;:25;28898:14;;28841:49;;:72;;;;;;;;28926:25;:46;;;:6;29008:53;;28983:22;:78;-1:-1:-1;29081:4:0;;28258:835;-1:-1:-1;;;;28258:835:0:o;33314:459::-;33385:18;;:::i;:::-;-1:-1:-1;;;;;33450:28:0;;33416:31;33450:28;;;:21;:28;;;;;;33416:31;33514:33;33450:28;33514:20;:33::i;:::-;33501:47;;;;;;;;;;;;;;;;;;;;;;;;33489:59;;33578:1;33559:20;;33608:1;33597:12;;33592:174;1331:2;33611:1;:14;;;33592:174;;;33695:1;33690;33679:12;;33684:1;33679:12;;;;33652:11;:23;;;:40;:44;33647:107;;;33726:24;;;33709:13;;;33726:24;;;;:28;;;33699:9;;;:24;;;;;;;:55;;;;:24;;;;;;;;;;:55;33647:107;33627:3;;33592:174;;31715:140;-1:-1:-1;;;;;31819:26:0;;31782:4;31819:26;;;:19;:26;;;;;;31806:40;;:12;:40::i;31390:317::-;31660:14;;31487;;;;;;;;;;-1:-1:-1;;;;;31660:14:0;:30;31691:7;31487:14;31660:39;;;;;;;;;;;-1:-1:-1;;;31660:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12033:51;;;;;;;;;;;;;:::o;26110:886::-;-1:-1:-1;;;;;26190:19:0;;;;26182:28;;;;;;4873:6;26229:16;;26221:25;;;;;;26267:9;:18;-1:-1:-1;;;;;26267:18:0;:31;26299:10;26311:4;26317:6;26267:18;:57;;;;;;;-1:-1:-1;;;26267:57:0;;;;;;-1:-1:-1;;;;;26267:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26259:66;;;;;;;;-1:-1:-1;;;;;26338:15:0;;;;;;:8;:15;;;;;;;:25;;;;;;26376:30;;26357:6;;26376:30;;;;;;;;;;;;;-1:-1:-1;;;;;26447:28:0;;;;;;:21;:28;;;;;26423:53;;:23;:53::i;:::-;26419:279;;;-1:-1:-1;;;;;26536:28:0;;;;;;;:21;:28;;;;;;;;26601:14;;26501:184;;26536:28;;26601:14;;;:26;;26536:28;;;26601:46;;;;;;;;;;-1:-1:-1;;;26601:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26501:16;:184::i;:::-;26493:193;;;;;;;;-1:-1:-1;;;;;26738:28:0;;;;;;:21;:28;;;;;26714:53;;:23;:53::i;:::-;26710:279;;;-1:-1:-1;;;;;26827:28:0;;;;;;;:21;:28;;;;;;;;26892:14;;26792:184;;26827:28;;26892:14;;;:26;;26827:28;;;26892:46;;;;;;;;;;-1:-1:-1;;;26892:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26792:184;26784:193;;;;;;;11860:62;;;;;;;;;;;;;;;;;;;;;;;;:::o;12153:27::-;;;;:::o;10233:34::-;10266:1;10233:34;:::o;7454:213::-;7521:4;-1:-1:-1;;;;;7542:26:0;;-1:-1:-1;;;;;;;;;;;7542:26:0;7538:121;;;-1:-1:-1;;;;;;7590:12:0;;;7583:19;;7538:121;7638:5;-1:-1:-1;;;;;7638:15:0;;7654:4;7638:21;;;;;;;;-1:-1:-1;;;7638:21:0;;;;;;-1:-1:-1;;;;;7638:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7631:28;;;;14027:408;14080:14;;14058:4;;-1:-1:-1;;;;;14080:14:0;:28;;;;14079:64;;-1:-1:-1;14114:14:0;;-1:-1:-1;;;;;14114:14:0;:28;;14079:64;14075:81;;;-1:-1:-1;14152:4:0;14145:11;;14075:81;14172:14;;-1:-1:-1;;;;;14172:14:0;:28;;;14171:64;;-1:-1:-1;14206:14:0;;-1:-1:-1;;;;;14206:14:0;:28;;14171:64;14167:78;;;14237:8;;;14167:78;14275:26;;-1:-1:-1;;;;;14275:26:0;:44;14320:4;14275:26;:50;;;;;;;-1:-1:-1;;;14275:50:0;;;;;;-1:-1:-1;;;;;14275:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14258:14;:67;;-1:-1:-1;;14258:67:0;-1:-1:-1;;;;;14258:67:0;;;;;;14353:26;;;;-1:-1:-1;14353:44:0;14398:4;-1:-1:-1;14353:50:0;;;;;;;-1:-1:-1;;;14353:50:0;;;;;;-1:-1:-1;;;;;14353:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14336:14;:67;;-1:-1:-1;;14336:67:0;-1:-1:-1;;;;;14336:67:0;;;;;;;;;;-1:-1:-1;;;;14027:408:0;;:::o;29310:181::-;29433:26;;29386:19;;29361:4;;9877:1;29433:49;;-1:-1:-1;;;;;29386:19:0;:42;29361:4;29386:44;;;;;;;;;;-1:-1:-1;;;29386:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:96;29378:105;;29310:181;:::o;24625:670::-;24804:4;25077:6;24857:7;:14;24834:12;:19;:37;24826:46;;;;;;24914:12;:19;24891:12;:19;:42;24883:51;;;;;;24976:12;:19;24953:12;:19;:42;24945:51;;;;;;25038:13;:20;25015:12;:19;:43;25007:52;;;;;;-1:-1:-1;25086:1:0;25072:192;25093:12;:19;25089:1;:23;25072:192;;;25142:109;25154:12;25167:1;25154:15;;;;;;;;;;;;;;;;25171:7;25179:1;25171:10;;;;;;;;;;;;;;;;25183:12;25196:1;25183:15;;;;;;;;;;;;;;;;25200:12;25213:1;25200:15;;;;;;;;;;;;;;;;25234:13;25248:1;25234:16;;;;;;;;;;;;;;;;25142:11;:109::i;:::-;25134:118;;;;;;;;25114:3;;25072:192;;;-1:-1:-1;25283:4:0;;24625:670;-1:-1:-1;;;;;;24625:670:0:o;33875:164::-;33929:18;;:::i;:::-;33986:14;;-1:-1:-1;;;;;33986:14:0;34018:13;33986:14;34018:7;:13::i;28106:144::-;28168:4;28193:26;28205:4;28211:7;28193:11;:26::i;11793:40::-;;;-1:-1:-1;;;;;11793:40:0;;:::o;1342:515::-;1477:22;;;;;1434:6;;;1542:287;1331:2;1559:1;:14;1542:287;;;1602:24;;;1601:31;1597:189;;;1678:24;;;1653:22;;;:49;1740:23;;;;1735:33;;;-1:-1:-1;1721:49:0;;1597:189;1816:1;1802:15;;;;;1575:3;;1542:287;;34518:931;34664:4;;;;4873:6;-1:-1:-1;;;;;34694:19:0;;;34686:28;;;;;;4873:6;-1:-1:-1;;;;;34733:19:0;;;34725:28;;;;;;34780:10;34764:26;;34811:62;34831:5;34838:12;34852:9;34863;34811:19;:62::i;:::-;34803:71;;;;;;;;34893:53;34911:9;-1:-1:-1;;;;;34893:53:0;34922:9;-1:-1:-1;;;;;34893:53:0;34933:12;34893:17;:53::i;:::-;34885:62;;;;;;;;34981:5;34960:26;;35023:12;:46;;35055:14;;-1:-1:-1;;;;;35055:14:0;35023:46;;;35038:14;;-1:-1:-1;;;;;35038:14:0;35023:46;34997:72;-1:-1:-1;35086:18:0;;;;35082:133;;35137:4;-1:-1:-1;;;;;35137:15:0;;35153:5;35160;35167:9;35178;35189:13;35137:66;;;;;;;;;;;;-1:-1:-1;;;35137:66:0;;;-1:-1:-1;;;;;35137:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35137:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35082:133:0;35232:13;35231:14;35227:100;;;35270:4;-1:-1:-1;;;;;35270:8:0;;35279:5;35286;35293:9;35304;35270:44;;;;;;;;;;;;-1:-1:-1;;;35270:44:0;;;-1:-1:-1;;;;;35270:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35270:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35262:53;;;;;;;;35353:5;-1:-1:-1;;;;;35339:78:0;;35360:5;35367:12;35381:9;35392;35403:13;35339:78;;;;;;;;;;;;;;;-1:-1:-1;;;;;35339:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35437:4:0;;34518:931;-1:-1:-1;;;;;;;;34518:931:0:o;35661:1315::-;35827:4;;;;;;;;4873:6;-1:-1:-1;;;;;35857:22:0;;;35849:31;;;;;;4873:6;-1:-1:-1;;;;;35899:22:0;;;35891:31;;;;;;36076:59;36094:12;-1:-1:-1;;;;;36076:59:0;36108:12;-1:-1:-1;;;;;36076:59:0;36122:12;36076:17;:59::i;:::-;36068:68;;;;;;;;36175:12;:46;;36207:14;;-1:-1:-1;;;;;36207:14:0;36175:46;;;36190:14;;-1:-1:-1;;;;;36190:14:0;36175:46;36149:72;;36288:4;-1:-1:-1;;;;;36288:20:0;;36309:7;36288:29;;;;;;;;;;;;-1:-1:-1;;;36288:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36234:83:0;;-1:-1:-1;36234:83:0;;-1:-1:-1;36234:83:0;;-1:-1:-1;36234:83:0;-1:-1:-1;;36345:10:0;-1:-1:-1;;;;;36336:19:0;;;;;;;36328:28;;;;;;36374:101;36397:5;36404:12;36418:13;36433;36448:12;36462;36374:22;:101::i;:::-;36373:102;36369:147;;;36499:5;36492:12;;;;36369:147;-1:-1:-1;36551:5:0;36573:18;;;;36569:158;;36636:4;-1:-1:-1;;;;;36636:27:0;;36664:7;36673:12;36687;36701:13;36636:79;;;;;;;;;;;;-1:-1:-1;;;36636:79:0;;;;;;;;;;-1:-1:-1;;;;;36636:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36608:107:0;;-1:-1:-1;;36569:158:0;36744:15;36743:16;36739:106;;;36784:4;-1:-1:-1;;;;;36784:11:0;;36796:7;36805:12;36819;36784:48;;;;;;;;;;;;-1:-1:-1;;;36784:48:0;;;;;;;;;;;-1:-1:-1;;;;;36784:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36776:57;;;;;;;;36870:5;-1:-1:-1;;;;;36857:87:0;;36877:12;36891:7;36900:12;36914;36928:15;36857:87;;;;;;;;;;;;;;;-1:-1:-1;;;;;36857:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36964:4;36957:11;;35661:1315;;;;;;;;;;;;;;;:::o;37105:844::-;37178:4;37197:13;37234:23;37317:26;;:::i;:::-;37432:14;37213:10;37197:26;;37260:12;:46;;37292:14;;-1:-1:-1;;;;;37292:14:0;37260:46;;;37275:14;;-1:-1:-1;;;;;37275:14:0;37260:46;37234:72;;37346:27;37359:4;37365:7;37346:12;:27::i;:::-;37317:56;-1:-1:-1;;;;;;37394:24:0;;37317:56;37394:15;-1:-1:-1;;;;;37394:24:0;;37386:33;;;;;;37449:12;:56;;37486:9;:19;;;37449:56;;;37464:9;:19;;;37449:56;-1:-1:-1;;;;;37432:73:0;;;37524:39;37543:5;37550:9;37561:1;37524:18;:39::i;:::-;37516:48;;;;;;;;37585:85;37597:4;37603:5;37610:12;:50;;37645:15;;-1:-1:-1;;;;;37645:15:0;37610:50;;;-1:-1:-1;;;;;;;;;;;37610:50:0;37662:7;37585:11;:85::i;:::-;37577:94;;;;;;;;37800:9;:19;;;-1:-1:-1;;;;;37727:17:0;;;;;;:10;:17;;;;;-1:-1:-1;;;;;37727:92:0;;;;;:17;37745:12;:50;;37780:15;;-1:-1:-1;;;;;37780:15:0;37745:50;;;-1:-1:-1;;;;;;;;;;;37745:50:0;-1:-1:-1;;;;;37727:69:0;;;;;;;;;;;;;;-1:-1:-1;37727:69:0;:92;;;;;;;;37832:85;;;37853:12;37867:7;37876:19;;;;37897:9;:19;;;37832:85;;;;;;;;;;;;;;;-1:-1:-1;;;;;37832:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37937:4:0;;37105:844;-1:-1:-1;;;;;;37105:844:0:o;2986:260::-;3072:20;;3105:134;1331:2;3122:1;:14;3105:134;;;3207:1;3201;3195;3190:12;;;;3163:11;:23;;;:40;3162:46;3158:69;;;3210:17;;;;;3158:69;3138:3;;3105:134;;45430:788;45494:25;;:::i;:::-;45532:26;;:::i;:::-;45569:14;45594:12;45720:14;46035:6;45640:4;-1:-1:-1;;;;;45640:18:0;;:20;;;;;;;;;;;-1:-1:-1;;;45640:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45619:41;;-1:-1:-1;45640:20:0;;-1:-1:-1;;45671:36:0;;;;45704:1;45691:15;;;;;;;;;;;;;;;;;;;;;;;;45684:23;;;;45671:36;45737:1;45720:18;;45751:151;45759:9;:21;;;45758:22;45751:151;;;45837:27;45850:4;45856:7;45837:12;:27::i;:::-;45825:39;-1:-1:-1;45879:11:0;;;;;45792:16;;;;45782:26;;45751:151;;;45939:9;45926:23;;;;;;;;;;;;;;;;;;;;;;;;45914:35;;45997:4;-1:-1:-1;;;;;45997:18:0;;:20;;;;;;;;;;;-1:-1:-1;;;45997:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45962:55;;45972:21;;;45962:55;-1:-1:-1;45962:55:0;-1:-1:-1;46044:1:0;;-1:-1:-1;46030:181:0;46051:9;46047:1;:13;46030:181;;;46097:7;46082:9;46092:1;46082:12;;;;;;;;:22;;;;:12;;;;;;;;;;:22;46131:27;46144:4;46150:7;46131:12;:27::i;:::-;46119:39;;46183:9;:16;;;46173:26;-1:-1:-1;46062:3:0;;46030:181;;;45430:788;;;;;;;;:::o;18240:2263::-;18374:4;18396:23;18500:14;18525:26;;:::i;:::-;18562:27;;;-1:-1:-1;;;;;18423:29:0;;-1:-1:-1;;;;;;;;;;;18423:29:0;18422:65;;18473:14;;-1:-1:-1;;;;;18473:14:0;18422:65;;;18456:14;;-1:-1:-1;;;;;18456:14:0;18422:65;18396:91;;18600:9;18562:48;;18650:1;18621:30;;18718:4;-1:-1:-1;;;;;18718:18:0;;:20;;;;;;;;;;;-1:-1:-1;;;18718:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18683:55;;18693:21;;;18683:55;-1:-1:-1;18683:55:0;-1:-1:-1;18664:1722:0;18777:1;18755:19;-1:-1:-1;;;;;18755:23:0;;18754:53;;;;;18785:9;:21;;;18784:22;18754:53;18664:1722;;;19072:27;19085:4;19091:7;19072:12;:27::i;:::-;19060:39;;19141:19;-1:-1:-1;;;;;19118:42:0;:9;:19;;;-1:-1:-1;;;;;19118:42:0;;19114:1261;;19203:9;:19;;;19181:41;;;;19264:9;:19;;;19241:42;;;;19310:312;19354:9;:15;19401:7;19440:8;19480;19526:9;:19;;;19583:9;:19;;;19310:13;:312::i;:::-;19302:321;;;;;;;;19114:1261;;;19778:9;:19;;;-1:-1:-1;;;;;19773:25:0;19729:19;-1:-1:-1;;;;;19724:25:0;19701:9;:19;;;-1:-1:-1;;;;;19696:25:0;:53;:102;;;;;;;;19818:35;;;;19696:102;-1:-1:-1;19880:436:0;19927:9;:15;19974:7;20013:8;20053;20106:19;20167:13;20219:9;:19;;;20277:9;:19;;;19880:16;:436::i;:::-;19872:445;;;;;;;;20358:1;20336:23;;19114:1261;18833:9;:16;;;18823:26;;18664:1722;;;-1:-1:-1;;;;;20406:24:0;;;:50;;;;;20455:1;20434:18;-1:-1:-1;;;;;20434:22:0;;20406:50;20398:59;;;;;;;;-1:-1:-1;;;;;;20470:25:0;;18240:2263;-1:-1:-1;;;;;;;;18240:2263:0:o;5317:479::-;5373:4;;-1:-1:-1;;;;;5394:26:0;;-1:-1:-1;;;;;;;;;;;5394:26:0;5390:51;;;5077:2;5422:19;;;;5390:51;-1:-1:-1;;;;;;5496:15:0;;:8;:15;;;;;;;;;;;5712:18;;5709:46;;;5739:5;-1:-1:-1;;;;;5739:14:0;;:16;;;;;;;;;;;-1:-1:-1;;;5739:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5732:23;;;;8271:627;8396:4;4873:6;8426:20;;;8418:29;;;;;;4873:6;8466:21;;;8458:30;;;;;;8505:26;;;8501:390;;5029:2;8557:25;;;8556:43;;8548:52;;;;;;8687:9;8671:11;8657;:25;8650:2;:33;8649:47;4822:6;8623:10;:22;:74;;;;;;;;8615:83;;;;8501:390;5029:2;8740:25;;;8739:43;;8731:52;;;;;;8869:9;8853:11;8839;:25;8832:2;:33;4822:6;8806:10;:22;:60;:72;;;;;;46226:296;46312:14;;:::i;:::-;46339:13;46431:4;-1:-1:-1;;;;;46431:20:0;;46452:7;46431:29;;;;;;;;;;;;-1:-1:-1;;;46431:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46363:97;;46416:11;;;46363:97;;;-1:-1:-1;;;;;46363:97:0;;;46392:14;;;46363:97;;;;;46376:14;;;46363:97;-1:-1:-1;;;;;46363:97:0;;;;;-1:-1:-1;46363:97:0;;-1:-1:-1;10266:1:0;;46491:11;:22;;;46471:16;;;:43;-1:-1:-1;46471:4:0;46226:296;-1:-1:-1;;46226:296:0:o;2795:183::-;2906:23;;2883:4;;2906:23;;:28;2902:45;;;-1:-1:-1;2943:4:0;2936:11;;2902:45;-1:-1:-1;2965:5:0;2795:183;;;:::o;2423:364::-;2593:24;;2567:4;;2593:24;;:28;;;2589:73;;;-1:-1:-1;2645:5:0;2638:12;;2589:73;-1:-1:-1;2674:43:0;;-1:-1:-1;;2674:43:0;;;;;;;;;-1:-1:-1;;2728:23:0;;;:27;-1:-1:-1;2423:364:0:o;40509:423::-;40636:4;40658:14;40675:12;:36;;40702:9;40675:36;;;40690:9;40675:36;40745:25;;-1:-1:-1;;;;;40658:53:0;;;;;-1:-1:-1;40732:38:0;;;40724:47;;;;;;40790:51;40805:5;40812:12;40830:9;-1:-1:-1;;;;;40826:14:0;40790;:51::i;:::-;40782:60;;;;;;;;40861:38;40877:5;40888:9;40861:15;:38::i;:::-;40853:47;;;;;;;;-1:-1:-1;40920:4:0;;40509:423;-1:-1:-1;;;;;40509:423:0:o;46530:641::-;46640:4;46662:9;46846:12;46842:254;;;46932:15;;46882:81;;46898:9;;46909;;46920:28;;-1:-1:-1;;;;;46932:15:0;46920:11;:28::i;:::-;5077:2;46882:15;:81::i;:::-;46875:88;;46842:254;;;47067:15;;47003:81;;47019:9;;47030;;5077:2;;47055:28;;-1:-1:-1;;;;;47067:15:0;47055:11;:28::i;47003:81::-;46996:88;;46842:254;4938:17;47112:15;;47108:33;;;47136:5;47129:12;;;;41029:659;41229:4;41251:14;41321:11;41268:12;:42;;41298:12;41268:42;;;41283:12;41268:42;-1:-1:-1;;;;;41251:59:0;;;41335:12;:111;;41431:13;-1:-1:-1;;;;;41427:18:0;41411:12;-1:-1:-1;;;;;41407:17:0;:38;41335:111;;;41375:13;-1:-1:-1;;;;;41371:18:0;41355:12;-1:-1:-1;;;;;41351:17:0;:38;41335:111;41480:25;;41321:125;;-1:-1:-1;41467:38:0;;;41459:47;;;;;;41527:75;41542:5;41549:12;41587:13;-1:-1:-1;;;;;41583:18:0;41567:12;-1:-1:-1;;;;;41563:17:0;:38;41527:14;:75::i;:::-;41519:84;;;;;;;;41624:31;41640:5;41647:7;41624:15;:31::i;:::-;41616:40;;;;;;;;-1:-1:-1;41676:4:0;;41029:659;-1:-1:-1;;;;;;;;41029:659:0:o;39825:587::-;39923:4;;39950:28;;;;39942:37;;;;;;-1:-1:-1;;;;;40013:26:0;;;;;;:19;:26;;;;;;39996:43;;39992:183;;;-1:-1:-1;;;;;40056:26:0;;40085:1;40056:26;;;:19;:26;;;;;:30;39992:183;;;-1:-1:-1;;;;;40119:26:0;;;;;;:19;:26;;;;;:44;;;;;;;39992:183;40191:15;;40187:32;;;40215:4;40208:11;;;;40187:32;40250:39;40278:10;40250:27;:39::i;:::-;-1:-1:-1;;;;;40310:15:0;;;;;;:8;:15;;;;;;40232:57;;-1:-1:-1;40310:29:0;;;;40302:38;;;;;;-1:-1:-1;;;;;40351:15:0;;;;;;:8;:15;;;;;:29;;;;;;;-1:-1:-1;;;39825:587:0;;;;;;:::o;44980:442::-;45142:4;45204:26;45172:4;-1:-1:-1;;;;;45172:11:0;;45184:7;45172:20;;;;;;;;;;;;-1:-1:-1;;;45172:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45164:29;;;;;;;;-1:-1:-1;;;;;45234:29:0;;-1:-1:-1;;;;;;;;;;;45234:29:0;45233:106;;-1:-1:-1;;;;;45311:28:0;;;;;;:21;:28;;;;;45233:106;;;-1:-1:-1;;;;;45280:28:0;;;;;;:21;:28;;;;;45233:106;45204:135;;45358:31;45373:6;45381:7;45358:14;:31::i;41775:597::-;42002:4;;-1:-1:-1;;;;;42051:28:0;;-1:-1:-1;;;;;;;;;;;42051:28:0;42050:64;;42100:14;;-1:-1:-1;;;;;42100:14:0;42050:64;;;42083:14;;-1:-1:-1;;;;;42083:14:0;42050:64;42024:90;;42170:42;42182:4;42188:5;42195:7;42204;42170:11;:42::i;:::-;42162:51;;;;;;;;42226:60;42241:5;42248:7;-1:-1:-1;;;;;42257:28:0;;-1:-1:-1;;;;;;;;;;;42257:28:0;42226:60;;-1:-1:-1;;;;;42226:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42306:58;42316:5;42323:7;42332:13;-1:-1:-1;;;;;42306:58:0;42347:13;-1:-1:-1;;;;;42306:58:0;42362:1;42306:9;:58::i;:::-;42299:65;41775:597;-1:-1:-1;;;;;;;;41775:597:0:o;42478:1817::-;42784:4;;;;;-1:-1:-1;;;;;42814:37:0;;;;;;;42806:46;;;;;;-1:-1:-1;;;;;42871:34:0;;;;;;;42863:43;;;;;;42985:35;;;;;43031:38;;;;;-1:-1:-1;;;;;43109:28:0;;-1:-1:-1;;;;;;;;;;;43109:28:0;43108:64;;43158:14;;-1:-1:-1;;;;;43158:14:0;43108:64;;;43141:14;;-1:-1:-1;;;;;43141:14:0;43108:64;43082:90;-1:-1:-1;;;;;;43220:28:0;;-1:-1:-1;;;;;;;;;;;43220:28:0;43219:64;;43269:14;43219:64;;;43252:14;43219:64;-1:-1:-1;;;;;43183:100:0;;;43323:1;43294:30;;43372:6;:22;;;43341:28;:53;43337:686;;;-1:-1:-1;;;;;43512:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;:44;;-1:-1:-1;;;;;43512:44:0;;;;;43595:28;;-1:-1:-1;43708:42:0;43720:4;43523:5;43530:7;43742;43708:11;:42::i;:::-;43700:51;;;;;;;;43337:686;;;43901:4;-1:-1:-1;;;;;43901:27:0;;43929:7;43938:14;43954;10349:1;43901:77;;;;;;;;;;;;-1:-1:-1;;;43901:77:0;;;;;;;;;;-1:-1:-1;;;;;43901:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43886:92:0;;-1:-1:-1;;43993:18:0;;;;;;;;;44035:90;44053:5;44060:7;-1:-1:-1;;;;;44069:28:0;;-1:-1:-1;;;;;;;;;;;44069:28:0;44123:1;44099:25;;44035:90;;-1:-1:-1;;;;;44035:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44197:89;44207:5;44214:7;44223:20;-1:-1:-1;;;;;44197:89:0;44245:17;-1:-1:-1;;;;;44197:89:0;44264:21;44197:9;:89::i;:::-;44190:97;42478:1817;-1:-1:-1;;;;;;;;;;;;;42478:1817:0:o;38187:501::-;38295:4;38317:20;38340:12;:50;;38375:15;;-1:-1:-1;;;;;38375:15:0;38340:50;;;-1:-1:-1;;;;;;;;;;;38340:50:0;38317:73;;38419:1;38407:9;:13;38403:254;;;-1:-1:-1;;;;;38437:17:0;;;38477:10;38437:17;;;:10;:17;;;;;;;;:31;;;;;;;;;;;:51;;38477:10;;;;38437:51;;;;;38403:254;;;-1:-1:-1;;;;;38529:17:0;;;;;;;:10;:17;;;;;;;;:31;;;;;;;;;;:50;;;;38521:59;;;;;;-1:-1:-1;;;;;38595:17:0;;;;;;;:10;:17;;;;;;;;:31;;;;;;;;;:50;;;;;;;38676:4;38669:11;;38187:501;;;;;;:::o;38828:567::-;38900:4;38953:22;38935:1;38923:9;:13;38919:288;;;-1:-1:-1;;;;;;39033:26:0;;38983:10;39033:26;;;:19;:26;;;;;;38983:10;;;;;39013:46;;39009:98;;;-1:-1:-1;;;;;;39081:26:0;;;;;;:19;:26;;;;;;39009:98;-1:-1:-1;;;;;39122:26:0;;;;;;:19;:26;;;;;:47;;;;;;;-1:-1:-1;;;39184:11:0;;38919:288;-1:-1:-1;;;;;39259:26:0;;;;;;:19;:26;;;;;;39246:58;;39259:44;;39246:12;:58::i;:::-;-1:-1:-1;;;;;39227:15:0;;;;;;:8;:15;;;;;;:77;;39219:86;;;;;;-1:-1:-1;;;;;39318:26:0;;;;;;:19;:26;;;;;:45;;;;;;-1:-1:-1;;;38828:567:0;;;;;;:::o;1906:509::-;2054:23;;2013:4;;;;;;2054:23;;;;2043:34;;;;;2035:43;;;;;;2108:23;;;;;;1331:2;2108:36;2097:48;;;;2089:57;;;;;;-1:-1:-1;;2199:23:0;;;2308:22;;;2199:23;;;;2178:13;;;:45;;;;;2252:22;;;;;2199:23;2295:35;;;:39;2287:48;;;;;;2348:22;;;;:37;;2374:11;;2348:37;;;:22;-1:-1:-1;1906:509:0;;;;;;:::o;44307:665::-;44511:4;;-1:-1:-1;;;;;44550:30:0;;-1:-1:-1;;;;;;;;;;;44550:30:0;:62;;44599:13;44550:62;;;44583:13;44550:62;-1:-1:-1;;;;;44693:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;:43;;;;;;44533:79;-1:-1:-1;44891:73:0;44704:5;44918:33;;;44533:79;44891:18;:73::i;:::-;44884:80;44307:665;-1:-1:-1;;;;;;;44307:665:0:o;9722:37452::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5135:174::-;-1:-1:-1;;;;;5193:26:0;;-1:-1:-1;;;;;;;;;;;5193:26:0;5189:112;;;-1:-1:-1;;;;;5221:15:0;;:8;:15;;;;;;;;;;5077:2;5221:30;;5189:112;;;5285:5;-1:-1:-1;;;;;5285:14:0;;:16;;;;;;;;;;;-1:-1:-1;;;5285:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5267:15:0;;:8;:15;;;;;;;;;;:34;-1:-1:-1;5135:174:0;:::o
Swarm Source
bzzr://7eb541f3d1a2548f0c8d7e0ff28ca2edb63374d5242dead60640e16d719ac99d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.