Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 148 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exit Pool | 15551874 | 816 days ago | IN | 0 ETH | 0.00167763 | ||||
Exit Pool | 15550699 | 816 days ago | IN | 0 ETH | 0.00144682 | ||||
Exit Pool | 15437228 | 834 days ago | IN | 0 ETH | 0.00477999 | ||||
Exit Pool | 15195099 | 873 days ago | IN | 0 ETH | 0.00464616 | ||||
Exit Pool | 15186828 | 874 days ago | IN | 0 ETH | 0.00510373 | ||||
Exit Pool | 14547072 | 978 days ago | IN | 0 ETH | 0.0203407 | ||||
Exit Pool | 14344216 | 1009 days ago | IN | 0 ETH | 0.00588484 | ||||
Exit Pool | 14283128 | 1019 days ago | IN | 0 ETH | 0.01283073 | ||||
Exit Pool | 14176961 | 1035 days ago | IN | 0 ETH | 0.01199131 | ||||
Exit Pool | 14048668 | 1055 days ago | IN | 0 ETH | 0.02208003 | ||||
Exit Pool | 13823639 | 1090 days ago | IN | 0 ETH | 0.01312926 | ||||
Exit Pool | 13705213 | 1108 days ago | IN | 0 ETH | 0.04296347 | ||||
Exit Pool | 13648411 | 1117 days ago | IN | 0 ETH | 0.02883629 | ||||
Exit Pool | 13646422 | 1118 days ago | IN | 0 ETH | 0.03376143 | ||||
Exit Pool | 13474188 | 1145 days ago | IN | 0 ETH | 0.01889646 | ||||
Exit Pool | 13321351 | 1169 days ago | IN | 0 ETH | 0.01507608 | ||||
Exit Pool | 13289723 | 1174 days ago | IN | 0 ETH | 0.0248251 | ||||
Exit Pool | 13230522 | 1183 days ago | IN | 0 ETH | 0.01116869 | ||||
Exit Pool | 13209875 | 1186 days ago | IN | 0 ETH | 0.02015593 | ||||
Exit Pool | 13158663 | 1194 days ago | IN | 0 ETH | 0.01990535 | ||||
Exit Pool | 13137602 | 1197 days ago | IN | 0 ETH | 0.02452447 | ||||
Exit Pool | 13031180 | 1214 days ago | IN | 0 ETH | 0.01371916 | ||||
Exit Pool | 12945337 | 1227 days ago | IN | 0 ETH | 0.00512542 | ||||
Exit Pool | 12936469 | 1228 days ago | IN | 0 ETH | 0.00603129 | ||||
Exit Pool | 12895762 | 1235 days ago | IN | 0 ETH | 0.00520531 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12010490 | 1372 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xf178b9fd...49cB1685C The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
MPool
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity Multiple files format)
pragma solidity 0.5.12; import "./MToken.sol"; import "./MMath.sol"; interface IMFactory { function isWhiteList(address w) external view returns (bool); function getMining() external returns (address lpMiningAdr, address swapMiningAdr); function getFeeTo() external view returns (address); } interface IMining { // pair function addLiquidity(bool isGp, address _user, uint256 _amount) external; function removeLiquidity(bool isGp, address _user, uint256 _amount) external; function updateGPInfo(address[] calldata gps, uint256[] calldata amounts) external; // lp mining function onTransferLiquidity(address from, address to, uint256 lpAmount) external; function claimLiquidityShares(address user, address[] calldata tokens, uint256[] calldata balances, uint256[] calldata weights, uint256 amount, bool _add) external; // swap mining function claimSwapShare(address user, address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOut) external; } interface IPairFactory { function newPair(address pool, uint256 perBlock, uint256 rate) external returns (IPairToken); function getPairToken(address pool) external view returns (address); } interface IPairToken { function setController(address _controller) external ; } contract MPool is MBronze, MToken, MMath { struct Record { bool bound; // is token bound to pool uint index; // private uint denorm; // denormalized weight uint balance; } event LOG_SWAP( address indexed caller, address indexed tokenIn, address indexed tokenOut, uint256 tokenAmountIn, uint256 tokenAmountOut ); event LOG_JOIN( address indexed caller, address indexed tokenIn, uint256 tokenAmountIn ); event LOG_EXIT( address indexed caller, address indexed tokenOut, uint256 tokenAmountOut ); event LOG_CALL( bytes4 indexed sig, address indexed caller, bytes data ) anonymous; modifier _logs_() { emit LOG_CALL(msg.sig, msg.sender, msg.data); _; } modifier _lock_() { require(!_mutex, "ERR_REENTRY"); _mutex = true; _; _mutex = false; } modifier _viewlock_() { require(!_mutex, "ERR_REENTRY"); _; } bool private _mutex; IMFactory private _factory; // MFactory address to push token exitFee to and check whitelist from factory IMining private _pair; address public controller; // has CONTROL role // `setSwapFee` and `finalize` require CONTROL // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN` uint private _swapFee; bool private _finalized; bool private _publicSwap; // true if PUBLIC can call SWAP functions address[] private _tokens; mapping(address => Record) private _records; uint private _totalWeight; constructor() public { controller = msg.sender; _factory = IMFactory(msg.sender); _swapFee = MIN_FEE; _publicSwap = false; _finalized = false; } function isPublicSwap() external view returns (bool) { return _publicSwap; } function isFinalized() external view returns (bool) { return _finalized; } function isBound(address t) external view returns (bool) { return _records[t].bound; } function getNumTokens() external view returns (uint) { return _tokens.length; } function getCurrentTokens() external view _viewlock_ returns (address[] memory tokens) { return _tokens; } function getFinalTokens() external view _viewlock_ returns (address[] memory tokens) { require(_finalized, "ERR_NOT_FINALIZED"); return _tokens; } function getDenormalizedWeight(address token) external view _viewlock_ returns (uint) { require(_records[token].bound, "ERR_NOT_BOUND"); return _records[token].denorm; } function getTotalDenormalizedWeight() external view _viewlock_ returns (uint) { return _totalWeight; } function getNormalizedWeight(address token) external view _viewlock_ returns (uint) { require(_records[token].bound, "ERR_NOT_BOUND"); uint denorm = _records[token].denorm; return bdiv(denorm, _totalWeight); } function getBalance(address token) external view _viewlock_ returns (uint) { require(_records[token].bound, "ERR_NOT_BOUND"); return _records[token].balance; } function getSwapFee() external view _viewlock_ returns (uint) { return _swapFee; } function getPair() external view _viewlock_ returns (address) { return address(_pair); } function setSwapFee(uint swapFee) external _logs_ _lock_ { require(!_finalized, "ERR_IS_FINALIZED"); require(msg.sender == controller, "ERR_NOT_CONTROLLER"); require(swapFee >= MIN_FEE, "ERR_MIN_FEE"); require(swapFee <= MAX_FEE, "ERR_MAX_FEE"); _swapFee = swapFee; } function setController(address manager) external _logs_ _lock_ { require(msg.sender == controller, "ERR_NOT_CONTROLLER"); controller = manager; } function setPair(IMining pair) external _logs_ _lock_ { require(msg.sender == controller, "ERR_NOT_CONTROLLER"); _setPair(pair); } function _setPair(IMining pair) internal { _pair = pair; } function finalize(address beneficiary, uint fixPoolSupply) external _logs_ _lock_ { require(msg.sender == controller, "ERR_NOT_CONTROLLER"); require(!_finalized || totalSupply() == 0, "ERR_IS_FINALIZED"); require(_tokens.length >= MIN_BOUND_TOKENS, "ERR_MIN_TOKENS"); _finalized = true; _publicSwap = true; uint256 supply = fixPoolSupply == 0 ? INIT_POOL_SUPPLY : fixPoolSupply; _mintPoolShare(supply); _pushPoolShare(beneficiary, supply); _lpChanging(true, beneficiary, supply); } function bind(address token, uint balance, uint denorm) external _logs_ // _lock_ Bind does not lock because it jumps to `rebind`, which does { require(msg.sender == controller, "ERR_NOT_CONTROLLER"); require(!_records[token].bound, "ERR_IS_BOUND"); require(!_finalized, "ERR_IS_FINALIZED"); require(_tokens.length < MAX_BOUND_TOKENS, "ERR_MAX_TOKENS"); _records[token] = Record({ bound: true, index: _tokens.length, denorm: 0, // balance and denorm will be validated balance: 0 // and set by `rebind` }); _tokens.push(token); rebind(token, balance, denorm); } function rebind(address token, uint balance, uint denorm) public _logs_ _lock_ { require(msg.sender == controller, "ERR_NOT_CONTROLLER"); require(_records[token].bound, "ERR_NOT_BOUND"); require(!_finalized || totalSupply() == 0, "ERR_IS_FINALIZED"); require(denorm >= MIN_WEIGHT, "ERR_MIN_WEIGHT"); require(denorm <= MAX_WEIGHT, "ERR_MAX_WEIGHT"); require(balance >= MIN_BALANCE, "ERR_MIN_BALANCE"); // Adjust the denorm and totalWeight uint oldWeight = _records[token].denorm; if (denorm > oldWeight) { _totalWeight = badd(_totalWeight, bsub(denorm, oldWeight)); require(_totalWeight <= MAX_TOTAL_WEIGHT, "ERR_MAX_TOTAL_WEIGHT"); } else if (denorm < oldWeight) { _totalWeight = bsub(_totalWeight, bsub(oldWeight, denorm)); } _records[token].denorm = denorm; // Adjust the balance record and actual token balance uint oldBalance = _records[token].balance; _records[token].balance = balance; if (balance > oldBalance) { _pullUnderlying(token, msg.sender, bsub(balance, oldBalance)); } else if (balance < oldBalance) { uint tokenBalanceWithdrawn = bsub(oldBalance, balance); _pushUnderlying(token, msg.sender, tokenBalanceWithdrawn); } } function unbind(address token) external _logs_ _lock_ { require(msg.sender == controller, "ERR_NOT_CONTROLLER"); require(_records[token].bound, "ERR_NOT_BOUND"); require(!_finalized, "ERR_IS_FINALIZED"); uint tokenBalance = _records[token].balance; _totalWeight = bsub(_totalWeight, _records[token].denorm); // Swap the token-to-unbind with the last token, // then delete the last token uint index = _records[token].index; uint last = _tokens.length - 1; _tokens[index] = _tokens[last]; _records[_tokens[index]].index = index; _tokens.pop(); _records[token] = Record({ bound: false, index: 0, denorm: 0, balance: 0 }); _pushUnderlying(token, msg.sender, tokenBalance); } // Absorb any tokens that have been sent to this contract into the pool function gulp(address token) external _logs_ _lock_ { require(_records[token].bound, "ERR_NOT_BOUND"); _records[token].balance = IERC20(token).balanceOf(address(this)); } function getSpotPrice(address tokenIn, address tokenOut) external view _viewlock_ returns (uint spotPrice) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); Record storage inRecord = _records[tokenIn]; Record storage outRecord = _records[tokenOut]; return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee); } function getSpotPriceSansFee(address tokenIn, address tokenOut) external view _viewlock_ returns (uint spotPrice) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); Record storage inRecord = _records[tokenIn]; Record storage outRecord = _records[tokenOut]; return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, 0); } function joinPool(address beneficiary, uint poolAmountOut) external _logs_ _lock_ { require(_finalized, "ERR_NOT_FINALIZED"); uint poolTotal = totalSupply(); uint ratio = bdiv(poolAmountOut, poolTotal); require(ratio != 0, "ERR_MATH_APPROX"); for (uint i = 0; i < _tokens.length; i++) { address t = _tokens[i]; uint bal = _records[t].balance; uint tokenAmountIn = bmul(ratio, bal); require(tokenAmountIn != 0, "ERR_MATH_APPROX"); require(bsub(IERC20(_tokens[i]).balanceOf(address(this)), _records[t].balance) >= tokenAmountIn); _records[t].balance = badd(_records[t].balance, tokenAmountIn); emit LOG_JOIN(msg.sender, t, tokenAmountIn); } _mintPoolShare(poolAmountOut); _pushPoolShare(beneficiary, poolAmountOut); _lpChanging(true, beneficiary, poolAmountOut); } function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut) external _logs_ _lock_ { require(_finalized, "ERR_NOT_FINALIZED"); uint poolTotal = totalSupply(); uint ratio = bdiv(poolAmountIn, poolTotal); require(ratio != 0, "ERR_MATH_APPROX"); _pullPoolShare(msg.sender, poolAmountIn); _burnPoolShare(poolAmountIn); for (uint i = 0; i < _tokens.length; i++) { address t = _tokens[i]; uint bal = _records[t].balance; uint tokenAmountOut = bmul(ratio, bal); require(tokenAmountOut != 0, "ERR_MATH_APPROX"); require(tokenAmountOut >= minAmountsOut[i], "ERR_LIMIT_OUT"); _records[t].balance = bsub(_records[t].balance, tokenAmountOut); emit LOG_EXIT(msg.sender, t, tokenAmountOut); _pushUnderlying(t, msg.sender, tokenAmountOut); } _lpChanging(false, msg.sender, poolAmountIn); } function swapExactAmountIn( address user, address tokenIn, address tokenOut, uint minAmountOut, address to, uint maxPrice ) external _lock_ returns (uint tokenAmountOut, uint spotPriceAfter) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); require(_publicSwap, "ERR_SWAP_NOT_PUBLIC"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; uint tokenAmountIn = bsub(IERC20(tokenIn).balanceOf(address(this)), inRecord.balance); require(tokenAmountIn > 0, "ERR_AMOUNTIN_NOT_IN_Pool"); require(tokenAmountIn <= bmul(inRecord.balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO"); uint256 factoryFee = bmul(tokenAmountIn, bmul(bdiv(_swapFee, 6), 1)); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE"); tokenAmountOut = calcOutGivenIn( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountIn, _swapFee ); require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT"); uint inAfterFee = bsub(tokenAmountIn, factoryFee); inRecord.balance = badd(inRecord.balance, inAfterFee); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); spotPriceAfter = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX"); require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE"); require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX"); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut); _pushUnderlying(tokenOut, to, tokenAmountOut); _pushUnderlying(tokenIn, _factory.getFeeTo(), factoryFee); _swapMining(user, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut); return (tokenAmountOut, spotPriceAfter); } function swapExactAmountOut( address user, address tokenIn, uint maxAmountIn, address tokenOut, uint tokenAmountOut, address to, uint maxPrice ) external _lock_ returns (uint tokenAmountIn, uint spotPriceAfter) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); require(_publicSwap, "ERR_SWAP_NOT_PUBLIC"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require(tokenAmountOut <= bmul(outRecord.balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO"); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE"); tokenAmountIn = calcInGivenOut( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountOut, _swapFee ); uint user_deposit_amount = bsub(IERC20(tokenIn).balanceOf(address(this)), inRecord.balance); require(tokenAmountIn == user_deposit_amount && user_deposit_amount <= maxAmountIn, "ERR_LIMIT_IN"); uint256 factoryFee = bmul(tokenAmountIn, bmul(bdiv(_swapFee, 6), 1)); inRecord.balance = badd(inRecord.balance, bsub(tokenAmountIn, factoryFee)); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); spotPriceAfter = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX"); require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE"); require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX"); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut); _pushUnderlying(tokenOut, to, tokenAmountOut); _pushUnderlying(tokenIn, _factory.getFeeTo(), factoryFee); _swapMining(user, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut); return (tokenAmountIn, spotPriceAfter); } function calcDesireByGivenAmount(address tokenIn, address tokenOut, uint256 inAmount, uint256 outAmount) external view returns (uint desireAmount) { require(inAmount != 0 || outAmount != 0, "ERR_AMOUNT_IS_ZERO"); Record memory inRecord = _records[address(tokenIn)]; Record memory outRecord = _records[address(tokenOut)]; if (inAmount != 0) { desireAmount = calcOutGivenIn(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, inAmount, _swapFee); } else { desireAmount = calcInGivenOut(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, outAmount, _swapFee); } } function calcPoolSpotPrice(address tokenIn, address tokenOut, uint256 inAmount, uint256 outAmount) external view returns (uint256 price) { Record memory inRecord = _records[address(tokenIn)]; Record memory outRecord = _records[address(tokenOut)]; if (inAmount != 0 && outAmount != 0) { uint256 factoryFee = bmul(inAmount, bmul(bdiv(_swapFee, 6), 1)); price = calcSpotPrice( badd(inRecord.balance, bsub(inAmount, factoryFee)), inRecord.denorm, bsub(outRecord.balance, outAmount), outRecord.denorm, _swapFee); } else { price = calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee); } } function updatePairGPInfo(address[] calldata gps, uint[] calldata shares) external { require(msg.sender == controller, "ERR_NOT_CONTROLLER"); if (address(_pair) != address(0)) { _pair.updateGPInfo(gps, shares); } } // 'Underlying' token-manipulation functions make external calls but are NOT locked // You must `_lock_` or otherwise ensure reentry-safety function _pullUnderlying(address erc20, address from, uint amount) internal { safeTransferFrom(erc20, from, address(this), amount); } function _pushUnderlying(address erc20, address to, uint amount) internal { safeTransfer(erc20, to, amount); } function _pullPoolShare(address from, uint amount) internal { _pull(from, amount); } function _pushPoolShare(address to, uint amount) internal { _push(to, amount); } function _mintPoolShare(uint amount) internal { _mint(amount); } function _burnPoolShare(uint amount) internal { _burn(amount); } function _lpChanging(bool add, address user, uint256 amount) internal { if (address(_pair) != address(0)) { add == true ? _pair.addLiquidity(false, user, amount) : _pair.removeLiquidity(false, user, amount); } (address lpMiningAdr, ) = _factory.getMining(); if (lpMiningAdr != address(0)) { IMining mining = IMining(lpMiningAdr); uint256[] memory balances = new uint256[](_tokens.length); uint256[] memory weights = new uint256[](_tokens.length); for (uint i = 0; i < _tokens.length; i++) { balances[i] = _records[_tokens[i]].balance; weights[i] = bdiv(_records[_tokens[i]].denorm, _totalWeight); } mining.claimLiquidityShares(user, _tokens, balances, weights, amount, add); } } function _swapMining(address user, address tokenIn, address tokenOut, uint256 tokenAmountIn, uint256 tokenAmountOut) internal { ( ,address swapMiningAdr) = _factory.getMining(); if (swapMiningAdr != address(0)){ IMining mining = IMining(swapMiningAdr); mining.claimSwapShare(user, tokenIn, tokenAmountIn, tokenOut, tokenAmountOut); } } function _transferLiquidity(address src, address dst, uint amt) internal { (address lpMiningAdr, ) = _factory.getMining(); if (lpMiningAdr != address(0)){ IMining mining = IMining(lpMiningAdr); mining.onTransferLiquidity(src, dst, amt); } } function transfer(address dst, uint amt) external returns (bool) { require(_factory.isWhiteList(msg.sender) || _factory.isWhiteList(dst), "ERR_NOT_WHITELIST"); _move(msg.sender, dst, amt); if(dst != address(this)){ _transferLiquidity(msg.sender, dst, amt); } return true; } function transferFrom(address src, address dst, uint amt) external returns (bool) { require(_factory.isWhiteList(msg.sender) || _factory.isWhiteList(dst), "ERR_NOT_WHITELIST"); require(msg.sender == src || amt <= _allowance[src][msg.sender], "ERR_BTOKEN_BAD_CALLER"); _move(src, dst, amt); if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) { _allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt); emit Approval(msg.sender, dst, _allowance[src][msg.sender]); } if(dst != address(this)){ _transferLiquidity(src, dst, amt); } return true; } function bindPair( IPairFactory pairFactory, address[] calldata gps, uint[] calldata shares, uint gpRate ) external { require(msg.sender == controller, "ERR_NOT_CONTROLLER"); IPairToken pair = pairFactory.newPair(address(this), 4 * 10 ** 18, gpRate); _setPair(IMining(address(pair))); if (gpRate > 0 && gpRate <= 15 && gps.length != 0 && gps.length == shares.length) { _pair.updateGPInfo(gps, shares); } pair.setController(msg.sender); } }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; contract MColor { function getColor() external view returns (bytes32); } contract MBronze is MColor { function getColor() external view returns (bytes32) { return bytes32("BRONZE"); } }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; import "./MColor.sol"; contract MConst is MBronze { uint internal constant BONE = 10**18; uint internal constant MIN_BOUND_TOKENS = 2; uint internal constant MAX_BOUND_TOKENS = 8; uint internal constant MIN_FEE = BONE / 10**6; uint internal constant MAX_FEE = BONE / 10; uint internal constant MIN_WEIGHT = BONE; uint internal constant MAX_WEIGHT = BONE * 50; uint internal constant MAX_TOTAL_WEIGHT = BONE * 50; uint internal constant MIN_BALANCE = BONE / 10**12; uint internal constant INIT_POOL_SUPPLY = BONE * 100; uint internal constant MIN_BPOW_BASE = 1 wei; uint internal constant MAX_BPOW_BASE = (2 * BONE) - 1 wei; uint internal constant BPOW_PRECISION = BONE / 10**10; uint internal constant MAX_IN_RATIO = BONE / 2; uint internal constant MAX_OUT_RATIO = (BONE / 3) + 1 wei; }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; import "./MNum.sol"; contract MMath is MBronze, MConst, MNum { /********************************************************************************************** // calcSpotPrice // // sP = spotPrice // // bI = tokenBalanceIn ( bI / wI ) 1 // // bO = tokenBalanceOut sP = ----------- * ---------- // // wI = tokenWeightIn ( bO / wO ) ( 1 - sF ) // // wO = tokenWeightOut // // sF = swapFee // **********************************************************************************************/ function calcSpotPrice( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint swapFee ) public pure returns (uint spotPrice) { uint numer = bdiv(tokenBalanceIn, tokenWeightIn); uint denom = bdiv(tokenBalanceOut, tokenWeightOut); uint ratio = bdiv(numer, denom); uint scale = bdiv(BONE, bsub(BONE, swapFee)); return (spotPrice = bmul(ratio, scale)); } /********************************************************************************************** // calcOutGivenIn // // aO = tokenAmountOut // // bO = tokenBalanceOut // // bI = tokenBalanceIn / / bI \ (wI / wO) \ // // aI = tokenAmountIn aO = bO * | 1 - | -------------------------- | ^ | // // wI = tokenWeightIn \ \ ( bI + ( aI * ( 1 - sF )) / / // // wO = tokenWeightOut // // sF = swapFee // **********************************************************************************************/ function calcOutGivenIn( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint tokenAmountIn, uint swapFee ) public pure returns (uint tokenAmountOut) { uint weightRatio = bdiv(tokenWeightIn, tokenWeightOut); uint adjustedIn = bsub(BONE, swapFee); adjustedIn = bmul(tokenAmountIn, adjustedIn); uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn)); uint foo = bpow(y, weightRatio); uint bar = bsub(BONE, foo); tokenAmountOut = bmul(tokenBalanceOut, bar); return tokenAmountOut; } /********************************************************************************************** // calcInGivenOut // // aI = tokenAmountIn // // bO = tokenBalanceOut / / bO \ (wO / wI) \ // // bI = tokenBalanceIn bI * | | ------------ | ^ - 1 | // // aO = tokenAmountOut aI = \ \ ( bO - aO ) / / // // wI = tokenWeightIn -------------------------------------------- // // wO = tokenWeightOut ( 1 - sF ) // // sF = swapFee // **********************************************************************************************/ function calcInGivenOut( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint tokenAmountOut, uint swapFee ) public pure returns (uint tokenAmountIn) { uint weightRatio = bdiv(tokenWeightOut, tokenWeightIn); uint diff = bsub(tokenBalanceOut, tokenAmountOut); uint y = bdiv(tokenBalanceOut, diff); uint foo = bpow(y, weightRatio); foo = bsub(foo, BONE); tokenAmountIn = bsub(BONE, swapFee); tokenAmountIn = bdiv(bmul(tokenBalanceIn, foo), tokenAmountIn); return tokenAmountIn; } /********************************************************************************************** // calcPoolOutGivenSingleIn // // pAo = poolAmountOut / \ // // tAi = tokenAmountIn /// / // wI \ \\ \ wI \ // // wI = tokenWeightIn //| tAi *| 1 - || 1 - -- | * sF || + tBi \ -- \ // // tW = totalWeight pAo=|| \ \ \\ tW / // | ^ tW | * pS - pS // // tBi = tokenBalanceIn \\ ------------------------------------- / / // // pS = poolSupply \\ tBi / / // // sF = swapFee \ / // **********************************************************************************************/ function calcPoolOutGivenSingleIn( uint tokenBalanceIn, uint tokenWeightIn, uint poolSupply, uint totalWeight, uint tokenAmountIn, uint swapFee ) internal pure returns (uint poolAmountOut) { // Charge the trading fee for the proportion of tokenAi /// which is implicitly traded to the other pool tokens. // That proportion is (1- weightTokenIn) // tokenAiAfterFee = tAi * (1 - (1-weightTi) * poolFee); uint normalizedWeight = bdiv(tokenWeightIn, totalWeight); uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee); uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BONE, zaz)); uint newTokenBalanceIn = badd(tokenBalanceIn, tokenAmountInAfterFee); uint tokenInRatio = bdiv(newTokenBalanceIn, tokenBalanceIn); // uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply; uint poolRatio = bpow(tokenInRatio, normalizedWeight); uint newPoolSupply = bmul(poolRatio, poolSupply); poolAmountOut = bsub(newPoolSupply, poolSupply); return poolAmountOut; } /********************************************************************************************** // calcSingleOutGivenPoolIn // // tAo = tokenAmountOut / / \\ // // bO = tokenBalanceOut / // pS - pAi \ / 1 \ \\ // // pAi = poolAmountIn | bO - || ----------------------- | ^ | --------- | * b0 || // // ps = poolSupply \ \\ pS / \(wO / tW)/ // // // wI = tokenWeightIn tAo = \ \ // // // tW = totalWeight / / wO \ \ // // sF = swapFee * | 1 - | 1 - ---- | * sF | // // eF = exitFee \ \ tW / / // **********************************************************************************************/ function calcSingleOutGivenPoolIn( uint tokenBalanceOut, uint tokenWeightOut, uint poolSupply, uint totalWeight, uint poolAmountIn, uint swapFee ) internal pure returns (uint tokenAmountOut) { uint normalizedWeight = bdiv(tokenWeightOut, totalWeight); // charge exit fee on the pool token side // pAiAfterExitFee = pAi*(1-exitFee) uint poolAmountInAfterExitFee = bmul(poolAmountIn, BONE); uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee); uint poolRatio = bdiv(newPoolSupply, poolSupply); // newBalTo = poolRatio^(1/weightTo) * balTo; uint tokenOutRatio = bpow(poolRatio, bdiv(BONE, normalizedWeight)); uint newTokenBalanceOut = bmul(tokenOutRatio, tokenBalanceOut); uint tokenAmountOutBeforeSwapFee = bsub(tokenBalanceOut, newTokenBalanceOut); // charge swap fee on the output token side //uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee) uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee); tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BONE, zaz)); return tokenAmountOut; } }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; import "./MConst.sol"; contract MNum is MConst { function btoi(uint a) internal pure returns (uint) { return a / BONE; } function bfloor(uint a) internal pure returns (uint) { return btoi(a) * BONE; } function badd(uint a, uint b) internal pure returns (uint) { uint c = a + b; require(c >= a, "ERR_ADD_OVERFLOW"); return c; } function bsub(uint a, uint b) internal pure returns (uint) { (uint c, bool flag) = bsubSign(a, b); require(!flag, "ERR_SUB_UNDERFLOW"); return c; } function bsubSign(uint a, uint b) internal pure returns (uint, bool) { if (a >= b) { return (a - b, false); } else { return (b - a, true); } } function bmul(uint a, uint b) internal pure returns (uint) { uint c0 = a * b; require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW"); uint c1 = c0 + (BONE / 2); require(c1 >= c0, "ERR_MUL_OVERFLOW"); uint c2 = c1 / BONE; return c2; } function bdiv(uint a, uint b) internal pure returns (uint) { require(b != 0, "ERR_DIV_ZERO"); uint c0 = a * BONE; require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow uint c1 = c0 + (b / 2); require(c1 >= c0, "ERR_DIV_INTERNAL"); // badd require uint c2 = c1 / b; return c2; } // DSMath.wpow function bpowi(uint a, uint n) internal pure returns (uint) { uint z = n % 2 != 0 ? a : BONE; for (n /= 2; n != 0; n /= 2) { a = bmul(a, a); if (n % 2 != 0) { z = bmul(z, a); } } return z; } // Compute b^(e.w) by splitting it into (b^e)*(b^0.w). // Use `bpowi` for `b^e` and `bpowK` for k iterations // of approximation of b^0.w function bpow(uint base, uint exp) internal pure returns (uint) { require(base >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW"); require(base <= MAX_BPOW_BASE, "ERR_BPOW_BASE_TOO_HIGH"); uint whole = bfloor(exp); uint remain = bsub(exp, whole); uint wholePow = bpowi(base, btoi(whole)); if (remain == 0) { return wholePow; } uint partialResult = bpowApprox(base, remain, BPOW_PRECISION); return bmul(wholePow, partialResult); } function bpowApprox(uint base, uint exp, uint precision) internal pure returns (uint) { // term 0: uint a = exp; (uint x, bool xneg) = bsubSign(base, BONE); uint term = BONE; uint sum = term; bool negative = false; // term(k) = numer / denom // = (product(a - i - 1, i=1-->k) * x^k) / (k!) // each iteration, multiply previous term by (a-(k-1)) * x / k // continue until term is less than precision for (uint i = 1; term >= precision; i++) { uint bigK = i * BONE; (uint c, bool cneg) = bsubSign(a, bsub(bigK, BONE)); term = bmul(term, bmul(c, x)); term = bdiv(term, bigK); if (term == 0) break; if (xneg) negative = !negative; if (cneg) negative = !negative; if (negative) { sum = bsub(sum, term); } else { sum = badd(sum, term); } } return sum; } }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; import "./MNum.sol"; // Highly opinionated token implementation interface IERC20 { event Approval(address indexed src, address indexed dst, uint amt); event Transfer(address indexed src, address indexed dst, uint amt); function totalSupply() external view returns (uint); function balanceOf(address whom) external view returns (uint); function allowance(address src, address dst) external view returns (uint); function approve(address dst, uint amt) external returns (bool); function transfer(address dst, uint amt) external returns (bool); function transferFrom(address src, address dst, uint amt) external returns (bool); } contract MTokenBase is MNum { mapping(address => uint) internal _balance; mapping(address => mapping(address=>uint)) internal _allowance; uint internal _totalSupply; event Approval(address indexed src, address indexed dst, uint amt); event Transfer(address indexed src, address indexed dst, uint amt); function _mint(uint amt) internal { _balance[address(this)] = badd(_balance[address(this)], amt); _totalSupply = badd(_totalSupply, amt); emit Transfer(address(0), address(this), amt); } function _burn(uint amt) internal { require(_balance[address(this)] >= amt, "ERR_INSUFFICIENT_BAL"); _balance[address(this)] = bsub(_balance[address(this)], amt); _totalSupply = bsub(_totalSupply, amt); emit Transfer(address(this), address(0), amt); } function _move(address src, address dst, uint amt) internal { require(_balance[src] >= amt, "ERR_INSUFFICIENT_BAL"); _balance[src] = bsub(_balance[src], amt); _balance[dst] = badd(_balance[dst], amt); emit Transfer(src, dst, amt); } function _push(address to, uint amt) internal { _move(address(this), to, amt); } function _pull(address from, uint amt) internal { _move(from, address(this), amt); } } contract MToken is MTokenBase, IERC20 { string private _name = "Mercurity Pool Token"; string private _symbol = "MPT"; uint8 private _decimals = 18; function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns(uint8) { return _decimals; } function allowance(address src, address dst) external view returns (uint) { return _allowance[src][dst]; } function balanceOf(address whom) external view returns (uint) { return _balance[whom]; } function totalSupply() public view returns (uint) { return _totalSupply; } function approve(address dst, uint amt) external returns (bool) { _allowance[msg.sender][dst] = amt; emit Approval(msg.sender, dst, amt); return true; } function increaseApproval(address dst, uint amt) external returns (bool) { _allowance[msg.sender][dst] = badd(_allowance[msg.sender][dst], amt); emit Approval(msg.sender, dst, _allowance[msg.sender][dst]); return true; } function decreaseApproval(address dst, uint amt) external returns (bool) { uint oldValue = _allowance[msg.sender][dst]; if (amt > oldValue) { _allowance[msg.sender][dst] = 0; } else { _allowance[msg.sender][dst] = bsub(oldValue, amt); } emit Approval(msg.sender, dst, _allowance[msg.sender][dst]); return true; } function transfer(address dst, uint amt) external returns (bool) { _move(msg.sender, dst, amt); return true; } function transferFrom(address src, address dst, uint amt) external returns (bool) { require(msg.sender == src || amt <= _allowance[src][msg.sender], "ERR_BTOKEN_BAD_CALLER"); _move(src, dst, amt); if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) { _allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt); emit Approval(msg.sender, dst, _allowance[src][msg.sender]); } return true; } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"LOG_CALL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_EXIT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"name":"LOG_JOIN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_SWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IPairFactory","name":"pairFactory","type":"address"},{"internalType":"address[]","name":"gps","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"},{"internalType":"uint256","name":"gpRate","type":"uint256"}],"name":"bindPair","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"inAmount","type":"uint256"},{"internalType":"uint256","name":"outAmount","type":"uint256"}],"name":"calcDesireByGivenAmount","outputs":[{"internalType":"uint256","name":"desireAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcInGivenOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcOutGivenIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"inAmount","type":"uint256"},{"internalType":"uint256","name":"outAmount","type":"uint256"}],"name":"calcPoolSpotPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"fixPoolSupply","type":"uint256"}],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getColor","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPublicSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"name":"joinPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"rebind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IMining","name":"pair","type":"address"}],"name":"setPair","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"unbind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"gps","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}],"name":"updatePairGPInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061028a5760003560e01c806395d89b411161015c578063cf5e7bd3116100ce578063e4e1e53811610087578063e4e1e53814610acd578063f1b8a9b714610aff578063f77c479114610b25578063f8b2cb4f14610b2d578063f8d6aed414610b53578063fde924f714610b8e5761028a565b8063cf5e7bd3146109dd578063d4cadf6814610a03578063d73dd62314610a0b578063d8d2dc8814610a37578063dd62ed3e14610a63578063df52eb7514610a915761028a565b8063b02f0b7311610120578063b02f0b73146108a1578063ba9530a614610916578063be3bbd2e14610951578063c1f1b1b5146109a9578063cc77828d146109cd578063cd2ed8fb146109d55761028a565b806395d89b41146107de5780639a86139b146107e6578063a221ee49146107ee578063a9059cbb14610823578063ab431f9f1461084f5761028a565b80633e6d363f116102005780638c28cbe8116101b95780638c28cbe81461068e5780638d4e4083146106b457806392eefe9b146106bc578063936c3477146106e2578063948d8ce6146106ea578063952688d8146107105761028a565b80633e6d363f146104c35780633fdddaa2146105265780635e7d6c3d14610558578063661884631461061657806370a08231146106425780638187f516146106685761028a565b806318160ddd1161025257806318160ddd146103e85780631dfebc2e146103f057806323b872dd1461042c5780632f37b62414610462578063313ce5671461048857806334e19907146104a65761028a565b80630553e1561461028f57806306fdde03146102bd578063095ea7b31461033a5780631446a7ff1461037a57806315e84af9146103ba575b600080fd5b6102bb600480360360408110156102a557600080fd5b506001600160a01b038135169060200135610b96565b005b6102c5610dad565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ff5781810151838201526020016102e7565b50505050905090810190601f16801561032c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103666004803603604081101561035057600080fd5b506001600160a01b038135169060200135610e43565b604080519115158252519081900360200190f35b6103a86004803603604081101561039057600080fd5b506001600160a01b0381358116916020013516610e98565b60408051918252519081900360200190f35b6103a8600480360360408110156103d057600080fd5b506001600160a01b0381358116916020013516610fed565b6103a8611139565b6103a86004803603608081101561040657600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013561113f565b6103666004803603606081101561044257600080fd5b506001600160a01b038135811691602081013590911690604001356112a0565b6103666004803603602081101561047857600080fd5b50356001600160a01b031661155c565b61049061157a565b6040805160ff9092168252519081900360200190f35b6102bb600480360360208110156104bc57600080fd5b5035611583565b61050d600480360360c08110156104d957600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135916080820135169060a00135611780565b6040805192835260208301919091528051918290030190f35b6102bb6004803603606081101561053c57600080fd5b506001600160a01b038135169060208101359060400135611d85565b6102bb6004803603604081101561056e57600080fd5b810190602081018135600160201b81111561058857600080fd5b82018360208201111561059a57600080fd5b803590602001918460208302840111600160201b831117156105bb57600080fd5b919390929091602081019035600160201b8111156105d857600080fd5b8201836020820111156105ea57600080fd5b803590602001918460208302840111600160201b8311171561060b57600080fd5b50909250905061216b565b6103666004803603604081101561062c57600080fd5b506001600160a01b03813516906020013561229c565b6103a86004803603602081101561065857600080fd5b50356001600160a01b0316612374565b6102bb6004803603602081101561067e57600080fd5b50356001600160a01b031661238f565b6102bb600480360360208110156106a457600080fd5b50356001600160a01b03166124b7565b61036661266b565b6102bb600480360360208110156106d257600080fd5b50356001600160a01b0316612674565b6103a86127b2565b6103a86004803603602081101561070057600080fd5b50356001600160a01b0316612807565b6102bb6004803603608081101561072657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561075057600080fd5b82018360208201111561076257600080fd5b803590602001918460208302840111600160201b8311171561078357600080fd5b919390929091602081019035600160201b8111156107a057600080fd5b8201836020820111156107b257600080fd5b803590602001918460208302840111600160201b831117156107d357600080fd5b9193509150356128d1565b6102c5612b16565b6103a8612b77565b6103a8600480360360a081101561080457600080fd5b5080359060208101359060408101359060608101359060800135612b84565b6103666004803603604081101561083957600080fd5b506001600160a01b038135169060200135612bee565b61050d600480360360e081101561086557600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013582169160808201359160a08101359091169060c00135612d66565b6102bb600480360360408110156108b757600080fd5b81359190810190604081016020820135600160201b8111156108d857600080fd5b8201836020820111156108ea57600080fd5b803590602001918460208302840111600160201b8311171561090b57600080fd5b50909250905061331d565b6103a8600480360360c081101561092c57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613623565b6109596136a4565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561099557818101518382015260200161097d565b505050509050019250505060405180910390f35b6109b161379c565b604080516001600160a01b039092168252519081900360200190f35b6109596137fa565b6103a8613848565b6102bb600480360360208110156109f357600080fd5b50356001600160a01b031661384e565b6103a8613b9e565b61036660048036036040811015610a2157600080fd5b506001600160a01b038135169060200135613bf3565b6102bb60048036036040811015610a4d57600080fd5b506001600160a01b038135169060200135613c74565b6103a860048036036040811015610a7957600080fd5b506001600160a01b0381358116916020013516613fd0565b6103a860048036036080811015610aa757600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135613ffb565b6102bb60048036036060811015610ae357600080fd5b506001600160a01b038135169060208101359060400135614136565b6103a860048036036020811015610b1557600080fd5b50356001600160a01b031661438d565b6109b1614469565b6103a860048036036020811015610b4357600080fd5b50356001600160a01b0316614478565b6103a8600480360360c0811015610b6957600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614542565b6103666145c5565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610c42576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600754336001600160a01b0390911614610ca7576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b60095460ff161580610cbe5750610cbc611139565b155b610d02576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600a5460021115610d4b576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d494e5f544f4b454e5360901b604482015290519081900360640190fd5b6009805461ff001960ff199091166001171661010017905560008115610d715781610d7c565b68056bc75e2d631000005b9050610d87816145d3565b610d9183826145df565b610d9d600184836145ed565b50506005805461ff001916905550565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e395780601f10610e0e57610100808354040283529160200191610e39565b820191906000526020600020905b815481529060010190602001808311610e1c57829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390926000805160206156aa833981519152928290030190a35060015b92915050565b600554600090610100900460ff1615610ee6576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b602052604090205460ff16610f43576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff16610fa0576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600b60205260408082209285168252812060038084015460028086015492840154908401549394610fe49492939290612b84565b95945050505050565b600554600090610100900460ff161561103b576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b602052604090205460ff16611098576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff166110f5576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600b6020526040808220928516825290206003808301546002808501549284015490840154600854610fe494929190612b84565b60025490565b60008215158061114e57508115155b611194576040805162461bcd60e51b81526020600482015260126024820152714552525f414d4f554e545f49535f5a45524f60701b604482015290519081900360640190fd5b61119c61564e565b506001600160a01b0385166000908152600b60209081526040918290208251608081018452815460ff161515815260018201549281019290925260028101549282019290925260039091015460608201526111f561564e565b506001600160a01b0385166000908152600b60209081526040918290208251608081018452815460ff1615158152600182015492810192909252600281015492820192909252600390910154606082015284156112735761126c826060015183604001518360600151846040015189600854613623565b9250611296565b611293826060015183604001518360600151846040015188600854614542565b92505b5050949350505050565b6005546040805163f99031a760e01b815233600482015290516000926201000090046001600160a01b03169163f99031a7916024808301926020929190829003018186803b1580156112f157600080fd5b505afa158015611305573d6000803e3d6000fd5b505050506040513d602081101561131b57600080fd5b5051806113a457506005546040805163f99031a760e01b81526001600160a01b0386811660048301529151620100009093049091169163f99031a791602480820192602092909190829003018186803b15801561137757600080fd5b505afa15801561138b573d6000803e3d6000fd5b505050506040513d60208110156113a157600080fd5b50515b6113e9576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d5d2125511531254d5607a1b604482015290519081900360640190fd5b336001600160a01b038516148061142357506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b61146c576040805162461bcd60e51b815260206004820152601560248201527422a9292fa12a27a5a2a72fa120a22fa1a0a62622a960591b604482015290519081900360640190fd5b6114778484846149e6565b336001600160a01b038516148015906114b557506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b15611537576001600160a01b03841660009081526001602090815260408083203384529091529020546114e89083614af6565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391926000805160206156aa8339815191529281900390910190a35b6001600160a01b038316301461155257611552848484614b58565b5060019392505050565b6001600160a01b03166000908152600b602052604090205460ff1690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561162f576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560095460ff1615611689576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6007546001600160a01b031633146116dd576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b64e8d4a51000811015611725576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d494e5f46454560a81b604482015290519081900360640190fd5b67016345785d8a0000811115611770576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d41585f46454560a81b604482015290519081900360640190fd5b6008556005805461ff0019169055565b6005546000908190610100900460ff16156117d0576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff1661183c576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0386166000908152600b602052604090205460ff16611899576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600954610100900460ff166118eb576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000818152600b60209081526040808320948b16835280832081516370a0823160e01b8152306004820152915190946119829390926370a082319260248083019392829003018186803b15801561194c57600080fd5b505afa158015611960573d6000803e3d6000fd5b505050506040513d602081101561197657600080fd5b50516003850154614af6565b9050600081116119d9576040805162461bcd60e51b815260206004820152601860248201527f4552525f414d4f554e54494e5f4e4f545f494e5f506f6f6c0000000000000000604482015290519081900360640190fd5b6119f983600301546002670de0b6b3a7640000816119f357fe5b04614c56565b811115611a40576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b6000611a6282611a5d611a566008546006614d1f565b6001614c56565b614c56565b90506000611a858560030154866002015486600301548760020154600854612b84565b905087811115611ad2576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b611af2856003015486600201548660030154876002015487600854613623565b965089871015611b39576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6000611b458484614af6565b9050611b55866003015482614e27565b8660030181905550611b6b856003015489614af6565b600380870182905587015460028089015490880154600854611b8e949190612b84565b965081871015611bd7576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b88871115611c1e576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b611c288489614d1f565b821115611c6e576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b8b6001600160a01b03168d6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378878c604051808381526020018281526020019250505060405180910390a4611cd68c8b8a614e74565b611d5a8d600560029054906101000a90046001600160a01b03166001600160a01b0316636611f5286040518163ffffffff1660e01b815260040160206040518083038186803b158015611d2857600080fd5b505afa158015611d3c573d6000803e3d6000fd5b505050506040513d6020811015611d5257600080fd5b505185614e74565b611d678e8e8e878c614e7f565b5050505050506005805461ff00191690559097909650945050505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611e31576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600754336001600160a01b0390911614611e96576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b602052604090205460ff16611ef3576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b60095460ff161580611f0a5750611f08611139565b155b611f4e576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b670de0b6b3a7640000811015611f9c576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d5d15251d21560921b604482015290519081900360640190fd5b6802b5e3af16b1880000811115611feb576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3505617d5d15251d21560921b604482015290519081900360640190fd5b620f4240821015612035576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4d494e5f42414c414e434560881b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040902060020154808211156120cc5761206e600c546120698484614af6565b614e27565b600c8190556802b5e3af16b188000010156120c7576040805162461bcd60e51b815260206004820152601460248201527311549497d3505617d513d5105317d5d15251d21560621b604482015290519081900360640190fd5b6120ed565b808210156120ed576120e9600c546120e48385614af6565b614af6565b600c555b6001600160a01b0384166000908152600b60205260409020600281018390556003018054908490558084111561213657612131853361212c8785614af6565b614f78565b612159565b8084101561215957600061214a8286614af6565b9050612157863383614e74565b505b50506005805461ff0019169055505050565b6007546001600160a01b031633146121bf576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6006546001600160a01b031615612296576006546040805163694710c760e11b815260048101918252604481018690526001600160a01b039092169163d28e218e9187918791879187919081906024810190606401876020880280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b15801561227d57600080fd5b505af1158015612291573d6000803e3d6000fd5b505050505b50505050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054808311156122f1573360009081526001602090815260408083206001600160a01b0388168452909152812055612320565b6122fb8184614af6565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b0389168085529083529281902054815190815290519293926000805160206156aa833981519152929181900390910190a35060019392505050565b6001600160a01b031660009081526020819052604090205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561243b576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600754336001600160a01b03909116146124a0576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6124a981614f84565b506005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612563576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600b602052604090205460ff166125cf576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b15801561261557600080fd5b505afa158015612629573d6000803e3d6000fd5b505050506040513d602081101561263f57600080fd5b50516001600160a01b039091166000908152600b60205260409020600301556005805461ff0019169055565b60095460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612720576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600754336001600160a01b0390911614612785576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615612800576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b50600c5490565b600554600090610100900460ff1615612855576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff166128b2576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600b602052604090206002015490565b6007546001600160a01b03163314612925576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b604080516306b42de360e21b8152306004820152673782dace9d90000060248201526044810183905290516000916001600160a01b03891691631ad0b78c9160648082019260209290919082900301818787803b15801561298557600080fd5b505af1158015612999573d6000803e3d6000fd5b505050506040513d60208110156129af57600080fd5b505190506129bc81614f84565b6000821180156129cd5750600f8211155b80156129d857508415155b80156129e357508483145b15612aae576006546040805163694710c760e11b815260048101918252604481018890526001600160a01b039092169163d28e218e9189918991899189919081906024810190606401876020880280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015612a9557600080fd5b505af1158015612aa9573d6000803e3d6000fd5b505050505b604080516392eefe9b60e01b815233600482015290516001600160a01b038316916392eefe9b91602480830192600092919082900301818387803b158015612af557600080fd5b505af1158015612b09573d6000803e3d6000fd5b5050505050505050505050565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e395780601f10610e0e57610100808354040283529160200191610e39565b6542524f4e5a4560d01b90565b600080612b918787614d1f565b90506000612b9f8686614d1f565b90506000612bad8383614d1f565b90506000612bd4670de0b6b3a7640000612bcf670de0b6b3a764000089614af6565b614d1f565b9050612be08282614c56565b9a9950505050505050505050565b6005546040805163f99031a760e01b815233600482015290516000926201000090046001600160a01b03169163f99031a7916024808301926020929190829003018186803b158015612c3f57600080fd5b505afa158015612c53573d6000803e3d6000fd5b505050506040513d6020811015612c6957600080fd5b505180612cf257506005546040805163f99031a760e01b81526001600160a01b0386811660048301529151620100009093049091169163f99031a791602480820192602092909190829003018186803b158015612cc557600080fd5b505afa158015612cd9573d6000803e3d6000fd5b505050506040513d6020811015612cef57600080fd5b50515b612d37576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d5d2125511531254d5607a1b604482015290519081900360640190fd5b612d423384846149e6565b6001600160a01b0383163014612d5d57612d5d338484614b58565b50600192915050565b6005546000908190610100900460ff1615612db6576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0388166000908152600b602052604090205460ff16612e22576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0386166000908152600b602052604090205460ff16612e7f576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600954610100900460ff16612ed1576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038881166000908152600b6020526040808220928916825290206003810154612f09906704a03ce68d215556614c56565b871115612f51576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000612f728360030154846002015484600301548560020154600854612b84565b905085811115612fbf576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b612fdf83600301548460020154846003015485600201548c600854614542565b945060006130728c6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561303c57600080fd5b505afa158015613050573d6000803e3d6000fd5b505050506040513d602081101561306657600080fd5b50516003860154614af6565b9050808614801561308357508a8111155b6130c3576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b60006130d987611a5d611a566008546006614d1f565b90506130ed85600301546120698984614af6565b856003018190555061310384600301548b614af6565b600380860182905586015460028088015490870154600854613126949190612b84565b95508286101561316f576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b878611156131b6576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b6131c0878b614d1f565b831115613206576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b8a6001600160a01b03168d6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788a8e604051808381526020018281526020019250505060405180910390a461326e8b8a8c614e74565b6132f28d600560029054906101000a90046001600160a01b03166001600160a01b0316636611f5286040518163ffffffff1660e01b815260040160206040518083038186803b1580156132c057600080fd5b505afa1580156132d4573d6000803e3d6000fd5b505050506040513d60208110156132ea57600080fd5b505183614e74565b6132ff8e8e8d8a8e614e7f565b50505050506005805461ff0019169055909890975095505050505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156133c9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560095460ff16613423576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600061342d611139565b9050600061343b8583614d1f565b905080613481576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b61348b3386614fa6565b61349485614fb0565b60005b600a54811015613616576000600a82815481106134b057fe5b60009182526020808320909101546001600160a01b0316808352600b9091526040822060030154909250906134e58583614c56565b90508061352b576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b87878581811061353757fe5b90506020020135811015613582576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b60205260409020600301546135a89082614af6565b6001600160a01b0384166000818152600b60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a361360b833383614e74565b505050600101613497565b50612159600033876145ed565b6000806136308786614d1f565b90506000613646670de0b6b3a764000085614af6565b90506136528582614c56565b905060006136648a612bcf8c85614e27565b905060006136728285614fb9565b90506000613688670de0b6b3a764000083614af6565b90506136948a82614c56565b9c9b505050505050505050505050565b600554606090610100900460ff16156136f2576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60095460ff1661373d576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600a805480602002602001604051908101604052809291908181526020018280548015610e3957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613775575050505050905090565b600554600090610100900460ff16156137ea576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b506006546001600160a01b031690565b600554606090610100900460ff161561373d576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b600a5490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156138fa576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600754336001600160a01b039091161461395f576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0381166000908152600b602052604090205460ff166139bc576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b60095460ff1615613a07576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6001600160a01b0381166000908152600b602052604090206003810154600c546002909201549091613a3891614af6565b600c556001600160a01b0382166000908152600b6020526040902060010154600a80546000198101919082908110613a6c57fe5b600091825260209091200154600a80546001600160a01b039092169184908110613a9257fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600b6000600a8581548110613ad257fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600a805480613b0557fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038b168752600b909552929094209051815460ff19169015151781559251600184015551600283015551600390910155613b8d843385614e74565b50506005805461ff00191690555050565b600554600090610100900460ff1615613bec576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b5060085490565b3360009081526001602090815260408083206001600160a01b0386168452909152812054613c219083614e27565b3360008181526001602090815260408083206001600160a01b0389168085529083529281902085905580519485525191936000805160206156aa833981519152929081900390910190a350600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613d20576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560095460ff16613d7a576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6000613d84611139565b90506000613d928383614d1f565b905080613dd8576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60005b600a54811015613fb0576000600a8281548110613df457fe5b60009182526020808320909101546001600160a01b0316808352600b909152604082206003015490925090613e298583614c56565b905080613e6f576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b80613f1c600a8681548110613e8057fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b158015613ecf57600080fd5b505afa158015613ee3573d6000803e3d6000fd5b505050506040513d6020811015613ef957600080fd5b50516001600160a01b0386166000908152600b6020526040902060030154614af6565b1015613f2757600080fd5b6001600160a01b0383166000908152600b6020526040902060030154613f4d9082614e27565b6001600160a01b0384166000818152600b60209081526040918290206003019390935580518481529051919233927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9281900390910190a3505050600101613ddb565b50613fba836145d3565b613fc484846145df565b613b8d600185856145ed565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061400561564e565b506001600160a01b0385166000908152600b60209081526040918290208251608081018452815460ff1615158152600182015492810192909252600281015492820192909252600390910154606082015261405e61564e565b506001600160a01b0385166000908152600b60209081526040918290208251608081018452815460ff1615158152600182015492810192909252600281015492820192909252600390910154606082015284158015906140bd57508315155b156141175760006140d886611a5d611a566008546006614d1f565b905061410f6140ef84606001516120698985614af6565b8460400151614102856060015189614af6565b8560400151600854612b84565b935050611296565b6112938260600151836040015183606001518460400151600854612b84565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26007546001600160a01b031633146141eb576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b602052604090205460ff1615614248576040805162461bcd60e51b815260206004820152600c60248201526b11549497d254d7d093d5539160a21b604482015290519081900360640190fd5b60095460ff1615614293576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600a546008116142db576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d41585f544f4b454e5360901b604482015290519081900360640190fd5b604080516080810182526001808252600a805460208085019182526000858701818152606087018281526001600160a01b038c16808452600b9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319169091179055614388838383611d85565b505050565b600554600090610100900460ff16156143db576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff16614438576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b6020526040902060020154600c54614462908290614d1f565b9392505050565b6007546001600160a01b031681565b600554600090610100900460ff16156144c6576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff16614523576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600b602052604090206003015490565b60008061454f8588614d1f565b9050600061455d8786614af6565b9050600061456b8883614d1f565b905060006145798285614fb9565b905061458d81670de0b6b3a7640000614af6565b90506145a1670de0b6b3a764000087614af6565b94506145b66145b08c83614c56565b86614d1f565b9b9a5050505050505050505050565b600954610100900460ff1690565b6145dc816150c7565b50565b6145e9828261513c565b5050565b6006546001600160a01b0316156146f05760018315151461467e5760065460408051633953208d60e21b81526000600482018190526001600160a01b038681166024840152604483018690529251929093169263e54c82349260648084019382900301818387803b15801561466157600080fd5b505af1158015614675573d6000803e3d6000fd5b505050506146f0565b6006546040805163cf33fc2960e01b81526000600482018190526001600160a01b038681166024840152604483018690529251929093169263cf33fc299260648084019382900301818387803b1580156146d757600080fd5b505af11580156146eb573d6000803e3d6000fd5b505050505b60055460408051633b736e5160e11b815281516000936201000090046001600160a01b0316926376e6dca2926004808201939182900301818787803b15801561473857600080fd5b505af115801561474c573d6000803e3d6000fd5b505050506040513d604081101561476257600080fd5b505190506001600160a01b0381161561229657600a5460408051828152602080840282010190915282916060919080156147a6578160200160208202803883390190505b5090506060600a805490506040519080825280602002602001820160405280156147da578160200160208202803883390190505b50905060005b600a548110156148a057600b6000600a83815481106147fb57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060030154835184908390811061483157fe5b602002602001018181525050614881600b6000600a848154811061485157fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060020154600c54614d1f565b82828151811061488d57fe5b60209081029190910101526001016147e0565b50826001600160a01b031663eda6851087600a85858a8d6040518763ffffffff1660e01b815260040180876001600160a01b03166001600160a01b0316815260200180602001806020018060200186815260200185151515158152602001848103845289818154815260200191508054801561494557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614927575b50508481038352885181528851602091820191808b01910280838360005b8381101561497b578181015183820152602001614963565b50505050905001848103825287818151815260200191508051906020019060200280838360005b838110156149ba5781810151838201526020016149a2565b505050509050019950505050505050505050600060405180830381600087803b158015612af557600080fd5b6001600160a01b038316600090815260208190526040902054811115614a4a576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b038316600090815260208190526040902054614a6d9082614af6565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614a9c9082614e27565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000806000614b058585615147565b915091508015614b50576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b60055460408051633b736e5160e11b815281516000936201000090046001600160a01b0316926376e6dca2926004808201939182900301818787803b158015614ba057600080fd5b505af1158015614bb4573d6000803e3d6000fd5b505050506040513d6040811015614bca57600080fd5b505190506001600160a01b038116156122965760408051630a6c953560e01b81526001600160a01b03868116600483015285811660248301526044820185905291518392831691630a6c953591606480830192600092919082900301818387803b158015614c3757600080fd5b505af1158015614c4b573d6000803e3d6000fd5b505050505050505050565b6000828202831580614c70575082848281614c6d57fe5b04145b614cb4576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614d07576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b600081614d62576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a76400008302831580614d8a5750670de0b6b3a7640000848281614d8757fe5b04145b614dce576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b60028304810181811015614e1c576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6000848281614d1457fe5b600082820183811015614462576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b61438883838361516c565b60055460408051633b736e5160e11b815281516000936201000090046001600160a01b0316926376e6dca2926004808201939182900301818787803b158015614ec757600080fd5b505af1158015614edb573d6000803e3d6000fd5b505050506040513d6040811015614ef157600080fd5b506020015190506001600160a01b03811615614f705760408051635fd8b58560e01b81526001600160a01b03888116600483015287811660248301526044820186905286811660648301526084820185905291518392831691635fd8b5859160a480830192600092919082900301818387803b158015612af557600080fd5b505050505050565b614388838330846152c0565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6145e98282615415565b6145dc81615420565b60006001831015615009576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff83111561505f576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b600061506a836154f0565b905060006150788483614af6565b9050600061508e866150898561550b565b615519565b90508161509f579250610e92915050565b60006150b087846305f5e100615570565b90506150bc8282614c56565b979650505050505050565b306000908152602081905260409020546150e19082614e27565b306000908152602081905260409020556002546150fe9082614e27565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b6145e93083836149e6565b60008082841061515d5750508082036000615165565b505081810360015b9250929050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106151e95780518252601f1990920191602091820191016151ca565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461524b576040519150601f19603f3d011682016040523d82523d6000602084013e615250565b606091505b509150915081801561527e57508051158061527e575080806020019051602081101561527b57600080fd5b50515b6152b95760405162461bcd60e51b815260040180806020018281038252602d8152602001806156ca602d913960400191505060405180910390fd5b5050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106153455780518252601f199092019160209182019101615326565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146153a7576040519150601f19603f3d011682016040523d82523d6000602084013e6153ac565b606091505b50915091508180156153da5750805115806153da57508080602001905160208110156153d757600080fd5b50515b614f705760405162461bcd60e51b81526004018080602001828103825260318152602001806156796031913960400191505060405180910390fd5b6145e98230836149e6565b3060009081526020819052604090205481111561547b576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b306000908152602081905260409020546154959082614af6565b306000908152602081905260409020556002546154b29082614af6565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b6000670de0b6b3a76400006155048361550b565b0292915050565b670de0b6b3a7640000900490565b6000806002830661553257670de0b6b3a7640000615534565b835b90506002830492505b82156144625761554d8485614c56565b93506002830615615565576155628185614c56565b90505b60028304925061553d565b600082818061558787670de0b6b3a7640000615147565b9092509050670de0b6b3a764000080600060015b88841061563f576000670de0b6b3a7640000820290506000806155cf8a6155ca85670de0b6b3a7640000614af6565b615147565b915091506155e187611a5d848c614c56565b96506155ed8784614d1f565b9650866155fc5750505061563f565b8715615606579315935b8015615610579315935b8415615627576156208688614af6565b9550615634565b6156318688614e27565b95505b50505060010161559b565b50909998505050505050505050565b6040518060800160405280600015158152602001600081526020016000815260200160008152509056fe5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65648c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564a265627a7a72315820d0d05639be59699da025475c218434826be4bb1fa272a8a98763a88bbd4021d864736f6c634300050c0032
Deployed Bytecode Sourcemap
1291:21654:4:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1291:21654:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5739:576;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5739:576:4;;;;;;;;:::i;:::-;;2840:81:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2840:81:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3426:180;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3426:180:5;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;10014:469:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10014:469:4;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;9539;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9539:469:4;;;;;;;;;;:::i;3334:86:5:-;;;:::i;17207:689:4:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;17207:689:4;;;;;;;;;;;;;;;;;;;;;;:::i;21725:675::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21725:675:4;;;;;;;;;;;;;;;;;:::i;3366:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3366:110:4;-1:-1:-1;;;;;3366:110:4;;:::i;3018:80:5:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4963:327:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4963:327:4;;:::i;12417:2401::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;12417:2401:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;7017:1376;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7017:1376:4;;;;;;;;;;;;;:::i;18704:270::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18704:270:4;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;18704:270:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;18704:270:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;18704:270:4;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;18704:270:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;18704:270:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;18704:270:4;;-1:-1:-1;18704:270:4;-1:-1:-1;18704:270:4;:::i;3866:388:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3866:388:5;;;;;;;;:::i;3228:100::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3228:100:5;-1:-1:-1;;;;;3228:100:5;;:::i;5483:166:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5483:166:4;-1:-1:-1;;;;;5483:166:4;;:::i;9327:206::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9327:206:4;-1:-1:-1;;;;;9327:206:4;;:::i;3262:98::-;;;:::i;5296:181::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5296:181:4;-1:-1:-1;;;;;5296:181:4;;:::i;4127:130::-;;;:::i;3915:206::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3915:206:4;-1:-1:-1;;;;;3915:206:4;;:::i;22406:537::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;22406:537:4;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;22406:537:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22406:537:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;22406:537:4;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;22406:537:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22406:537:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;22406:537:4;;-1:-1:-1;22406:537:4;-1:-1:-1;22406:537:4;;:::i;2927:85:5:-;;;:::i;787:101:0:-;;;:::i;1636:486:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;1636:486:2;;;;;;;;;;;;;;;;;;;;;;:::i;21390:329:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21390:329:4;;;;;;;;:::i;14824:2377::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;14824:2377:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;11436:974::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11436:974:4;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;11436:974:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11436:974:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;11436:974:4;;-1:-1:-1;11436:974:4;-1:-1:-1;11436:974:4;:::i;3128:656:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;3128:656:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3727:182:4:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3727:182:4;;;;;;;;;;;;;;;;;4841:116;;;:::i;:::-;;;;-1:-1:-1;;;;;4841:116:4;;;;;;;;;;;;;;3591:130;;;:::i;3482:103::-;;;:::i;8399:846::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8399:846:4;-1:-1:-1;;;;;8399:846:4;;:::i;4725:110::-;;;:::i;3612:248:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3612:248:5;;;;;;;;:::i;10489:941:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10489:941:4;;;;;;;;:::i;3104:118:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3104:118:5;;;;;;;;;;:::i;17901:797:4:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;17901:797:4;;;;;;;;;;;;;;;;;;;;;;:::i;6322:689::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6322:689:4;;;;;;;;;;;;;:::i;4263:254::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4263:254:4;-1:-1:-1;;;;;4263:254:4;;:::i;2548:25::-;;;:::i;4523:196::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4523:196:4;-1:-1:-1;;;;;4523:196:4;;:::i;4790:645:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;4790:645:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3156:100:4:-;;;:::i;5739:576::-;2120:10;-1:-1:-1;;;;;2102:39:4;2111:7;;-1:-1:-1;;;;;;2111:7:4;-1:-1:-1;;;;;2102:39:4;;2132:8;;2102:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;2102:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;2102:39:4;;;;-1:-1:-1;2102:39:4;;-1:-1:-1;;;;2102:39:4;2202:6;;;;;;;2201:7;2193:31;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;;;;2234:6;:13;;-1:-1:-1;;2234:13:4;;;;;5869:10;;5855;-1:-1:-1;;;;;5869:10:4;;;5855:24;5847:55;;;;;-1:-1:-1;;;5847:55:4;;;;;;;;;;;;-1:-1:-1;;;5847:55:4;;;;;;;;;;;;;;;5921:10;;;;5920:11;;:33;;;5935:13;:11;:13::i;:::-;:18;5920:33;5912:62;;;;;-1:-1:-1;;;5912:62:4;;;;;;;;;;;;-1:-1:-1;;;5912:62:4;;;;;;;;;;;;;;;5992:7;:14;824:1:1;-1:-1:-1;5992:34:4;5984:61;;;;;-1:-1:-1;;;5984:61:4;;;;;;;;;;;;-1:-1:-1;;;5984:61:4;;;;;;;;;;;;;;;6056:10;:17;;-1:-1:-1;;;;6056:17:4;;;6069:4;6056:17;6083:18;6056:17;6083:18;;;6056:10;6129:18;;:53;;6169:13;6129:53;;;1277:10:1;6129:53:4;6112:70;;6193:22;6208:6;6193:14;:22::i;:::-;6225:35;6240:11;6253:6;6225:14;:35::i;:::-;6270:38;6282:4;6288:11;6301:6;6270:11;:38::i;:::-;-1:-1:-1;;2268:6:4;:14;;-1:-1:-1;;2268:14:4;;;-1:-1:-1;5739:576:4:o;2840:81:5:-;2909:5;2902:12;;;;;;;;-1:-1:-1;;2902:12:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2877:13;;2902:12;;2909:5;;2902:12;;2909:5;2902:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2840:81;:::o;3426:180::-;3511:10;3484:4;3500:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3500:27:5;;;;;;;;;;;:33;;;3548:30;;;;;;;3484:4;;3500:27;;3511:10;;-1:-1:-1;;;;;;;;;;;3548:30:5;;;;;;;-1:-1:-1;3595:4:5;3426:180;;;;;:::o;10014:469:4:-;2336:6;;10124:14;;2336:6;;;;;2335:7;2327:31;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;10162:17:4;;;;;;:8;:17;;;;;:23;;;10154:49;;;;;-1:-1:-1;;;10154:49:4;;;;;;;;;;;;-1:-1:-1;;;10154:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;10221:18:4;;;;;;:8;:18;;;;;:24;;;10213:50;;;;;-1:-1:-1;;;10213:50:4;;;;;;;;;;;;-1:-1:-1;;;10213:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;10299:17:4;;;10273:23;10299:17;;;:8;:17;;;;;;10353:18;;;;;;;10402:16;;;;;10420:15;;;;;10437:17;;;;10456:16;;;;10353:18;;10388:88;;10402:16;;10420:15;10456:16;10388:13;:88::i;:::-;10381:95;10014:469;-1:-1:-1;;;;;10014:469:4:o;9539:::-;2336:6;;9642:14;;2336:6;;;;;2335:7;2327:31;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;9680:17:4;;;;;;:8;:17;;;;;:23;;;9672:49;;;;;-1:-1:-1;;;9672:49:4;;;;;;;;;;;;-1:-1:-1;;;9672:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;9739:18:4;;;;;;:8;:18;;;;;:24;;;9731:50;;;;;-1:-1:-1;;;9731:50:4;;;;;;;;;;;;-1:-1:-1;;;9731:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;9817:17:4;;;9791:23;9817:17;;;:8;:17;;;;;;9871:18;;;;;;;9920:16;;;;;9938:15;;;;;9955:17;;;;9974:16;;;;9992:8;;9906:95;;9938:15;9955:17;9974:16;9906:13;:95::i;3334:86:5:-;3401:12;;3334:86;:::o;17207:689:4:-;17343:17;17384:13;;;;:31;;-1:-1:-1;17401:14:4;;;17384:31;17376:62;;;;;-1:-1:-1;;;17376:62:4;;;;;;;;;;;;-1:-1:-1;;;17376:62:4;;;;;;;;;;;;;;;17448:22;;:::i;:::-;-1:-1:-1;;;;;;17473:26:4;;;;;;:8;:26;;;;;;;;;17448:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17509:23;;:::i;:::-;-1:-1:-1;;;;;;17535:27:4;;;;;;:8;:27;;;;;;;;;17509:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17576:13;;17572:318;;17620:106;17635:8;:16;;;17653:8;:15;;;17670:9;:17;;;17689:9;:16;;;17707:8;17717;;17620:14;:106::i;:::-;17605:121;;17572:318;;;17772:107;17787:8;:16;;;17805:8;:15;;;17822:9;:17;;;17841:9;:16;;;17859:9;17870:8;;17772:14;:107::i;:::-;17757:122;;17572:318;17207:689;;;;;;;;:::o;21725:675::-;21825:8;;:32;;;-1:-1:-1;;;21825:32:4;;21846:10;21825:32;;;;;;-1:-1:-1;;21825:8:4;;;-1:-1:-1;;;;;21825:8:4;;:20;;:32;;;;;;;;;;;;;;:8;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;21825:32:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21825:32:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21825:32:4;;:61;;-1:-1:-1;21861:8:4;;:25;;;-1:-1:-1;;;21861:25:4;;-1:-1:-1;;;;;21861:25:4;;;;;;;;;:8;;;;;;;;:20;;:25;;;;;;;;;;;;;;;:8;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;21861:25:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21861:25:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21861:25:4;21825:61;21817:91;;;;;-1:-1:-1;;;21817:91:4;;;;;;;;;;;;-1:-1:-1;;;21817:91:4;;;;;;;;;;;;;;;21926:10;-1:-1:-1;;;;;21926:17:4;;;;:55;;-1:-1:-1;;;;;;21954:15:4;;;;;;:10;:15;;;;;;;;21970:10;21954:27;;;;;;;;21947:34;;;21926:55;21918:89;;;;;-1:-1:-1;;;21918:89:4;;;;;;;;;;;;-1:-1:-1;;;21918:89:4;;;;;;;;;;;;;;;22017:20;22023:3;22028;22033;22017:5;:20::i;:::-;22051:10;-1:-1:-1;;;;;22051:17:4;;;;;;:63;;-1:-1:-1;;;;;;22072:15:4;;;;;;:10;:15;;;;;;;;22088:10;22072:27;;;;;;;;-1:-1:-1;;22072:42:4;;22051:63;22047:235;;;-1:-1:-1;;;;;22165:15:4;;;;;;:10;:15;;;;;;;;22181:10;22165:27;;;;;;;;22160:38;;22194:3;22160:4;:38::i;:::-;-1:-1:-1;;;;;22130:15:4;;;;;;;:10;:15;;;;;;;;22146:10;22130:27;;;;;;;;;;:68;;;22217:54;;;;;;;;;;22146:10;;-1:-1:-1;;;;;;;;;;;22217:54:4;;;;;;;;;22047:235;-1:-1:-1;;;;;22294:20:4;;22309:4;22294:20;22291:82;;22329:33;22348:3;22353;22358;22329:18;:33::i;:::-;-1:-1:-1;22389:4:4;21725:675;;;;;:::o;3366:110::-;-1:-1:-1;;;;;3452:11:4;3425:4;3452:11;;;:8;:11;;;;;:17;;;;3366:110::o;3018:80:5:-;3082:9;;;;3018:80;:::o;4963:327:4:-;2120:10;-1:-1:-1;;;;;2102:39:4;2111:7;;-1:-1:-1;;;;;;2111:7:4;-1:-1:-1;;;;;2102:39:4;;2132:8;;2102:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;2102:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;2102:39:4;;;;-1:-1:-1;2102:39:4;;-1:-1:-1;;;;2102:39:4;2202:6;;;;;;;2201:7;2193:31;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;;;;2234:6;:13;;-1:-1:-1;;2234:13:4;;;;;5055:10;;2234:13;5055:10;5054:11;5046:40;;;;;-1:-1:-1;;;5046:40:4;;;;;;;;;;;;-1:-1:-1;;;5046:40:4;;;;;;;;;;;;;;;5118:10;;-1:-1:-1;;;;;5118:10:4;5104;:24;5096:55;;;;;-1:-1:-1;;;5096:55:4;;;;;;;;;;;;-1:-1:-1;;;5096:55:4;;;;;;;;;;;;;;;925:12:1;5169:18:4;;;5161:42;;;;;-1:-1:-1;;;5161:42:4;;;;;;;;;;;;-1:-1:-1;;;5161:42:4;;;;;;;;;;;;;;;986:9:1;5221:18:4;;;5213:42;;;;;-1:-1:-1;;;5213:42:4;;;;;;;;;;;;-1:-1:-1;;;5213:42:4;;;;;;;;;;;;;;;5265:8;:18;2268:6;:14;;-1:-1:-1;;2268:14:4;;;4963:327::o;12417:2401::-;2202:6;;12630:19;;;;2202:6;;;;;2201:7;2193:31;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;;;;2234:6;:13;;-1:-1:-1;;2234:13:4;;;;;-1:-1:-1;;;;;12695:17:4;;2234:13;12695:17;;;:8;:17;;;;;:23;2234:13;12695:23;12687:49;;;;;-1:-1:-1;;;12687:49:4;;;;;;;;;;;;-1:-1:-1;;;12687:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;12754:18:4;;;;;;:8;:18;;;;;:24;;;12746:50;;;;;-1:-1:-1;;;12746:50:4;;;;;;;;;;;;-1:-1:-1;;;12746:50:4;;;;;;;;;;;;;;;12814:11;;;;;;;12806:43;;;;;-1:-1:-1;;;12806:43:4;;;;;;;;;;;;-1:-1:-1;;;12806:43:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;12886:26:4;;;12860:23;12886:26;;;:8;:26;;;;;;;;12949:27;;;;;;;;13013:40;;-1:-1:-1;;;13013:40:4;;13047:4;13013:40;;;;;;12949:27;;13008:64;;12886:26;;13013:25;;:40;;;;;12886:26;13013:40;;;;;12886:26;13013:40;;;5:2:-1;;;;30:1;27;20:12;5:2;13013:40:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13013:40:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13013:40:4;13055:16;;;;13008:4;:64::i;:::-;12987:85;;13106:1;13090:13;:17;13082:54;;;;;-1:-1:-1;;;13082:54:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;13171:36;13176:8;:16;;;1528:1:1;768:6;1521:8;;;;;;13171:4:4;:36::i;:::-;13154:13;:53;;13146:82;;;;;-1:-1:-1;;;13146:82:4;;;;;;;;;;;;-1:-1:-1;;;13146:82:4;;;;;;;;;;;;;;;13239:18;13260:47;13265:13;13280:26;13285:17;13290:8;;13300:1;13285:4;:17::i;:::-;13304:1;13280:4;:26::i;:::-;13260:4;:47::i;:::-;13239:68;;13318:20;13341:165;13368:8;:16;;;13398:8;:15;;;13427:9;:17;;;13458:9;:16;;;13488:8;;13341:13;:165::i;:::-;13318:188;;13543:8;13524:15;:27;;13516:59;;;;;-1:-1:-1;;;13516:59:4;;;;;;;;;;;;-1:-1:-1;;;13516:59:4;;;;;;;;;;;;;;;13603:193;13631:8;:16;;;13661:8;:15;;;13690:9;:17;;;13721:9;:16;;;13751:13;13778:8;;13603:14;:193::i;:::-;13586:210;;13832:12;13814:14;:30;;13806:56;;;;;-1:-1:-1;;;13806:56:4;;;;;;;;;;;;-1:-1:-1;;;13806:56:4;;;;;;;;;;;;;;;13873:15;13891:31;13896:13;13911:10;13891:4;:31::i;:::-;13873:49;;13951:34;13956:8;:16;;;13974:10;13951:4;:34::i;:::-;13932:8;:16;;:53;;;;14015:39;14020:9;:17;;;14039:14;14015:4;:39::i;:::-;13995:17;;;;:59;;;14109:16;;;14139:15;;;;;14199:16;;;;14229:8;;14082:165;;13995:59;14199:16;14082:13;:165::i;:::-;14065:182;;14283:15;14265:14;:33;;14257:61;;;;;-1:-1:-1;;;14257:61:4;;;;;;;;;;;;-1:-1:-1;;;14257:61:4;;;;;;;;;;;;;;;14354:8;14336:14;:26;;14328:54;;;;;-1:-1:-1;;;14328:54:4;;;;;;;;;;;;-1:-1:-1;;;14328:54:4;;;;;;;;;;;;;;;14419:35;14424:13;14439:14;14419:4;:35::i;:::-;14400:15;:54;;14392:82;;;;;-1:-1:-1;;;14392:82:4;;;;;;;;;;;;-1:-1:-1;;;14392:82:4;;;;;;;;;;;;;;;14520:8;-1:-1:-1;;;;;14490:70:4;14511:7;-1:-1:-1;;;;;14490:70:4;14499:10;-1:-1:-1;;;;;14490:70:4;;14530:13;14545:14;14490:70;;;;;;;;;;;;;;;;;;;;;;;;14571:45;14587:8;14597:2;14601:14;14571:15;:45::i;:::-;14626:57;14642:7;14651:8;;;;;;;;;-1:-1:-1;;;;;14651:8:4;-1:-1:-1;;;;;14651:17:4;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14651:19:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14651:19:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14651:19:4;14672:10;14626:15;:57::i;:::-;14694:67;14706:4;14712:7;14721:8;14731:13;14746:14;14694:11;:67::i;:::-;-1:-1:-1;;;;;;2268:6:4;:14;;-1:-1:-1;;2268:14:4;;;12417:2401;;;;-1:-1:-1;12417:2401:4;-1:-1:-1;;;;;12417:2401:4:o;7017:1376::-;2120:10;-1:-1:-1;;;;;2102:39:4;2111:7;;-1:-1:-1;;;;;;2111:7:4;-1:-1:-1;;;;;2102:39:4;;2132:8;;2102:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;2102:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;2102:39:4;;;;-1:-1:-1;2102:39:4;;-1:-1:-1;;;;2102:39:4;2202:6;;;;;;;2201:7;2193:31;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;;;;2234:6;:13;;-1:-1:-1;;2234:13:4;;;;;7145:10;;7131;-1:-1:-1;;;;;7145:10:4;;;7131:24;7123:55;;;;;-1:-1:-1;;;7123:55:4;;;;;;;;;;;;-1:-1:-1;;;7123:55:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;7196:15:4;;;;;;:8;:15;;;;;:21;;;7188:47;;;;;-1:-1:-1;;;7188:47:4;;;;;;;;;;;;-1:-1:-1;;;7188:47:4;;;;;;;;;;;;;;;7254:10;;;;7253:11;;:33;;;7268:13;:11;:13::i;:::-;:18;7253:33;7245:62;;;;;-1:-1:-1;;;7245:62:4;;;;;;;;;;;;-1:-1:-1;;;7245:62:4;;;;;;;;;;;;;;;768:6:1;7326::4;:20;;7318:47;;;;;-1:-1:-1;;;7318:47:4;;;;;;;;;;;;-1:-1:-1;;;7318:47:4;;;;;;;;;;;;;;;1098:9:1;7383:20:4;;;7375:47;;;;;-1:-1:-1;;;7375:47:4;;;;;;;;;;;;-1:-1:-1;;;7375:47:4;;;;;;;;;;;;;;;1214:13:1;7440:22:4;;;7432:50;;;;;-1:-1:-1;;;7432:50:4;;;;;;;;;;;;-1:-1:-1;;;7432:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;7555:15:4;;7538:14;7555:15;;;:8;:15;;;;;:22;;;7591:18;;;7587:299;;;7640:43;7645:12;;7659:23;7664:6;7672:9;7659:4;:23::i;:::-;7640:4;:43::i;:::-;7625:12;:58;;;1156:9:1;-1:-1:-1;7705:32:4;7697:65;;;;;-1:-1:-1;;;7697:65:4;;;;;;;;;;;;-1:-1:-1;;;7697:65:4;;;;;;;;;;;;;;;7587:299;;;7792:9;7783:6;:18;7779:107;;;7832:43;7837:12;;7851:23;7856:9;7867:6;7851:4;:23::i;:::-;7832:4;:43::i;:::-;7817:12;:58;7779:107;-1:-1:-1;;;;;7895:15:4;;;;;;:8;:15;;;;;:22;;;:31;;;8017:23;;;;8050:33;;;;8097:20;;;8093:294;;;8133:61;8149:5;8156:10;8168:25;8173:7;8182:10;8168:4;:25::i;:::-;8133:15;:61::i;:::-;8093:294;;;8225:10;8215:7;:20;8211:176;;;8251:26;8280:25;8285:10;8297:7;8280:4;:25::i;:::-;8251:54;;8319:57;8335:5;8342:10;8354:21;8319:15;:57::i;:::-;8211:176;;-1:-1:-1;;2268:6:4;:14;;-1:-1:-1;;2268:14:4;;;-1:-1:-1;;;7017:1376:4:o;18704:270::-;18827:10;;-1:-1:-1;;;;;18827:10:4;18813;:24;18805:55;;;;;-1:-1:-1;;;18805:55:4;;;;;;;;;;;;-1:-1:-1;;;18805:55:4;;;;;;;;;;;;;;;18882:5;;-1:-1:-1;;;;;18882:5:4;18874:28;18870:98;;18926:5;;:31;;;-1:-1:-1;;;18926:31:4;;;;;;;;;;;;;;-1:-1:-1;;;;;18926:5:4;;;;:18;;18945:3;;;;18950:6;;;;18926:31;;;;;;;;;18945:3;18926:31;;;;18945:3;18926:31;1:33:-1;99:1;81:16;;;74:27;137:4;117:14;-1:-1;;113:30;157:16;;;18926:31:4;;;;;;;;;;;;;-1:-1:-1;18926:31:4;;;;;;;1:33:-1;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;18926:31:4;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18926:31:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18926:31:4;;;;18870:98;18704:270;;;;:::o;3866:388:5:-;3976:10;3933:4;3965:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3965:27:5;;;;;;;;;;4006:14;;;4002:156;;;4047:10;4066:1;4036:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4036:27:5;;;;;;;;;:31;4002:156;;;4128:19;4133:8;4143:3;4128:4;:19::i;:::-;4109:10;4098:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4098:27:5;;;;;;;;;:49;4002:156;4181:10;4198:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4172:54:5;;4198:27;;;;;;;;;;;4172:54;;;;;;;;;4181:10;-1:-1:-1;;;;;;;;;;;4172:54:5;;;;;;;;;;-1:-1:-1;4243:4:5;;3866:388;-1:-1:-1;;;3866:388:5:o;3228:100::-;-1:-1:-1;;;;;3307:14:5;3284:4;3307:14;;;;;;;;;;;;3228:100::o;5483:166:4:-;2120:10;-1:-1:-1;;;;;2102:39:4;2111:7;;-1:-1:-1;;;;;;2111:7:4;-1:-1:-1;;;;;2102:39:4;;2132:8;;2102:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;2102:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;2102:39:4;;;;-1:-1:-1;2102:39:4;;-1:-1:-1;;;;2102:39:4;2202:6;;;;;;;2201:7;2193:31;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;;;;2234:6;:13;;-1:-1:-1;;2234:13:4;;;;;5585:10;;5571;-1:-1:-1;;;;;5585:10:4;;;5571:24;5563:55;;;;;-1:-1:-1;;;5563:55:4;;;;;;;;;;;;-1:-1:-1;;;5563:55:4;;;;;;;;;;;;;;;5628:14;5637:4;5628:8;:14::i;:::-;-1:-1:-1;2268:6:4;:14;;-1:-1:-1;;2268:14:4;;;5483:166::o;9327:206::-;2120:10;-1:-1:-1;;;;;2102:39:4;2111:7;;-1:-1:-1;;;;;;2111:7:4;-1:-1:-1;;;;;2102:39:4;;2132:8;;2102:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;2102:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;2102:39:4;;;;-1:-1:-1;2102:39:4;;-1:-1:-1;;;;2102:39:4;2202:6;;;;;;;2201:7;2193:31;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;;;;2234:6;:13;;-1:-1:-1;;2234:13:4;;;;;-1:-1:-1;;;;;9413:15:4;;2234:13;9413:15;;;:8;:15;;;;;:21;2234:13;9413:21;9405:47;;;;;-1:-1:-1;;;9405:47:4;;;;;;;;;;;;-1:-1:-1;;;9405:47:4;;;;;;;;;;;;;;;9488:38;;;-1:-1:-1;;;9488:38:4;;9520:4;9488:38;;;;;;-1:-1:-1;;;;;9488:23:4;;;;;:38;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;9488:38:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9488:38:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9488:38:4;-1:-1:-1;;;;;9462:15:4;;;;;;;:8;9488:38;9462:15;;;;:23;;:64;2268:6;:14;;-1:-1:-1;;2268:14:4;;;9327:206::o;3262:98::-;3343:10;;;;3262:98;:::o;5296:181::-;2120:10;-1:-1:-1;;;;;2102:39:4;2111:7;;-1:-1:-1;;;;;;2111:7:4;-1:-1:-1;;;;;2102:39:4;;2132:8;;2102:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;2102:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;2102:39:4;;;;-1:-1:-1;2102:39:4;;-1:-1:-1;;;;2102:39:4;2202:6;;;;;;;2201:7;2193:31;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;;;;2234:6;:13;;-1:-1:-1;;2234:13:4;;;;;5407:10;;5393;-1:-1:-1;;;;;5407:10:4;;;5393:24;5385:55;;;;;-1:-1:-1;;;5385:55:4;;;;;;;;;;;;-1:-1:-1;;;5385:55:4;;;;;;;;;;;;;;;5450:10;:20;;-1:-1:-1;;;;;;5450:20:4;-1:-1:-1;;;;;5450:20:4;;;;;;;;;;2268:6;:14;;-1:-1:-1;;2268:14:4;;;5296:181::o;4127:130::-;2336:6;;4211:4;;2336:6;;;;;2335:7;2327:31;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;;;;-1:-1:-1;4238:12:4;;4127:130;:::o;3915:206::-;2336:6;;4007:4;;2336:6;;;;;2335:7;2327:31;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;4036:15:4;;;;;;:8;:15;;;;;:21;;;4028:47;;;;;-1:-1:-1;;;4028:47:4;;;;;;;;;;;;-1:-1:-1;;;4028:47:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4092:15:4;;;;;:8;:15;;;;;:22;;;;3915:206::o;22406:537::-;22590:10;;-1:-1:-1;;;;;22590:10:4;22576;:24;22568:55;;;;;-1:-1:-1;;;22568:55:4;;;;;;;;;;;;-1:-1:-1;;;22568:55:4;;;;;;;;;;;;;;;22651:56;;;-1:-1:-1;;;22651:56:4;;22679:4;22651:56;;;;22686:12;22651:56;;;;;;;;;;;;22633:15;;-1:-1:-1;;;;;22651:19:4;;;;;:56;;;;;;;;;;;;;;;22633:15;22651:19;:56;;;5:2:-1;;;;30:1;27;20:12;5:2;22651:56:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22651:56:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22651:56:4;;-1:-1:-1;22717:32:4;22651:56;22717:8;:32::i;:::-;22772:1;22763:6;:10;:26;;;;;22787:2;22777:6;:12;;22763:26;:45;;;;-1:-1:-1;22793:15:4;;;22763:45;:76;;;;-1:-1:-1;22812:27:4;;;22763:76;22759:138;;;22855:5;;:31;;;-1:-1:-1;;;22855:31:4;;;;;;;;;;;;;;-1:-1:-1;;;;;22855:5:4;;;;:18;;22874:3;;;;22879:6;;;;22855:31;;;;;;;;;22874:3;22855:31;;;;22874:3;22855:31;1:33:-1;99:1;81:16;;;74:27;137:4;117:14;-1:-1;;113:30;157:16;;;22855:31:4;;;;;;;;;;;;;-1:-1:-1;22855:31:4;;;;;;;1:33:-1;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;22855:31:4;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22855:31:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22855:31:4;;;;22759:138;22906:30;;;-1:-1:-1;;;22906:30:4;;22925:10;22906:30;;;;;;-1:-1:-1;;;;;22906:18:4;;;;;:30;;;;;-1:-1:-1;;22906:30:4;;;;;;;-1:-1:-1;22906:18:4;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;22906:30:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22906:30:4;;;;22406:537;;;;;;;:::o;2927:85:5:-;2998:7;2991:14;;;;;;;;-1:-1:-1;;2991:14:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2966:13;;2991:14;;2998:7;;2991:14;;2998:7;2991:14;;;;;;;;;;;;;;;;;;;;;;;;787:101:0;-1:-1:-1;;;787:101:0;:::o;1636:486:2:-;1832:14;1862:10;1875:35;1880:14;1896:13;1875:4;:35::i;:::-;1862:48;;1920:10;1933:37;1938:15;1955:14;1933:4;:37::i;:::-;1920:50;;1980:10;1993:18;1998:5;2005;1993:4;:18::i;:::-;1980:31;;2021:10;2034:31;768:6:1;2045:19:2;768:6:1;2056:7:2;2045:4;:19::i;:::-;2034:4;:31::i;:::-;2021:44;;2096:18;2101:5;2108;2096:4;:18::i;:::-;2084:30;1636:486;-1:-1:-1;;;;;;;;;;1636:486:2:o;21390:329:4:-;21473:8;;:32;;;-1:-1:-1;;;21473:32:4;;21494:10;21473:32;;;;;;-1:-1:-1;;21473:8:4;;;-1:-1:-1;;;;;21473:8:4;;:20;;:32;;;;;;;;;;;;;;:8;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;21473:32:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21473:32:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21473:32:4;;:61;;-1:-1:-1;21509:8:4;;:25;;;-1:-1:-1;;;21509:25:4;;-1:-1:-1;;;;;21509:25:4;;;;;;;;;:8;;;;;;;;:20;;:25;;;;;;;;;;;;;;;:8;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;21509:25:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21509:25:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21509:25:4;21473:61;21465:91;;;;;-1:-1:-1;;;21465:91:4;;;;;;;;;;;;-1:-1:-1;;;21465:91:4;;;;;;;;;;;;;;;21566:27;21572:10;21584:3;21589;21566:5;:27::i;:::-;-1:-1:-1;;;;;21606:20:4;;21621:4;21606:20;21603:89;;21641:40;21660:10;21672:3;21677;21641:18;:40::i;:::-;-1:-1:-1;21708:4:4;21390:329;;;;:::o;14824:2377::-;2202:6;;15066:18;;;;2202:6;;;;;2201:7;2193:31;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;;;;2234:6;:13;;-1:-1:-1;;2234:13:4;;;;;-1:-1:-1;;;;;15129:17:4;;2234:13;15129:17;;;:8;:17;;;;;:23;2234:13;15129:23;15121:49;;;;;-1:-1:-1;;;15121:49:4;;;;;;;;;;;;-1:-1:-1;;;15121:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;15188:18:4;;;;;;:8;:18;;;;;:24;;;15180:50;;;;;-1:-1:-1;;;15180:50:4;;;;;;;;;;;;-1:-1:-1;;;15180:50:4;;;;;;;;;;;;;;;15248:11;;;;;;;15240:43;;;;;-1:-1:-1;;;15240:43:4;;;;;;;;;;;;-1:-1:-1;;;15240:43:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;15320:26:4;;;15294:23;15320:26;;;:8;:26;;;;;;15383:27;;;;;;;15452:17;;;;15447:38;;1578:18:1;15447:4:4;:38::i;:::-;15429:14;:56;;15421:86;;;;;-1:-1:-1;;;15421:86:4;;;;;;;;;;;;-1:-1:-1;;;15421:86:4;;;;;;;;;;;;;;;15518:20;15541:165;15568:8;:16;;;15598:8;:15;;;15627:9;:17;;;15658:9;:16;;;15688:8;;15541:13;:165::i;:::-;15518:188;;15743:8;15724:15;:27;;15716:59;;;;;-1:-1:-1;;;15716:59:4;;;;;;;;;;;;-1:-1:-1;;;15716:59:4;;;;;;;;;;;;;;;15802:194;15830:8;:16;;;15860:8;:15;;;15889:9;:17;;;15920:9;:16;;;15950:14;15978:8;;15802:14;:194::i;:::-;15786:210;;16006:24;16033:64;16045:7;-1:-1:-1;;;;;16038:25:4;;16072:4;16038:40;;;;;;;;;;;;;-1:-1:-1;;;;;16038:40:4;-1:-1:-1;;;;;16038:40:4;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16038:40:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16038:40:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16038:40:4;16080:16;;;;16033:4;:64::i;:::-;16006:91;;16132:19;16115:13;:36;:74;;;;;16178:11;16155:19;:34;;16115:74;16107:99;;;;;-1:-1:-1;;;16107:99:4;;;;;;;;;;;;-1:-1:-1;;;16107:99:4;;;;;;;;;;;;;;;16217:18;16238:47;16243:13;16258:26;16263:17;16268:8;;16278:1;16263:4;:17::i;16238:47::-;16217:68;;16315:55;16320:8;:16;;;16338:31;16343:13;16358:10;16338:4;:31::i;16315:55::-;16296:8;:16;;:74;;;;16400:39;16405:9;:17;;;16424:14;16400:4;:39::i;:::-;16380:17;;;;:59;;;16494:16;;;16524:15;;;;;16584:16;;;;16614:8;;16467:165;;16380:59;16584:16;16467:13;:165::i;:::-;16450:182;;16668:15;16650:14;:33;;16642:61;;;;;-1:-1:-1;;;16642:61:4;;;;;;;;;;;;-1:-1:-1;;;16642:61:4;;;;;;;;;;;;;;;16739:8;16721:14;:26;;16713:54;;;;;-1:-1:-1;;;16713:54:4;;;;;;;;;;;;-1:-1:-1;;;16713:54:4;;;;;;;;;;;;;;;16804:35;16809:13;16824:14;16804:4;:35::i;:::-;16785:15;:54;;16777:82;;;;;-1:-1:-1;;;16777:82:4;;;;;;;;;;;;-1:-1:-1;;;16777:82:4;;;;;;;;;;;;;;;16905:8;-1:-1:-1;;;;;16875:70:4;16896:7;-1:-1:-1;;;;;16875:70:4;16884:10;-1:-1:-1;;;;;16875:70:4;;16915:13;16930:14;16875:70;;;;;;;;;;;;;;;;;;;;;;;;16956:45;16972:8;16982:2;16986:14;16956:15;:45::i;:::-;17011:57;17027:7;17036:8;;;;;;;;;-1:-1:-1;;;;;17036:8:4;-1:-1:-1;;;;;17036:17:4;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17036:19:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17036:19:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17036:19:4;17057:10;17011:15;:57::i;:::-;17079:67;17091:4;17097:7;17106:8;17116:13;17131:14;17079:11;:67::i;:::-;-1:-1:-1;;;;;2268:6:4;:14;;-1:-1:-1;;2268:14:4;;;14824:2377;;;;-1:-1:-1;14824:2377:4;-1:-1:-1;;;;;;14824:2377:4:o;11436:974::-;2120:10;-1:-1:-1;;;;;2102:39:4;2111:7;;-1:-1:-1;;;;;;2111:7:4;-1:-1:-1;;;;;2102:39:4;;2132:8;;2102:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;2102:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;2102:39:4;;;;-1:-1:-1;2102:39:4;;-1:-1:-1;;;;2102:39:4;2202:6;;;;;;;2201:7;2193:31;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;;;;2234:6;:13;;-1:-1:-1;;2234:13:4;;;;;11561:10;;2234:13;11561:10;11553:40;;;;;-1:-1:-1;;;11553:40:4;;;;;;;;;;;;-1:-1:-1;;;11553:40:4;;;;;;;;;;;;;;;11604:14;11621:13;:11;:13::i;:::-;11604:30;;11644:10;11657:29;11662:12;11676:9;11657:4;:29::i;:::-;11644:42;-1:-1:-1;11704:10:4;11696:38;;;;;-1:-1:-1;;;11696:38:4;;;;;;;;;;;;-1:-1:-1;;;11696:38:4;;;;;;;;;;;;;;;11745:40;11760:10;11772:12;11745:14;:40::i;:::-;11795:28;11810:12;11795:14;:28::i;:::-;11839:6;11834:515;11855:7;:14;11851:18;;11834:515;;;11890:9;11902:7;11910:1;11902:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11902:10:4;11937:11;;;:8;:11;;;;;;:19;;;11902:10;;-1:-1:-1;11937:19:4;11992:16;11997:5;11937:19;11992:4;:16::i;:::-;11970:38;-1:-1:-1;12030:19:4;12022:47;;;;;-1:-1:-1;;;12022:47:4;;;;;;;;;;;;-1:-1:-1;;;12022:47:4;;;;;;;;;;;;;;;12109:13;;12123:1;12109:16;;;;;;;;;;;;;12091:14;:34;;12083:60;;;;;-1:-1:-1;;;12083:60:4;;;;;;;;;;;;-1:-1:-1;;;12083:60:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;12184:11:4;;;;;;:8;:11;;;;;:19;;;12179:41;;12205:14;12179:4;:41::i;:::-;-1:-1:-1;;;;;12157:11:4;;;;;;:8;:11;;;;;;;;;:19;;:63;;;;12239:39;;;;;;;12157:11;;12248:10;;12239:39;;;;;;;;;;12292:46;12308:1;12311:10;12323:14;12292:15;:46::i;:::-;-1:-1:-1;;;11871:3:4;;11834:515;;;;12359:44;12371:5;12378:10;12390:12;12359:11;:44::i;3128:656:2:-;3353:19;3388:16;3407:35;3412:13;3427:14;3407:4;:35::i;:::-;3388:54;;3452:15;3470:19;768:6:1;3481:7:2;3470:4;:19::i;:::-;3452:37;;3512:31;3517:13;3532:10;3512:4;:31::i;:::-;3499:44;;3553:6;3562:54;3567:14;3583:32;3588:14;3604:10;3583:4;:32::i;3562:54::-;3553:63;;3626:8;3637:20;3642:1;3645:11;3637:4;:20::i;:::-;3626:31;;3667:8;3678:15;768:6:1;3689:3:2;3678:4;:15::i;:::-;3667:26;;3720;3725:15;3742:3;3720:4;:26::i;:::-;3703:43;3128:656;-1:-1:-1;;;;;;;;;;;;3128:656:2:o;3727:182:4:-;2336:6;;3799:23;;2336:6;;;;;2335:7;2327:31;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;;;;3846:10;;;;3838:40;;;;;-1:-1:-1;;;3838:40:4;;;;;;;;;;;;-1:-1:-1;;;3838:40:4;;;;;;;;;;;;;;;3895:7;3888:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3888:14:4;;;;;;;;;;;;;;;;;;;;;;3727:182;:::o;4841:116::-;2336:6;;4906:7;;2336:6;;;;;2335:7;2327:31;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;;;;-1:-1:-1;4944:5:4;;-1:-1:-1;;;;;4944:5:4;4841:116;:::o;3591:130::-;2336:6;;3661:23;;2336:6;;;;;2335:7;2327:31;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;;;3482:103;3564:7;:14;3482:103;:::o;8399:846::-;2120:10;-1:-1:-1;;;;;2102:39:4;2111:7;;-1:-1:-1;;;;;;2111:7:4;-1:-1:-1;;;;;2102:39:4;;2132:8;;2102:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;2102:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;2102:39:4;;;;-1:-1:-1;2102:39:4;;-1:-1:-1;;;;2102:39:4;2202:6;;;;;;;2201:7;2193:31;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;;;;2234:6;:13;;-1:-1:-1;;2234:13:4;;;;;8502:10;;8488;-1:-1:-1;;;;;8502:10:4;;;8488:24;8480:55;;;;;-1:-1:-1;;;8480:55:4;;;;;;;;;;;;-1:-1:-1;;;8480:55:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;8553:15:4;;;;;;:8;:15;;;;;:21;;;8545:47;;;;;-1:-1:-1;;;8545:47:4;;;;;;;;;;;;-1:-1:-1;;;8545:47:4;;;;;;;;;;;;;;;8611:10;;;;8610:11;8602:40;;;;;-1:-1:-1;;;8602:40:4;;;;;;;;;;;;-1:-1:-1;;;8602:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;8673:15:4;;8653:17;8673:15;;;:8;:15;;;;;:23;;;;8726:12;;8740:22;;;;;8673:23;;8721:42;;:4;:42::i;:::-;8706:12;:57;-1:-1:-1;;;;;8882:15:4;;8869:10;8882:15;;;:8;:15;;;;;:21;;;8925:7;:14;;-1:-1:-1;;8925:18:4;;;:7;:18;;8970:13;;;;;;;;;;;;;;;;8953:7;:14;;-1:-1:-1;;;;;8970:13:4;;;;8961:5;;8953:14;;;;;;;;;;;;;;:30;;;;;-1:-1:-1;;;;;8953:30:4;;;;;-1:-1:-1;;;;;8953:30:4;;;;;;9026:5;8993:8;:24;9002:7;9010:5;9002:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9002:14:4;8993:24;;;;;;;;;;;;9002:14;8993:30;:38;9041:7;:13;;;;;;;;;;;;;;;-1:-1:-1;;9041:13:4;;;;;;;-1:-1:-1;;;;;;9041:13:4;;;;;;;;;9082:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9064:15:4;;;;:8;:15;;;;;;;:115;;;;-1:-1:-1;;9064:115:4;;;;;;;;;-1:-1:-1;9064:115:4;;;;;;;;;;;;;;9190:48;9064:15;9213:10;9225:12;9190:15;:48::i;:::-;-1:-1:-1;;2268:6:4;:14;;-1:-1:-1;;2268:14:4;;;-1:-1:-1;;8399:846:4:o;4725:110::-;2336:6;;4793:4;;2336:6;;;;;2335:7;2327:31;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;;;;-1:-1:-1;4820:8:4;;4725:110;:::o;3612:248:5:-;3741:10;3679:4;3730:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3730:27:5;;;;;;;;;;3725:38;;3759:3;3725:4;:38::i;:::-;3706:10;3695:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3695:27:5;;;;;;;;;;;;:68;;;3778:54;;;;;;3695:27;;-1:-1:-1;;;;;;;;;;;3778:54:5;;;;;;;;;;-1:-1:-1;3849:4:5;3612:248;;;;:::o;10489:941:4:-;2120:10;-1:-1:-1;;;;;2102:39:4;2111:7;;-1:-1:-1;;;;;;2111:7:4;-1:-1:-1;;;;;2102:39:4;;2132:8;;2102:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;2102:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;2102:39:4;;;;-1:-1:-1;2102:39:4;;-1:-1:-1;;;;2102:39:4;2202:6;;;;;;;2201:7;2193:31;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;-1:-1:-1;;;2193:31:4;;;;;;;;;;;;;;;2234:6;:13;;-1:-1:-1;;2234:13:4;;;;;10605:10;;2234:13;10605:10;10597:40;;;;;-1:-1:-1;;;10597:40:4;;;;;;;;;;;;-1:-1:-1;;;10597:40:4;;;;;;;;;;;;;;;10648:14;10665:13;:11;:13::i;:::-;10648:30;;10688:10;10701:30;10706:13;10721:9;10701:4;:30::i;:::-;10688:43;-1:-1:-1;10749:10:4;10741:38;;;;;-1:-1:-1;;;10741:38:4;;;;;;;;;;;;-1:-1:-1;;;10741:38:4;;;;;;;;;;;;;;;10795:6;10790:487;10811:7;:14;10807:18;;10790:487;;;10846:9;10858:7;10866:1;10858:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10858:10:4;10893:11;;;:8;:11;;;;;;:19;;;10858:10;;-1:-1:-1;10893:19:4;10947:16;10952:5;10893:19;10947:4;:16::i;:::-;10926:37;-1:-1:-1;10985:18:4;10977:46;;;;;-1:-1:-1;;;10977:46:4;;;;;;;;;;;;-1:-1:-1;;;10977:46:4;;;;;;;;;;;;;;;11119:13;11045:70;11057:7;11065:1;11057:10;;;;;;;;;;;;;;;;;;;11050:43;;;-1:-1:-1;;;11050:43:4;;11087:4;11050:43;;;;;;-1:-1:-1;;;;;11057:10:4;;;;11050:28;;:43;;;;;;;;;;11057:10;11050:43;;;5:2:-1;;;;30:1;27;20:12;5:2;11050:43:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11050:43:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11050:43:4;-1:-1:-1;;;;;11095:11:4;;;;;;:8;11050:43;11095:11;;;;:19;;;11045:4;:70::i;:::-;:87;;11037:96;;;;;;-1:-1:-1;;;;;11174:11:4;;;;;;:8;:11;;;;;:19;;;11169:40;;11195:13;11169:4;:40::i;:::-;-1:-1:-1;;;;;11147:11:4;;;;;;:8;:11;;;;;;;;;:19;;:62;;;;11228:38;;;;;;;11147:11;;11237:10;;11228:38;;;;;;;;;;-1:-1:-1;;;10827:3:4;;10790:487;;;;11286:29;11301:13;11286:14;:29::i;:::-;11325:42;11340:11;11353:13;11325:14;:42::i;:::-;11378:45;11390:4;11396:11;11409:13;11378:11;:45::i;3104:118:5:-;-1:-1:-1;;;;;3195:15:5;;;3172:4;3195:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;3104:118::o;17901:797:4:-;18031:13;18060:22;;:::i;:::-;-1:-1:-1;;;;;;18085:26:4;;;;;;:8;:26;;;;;;;;;18060:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18121:23;;:::i;:::-;-1:-1:-1;;;;;;18147:27:4;;;;;;:8;:27;;;;;;;;;18121:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18188:13;;;;;:31;;-1:-1:-1;18205:14:4;;;18188:31;18184:508;;;18235:18;18256:42;18261:8;18271:26;18276:17;18281:8;;18291:1;18276:4;:17::i;18256:42::-;18235:63;;18320:227;18351:50;18356:8;:16;;;18374:26;18379:8;18389:10;18374:4;:26::i;18351:50::-;18419:8;:15;;;18452:34;18457:9;:17;;;18476:9;18452:4;:34::i;:::-;18504:9;:16;;;18538:8;;18320:13;:227::i;:::-;18312:235;;18184:508;;;;18586:95;18600:8;:16;;;18618:8;:15;;;18635:9;:17;;;18654:9;:16;;;18672:8;;18586:13;:95::i;6322:689::-;2120:10;-1:-1:-1;;;;;2102:39:4;2111:7;;-1:-1:-1;;;;;;2111:7:4;-1:-1:-1;;;;;2102:39:4;;2132:8;;2102:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;2102:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;2102:39:4;;;;-1:-1:-1;2102:39:4;;-1:-1:-1;;;;2102:39:4;6517:10;;-1:-1:-1;;;;;6517:10:4;6503;:24;6495:55;;;;;-1:-1:-1;;;6495:55:4;;;;;;;;;;;;-1:-1:-1;;;6495:55:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;6569:15:4;;;;;;:8;:15;;;;;:21;;;6568:22;6560:47;;;;;-1:-1:-1;;;6560:47:4;;;;;;;;;;;;-1:-1:-1;;;6560:47:4;;;;;;;;;;;;;;;6626:10;;;;6625:11;6617:40;;;;;-1:-1:-1;;;6617:40:4;;;;;;;;;;;;-1:-1:-1;;;6617:40:4;;;;;;;;;;;;;;;6676:7;:14;874:1:1;-1:-1:-1;6668:60:4;;;;;-1:-1:-1;;;6668:60:4;;;;;;;;;;;;-1:-1:-1;;;6668:60:4;;;;;;;;;;;;;;;6757:178;;;;;;;;6781:4;6757:178;;;6802:7;:14;;6757:178;;;;;;;-1:-1:-1;6757:178:4;;;;;;;;;;;;-1:-1:-1;;;;;6739:15:4;;;;;:8;:15;;;;;;:196;;;;-1:-1:-1;;6739:196:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;23:18;;;45:23;;6945:19:4;;;;;;;-1:-1:-1;;;;;;6945:19:4;;;;;;6974:30;6739:15;6988:7;6997:6;6974;:30::i;:::-;6322:689;;;:::o;4263:254::-;2336:6;;4353:4;;2336:6;;;;;2335:7;2327:31;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;4382:15:4;;;;;;:8;:15;;;;;:21;;;4374:47;;;;;-1:-1:-1;;;4374:47:4;;;;;;;;;;;;-1:-1:-1;;;4374:47:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;4445:15:4;;4431:11;4445:15;;;:8;:15;;;;;:22;;;4497:12;;4484:26;;4445:22;;4484:4;:26::i;:::-;4477:33;4263:254;-1:-1:-1;;;4263:254:4:o;2548:25::-;;;-1:-1:-1;;;;;2548:25:4;;:::o;4523:196::-;2336:6;;4604:4;;2336:6;;;;;2335:7;2327:31;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;-1:-1:-1;;;2327:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;4633:15:4;;;;;;:8;:15;;;;;:21;;;4625:47;;;;;-1:-1:-1;;;4625:47:4;;;;;;;;;;;;-1:-1:-1;;;4625:47:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4689:15:4;;;;;:8;:15;;;;;:23;;;;4523:196::o;4790:645:2:-;5016:18;5050:16;5069:35;5074:14;5090:13;5069:4;:35::i;:::-;5050:54;;5114:9;5126:37;5131:15;5148:14;5126:4;:37::i;:::-;5114:49;;5173:6;5182:27;5187:15;5204:4;5182;:27::i;:::-;5173:36;;5219:8;5230:20;5235:1;5238:11;5230:4;:20::i;:::-;5219:31;;5266:15;5271:3;768:6:1;5266:4:2;:15::i;:::-;5260:21;;5307:19;768:6:1;5318:7:2;5307:4;:19::i;:::-;5291:35;;5352:46;5357:25;5362:14;5378:3;5357:4;:25::i;:::-;5384:13;5352:4;:46::i;:::-;5336:62;4790:645;-1:-1:-1;;;;;;;;;;;4790:645:2:o;3156:100:4:-;3238:11;;;;;;;;3156:100::o;19640:84::-;19704:13;19710:6;19704:5;:13::i;:::-;19640:84;:::o;19534:100::-;19610:17;19616:2;19620:6;19610:5;:17::i;:::-;19534:100;;:::o;19820:865::-;19920:5;;-1:-1:-1;;;;;19920:5:4;19912:28;19908:165;;19971:4;19964:11;;;;:98;;20020:5;;:42;;;-1:-1:-1;;;20020:42:4;;:5;:42;;;;;;-1:-1:-1;;;;;20020:42:4;;;;;;;;;;;;;;;:5;;;;;:21;;:42;;;;;;;;;;:5;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;20020:42:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20020:42:4;;;;19964:98;;;19978:5;;:39;;;-1:-1:-1;;;19978:39:4;;:5;:39;;;;;;-1:-1:-1;;;;;19978:39:4;;;;;;;;;;;;;;;:5;;;;;:18;;:39;;;;;;;;;;:5;;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;19978:39:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19978:39:4;;;;19964:98;20109:8;;:20;;;-1:-1:-1;;;20109:20:4;;;;20084:19;;20109:8;;;-1:-1:-1;;;;;20109:8:4;;:18;;:20;;;;;;;;;;;20084:19;20109:8;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;20109:20:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20109:20:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20109:20:4;;-1:-1:-1;;;;;;20143:25:4;;;20139:539;;20285:7;:14;20271:29;;;;;;;;;;;;;;;;20217:11;;20243:25;;20271:29;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;20271:29:4;;20243:57;;20314:24;20355:7;:14;;;;20341:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;20341:29:4;-1:-1:-1;20314:56:4;-1:-1:-1;20389:6:4;20384:195;20405:7;:14;20401:18;;20384:195;;;20458:8;:20;20467:7;20475:1;20467:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20467:10:4;20458:20;;;;;;;;;;;;:28;;;20444:11;;:8;;20453:1;;20444:11;;;;;;;;;;;:42;;;;;20517:47;20522:8;:20;20531:7;20539:1;20531:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20531:10:4;20522:20;;;;;;;;;;;;:27;;;20551:12;;20517:4;:47::i;:::-;20504:7;20512:1;20504:10;;;;;;;;;;;;;;;;;:60;20421:3;;20384:195;;;;20593:6;-1:-1:-1;;;;;20593:27:4;;20621:4;20627:7;20636:8;20646:7;20655:6;20663:3;20593:74;;;;;;;;;;;;;-1:-1:-1;;;;;20593:74:4;-1:-1:-1;;;;;20593:74:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20593:74:4;;;;;;;;;;;;;;;;-1:-1:-1;;20593:74:4;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;20593:74:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;20593:74:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;2191:268:5;-1:-1:-1;;;;;2269:13:5;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;2269:20:5;2261:53;;;;;-1:-1:-1;;;2261:53:5;;;;;;;;;;;;-1:-1:-1;;;2261:53:5;;;;;;;;;;;;;;;-1:-1:-1;;;;;2345:13:5;;:8;:13;;;;;;;;;;;2340:24;;2360:3;2340:4;:24::i;:::-;-1:-1:-1;;;;;2324:13:5;;;:8;:13;;;;;;;;;;;:40;;;;2395:13;;;;;;;2390:24;;2410:3;2390:4;:24::i;:::-;-1:-1:-1;;;;;2374:13:5;;;:8;:13;;;;;;;;;;;;:40;;;;2429:23;;;;;;;2374:13;;2429:23;;;;;;;;;;;;;2191:268;;;:::o;1104:187:3:-;1165:4;1186:6;1194:9;1207:14;1216:1;1219;1207:8;:14::i;:::-;1185:36;;;;1240:4;1239:5;1231:35;;;;;-1:-1:-1;;;1231:35:3;;;;;;;;;;;;-1:-1:-1;;;1231:35:3;;;;;;;;;;;;;;;-1:-1:-1;1283:1:3;1104:187;-1:-1:-1;;;1104:187:3:o;21092:292:4:-;21201:8;;:20;;;-1:-1:-1;;;21201:20:4;;;;21176:19;;21201:8;;;-1:-1:-1;;;;;21201:8:4;;:18;;:20;;;;;;;;;;;21176:19;21201:8;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;21201:20:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21201:20:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21201:20:4;;-1:-1:-1;;;;;;21235:25:4;;;21231:147;;21326:41;;;-1:-1:-1;;;21326:41:4;;-1:-1:-1;;;;;21326:41:4;;;;;;;;;;;;;;;;;;;;;;21300:11;;21326:26;;;;;:41;;;;;21275:14;;21326:41;;;;;;;21275:14;21326:26;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;21326:41:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21326:41:4;;;;21231:147;21092:292;;;;:::o;1509:293:3:-;1570:4;1600:5;;;1623:6;;;:21;;;1643:1;1638;1633:2;:6;;;;;;:11;1623:21;1615:50;;;;;-1:-1:-1;;;1615:50:3;;;;;;;;;;;;-1:-1:-1;;;1615:50:3;;;;;;;;;;;;;;;1691:8;1685:15;;1718:8;;;;1710:37;;;;;-1:-1:-1;;;1710:37:3;;;;;;;;;;;;-1:-1:-1;;;1710:37:3;;;;;;;;;;;;;;;1757:7;768:6:1;1767:2:3;:9;;;1509:293;-1:-1:-1;;;;;;1509:293:3:o;1808:368::-;1869:4;1897:6;1889:31;;;;;-1:-1:-1;;;1889:31:3;;;;;;;;;;;;-1:-1:-1;;;1889:31:3;;;;;;;;;;;;;;;768:6:1;1940:8:3;;1966:6;;;:24;;;768:6:1;1981:1:3;1976:2;:6;;;;;;:14;1966:24;1958:53;;;;;-1:-1:-1;;;1958:53:3;;;;;;;;;;;;-1:-1:-1;;;1958:53:3;;;;;;;;;;;;;;;2058:1;2054:5;;2048:12;;2078:8;;;;2070:37;;;;;-1:-1:-1;;;2070:37:3;;;;;;;;;;;;-1:-1:-1;;;2070:37:3;;;;;;;;;;;;;;;2134:7;2149:1;2144:2;:6;;;;933:165;994:4;1023:5;;;1046:6;;;;1038:35;;;;;-1:-1:-1;;;1038:35:3;;;;;;;;;;;;-1:-1:-1;;;1038:35:3;;;;;;;;;;;;;;19288:130:4;19380:31;19393:5;19400:2;19404:6;19380:12;:31::i;20691:395::-;20863:8;;:20;;;-1:-1:-1;;;20863:20:4;;;;20838:21;;20863:8;;;-1:-1:-1;;;;;20863:8:4;;:18;;:20;;;;;;;;;;;20838:21;20863:8;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;20863:20:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20863:20:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20863:20:4;;;;-1:-1:-1;;;;;;20897:27:4;;;20893:187;;20992:77;;;-1:-1:-1;;;20992:77:4;;-1:-1:-1;;;;;20992:77:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20964:13;;20992:21;;;;;:77;;;;;20939:14;;20992:77;;;;;;;20939:14;20992:21;:77;;;5:2:-1;;;;30:1;27;20:12;20893:187:4;20691:395;;;;;;:::o;19129:153::-;19223:52;19240:5;19247:4;19261;19268:6;19223:16;:52::i;5655:78::-;5714:5;:12;;-1:-1:-1;;;;;;5714:12:4;-1:-1:-1;;;;;5714:12:4;;;;;;;;;;5655:78::o;19424:104::-;19502:19;19508:4;19514:6;19502:5;:19::i;19730:84::-;19794:13;19800:6;19794:5;:13::i;2649:526:3:-;2715:4;1337:5:1;2743:4:3;:21;;2735:55;;;;;-1:-1:-1;;;2735:55:3;;;;;;;;;;;;-1:-1:-1;;;2735:55:3;;;;;;;;;;;;;;;1391:18:1;2808:21:3;;;2800:56;;;;;-1:-1:-1;;;2800:56:3;;;;;;;;;;;;-1:-1:-1;;;2800:56:3;;;;;;;;;;;;;;;2867:10;2881:11;2888:3;2881:6;:11::i;:::-;2867:25;;2902:11;2916:16;2921:3;2926:5;2916:4;:16::i;:::-;2902:30;;2943:13;2959:24;2965:4;2971:11;2976:5;2971:4;:11::i;:::-;2959:5;:24::i;:::-;2943:40;-1:-1:-1;2998:11:3;2994:57;;3032:8;-1:-1:-1;3025:15:3;;-1:-1:-1;;3025:15:3;2994:57;3061:18;3082:40;3093:4;3099:6;1458:13:1;3082:10:3;:40::i;:::-;3061:61;;3139:29;3144:8;3154:13;3139:4;:29::i;:::-;3132:36;2649:526;-1:-1:-1;;;;;;;2649:526:3:o;1678:214:5:-;1770:4;1753:8;:23;;;;;;;;;;;1748:34;;1778:3;1748:4;:34::i;:::-;1739:4;1722:8;:23;;;;;;;;;;:60;1812:12;;1807:23;;1826:3;1807:4;:23::i;:::-;1792:12;:38;1845:40;;;;;;;;1874:4;;1862:1;;1845:40;;;;;;;;;1678:214;:::o;2465:92::-;2521:29;2535:4;2542:2;2546:3;2521:5;:29::i;1297:206:3:-;1362:4;1368;1397:1;1392;:6;1388:109;;-1:-1:-1;;1422:5:3;;;1429;1414:21;;1388:109;-1:-1:-1;;1474:5:3;;;1481:4;1388:109;1297:206;;;;;:::o;4885:438:5:-;5111:45;;;-1:-1:-1;;;;;5111:45:5;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;5111:45:5;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;5100:57:5;;;;5065:12;;5079:17;;5100:10;;;;5111:45;5100:57;;;25:18:-1;5100:57:5;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;5100:57:5;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;5064:93:5;;;;5188:7;:57;;;;-1:-1:-1;5200:11:5;;:16;;:44;;;5231:4;5220:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5220:24:5;5200:44;5167:149;;;;-1:-1:-1;;;5167:149:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4885:438;;;;;:::o;5329:486::-;5593:51;;;-1:-1:-1;;;;;5593:51:5;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;5593:51:5;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;5582:63:5;;;;5547:12;;5561:17;;5582:10;;;;5593:51;5582:63;;;25:18:-1;5582:63:5;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;5582:63:5;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;5546:99:5;;;;5676:7;:57;;;;-1:-1:-1;5688:11:5;;:16;;:44;;;5719:4;5708:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5708:24:5;5688:44;5655:153;;;;-1:-1:-1;;;5655:153:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2563:96;2621:31;2627:4;2641;2648:3;2621:5;:31::i;1898:287::-;1967:4;1950:8;:23;;;;;;;;;;;:30;-1:-1:-1;1950:30:5;1942:63;;;;;-1:-1:-1;;;1942:63:5;;;;;;;;;;;;-1:-1:-1;;;1942:63:5;;;;;;;;;;;;;;;2063:4;2046:8;:23;;;;;;;;;;;2041:34;;2071:3;2041:4;:34::i;:::-;2032:4;2015:8;:23;;;;;;;;;;:60;2105:12;;2100:23;;2119:3;2100:4;:23::i;:::-;2085:12;:38;2138:40;;;;;;;;2170:1;;2155:4;;2138:40;;;;;;;;;1898:287;:::o;824:103:3:-;879:4;768:6:1;906:7:3;911:1;906:4;:7::i;:::-;:14;;824:103;-1:-1:-1;;824:103:3:o;723:95::-;768:6:1;803:8:3;;;723:95::o;2201:292::-;2263:4;;2296:1;2292;:5;:21;;768:6:1;2292:21:3;;;2305:1;2292:21;2283:30;-1:-1:-1;2334:1:3;2329:6;;;;2324:145;2337:6;;2324:145;;2371:10;2376:1;2379;2371:4;:10::i;:::-;2367:14;-1:-1:-1;2404:1:3;2400;:5;:10;2396:63;;2434:10;2439:1;2442;2434:4;:10::i;:::-;2430:14;;2396:63;2350:1;2345:6;;;;2324:145;;3181:1039;3269:4;3321:3;3269:4;;3357:20;3366:4;768:6:1;3357:8:3;:20::i;:::-;3334:43;;-1:-1:-1;3334:43:3;-1:-1:-1;768:6:1;;3387:9:3;3712:1;3698:495;3723:9;3715:4;:17;3698:495;;3753:9;768:6:1;3765:1:3;:8;3753:20;;3788:6;3796:9;3809:29;3818:1;3821:16;3826:4;768:6:1;3821:4:3;:16::i;:::-;3809:8;:29::i;:::-;3787:51;;;;3859:22;3864:4;3870:10;3875:1;3878;3870:4;:10::i;3859:22::-;3852:29;;3902:16;3907:4;3913;3902;:16::i;:::-;3895:23;-1:-1:-1;3936:9:3;3932:20;;3947:5;;;;;3932:20;3971:4;3967:30;;;3988:9;;;3967:30;4015:4;4011:30;;;4032:9;;;4011:30;4059:8;4055:128;;;4093:15;4098:3;4103:4;4093;:15::i;:::-;4087:21;;4055:128;;;4153:15;4158:3;4163:4;4153;:15::i;:::-;4147:21;;4055:128;-1:-1:-1;;;3734:3:3;;3698:495;;;-1:-1:-1;4210:3:3;;3181:1039;-1:-1:-1;;;;;;;;;3181:1039:3:o;1291:21654:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://d0d05639be59699da025475c218434826be4bb1fa272a8a98763a88bbd4021d8
Loading...
Loading
Loading...
Loading
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.