More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,068 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 21002030 | 57 days ago | IN | 0 ETH | 0.00017622 | ||||
Approve | 18056349 | 470 days ago | IN | 0 ETH | 0.00031382 | ||||
Approve | 17769665 | 510 days ago | IN | 0 ETH | 0.00047918 | ||||
Approve | 17645016 | 527 days ago | IN | 0 ETH | 0.00065062 | ||||
Approve | 17642380 | 528 days ago | IN | 0 ETH | 0.00081877 | ||||
Approve | 16961445 | 624 days ago | IN | 0 ETH | 0.00048518 | ||||
Approve | 16923025 | 629 days ago | IN | 0 ETH | 0.00075528 | ||||
Approve | 16923023 | 629 days ago | IN | 0 ETH | 0.00074166 | ||||
Approve | 16917795 | 630 days ago | IN | 0 ETH | 0.0004515 | ||||
Approve | 14209982 | 1035 days ago | IN | 0 ETH | 0.0009713 | ||||
Approve | 14065466 | 1057 days ago | IN | 0 ETH | 0.00291507 | ||||
Approve | 12872794 | 1243 days ago | IN | 0 ETH | 0.00024599 | ||||
Exit Pool | 12761036 | 1261 days ago | IN | 0 ETH | 0.0010048 | ||||
Approve | 12754521 | 1262 days ago | IN | 0 ETH | 0.0001447 | ||||
Approve | 12627483 | 1281 days ago | IN | 0 ETH | 0.00018811 | ||||
Approve | 12624956 | 1282 days ago | IN | 0 ETH | 0.0001447 | ||||
Exit Pool | 12279040 | 1335 days ago | IN | 0 ETH | 0.0353988 | ||||
Exit Pool | 12137703 | 1357 days ago | IN | 0 ETH | 0.01157948 | ||||
Exit Pool | 11959741 | 1385 days ago | IN | 0 ETH | 0.0202938 | ||||
Exit Pool | 11909432 | 1392 days ago | IN | 0 ETH | 0.02189314 | ||||
Exit Pool | 11900244 | 1394 days ago | IN | 0 ETH | 0.01010803 | ||||
Exit Pool | 11794544 | 1410 days ago | IN | 0 ETH | 0.01916096 | ||||
Approve | 11774367 | 1413 days ago | IN | 0 ETH | 0.00651562 | ||||
Exit Pool | 11766302 | 1414 days ago | IN | 0 ETH | 0.01828438 | ||||
Exit Pool | 11658865 | 1431 days ago | IN | 0 ETH | 0.0066154 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
11002858 | 1532 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xBD14c6Bb...83ABF75D7 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
BPool
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-09-30 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; // 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/>. library BConst { uint public constant BONE = 10**18; uint public constant MIN_BOUND_TOKENS = 2; uint public constant MAX_BOUND_TOKENS = 8; uint public constant DEFAULT_FEE = BONE * 3 / 1000; // 0.3% uint public constant MIN_FEE = BONE / 10**6; uint public constant MAX_FEE = BONE / 10; uint public constant DEFAULT_COLLECTED_FEE = BONE / 2000; // 0.05% uint public constant MAX_COLLECTED_FEE = BONE / 200; // 0.5% uint public constant DEFAULT_EXIT_FEE = 0; uint public constant MAX_EXIT_FEE = BONE / 1000; // 0.1% uint public constant MIN_WEIGHT = BONE; uint public constant MAX_WEIGHT = BONE * 50; uint public constant MAX_TOTAL_WEIGHT = BONE * 50; uint public constant MIN_BALANCE = BONE / 10**12; uint public constant DEFAULT_INIT_POOL_SUPPLY = BONE * 100; uint public constant MIN_INIT_POOL_SUPPLY = BONE / 1000; uint public constant MAX_INIT_POOL_SUPPLY = BONE * 10**18; uint public constant MIN_BPOW_BASE = 1 wei; uint public constant MAX_BPOW_BASE = (2 * BONE) - 1 wei; uint public constant BPOW_PRECISION = BONE / 10**10; uint public constant MAX_IN_RATIO = BONE / 2; uint public 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/>. contract BNum { function btoi(uint a) internal pure returns (uint) { return a / BConst.BONE; } function bfloor(uint a) internal pure returns (uint) { return btoi(a) * BConst.BONE; } function badd(uint a, uint b) internal pure returns (uint) { uint c = a + b; require(c >= a, "add overflow"); return c; } function bsub(uint a, uint b) internal pure returns (uint) { (uint c, bool flag) = bsubSign(a, b); require(!flag, "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, "mul overflow"); uint c1 = c0 + (BConst.BONE / 2); require(c1 >= c0, "mul overflow"); uint c2 = c1 / BConst.BONE; return c2; } function bdiv(uint a, uint b) internal pure returns (uint) { require(b != 0, "div by 0"); uint c0 = a * BConst.BONE; require(a == 0 || c0 / a == BConst.BONE, "div internal"); // bmul overflow uint c1 = c0 + (b / 2); require(c1 >= c0, "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 : BConst.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 >= BConst.MIN_BPOW_BASE, "base too low"); require(base <= BConst.MAX_BPOW_BASE, "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, BConst.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, BConst.BONE); uint term = BConst.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 * BConst.BONE; (uint c, bool cneg) = bsubSign(a, bsub(bigK, BConst.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/>. // 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 BTokenBase is BNum { 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, "!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, "!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 BToken is BTokenBase, IERC20 { string private _name = "Value Liquidity Provider"; string private _symbol = "VLP"; 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 override view returns (uint) { return _allowance[src][dst]; } function balanceOf(address whom) external override view returns (uint) { return _balance[whom]; } function totalSupply() public override view returns (uint) { return _totalSupply; } function approve(address dst, uint amt) external override 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 override returns (bool) { _move(msg.sender, dst, amt); return true; } function transferFrom(address src, address dst, uint amt) external override returns (bool) { require(msg.sender == src || amt <= _allowance[src][msg.sender], "!spender"); _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; } } // 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/>. contract BMath is BNum { /********************************************************************************************** // calcSpotPrice // // sP = spotPrice // // bI = tokenBalanceIn ( bI / wI ) 1 // // bO = tokenBalanceOut sP = ----------- * ---------- // // wI = tokenWeightIn ( bO / wO ) ( 1 - sF ) // // wO = tokenWeightOut // // sF = swapFee (+ collectedFee) // **********************************************************************************************/ 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(BConst.BONE, bsub(BConst.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 (+ collectedFee) // **********************************************************************************************/ 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(BConst.BONE, swapFee); adjustedIn = bmul(tokenAmountIn, adjustedIn); uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn)); uint foo = bpow(y, weightRatio); uint bar = bsub(BConst.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 (+ collectedFee) // **********************************************************************************************/ 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, BConst.BONE); tokenAmountIn = bsub(BConst.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 (+ collectedFee)\ / // **********************************************************************************************/ function calcPoolOutGivenSingleIn( uint tokenBalanceIn, uint tokenWeightIn, uint poolSupply, uint totalWeight, uint tokenAmountIn, uint swapFee ) public pure returns (uint poolAmountOut) { // @dev 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(BConst.BONE, normalizedWeight), swapFee); uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BConst.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; } /********************************************************************************************** // calcSingleInGivenPoolOut // // tAi = tokenAmountIn //(pS + pAo)\ / 1 \\ // // pS = poolSupply || --------- | ^ | --------- || * bI - bI // // pAo = poolAmountOut \\ pS / \(wI / tW)// // // bI = balanceIn tAi = -------------------------------------------- // // wI = weightIn / wI \ // // tW = totalWeight | 1 - ---- | * sF // // sF = swapFee (+ collectedFee) \ tW / // **********************************************************************************************/ function calcSingleInGivenPoolOut( uint tokenBalanceIn, uint tokenWeightIn, uint poolSupply, uint totalWeight, uint poolAmountOut, uint swapFee ) public pure returns (uint tokenAmountIn) { uint normalizedWeight = bdiv(tokenWeightIn, totalWeight); uint newPoolSupply = badd(poolSupply, poolAmountOut); uint poolRatio = bdiv(newPoolSupply, poolSupply); //uint newBalTi = poolRatio^(1/weightTi) * balTi; uint boo = bdiv(BConst.BONE, normalizedWeight); uint tokenInRatio = bpow(poolRatio, boo); uint newTokenBalanceIn = bmul(tokenInRatio, tokenBalanceIn); uint tokenAmountInAfterFee = bsub(newTokenBalanceIn, tokenBalanceIn); // Do reverse order of fees charged in joinswap_ExternAmountIn, this way // ``` pAo == joinswap_ExternAmountIn(Ti, joinswap_PoolAmountOut(pAo, Ti)) ``` //uint tAi = tAiAfterFee / (1 - (1-weightTi) * swapFee) ; uint zar = bmul(bsub(BConst.BONE, normalizedWeight), swapFee); tokenAmountIn = bdiv(tokenAmountInAfterFee, bsub(BConst.BONE, zar)); return tokenAmountIn; } /********************************************************************************************** // calcSingleOutGivenPoolIn // // tAo = tokenAmountOut / / \\ // // bO = tokenBalanceOut / // pS - (pAi * (1 - eF)) \ / 1 \ \\ // // pAi = poolAmountIn | bO - || ----------------------- | ^ | --------- | * b0 || // // ps = poolSupply \ \\ pS / \(wO / tW)/ // // // wI = tokenWeightIn tAo = \ \ // // // tW = totalWeight / / wO \ \ // // sF = swapFee (+ collectedFee) * | 1 - | 1 - ---- | * sF | // // eF = exitFee \ \ tW / / // **********************************************************************************************/ function calcSingleOutGivenPoolIn( uint tokenBalanceOut, uint tokenWeightOut, uint poolSupply, uint totalWeight, uint poolAmountIn, uint swapFee, uint exitFee ) public 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, bsub(BConst.BONE, exitFee)); uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee); uint poolRatio = bdiv(newPoolSupply, poolSupply); // newBalTo = poolRatio^(1/weightTo) * balTo; uint tokenOutRatio = bpow(poolRatio, bdiv(BConst.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(BConst.BONE, normalizedWeight), swapFee); tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BConst.BONE, zaz)); return tokenAmountOut; } /********************************************************************************************** // calcPoolInGivenSingleOut // // pAi = poolAmountIn // / tAo \\ / wO \ \ // // bO = tokenBalanceOut // | bO - -------------------------- |\ | ---- | \ // // tAo = tokenAmountOut pS - || \ 1 - ((1 - (tO / tW)) * sF)/ | ^ \ tW / * pS | // // ps = poolSupply \\ -----------------------------------/ / // // wO = tokenWeightOut pAi = \\ bO / / // // tW = totalWeight ------------------------------------------------------------- // // sF = swapFee (+ collectedFee) ( 1 - eF ) // // eF = exitFee // **********************************************************************************************/ function calcPoolInGivenSingleOut( uint tokenBalanceOut, uint tokenWeightOut, uint poolSupply, uint totalWeight, uint tokenAmountOut, uint swapFee, uint exitFee ) public pure returns (uint poolAmountIn) { // charge swap fee on the output token side uint normalizedWeight = bdiv(tokenWeightOut, totalWeight); //uint tAoBeforeSwapFee = tAo / (1 - (1-weightTo) * swapFee) ; uint zoo = bsub(BConst.BONE, normalizedWeight); uint zar = bmul(zoo, swapFee); uint tokenAmountOutBeforeSwapFee = bdiv(tokenAmountOut, bsub(BConst.BONE, zar)); uint newTokenBalanceOut = bsub(tokenBalanceOut, tokenAmountOutBeforeSwapFee); uint tokenOutRatio = bdiv(newTokenBalanceOut, tokenBalanceOut); //uint newPoolSupply = (ratioTo ^ weightTo) * poolSupply; uint poolRatio = bpow(tokenOutRatio, normalizedWeight); uint newPoolSupply = bmul(poolRatio, poolSupply); uint poolAmountInAfterExitFee = bsub(poolSupply, newPoolSupply); // charge exit fee on the pool token side // pAi = pAiAfterExitFee/(1-exitFee) poolAmountIn = bdiv(poolAmountInAfterExitFee, bsub(BConst.BONE, exitFee)); return poolAmountIn; } } // 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/>. interface IBFactory { function collectedToken() external view returns(address); } contract BPool is BToken, BMath { 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); _; } event LOG_COLLECTED_FUND( address indexed collectedToken, uint256 collectedAmount ); modifier _lock_() { require(!_mutex, "reentry"); _mutex = true; _; _mutex = false; } modifier _viewlock_() { require(!_mutex, "reentry"); _; } bool private _mutex; uint public version = 1001; address public factory; // BFactory address to push token exitFee to address public controller; // has CONTROL role bool public publicSwap; // `setSwapFee` and `finalize` require CONTROL // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN` uint public initPoolSupply; uint public swapFee; uint public collectedFee; // 0.05% | https://yfv.finance/vip-vote/vip_5 uint public exitFee; bool public finalized; address[] private _tokens; mapping(address => Record) private _records; uint private _totalWeight; constructor(address _factory) public { controller = _factory; factory = _factory; initPoolSupply = BConst.DEFAULT_INIT_POOL_SUPPLY; swapFee = BConst.DEFAULT_FEE; collectedFee = BConst.DEFAULT_COLLECTED_FEE; exitFee = BConst.DEFAULT_EXIT_FEE; publicSwap = false; finalized = false; } function setInitPoolSupply(uint _initPoolSupply) public _logs_ { require(!finalized, "finalized"); require(msg.sender == controller, "!controller"); require(_initPoolSupply >= BConst.MIN_INIT_POOL_SUPPLY, "<minInitPoolSup"); require(_initPoolSupply <= BConst.MAX_INIT_POOL_SUPPLY, ">maxInitPoolSup"); initPoolSupply = _initPoolSupply; } function setCollectedFee(uint _collectedFee) public _logs_ { require(msg.sender == factory, "!factory"); require(_collectedFee <= BConst.MAX_COLLECTED_FEE, ">maxCoFee"); require(bmul(_collectedFee, 2) <= swapFee, ">swapFee/2"); collectedFee = _collectedFee; } function setExitFee(uint _exitFee) public _logs_ { require(!finalized, "finalized"); require(msg.sender == factory, "!factory"); require(_exitFee <= BConst.MAX_EXIT_FEE, ">maxExitFee"); exitFee = _exitFee; } 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, "!finalized"); return _tokens; } function getDenormalizedWeight(address token) external view _viewlock_ returns (uint) { require(_records[token].bound, "!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, "!bound"); uint denorm = _records[token].denorm; return bdiv(denorm, _totalWeight); } function getBalance(address token) external view _viewlock_ returns (uint) { require(_records[token].bound, "!bound"); return _records[token].balance; } function setSwapFee(uint _swapFee) external _lock_ _logs_ { require(!finalized, "finalized"); require(msg.sender == controller, "!controller"); require(_swapFee >= BConst.MIN_FEE, "<minFee"); require(_swapFee <= BConst.MAX_FEE, ">maxFee"); require(bmul(collectedFee, 2) <= _swapFee, "<collectedFee*2"); swapFee = _swapFee; } function setController(address _controller) external _lock_ _logs_ { require(msg.sender == controller, "!controller"); controller = _controller; } function setPublicSwap(bool _publicSwap) external _lock_ _logs_ { require(!finalized, "finalized"); require(msg.sender == controller, "!controller"); publicSwap = _publicSwap; } function finalize() external _lock_ _logs_ { require(msg.sender == controller, "!controller"); require(!finalized, "finalized"); require(_tokens.length >= BConst.MIN_BOUND_TOKENS, "<minTokens"); finalized = true; publicSwap = true; _mintPoolShare(initPoolSupply); _pushPoolShare(msg.sender, initPoolSupply); } 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, "!controller"); require(!_records[token].bound, "bound"); require(!finalized, "finalized"); require(_tokens.length < BConst.MAX_BOUND_TOKENS, ">maxTokens"); _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 _lock_ _logs_ { require(msg.sender == controller, "!controller"); require(_records[token].bound, "!bound"); require(!finalized, "finalized"); require(denorm >= BConst.MIN_WEIGHT, "<minWeight"); require(denorm <= BConst.MAX_WEIGHT, ">maxWeight"); require(balance >= BConst.MIN_BALANCE, "<minBal"); // Adjust the denorm and totalWeight uint oldWeight = _records[token].denorm; if (denorm > oldWeight) { _totalWeight = badd(_totalWeight, bsub(denorm, oldWeight)); require(_totalWeight <= BConst.MAX_TOTAL_WEIGHT, ">maxTWeight"); } 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) { // In this case liquidity is being withdrawn, so charge EXIT_FEE uint tokenBalanceWithdrawn = bsub(oldBalance, balance); uint tokenExitFee = bmul(tokenBalanceWithdrawn, exitFee); _pushUnderlying(token, msg.sender, bsub(tokenBalanceWithdrawn, tokenExitFee)); _pushUnderlying(token, factory, tokenExitFee); } } function unbind(address token) external _lock_ _logs_ { require(msg.sender == controller, "!controller"); require(_records[token].bound, "!bound"); require(!finalized, "finalized"); uint tokenBalance = _records[token].balance; uint tokenExitFee = bmul(tokenBalance, exitFee); _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, bsub(tokenBalance, tokenExitFee)); _pushUnderlying(token, factory, tokenExitFee); } // Absorb any tokens that have been sent to this contract into the pool function gulp(address token) external _logs_ _lock_ { require(_records[token].bound, "!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, "!bound"); require(_records[tokenOut].bound, "!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, "!bound"); require(_records[tokenOut].bound, "!bound"); Record storage inRecord = _records[tokenIn]; Record storage outRecord = _records[tokenOut]; return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, 0); } function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn) external _lock_ _logs_ { require(finalized, "!finalized"); uint poolTotal = totalSupply(); uint ratio = bdiv(poolAmountOut, poolTotal); require(ratio != 0, "errMathAprox"); 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, "errMathAprox"); require(tokenAmountIn <= maxAmountsIn[i], "<limIn"); _records[t].balance = badd(_records[t].balance, tokenAmountIn); emit LOG_JOIN(msg.sender, t, tokenAmountIn); _pullUnderlying(t, msg.sender, tokenAmountIn); } _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); } function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut) external _lock_ _logs_ { require(finalized, "!finalized"); uint poolTotal = totalSupply(); uint _exitFee = bmul(poolAmountIn, exitFee); uint pAiAfterExitFee = bsub(poolAmountIn, _exitFee); uint ratio = bdiv(pAiAfterExitFee, poolTotal); require(ratio != 0, "errMathAprox"); _pullPoolShare(msg.sender, poolAmountIn); _pushPoolShare(factory, _exitFee); _burnPoolShare(pAiAfterExitFee); 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, "errMathAprox"); require(tokenAmountOut >= minAmountsOut[i], "<limO"); _records[t].balance = bsub(_records[t].balance, tokenAmountOut); emit LOG_EXIT(msg.sender, t, tokenAmountOut); _pushUnderlying(t, msg.sender, tokenAmountOut); } } function swapExactAmountIn( address tokenIn, uint tokenAmountIn, address tokenOut, uint minAmountOut, uint maxPrice ) external _lock_ _logs_ returns (uint tokenAmountOut, uint spotPriceAfter) { require(_records[tokenIn].bound, "!bound"); require(_records[tokenOut].bound, "!bound"); require(publicSwap, "!publicSwap"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require(tokenAmountIn <= bmul(inRecord.balance, BConst.MAX_IN_RATIO), ">maxIRat"); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, swapFee ); require(spotPriceBefore <= maxPrice, "badLimPrice"); tokenAmountOut = calcOutGivenIn( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountIn, swapFee ); require(tokenAmountOut >= minAmountOut, "<limO"); inRecord.balance = badd(inRecord.balance, tokenAmountIn); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); spotPriceAfter = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, swapFee ); require(spotPriceAfter >= spotPriceBefore, "errMathAprox"); require(spotPriceAfter <= maxPrice, ">limPrice"); require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "errMathAprox"); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); uint _subTokenAmountIn; (_subTokenAmountIn, tokenAmountOut) = _pushCollectedFundGivenOut(tokenIn, tokenAmountIn, tokenOut, tokenAmountOut); if (_subTokenAmountIn > 0) inRecord.balance = bsub(inRecord.balance, _subTokenAmountIn); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return (tokenAmountOut, spotPriceAfter); } function swapExactAmountOut( address tokenIn, uint maxAmountIn, address tokenOut, uint tokenAmountOut, uint maxPrice ) external _lock_ _logs_ returns (uint tokenAmountIn, uint spotPriceAfter) { require(_records[tokenIn].bound, "!bound"); require(_records[tokenOut].bound, "!bound"); require(publicSwap, "!publicSwap"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require(tokenAmountOut <= bmul(outRecord.balance, BConst.MAX_OUT_RATIO), ">maxORat"); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, swapFee ); require(spotPriceBefore <= maxPrice, "badLimPrice"); tokenAmountIn = calcInGivenOut( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountOut, swapFee ); require(tokenAmountIn <= maxAmountIn, "<limIn"); inRecord.balance = badd(inRecord.balance, tokenAmountIn); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); spotPriceAfter = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, swapFee ); require(spotPriceAfter >= spotPriceBefore, "errMathAprox"); require(spotPriceAfter <= maxPrice, ">limPrice"); require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "errMathAprox"); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); uint _collectedFeeAmount = _pushCollectedFundGivenIn(tokenIn, tokenAmountIn); if (_collectedFeeAmount > 0) inRecord.balance = bsub(inRecord.balance, _collectedFeeAmount); return (tokenAmountIn, spotPriceAfter); } function joinswapExternAmountIn(address tokenIn, uint tokenAmountIn, uint minPoolAmountOut) external _lock_ _logs_ returns (uint poolAmountOut) { require(finalized, "!finalized"); require(_records[tokenIn].bound, "!bound"); require(tokenAmountIn <= bmul(_records[tokenIn].balance, BConst.MAX_IN_RATIO), ">maxIRat"); Record storage inRecord = _records[tokenIn]; poolAmountOut = calcPoolOutGivenSingleIn( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, tokenAmountIn, swapFee ); require(poolAmountOut >= minPoolAmountOut, "<limO"); inRecord.balance = badd(inRecord.balance, tokenAmountIn); emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn); _mintPoolShare(poolAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); uint _subTokenAmountIn; (_subTokenAmountIn, poolAmountOut) = _pushCollectedFundGivenOut(tokenIn, tokenAmountIn, address(this), poolAmountOut); if (_subTokenAmountIn > 0) inRecord.balance = bsub(inRecord.balance, _subTokenAmountIn); _pushPoolShare(msg.sender, poolAmountOut); return poolAmountOut; } function joinswapPoolAmountOut(address tokenIn, uint poolAmountOut, uint maxAmountIn) external _lock_ _logs_ returns (uint tokenAmountIn) { require(finalized, "!finalized"); require(_records[tokenIn].bound, "!bound"); Record storage inRecord = _records[tokenIn]; tokenAmountIn = calcSingleInGivenPoolOut( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, poolAmountOut, swapFee ); require(tokenAmountIn != 0, "errMathAprox"); require(tokenAmountIn <= maxAmountIn, "<limIn"); require(tokenAmountIn <= bmul(_records[tokenIn].balance, BConst.MAX_IN_RATIO), ">maxIRat"); inRecord.balance = badd(inRecord.balance, tokenAmountIn); emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn); _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); uint _collectedFeeAmount = _pushCollectedFundGivenIn(tokenIn, tokenAmountIn); if (_collectedFeeAmount > 0) inRecord.balance = bsub(inRecord.balance, _collectedFeeAmount); return tokenAmountIn; } function exitswapPoolAmountIn(address tokenOut, uint poolAmountIn, uint minAmountOut) external _lock_ _logs_ returns (uint tokenAmountOut) { require(finalized, "!finalized"); require(_records[tokenOut].bound, "!bound"); Record storage outRecord = _records[tokenOut]; tokenAmountOut = calcSingleOutGivenPoolIn( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, poolAmountIn, swapFee, exitFee ); require(tokenAmountOut >= minAmountOut, "<limO"); require(tokenAmountOut <= bmul(_records[tokenOut].balance, BConst.MAX_OUT_RATIO), ">maxORat"); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); uint _exitFee = bmul(poolAmountIn, exitFee); emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut); _pullPoolShare(msg.sender, poolAmountIn); _burnPoolShare(bsub(poolAmountIn, _exitFee)); _pushPoolShare(factory, _exitFee); (, tokenAmountOut) = _pushCollectedFundGivenOut(address(this), poolAmountIn, tokenOut, tokenAmountOut); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return tokenAmountOut; } function exitswapExternAmountOut(address tokenOut, uint tokenAmountOut, uint maxPoolAmountIn) external _lock_ _logs_ returns (uint poolAmountIn) { require(finalized, "!finalized"); require(_records[tokenOut].bound, "!bound"); require(tokenAmountOut <= bmul(_records[tokenOut].balance, BConst.MAX_OUT_RATIO), ">maxORat"); Record storage outRecord = _records[tokenOut]; poolAmountIn = calcPoolInGivenSingleOut( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, tokenAmountOut, swapFee, exitFee ); require(poolAmountIn != 0, "errMathAprox"); require(poolAmountIn <= maxPoolAmountIn, "<limIn"); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); uint _exitFee = bmul(poolAmountIn, exitFee); emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut); _pullPoolShare(msg.sender, poolAmountIn); uint _collectedFeeAmount = _pushCollectedFundGivenIn(address(this), poolAmountIn); _burnPoolShare(bsub(bsub(poolAmountIn, _exitFee), _collectedFeeAmount)); _pushPoolShare(factory, _exitFee); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return poolAmountIn; } // == // '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 { bool xfer = IERC20(erc20).transferFrom(from, address(this), amount); require(xfer, "errErc20"); } function _pushUnderlying(address erc20, address to, uint amount) internal { bool xfer = IERC20(erc20).transfer(to, amount); require(xfer, "errErc20"); } 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 _pushCollectedFundGivenOut(address _tokenIn, uint _tokenAmountIn, address _tokenOut, uint _tokenAmountOut) internal returns (uint subTokenAmountIn, uint tokenAmountOut) { subTokenAmountIn = 0; tokenAmountOut = _tokenAmountOut; if (collectedFee > 0) { address _collectedToken = IBFactory(factory).collectedToken(); if (_collectedToken == _tokenIn) { subTokenAmountIn = bdiv(bmul(_tokenAmountIn, collectedFee), BConst.BONE); _pushUnderlying(_tokenIn, factory, subTokenAmountIn); emit LOG_COLLECTED_FUND(_tokenIn, subTokenAmountIn); } else { uint _collectedFeeAmount = bdiv(bmul(_tokenAmountOut, collectedFee), BConst.BONE); _pushUnderlying(_tokenOut, factory, _collectedFeeAmount); tokenAmountOut = bsub(_tokenAmountOut, _collectedFeeAmount); emit LOG_COLLECTED_FUND(_tokenOut, _collectedFeeAmount); } } } // always push out _tokenIn (already have) function _pushCollectedFundGivenIn(address _tokenIn, uint _tokenAmountIn) internal returns (uint collectedFeeAmount) { collectedFeeAmount = 0; if (collectedFee > 0) { address _collectedToken = IBFactory(factory).collectedToken(); if (_collectedToken != address(0)) { collectedFeeAmount = bdiv(bmul(_tokenAmountIn, collectedFee), BConst.BONE); _pushUnderlying(_tokenIn, factory, collectedFeeAmount); emit LOG_COLLECTED_FUND(_tokenIn, collectedFeeAmount); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"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":"collectedToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"collectedAmount","type":"uint256"}],"name":"LOG_COLLECTED_FUND","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"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"pure","type":"function"},{"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"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"uint256","name":"exitFee","type":"uint256"}],"name":"calcPoolInGivenSingleOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcPoolOutGivenSingleIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSingleInGivenPoolOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"uint256","name":"exitFee","type":"uint256"}],"name":"calcSingleOutGivenPoolIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"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"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"collectedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exitFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPoolAmountIn","type":"uint256"}],"name":"exitswapExternAmountOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"exitswapPoolAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initPoolSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"}],"name":"joinswapExternAmountIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"}],"name":"joinswapPoolAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"rebind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectedFee","type":"uint256"}],"name":"setCollectedFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_exitFee","type":"uint256"}],"name":"setExitFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_initPoolSupply","type":"uint256"}],"name":"setInitPoolSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSwap","type":"bool"}],"name":"setPublicSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"unbind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103785760003560e01c80637c5e9ea4116101d3578063be3bbd2e11610104578063e4e1e538116100a2578063f1b8a9b71161007c578063f1b8a9b714610c26578063f77c479114610c4c578063f8b2cb4f14610c54578063f8d6aed414610c7a57610378565b8063e4e1e53814610bcf578063e5a583a914610c01578063e811f50a14610c1e57610378565b8063cd2ed8fb116100de578063cd2ed8fb14610b47578063cf5e7bd314610b4f578063d73dd62314610b75578063dd62ed3e14610ba157610378565b8063be3bbd2e14610ac3578063c45a015514610b1b578063cc77828d14610b3f57610378565b8063948d8ce611610171578063a9059cbb1161014b578063a9059cbb146109dd578063b02f0b7314610a09578063b3f05b9714610a80578063ba9530a614610a8857610378565b8063948d8ce61461097a57806395d89b41146109a0578063a221ee49146109a857610378565b80638c0ba32f116101ad5780638c0ba32f1461091e5780638c28cbe81461092657806392eefe9b1461094c578063936c34771461097257610378565b80637c5e9ea41461084a5780638201aa3f146108a35780638656b653146108e357610378565b8063429b4ae6116102ad5780635c1bbaf71161024b578063661884631161022557806366188463146107855780636d06dfa0146107b157806370a08231146107e357806379104ea61461080957610378565b80635c1bbaf7146107105780635db342771461074b5780636284ae411461077d57610378565b80634bb278f3116102875780634bb278f3146106815780634f69c0d41461068957806354cf2aeb1461070057806354fd4d501461070857610378565b8063429b4ae61461061357806346ab38f11461063057806349b595521461066257610378565b80631e1f761b1161031a5780632f37b624116102f45780632f37b62414610580578063313ce567146105a657806334e19907146105c45780633fdddaa2146105e157610378565b80631e1f761b1461052357806323b872dd1461052b5780632da778bc1461056157610378565b8063095ea7b311610356578063095ea7b31461047f5780631446a7ff146104bf57806315e84af9146104ed57806318160ddd1461051b57610378565b8063024eb2e31461037d57806302c96748146103d057806306fdde0314610402575b600080fd5b6103be600480360360e081101561039357600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610cb5565b60408051918252519081900360200190f35b6103be600480360360608110156103e657600080fd5b506001600160a01b038135169060208101359060400135610d79565b61040a6110c0565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561044457818101518382015260200161042c565b50505050905090810190601f1680156104715780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104ab6004803603604081101561049557600080fd5b506001600160a01b038135169060200135611156565b604080519115158252519081900360200190f35b6103be600480360360408110156104d557600080fd5b506001600160a01b03813581169160200135166111ab565b6103be6004803603604081101561050357600080fd5b506001600160a01b03813581169160200135166112ee565b6103be611428565b6103be61142e565b6104ab6004803603606081101561054157600080fd5b506001600160a01b03813581169160208101359091169060400135611434565b61057e6004803603602081101561057757600080fd5b5035611581565b005b6104ab6004803603602081101561059657600080fd5b50356001600160a01b031661171c565b6105ae61173a565b6040805160ff9092168252519081900360200190f35b61057e600480360360208110156105da57600080fd5b5035611743565b61057e600480360360608110156105f757600080fd5b506001600160a01b038135169060208101359060400135611969565b61057e6004803603602081101561062957600080fd5b5035611d2d565b6103be6004803603606081101561064657600080fd5b506001600160a01b038135169060208101359060400135611e73565b61057e6004803603602081101561067857600080fd5b50351515612166565b61057e6122c7565b61057e6004803603604081101561069f57600080fd5b813591908101906040810160208201356401000000008111156106c157600080fd5b8201836020820111156106d357600080fd5b803590602001918460208302840111640100000000831117156106f557600080fd5b509092509050612489565b6103be61275b565b6103be612761565b6103be600480360360c081101561072657600080fd5b5080359060208101359060408101359060608101359060808101359060a00135612767565b6103be6004803603606081101561076157600080fd5b506001600160a01b03813516906020810135906040013561281a565b6103be612ae5565b6104ab6004803603604081101561079b57600080fd5b506001600160a01b038135169060200135612aeb565b6103be600480360360608110156107c757600080fd5b506001600160a01b038135169060208101359060400135612bc3565b6103be600480360360208110156107f957600080fd5b50356001600160a01b0316612edd565b6103be600480360360e081101561081f57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135612ef8565b61088a600480360360a081101561086057600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612fc7565b6040805192835260208301919091528051918290030190f35b61088a600480360360a08110156108b957600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561347a565b6103be600480360360c08110156108f957600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613916565b6104ab6139b2565b61057e6004803603602081101561093c57600080fd5b50356001600160a01b03166139c2565b61057e6004803603602081101561096257600080fd5b50356001600160a01b0316613b6b565b6103be613c8c565b6103be6004803603602081101561099057600080fd5b50356001600160a01b0316613cdd565b61040a613d9c565b6103be600480360360a08110156109be57600080fd5b5080359060208101359060408101359060608101359060800135613dfd565b6104ab600480360360408110156109f357600080fd5b506001600160a01b038135169060200135613e62565b61057e60048036036040811015610a1f57600080fd5b81359190810190604081016020820135640100000000811115610a4157600080fd5b820183602082011115610a5357600080fd5b80359060200191846020830284011164010000000083111715610a7557600080fd5b509092509050613e78565b6104ab614191565b6103be600480360360c0811015610a9e57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561419a565b610acb61421b565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610b07578181015183820152602001610aef565b505050509050019250505060405180910390f35b610b23614308565b604080516001600160a01b039092168252519081900360200190f35b610acb614317565b6103be614361565b61057e60048036036020811015610b6557600080fd5b50356001600160a01b0316614367565b6104ab60048036036040811015610b8b57600080fd5b506001600160a01b0381351690602001356146be565b6103be60048036036040811015610bb757600080fd5b506001600160a01b038135811691602001351661473f565b61057e60048036036060811015610be557600080fd5b506001600160a01b03813516906020810135906040013561476a565b61057e60048036036020811015610c1757600080fd5b50356149a8565b6103be614ae6565b6103be60048036036020811015610c3c57600080fd5b50356001600160a01b0316614aec565b610b23614bbd565b6103be60048036036020811015610c6a57600080fd5b50356001600160a01b0316614bcc565b6103be600480360360c0811015610c9057600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614c8b565b600080610cc28887614d0e565b90506000610cd8670de0b6b3a764000083614e15565b90506000610ce68287614e73565b90506000610d0588610d00670de0b6b3a764000085614e15565b614d0e565b90506000610d138d83614e15565b90506000610d21828f614d0e565b90506000610d2f8288614f2d565b90506000610d3d828f614e73565b90506000610d4b8f83614e15565b9050610d6381610d00670de0b6b3a76400008e614e15565b9950505050505050505050979650505050505050565b600554600090610100900460ff1615610dc3576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16610e67576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16610ebd576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f60205260409020600390810154610ef291670de0b6b3a76400005b04600101614e73565b831115610f31576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060038101546002808301549054601054600a54600c54610f6e95949392918a91610cb5565b915081610fb1576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b82821115610fef576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b610ffd816003015485614e15565b8160030181905550600061101383600c54614e73565b6040805187815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36110613384615029565b600061106d3085615037565b905061108a61108561107f8685614e15565b83614e15565b615143565b6007546110a0906001600160a01b03168361514f565b6110ab873388615159565b5050506005805461ff00191690559392505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561114c5780601f106111215761010080835404028352916020019161114c565b820191906000526020600020905b81548152906001019060200180831161112f57829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b03871680855290835281842086905581518681529151939490939092600080516020615827833981519152928290030190a35060015b92915050565b600554600090610100900460ff16156111f5576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff1661124b576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff166112a1576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600f602052604080822092851682528120600380840154600280860154928401549084015493946112e59492939290613dfd565b95945050505050565b600554600090610100900460ff1615611338576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff1661138e576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff166113e4576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600f6020526040808220928516825290206003808301546002808501549284015490840154600a546112e594929190613dfd565b60025490565b60095481565b6000336001600160a01b038516148061147057506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6114ac576040805162461bcd60e51b815260206004820152600860248201526710b9b832b73232b960c11b604482015290519081900360640190fd5b6114b7848484615223565b336001600160a01b038516148015906114f557506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b15611577576001600160a01b03841660009081526001602090815260408083203384529091529020546115289083614e15565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391926000805160206158278339815191529281900390910190a35b5060019392505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff1615611626576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6008546001600160a01b03163314611673576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b66038d7ea4c680008110156116c1576040805162461bcd60e51b815260206004820152600f60248201526e03c6d696e496e6974506f6f6c53757608c1b604482015290519081900360640190fd5b6ec097ce7bc90715b34b9f1000000000811115611717576040805162461bcd60e51b815260206004820152600f60248201526e03e6d6178496e6974506f6f6c53757608c1b604482015290519081900360640190fd5b600955565b6001600160a01b03166000908152600f602052604090205460ff1690565b60055460ff1690565b600554610100900460ff161561178a576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff161561182e576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6008546001600160a01b0316331461187b576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b64e8d4a510008110156118bf576040805162461bcd60e51b81526020600482015260076024820152663c6d696e46656560c81b604482015290519081900360640190fd5b67016345785d8a0000811115611906576040805162461bcd60e51b81526020600482015260076024820152663e6d617846656560c81b604482015290519081900360640190fd5b80611914600b546002614e73565b1115611959576040805162461bcd60e51b815260206004820152600f60248201526e1e31b7b63632b1ba32b22332b2951960891b604482015290519081900360640190fd5b600a556005805461ff0019169055565b600554610100900460ff16156119b0576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b03163314611a5d576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff16611ab3576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b600d5460ff1615611af7576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b670de0b6b3a7640000811015611b41576040805162461bcd60e51b815260206004820152600a6024820152690f1b5a5b95d95a59da1d60b21b604482015290519081900360640190fd5b6802b5e3af16b1880000811115611b8c576040805162461bcd60e51b815260206004820152600a6024820152690f9b585e15d95a59da1d60b21b604482015290519081900360640190fd5b620f4240821015611bce576040805162461bcd60e51b81526020600482015260076024820152660f1b5a5b90985b60ca1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090206002015480821115611c5c57611c07601054611c028484614e15565b615325565b60108190556802b5e3af16b18800001015611c57576040805162461bcd60e51b815260206004820152600b60248201526a0f9b585e1515d95a59da1d60aa1b604482015290519081900360640190fd5b611c7d565b80821015611c7d57611c79601054611c748385614e15565b614e15565b6010555b6001600160a01b0384166000908152600f602052604090206002810183905560030180549084905580841115611cc657611cc18533611cbc8785614e15565b61536e565b611d1b565b80841015611d1b576000611cda8286614e15565b90506000611cea82600c54614e73565b9050611d008733611cfb8585614e15565b615159565b600754611d189088906001600160a01b031683615159565b50505b50506005805461ff0019169055505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26007546001600160a01b03163314611dd8576040805162461bcd60e51b815260206004820152600860248201526721666163746f727960c01b604482015290519081900360640190fd5b6611c37937e08000811115611e20576040805162461bcd60e51b81526020600482015260096024820152683e6d6178436f46656560b81b604482015290519081900360640190fd5b600a54611e2e826002614e73565b1115611e6e576040805162461bcd60e51b815260206004820152600a6024820152691f39bbb0b82332b2979960b11b604482015290519081900360640190fd5b600b55565b600554600090610100900460ff1615611ebd576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16611f61576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16611fb7576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060038101546002808301549054601054600a54600c54611ff495949392918a91612ef8565b915082821015612033576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f6020526040902060039081015461206391670de0b6b3a7640000610ee9565b8211156120a2576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b6120b0816003015483614e15565b816003018190555060006120c685600c54614e73565b6040805185815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36121143386615029565b6121216110858683614e15565b600754612137906001600160a01b03168261514f565b612143308688866153c7565b93506121529050863385615159565b50506005805461ff00191690559392505050565b600554610100900460ff16156121ad576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff1615612251576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6008546001600160a01b0316331461229e576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b60088054911515600160a01b0260ff60a01b199092169190911790556005805461ff0019169055565b600554610100900460ff161561230e576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b031633146123bb576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b600d5460ff16156123ff576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b600e5460021115612444576040805162461bcd60e51b815260206004820152600a6024820152693c6d696e546f6b656e7360b01b604482015290519081900360640190fd5b600d805460ff191660011790556008805460ff60a01b1916600160a01b1790556009546124709061554d565b61247c3360095461514f565b6005805461ff0019169055565b600554610100900460ff16156124d0576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16612574576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b600061257e611428565b9050600061258c8583614d0e565b9050806125cf576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b60005b600e54811015612747576000600e82815481106125eb57fe5b60009182526020808320909101546001600160a01b0316808352600f9091526040822060030154909250906126208583614e73565b905080612663576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b87878581811061266f57fe5b905060200201358111156126b3576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f60205260409020600301546126d99082615325565b6001600160a01b0384166000818152600f60209081526040918290206003019390935580518481529051919233927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9281900390910190a361273c83338361536e565b5050506001016125d2565b506127518561554d565b611d1b338661514f565b600a5481565b60065481565b6000806127748786614d0e565b905060006127828786615325565b905060006127908289614d0e565b905060006127a6670de0b6b3a764000085614d0e565b905060006127b48383614f2d565b905060006127c2828e614e73565b905060006127d0828f614e15565b905060006127ef6127e9670de0b6b3a76400008a614e15565b8b614e73565b905061280782610d00670de0b6b3a764000084614e15565b9f9e505050505050505050505050505050565b600554600090610100900460ff1615612864576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16612908576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff1661295e576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060030154612990906002670de0b6b3a76400005b04614e73565b8311156129cf576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060038101546002808301549054601054600a54612a0994939291908990613916565b915082821015612a48576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b612a56816003015485615325565b60038201556040805185815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3612aa48261554d565b612aaf85338661536e565b6000612abd868630866153c7565b935090508015612adb57612ad5826003015482614e15565b60038301555b612152338461514f565b600c5481565b3360009081526001602090815260408083206001600160a01b038616845290915281205480831115612b40573360009081526001602090815260408083206001600160a01b0388168452909152812055612b6f565b612b4a8184614e15565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b038916808552908352928190205481519081529051929392600080516020615827833981519152929181900390910190a35060019392505050565b600554600090610100900460ff1615612c0d576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16612cb1576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16612d07576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060038101546002808301549054601054600a54612d4194939291908990612767565b915081612d84576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b82821115612dc2576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f6020526040902060030154612df2906002670de0b6b3a764000061298a565b821115612e31576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b612e3f816003015483615325565b60038201556040805183815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3612e8d8461554d565b612e97338561514f565b612ea285338461536e565b6000612eae8684615037565b9050801561215257612ec4826003015482614e15565b600383015550506005805461ff00191690559392505050565b6001600160a01b031660009081526020819052604090205490565b600080612f058887614d0e565b90506000612f2486612f1f670de0b6b3a764000087614e15565b614e73565b90506000612f328983614e15565b90506000612f40828b614d0e565b90506000612f5f82612f5a670de0b6b3a764000088614d0e565b614f2d565b90506000612f6d828f614e73565b90506000612f7b8f83614e15565b90506000612f9a612f94670de0b6b3a76400008a614e15565b8c614e73565b9050612fb282612f1f670de0b6b3a764000084614e15565b98505050505050505050979650505050505050565b6005546000908190610100900460ff1615613013576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26001600160a01b0387166000908152600f602052604090205460ff166130c9576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f602052604090205460ff1661311f576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b600854600160a01b900460ff1661316b576040805162461bcd60e51b815260206004820152600b60248201526a0217075626c6963537761760ac1b604482015290519081900360640190fd5b6001600160a01b038088166000908152600f6020526040808220928816825290206003808201546131a491670de0b6b3a7640000610ee9565b8611156131e3576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b60006132048360030154846002015484600301548560020154600a54613dfd565b905085811115613249576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b61326983600301548460020154846003015485600201548b600a54614c8b565b9450888511156132a9576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b6132b7836003015486615325565b83600301819055506132cd826003015488614e15565b600380840182905584015460028086015490850154600a546132f0949190613dfd565b935080841015613336576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b85841115613377576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b6133818588614d0e565b8111156133c4576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888b604051808381526020018281526020019250505060405180910390a461342c8a338761536e565b613437883389615159565b60006134438b87615037565b9050801561345f57613459846003015482614e15565b60038501555b505050506005805461ff001916905590969095509350505050565b6005546000908190610100900460ff16156134c6576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26001600160a01b0387166000908152600f602052604090205460ff1661357c576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f602052604090205460ff166135d2576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b600854600160a01b900460ff1661361e576040805162461bcd60e51b815260206004820152600b60248201526a0217075626c6963537761760ac1b604482015290519081900360640190fd5b6001600160a01b038088166000908152600f6020526040808220928816825290206003820154613658906002670de0b6b3a764000061298a565b881115613697576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b60006136b88360030154846002015484600301548560020154600a54613dfd565b9050858111156136fd576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b61371d83600301548460020154846003015485600201548d600a5461419a565b94508685101561375c576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b61376a83600301548a615325565b8360030181905550613780826003015486614e15565b600380840182905584015460028086015490850154600a546137a3949190613dfd565b9350808410156137e9576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b8584111561382a576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b6138348986614d0e565b811115613877576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788c89604051808381526020018281526020019250505060405180910390a46138df8a338b61536e565b60006138ed8b8b8b896153c7565b96509050801561390b57613905846003015482614e15565b60038501555b61345f893388615159565b6000806139238786614d0e565b9050600061394261393c670de0b6b3a764000084614e15565b85614e73565b9050600061395c86612f1f670de0b6b3a764000085614e15565b9050600061396a8b83615325565b90506000613978828d614d0e565b905060006139868287614f2d565b90506000613994828d614e73565b90506139a0818d614e15565b9e9d5050505050505050505050505050565b600854600160a01b900460ff1681565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613a6a576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600f602052604090205460ff16613acf576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b158015613b1557600080fd5b505afa158015613b29573d6000803e3d6000fd5b505050506040513d6020811015613b3f57600080fd5b50516001600160a01b039091166000908152600f60205260409020600301556005805461ff0019169055565b600554610100900460ff1615613bb2576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b03163314613c5f576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615613cd6576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b5060105490565b600554600090610100900460ff1615613d27576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16613d7d576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600f602052604090206002015490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561114c5780601f106111215761010080835404028352916020019161114c565b600080613e0a8787614d0e565b90506000613e188686614d0e565b90506000613e268383614d0e565b90506000613e48670de0b6b3a7640000610d00670de0b6b3a764000089614e15565b9050613e548282614e73565b9a9950505050505050505050565b6000613e6f338484615223565b50600192915050565b600554610100900460ff1615613ebf576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff16613f63576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b6000613f6d611428565b90506000613f7d85600c54614e73565b90506000613f8b8683614e15565b90506000613f998285614d0e565b905080613fdc576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b613fe63388615029565b600754613ffc906001600160a01b03168461514f565b61400582615143565b60005b600e5481101561417c576000600e828154811061402157fe5b60009182526020808320909101546001600160a01b0316808352600f9091526040822060030154909250906140568583614e73565b905080614099576040805162461bcd60e51b815260206004820152600c60248201526b0cae4e49ac2e8d082e0e4def60a31b604482015290519081900360640190fd5b8989858181106140a557fe5b905060200201358110156140e8576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090206003015461410e9082614e15565b6001600160a01b0384166000818152600f60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a3614171833383615159565b505050600101614008565b50506005805461ff0019169055505050505050565b600d5460ff1681565b6000806141a78786614d0e565b905060006141bd670de0b6b3a764000085614e15565b90506141c98582614e73565b905060006141db8a610d008c85615325565b905060006141e98285614f2d565b905060006141ff670de0b6b3a764000083614e15565b905061420b8a82614e73565b9c9b505050505050505050505050565b600554606090610100900460ff1615614265576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600d5460ff166142a9576040805162461bcd60e51b815260206004820152600a60248201526908599a5b985b1a5e995960b21b604482015290519081900360640190fd5b600e80548060200260200160405190810160405280929190818152602001828054801561114c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116142e1575050505050905090565b6007546001600160a01b031681565b600554606090610100900460ff16156142a9576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600e5490565b600554610100900460ff16156143ae576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461010061ff0019909116179055604080516020808252369082018190523392600080356001600160e01b0319169390929181908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b0316331461445b576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6001600160a01b0381166000908152600f602052604090205460ff166144b1576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b600d5460ff16156144f5576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6001600160a01b0381166000908152600f6020526040812060030154600c54909190614522908390614e73565b6010546001600160a01b0385166000908152600f602052604090206002015491925061454d91614e15565b6010556001600160a01b0383166000908152600f6020526040902060010154600e8054600019810191908290811061458157fe5b600091825260209091200154600e80546001600160a01b0390921691849081106145a757fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600f6000600e85815481106145e757fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600e80548061461a57fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038c168752600f909552929094209051815460ff191690151517815592516001840155516002830155516003909101556146a68533611cfb8787614e15565b600754611d1b9086906001600160a01b031685615159565b3360009081526001602090815260408083206001600160a01b03861684529091528120546146ec9083615325565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208590558051948552519193600080516020615827833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26008546001600160a01b03163314614818576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff161561486e576040805162461bcd60e51b8152602060048201526005602482015264189bdd5b9960da1b604482015290519081900360640190fd5b600d5460ff16156148b2576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b600e546008116148f6576040805162461bcd60e51b815260206004820152600a6024820152693e6d6178546f6b656e7360b01b604482015290519081900360640190fd5b604080516080810182526001808252600e805460208085019182526000858701818152606087018281526001600160a01b038c16808452600f9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b03191690911790556149a3838383611969565b505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600d5460ff1615614a4d576040805162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b604482015290519081900360640190fd5b6007546001600160a01b03163314614a97576040805162461bcd60e51b815260206004820152600860248201526721666163746f727960c01b604482015290519081900360640190fd5b66038d7ea4c68000811115614ae1576040805162461bcd60e51b815260206004820152600b60248201526a3e6d61784578697446656560a81b604482015290519081900360640190fd5b600c55565b600b5481565b600554600090610100900460ff1615614b36576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16614b8c576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f6020526040902060020154601054614bb6908290614d0e565b9392505050565b6008546001600160a01b031681565b600554600090610100900460ff1615614c16576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16614c6c576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600f602052604090206003015490565b600080614c988588614d0e565b90506000614ca68786614e15565b90506000614cb48883614d0e565b90506000614cc28285614f2d565b9050614cd681670de0b6b3a7640000614e15565b9050614cea670de0b6b3a764000087614e15565b9450614cff614cf98c83614e73565b86614d0e565b9b9a5050505050505050505050565b600081614d4d576040805162461bcd60e51b8152602060048201526008602482015267064697620627920360c41b604482015290519081900360640190fd5b670de0b6b3a76400008302831580614d755750670de0b6b3a7640000848281614d7257fe5b04145b614db5576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b60028304810181811015614dff576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b6000848281614e0a57fe5b049695505050505050565b6000806000614e248585615556565b915091508015614e6b576040805162461bcd60e51b815260206004820152600d60248201526c73756220756e646572666c6f7760981b604482015290519081900360640190fd5b509392505050565b6000828202831580614e8d575082848281614e8a57fe5b04145b614ecd576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614f1c576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6000670de0b6b3a764000082614e0a565b60006001831015614f74576040805162461bcd60e51b815260206004820152600c60248201526b6261736520746f6f206c6f7760a01b604482015290519081900360640190fd5b671bc16d674ec7ffff831115614fc1576040805162461bcd60e51b815260206004820152600d60248201526c0c4c2e6ca40e8dede40d0d2ced609b1b604482015290519081900360640190fd5b6000614fcc8361557b565b90506000614fda8483614e15565b90506000614ff086614feb85615596565b6155a4565b9050816150015792506111a5915050565b600061501287846305f5e1006155fb565b905061501e8282614e73565b979650505050505050565b61503382826156d9565b5050565b600b54600090156111a557600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b15801561508757600080fd5b505afa15801561509b573d6000803e3d6000fd5b505050506040513d60208110156150b157600080fd5b505190506001600160a01b0381161561513c576150e16150d384600b54614e73565b670de0b6b3a7640000614d0e565b6007549092506150fc9085906001600160a01b031684615159565b6040805183815290516001600160a01b038616917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a25b5092915050565b61514c816156e4565b50565b61503382826157a6565b6000836001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156151b257600080fd5b505af11580156151c6573d6000803e3d6000fd5b505050506040513d60208110156151dc57600080fd5b505190508061521d576040805162461bcd60e51b8152602060048201526008602482015267065727245726332360c41b604482015290519081900360640190fd5b50505050565b6001600160a01b038316600090815260208190526040902054811115615279576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b6001600160a01b03831660009081526020819052604090205461529c9082614e15565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546152cb9082615325565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082820183811015614bb6576040805162461bcd60e51b815260206004820152600c60248201526b616464206f766572666c6f7760a01b604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b1580156151b257600080fd5b600b5460009082901561554457600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b15801561541957600080fd5b505afa15801561542d573d6000803e3d6000fd5b505050506040513d602081101561544357600080fd5b505190506001600160a01b0380821690881614156154c95761546a6150d387600b54614e73565b6007549093506154859088906001600160a01b031685615159565b6040805184815290516001600160a01b038916917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a2615542565b60006154da6150d386600b54614e73565b6007549091506154f59087906001600160a01b031683615159565b6154ff8582614e15565b6040805183815290519194506001600160a01b038816917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd9181900360200190a2505b505b94509492505050565b61514c816157b1565b60008082841061556c5750508082036000615574565b505081810360015b9250929050565b6000670de0b6b3a764000061558f83615596565b0292915050565b670de0b6b3a7640000900490565b600080600283066155bd57670de0b6b3a76400006155bf565b835b90506002830492505b8215614bb6576155d88485614e73565b935060028306156155f0576155ed8185614e73565b90505b6002830492506155c8565b600082818061561287670de0b6b3a7640000615556565b9092509050670de0b6b3a764000080600060015b8884106156ca576000670de0b6b3a76400008202905060008061565a8a61565585670de0b6b3a7640000614e15565b615556565b9150915061566c87612f1f848c614e73565b96506156788784614d0e565b965086615687575050506156ca565b8715615691579315935b801561569b579315935b84156156b2576156ab8688614e15565b95506156bf565b6156bc8688615325565b95505b505050600101615626565b50909998505050505050505050565b615033823083615223565b30600090815260208190526040902054811115615731576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b3060009081526020819052604090205461574b9082614e15565b306000908152602081905260409020556002546157689082614e15565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b615033308383615223565b306000908152602081905260409020546157cb9082615325565b306000908152602081905260409020556002546157e89082615325565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35056fe8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212204814ffc3fcf8d3e48bc307a87a7d058f3ac272a5642097cdb240483f9938a32564736f6c634300060c0033
Deployed Bytecode Sourcemap
27241:26571:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25162:1327;;;;;;;;;;;;;;;;-1:-1:-1;25162:1327:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;49613:1509;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49613:1509:0;;;;;;;;;;;;;:::i;9501:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10138:193;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10138:193:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;37437:477;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37437:477:0;;;;;;;;;;:::i;36953:476::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36953:476:0;;;;;;;;;;:::i;10033:97::-;;;:::i;28860:26::-;;;:::i;11154:487::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11154:487:0;;;;;;;;;;;;;;;;;:::i;29535:386::-;;;;;;;;;;;;;;;;-1:-1:-1;29535:386:0;;:::i;:::-;;30493:123;;;;;;;;;;;;;;;;-1:-1:-1;30493:123:0;-1:-1:-1;;;;;30493:123:0;;:::i;9687:82::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31977:415;;;;;;;;;;;;;;;;-1:-1:-1;31977:415:0;;:::i;34001:1617::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34001:1617:0;;;;;;;;;;;;;:::i;29929:300::-;;;;;;;;;;;;;;;;-1:-1:-1;29929:300:0;;:::i;48151:1454::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48151:1454:0;;;;;;;;;;;;;:::i;32609:241::-;;;;;;;;;;;;;;;;-1:-1:-1;32609:241:0;;;;:::i;32858:413::-;;;:::i;37922:928::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37922:928:0;;-1:-1:-1;37922:928:0;-1:-1:-1;37922:928:0;:::i;28893:19::-;;;:::i;28554:26::-;;;:::i;20399:1213::-;;;;;;;;;;;;;;;;-1:-1:-1;20399:1213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;45281:1440::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45281:1440:0;;;;;;;;;;;;;:::i;28996:19::-;;;:::i;10599:397::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10599:397:0;;;;;;;;:::i;46729:1414::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46729:1414:0;;;;;;;;;;;;;:::i;9914:111::-;;;;;;;;;;;;;;;;-1:-1:-1;9914:111:0;-1:-1:-1;;;;;9914:111:0;;:::i;22731:1312::-;;;;;;;;;;;;;;;;-1:-1:-1;22731:1312:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42657:2614::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42657:2614:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39967:2682;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39967:2682:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18198:1183::-;;;;;;;;;;;;;;;;-1:-1:-1;18198:1183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28716:22::-;;;:::i;36727:218::-;;;;;;;;;;;;;;;;-1:-1:-1;36727:218:0;-1:-1:-1;;;;;36727:218:0;;:::i;32400:201::-;;;;;;;;;;;;;;;;-1:-1:-1;32400:201:0;-1:-1:-1;;;;;32400:201:0;;:::i;31328:148::-;;;:::i;31101:219::-;;;;;;;;;;;;;;;;-1:-1:-1;31101:219:0;-1:-1:-1;;;;;31101:219:0;;:::i;9592:87::-;;;:::i;13237:523::-;;;;;;;;;;;;;;;;-1:-1:-1;13237:523:0;;;;;;;;;;;;;;;;;;;;;;:::i;11004:142::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11004:142:0;;;;;;;;:::i;38858:1099::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38858:1099:0;;-1:-1:-1;38858:1099:0;-1:-1:-1;38858:1099:0;:::i;29022:21::-;;;:::i;14778:697::-;;;;;;;;;;;;;;;;-1:-1:-1;14778:697:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30900:193::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28587:22;;;:::i;:::-;;;;-1:-1:-1;;;;;28587:22:0;;;;;;;;;;;;;;30749:143;;;:::i;30624:117::-;;;:::i;35626:1016::-;;;;;;;;;;;;;;;;-1:-1:-1;35626:1016:0;-1:-1:-1;;;;;35626:1016:0;;:::i;10339:252::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10339:252:0;;;;;;;;:::i;9777:129::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9777:129:0;;;;;;;;;;:::i;33281:712::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33281:712:0;;;;;;;;;;;;;:::i;30237:248::-;;;;;;;;;;;;;;;;-1:-1:-1;30237:248:0;;:::i;28919:24::-;;;:::i;31484:268::-;;;;;;;;;;;;;;;;-1:-1:-1;31484:268:0;-1:-1:-1;;;;;31484:268:0;;:::i;28664:25::-;;;:::i;31760:209::-;;;;;;;;;;;;;;;;-1:-1:-1;31760:209:0;-1:-1:-1;;;;;31760:209:0;;:::i;16493:686::-;;;;;;;;;;;;;;;;-1:-1:-1;16493:686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25162:1327::-;25432:17;25523:21;25547:33;25552:14;25568:11;25547:4;:33::i;:::-;25523:57;;25663:8;25674:35;782:6;25692:16;25674:4;:35::i;:::-;25663:46;;25720:8;25731:18;25736:3;25741:7;25731:4;:18::i;:::-;25720:29;;25760:32;25795:44;25800:14;25816:22;782:6;25834:3;25816:4;:22::i;:::-;25795:4;:44::i;:::-;25760:79;;25852:23;25878:50;25883:15;25900:27;25878:4;:50::i;:::-;25852:76;;25939:18;25960:41;25965:18;25985:15;25960:4;:41::i;:::-;25939:62;;26081:14;26098:37;26103:13;26118:16;26098:4;:37::i;:::-;26081:54;;26146:18;26167:27;26172:9;26183:10;26167:4;:27::i;:::-;26146:48;;26205:29;26237:31;26242:10;26254:13;26237:4;:31::i;:::-;26205:63;;26393:58;26398:24;26424:26;782:6;26442:7;26424:4;:26::i;26393:58::-;26378:73;;26462:19;;;;;;;;;25162:1327;;;;;;;;;:::o;49613:1509::-;28343:6;;49775:17;;28343:6;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;49818:9:::2;::::0;::::2;;49810:32;;;::::0;;-1:-1:-1;;;49810:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;49810:32:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;49861:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:24;::::2;;49853:43;;;::::0;;-1:-1:-1;;;49853:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;49853:43:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;49938:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:26:::2;::::0;;::::2;::::0;49933:54:::2;::::0;782:6:::2;2177:8;;2189:5;2176:18;49933:4;:54::i;:::-;49915:14;:72;;49907:93;;;::::0;;-1:-1:-1;;;49907:93:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;49907:93:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;50040:18:0;::::2;50013:24;50040:18:::0;;;:8:::2;:18;::::0;;;;50141:17:::2;::::0;::::2;::::0;50189:16:::2;::::0;;::::2;::::0;50236:12;;50279::::2;::::0;50367:7:::2;::::0;50405::::2;::::0;50086:353:::2;::::0;50141:17;50189:16;50236:12;50279;50322:14;;50086:24:::2;:353::i;:::-;50071:368:::0;-1:-1:-1;50460:17:0;50452:42:::2;;;::::0;;-1:-1:-1;;;50452:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;50452:42:0;;;;;;;;;;;;;::::2;;50529:15;50513:12;:31;;50505:50;;;::::0;;-1:-1:-1;;;50505:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;50505:50:0;;;;;;;;;;;;;::::2;;50588:39;50593:9;:17;;;50612:14;50588:4;:39::i;:::-;50568:9;:17;;:59;;;;50640:13;50656:27;50661:12;50675:7;;50656:4;:27::i;:::-;50701:46;::::0;;;;;;;50640:43;;-1:-1:-1;;;;;;50701:46:0;::::2;::::0;50710:10:::2;::::0;50701:46:::2;::::0;;;;;::::2;::::0;;::::2;50760:40;50775:10;50787:12;50760:14;:40::i;:::-;50811:24;50838:54;50872:4;50879:12;50838:25;:54::i;:::-;50811:81;;50903:71;50918:55;50923:28;50928:12;50942:8;50923:4;:28::i;:::-;50953:19;50918:4;:55::i;:::-;50903:14;:71::i;:::-;51000:7;::::0;50985:33:::2;::::0;-1:-1:-1;;;;;51000:7:0::2;51009:8:::0;50985:14:::2;:33::i;:::-;51029:53;51045:8;51055:10;51067:14;51029:15;:53::i;:::-;51095:19;;;28408:6:::0;:14;;-1:-1:-1;;28408:14:0;;;49613:1509;;-1:-1:-1;;;49613:1509:0:o;9501:83::-;9571:5;9564:12;;;;;;;;-1:-1:-1;;9564:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9538:13;;9564:12;;9571:5;;9564:12;;9571:5;9564:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9501:83;:::o;10138:193::-;10233:10;10205:4;10222:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10222:27:0;;;;;;;;;;;:33;;;10271:30;;;;;;;10205:4;;10222:27;;10233:10;;-1:-1:-1;;;;;;;;;;;10271:30:0;;;;;;;-1:-1:-1;10319:4:0;10138:193;;;;;:::o;37437:477::-;28480:6;;37562:14;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37602:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;37594:42;;;::::0;;-1:-1:-1;;;37594:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37594:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37655:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;37647:43;;;::::0;;-1:-1:-1;;;37647:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37647:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37727:17:0;;::::1;37701:23;37727:17:::0;;;:8:::1;:17;::::0;;;;;37782:18;;::::1;::::0;;;;37832:16:::1;::::0;;::::1;::::0;37850:15:::1;::::0;;::::1;::::0;37867:17;;::::1;::::0;37886:16;;::::1;::::0;37782:18;;37818:88:::1;::::0;37832:16;;37850:15;37886:16;37818:13:::1;:88::i;:::-;37811:95:::0;37437:477;-1:-1:-1;;;;;37437:477:0:o;36953:476::-;28480:6;;37071:14;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37111:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;37103:42;;;::::0;;-1:-1:-1;;;37103:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37103:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37164:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;37156:43;;;::::0;;-1:-1:-1;;;37156:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37156:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37236:17:0;;::::1;37210:23;37236:17:::0;;;:8:::1;:17;::::0;;;;;37291:18;;::::1;::::0;;;;37341:16:::1;::::0;;::::1;::::0;37359:15:::1;::::0;;::::1;::::0;37376:17;;::::1;::::0;37395:16;;::::1;::::0;37413:7:::1;::::0;37327:94:::1;::::0;37359:15;37376:17;37395:16;37327:13:::1;:94::i;10033:97::-:0;10110:12;;10033:97;:::o;28860:26::-;;;;:::o;11154:487::-;11239:4;11264:10;-1:-1:-1;;;;;11264:17:0;;;;:55;;-1:-1:-1;;;;;;11292:15:0;;;;;;:10;:15;;;;;;;;11308:10;11292:27;;;;;;;;11285:34;;;11264:55;11256:76;;;;;-1:-1:-1;;;11256:76:0;;;;;;;;;;;;-1:-1:-1;;;11256:76:0;;;;;;;;;;;;;;;11343:20;11349:3;11354;11359;11343:5;:20::i;:::-;11378:10;-1:-1:-1;;;;;11378:17:0;;;;;;:63;;-1:-1:-1;;;;;;11399:15:0;;;;;;:10;:15;;;;;;;;11415:10;11399:27;;;;;;;;-1:-1:-1;;11399:42:0;;11378:63;11374:238;;;-1:-1:-1;;;;;11493:15:0;;;;;;:10;:15;;;;;;;;11509:10;11493:27;;;;;;;;11488:38;;11522:3;11488:4;:38::i;:::-;-1:-1:-1;;;;;11458:15:0;;;;;;;:10;:15;;;;;;;;11474:10;11458:27;;;;;;;;;;:68;;;11546:54;;;;;;;;;;11474:10;;-1:-1:-1;;;;;;;;;;;11546:54:0;;;;;;;;;11374:238;-1:-1:-1;11629:4:0;11154:487;;;;;:::o;29535:386::-;28135:10;-1:-1:-1;;;;;28117:39:0;28126:7;;-1:-1:-1;;;;;;28126:7:0;-1:-1:-1;;;;;28117:39:0;;28147:8;;28117:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28117:39:0;;;;;;;;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0;29618:9:::1;::::0;::::1;;29617:10;29609:32;;;::::0;;-1:-1:-1;;;29609:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29609:32:0;;;;;;;;;;;;;::::1;;29674:10;::::0;-1:-1:-1;;;;;29674:10:0::1;29660;:24;29652:48;;;::::0;;-1:-1:-1;;;29652:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29652:48:0;;;;;;;;;;;;;::::1;;1774:11:::0;29719:46;::::1;;29711:74;;;::::0;;-1:-1:-1;;;29711:74:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29711:74:0;;;;;;;;;;;;;::::1;;1840:13:::0;29804:46;::::1;;29796:74;;;::::0;;-1:-1:-1;;;29796:74:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29796:74:0;;;;;;;;;;;;;::::1;;29881:14;:32:::0;29535:386::o;30493:123::-;-1:-1:-1;;;;;30591:11:0;30562:4;30591:11;;;:8;:11;;;;;:17;;;;30493:123::o;9687:82::-;9752:9;;;;9687:82;:::o;31977:415::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;32087:9:::2;::::0;::::2;;32086:10;32078:32;;;::::0;;-1:-1:-1;;;32078:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32078:32:0;;;;;;;;;;;;;::::2;;32143:10;::::0;-1:-1:-1;;;;;32143:10:0::2;32129;:24;32121:48;;;::::0;;-1:-1:-1;;;32121:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32121:48:0;;;;;;;;;;;;;::::2;;1037:12:::0;32188:26;::::2;;32180:46;;;::::0;;-1:-1:-1;;;32180:46:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32180:46:0;;;;;;;;;;;;;::::2;;1104:9:::0;32245:26;::::2;;32237:46;;;::::0;;-1:-1:-1;;;32237:46:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32237:46:0;;;;;;;;;;;;;::::2;;32327:8;32302:21;32307:12;;32321:1;32302:4;:21::i;:::-;:33;;32294:61;;;::::0;;-1:-1:-1;;;32294:61:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32294:61:0;;;;;;;;;;;;;::::2;;32366:7;:18:::0;28408:6;:14;;-1:-1:-1;;28408:14:0;;;31977:415::o;34001:1617::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;34147:10:::2;::::0;-1:-1:-1;;;;;34147:10:0::2;34133;:24;34125:48;;;::::0;;-1:-1:-1;;;34125:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34125:48:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;34192:15:0;::::2;;::::0;;;:8:::2;:15;::::0;;;;:21;::::2;;34184:40;;;::::0;;-1:-1:-1;;;34184:40:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34184:40:0;;;;;;;;;;;;;::::2;;34244:9;::::0;::::2;;34243:10;34235:32;;;::::0;;-1:-1:-1;;;34235:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34235:32:0;;;;;;;;;;;;;::::2;;782:6;34288;:27;;34280:50;;;::::0;;-1:-1:-1;;;34280:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34280:50:0;;;;;;;;;;;;;::::2;;1511:9:::0;34349:27;::::2;;34341:50;;;::::0;;-1:-1:-1;;;34341:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34341:50:0;;;;;;;;;;;;;::::2;;1639:13:::0;34410:29;::::2;;34402:49;;;::::0;;-1:-1:-1;;;34402:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34402:49:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;34527:15:0;::::2;34510:14;34527:15:::0;;;:8:::2;:15;::::0;;;;:22:::2;;::::0;34564:18;;::::2;34560:302;;;34614:43;34619:12;;34633:23;34638:6;34646:9;34633:4;:23::i;:::-;34614:4;:43::i;:::-;34599:12;:58:::0;;;1575:9;-1:-1:-1;34680:39:0::2;34672:63;;;::::0;;-1:-1:-1;;;34672:63:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34672:63:0;;;;;;;;;;;;;::::2;;34560:302;;;34766:9;34757:6;:18;34753:109;;;34807:43;34812:12;;34826:23;34831:9;34842:6;34826:4;:23::i;:::-;34807:4;:43::i;:::-;34792:12;:58:::0;34753:109:::2;-1:-1:-1::0;;;;;34880:15:0;::::2;;::::0;;;:8:::2;:15;::::0;;;;:22:::2;::::0;::::2;:31:::0;;;35005:23:::2;;::::0;;35039:33;;;;35087:20;;::::2;35083:528;;;35124:61;35140:5;35147:10;35159:25;35164:7;35173:10;35159:4;:25::i;:::-;35124:15;:61::i;:::-;35083:528;;;35217:10;35207:7;:20;35203:408;;;35322:26;35351:25;35356:10;35368:7;35351:4;:25::i;:::-;35322:54;;35391:17;35411:36;35416:21;35439:7;;35411:4;:36::i;:::-;35391:56;;35462:77;35478:5;35485:10;35497:41;35502:21;35525:12;35497:4;:41::i;:::-;35462:15;:77::i;:::-;35577:7;::::0;35554:45:::2;::::0;35570:5;;-1:-1:-1;;;;;35577:7:0::2;35586:12:::0;35554:15:::2;:45::i;:::-;35203:408;;;-1:-1:-1::0;;28408:6:0;:14;;-1:-1:-1;;28408:14:0;;;-1:-1:-1;;;34001:1617:0:o;29929:300::-;28135:10;-1:-1:-1;;;;;28117:39:0;28126:7;;-1:-1:-1;;;;;;28126:7:0;-1:-1:-1;;;;;28117:39:0;;28147:8;;28117:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28117:39:0;;;;;;;;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0;30021:7:::1;::::0;-1:-1:-1;;;;;30021:7:0::1;30007:10;:21;29999:42;;;::::0;;-1:-1:-1;;;29999:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29999:42:0;;;;;;;;;;;;;::::1;;1245:10:::0;30060:41;::::1;;30052:63;;;::::0;;-1:-1:-1;;;30052:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30052:63:0;;;;;;;;;;;;;::::1;;30160:7;;30134:22;30139:13;30154:1;30134:4;:22::i;:::-;:33;;30126:56;;;::::0;;-1:-1:-1;;;30126:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30126:56:0;;;;;;;;;;;;;::::1;;30193:12;:28:::0;29929:300::o;48151:1454::-;28343:6;;48305:19;;28343:6;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;48350:9:::2;::::0;::::2;;48342:32;;;::::0;;-1:-1:-1;;;48342:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48342:32:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;48393:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:24;::::2;;48385:43;;;::::0;;-1:-1:-1;;;48385:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48385:43:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;48468:18:0;::::2;48441:24;48468:18:::0;;;:8:::2;:18;::::0;;;;48571:17:::2;::::0;::::2;::::0;48619:16:::2;::::0;;::::2;::::0;48666:12;;48709::::2;::::0;48795:7:::2;::::0;48833::::2;::::0;48516:351:::2;::::0;48571:17;48619:16;48666:12;48709;48752;;48516:24:::2;:351::i;:::-;48499:368;;48906:12;48888:14;:30;;48880:48;;;::::0;;-1:-1:-1;;;48880:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48880:48:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;48980:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:26:::2;::::0;;::::2;::::0;48975:54:::2;::::0;782:6:::2;2177:8;::::0;48975:54:::2;48957:14;:72;;48949:93;;;::::0;;-1:-1:-1;;;48949:93:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48949:93:0;;;;;;;;;;;;;::::2;;49075:39;49080:9;:17;;;49099:14;49075:4;:39::i;:::-;49055:9;:17;;:59;;;;49127:13;49143:27;49148:12;49162:7;;49143:4;:27::i;:::-;49188:46;::::0;;;;;;;49127:43;;-1:-1:-1;;;;;;49188:46:0;::::2;::::0;49197:10:::2;::::0;49188:46:::2;::::0;;;;;::::2;::::0;;::::2;49247:40;49262:10;49274:12;49247:14;:40::i;:::-;49298:44;49313:28;49318:12;49332:8;49313:4;:28::i;49298:44::-;49368:7;::::0;49353:33:::2;::::0;-1:-1:-1;;;;;49368:7:0::2;49377:8:::0;49353:14:::2;:33::i;:::-;49418:81;49453:4;49460:12;49474:8;49484:14;49418:26;:81::i;:::-;49397:102:::0;-1:-1:-1;49510:53:0::2;::::0;-1:-1:-1;49526:8:0;49536:10:::2;49397:102:::0;49510:15:::2;:53::i;:::-;49576:21;;28408:6:::0;:14;;-1:-1:-1;;28408:14:0;;;48151:1454;;-1:-1:-1;;;48151:1454:0:o;32609:241::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;32725:9:::2;::::0;::::2;;32724:10;32716:32;;;::::0;;-1:-1:-1;;;32716:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32716:32:0;;;;;;;;;;;;;::::2;;32781:10;::::0;-1:-1:-1;;;;;32781:10:0::2;32767;:24;32759:48;;;::::0;;-1:-1:-1;;;32759:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32759:48:0;;;;;;;;;;;;;::::2;;32818:10;:24:::0;;;::::2;;-1:-1:-1::0;;;32818:24:0::2;-1:-1:-1::0;;;;32818:24:0;;::::2;::::0;;;::::2;::::0;;28408:6;:14;;-1:-1:-1;;28408:14:0;;;32609:241::o;32858:413::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;32966:10:::2;::::0;-1:-1:-1;;;;;32966:10:0::2;32952;:24;32944:48;;;::::0;;-1:-1:-1;;;32944:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32944:48:0;;;;;;;;;;;;;::::2;;33012:9;::::0;::::2;;33011:10;33003:32;;;::::0;;-1:-1:-1;;;33003:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;33003:32:0;;;;;;;;;;;;;::::2;;33054:7;:14:::0;845:1:::2;-1:-1:-1::0;33054:41:0::2;33046:64;;;::::0;;-1:-1:-1;;;33046:64:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;33046:64:0;;;;;;;;;;;;;::::2;;33123:9;:16:::0;;-1:-1:-1;;33123:16:0::2;33135:4;33123:16;::::0;;33150:10:::2;:17:::0;;-1:-1:-1;;;;33150:17:0::2;-1:-1:-1::0;;;33150:17:0::2;::::0;;33195:14:::2;::::0;33180:30:::2;::::0;:14:::2;:30::i;:::-;33221:42;33236:10;33248:14;;33221;:42::i;:::-;28408:6:::0;:14;;-1:-1:-1;;28408:14:0;;;32858:413::o;37922:928::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;38064:9:::2;::::0;::::2;;38056:32;;;::::0;;-1:-1:-1;;;38056:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38056:32:0;;;;;;;;;;;;;::::2;;38101:14;38118:13;:11;:13::i;:::-;38101:30;;38142:10;38155:30;38160:13;38175:9;38155:4;:30::i;:::-;38142:43:::0;-1:-1:-1;38204:10:0;38196:35:::2;;;::::0;;-1:-1:-1;;;38196:35:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38196:35:0;;;;;;;;;;;;;::::2;;38249:6;38244:507;38265:7;:14:::0;38261:18;::::2;38244:507;;;38301:9;38313:7;38321:1;38313:10;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;-1:-1:-1;;;;;38313:10:0::2;38349:11:::0;;;:8:::2;:11:::0;;;;;;:19:::2;;::::0;38313:10;;-1:-1:-1;38349:19:0;38404:16:::2;38409:5:::0;38349:19;38404:4:::2;:16::i;:::-;38383:37:::0;-1:-1:-1;38443:18:0;38435:43:::2;;;::::0;;-1:-1:-1;;;38435:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38435:43:0;;;;;;;;;;;;;::::2;;38518:12;;38531:1;38518:15;;;;;;;;;;;;;38501:13;:32;;38493:51;;;::::0;;-1:-1:-1;;;38493:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38493:51:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;38586:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;:19:::2;;::::0;38581:40:::2;::::0;38607:13;38581:4:::2;:40::i;:::-;-1:-1:-1::0;;;;;38559:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;;;;;:19:::2;;:62:::0;;;;38641:38;;;;;;;38559:11;;38650:10:::2;::::0;38641:38:::2;::::0;;;;;;;;::::2;38694:45;38710:1;38713:10;38725:13;38694:15;:45::i;:::-;-1:-1:-1::0;;;38281:3:0::2;;38244:507;;;;38761:29;38776:13;38761:14;:29::i;:::-;38801:41;38816:10;38828:13;38801:14;:41::i;28893:19::-:0;;;;:::o;28554:26::-;;;;:::o;20399:1213::-;20643:18;20679:21;20703:32;20708:13;20723:11;20703:4;:32::i;:::-;20679:56;;20746:18;20767:31;20772:10;20784:13;20767:4;:31::i;:::-;20746:52;;20809:14;20826:31;20831:13;20846:10;20826:4;:31::i;:::-;20809:48;;20935:8;20946:35;782:6;20964:16;20946:4;:35::i;:::-;20935:46;;20992:17;21012:20;21017:9;21028:3;21012:4;:20::i;:::-;20992:40;;21043:22;21068:34;21073:12;21087:14;21068:4;:34::i;:::-;21043:59;;21113:26;21142:39;21147:17;21166:14;21142:4;:39::i;:::-;21113:68;;21434:8;21445:50;21450:35;782:6;21468:16;21450:4;:35::i;:::-;21487:7;21445:4;:50::i;:::-;21434:61;;21522:51;21527:21;21550:22;782:6;21568:3;21550:4;:22::i;21522:51::-;21506:67;20399:1213;-1:-1:-1;;;;;;;;;;;;;;;20399:1213:0:o;45281:1440::-;28343:6;;45441:18;;28343:6;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;45495:9:::2;::::0;::::2;;45487:32;;;::::0;;-1:-1:-1;;;45487:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;45487:32:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;45538:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:23;::::2;;45530:42;;;::::0;;-1:-1:-1;;;45530:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;45530:42:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;45613:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:25:::2;;::::0;45608:52:::2;::::0;2120:1:::2;782:6;2113:8;;45608:4;:52::i;:::-;45591:13;:69;;45583:90;;;::::0;;-1:-1:-1;;;45583:90:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;45583:90:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;45712:17:0;::::2;45686:23;45712:17:::0;;;:8:::2;:17;::::0;;;;45813:16:::2;::::0;::::2;::::0;45860:15:::2;::::0;;::::2;::::0;45906:12;;45949::::2;::::0;46036:7:::2;::::0;45758:312:::2;::::0;45813:16;45860:15;45906:12;45949;45992:13;;45758:24:::2;:312::i;:::-;45742:328;;46108:16;46091:13;:33;;46083:51;;;::::0;;-1:-1:-1;;;46083:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46083:51:0;;;;;;;;;;;;;::::2;;46166:37;46171:8;:16;;;46189:13;46166:4;:37::i;:::-;46147:16;::::0;::::2;:56:::0;46221:44:::2;::::0;;;;;;;-1:-1:-1;;;;;46221:44:0;::::2;::::0;46230:10:::2;::::0;46221:44:::2;::::0;;;;::::2;::::0;;::::2;46278:29;46293:13;46278:14;:29::i;:::-;46318:51;46334:7;46343:10;46355:13;46318:15;:51::i;:::-;46380:22;46450:80;46477:7;46486:13;46509:4;46516:13;46450:26;:80::i;:::-;46413:117:::0;-1:-1:-1;46413:117:0;-1:-1:-1;46545:21:0;;46541:87:::2;;46587:41;46592:8;:16;;;46610:17;46587:4;:41::i;:::-;46568:16;::::0;::::2;:60:::0;46541:87:::2;46639:41;46654:10;46666:13;46639:14;:41::i;28996:19::-:0;;;;:::o;10599:397::-;10710:10;10666:4;10699:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10699:27:0;;;;;;;;;;10741:14;;;10737:160;;;10783:10;10802:1;10772:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10772:27:0;;;;;;;;;:31;10737:160;;;10866:19;10871:8;10881:3;10866:4;:19::i;:::-;10847:10;10836:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10836:27:0;;;;;;;;;:49;10737:160;10921:10;10938:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10912:54:0;;10938:27;;;;;;;;;;;10912:54;;;;;;;;;10921:10;-1:-1:-1;;;;;;;;;;;10912:54:0;;;;;;;;;;-1:-1:-1;10984:4:0;;10599:397;-1:-1:-1;;;10599:397:0:o;46729:1414::-;28343:6;;46883:18;;28343:6;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;46927:9:::2;::::0;::::2;;46919:32;;;::::0;;-1:-1:-1;;;46919:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46919:32:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;46970:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:23;::::2;;46962:42;;;::::0;;-1:-1:-1;;;46962:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46962:42:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;47043:17:0;::::2;47017:23;47043:17:::0;;;:8:::2;:17;::::0;;;;47144:16:::2;::::0;::::2;::::0;47191:15:::2;::::0;;::::2;::::0;47237:12;;47280::::2;::::0;47367:7:::2;::::0;47089:312:::2;::::0;47144:16;47191:15;47237:12;47280;47323:13;;47089:24:::2;:312::i;:::-;47073:328:::0;-1:-1:-1;47422:18:0;47414:43:::2;;;::::0;;-1:-1:-1;;;47414:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;47414:43:0;;;;;;;;;;;;;::::2;;47493:11;47476:13;:28;;47468:47;;;::::0;;-1:-1:-1;;;47468:47:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;47468:47:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;47566:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:25:::2;;::::0;47561:52:::2;::::0;2120:1:::2;782:6;2113:8;::::0;47561:52:::2;47544:13;:69;;47536:90;;;::::0;;-1:-1:-1;;;47536:90:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;47536:90:0;;;;;;;;;;;;;::::2;;47658:37;47663:8;:16;;;47681:13;47658:4;:37::i;:::-;47639:16;::::0;::::2;:56:::0;47713:44:::2;::::0;;;;;;;-1:-1:-1;;;;;47713:44:0;::::2;::::0;47722:10:::2;::::0;47713:44:::2;::::0;;;;::::2;::::0;;::::2;47770:29;47785:13;47770:14;:29::i;:::-;47810:41;47825:10;47837:13;47810:14;:41::i;:::-;47862:51;47878:7;47887:10;47899:13;47862:15;:51::i;:::-;47924:24;47951:49;47977:7;47986:13;47951:25;:49::i;:::-;47924:76:::0;-1:-1:-1;48015:23:0;;48011:91:::2;;48059:43;48064:8;:16;;;48082:19;48059:4;:43::i;:::-;48040:16;::::0;::::2;:62:::0;48115:20:::2;;28408:6:::0;:14;;-1:-1:-1;;28408:14:0;;;46729:1414;;-1:-1:-1;;;46729:1414:0:o;9914:111::-;-1:-1:-1;;;;;10003:14:0;9979:4;10003:14;;;;;;;;;;;;9914:111::o;22731:1312::-;22999:19;23036:21;23060:33;23065:14;23081:11;23060:4;:33::i;:::-;23036:57;;23201:29;23233:46;23238:12;23252:26;782:6;23270:7;23252:4;:26::i;:::-;23233:4;:46::i;:::-;23201:78;;23290:18;23311:42;23316:10;23328:24;23311:4;:42::i;:::-;23290:63;;23364:14;23381:31;23386:13;23401:10;23381:4;:31::i;:::-;23364:48;;23485:18;23506:52;23511:9;23522:35;782:6;23540:16;23522:4;:35::i;:::-;23506:4;:52::i;:::-;23485:73;;23569:23;23595:36;23600:13;23615:15;23595:4;:36::i;:::-;23569:62;;23644:32;23679:41;23684:15;23701:18;23679:4;:41::i;:::-;23644:76;;23857:8;23868:50;23873:35;782:6;23891:16;23873:4;:35::i;:::-;23910:7;23868:4;:50::i;:::-;23857:61;;23946:57;23951:27;23980:22;782:6;23998:3;23980:4;:22::i;23946:57::-;23929:74;;24014:21;;;;;;;;22731:1312;;;;;;;;;:::o;42657:2614::-;28343:6;;42894:18;;;;28343:6;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;-1:-1:-1::0;;;;;42959:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:23;::::2;;42951:42;;;::::0;;-1:-1:-1;;;42951:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;42951:42:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;43012:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:24;::::2;;43004:43;;;::::0;;-1:-1:-1;;;43004:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;43004:43:0;;;;;;;;;;;;;::::2;;43066:10;::::0;-1:-1:-1;;;43066:10:0;::::2;;;43058:34;;;::::0;;-1:-1:-1;;;43058:34:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;43058:34:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;43131:26:0;;::::2;43105:23;43131:26:::0;;;:8:::2;:26;::::0;;;;;43195:27;;::::2;::::0;;;;43266:17:::2;::::0;;::::2;::::0;43261:45:::2;::::0;782:6:::2;2177:8;::::0;43261:45:::2;43243:14;:63;;43235:84;;;::::0;;-1:-1:-1;;;43235:84:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;43235:84:0;;;;;;;;;;;;;::::2;;43332:20;43355:314;43407:8;:16;;;43462:8;:15;;;43516:9;:17;;;43572:9;:16;;;43627:7;;43355:13;:314::i;:::-;43332:337;;43707:8;43688:15;:27;;43680:51;;;::::0;;-1:-1:-1;;;43680:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;43680:51:0;;;;;;;;;;;;;::::2;;43760:312;43805:8;:16;;;43852:8;:15;;;43898:9;:17;;;43946:9;:16;;;43993:14;44038:7;;43760:14;:312::i;:::-;43744:328;;44108:11;44091:13;:28;;44083:47;;;::::0;;-1:-1:-1;;;44083:47:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44083:47:0;;;;;;;;;;;;;::::2;;44162:37;44167:8;:16;;;44185:13;44162:4;:37::i;:::-;44143:8;:16;;:56;;;;44230:39;44235:9;:17;;;44254:14;44230:4;:39::i;:::-;44210:17;::::0;;::::2;:59:::0;;;44347:16;::::2;::::0;44398:15:::2;::::0;;::::2;::::0;44500:16;;::::2;::::0;44551:7:::2;::::0;44299:290:::2;::::0;44210:59;44500:16;44299:13:::2;:290::i;:::-;44282:307;;44626:15;44608:14;:33;;44600:58;;;::::0;;-1:-1:-1;;;44600:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44600:58:0;;;;;;;;;;;;;::::2;;44695:8;44677:14;:26;;44669:48;;;::::0;;-1:-1:-1;;;44669:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44669:48:0;;;;;;;;;;;;;::::2;;44755:35;44760:13;44775:14;44755:4;:35::i;:::-;44736:15;:54;;44728:79;;;::::0;;-1:-1:-1;;;44728:79:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44728:79:0;;;;;;;;;;;;;::::2;;44855:8;-1:-1:-1::0;;;;;44825:70:0::2;44846:7;-1:-1:-1::0;;;;;44825:70:0::2;44834:10;-1:-1:-1::0;;;;;44825:70:0::2;;44865:13;44880:14;44825:70;;;;;;;;;;;;;;;;;;;;;;;;44908:51;44924:7;44933:10;44945:13;44908:15;:51::i;:::-;44970:53;44986:8;44996:10;45008:14;44970:15;:53::i;:::-;45034:24;45061:49;45087:7;45096:13;45061:25;:49::i;:::-;45034:76:::0;-1:-1:-1;45125:23:0;;45121:91:::2;;45169:43;45174:8;:16;;;45192:19;45169:4;:43::i;:::-;45150:16;::::0;::::2;:62:::0;45121:91:::2;45225:38;;;;28408:6:::0;:14;;-1:-1:-1;;28408:14:0;;;42657:2614;;;;-1:-1:-1;42657:2614:0;-1:-1:-1;;;;42657:2614:0:o;39967:2682::-;28343:6;;40203:19;;;;28343:6;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;-1:-1:-1::0;;;;;40271:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:23;::::2;;40263:42;;;::::0;;-1:-1:-1;;;40263:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40263:42:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;40324:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:24;::::2;;40316:43;;;::::0;;-1:-1:-1;;;40316:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40316:43:0;;;;;;;;;;;;;::::2;;40378:10;::::0;-1:-1:-1;;;40378:10:0;::::2;;;40370:34;;;::::0;;-1:-1:-1;;;40370:34:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40370:34:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;40443:26:0;;::::2;40417:23;40443:26:::0;;;:8:::2;:26;::::0;;;;;40507:27;;::::2;::::0;;;;40577:16:::2;::::0;::::2;::::0;40572:43:::2;::::0;2120:1:::2;782:6;2113:8;::::0;40572:43:::2;40555:13;:60;;40547:81;;;::::0;;-1:-1:-1;;;40547:81:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40547:81:0;;;;;;;;;;;;;::::2;;40641:20;40664:314;40716:8;:16;;;40771:8;:15;;;40825:9;:17;;;40881:9;:16;;;40936:7;;40664:13;:314::i;:::-;40641:337;;41016:8;40997:15;:27;;40989:51;;;::::0;;-1:-1:-1;;;40989:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40989:51:0;;;;;;;;;;;;;::::2;;41070:311;41115:8;:16;;;41162:8;:15;;;41208:9;:17;;;41256:9;:16;;;41303:13;41347:7;;41070:14;:311::i;:::-;41053:328;;41418:12;41400:14;:30;;41392:48;;;::::0;;-1:-1:-1;;;41392:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;41392:48:0;;;;;;;;;;;;;::::2;;41472:37;41477:8;:16;;;41495:13;41472:4;:37::i;:::-;41453:8;:16;;:56;;;;41540:39;41545:9;:17;;;41564:14;41540:4;:39::i;:::-;41520:17;::::0;;::::2;:59:::0;;;41657:16;::::2;::::0;41708:15:::2;::::0;;::::2;::::0;41810:16;;::::2;::::0;41861:7:::2;::::0;41609:290:::2;::::0;41520:59;41810:16;41609:13:::2;:290::i;:::-;41592:307;;41936:15;41918:14;:33;;41910:58;;;::::0;;-1:-1:-1;;;41910:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;41910:58:0;;;;;;;;;;;;;::::2;;42005:8;41987:14;:26;;41979:48;;;::::0;;-1:-1:-1;;;41979:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;41979:48:0;;;;;;;;;;;;;::::2;;42065:35;42070:13;42085:14;42065:4;:35::i;:::-;42046:15;:54;;42038:79;;;::::0;;-1:-1:-1;;;42038:79:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;42038:79:0;;;;;;;;;;;;;::::2;;42165:8;-1:-1:-1::0;;;;;42135:70:0::2;42156:7;-1:-1:-1::0;;;;;42135:70:0::2;42144:10;-1:-1:-1::0;;;;;42135:70:0::2;;42175:13;42190:14;42135:70;;;;;;;;;;;;;;;;;;;;;;;;42218:51;42234:7;42243:10;42255:13;42218:15;:51::i;:::-;42280:22;42351:76;42378:7;42387:13;42402:8;42412:14;42351:26;:76::i;:::-;42313:114:::0;-1:-1:-1;42313:114:0;-1:-1:-1;42442:21:0;;42438:87:::2;;42484:41;42489:8;:16;;;42507:17;42484:4;:41::i;:::-;42465:16;::::0;::::2;:60:::0;42438:87:::2;42536:53;42552:8;42562:10;42574:14;42536:15;:53::i;18198:1183::-:0;18442:18;18729:21;18753:32;18758:13;18773:11;18753:4;:32::i;:::-;18729:56;;18796:8;18807:50;18812:35;782:6;18830:16;18812:4;:35::i;:::-;18849:7;18807:4;:50::i;:::-;18796:61;;18868:26;18897:43;18902:13;18917:22;782:6;18935:3;18917:4;:22::i;18897:43::-;18868:72;;18953:22;18978:43;18983:14;18999:21;18978:4;:43::i;:::-;18953:68;;19032:17;19052:39;19057:17;19076:14;19052:4;:39::i;:::-;19032:59;;19172:14;19189:36;19194:12;19208:16;19189:4;:36::i;:::-;19172:53;;19236:18;19257:27;19262:9;19273:10;19257:4;:27::i;:::-;19236:48;;19311:31;19316:13;19331:10;19311:4;:31::i;:::-;19295:47;18198:1183;-1:-1:-1;;;;;;;;;;;;;;18198:1183:0:o;28716:22::-;;;-1:-1:-1;;;28716:22:0;;;;;:::o;36727:218::-;28135:10;-1:-1:-1;;;;;28117:39:0;28126:7;;-1:-1:-1;;;;;;28126:7:0;-1:-1:-1;;;;;28117:39:0;;28147:8;;28117:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28117:39:0;;;;;;;;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0;28343:6:::1;::::0;::::1;::::0;::::1;;;28342:7;28334:27;;;::::0;;-1:-1:-1;;;28334:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;::::1;;28372:6;:13:::0;;-1:-1:-1;;28372:13:0::1;;;::::0;;-1:-1:-1;;;;;36830:15:0;::::2;28372:13:::0;36830:15;;;:8:::2;:15;::::0;;;;:21;28372:13:::1;36830:21:::2;36822:40;;;::::0;;-1:-1:-1;;;36822:40:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;36822:40:0;;;;;;;;;;;;;::::2;;36899:38;::::0;;-1:-1:-1;;;36899:38:0;;36931:4:::2;36899:38;::::0;::::2;::::0;;;-1:-1:-1;;;;;36899:23:0;::::2;::::0;::::2;::::0;:38;;;;;::::2;::::0;;;;;;;;:23;:38;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36899:38:0;-1:-1:-1;;;;;36873:15:0;;::::2;;::::0;;;:8:::2;36899:38;36873:15:::0;;;;:23:::2;;:64:::0;28408:6:::1;:14:::0;;-1:-1:-1;;28408:14:0::1;::::0;;36727:218::o;32400:201::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;32532:10:::2;::::0;-1:-1:-1;;;;;32532:10:0::2;32518;:24;32510:48;;;::::0;;-1:-1:-1;;;32510:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32510:48:0;;;;;;;;;;;;;::::2;;32569:10;:24:::0;;-1:-1:-1;;;;;;32569:24:0::2;-1:-1:-1::0;;;;;32569:24:0;;;::::2;::::0;;;::::2;::::0;;28408:6;:14;;-1:-1:-1;;28408:14:0;;;32400:201::o;31328:148::-;28480:6;;31427:4;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;;-1:-1:-1;31456:12:0::1;::::0;31328:148;:::o;31101:219::-;28480:6;;31208:4;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31240:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;31232:40;;;::::0;;-1:-1:-1;;;31232:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31232:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;;31290:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;;31101:219::o;9592:87::-;9664:7;9657:14;;;;;;;;-1:-1:-1;;9657:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9631:13;;9657:14;;9664:7;;9657:14;;9664:7;9657:14;;;;;;;;;;;;;;;;;;;;;;;;13237:523;13449:14;13481:10;13494:35;13499:14;13515:13;13494:4;:35::i;:::-;13481:48;;13540:10;13553:37;13558:15;13575:14;13553:4;:37::i;:::-;13540:50;;13601:10;13614:18;13619:5;13626;13614:4;:18::i;:::-;13601:31;;13643:10;13656:45;782:6;13674:26;782:6;13692:7;13674:4;:26::i;13656:45::-;13643:58;;13733:18;13738:5;13745;13733:4;:18::i;:::-;13721:30;13237:523;-1:-1:-1;;;;;;;;;;13237:523:0:o;11004:142::-;11072:4;11089:27;11095:10;11107:3;11112;11089:5;:27::i;:::-;-1:-1:-1;11134:4:0;11004:142;;;;:::o;38858:1099::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;39000:9:::2;::::0;::::2;;38992:32;;;::::0;;-1:-1:-1;;;38992:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38992:32:0;;;;;;;;;;;;;::::2;;39037:14;39054:13;:11;:13::i;:::-;39037:30;;39078:13;39094:27;39099:12;39113:7;;39094:4;:27::i;:::-;39078:43;;39132:20;39155:28;39160:12;39174:8;39155:4;:28::i;:::-;39132:51;;39194:10;39207:32;39212:15;39229:9;39207:4;:32::i;:::-;39194:45:::0;-1:-1:-1;39258:10:0;39250:35:::2;;;::::0;;-1:-1:-1;;;39250:35:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;39250:35:0;;;;;;;;;;;;;::::2;;39298:40;39313:10;39325:12;39298:14;:40::i;:::-;39364:7;::::0;39349:33:::2;::::0;-1:-1:-1;;;;;39364:7:0::2;39373:8:::0;39349:14:::2;:33::i;:::-;39393:31;39408:15;39393:14;:31::i;:::-;39442:6;39437:513;39458:7;:14:::0;39454:18;::::2;39437:513;;;39494:9;39506:7;39514:1;39506:10;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;-1:-1:-1;;;;;39506:10:0::2;39542:11:::0;;;:8:::2;:11:::0;;;;;;:19:::2;;::::0;39506:10;;-1:-1:-1;39542:19:0;39598:16:::2;39603:5:::0;39542:19;39598:4:::2;:16::i;:::-;39576:38:::0;-1:-1:-1;39637:19:0;39629:44:::2;;;::::0;;-1:-1:-1;;;39629:44:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;39629:44:0;;;;;;;;;;;;;::::2;;39714:13;;39728:1;39714:16;;;;;;;;;;;;;39696:14;:34;;39688:52;;;::::0;;-1:-1:-1;;;39688:52:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;39688:52:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;39782:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;:19:::2;;::::0;39777:41:::2;::::0;39803:14;39777:4:::2;:41::i;:::-;-1:-1:-1::0;;;;;39755:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;;;;;:19:::2;;:63:::0;;;;39838:39;;;;;;;39755:11;;39847:10:::2;::::0;39838:39:::2;::::0;;;;;;;;::::2;39892:46;39908:1;39911:10;39923:14;39892:15;:46::i;:::-;-1:-1:-1::0;;;39474:3:0::2;;39437:513;;;-1:-1:-1::0;;28408:6:0;:14;;-1:-1:-1;;28408:14:0;;;-1:-1:-1;;;;;;38858:1099:0:o;29022:21::-;;;;;;:::o;14778:697::-;15020:19;15057:16;15076:35;15081:13;15096:14;15076:4;:35::i;:::-;15057:54;;15122:15;15140:26;782:6;15158:7;15140:4;:26::i;:::-;15122:44;;15190:31;15195:13;15210:10;15190:4;:31::i;:::-;15177:44;;15232:6;15241:54;15246:14;15262:32;15267:14;15283:10;15262:4;:32::i;15241:54::-;15232:63;;15306:8;15317:20;15322:1;15325:11;15317:4;:20::i;:::-;15306:31;;15348:8;15359:22;782:6;15377:3;15359:4;:22::i;:::-;15348:33;;15409:26;15414:15;15431:3;15409:4;:26::i;:::-;15392:43;14778:697;-1:-1:-1;;;;;;;;;;;;14778:697:0:o;30900:193::-;28480:6;;30987:23;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;;31036:9:::1;::::0;::::1;;31028:32;;;::::0;;-1:-1:-1;;;31028:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31028:32:0;;;;;;;;;;;;;::::1;;31078:7;31071:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;31071:14:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;30900:193:::0;:::o;28587:22::-;;;-1:-1:-1;;;;;28587:22:0;;:::o;30749:143::-;28480:6;;30829:23;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;30624:117;30719:7;:14;30624:117;:::o;35626:1016::-;28343:6;;;;;;;28342:7;28334:27;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;-1:-1:-1;;;28334:27:0;;;;;;;;;;;;;;;28372:6;:13;;;-1:-1:-1;;28372:13:0;;;;;;28117:39:::1;::::0;;::::1;::::0;;;28147:8:::1;28117:39:::0;;::::1;::::0;;;28135:10:::1;::::0;-1:-1:-1;28126:7:0;::::1;-1:-1:-1::0;;;;;;28126:7:0::1;::::0;-1:-1:-1;;28147:8:0;28117:39;;;;-1:-1:-1;28147:8:0;;-1:-1:-1;28117:39:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;28117:39:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0::1;35747:10:::2;::::0;-1:-1:-1;;;;;35747:10:0::2;35733;:24;35725:48;;;::::0;;-1:-1:-1;;;35725:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35725:48:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;35792:15:0;::::2;;::::0;;;:8:::2;:15;::::0;;;;:21;::::2;;35784:40;;;::::0;;-1:-1:-1;;;35784:40:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35784:40:0;;;;;;;;;;;;;::::2;;35844:9;::::0;::::2;;35843:10;35835:32;;;::::0;;-1:-1:-1;;;35835:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35835:32:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;35900:15:0;::::2;35880:17;35900:15:::0;;;:8:::2;:15;::::0;;;;:23:::2;;::::0;35973:7:::2;::::0;35900:23;;35880:17;35954:27:::2;::::0;35900:23;;35954:4:::2;:27::i;:::-;36014:12;::::0;-1:-1:-1;;;;;36028:15:0;::::2;;::::0;;;:8:::2;:15;::::0;;;;:22:::2;;::::0;35934:47;;-1:-1:-1;36009:42:0::2;::::0;:4:::2;:42::i;:::-;35994:12;:57:::0;-1:-1:-1;;;;;36174:15:0;::::2;36161:10;36174:15:::0;;;:8:::2;:15;::::0;;;;:21:::2;;::::0;36218:7:::2;:14:::0;;-1:-1:-1;;36218:18:0;;;:7;:18;;36264:13;::::2;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;36247:7:::2;:14:::0;;-1:-1:-1;;;;;36264:13:0;;::::2;::::0;36255:5;;36247:14;::::2;;;;;;;;;;;;;:30;;;;;-1:-1:-1::0;;;;;36247:30:0::2;;;;;-1:-1:-1::0;;;;;36247:30:0::2;;;;;;36321:5;36288:8;:24;36297:7;36305:5;36297:14;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;-1:-1:-1;;;;;36297:14:0::2;36288:24:::0;;;::::2;::::0;;;;;;;;36297:14;36288:30:::2;:38:::0;36337:7:::2;:13:::0;;;::::2;;;;;::::0;;;::::2;::::0;;;-1:-1:-1;;36337:13:0;;;;;;;-1:-1:-1;;;;;;36337:13:0::2;::::0;;;;;;;;36379:118:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36361:15:0;::::2;::::0;;:8:::2;:15:::0;;;;;;;:136;;;;-1:-1:-1;;36361:136:0::2;::::0;::::2;;;::::0;;;;-1:-1:-1;36361:136:0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;36510:68:::2;36361:15:::0;36533:10:::2;36545:32;36550:12:::0;36564;36545:4:::2;:32::i;36510:68::-;36612:7;::::0;36589:45:::2;::::0;36605:5;;-1:-1:-1;;;;;36612:7:0::2;36621:12:::0;36589:15:::2;:45::i;10339:252::-:0;10469:10;10406:4;10458:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10458:27:0;;;;;;;;;;10453:38;;10487:3;10453:4;:38::i;:::-;10434:10;10423:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10423:27:0;;;;;;;;;;;;:68;;;10507:54;;;;;;10423:27;;-1:-1:-1;;;;;;;;;;;10507:54:0;;;;;;;;;;-1:-1:-1;10579:4:0;10339:252;;;;:::o;9777:129::-;-1:-1:-1;;;;;9878:15:0;;;9854:4;9878:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;9777:129::o;33281:712::-;28135:10;-1:-1:-1;;;;;28117:39:0;28126:7;;-1:-1:-1;;;;;;28126:7:0;-1:-1:-1;;;;;28117:39:0;;28147:8;;28117:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28117:39:0;;;;;;;;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0;33489:10:::1;::::0;-1:-1:-1;;;;;33489:10:0::1;33475;:24;33467:48;;;::::0;;-1:-1:-1;;;33467:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33467:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;33535:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;33534:22;33526:40;;;::::0;;-1:-1:-1;;;33526:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33526:40:0;;;;;;;;;;;;;::::1;;33586:9;::::0;::::1;;33585:10;33577:32;;;::::0;;-1:-1:-1;;;33577:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33577:32:0;;;;;;;;;;;;;::::1;;33630:7;:14:::0;901:1:::1;-1:-1:-1::0;33622:63:0::1;;;::::0;;-1:-1:-1;;;33622:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33622:63:0;;;;;;;;;;;;;::::1;;33716:198;::::0;;::::1;::::0;::::1;::::0;;33745:4:::1;33716:198:::0;;;33771:7:::1;:14:::0;;33716:198:::1;::::0;;::::1;::::0;;;-1:-1:-1;33716:198:0;;;;;;;;;;;;-1:-1:-1;;;;;33698:15:0;::::1;::::0;;;:8:::1;:15:::0;;;;;;:216;;;;-1:-1:-1;;33698:216:0::1;::::0;::::1;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;33925:19;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;33925:19:0::1;::::0;;::::1;::::0;;33955:30:::1;33698:15:::0;33969:7;33978:6;33955::::1;:30::i;:::-;33281:712:::0;;;:::o;30237:248::-;28135:10;-1:-1:-1;;;;;28117:39:0;28126:7;;-1:-1:-1;;;;;;28126:7:0;-1:-1:-1;;;;;28117:39:0;;28147:8;;28117:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28117:39:0;;;;;;;;-1:-1:-1;28117:39:0;;-1:-1:-1;;;;28117:39:0;30306:9:::1;::::0;::::1;;30305:10;30297:32;;;::::0;;-1:-1:-1;;;30297:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30297:32:0;;;;;;;;;;;;;::::1;;30362:7;::::0;-1:-1:-1;;;;;30362:7:0::1;30348:10;:21;30340:42;;;::::0;;-1:-1:-1;;;30340:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30340:42:0;;;;;;;;;;;;;::::1;;1376:11:::0;30401:31;::::1;;30393:55;;;::::0;;-1:-1:-1;;;30393:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30393:55:0;;;;;;;;;;;;;::::1;;30459:7;:18:::0;30237:248::o;28919:24::-;;;;:::o;31484:268::-;28480:6;;31589:4;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31621:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;31613:40;;;::::0;;-1:-1:-1;;;31613:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31613:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;31678:15:0;::::1;31664:11;31678:15:::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;31731:12:::1;::::0;31718:26:::1;::::0;31678:22;;31718:4:::1;:26::i;:::-;31711:33:::0;31484:268;-1:-1:-1;;;31484:268:0:o;28664:25::-;;;-1:-1:-1;;;;;28664:25:0;;:::o;31760:209::-;28480:6;;31856:4;;28480:6;;;;;28479:7;28471:27;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;-1:-1:-1;;;28471:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31888:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;31880:40;;;::::0;;-1:-1:-1;;;31880:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31880:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;;31938:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:23:::1;;::::0;;31760:209::o;16493:686::-;16736:18;16772:16;16791:35;16796:14;16812:13;16791:4;:35::i;:::-;16772:54;;16837:9;16849:37;16854:15;16871:14;16849:4;:37::i;:::-;16837:49;;16897:6;16906:27;16911:15;16928:4;16906;:27::i;:::-;16897:36;;16944:8;16955:20;16960:1;16963:11;16955:4;:20::i;:::-;16944:31;;16992:22;16997:3;782:6;16992:4;:22::i;:::-;16986:28;;17041:26;782:6;17059:7;17041:4;:26::i;:::-;17025:42;;17094:46;17099:25;17104:14;17120:3;17099:4;:25::i;:::-;17126:13;17094:4;:46::i;:::-;17078:62;16493:686;-1:-1:-1;;;;;;;;;;;16493:686:0:o;4076:389::-;4147:4;4177:6;4169:27;;;;;-1:-1:-1;;;4169:27:0;;;;;;;;;;;;-1:-1:-1;;;4169:27:0;;;;;;;;;;;;;;;782:6;4217:15;;4251:6;;;:31;;;782:6;4266:1;4261:2;:6;;;;;;:21;4251:31;4243:56;;;;;-1:-1:-1;;;4243:56:0;;;;;;;;;;;;-1:-1:-1;;;4243:56:0;;;;;;;;;;;;;;;4347:1;4343:5;;4337:12;;4368:8;;;;4360:33;;;;;-1:-1:-1;;;4360:33:0;;;;;;;;;;;;-1:-1:-1;;;4360:33:0;;;;;;;;;;;;;;;4421:7;4436:1;4431:2;:6;;;;;;;4076:389;-1:-1:-1;;;;;;4076:389:0:o;3314:198::-;3385:4;3408:6;3416:9;3429:14;3438:1;3441;3429:8;:14::i;:::-;3407:36;;;;3463:4;3462:5;3454:31;;;;;-1:-1:-1;;;3454:31:0;;;;;;;;;;;;-1:-1:-1;;;3454:31:0;;;;;;;;;;;;;;;-1:-1:-1;3503:1:0;3314:198;-1:-1:-1;;;3314:198:0:o;3751:317::-;3822:4;3854:5;;;3878:6;;;:21;;;3898:1;3893;3888:2;:6;;;;;;:11;3878:21;3870:46;;;;;-1:-1:-1;;;3870:46:0;;;;;;;;;;;;-1:-1:-1;;;3870:46:0;;;;;;;;;;;;;;;3943:15;3937:22;;3978:8;;;;3970:33;;;;;-1:-1:-1;;;3970:33:0;;;;;;;;;;;;-1:-1:-1;;;3970:33:0;;;;;;;;;;;;;;;4014:7;782:6;4024:2;:16;;4975:558;5051:4;1910:5;5081:4;:28;;5073:53;;;;;-1:-1:-1;;;5073:53:0;;;;;;;;;;;;-1:-1:-1;;;5073:53:0;;;;;;;;;;;;;;;1970:18;5145:28;;;5137:54;;;;;-1:-1:-1;;;5137:54:0;;;;;;;;;;;;-1:-1:-1;;;5137:54:0;;;;;;;;;;;;;;;5204:10;5218:11;5225:3;5218:6;:11::i;:::-;5204:25;;5243:11;5257:16;5262:3;5267:5;5257:4;:16::i;:::-;5243:30;;5286:13;5302:24;5308:4;5314:11;5319:5;5314:4;:11::i;:::-;5302:5;:24::i;:::-;5286:40;-1:-1:-1;5343:11:0;5339:59;;5378:8;-1:-1:-1;5371:15:0;;-1:-1:-1;;5371:15:0;5339:59;5410:18;5431:47;5442:4;5448:6;2043:13;5431:10;:47::i;:::-;5410:68;;5496:29;5501:8;5511:13;5496:4;:29::i;:::-;5489:36;4975:558;-1:-1:-1;;;;;;;4975:558:0:o;51712:112::-;51797:19;51803:4;51809:6;51797:5;:19::i;:::-;51712:112;;:::o;53228:581::-;53393:12;;53320:23;;53393:16;53389:413;;53462:7;;53452:35;;;-1:-1:-1;;;53452:35:0;;;;53426:23;;-1:-1:-1;;;;;53462:7:0;;53452:33;;:35;;;;;;;;;;;;;;53462:7;53452:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53452:35:0;;-1:-1:-1;;;;;;53506:29:0;;;53502:289;;53577:53;53582:34;53587:14;53603:12;;53582:4;:34::i;:::-;782:6;53577:4;:53::i;:::-;53675:7;;53556:74;;-1:-1:-1;53649:54:0;;53665:8;;-1:-1:-1;;;;;53675:7:0;53556:74;53649:15;:54::i;:::-;53727:48;;;;;;;;-1:-1:-1;;;;;53727:48:0;;;;;;;;;;;;;53502:289;53389:413;53228:581;;;;:::o;52048:92::-;52119:13;52125:6;52119:5;:13::i;:::-;52048:92;:::o;51832:108::-;51915:17;51921:2;51925:6;51915:5;:17::i;51515:189::-;51614:9;51633:5;-1:-1:-1;;;;;51626:22:0;;51649:2;51653:6;51626:34;;;;;;;;;;;;;-1:-1:-1;;;;;51626:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51626:34:0;;-1:-1:-1;51626:34:0;51671:25;;;;;-1:-1:-1;;;51671:25:0;;;;;;;;;;;;-1:-1:-1;;;51671:25:0;;;;;;;;;;;;;;;51515:189;;;;:::o;8844:257::-;-1:-1:-1;;;;;8923:13:0;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;8923:20:0;8915:37;;;;;-1:-1:-1;;;8915:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;8915:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;8984:13:0;;:8;:13;;;;;;;;;;;8979:24;;8999:3;8979:4;:24::i;:::-;-1:-1:-1;;;;;8963:13:0;;;:8;:13;;;;;;;;;;;:40;;;;9035:13;;;;;;;9030:24;;9050:3;9030:4;:24::i;:::-;-1:-1:-1;;;;;9014:13:0;;;:8;:13;;;;;;;;;;;;:40;;;;9070:23;;;;;;;9014:13;;9070:23;;;;;;;;;;;;;8844:257;;;:::o;3130:176::-;3201:4;3232:5;;;3256:6;;;;3248:31;;;;;-1:-1:-1;;;3248:31:0;;;;;;;;;;;;-1:-1:-1;;;3248:31:0;;;;;;;;;;;;;;51295:212;51408:55;;;-1:-1:-1;;;51408:55:0;;-1:-1:-1;;;;;51408:55:0;;;;;;;51449:4;51408:55;;;;;;;;;;;;51396:9;;51408:26;;;;;:55;;;;;;;;;;;;;;51396:9;51408:26;:55;;;;;;;;;;52148:1024;52415:12;;52282:21;;52385:15;;52415:16;52411:754;;52484:7;;52474:35;;;-1:-1:-1;;;52474:35:0;;;;52448:23;;-1:-1:-1;;;;;52484:7:0;;52474:33;;:35;;;;;;;;;;;;;;52484:7;52474:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52474:35:0;;-1:-1:-1;;;;;;52528:27:0;;;;;;;52524:630;;;52595:53;52600:34;52605:14;52621:12;;52600:4;:34::i;52595:53::-;52693:7;;52576:72;;-1:-1:-1;52667:52:0;;52683:8;;-1:-1:-1;;;;;52693:7:0;52576:72;52667:15;:52::i;:::-;52743:46;;;;;;;;-1:-1:-1;;;;;52743:46:0;;;;;;;;;;;;;52524:630;;;52830:24;52857:54;52862:35;52867:15;52884:12;;52862:4;:35::i;52857:54::-;52957:7;;52830:81;;-1:-1:-1;52930:56:0;;52946:9;;-1:-1:-1;;;;;52957:7:0;52830:81;52930:15;:56::i;:::-;53022:42;53027:15;53044:19;53022:4;:42::i;:::-;53088:50;;;;;;;;53005:59;;-1:-1:-1;;;;;;53088:50:0;;;;;;;;;;;;52524:630;;52411:754;;52148:1024;;;;;;;:::o;51948:92::-;52019:13;52025:6;52019:5;:13::i;3520:223::-;3595:4;3601;3632:1;3627;:6;3623:113;;-1:-1:-1;;3658:5:0;;;3665;3650:21;;3623:113;-1:-1:-1;;3712:5:0;;;3719:4;3623:113;3520:223;;;;;:::o;2999:123::-;3064:4;782:6;3093:7;3098:1;3093:4;:7::i;:::-;:21;;2999:123;-1:-1:-1;;2999:123:0:o;2875:116::-;782:6;2968:15;;;2875:116::o;4493:321::-;4565:4;;4600:1;4596;:5;:28;;782:6;4596:28;;;4609:1;4596:28;4587:37;-1:-1:-1;4647:1:0;4642:6;;;;4637:151;4650:6;;4637:151;;4685:10;4690:1;4693;4685:4;:10::i;:::-;4681:14;-1:-1:-1;4720:1:0;4716;:5;:10;4712:65;;4751:10;4756:1;4759;4751:4;:10::i;:::-;4747:14;;4712:65;4663:1;4658:6;;;;4637:151;;5541:1108;5639:4;5694:3;5639:4;;5731:27;5740:4;782:6;5731:8;:27::i;:::-;5708:50;;-1:-1:-1;5708:50:0;-1:-1:-1;782:6:0;;5769:9;6110:1;6096:523;6121:9;6113:4;:17;6096:523;;6152:9;782:6;6164:1;:15;6152:27;;6195:6;6203:9;6216:36;6225:1;6228:23;6233:4;782:6;6228:4;:23::i;:::-;6216:8;:36::i;:::-;6194:58;;;;6274:22;6279:4;6285:10;6290:1;6293;6285:4;:10::i;6274:22::-;6267:29;;6318:16;6323:4;6329;6318;:16::i;:::-;6311:23;-1:-1:-1;6353:9:0;6349:20;;6364:5;;;;;6349:20;6390:4;6386:30;;;6407:9;;;6386:30;6435:4;6431:30;;;6452:9;;;6431:30;6480:8;6476:132;;;6515:15;6520:3;6525:4;6515;:15::i;:::-;6509:21;;6476:132;;;6577:15;6582:3;6587:4;6577;:15::i;:::-;6571:21;;6476:132;-1:-1:-1;;;6132:3:0;;6096:523;;;-1:-1:-1;6638:3:0;;5541:1108;-1:-1:-1;;;;;;;;;5541:1108:0:o;9211:98::-;9270:31;9276:4;9290;9297:3;9270:5;:31::i;8560:276::-;8630:4;8613:8;:23;;;;;;;;;;;:30;-1:-1:-1;8613:30:0;8605:47;;;;;-1:-1:-1;;;8605:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;8605:47:0;;;;;;;;;;;;;;;8711:4;8694:8;:23;;;;;;;;;;;8689:34;;8719:3;8689:4;:34::i;:::-;8680:4;8663:8;:23;;;;;;;;;;:60;8754:12;;8749:23;;8768:3;8749:4;:23::i;:::-;8734:12;:38;8788:40;;;;;;;;8820:1;;8805:4;;8788:40;;;;;;;;;8560:276;:::o;9109:94::-;9166:29;9180:4;9187:2;9191:3;9166:5;:29::i;8334:218::-;8427:4;8410:8;:23;;;;;;;;;;;8405:34;;8435:3;8405:4;:34::i;:::-;8396:4;8379:8;:23;;;;;;;;;;:60;8470:12;;8465:23;;8484:3;8465:4;:23::i;:::-;8450:12;:38;8504:40;;;;;;;;8533:4;;8521:1;;8504:40;;;;;;;;;8334:218;:::o
Swarm Source
ipfs://4814ffc3fcf8d3e48bc307a87a7d058f3ac272a5642097cdb240483f9938a325
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.