Contract Overview
Balance:
0 FTM
FTM Value:
$0.00
My Name Tag:
Not Available, login to update
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x1e26ee8d01d1f4f29b880ded6ab34df478a18c6619a7ce02275528d8ced05192 | 57798001 | 6 days 2 mins ago | 0x3a293975ba14c4c7a48ec093db59f89ad0a9b4cc | Contract Creation | 0 FTM |
[ Download CSV Export ]
Contract Name:
GaugeEquivalent
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at FtmScan.com on 2023-03-18 */ /** *Submitted for verification at FtmScan.com on 2023-03-17 */ /** * EQUALIZER EXCHANGE * The New Liquidity Hub of Fantom chain! * https://equalizer.exchange (Dapp) * https://discord.gg/MaMhbgHMby (Community) * * * Version: 1.5.0 * - Remove the "checkpoint" system * - Remove "Proxy pattern" construction * - Remove Pausable contract (Removes inheritance from Owned contract) * - MultiRewards Gauge with per-token variable epoch-lengths (default: 7 days) * - Supports Rewarding with Transfer-fee tokens * - Supports Deposits/Withdraws of tokens with Transfer-fee * - Support for LP Bribes * - Voter.team() can enable a new Reward token, which can be added by anyone as a reward thereafter * - Base Equal token default with a single-token reward config over 7 days * - Taxable Fee-Claims * - Ability to introduce Protocol Fees * - Ability to fund multiple Bribes at once * - Ability to channel funds from 'claimFees' into some other contracts * - Support for new LP types: * - 2pool/3pool/4pool: Curve-style Stable Pools & Crypto Pools * - Upto 8-token weighted, stable, meta-boosted & meta-stable Balancer-style pools * - Wrapped Concentrated Liquidity fungible pools (ERC1155) * - "Enhanced" Griefing Protection Enabled for Unknown reward adders * - Voter & Distributor can notify rewards freely without any restrictions * - Choice of validation between best of SNX method (rewardRate not lower) or CRV method (more than left) * - Remove "Boosted" rewards * - No concept of derivedBalances * - No veNFT attachments/detachments upon deposits/withdrawals * - totalBribePayouts to replace fee0 & fees1 to support multi-token accounting of claimed fees * - Introduce the concept of `bribeTokens` to help facilitate bribes from non-standard multi-token pools * - Upgradable Reward-distribution Durations * - Remove concept of MAX_REWARD_TOKENS * - Only ve.team() can `addReward()` new tokens * * * Version: 1.4.0 * - Remove the whole concept of Internal Bribes (Trade Fees Streamer). * - Each deposit/withdraw/getReward also calls claimFees * - Allow to notifyRewards to Bribe without the fear of griefing * - Time-dilution of reward APR by extending periodFinish is not possible * - Bribes are paid as a lumpsum. Trade Fees are treated as External Bribes. * - Repurpose usage of fees0 & fees1 as indicators of net revenue of a gauge * - Allow overriding fee receipient (like ABcDeFX) by Voter.team() * - Voter.team() can siphon out unclaimed rewards. * - The deposited "stake" tokens (user funds) cannot be rescued. (No Rugs!) * - Only the Reward tokens can be rescue()'d. * - Useful in cases of non-official/external/independent gauges * - Especially in cases where "stake"d tokens have their own claimFees(). * * * * * Contributors: * - Synthetix Network * - Curve Finance * - Andre Cronje, Fantom & Solidly.Exchange * - 543 (Sam), ftm.guru & Equalizer.exchange * * * SPDX-License-Identifier: UNLICENSED */ pragma solidity 0.8.9; // File: contracts/interfaces/IGaugeFactory.sol interface IGaugeFactory { function createGauge(address, address, address, bool, address[] memory) external returns (address); } // File: contracts/interfaces/IVotingEscrow.sol interface IVotingEscrow { struct Point { int128 bias; int128 slope; // # -dweight / dt uint256 ts; uint256 blk; // block } function token() external view returns (address); function team() external returns (address); function epoch() external view returns (uint); function point_history(uint loc) external view returns (Point memory); function user_point_history(uint tokenId, uint loc) external view returns (Point memory); function user_point_epoch(uint tokenId) external view returns (uint); function ownerOf(uint) external view returns (address); function isApprovedOrOwner(address, uint) external view returns (bool); function transferFrom(address, address, uint) external; function voting(uint tokenId) external; function abstain(uint tokenId) external; function attach(uint tokenId) external; function detach(uint tokenId) external; function checkpoint() external; function deposit_for(uint tokenId, uint value) external; function create_lock_for(uint, uint, address) external returns (uint); function balanceOfNFT(uint) external view returns (uint); function totalSupply() external view returns (uint); } // File: contracts/interfaces/IVoter.sol interface IVoter { function _ve() external view returns (address); function governor() external view returns (address); function emergencyCouncil() external view returns (address); function attachTokenToGauge(uint _tokenId, address account) external; function attachable() external view returns (bool); function detachTokenFromGauge(uint _tokenId, address account) external; function emitDeposit(uint _tokenId, address account, uint amount) external; function emitWithdraw(uint _tokenId, address account, uint amount) external; function isWhitelisted(address token) external view returns (bool); function notifyRewardAmount(uint amount) external; function distribute(address _gauge) external; } // File: contracts/interfaces/IPair.sol interface IPair { function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1); function claimFees() external returns (uint, uint); function tokens() external returns (address, address); function transferFrom(address src, address dst, uint amount) external returns (bool); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function burn(address to) external returns (uint amount0, uint amount1); function mint(address to) external returns (uint liquidity); function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast); function getAmountOut(uint, address) external view returns (uint); } // File: contracts/interfaces/IERC20.sol interface IERC20 { function totalSupply() external view returns (uint256); function transfer(address recipient, uint amount) external returns (bool); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function balanceOf(address) external view returns (uint); function transferFrom(address sender, address recipient, uint amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); } // File: contracts/interfaces/IBribe.sol interface IBribe { function _deposit(uint amount, uint tokenId) external; function _withdraw(uint amount, uint tokenId) external; function getRewardForOwner(uint tokenId, address[] memory tokens) external; function notifyRewardAmount(address token, uint amount) external; function left(address token) external view returns (uint); function rewardsListLength() external view returns (uint); function rewards(uint) external view returns (address); } library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * > It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } contract ReentrancyGuard { /// @dev counter to allow mutex lock with only one SSTORE operation uint256 private _guardCounter; constructor () { // The counter starts at one to prevent changing it from zero to a non-zero // value, which is a more expensive operation. _guardCounter = 1; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call"); } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } contract GaugeEquivalent is ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; /* ========== STATE VARIABLES ========== */ struct Reward { address rewardsDistributor; uint256 rewardsDuration; uint256 periodFinish; uint256 rewardRate; uint256 lastUpdateTime; uint256 rewardPerTokenStored; } bool public paused; IERC20 public stakingToken; mapping(address => Reward) public rewardData; address[] public rewardTokens; address[] public bribeTokens; // user -> reward token -> amount mapping(address => mapping(address => uint256)) public userRewardPerTokenPaid; mapping(address => mapping(address => uint256)) public rewards; mapping(address => bool) public isReward; mapping(address => bool) public isBribeToken; uint256 private _totalSupply; mapping(address => uint256) private _balances; IBribe public bribe; IVotingEscrow public ve; IVoter public voter; bool public isForPair; address public feeTaker; mapping(address => uint) public payouts; mapping(address => uint) public payoutsNotified; mapping(address => mapping(address => uint)) public earnings; mapping(address => uint) public totalFeesPayouts; /* ========== CONSTRUCTOR ========== */ constructor( address _stake, address _ebribe, address __ve, address _voter, bool _forPair, address[] memory _allowedRewardTokens ) { stakingToken = IERC20(_stake); bribe = IBribe(_ebribe); ve = IVotingEscrow(__ve); voter = IVoter(_voter); isForPair = _forPair; for (uint i; i < _allowedRewardTokens.length; i++) { if (_allowedRewardTokens[i] != address(0)) { isReward[_allowedRewardTokens[i]] = true; rewardTokens.push(_allowedRewardTokens[i]); rewardData[_allowedRewardTokens[i]].rewardsDistributor = _voter; rewardData[_allowedRewardTokens[i]].rewardsDuration = 7 days; } } if(_forPair) { //claimFees : Bribe Rewards //Pre-approve to save gas, since both Bribe & Gauge are immutable (address _token0, address _token1) = IPair(_stake).tokens(); IERC20(_token0).approve(_ebribe, type(uint256).max); IERC20(_token1).approve(_ebribe, type(uint256).max); bribeTokens.push(_token0); bribeTokens.push(_token1); isBribeToken[_token0] = true; isBribeToken[_token1] = true; emit BribeTokenSet(_token0, _ebribe, true); emit BribeTokenSet(_token1, _ebribe, true); } ///else ve.team() must manually `addBribeTokens()` } /* ========== VIEWS ========== */ function totalSupply() external view returns (uint256) { return _totalSupply; } function balanceOf(address account) external view returns (uint256) { return _balances[account]; } function lastTimeRewardApplicable(address _rewardsToken) public view returns (uint256) { return Math.min(block.timestamp, rewardData[_rewardsToken].periodFinish); } function rewardPerToken(address _rewardsToken) public view returns (uint256) { if (_totalSupply == 0) { return rewardData[_rewardsToken].rewardPerTokenStored; } return rewardData[_rewardsToken].rewardPerTokenStored.add( lastTimeRewardApplicable(_rewardsToken).sub(rewardData[_rewardsToken].lastUpdateTime).mul(rewardData[_rewardsToken].rewardRate).mul(1e18).div(_totalSupply) ); } /// @param account 1 /// @param _rewardsToken 2 function earnedBy(address account, address _rewardsToken) public view returns (uint256) { return _balances[account].mul(rewardPerToken(_rewardsToken).sub(userRewardPerTokenPaid[account][_rewardsToken])).div(1e18).add(rewards[account][_rewardsToken]); } /// Backwards compatible view with 3qu471738 <= v1.3 /// @param _rewardsToken 1 /// @param account 2 function earned(address _rewardsToken, address account) public view returns (uint256) { return earnedBy(account, _rewardsToken); } function getRewardForDuration(address _rewardsToken) external view returns (uint256) { return rewardData[_rewardsToken].rewardRate.mul(rewardData[_rewardsToken].rewardsDuration); } function left(address _rewardsToken) external view returns (uint) { if (block.timestamp >= rewardData[_rewardsToken].periodFinish) return 0; uint256 remaining = rewardData[_rewardsToken].periodFinish.sub(block.timestamp); return remaining.mul(rewardData[_rewardsToken].rewardRate); } function rewardsListLength() external view returns (uint) { return rewardTokens.length; } function bribesListLength() external view returns (uint) { return bribeTokens.length; } /* ========== MUTATIVE FUNCTIONS ========== */ function setRewardsDistributor(address _rewardsToken, address _rewardsDistributor) external onlyOwner { rewardData[_rewardsToken].rewardsDistributor = _rewardsDistributor; } function deposit(uint256 amount) public nonReentrant notPaused updateReward(msg.sender) { require(amount > 0, "Cannot stake 0"); _totalSupply = _totalSupply.add(amount); _balances[msg.sender] = _balances[msg.sender].add(amount); stakingToken.safeTransferFrom(msg.sender, address(this), amount); emit Deposit(msg.sender, amount); _claimFees(); } function depositFor(address _user, uint256 amount) public nonReentrant notPaused updateReward(_user) { require(amount > 0, "Cannot stake 0"); _totalSupply = _totalSupply.add(amount); _balances[_user] = _balances[_user].add(amount); stakingToken.safeTransferFrom(msg.sender, address(this), amount); emit Deposit(_user, amount); _claimFees(); } function depositAll() external { deposit(stakingToken.balanceOf(msg.sender)); } function depositAllFor(address _user) external { depositFor(_user, stakingToken.balanceOf(msg.sender)); } function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) { require(amount > 0, "Cannot withdraw 0"); _totalSupply = _totalSupply.sub(amount); _balances[msg.sender] = _balances[msg.sender].sub(amount); stakingToken.safeTransfer(msg.sender, amount); emit Withdrawn(msg.sender, amount); _claimFees(); } function withdrawAll() external { withdraw(_balances[msg.sender]); } function getReward() public nonReentrant updateReward(msg.sender) { for (uint i; i < rewardTokens.length; i++) { address _rewardsToken = rewardTokens[i]; uint256 _reward = rewards[msg.sender][_rewardsToken]; if (_reward > 0) { rewards[msg.sender][_rewardsToken] = 0; IERC20(_rewardsToken).safeTransfer(msg.sender, _reward); emit ClaimRewards(msg.sender, _rewardsToken, _reward); payouts[_rewardsToken] += _reward; earnings[msg.sender][_rewardsToken] += _reward; } } _claimFees(); } function _getReward(address account, address[] memory _tokens) internal nonReentrant updateReward(account) { for (uint i; i < _tokens.length; i++) { address _rewardsToken = _tokens[i]; uint256 _reward = rewards[account][_rewardsToken]; if (_reward > 0) { rewards[account][_rewardsToken] = 0; IERC20(_rewardsToken).safeTransfer(account, _reward); emit ClaimRewards(_rewardsToken, account, _reward); payouts[_rewardsToken] += _reward; earnings[account][_rewardsToken] += _reward; } } _claimFees(); } function getReward(address account, address[] memory tokens) external { require(msg.sender == account || msg.sender == address(voter), "Un-authorized claim!"); voter.distribute(address(this)); _getReward(account, tokens); } function exit() external { withdraw(_balances[msg.sender]); getReward(); } function notifyRewardAmount(address _rewardsToken, uint256 _reward) external nonReentrant updateReward(address(0)) { require(_rewardsToken != address(stakingToken), "Can't distribute staked token as reward!"); require(isReward[_rewardsToken], "Not a reward!!" ); /// The old pattern to get force collection of fees at least once a week during emission distribution to this gauge /// & distribute it to voters over the next week via the (external) Bribe _claimFees(); /// Support feeOnTransfer tokens like ELITE etc. uint rtbb = IERC20(_rewardsToken).balanceOf(address(this)); // handle the transfer of reward tokens via `transferFrom` to reduce the number // of transactions required and ensure correctness of the reward amount IERC20(_rewardsToken).safeTransferFrom(msg.sender, address(this), _reward); uint rtba = IERC20(_rewardsToken).balanceOf(address(this)); _reward = rtba - rtbb; require(_reward > 0, "Reward amount must be greater than 0!"); if (block.timestamp >= rewardData[_rewardsToken].periodFinish) { rewardData[_rewardsToken].rewardRate = _reward.div(rewardData[_rewardsToken].rewardsDuration); } else { //Griefing Protection Enabled for Unknown reward adders uint _oldRewardRate = rewardData[_rewardsToken].rewardRate; uint256 remaining = rewardData[_rewardsToken].periodFinish.sub(block.timestamp); uint256 leftover = remaining.mul(rewardData[_rewardsToken].rewardRate); rewardData[_rewardsToken].rewardRate = _reward.add(leftover).div(rewardData[_rewardsToken].rewardsDuration); if( msg.sender!=address(voter) || msg.sender!=rewardData[_rewardsToken].rewardsDistributor ) { require( ( rewardData[_rewardsToken].rewardRate >= _oldRewardRate || _reward > leftover ), "Enhanced Griefing Protection Enabled!" ); } } rewardData[_rewardsToken].lastUpdateTime = block.timestamp; rewardData[_rewardsToken].periodFinish = block.timestamp.add(rewardData[_rewardsToken].rewardsDuration); emit RewardAdded(_rewardsToken, msg.sender, _reward); payoutsNotified[_rewardsToken] += _reward; } function claimFees() external nonReentrant returns (uint claimed0, uint claimed1) { return _claimFees(); } function _claimFees() internal returns (uint claimed0, uint claimed1) { /// Equa7izer v1.5: Support Custom pools to be Gaugable if (!isForPair) { /// For non-official/external/independent gauges only /// If compatible, the claimed fees should be notified to Bribe /// Else, this contract will hold the fees & ve.team() can rescue() uint _bn = bribeTokens.length; IERC20[] memory _brews = new IERC20[](_bn); uint[] memory _brewbals = new uint[](_bn); for(uint _n; _n < _bn; _n++) { _brews[_n] = IERC20( bribeTokens[_n] ); /// Record current balance to protect gauge deposits & rewards. /// Also Support feeOnTransfer tokens like ELITE etc. /// Also makes sure a bribe-reward isnt 'killed' or uninitialized. _brewbals[_n] = address(_brews[_n]) == address(0) ? 0 : _brews[_n].balanceOf(address(this)); } try IPair(address(stakingToken)).claimFees() { /// if call succeeds, gauge will have a surplus of extra tokens which can be sent to bribes /// useful in cases of non-equa1izer lps, like conc., weighted or multi-token Liquidity pools for(uint _n = 0; _n < _bn; _n++) { /// Don't trigger bribes for 0x00 rewards uint _a = address(_brews[_n]) == address(0) ? 0 : _brews[_n].balanceOf(address(this)); /// Trigger only when a token balance increases when we try IPair(stake).claimFees() /// because there could possibly be an overlap between rewardTokens & bribeTokens if(_a > _brewbals[_n]) { if (feeTaker == address(0)) { bribe.notifyRewardAmount( address(_brews[_n]), (_a - _brewbals[_n]) ); emit ClaimFees(msg.sender, address(bribe), address(_brews[_n]), (_a - _brewbals[_n]) ); totalFeesPayouts[ address(_brews[_n]) ] += (_a - _brewbals[_n]); } else { _brews[_n].transfer(feeTaker, (_a - _brewbals[_n]) ); emit ClaimFees(msg.sender, feeTaker, address(_brews[_n]), (_a - _brewbals[_n]) ); totalFeesPayouts[ address(_brews[_n]) ] += (_a - _brewbals[_n]); } } /// else: we dont have any fees here ser! } return (0, 0); } catch { /// if call fails, do nothing (much). return (0, 0); } } //else: /// For actual Protocol gauges, created by Voter, for E9ua1izer Factory Pairs (address _token0, address _token1) = IPair(address(stakingToken)).tokens(); /// Support feeOnTransfer tokens like ELITE etc. uint t0bb = IERC20(_token0).balanceOf(address(this)); uint t1bb = IERC20(_token1).balanceOf(address(this)); (claimed0, claimed1) = IPair(address(stakingToken)).claimFees(); uint t0ba = IERC20(_token0).balanceOf(address(this)); uint t1ba = IERC20(_token1).balanceOf(address(this)); claimed0 = t0ba - t0bb; claimed1 = t1ba - t1bb; if (feeTaker == address(0)) { if (claimed0 > 0) { bribe.notifyRewardAmount(_token0, claimed0); totalFeesPayouts[ _token0 ] += claimed0; // stores total token0 fees claimed since genesis emit ClaimFees(msg.sender, feeTaker, _token0, claimed0); } if (claimed1 > 0) { bribe.notifyRewardAmount(_token1, claimed1); totalFeesPayouts[ _token1 ] += claimed1; // stores total token1 fees claimed since genesis emit ClaimFees(msg.sender, feeTaker, _token1, claimed1); } } else { IERC20(_token0).transfer(feeTaker, claimed0); IERC20(_token1).transfer(feeTaker, claimed1); emit ClaimFees(msg.sender, feeTaker, _token0, claimed0); emit ClaimFees(msg.sender, feeTaker, _token1, claimed1); totalFeesPayouts[ _token0 ] += claimed0; // stores total token0 fees claimed since genesis totalFeesPayouts[ _token1 ] += claimed1; // stores total token1 fees claimed since genesis } return (claimed0, claimed1); } /* ========== RESTRICTED FUNCTIONS ========== */ function addReward(address _rewardsToken, address _rewardsDistributor, uint256 _rewardsDuration) public onlyOwner { require( isReward[_rewardsToken] == false && rewardData[_rewardsToken].rewardsDuration == 0 , "Already Initialized!" ); require( _rewardsToken != address(stakingToken), "Cannot reward staking token!"); rewardTokens.push(_rewardsToken); isReward[_rewardsToken] = true; rewardData[_rewardsToken].rewardsDistributor = _rewardsDistributor; rewardData[_rewardsToken].rewardsDuration = _rewardsDuration; } /// This can break claims of rewards! /// Useful during a platform-wide upgrade (optional) function rescue(uint _amt, address _token, address _to) external onlyOwner { if(_token == address(stakingToken)) { /// totalSupply marks the sum of all user deposits. /// surplus checks for any additional holdings that are not user-deposits /// Helps rescue of extra rewards from single-side same-token staking. uint _surplus = (stakingToken.balanceOf(address(this))).sub(_totalSupply); require( _amt <= _surplus, "Rescuing User Deposits Prohibited!"); } IERC20(_token).transfer(_to, _amt); emit Recovered(_token, _amt); } function setRewardsDuration(address _rewardsToken, uint256 _rewardsDuration) external onlyOwner { require( block.timestamp > rewardData[_rewardsToken].periodFinish, "Reward period still active" ); require(_rewardsDuration > 0, "Reward duration must be non-zero"); rewardData[_rewardsToken].rewardsDuration = _rewardsDuration; emit RewardsDurationUpdated(_rewardsToken, rewardData[_rewardsToken].rewardsDuration); } function addBribeToken(address _t) public onlyOwner { require(isBribeToken[_t] == false, "Bribe Token Active!"); require( _t != address(stakingToken), "Cannot bribe staking token!"); IERC20(_t).approve(address(bribe), type(uint256).max); bribeTokens.push(_t); isBribeToken[_t] = true; emit BribeTokenSet(_t, address(bribe), true); } function removeBribeToken(address _t) public onlyOwner { require(isBribeToken[_t] == true, "Bribe Token Inactive!"); IERC20(_t).approve(address(bribe), 0); uint _bl = bribeTokens.length; if(bribeTokens[_bl-1]==_t) { bribeTokens.pop(); isBribeToken[_t] = false; } else { for(uint i; i < bribeTokens.length - 1; i++) { if(bribeTokens[i]==_t) { bribeTokens[i] = bribeTokens[_bl-1]; bribeTokens.pop(); isBribeToken[_t] = false; } } } emit BribeTokenSet(_t, address(bribe), false); } function addBribeTokens(address[] memory _tks) external onlyOwner { for(uint _j; _j < _tks.length; _j++) { addBribeToken(_tks[_j]); } } function removeBribeTokens(address[] memory _tks) external onlyOwner { for(uint _j; _j < _tks.length; _j++) { removeBribeToken(_tks[_j]); } } /// When feeTaker is set, all Fees Claims go to it instead of going to the Bribe. /// Useful during a platform-wide upgrade (optional) function setFeeTaker(address _ft) external onlyOwner { feeTaker = _ft; } function setPaused(bool _b) external onlyOwner { paused = _b; } /* ========== MODIFIERS ========== */ modifier updateReward(address account) { for (uint i; i < rewardTokens.length; i++) { address token = rewardTokens[i]; rewardData[token].rewardPerTokenStored = rewardPerToken(token); rewardData[token].lastUpdateTime = lastTimeRewardApplicable(token); if (account != address(0)) { rewards[account][token] = earnedBy(account, token); userRewardPerTokenPaid[account][token] = rewardData[token].rewardPerTokenStored; } } _; } modifier onlyOwner { require(msg.sender==ve.team(), "Only ve.team!"); _; } modifier notPaused { require(!paused, "Paused!"); _; } /* ========== EVENTS ========== */ event RewardAdded(address indexed token, address indexed notifier, uint256 reward); event Deposit(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event ClaimRewards(address indexed token, address indexed user, uint256 reward); event RewardsDurationUpdated(address indexed token, uint256 newDuration); event Recovered(address indexed token, uint256 amount); event BribeTokenSet(address indexed token, address indexed bribe, bool indexed active); event ClaimFees(address indexed initiator, address indexed bribe, address indexed token, uint amount); } // File: contracts/factories/GaugeFactory.sol contract GaugeFactory is IGaugeFactory { address public lastGauge; event GaugeCreated(address indexed maker, address indexed pool, address g, address b, address v, bool i, address[] a); function createGauge( address _pool, address _bribe, address _ve, bool isPair, address[] memory _allowedRewards ) external returns (address) { GaugeEquivalent gauge = new GaugeEquivalent( _pool, _bribe, _ve, msg.sender, isPair, _allowedRewards ); lastGauge = address(gauge); emit GaugeCreated(msg.sender, _pool, address(gauge), _bribe, _ve, isPair, _allowedRewards); return lastGauge; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_stake","type":"address"},{"internalType":"address","name":"_ebribe","type":"address"},{"internalType":"address","name":"__ve","type":"address"},{"internalType":"address","name":"_voter","type":"address"},{"internalType":"bool","name":"_forPair","type":"bool"},{"internalType":"address[]","name":"_allowedRewardTokens","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"bribe","type":"address"},{"indexed":true,"internalType":"bool","name":"active","type":"bool"}],"name":"BribeTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"bribe","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"notifier","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"_t","type":"address"}],"name":"addBribeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tks","type":"address[]"}],"name":"addBribeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsDistributor","type":"address"},{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bribe","outputs":[{"internalType":"contract IBribe","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bribeTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bribesListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimFees","outputs":[{"internalType":"uint256","name":"claimed0","type":"uint256"},{"internalType":"uint256","name":"claimed1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"depositAllFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"earnedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"earnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBribeToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isForPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"left","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"uint256","name":"_reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"payouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"payoutsNotified","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_t","type":"address"}],"name":"removeBribeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tks","type":"address[]"}],"name":"removeBribeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amt","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardData","outputs":[{"internalType":"address","name":"rewardsDistributor","type":"address"},{"internalType":"uint256","name":"rewardsDuration","type":"uint256"},{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ft","type":"address"}],"name":"setFeeTaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_b","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsDistributor","type":"address"}],"name":"setRewardsDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalFeesPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ve","outputs":[{"internalType":"contract IVotingEscrow","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"contract IVoter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004d3e38038062004d3e833981016040819052620000349162000527565b600160008181558154610100600160a81b0319166101006001600160a01b038a81169190910291909117909255600b80546001600160a01b031990811689851617909155600c8054909116878416179055600d80549286166001600160a81b031990931692909217600160a01b85151502179091555b8151811015620002655760006001600160a01b0316828281518110620000d457620000d462000658565b60200260200101516001600160a01b031614620002505760016007600084848151811062000106576200010662000658565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555060038282815181106200015c576200015c62000658565b6020908102919091018101518254600181018455600093845291832090910180546001600160a01b0319166001600160a01b0390921691909117905582518591600291859085908110620001b457620001b462000658565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555062093a806002600084848151811062000220576200022062000658565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600101819055505b806200025c816200066e565b915050620000aa565b508115620004d757600080876001600160a01b0316639d63848a6040518163ffffffff1660e01b81526004016040805180830381600087803b158015620002ab57600080fd5b505af1158015620002c0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e6919062000698565b60405163095ea7b360e01b81526001600160a01b038a8116600483015260001960248301529294509092509083169063095ea7b390604401602060405180830381600087803b1580156200033957600080fd5b505af11580156200034e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003749190620006d0565b5060405163095ea7b360e01b81526001600160a01b038881166004830152600019602483015282169063095ea7b390604401602060405180830381600087803b158015620003c157600080fd5b505af1158015620003d6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003fc9190620006d0565b5060048054600181810183557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b91820180546001600160a01b038088166001600160a01b031992831681179093558554808501909655949093018054868616941684179055600081815260086020526040808220805460ff19908116861790915594825280822080549095168417909455925191938b1692909160008051602062004d1e8339815191529190a46040516001906001600160a01b03808a16919084169060008051602062004d1e83398151915290600090a450505b505050505050620006f5565b80516001600160a01b0381168114620004fb57600080fd5b919050565b80518015158114620004fb57600080fd5b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c087890312156200054157600080fd5b6200054c87620004e3565b955060206200055d818901620004e3565b95506200056d60408901620004e3565b94506200057d60608901620004e3565b93506200058d6080890162000500565b60a08901519093506001600160401b0380821115620005ab57600080fd5b818a0191508a601f830112620005c057600080fd5b815181811115620005d557620005d562000511565b8060051b604051601f19603f83011681018181108582111715620005fd57620005fd62000511565b60405291825284820192508381018501918d8311156200061c57600080fd5b938501935b8285101562000645576200063585620004e3565b8452938501939285019262000621565b8096505050505050509295509295509295565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200069157634e487b7160e01b600052601160045260246000fd5b5060010190565b60008060408385031215620006ac57600080fd5b620006b783620004e3565b9150620006c760208401620004e3565b90509250929050565b600060208284031215620006e357600080fd5b620006ee8262000500565b9392505050565b61461980620007056000396000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c80635c975abb11610182578063b66503cf116100e9578063de5f6268116100a2578063e70b9e271161007c578063e70b9e271461071c578063e9fad8ee14610747578063f12297771461074f578063f5ae22401461076257600080fd5b8063de5f6268146106f8578063e574821314610700578063e68863961461071457600080fd5b8063b66503cf1461066c578063b6b55f251461067f578063bcd1101414610692578063d0ed26ae146106a5578063d294f093146106b8578063dd501205146106d557600080fd5b8063749f10441161013b578063749f1044146106105780637bb7bed114610623578063853828b6146106365780638a5011001461063e5780638f27f1041461065157806399bcc0521461065957600080fd5b80635c975abb14610564578063638634ee1461057157806365bcfbe7146105845780637035ab98146105a457806370a08231146105cf57806372f702f3146105f857600080fd5b80633010d8ef1161022657806348e5d9f8116101df57806348e5d9f81461045f5780634d5ce038146104e55780634ec5908d1461051857806352f184051461052b5780635557cc611461053e5780635a6e6eab1461055157600080fd5b80633010d8ef146103f857806331279d3d1461040b57806337d0208c1461041e5780633d18b912146104315780633f695b451461043957806346c96aac1461044c57600080fd5b80631f850716116102785780631f85071614610356578063211dc32d146103815780632378bea6146103945780632af2cecc146103a75780632e1a7d4d146103d25780632f4f21e2146103e557600080fd5b8063023df767146102c05780630efeb2fb146102d5578063102a7ad41461030857806315ae92f71461031b57806316c38b3c1461033b57806318160ddd1461034e575b600080fd5b6102d36102ce366004614118565b610775565b005b6102f56102e3366004614118565b60106020526000908152604090205481565b6040519081526020015b60405180910390f35b6102f5610316366004614135565b610a14565b6102f5610329366004614118565b60126020526000908152604090205481565b6102d361034936600461417c565b610aaf565b6009546102f5565b600c54610369906001600160a01b031681565b6040516001600160a01b0390911681526020016102ff565b6102f561038f366004614135565b610b7a565b6102d36103a2366004614199565b610b86565b6102f56103b5366004614135565b601160209081526000928352604080842090915290825290205481565b6102d36103e03660046141c5565b610d55565b6102d36103f3366004614199565b610f6e565b6102d3610406366004614118565b6111da565b6102d3610419366004614296565b611262565b600b54610369906001600160a01b031681565b6102d361132d565b6102d3610447366004614135565b6115b5565b600d54610369906001600160a01b031681565b6104ae61046d366004614118565b60026020819052600091825260409091208054600182015492820154600383015460048401546005909401546001600160a01b039093169493919290919086565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c0016102ff565b6105086104f3366004614118565b60076020526000908152604090205460ff1681565b60405190151581526020016102ff565b6102d3610526366004614118565b61169b565b6102d36105393660046142e6565b611775565b6102d361054c366004614118565b61186d565b6102d361055f3660046142e6565b611c22565b6001546105089060ff1681565b6102f561057f366004614118565b611d1a565b6102f5610592366004614118565b600f6020526000908152604090205481565b6102f56105b2366004614135565b600560209081526000928352604080842090915290825290205481565b6102f56105dd366004614118565b6001600160a01b03166000908152600a602052604090205490565b6001546103699061010090046001600160a01b031681565b600e54610369906001600160a01b031681565b6103696106313660046141c5565b611d41565b6102d3611d6b565b6102d361064c36600461431b565b611d86565b6004546102f5565b6102f5610667366004614118565b61200c565b6102d361067a366004614199565b61208d565b6102d361068d3660046141c5565b612690565b6102f56106a0366004614118565b6128af565b6102d36106b336600461435d565b6128db565b6106c0612afd565b604080519283526020830191909152016102ff565b6105086106e3366004614118565b60086020526000908152604090205460ff1681565b6102d3612b4c565b600d5461050890600160a01b900460ff1681565b6003546102f5565b6102f561072a366004614135565b600660209081526000928352604080842090915290825290205481565b6102d3612bce565b6102f561075d366004614118565b612bef565b6103696107703660046141c5565b612c91565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156107c557600080fd5b505af11580156107d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fd919061439e565b6001600160a01b0316336001600160a01b0316146108365760405162461bcd60e51b815260040161082d906143bb565b60405180910390fd5b6001600160a01b03811660009081526008602052604090205460ff16156108955760405162461bcd60e51b8152602060048201526013602482015272427269626520546f6b656e204163746976652160681b604482015260640161082d565b6001546001600160a01b038281166101009092041614156108f85760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f74206272696265207374616b696e6720746f6b656e210000000000604482015260640161082d565b600b5460405163095ea7b360e01b81526001600160a01b038381169263095ea7b39261092e9290911690600019906004016143e2565b602060405180830381600087803b15801561094857600080fd5b505af115801561095c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098091906143fb565b506004805460018082019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b03848116918217909255600081815260086020526040808220805460ff191686179055600b5490519316927f6f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d059190a450565b6001600160a01b038083166000818152600660209081526040808320948616808452948252808320549383526005825280832094835293905291822054610aa69190610aa090670de0b6b3a764000090610a9a90610a7b90610a7589612bef565b90612ca1565b6001600160a01b0389166000908152600a602052604090205490612d07565b90612d86565b90612de3565b90505b92915050565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610aff57600080fd5b505af1158015610b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b37919061439e565b6001600160a01b0316336001600160a01b031614610b675760405162461bcd60e51b815260040161082d906143bb565b6001805460ff1916911515919091179055565b6000610aa68284610a14565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610bd657600080fd5b505af1158015610bea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0e919061439e565b6001600160a01b0316336001600160a01b031614610c3e5760405162461bcd60e51b815260040161082d906143bb565b6001600160a01b038216600090815260026020819052604090912001544211610ca95760405162461bcd60e51b815260206004820152601a60248201527f52657761726420706572696f64207374696c6c20616374697665000000000000604482015260640161082d565b60008111610cf95760405162461bcd60e51b815260206004820181905260248201527f526577617264206475726174696f6e206d757374206265206e6f6e2d7a65726f604482015260640161082d565b6001600160a01b03821660008181526002602052604090819020600101839055517fad2f86b01ed93b4b3a150d448c61a4f5d8d38075d3c0c64cc0a26fd6e1f4954590610d499084815260200190565b60405180910390a25050565b6001600080828254610d67919061442e565b9091555050600080549033905b600354811015610e6957600060038281548110610d9357610d93614446565b6000918252602090912001546001600160a01b03169050610db381612bef565b6001600160a01b038216600090815260026020526040902060050155610dd881611d1a565b6001600160a01b03808316600090815260026020526040902060040191909155831615610e5657610e098382610a14565b6001600160a01b0380851660008181526006602090815260408083209487168084529482528083209590955560028152848220600590810154938352815284822093825292909252919020555b5080610e618161445c565b915050610d74565b5060008311610eae5760405162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015260640161082d565b600954610ebb9084612ca1565b600955336000908152600a6020526040902054610ed89084612ca1565b336000818152600a6020526040902091909155600154610f08916101009091046001600160a01b03169085612e42565b60405183815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5906020015b60405180910390a2610f46612e98565b5050506000548114610f6a5760405162461bcd60e51b815260040161082d90614477565b5050565b6001600080828254610f80919061442e565b909155505060005460015460ff1615610fc55760405162461bcd60e51b81526020600482015260076024820152665061757365642160c81b604482015260640161082d565b8260005b6003548110156110be57600060038281548110610fe857610fe8614446565b6000918252602090912001546001600160a01b0316905061100881612bef565b6001600160a01b03821660009081526002602052604090206005015561102d81611d1a565b6001600160a01b038083166000908152600260205260409020600401919091558316156110ab5761105e8382610a14565b6001600160a01b0380851660008181526006602090815260408083209487168084529482528083209590955560028152848220600590810154938352815284822093825292909252919020555b50806110b68161445c565b915050610fc9565b50600083116111005760405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015260640161082d565b60095461110d9084612de3565b6009556001600160a01b0384166000908152600a60205260409020546111339084612de3565b6001600160a01b038086166000908152600a60205260409020919091556001546111669161010090910416333086613ca6565b836001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c846040516111a191815260200190565b60405180910390a26111b1612e98565b50505060005481146111d55760405162461bcd60e51b815260040161082d90614477565b505050565b6001546040516370a0823160e01b815233600482015261125f9183916101009091046001600160a01b0316906370a082319060240160206040518083038186803b15801561122757600080fd5b505afa15801561123b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f391906144ae565b50565b336001600160a01b03831614806112835750600d546001600160a01b031633145b6112c65760405162461bcd60e51b8152602060048201526014602482015273556e2d617574686f72697a656420636c61696d2160601b604482015260640161082d565b600d546040516363453ae160e01b81523060048201526001600160a01b03909116906363453ae190602401600060405180830381600087803b15801561130b57600080fd5b505af115801561131f573d6000803e3d6000fd5b50505050610f6a8282613ce4565b600160008082825461133f919061442e565b9091555050600080549033905b6003548110156114415760006003828154811061136b5761136b614446565b6000918252602090912001546001600160a01b0316905061138b81612bef565b6001600160a01b0382166000908152600260205260409020600501556113b081611d1a565b6001600160a01b0380831660009081526002602052604090206004019190915583161561142e576113e18382610a14565b6001600160a01b0380851660008181526006602090815260408083209487168084529482528083209590955560028152848220600590810154938352815284822093825292909252919020555b50806114398161445c565b91505061134c565b5060005b6003548110156115885760006003828154811061146457611464614446565b60009182526020808320909101543383526006825260408084206001600160a01b03909216808552919092529120549091508015611573573360008181526006602090815260408083206001600160a01b03871680855292528220919091556114cd9183612e42565b6040518181526001600160a01b0383169033907f9aa05b3d70a9e3e2f004f039648839560576334fb45c81f91b6db03ad9e2efc99060200160405180910390a36001600160a01b0382166000908152600f60205260408120805483929061153590849061442e565b90915550503360009081526011602090815260408083206001600160a01b03861684529091528120805483929061156d90849061442e565b90915550505b505080806115809061445c565b915050611445565b50611591612e98565b505050600054811461125f5760405162461bcd60e51b815260040161082d90614477565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561160557600080fd5b505af1158015611619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163d919061439e565b6001600160a01b0316336001600160a01b03161461166d5760405162461bcd60e51b815260040161082d906143bb565b6001600160a01b03918216600090815260026020526040902080546001600160a01b03191691909216179055565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156116eb57600080fd5b505af11580156116ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611723919061439e565b6001600160a01b0316336001600160a01b0316146117535760405162461bcd60e51b815260040161082d906143bb565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156117c557600080fd5b505af11580156117d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fd919061439e565b6001600160a01b0316336001600160a01b03161461182d5760405162461bcd60e51b815260040161082d906143bb565b60005b8151811015610f6a5761185b82828151811061184e5761184e614446565b6020026020010151610775565b806118658161445c565b915050611830565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156118bd57600080fd5b505af11580156118d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f5919061439e565b6001600160a01b0316336001600160a01b0316146119255760405162461bcd60e51b815260040161082d906143bb565b6001600160a01b03811660009081526008602052604090205460ff16151560011461198a5760405162461bcd60e51b8152602060048201526015602482015274427269626520546f6b656e20496e6163746976652160581b604482015260640161082d565b600b5460405163095ea7b360e01b81526001600160a01b038381169263095ea7b3926119bf92909116906000906004016143e2565b602060405180830381600087803b1580156119d957600080fd5b505af11580156119ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1191906143fb565b5060048054906001600160a01b03831690611a2d6001846144c7565b81548110611a3d57611a3d614446565b6000918252602090912001546001600160a01b03161415611ab0576004805480611a6957611a696144de565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841682526008905260409020805460ff19169055611be0565b60005b600454611ac2906001906144c7565b811015611bde57826001600160a01b031660048281548110611ae657611ae6614446565b6000918252602090912001546001600160a01b03161415611bcc576004611b0e6001846144c7565b81548110611b1e57611b1e614446565b600091825260209091200154600480546001600160a01b039092169183908110611b4a57611b4a614446565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506004805480611b8957611b896144de565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03851682526008905260409020805460ff191690555b80611bd68161445c565b915050611ab3565b505b600b546040516000916001600160a01b0390811691908516907f6f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d05908490a45050565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611c7257600080fd5b505af1158015611c86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611caa919061439e565b6001600160a01b0316336001600160a01b031614611cda5760405162461bcd60e51b815260040161082d906143bb565b60005b8151811015610f6a57611d08828281518110611cfb57611cfb614446565b602002602001015161186d565b80611d128161445c565b915050611cdd565b6001600160a01b038116600090815260026020819052604082200154610aa9904290613f5d565b60038181548110611d5157600080fd5b6000918252602090912001546001600160a01b0316905081565b336000908152600a6020526040902054611d8490610d55565b565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611dd657600080fd5b505af1158015611dea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0e919061439e565b6001600160a01b0316336001600160a01b031614611e3e5760405162461bcd60e51b815260040161082d906143bb565b6001546001600160a01b03838116610100909204161415611f43576009546001546040516370a0823160e01b8152306004820152600092611ee49290916101009091046001600160a01b0316906370a082319060240160206040518083038186803b158015611eac57600080fd5b505afa158015611ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7591906144ae565b905080841115611f415760405162461bcd60e51b815260206004820152602260248201527f5265736375696e672055736572204465706f736974732050726f686962697465604482015261642160f01b606482015260840161082d565b505b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb90611f7190849087906004016143e2565b602060405180830381600087803b158015611f8b57600080fd5b505af1158015611f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc391906143fb565b50816001600160a01b03167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2884604051611fff91815260200190565b60405180910390a2505050565b6001600160a01b038116600090815260026020819052604082200154421061203657506000919050565b6001600160a01b03821660009081526002602081905260408220015461205c9042612ca1565b6001600160a01b038416600090815260026020526040902060030154909150612086908290612d07565b9392505050565b600160008082825461209f919061442e565b90915550506000805490805b6003548110156121a0576000600382815481106120ca576120ca614446565b6000918252602090912001546001600160a01b031690506120ea81612bef565b6001600160a01b03821660009081526002602052604090206005015561210f81611d1a565b6001600160a01b0380831660009081526002602052604090206004019190915583161561218d576121408382610a14565b6001600160a01b0380851660008181526006602090815260408083209487168084529482528083209590955560028152848220600590810154938352815284822093825292909252919020555b50806121988161445c565b9150506120ab565b506001546001600160a01b038581166101009092041614156122155760405162461bcd60e51b815260206004820152602860248201527f43616e27742064697374726962757465207374616b656420746f6b656e206173604482015267207265776172642160c01b606482015260840161082d565b6001600160a01b03841660009081526007602052604090205460ff1661226e5760405162461bcd60e51b815260206004820152600e60248201526d4e6f74206120726577617264212160901b604482015260640161082d565b612276612e98565b50506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a082319060240160206040518083038186803b1580156122ba57600080fd5b505afa1580156122ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f291906144ae565b90506123096001600160a01b038616333087613ca6565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b15801561234b57600080fd5b505afa15801561235f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238391906144ae565b905061238f82826144c7565b9450600085116123ef5760405162461bcd60e51b815260206004820152602560248201527f52657761726420616d6f756e74206d7573742062652067726561746572207468604482015264616e20302160d81b606482015260840161082d565b6001600160a01b03861660009081526002602081905260409091200154421061245a576001600160a01b038616600090815260026020526040902060010154612439908690612d86565b6001600160a01b0387166000908152600260205260409020600301556125b9565b6001600160a01b0386166000908152600260208190526040822060038101549101549091906124899042612ca1565b6001600160a01b038916600090815260026020526040812060030154919250906124b4908390612d07565b6001600160a01b038a166000908152600260205260409020600101549091506124e190610a9a8a84612de3565b6001600160a01b038a8116600090815260026020526040902060030191909155600d54163314158061252d57506001600160a01b03898116600090815260026020526040902054163314155b156125b5576001600160a01b0389166000908152600260205260409020600301548311158061255b57508088115b6125b55760405162461bcd60e51b815260206004820152602560248201527f456e68616e636564204772696566696e672050726f74656374696f6e20456e61604482015264626c65642160d81b606482015260840161082d565b5050505b6001600160a01b038616600090815260026020526040902042600482018190556001909101546125e99190612de3565b6001600160a01b038716600081815260026020818152604092839020909101939093555187815233927f0f7cde3c0518e1cc590491be5861d70a2e333f7e65af2e1ebd91a3c9a3cc638d910160405180910390a36001600160a01b0386166000908152601060205260408120805487929061266590849061442e565b9250508190555050505060005481146111d55760405162461bcd60e51b815260040161082d90614477565b60016000808282546126a2919061442e565b909155505060005460015460ff16156126e75760405162461bcd60e51b81526020600482015260076024820152665061757365642160c81b604482015260640161082d565b3360005b6003548110156127e05760006003828154811061270a5761270a614446565b6000918252602090912001546001600160a01b0316905061272a81612bef565b6001600160a01b03821660009081526002602052604090206005015561274f81611d1a565b6001600160a01b038083166000908152600260205260409020600401919091558316156127cd576127808382610a14565b6001600160a01b0380851660008181526006602090815260408083209487168084529482528083209590955560028152848220600590810154938352815284822093825292909252919020555b50806127d88161445c565b9150506126eb565b50600083116128225760405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015260640161082d565b60095461282f9084612de3565b600955336000908152600a602052604090205461284c9084612de3565b336000818152600a602052604090209190915560015461287d916101009091046001600160a01b0316903086613ca6565b60405183815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610f36565b6001600160a01b03811660009081526002602052604081206001810154600390910154610aa991612d07565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561292b57600080fd5b505af115801561293f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612963919061439e565b6001600160a01b0316336001600160a01b0316146129935760405162461bcd60e51b815260040161082d906143bb565b6001600160a01b03831660009081526007602052604090205460ff161580156129d557506001600160a01b038316600090815260026020526040902060010154155b612a185760405162461bcd60e51b8152602060048201526014602482015273416c726561647920496e697469616c697a65642160601b604482015260640161082d565b6001546001600160a01b03848116610100909204161415612a7b5760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f7420726577617264207374616b696e6720746f6b656e2100000000604482015260640161082d565b6003805460018181019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b039586166001600160a01b031991821681179092556000918252600760209081526040808420805460ff19168617905560029091529091208054949095169316929092178355910155565b6000806001600080828254612b12919061442e565b9091555050600054612b22612e98565b925092506000548114612b475760405162461bcd60e51b815260040161082d90614477565b509091565b6001546040516370a0823160e01b8152336004820152611d849161010090046001600160a01b0316906370a082319060240160206040518083038186803b158015612b9657600080fd5b505afa158015612baa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068d91906144ae565b336000908152600a6020526040902054612be790610d55565b611d8461132d565b600060095460001415612c1b57506001600160a01b031660009081526002602052604090206005015490565b6009546001600160a01b03831660009081526002602052604090206003810154600490910154610aa992612c6f929091610a9a91670de0b6b3a764000091612c6991908290610a758b611d1a565b90612d07565b6001600160a01b03841660009081526002602052604090206005015490612de3565b60048181548110611d5157600080fd5b600082821115612cf35760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015260640161082d565b6000612cff83856144c7565b949350505050565b600082612d1657506000610aa9565b6000612d2283856144f4565b905082612d2f8583614513565b14610aa65760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161082d565b6000808211612dd75760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015260640161082d565b6000612cff8385614513565b600080612df0838561442e565b905083811015610aa65760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161082d565b6111d58363a9059cbb60e01b8484604051602401612e619291906143e2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613f73565b600d546000908190600160a01b900460ff166135fc5760045460008167ffffffffffffffff811115612ecc57612ecc6141de565b604051908082528060200260200182016040528015612ef5578160200160208202803683370190505b50905060008267ffffffffffffffff811115612f1357612f136141de565b604051908082528060200260200182016040528015612f3c578160200160208202803683370190505b50905060005b838110156130ac5760048181548110612f5d57612f5d614446565b9060005260206000200160009054906101000a90046001600160a01b0316838281518110612f8d57612f8d614446565b60200260200101906001600160a01b031690816001600160a01b03168152505060006001600160a01b0316838281518110612fca57612fca614446565b60200260200101516001600160a01b03161461307a57828181518110612ff257612ff2614446565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561303d57600080fd5b505afa158015613051573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307591906144ae565b61307d565b60005b82828151811061308f5761308f614446565b6020908102919091010152806130a48161445c565b915050612f42565b5060018054906101000a90046001600160a01b03166001600160a01b031663d294f0936040518163ffffffff1660e01b81526004016040805180830381600087803b1580156130fa57600080fd5b505af192505050801561312a575060408051601f3d908101601f1916820190925261312791810190614535565b60015b61313b575060009485945092505050565b505060005b838110156135ee576000806001600160a01b031684838151811061316657613166614446565b60200260200101516001600160a01b0316146132165783828151811061318e5761318e614446565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156131d957600080fd5b505afa1580156131ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061321191906144ae565b613219565b60005b905082828151811061322d5761322d614446565b60200260200101518111156135db57600e546001600160a01b03166133ff57600b5484516001600160a01b039091169063b66503cf9086908590811061327557613275614446565b602002602001015185858151811061328f5761328f614446565b6020026020010151846132a291906144c7565b6040518363ffffffff1660e01b81526004016132bf9291906143e2565b600060405180830381600087803b1580156132d957600080fd5b505af11580156132ed573d6000803e3d6000fd5b5050505083828151811061330357613303614446565b60200260200101516001600160a01b0316600b60009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b03166000805160206145c483398151915286868151811061335e5761335e614446565b60200260200101518561337191906144c7565b60405190815260200160405180910390a482828151811061339457613394614446565b6020026020010151816133a791906144c7565b601260008685815181106133bd576133bd614446565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546133f4919061442e565b909155506135db9050565b83828151811061341157613411614446565b60200260200101516001600160a01b031663a9059cbb600e60009054906101000a90046001600160a01b031685858151811061344f5761344f614446565b60200260200101518461346291906144c7565b6040518363ffffffff1660e01b815260040161347f9291906143e2565b602060405180830381600087803b15801561349957600080fd5b505af11580156134ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d191906143fb565b508382815181106134e4576134e4614446565b60200260200101516001600160a01b0316600e60009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b03166000805160206145c483398151915286868151811061353f5761353f614446565b60200260200101518561355291906144c7565b60405190815260200160405180910390a482828151811061357557613575614446565b60200260200101518161358891906144c7565b6012600086858151811061359e5761359e614446565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546135d5919061442e565b90915550505b50806135e68161445c565b915050613140565b506000958695509350505050565b60008060018054906101000a90046001600160a01b03166001600160a01b0316639d63848a6040518163ffffffff1660e01b81526004016040805180830381600087803b15801561364c57600080fd5b505af1158015613660573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136849190614559565b6040516370a0823160e01b815230600482015291935091506000906001600160a01b038416906370a082319060240160206040518083038186803b1580156136cb57600080fd5b505afa1580156136df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370391906144ae565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b15801561374857600080fd5b505afa15801561375c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061378091906144ae565b905060018054906101000a90046001600160a01b03166001600160a01b031663d294f0936040518163ffffffff1660e01b81526004016040805180830381600087803b1580156137cf57600080fd5b505af11580156137e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138079190614535565b6040516370a0823160e01b815230600482015291975095506000906001600160a01b038616906370a082319060240160206040518083038186803b15801561384e57600080fd5b505afa158015613862573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388691906144ae565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038616906370a082319060240160206040518083038186803b1580156138cb57600080fd5b505afa1580156138df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061390391906144ae565b905061390f84836144c7565b975061391b83826144c7565b600e549097506001600160a01b0316613acb5787156139fa57600b5460405163b66503cf60e01b81526001600160a01b039091169063b66503cf906139669089908c906004016143e2565b600060405180830381600087803b15801561398057600080fd5b505af1158015613994573d6000803e3d6000fd5b505050506001600160a01b038616600090815260126020526040812080548a92906139c090849061442e565b9091555050600e546040518981526001600160a01b0388811692169033906000805160206145c48339815191529060200160405180910390a45b8615613ac657600b5460405163b66503cf60e01b81526001600160a01b039091169063b66503cf90613a329088908b906004016143e2565b600060405180830381600087803b158015613a4c57600080fd5b505af1158015613a60573d6000803e3d6000fd5b505050506001600160a01b03851660009081526012602052604081208054899290613a8c90849061442e565b9091555050600e546040518881526001600160a01b0387811692169033906000805160206145c48339815191529060200160405180910390a45b613c9c565b600e5460405163a9059cbb60e01b81526001600160a01b038881169263a9059cbb92613aff92909116908c906004016143e2565b602060405180830381600087803b158015613b1957600080fd5b505af1158015613b2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b5191906143fb565b50600e5460405163a9059cbb60e01b81526001600160a01b038781169263a9059cbb92613b8692909116908b906004016143e2565b602060405180830381600087803b158015613ba057600080fd5b505af1158015613bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bd891906143fb565b50600e546040518981526001600160a01b0388811692169033906000805160206145c48339815191529060200160405180910390a4600e546040518881526001600160a01b0387811692169033906000805160206145c48339815191529060200160405180910390a46001600160a01b038616600090815260126020526040812080548a9290613c6990849061442e565b90915550506001600160a01b03851660009081526012602052604081208054899290613c9690849061442e565b90915550505b5050505050509091565b6040516001600160a01b0380851660248301528316604482015260648101829052613cde9085906323b872dd60e01b90608401612e61565b50505050565b6001600080828254613cf6919061442e565b9091555050600080549083905b600354811015613df857600060038281548110613d2257613d22614446565b6000918252602090912001546001600160a01b03169050613d4281612bef565b6001600160a01b038216600090815260026020526040902060050155613d6781611d1a565b6001600160a01b03808316600090815260026020526040902060040191909155831615613de557613d988382610a14565b6001600160a01b0380851660008181526006602090815260408083209487168084529482528083209590955560028152848220600590810154938352815284822093825292909252919020555b5080613df08161445c565b915050613d03565b5060005b8351811015613f54576000848281518110613e1957613e19614446565b6020908102919091018101516001600160a01b038089166000908152600684526040808220928416825291909352909120549091508015613f3f576001600160a01b03808816600090815260066020908152604080832093861680845293909152812055613e88908883612e42565b866001600160a01b0316826001600160a01b03167f9aa05b3d70a9e3e2f004f039648839560576334fb45c81f91b6db03ad9e2efc983604051613ecd91815260200190565b60405180910390a36001600160a01b0382166000908152600f602052604081208054839290613efd90849061442e565b90915550506001600160a01b03808816600090815260116020908152604080832093861683529290529081208054839290613f3990849061442e565b90915550505b50508080613f4c9061445c565b915050613dfc565b506111b1612e98565b6000818310613f6c5781610aa6565b5090919050565b6001600160a01b0382163b613fca5760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015260640161082d565b600080836001600160a01b031683604051613fe59190614588565b6000604051808303816000865af19150503d8060008114614022576040519150601f19603f3d011682016040523d82523d6000602084013e614027565b606091505b5091509150816140795760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015260640161082d565b805115613cde578080602001905181019061409491906143fb565b613cde5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161082d565b6001600160a01b038116811461125f57600080fd5b8035614113816140f3565b919050565b60006020828403121561412a57600080fd5b8135610aa6816140f3565b6000806040838503121561414857600080fd5b8235614153816140f3565b91506020830135614163816140f3565b809150509250929050565b801515811461125f57600080fd5b60006020828403121561418e57600080fd5b8135610aa68161416e565b600080604083850312156141ac57600080fd5b82356141b7816140f3565b946020939093013593505050565b6000602082840312156141d757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261420557600080fd5b8135602067ffffffffffffffff80831115614222576142226141de565b8260051b604051601f19603f83011681018181108482111715614247576142476141de565b60405293845285810183019383810192508785111561426557600080fd5b83870191505b8482101561428b5761427c82614108565b8352918301919083019061426b565b979650505050505050565b600080604083850312156142a957600080fd5b82356142b4816140f3565b9150602083013567ffffffffffffffff8111156142d057600080fd5b6142dc858286016141f4565b9150509250929050565b6000602082840312156142f857600080fd5b813567ffffffffffffffff81111561430f57600080fd5b612cff848285016141f4565b60008060006060848603121561433057600080fd5b833592506020840135614342816140f3565b91506040840135614352816140f3565b809150509250925092565b60008060006060848603121561437257600080fd5b833561437d816140f3565b9250602084013561438d816140f3565b929592945050506040919091013590565b6000602082840312156143b057600080fd5b8151610aa6816140f3565b6020808252600d908201526c4f6e6c792076652e7465616d2160981b604082015260600190565b6001600160a01b03929092168252602082015260400190565b60006020828403121561440d57600080fd5b8151610aa68161416e565b634e487b7160e01b600052601160045260246000fd5b6000821982111561444157614441614418565b500190565b634e487b7160e01b600052603260045260246000fd5b600060001982141561447057614470614418565b5060010190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000602082840312156144c057600080fd5b5051919050565b6000828210156144d9576144d9614418565b500390565b634e487b7160e01b600052603160045260246000fd5b600081600019048311821515161561450e5761450e614418565b500290565b60008261453057634e487b7160e01b600052601260045260246000fd5b500490565b6000806040838503121561454857600080fd5b505080516020909101519092909150565b6000806040838503121561456c57600080fd5b8251614577816140f3565b6020840151909250614163816140f3565b6000825160005b818110156145a9576020818601810151858301520161458f565b818111156145b8576000828501525b50919091019291505056feee447878094bcc87bd81b55e4831b5e9e3d095866fce10f4f7e4caa64ea7a558a2646970667358221220c364d76e504becae19e540512d87a614a74ddb23318737b92db9271b2173922764736f6c634300080900336f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d050000000000000000000000007547d05dff1da6b4a2ebb3f0833afe3c62abd9a100000000000000000000000072f43032d92bbac4290ca5b7fa3ce8b46431abf20000000000000000000000008313f3551c4d3984ffbadfb42f780d0c8763ce94000000000000000000000000cb0205fb74f1854b8e227fc19b9f5663edf78ed1000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a6
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007547d05dff1da6b4a2ebb3f0833afe3c62abd9a100000000000000000000000072f43032d92bbac4290ca5b7fa3ce8b46431abf20000000000000000000000008313f3551c4d3984ffbadfb42f780d0c8763ce94000000000000000000000000cb0205fb74f1854b8e227fc19b9f5663edf78ed1000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a6
-----Decoded View---------------
Arg [0] : _stake (address): 0x7547d05dff1da6b4a2ebb3f0833afe3c62abd9a1
Arg [1] : _ebribe (address): 0x72f43032d92bbac4290ca5b7fa3ce8b46431abf2
Arg [2] : __ve (address): 0x8313f3551c4d3984ffbadfb42f780d0c8763ce94
Arg [3] : _voter (address): 0xcb0205fb74f1854b8e227fc19b9f5663edf78ed1
Arg [4] : _forPair (bool): True
Arg [5] : _allowedRewardTokens (address[]): 0x3fd3a0c85b70754efc07ac9ac0cbbdce664865a6
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000007547d05dff1da6b4a2ebb3f0833afe3c62abd9a1
Arg [1] : 00000000000000000000000072f43032d92bbac4290ca5b7fa3ce8b46431abf2
Arg [2] : 0000000000000000000000008313f3551c4d3984ffbadfb42f780d0c8763ce94
Arg [3] : 000000000000000000000000cb0205fb74f1854b8e227fc19b9f5663edf78ed1
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 0000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a6
Deployed ByteCode Sourcemap
16534:21101:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34364:391;;;;;;:::i;:::-;;:::i;:::-;;17688:47;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;687:25:1;;;675:2;660:18;17688:47:0;;;;;;;;20407:266;;;;;;:::i;:::-;;:::i;17809:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;36078:77;;;;;;:::i;:::-;;:::i;19466:93::-;19539:12;;19466:93;;17526:23;;;;;-1:-1:-1;;;;;17526:23:0;;;;;;-1:-1:-1;;;;;1670:32:1;;;1652:51;;1640:2;1625:18;17526:23:0;1485:224:1;20797:144:0;;;;;;:::i;:::-;;:::i;33866:490::-;;;;;;:::i;:::-;;:::i;17742:60::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;22991:380;;;;;;:::i;:::-;;:::i;22354:401::-;;;;;;:::i;:::-;;:::i;22864:119::-;;;;;;:::i;:::-;;:::i;24803:255::-;;;;;;:::i;:::-;;:::i;17500:19::-;;;;;-1:-1:-1;;;;;17500:19:0;;;23469:652;;;:::i;21748:187::-;;;;;;:::i;:::-;;:::i;17556:19::-;;;;;-1:-1:-1;;;;;17556:19:0;;;16995:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16995:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4501:32:1;;;4483:51;;4565:2;4550:18;;4543:34;;;;4593:18;;;4586:34;;;;4651:2;4636:18;;4629:34;4694:3;4679:19;;4672:35;4521:3;4723:19;;4716:35;4470:3;4455:19;16995:44:0;4196:561:1;17311:40:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4927:14:1;;4920:22;4902:41;;4890:2;4875:18;17311:40:0;4762:187:1;35984:86:0;;;;;;:::i;:::-;;:::i;35475:171::-;;;;;;:::i;:::-;;:::i;34763:704::-;;;;;;:::i;:::-;;:::i;35654:177::-;;;;;;:::i;:::-;;:::i;16937:18::-;;;;;;;;;19687:178;;;;;;:::i;:::-;;:::i;17642:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;17158:77;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;19567:112;;;;;;:::i;:::-;-1:-1:-1;;;;;19653:18:0;19626:7;19653:18;;;:9;:18;;;;;;;19567:112;16962:26;;;;;;;;-1:-1:-1;;;;;16962:26:0;;;17612:23;;;;;-1:-1:-1;;;;;17612:23:0;;;17046:29;;;;;;:::i;:::-;;:::i;23379:82::-;;;:::i;33230:628::-;;;;;;:::i;:::-;;:::i;21585:101::-;21660:11;:18;21585:101;;21151:315;;;;;;:::i;:::-;;:::i;25171:2461::-;;;;;;:::i;:::-;;:::i;21943:403::-;;;;;;:::i;:::-;;:::i;20949:194::-;;;;;;:::i;:::-;;:::i;32499:622::-;;;;;;:::i;:::-;;:::i;27640:120::-;;;:::i;:::-;;;;6833:25:1;;;6889:2;6874:18;;6867:34;;;;6806:18;27640:120:0;6659:248:1;17358:44:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22763:93;;;:::i;17582:21::-;;;;;-1:-1:-1;;;17582:21:0;;;;;;21474:103;21550:12;:19;21474:103;;17242:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;25066:97;;;:::i;19873:468::-;;;;;;:::i;:::-;;:::i;17082:28::-;;;;;;:::i;:::-;;:::i;34364:391::-;36822:2;;;;;;;;;-1:-1:-1;;;;;36822:2:0;-1:-1:-1;;;;;36822:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36810:21:0;:10;-1:-1:-1;;;;;36810:21:0;;36802:47;;;;-1:-1:-1;;;36802:47:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;34435:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;;::::1;;:25;34427:57;;;::::0;-1:-1:-1;;;34427:57:0;;7712:2:1;34427:57:0::1;::::0;::::1;7694:21:1::0;7751:2;7731:18;;;7724:30;-1:-1:-1;;;7770:18:1;;;7763:49;7829:18;;34427:57:0::1;7510:343:1::0;34427:57:0::1;34518:12;::::0;-1:-1:-1;;;;;34504:27:0;;::::1;34518:12;::::0;;::::1;;34504:27;;34495:68;;;::::0;-1:-1:-1;;;34495:68:0;;8060:2:1;34495:68:0::1;::::0;::::1;8042:21:1::0;8099:2;8079:18;;;8072:30;8138:29;8118:18;;;8111:57;8185:18;;34495:68:0::1;7858:351:1::0;34495:68:0::1;34601:5;::::0;34574:53:::1;::::0;-1:-1:-1;;;34574:53:0;;-1:-1:-1;;;;;34574:18:0;;::::1;::::0;::::1;::::0;:53:::1;::::0;34601:5;;::::1;::::0;-1:-1:-1;;34609:17:0;34574:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;34638:11:0::1;:20:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;34638:20:0::1;-1:-1:-1::0;;;;;34638:20:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;34669:16:0;;;:12:::1;34638:20;34669:16:::0;;;;;:23;;-1:-1:-1;;34669:23:0::1;::::0;::::1;::::0;;34734:5:::1;::::0;34708:39;;34734:5;::::1;::::0;34708:39:::1;::::0;-1:-1:-1;34708:39:0::1;34364:391:::0;:::o;20407:266::-;-1:-1:-1;;;;;20633:16:0;;;20486:7;20633:16;;;:7;:16;;;;;;;;:31;;;;;;;;;;;;;20570;;;:22;:31;;;;;:46;;;;;;;;;;20513:152;;20633:31;20513:115;;20623:4;;20513:105;;20536:81;;:29;20650:13;20536:14;:29::i;:::-;:33;;:81::i;:::-;-1:-1:-1;;;;;20513:18:0;;;;;;:9;:18;;;;;;;:22;:105::i;:::-;:109;;:115::i;:::-;:119;;:152::i;:::-;20506:159;;20407:266;;;;;:::o;36078:77::-;36822:2;;;;;;;;;-1:-1:-1;;;;;36822:2:0;-1:-1:-1;;;;;36822:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36810:21:0;:10;-1:-1:-1;;;;;36810:21:0;;36802:47;;;;-1:-1:-1;;;36802:47:0;;;;;;;:::i;:::-;36136:6:::1;:11:::0;;-1:-1:-1;;36136:11:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36078:77::o;20797:144::-;20874:7;20901:32;20910:7;20919:13;20901:8;:32::i;33866:490::-;36822:2;;;;;;;;;-1:-1:-1;;;;;36822:2:0;-1:-1:-1;;;;;36822:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36810:21:0;:10;-1:-1:-1;;;;;36810:21:0;;36802:47;;;;-1:-1:-1;;;36802:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34013:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;;;;:38:::1;::::0;33995:15:::1;:56;33973:132;;;::::0;-1:-1:-1;;;33973:132:0;;8945:2:1;33973:132:0::1;::::0;::::1;8927:21:1::0;8984:2;8964:18;;;8957:30;9023:28;9003:18;;;8996:56;9069:18;;33973:132:0::1;8743:350:1::0;33973:132:0::1;34143:1;34124:16;:20;34116:65;;;::::0;-1:-1:-1;;;34116:65:0;;9300:2:1;34116:65:0::1;::::0;::::1;9282:21:1::0;;;9319:18;;;9312:30;9378:34;9358:18;;;9351:62;9430:18;;34116:65:0::1;9098:356:1::0;34116:65:0::1;-1:-1:-1::0;;;;;34192:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;;;:41:::1;;:60:::0;;;34268:80;::::1;::::0;::::1;::::0;34236:16;687:25:1;;675:2;660:18;;541:177;34268:80:0::1;;;;;;;;33866:490:::0;;:::o;22991:380::-;10133:1;10116:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;10145:20:0;10168:13;;;23058:10:::1;::::0;36262:483:::1;36279:12;:19:::0;36275:23;::::1;36262:483;;;36320:13;36336:12;36349:1;36336:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;36336:15:0::1;::::0;-1:-1:-1;36407:21:0::1;36336:15:::0;36407:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;36366:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:62:::0;36478:31:::1;36377:5:::0;36478:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;36443:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;36528:21;::::1;::::0;36524:210:::1;;36596:24;36605:7;36614:5;36596:8;:24::i;:::-;-1:-1:-1::0;;;;;36570:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;36680:10:::1;:17:::0;;;;;:38:::1;::::0;;::::1;::::0;36639:31;;;;;;;;:38;;;;;;;;;;:79;36524:210:::1;-1:-1:-1::0;36300:3:0;::::1;::::0;::::1;:::i;:::-;;;;36262:483;;;;23098:1:::2;23089:6;:10;23081:40;;;::::0;-1:-1:-1;;;23081:40:0;;10198:2:1;23081:40:0::2;::::0;::::2;10180:21:1::0;10237:2;10217:18;;;10210:30;-1:-1:-1;;;10256:18:1;;;10249:47;10313:18;;23081:40:0::2;9996:341:1::0;23081:40:0::2;23147:12;::::0;:24:::2;::::0;23164:6;23147:16:::2;:24::i;:::-;23132:12;:39:::0;23216:10:::2;23206:21;::::0;;;:9:::2;:21;::::0;;;;;:33:::2;::::0;23232:6;23206:25:::2;:33::i;:::-;23192:10;23182:21;::::0;;;:9:::2;:21;::::0;;;;:57;;;;23250:12:::2;::::0;:45:::2;::::0;:12:::2;::::0;;::::2;-1:-1:-1::0;;;;;23250:12:0::2;::::0;23288:6;23250:25:::2;:45::i;:::-;23311:29;::::0;687:25:1;;;23321:10:0::2;::::0;23311:29:::2;::::0;675:2:1;660:18;23311:29:0::2;;;;;;;;23351:12;:10;:12::i;:::-;;;10192:1:::1;10228:13:::0;;10212:12;:29;10204:73;;;;-1:-1:-1;;;10204:73:0;;;;;;;:::i;:::-;10105:180;22991:380;:::o;22354:401::-;10133:1;10116:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;10145:20:0;10168:13;36916:6:::1;::::0;::::1;;36915:7;36907:27;;;::::0;-1:-1:-1;;;36907:27:0;;10904:2:1;36907:27:0::1;::::0;::::1;10886:21:1::0;10943:1;10923:18;;;10916:29;-1:-1:-1;;;10961:18:1;;;10954:37;11008:18;;36907:27:0::1;10702:330:1::0;36907:27:0::1;22448:5:::2;36267:6;36262:483;36279:12;:19:::0;36275:23;::::2;36262:483;;;36320:13;36336:12;36349:1;36336:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;36336:15:0::2;::::0;-1:-1:-1;36407:21:0::2;36336:15:::0;36407:14:::2;:21::i;:::-;-1:-1:-1::0;;;;;36366:17:0;::::2;;::::0;;;:10:::2;:17;::::0;;;;:38:::2;;:62:::0;36478:31:::2;36377:5:::0;36478:24:::2;:31::i;:::-;-1:-1:-1::0;;;;;36443:17:0;;::::2;;::::0;;;:10:::2;:17;::::0;;;;:32:::2;;:66:::0;;;;36528:21;::::2;::::0;36524:210:::2;;36596:24;36605:7;36614:5;36596:8;:24::i;:::-;-1:-1:-1::0;;;;;36570:16:0;;::::2;;::::0;;;:7:::2;:16;::::0;;;;;;;:23;;::::2;::::0;;;;;;;;;:50;;;;36680:10:::2;:17:::0;;;;;:38:::2;::::0;;::::2;::::0;36639:31;;;;;;;;:38;;;;;;;;;;:79;36524:210:::2;-1:-1:-1::0;36300:3:0;::::2;::::0;::::2;:::i;:::-;;;;36262:483;;;;22483:1:::3;22474:6;:10;22466:37;;;::::0;-1:-1:-1;;;22466:37:0;;11239:2:1;22466:37:0::3;::::0;::::3;11221:21:1::0;11278:2;11258:18;;;11251:30;-1:-1:-1;;;11297:18:1;;;11290:44;11351:18;;22466:37:0::3;11037:338:1::0;22466:37:0::3;22529:12;::::0;:24:::3;::::0;22546:6;22529:16:::3;:24::i;:::-;22514:12;:39:::0;-1:-1:-1;;;;;22583:16:0;::::3;;::::0;;;:9:::3;:16;::::0;;;;;:28:::3;::::0;22604:6;22583:20:::3;:28::i;:::-;-1:-1:-1::0;;;;;22564:16:0;;::::3;;::::0;;;:9:::3;:16;::::0;;;;:47;;;;22622:12:::3;::::0;:64:::3;::::0;:12:::3;::::0;;::::3;;22652:10;22672:4;22679:6:::0;22622:29:::3;:64::i;:::-;22710:5;-1:-1:-1::0;;;;;22702:22:0::3;;22717:6;22702:22;;;;687:25:1::0;;675:2;660:18;;541:177;22702:22:0::3;;;;;;;;22735:12;:10;:12::i;:::-;;;36945:1:::2;10228:13:::0;;10212:12;:29;10204:73;;;;-1:-1:-1;;;10204:73:0;;;;;;;:::i;:::-;10105:180;22354:401;;:::o;22864:119::-;22940:12;;:34;;-1:-1:-1;;;22940:34:0;;22963:10;22940:34;;;1652:51:1;22922:53:0;;22933:5;;22940:12;;;;-1:-1:-1;;;;;22940:12:0;;:22;;1625:18:1;;22940:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22922:53::-;22864:119;:::o;24803:255::-;24892:10;-1:-1:-1;;;;;24892:21:0;;;;:53;;-1:-1:-1;24939:5:0;;-1:-1:-1;;;;;24939:5:0;24917:10;:28;24892:53;24884:86;;;;-1:-1:-1;;;24884:86:0;;11771:2:1;24884:86:0;;;11753:21:1;11810:2;11790:18;;;11783:30;-1:-1:-1;;;11829:18:1;;;11822:50;11889:18;;24884:86:0;11569:344:1;24884:86:0;24981:5;;:31;;-1:-1:-1;;;24981:31:0;;25006:4;24981:31;;;1652:51:1;-1:-1:-1;;;;;24981:5:0;;;;:16;;1625:18:1;;24981:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25023:27;25034:7;25043:6;25023:10;:27::i;23469:652::-;10133:1;10116:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;10145:20:0;10168:13;;;23523:10:::1;::::0;36262:483:::1;36279:12;:19:::0;36275:23;::::1;36262:483;;;36320:13;36336:12;36349:1;36336:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;36336:15:0::1;::::0;-1:-1:-1;36407:21:0::1;36336:15:::0;36407:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;36366:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:62:::0;36478:31:::1;36377:5:::0;36478:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;36443:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;36528:21;::::1;::::0;36524:210:::1;;36596:24;36605:7;36614:5;36596:8;:24::i;:::-;-1:-1:-1::0;;;;;36570:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;36680:10:::1;:17:::0;;;;;:38:::1;::::0;;::::1;::::0;36639:31;;;;;;;;:38;;;;;;;;;;:79;36524:210:::1;-1:-1:-1::0;36300:3:0;::::1;::::0;::::1;:::i;:::-;;;;36262:483;;;;23553:6:::2;23548:543;23565:12;:19:::0;23561:23;::::2;23548:543;;;23606:21;23630:12;23643:1;23630:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;;::::2;::::0;23686:10:::2;23678:19:::0;;:7:::2;:19:::0;;;;;;-1:-1:-1;;;;;23630:15:0;;::::2;23678:34:::0;;;;;;;;;;23630:15;;-1:-1:-1;23731:11:0;;23727:353:::2;;23771:10;23800:1;23763:19:::0;;;:7:::2;:19;::::0;;;;;;;-1:-1:-1;;;;;23763:34:0;::::2;::::0;;;;;;;:38;;;;23820:55:::2;::::0;23867:7;23820:34:::2;:55::i;:::-;23899:48;::::0;687:25:1;;;-1:-1:-1;;;;;23899:48:0;::::2;::::0;23912:10:::2;::::0;23899:48:::2;::::0;675:2:1;660:18;23899:48:0::2;;;;;;;-1:-1:-1::0;;;;;23966:22:0;::::2;;::::0;;;:7:::2;:22;::::0;;;;:33;;23992:7;;23966:22;:33:::2;::::0;23992:7;;23966:33:::2;:::i;:::-;::::0;;;-1:-1:-1;;24027:10:0::2;24018:20;::::0;;;:8:::2;:20;::::0;;;;;;;-1:-1:-1;;;;;24018:35:0;::::2;::::0;;;;;;;:46;;24057:7;;24018:20;:46:::2;::::0;24057:7;;24018:46:::2;:::i;:::-;::::0;;;-1:-1:-1;;23727:353:0::2;23591:500;;23586:3;;;;;:::i;:::-;;;;23548:543;;;;24101:12;:10;:12::i;:::-;;;10192:1:::1;10228:13:::0;;10212:12;:29;10204:73;;;;-1:-1:-1;;;10204:73:0;;;;;;;:::i;21748:187::-;36822:2;;;;;;;;;-1:-1:-1;;;;;36822:2:0;-1:-1:-1;;;;;36822:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36810:21:0;:10;-1:-1:-1;;;;;36810:21:0;;36802:47;;;;-1:-1:-1;;;36802:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21861:25:0;;::::1;;::::0;;;:10:::1;:25;::::0;;;;:66;;-1:-1:-1;;;;;;21861:66:0::1;::::0;;;::::1;;::::0;;21748:187::o;35984:86::-;36822:2;;;;;;;;;-1:-1:-1;;;;;36822:2:0;-1:-1:-1;;;;;36822:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36810:21:0;:10;-1:-1:-1;;;;;36810:21:0;;36802:47;;;;-1:-1:-1;;;36802:47:0;;;;;;;:::i;:::-;36048:8:::1;:14:::0;;-1:-1:-1;;;;;;36048:14:0::1;-1:-1:-1::0;;;;;36048:14:0;;;::::1;::::0;;;::::1;::::0;;35984:86::o;35475:171::-;36822:2;;;;;;;;;-1:-1:-1;;;;;36822:2:0;-1:-1:-1;;;;;36822:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36810:21:0;:10;-1:-1:-1;;;;;36810:21:0;;36802:47;;;;-1:-1:-1;;;36802:47:0;;;;;;;:::i;:::-;35556:7:::1;35552:87;35570:4;:11;35565:2;:16;35552:87;;;35604:23;35618:4;35623:2;35618:8;;;;;;;;:::i;:::-;;;;;;;35604:13;:23::i;:::-;35583:4:::0;::::1;::::0;::::1;:::i;:::-;;;;35552:87;;34763:704:::0;36822:2;;;;;;;;;-1:-1:-1;;;;;36822:2:0;-1:-1:-1;;;;;36822:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36810:21:0;:10;-1:-1:-1;;;;;36810:21:0;;36802:47;;;;-1:-1:-1;;;36802:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34837:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;;::::1;;:24;;:16:::0;:24:::1;34829:58;;;::::0;-1:-1:-1;;;34829:58:0;;12120:2:1;34829:58:0::1;::::0;::::1;12102:21:1::0;12159:2;12139:18;;;12132:30;-1:-1:-1;;;12178:18:1;;;12171:51;12239:18;;34829:58:0::1;11918:345:1::0;34829:58:0::1;34925:5;::::0;34898:37:::1;::::0;-1:-1:-1;;;34898:37:0;;-1:-1:-1;;;;;34898:18:0;;::::1;::::0;::::1;::::0;:37:::1;::::0;34925:5;;::::1;::::0;::::1;::::0;34898:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;34957:11:0::1;:18:::0;;;-1:-1:-1;;;;;34989:22:0;::::1;::::0;35001:5:::1;35005:1;34957:18:::0;35001:5:::1;:::i;:::-;34989:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;34989:18:0::1;:22;34986:418;;;35028:11;:17;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;35028:17:0;;;;;-1:-1:-1;;;;;;35028:17:0::1;::::0;;;;;;;;-1:-1:-1;;;;;35060:16:0;::::1;::::0;;:12:::1;:16:::0;;;;;:24;;-1:-1:-1;;35060:24:0::1;::::0;;34986:418:::1;;;35130:6;35126:267;35142:11;:18:::0;:22:::1;::::0;35163:1:::1;::::0;35142:22:::1;:::i;:::-;35138:1;:26;35126:267;;;35209:2;-1:-1:-1::0;;;;;35193:18:0::1;:11;35205:1;35193:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;35193:14:0::1;:18;35190:188;;;35253:11;35265:5;35269:1;35265:3:::0;:5:::1;:::i;:::-;35253:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;35236:11:::1;:14:::0;;-1:-1:-1;;;;;35253:18:0;;::::1;::::0;35248:1;;35236:14;::::1;;;;;:::i;:::-;;;;;;;;;:35;;;;;-1:-1:-1::0;;;;;35236:35:0::1;;;;;-1:-1:-1::0;;;;;35236:35:0::1;;;;;;35294:11;:17;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;35294:17:0;;;;;-1:-1:-1;;;;;;35294:17:0::1;::::0;;;;;;;;-1:-1:-1;;;;;35334:16:0;::::1;::::0;;:12:::1;:16:::0;;;;;:24;;-1:-1:-1;;35334:24:0::1;::::0;;35190:188:::1;35166:3:::0;::::1;::::0;::::1;:::i;:::-;;;;35126:267;;;;34986:418;35445:5;::::0;35419:40:::1;::::0;35453:5:::1;::::0;-1:-1:-1;;;;;35445:5:0;;::::1;::::0;35419:40;;::::1;::::0;::::1;::::0;35453:5;;35419:40:::1;34818:649;34763:704:::0;:::o;35654:177::-;36822:2;;;;;;;;;-1:-1:-1;;;;;36822:2:0;-1:-1:-1;;;;;36822:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36810:21:0;:10;-1:-1:-1;;;;;36810:21:0;;36802:47;;;;-1:-1:-1;;;36802:47:0;;;;;;;:::i;:::-;35738:7:::1;35734:90;35752:4;:11;35747:2;:16;35734:90;;;35786:26;35803:4;35808:2;35803:8;;;;;;;;:::i;:::-;;;;;;;35786:16;:26::i;:::-;35765:4:::0;::::1;::::0;::::1;:::i;:::-;;;;35734:90;;19687:178:::0;-1:-1:-1;;;;;19818:25:0;;19765:7;19818:25;;;:10;:25;;;;;;;:38;;19792:65;;19801:15;;19792:8;:65::i;17046:29::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17046:29:0;;-1:-1:-1;17046:29:0;:::o;23379:82::-;23441:10;23431:21;;;;:9;:21;;;;;;23422:31;;:8;:31::i;:::-;23379:82::o;33230:628::-;36822:2;;;;;;;;;-1:-1:-1;;;;;36822:2:0;-1:-1:-1;;;;;36822:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36810:21:0;:10;-1:-1:-1;;;;;36810:21:0;;36802:47;;;;-1:-1:-1;;;36802:47:0;;;;;;;:::i;:::-;33337:12:::1;::::0;-1:-1:-1;;;;;33319:31:0;;::::1;33337:12;::::0;;::::1;;33319:31;33316:451;;;33663:12;::::0;33620::::1;::::0;:37:::1;::::0;-1:-1:-1;;;33620:37:0;;33651:4:::1;33620:37;::::0;::::1;1652:51:1::0;-1:-1:-1;;33619:57:0::1;::::0;33663:12;;33620::::1;::::0;;::::1;-1:-1:-1::0;;;;;33620:12:0::1;::::0;:22:::1;::::0;1625:18:1;;33620:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33619:57::-;33603:73;;33708:8;33700:4;:16;;33691:64;;;::::0;-1:-1:-1;;;33691:64:0;;13019:2:1;33691:64:0::1;::::0;::::1;13001:21:1::0;13058:2;13038:18;;;13031:30;13097:34;13077:18;;;13070:62;-1:-1:-1;;;13148:18:1;;;13141:32;13190:19;;33691:64:0::1;12817:398:1::0;33691:64:0::1;33352:415;33316:451;33777:34;::::0;-1:-1:-1;;;33777:34:0;;-1:-1:-1;;;;;33777:23:0;::::1;::::0;::::1;::::0;:34:::1;::::0;33801:3;;33806:4;;33777:34:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33837:6;-1:-1:-1::0;;;;;33827:23:0::1;;33845:4;33827:23;;;;687:25:1::0;;675:2;660:18;;541:177;33827:23:0::1;;;;;;;;33230:628:::0;;;:::o;21151:315::-;-1:-1:-1;;;;;21251:25:0;;21211:4;21251:25;;;:10;:25;;;;;;;:38;;21232:15;:57;21228:71;;-1:-1:-1;21298:1:0;;21151:315;-1:-1:-1;21151:315:0:o;21228:71::-;-1:-1:-1;;;;;21330:25:0;;21310:17;21330:25;;;:10;:25;;;;;;;:38;;:59;;21373:15;21330:42;:59::i;:::-;-1:-1:-1;;;;;21421:25:0;;;;;;:10;:25;;;;;:36;;;21310:79;;-1:-1:-1;21407:51:0;;21310:79;;21407:13;:51::i;:::-;21400:58;21151:315;-1:-1:-1;;;21151:315:0:o;25171:2461::-;10133:1;10116:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;10145:20:0;10168:13;;;10145:20;36262:483:::1;36279:12;:19:::0;36275:23;::::1;36262:483;;;36320:13;36336:12;36349:1;36336:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;36336:15:0::1;::::0;-1:-1:-1;36407:21:0::1;36336:15:::0;36407:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;36366:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:62:::0;36478:31:::1;36377:5:::0;36478:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;36443:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;36528:21;::::1;::::0;36524:210:::1;;36596:24;36605:7;36614:5;36596:8;:24::i;:::-;-1:-1:-1::0;;;;;36570:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;36680:10:::1;:17:::0;;;;;:38:::1;::::0;;::::1;::::0;36639:31;;;;;;;;:38;;;;;;;;;;:79;36524:210:::1;-1:-1:-1::0;36300:3:0;::::1;::::0;::::1;:::i;:::-;;;;36262:483;;;-1:-1:-1::0;25330:12:0::2;::::0;-1:-1:-1;;;;;25305:38:0;;::::2;25330:12;::::0;;::::2;;25305:38;;25297:91;;;::::0;-1:-1:-1;;;25297:91:0;;13422:2:1;25297:91:0::2;::::0;::::2;13404:21:1::0;13461:2;13441:18;;;13434:30;13500:34;13480:18;;;13473:62;-1:-1:-1;;;13551:18:1;;;13544:38;13599:19;;25297:91:0::2;13220:404:1::0;25297:91:0::2;-1:-1:-1::0;;;;;25407:23:0;::::2;;::::0;;;:8:::2;:23;::::0;;;;;::::2;;25399:51;;;::::0;-1:-1:-1;;;25399:51:0;;13831:2:1;25399:51:0::2;::::0;::::2;13813:21:1::0;13870:2;13850:18;;;13843:30;-1:-1:-1;;;13889:18:1;;;13882:44;13943:18;;25399:51:0::2;13629:338:1::0;25399:51:0::2;25669:12;:10;:12::i;:::-;-1:-1:-1::0;;25764:46:0::2;::::0;-1:-1:-1;;;25764:46:0;;25804:4:::2;25764:46;::::0;::::2;1652:51:1::0;25752:9:0::2;::::0;-1:-1:-1;;;;;25764:31:0;::::2;::::0;::::2;::::0;1625:18:1;;25764:46:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25752:58:::0;-1:-1:-1;25991:74:0::2;-1:-1:-1::0;;;;;25991:38:0;::::2;26030:10;26050:4;26057:7:::0;25991:38:::2;:74::i;:::-;26088:46;::::0;-1:-1:-1;;;26088:46:0;;26128:4:::2;26088:46;::::0;::::2;1652:51:1::0;26076:9:0::2;::::0;-1:-1:-1;;;;;26088:31:0;::::2;::::0;::::2;::::0;1625:18:1;;26088:46:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26076:58:::0;-1:-1:-1;26155:11:0::2;26162:4:::0;26076:58;26155:11:::2;:::i;:::-;26145:21;;26195:1;26185:7;:11;26177:61;;;::::0;-1:-1:-1;;;26177:61:0;;14174:2:1;26177:61:0::2;::::0;::::2;14156:21:1::0;14213:2;14193:18;;;14186:30;14252:34;14232:18;;;14225:62;-1:-1:-1;;;14303:18:1;;;14296:35;14348:19;;26177:61:0::2;13972:401:1::0;26177:61:0::2;-1:-1:-1::0;;;;;26274:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;;;;:38:::2;::::0;26255:15:::2;:57;26251:1074;;-1:-1:-1::0;;;;;26380:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:41:::2;;::::0;26368:54:::2;::::0;:7;;:11:::2;:54::i;:::-;-1:-1:-1::0;;;;;26329:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:36:::2;;:93:::0;26251:1074:::2;;;-1:-1:-1::0;;;;;26546:25:0;::::2;26524:19;26546:25:::0;;;:10:::2;:25;::::0;;;;;;:36:::2;::::0;::::2;::::0;26617:38;::::2;::::0;26546:36;;26524:19;26617:59:::2;::::0;26660:15:::2;26617:42;:59::i;:::-;-1:-1:-1::0;;;;;26724:25:0;::::2;26691:16;26724:25:::0;;;:10:::2;:25;::::0;;;;:36:::2;;::::0;26597:79;;-1:-1:-1;26691:16:0;26710:51:::2;::::0;26597:79;;26710:13:::2;:51::i;:::-;-1:-1:-1::0;;;;;26841:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:41:::2;;::::0;26691:70;;-1:-1:-1;26815:68:0::2;::::0;:21:::2;:7:::0;26691:70;26815:11:::2;:21::i;:68::-;-1:-1:-1::0;;;;;26776:25:0;;::::2;;::::0;;;:10:::2;:25;::::0;;;;:36:::2;;:107:::0;;;;26939:5:::2;::::0;::::2;26919:10;:26;;::::0;:103:::2;;-1:-1:-1::0;;;;;;26978:25:0;;::::2;;::::0;;;:10:::2;:25;::::0;;;;:44;::::2;26966:10;:56;;26919:103;26898:416;;;-1:-1:-1::0;;;;;27114:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:36:::2;;::::0;:54;-1:-1:-1;27114:54:0::2;::::0;:101:::2;;;27207:8;27197:7;:18;27114:101;27057:241;;;::::0;-1:-1:-1;;;27057:241:0;;14580:2:1;27057:241:0::2;::::0;::::2;14562:21:1::0;14619:2;14599:18;;;14592:30;14658:34;14638:18;;;14631:62;-1:-1:-1;;;14709:18:1;;;14702:35;14754:19;;27057:241:0::2;14378:401:1::0;27057:241:0::2;26440:885;;;26251:1074;-1:-1:-1::0;;;;;27337:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;27380:15:::2;27337:40;::::0;::::2;:58:::0;;;27467:41:::2;::::0;;::::2;::::0;27447:62:::2;::::0;27380:15;27447:19:::2;:62::i;:::-;-1:-1:-1::0;;;;;27406:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;;;;;:38;;::::2;:103:::0;;;;27525:47;687:25:1;;;27552:10:0::2;::::0;27525:47:::2;::::0;660:18:1;27525:47:0::2;;;;;;;-1:-1:-1::0;;;;;27583:30:0;::::2;;::::0;;;:15:::2;:30;::::0;;;;:41;;27617:7;;27583:30;:41:::2;::::0;27617:7;;27583:41:::2;:::i;:::-;;;;;;;;25286:2346;;10192:1:::1;10228:13:::0;;10212:12;:29;10204:73;;;;-1:-1:-1;;;10204:73:0;;;;;;;:::i;21943:403::-;10133:1;10116:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;10145:20:0;10168:13;36916:6:::1;::::0;::::1;;36915:7;36907:27;;;::::0;-1:-1:-1;;;36907:27:0;;10904:2:1;36907:27:0::1;::::0;::::1;10886:21:1::0;10943:1;10923:18;;;10916:29;-1:-1:-1;;;10961:18:1;;;10954:37;11008:18;;36907:27:0::1;10702:330:1::0;36907:27:0::1;22019:10:::2;36267:6;36262:483;36279:12;:19:::0;36275:23;::::2;36262:483;;;36320:13;36336:12;36349:1;36336:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;36336:15:0::2;::::0;-1:-1:-1;36407:21:0::2;36336:15:::0;36407:14:::2;:21::i;:::-;-1:-1:-1::0;;;;;36366:17:0;::::2;;::::0;;;:10:::2;:17;::::0;;;;:38:::2;;:62:::0;36478:31:::2;36377:5:::0;36478:24:::2;:31::i;:::-;-1:-1:-1::0;;;;;36443:17:0;;::::2;;::::0;;;:10:::2;:17;::::0;;;;:32:::2;;:66:::0;;;;36528:21;::::2;::::0;36524:210:::2;;36596:24;36605:7;36614:5;36596:8;:24::i;:::-;-1:-1:-1::0;;;;;36570:16:0;;::::2;;::::0;;;:7:::2;:16;::::0;;;;;;;:23;;::::2;::::0;;;;;;;;;:50;;;;36680:10:::2;:17:::0;;;;;:38:::2;::::0;;::::2;::::0;36639:31;;;;;;;;:38;;;;;;;;;;:79;36524:210:::2;-1:-1:-1::0;36300:3:0;::::2;::::0;::::2;:::i;:::-;;;;36262:483;;;;22059:1:::3;22050:6;:10;22042:37;;;::::0;-1:-1:-1;;;22042:37:0;;11239:2:1;22042:37:0::3;::::0;::::3;11221:21:1::0;11278:2;11258:18;;;11251:30;-1:-1:-1;;;11297:18:1;;;11290:44;11351:18;;22042:37:0::3;11037:338:1::0;22042:37:0::3;22105:12;::::0;:24:::3;::::0;22122:6;22105:16:::3;:24::i;:::-;22090:12;:39:::0;22174:10:::3;22164:21;::::0;;;:9:::3;:21;::::0;;;;;:33:::3;::::0;22190:6;22164:25:::3;:33::i;:::-;22150:10;22140:21;::::0;;;:9:::3;:21;::::0;;;;:57;;;;22208:12:::3;::::0;:64:::3;::::0;:12:::3;::::0;;::::3;-1:-1:-1::0;;;;;22208:12:0::3;::::0;22258:4:::3;22265:6:::0;22208:29:::3;:64::i;:::-;22288:27;::::0;687:25:1;;;22296:10:0::3;::::0;22288:27:::3;::::0;675:2:1;660:18;22288:27:0::3;541:177:1::0;20949:194:0;-1:-1:-1;;;;;21093:25:0;;21025:7;21093:25;;;:10;:25;;;;;:41;;;;21052:36;;;;;:83;;:40;:83::i;32499:622::-;36822:2;;;;;;;;;-1:-1:-1;;;;;36822:2:0;-1:-1:-1;;;;;36822:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36810:21:0;:10;-1:-1:-1;;;;;36810:21:0;;36802:47;;;;-1:-1:-1;;;36802:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32646:23:0;::::1;;::::0;;;:8:::1;:23;::::0;;;;;::::1;;:32;::::0;::::1;:95;;-1:-1:-1::0;;;;;;32695:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;:41:::1;;::::0;:46;32646:95:::1;32624:166;;;::::0;-1:-1:-1;;;32624:166:0;;14986:2:1;32624:166:0::1;::::0;::::1;14968:21:1::0;15025:2;15005:18;;;14998:30;-1:-1:-1;;;15044:18:1;;;15037:50;15104:18;;32624:166:0::1;14784:344:1::0;32624:166:0::1;32835:12;::::0;-1:-1:-1;;;;;32810:38:0;;::::1;32835:12;::::0;;::::1;;32810:38;;32801:80;;;::::0;-1:-1:-1;;;32801:80:0;;15335:2:1;32801:80:0::1;::::0;::::1;15317:21:1::0;15374:2;15354:18;;;15347:30;15413;15393:18;;;15386:58;15461:18;;32801:80:0::1;15133:352:1::0;32801:80:0::1;32892:12;:32:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;32892:32:0;;::::1;-1:-1:-1::0;;;;;;32892:32:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;32935:23:0;;;:8:::1;32892:32;32935:23:::0;;;;;;;:30;;-1:-1:-1;;32935:30:0::1;::::0;::::1;::::0;;32976:10:::1;:25:::0;;;;;;:66;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;33053:41;::::1;:60:::0;32499:622::o;27640:120::-;27692:13;27707;10133:1;10116:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;10145:20:0;10168:13;27740:12:::1;:10;:12::i;:::-;27733:19;;;;10228:13:::0;;10212:12;:29;10204:73;;;;-1:-1:-1;;;10204:73:0;;;;;;;:::i;:::-;10105:180;27640:120;;:::o;22763:93::-;22813:12;;:34;;-1:-1:-1;;;22813:34:0;;22836:10;22813:34;;;1652:51:1;22805:43:0;;22813:12;;;-1:-1:-1;;;;;22813:12:0;;:22;;1625:18:1;;22813:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25066:97::-;25121:10;25111:21;;;;:9;:21;;;;;;25102:31;;:8;:31::i;:::-;25144:11;:9;:11::i;19873:468::-;19941:7;19965:12;;19981:1;19965:17;19961:103;;;-1:-1:-1;;;;;;20006:25:0;;;;;:10;:25;;;;;:46;;;;19873:468::o;19961:103::-;20305:12;;-1:-1:-1;;;;;20253:25:0;;;;;;:10;:25;;;;;:36;;;;20207:40;;;;;20094:239;;20163:155;;20305:12;;20163:137;;20295:4;;20163:127;;20253:36;20163:127;;:39;20264:13;20163:24;:39::i;:85::-;:89;;:127::i;:155::-;-1:-1:-1;;;;;20094:25:0;;;;;;:10;:25;;;;;:46;;;;:50;:239::i;17082:28::-;;;;;;;;;;;;14212:184;14270:7;14303:1;14298;:6;;14290:49;;;;-1:-1:-1;;;14290:49:0;;15692:2:1;14290:49:0;;;15674:21:1;15731:2;15711:18;;;15704:30;15770:32;15750:18;;;15743:60;15820:18;;14290:49:0;15490:354:1;14290:49:0;14350:9;14362:5;14366:1;14362;:5;:::i;:::-;14350:17;14212:184;-1:-1:-1;;;;14212:184:0:o;14647:470::-;14705:7;14949:6;14945:47;;-1:-1:-1;14979:1:0;14972:8;;14945:47;15004:9;15016:5;15020:1;15016;:5;:::i;:::-;15004:17;-1:-1:-1;15049:1:0;15040:5;15044:1;15004:17;15040:5;:::i;:::-;:10;15032:56;;;;-1:-1:-1;;;15032:56:0;;16446:2:1;15032:56:0;;;16428:21:1;16485:2;16465:18;;;16458:30;16524:34;16504:18;;;16497:62;-1:-1:-1;;;16575:18:1;;;16568:31;16616:19;;15032:56:0;16244:397:1;15585:333:0;15643:7;15742:1;15738;:5;15730:44;;;;-1:-1:-1;;;15730:44:0;;16848:2:1;15730:44:0;;;16830:21:1;16887:2;16867:18;;;16860:30;16926:28;16906:18;;;16899:56;16972:18;;15730:44:0;16646:350:1;15730:44:0;15785:9;15797:5;15801:1;15797;:5;:::i;13756:181::-;13814:7;;13846:5;13850:1;13846;:5;:::i;:::-;13834:17;;13875:1;13870;:6;;13862:46;;;;-1:-1:-1;;;13862:46:0;;17203:2:1;13862:46:0;;;17185:21:1;17242:2;17222:18;;;17215:30;17281:29;17261:18;;;17254:57;17328:18;;13862:46:0;17001:351:1;10386:176:0;10469:85;10488:5;10518:23;;;10543:2;10547:5;10495:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;10495:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;10495:58:0;-1:-1:-1;;;;;;10495:58:0;;;;;;;;;;10469:18;:85::i;27768:4665::-;27920:9;;27808:13;;;;-1:-1:-1;;;27920:9:0;;;;27915:2735;;28173:11;:18;28162:8;28173:18;28228:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28228:17:0;;28203:42;;28257:23;28294:3;28283:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28283:15:0;;28257:41;;28314:7;28310:490;28328:3;28323:2;:8;28310:490;;;28376:11;28388:2;28376:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28376:15:0;28355:6;28362:2;28355:10;;;;;;;;:::i;:::-;;;;;;:38;-1:-1:-1;;;;;28355:38:0;;;-1:-1:-1;;;;;28355:38:0;;;;;28707:1;-1:-1:-1;;;;;28676:33:0;28684:6;28691:2;28684:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;28676:33:0;;:111;;28752:6;28759:2;28752:10;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;-1:-1:-1;;;28752:35:0;;28781:4;28752:35;;;1652:51:1;-1:-1:-1;;;;;28752:20:0;;;;;;1625:18:1;;28752:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28676:111;;;28730:1;28676:111;28642:9;28652:2;28642:13;;;;;;;;:::i;:::-;;;;;;;;;;:145;28333:4;;;;:::i;:::-;;;;28310:490;;;;28832:12;;;;;;;;-1:-1:-1;;;;;28832:12:0;-1:-1:-1;;;;;28818:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28818:40:0;;;;;;;;-1:-1:-1;;28818:40:0;;;;;;;;;;;;:::i;:::-;;;28814:1825;;-1:-1:-1;30618:1:0;;;;-1:-1:-1;27768:4665:0;-1:-1:-1;;;27768:4665:0:o;28814:1825::-;;;29102:7;29098:1371;29120:3;29115:2;:8;29098:1371;;;29217:7;29280:1;-1:-1:-1;;;;;29249:33:0;29257:6;29264:2;29257:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;29249:33:0;;:119;;29333:6;29340:2;29333:10;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;-1:-1:-1;;;29333:35:0;;29362:4;29333:35;;;1652:51:1;-1:-1:-1;;;;;29333:20:0;;;;;;1625:18:1;;29333:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29249:119;;;29307:1;29249:119;29217:151;;29608:9;29618:2;29608:13;;;;;;;;:::i;:::-;;;;;;;29603:2;:18;29600:787;;;29654:8;;-1:-1:-1;;;;;29654:8:0;29650:714;;29709:5;;29743:10;;-1:-1:-1;;;;;29709:5:0;;;;:24;;29743:6;;29750:2;;29743:10;;;;;;:::i;:::-;;;;;;;29762:9;29772:2;29762:13;;;;;;;;:::i;:::-;;;;;;;29757:2;:18;;;;:::i;:::-;29709:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29860:6;29867:2;29860:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;29814:81:0;29844:5;;;;;;;;;-1:-1:-1;;;;;29844:5:0;-1:-1:-1;;;;;29814:81:0;29824:10;-1:-1:-1;;;;;29814:81:0;-1:-1:-1;;;;;;;;;;;29879:9:0;29889:2;29879:13;;;;;;;;:::i;:::-;;;;;;;29874:2;:18;;;;:::i;:::-;29814:81;;687:25:1;;;675:2;660:18;29814:81:0;;;;;;;29975:9;29985:2;29975:13;;;;;;;;:::i;:::-;;;;;;;29970:2;:18;;;;:::i;:::-;29926:16;:39;29952:6;29959:2;29952:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;29926:39:0;-1:-1:-1;;;;;29926:39:0;;;;;;;;;;;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;29650:714:0;;-1:-1:-1;29650:714:0;;30079:6;30086:2;30079:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30079:19:0;;30099:8;;;;;;;;;-1:-1:-1;;;;;30099:8:0;30115:9;30125:2;30115:13;;;;;;;;:::i;:::-;;;;;;;30110:2;:18;;;;:::i;:::-;30079:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30207:6;30214:2;30207:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30167:75:0;30189:8;;;;;;;;;-1:-1:-1;;;;;30189:8:0;-1:-1:-1;;;;;30167:75:0;30177:10;-1:-1:-1;;;;;30167:75:0;-1:-1:-1;;;;;;;;;;;30226:9:0;30236:2;30226:13;;;;;;;;:::i;:::-;;;;;;;30221:2;:18;;;;:::i;:::-;30167:75;;687:25:1;;;675:2;660:18;30167:75:0;;;;;;;30322:9;30332:2;30322:13;;;;;;;;:::i;:::-;;;;;;;30317:2;:18;;;;:::i;:::-;30273:16;:39;30299:6;30306:2;30299:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30273:39:0;-1:-1:-1;;;;;30273:39:0;;;;;;;;;;;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;29650:714:0;-1:-1:-1;29125:4:0;;;;:::i;:::-;;;;29098:1371;;;-1:-1:-1;30495:1:0;;;;-1:-1:-1;27768:4665:0;-1:-1:-1;;;;27768:4665:0:o;27915:2735::-;30767:15;30784;30817:12;;;;;;;;-1:-1:-1;;;;;30817:12:0;-1:-1:-1;;;;;30803:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30921:40;;-1:-1:-1;;;30921:40:0;;30955:4;30921:40;;;1652:51:1;30766:74:0;;-1:-1:-1;30766:74:0;-1:-1:-1;30909:9:0;;-1:-1:-1;;;;;30921:25:0;;;;;1625:18:1;;30921:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30984;;-1:-1:-1;;;30984:40:0;;31018:4;30984:40;;;1652:51:1;30909:52:0;;-1:-1:-1;30972:9:0;;-1:-1:-1;;;;;30984:25:0;;;;;1625:18:1;;30984:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30972:52;;31072:12;;;;;;;;-1:-1:-1;;;;;31072:12:0;-1:-1:-1;;;;;31058:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31121;;-1:-1:-1;;;31121:40:0;;31155:4;31121:40;;;1652:51:1;31035:63:0;;-1:-1:-1;31035:63:0;-1:-1:-1;31109:9:0;;-1:-1:-1;;;;;31121:25:0;;;;;1625:18:1;;31121:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31184;;-1:-1:-1;;;31184:40:0;;31218:4;31184:40;;;1652:51:1;31109:52:0;;-1:-1:-1;31172:9:0;;-1:-1:-1;;;;;31184:25:0;;;;;1625:18:1;;31184:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31172:52;-1:-1:-1;31246:11:0;31253:4;31246;:11;:::i;:::-;31235:22;-1:-1:-1;31279:11:0;31286:4;31279;:11;:::i;:::-;31301:8;;31268:22;;-1:-1:-1;;;;;;31301:8:0;31297:1089;;31341:12;;31337:269;;31371:5;;:43;;-1:-1:-1;;;31371:43:0;;-1:-1:-1;;;;;31371:5:0;;;;:24;;:43;;31396:7;;31405:8;;31371:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;31430:27:0;;;;;;:16;:27;;;;;:39;;31461:8;;31430:27;:39;;31461:8;;31430:39;:::i;:::-;;;;-1:-1:-1;;31565:8:0;;31543:50;;687:25:1;;;-1:-1:-1;;;;;31543:50:0;;;;31565:8;;31553:10;;-1:-1:-1;;;;;;;;;;;31543:50:0;675:2:1;660:18;31543:50:0;;;;;;;31337:269;31621:12;;31617:269;;31651:5;;:43;;-1:-1:-1;;;31651:43:0;;-1:-1:-1;;;;;31651:5:0;;;;:24;;:43;;31676:7;;31685:8;;31651:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;31710:27:0;;;;;;:16;:27;;;;;:39;;31741:8;;31710:27;:39;;31741:8;;31710:39;:::i;:::-;;;;-1:-1:-1;;31845:8:0;;31823:50;;687:25:1;;;-1:-1:-1;;;;;31823:50:0;;;;31845:8;;31833:10;;-1:-1:-1;;;;;;;;;;;31823:50:0;675:2:1;660:18;31823:50:0;;;;;;;31617:269;31297:1089;;;31951:8;;31926:44;;-1:-1:-1;;;31926:44:0;;-1:-1:-1;;;;;31926:24:0;;;;;;:44;;31951:8;;;;31961;;31926:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32007:8:0;;31982:44;;-1:-1:-1;;;31982:44:0;;-1:-1:-1;;;;;31982:24:0;;;;;;:44;;32007:8;;;;32017;;31982:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32068:8:0;;32046:50;;687:25:1;;;-1:-1:-1;;;;;32046:50:0;;;;32068:8;;32056:10;;-1:-1:-1;;;;;;;;;;;32046:50:0;675:2:1;660:18;32046:50:0;;;;;;;32138:8;;32116:50;;687:25:1;;;-1:-1:-1;;;;;32116:50:0;;;;32138:8;;32126:10;;-1:-1:-1;;;;;;;;;;;32116:50:0;675:2:1;660:18;32116:50:0;;;;;;;-1:-1:-1;;;;;32181:27:0;;;;;;:16;:27;;;;;:39;;32212:8;;32181:27;:39;;32212:8;;32181:39;:::i;:::-;;;;-1:-1:-1;;;;;;;32285:27:0;;;;;;:16;:27;;;;;:39;;32316:8;;32285:27;:39;;32316:8;;32285:39;:::i;:::-;;;;-1:-1:-1;;31297:1089:0;32398:27;;;;;;27768:4665;;:::o;10570:204::-;10697:68;;-1:-1:-1;;;;;18255:15:1;;;10697:68:0;;;18237:34:1;18307:15;;18287:18;;;18280:43;18339:18;;;18332:34;;;10671:95:0;;10690:5;;-1:-1:-1;;;10720:27:0;18172:18:1;;10697:68:0;17997:375:1;10671:95:0;10570:204;;;;:::o;24129:666::-;10133:1;10116:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;10145:20:0;10168:13;;;24227:7;;36262:483:::1;36279:12;:19:::0;36275:23;::::1;36262:483;;;36320:13;36336:12;36349:1;36336:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;36336:15:0::1;::::0;-1:-1:-1;36407:21:0::1;36336:15:::0;36407:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;36366:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:62:::0;36478:31:::1;36377:5:::0;36478:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;36443:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;36528:21;::::1;::::0;36524:210:::1;;36596:24;36605:7;36614:5;36596:8;:24::i;:::-;-1:-1:-1::0;;;;;36570:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;36680:10:::1;:17:::0;;;;;:38:::1;::::0;;::::1;::::0;36639:31;;;;;;;;:38;;;;;;;;;;:79;36524:210:::1;-1:-1:-1::0;36300:3:0;::::1;::::0;::::1;:::i;:::-;;;;36262:483;;;;24252:6:::2;24247:518;24264:7;:14;24260:1;:18;24247:518;;;24300:21;24324:7;24332:1;24324:10;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;-1:-1:-1;;;;;24367:16:0;;::::2;24349:15;24367:16:::0;;;:7:::2;:16:::0;;;;;;:31;;::::2;::::0;;;;;;;;;;24324:10;;-1:-1:-1;24417:11:0;;24413:341:::2;;-1:-1:-1::0;;;;;24449:16:0;;::::2;24483:1;24449:16:::0;;;:7:::2;:16;::::0;;;;;;;:31;;::::2;::::0;;;;;;;;;:35;24503:52:::2;::::0;24457:7;24547;24503:34:::2;:52::i;:::-;24607:7;-1:-1:-1::0;;;;;24579:45:0::2;24592:13;-1:-1:-1::0;;;;;24579:45:0::2;;24616:7;24579:45;;;;687:25:1::0;;675:2;660:18;;541:177;24579:45:0::2;;;;;;;;-1:-1:-1::0;;;;;24643:22:0;::::2;;::::0;;;:7:::2;:22;::::0;;;;:33;;24669:7;;24643:22;:33:::2;::::0;24669:7;;24643:33:::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;24695:17:0;;::::2;;::::0;;;:8:::2;:17;::::0;;;;;;;:32;;::::2;::::0;;;;;;;;:43;;24731:7;;24695:17;:43:::2;::::0;24731:7;;24695:43:::2;:::i;:::-;::::0;;;-1:-1:-1;;24413:341:0::2;24285:480;;24280:3;;;;;:::i;:::-;;;;24247:518;;;;24775:12;:10;:12::i;8937:106::-:0;8995:7;9026:1;9022;:5;:13;;9034:1;9022:13;;;-1:-1:-1;9030:1:0;;8937:106;-1:-1:-1;8937:106:0:o;12380:1114::-;-1:-1:-1;;;;;12984:25:0;;8605:20;12976:71;;;;-1:-1:-1;;;12976:71:0;;18579:2:1;12976:71:0;;;18561:21:1;18618:2;18598:18;;;18591:30;18657:33;18637:18;;;18630:61;18708:18;;12976:71:0;18377:355:1;12976:71:0;13121:12;13135:23;13170:5;-1:-1:-1;;;;;13162:19:0;13182:4;13162:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13120:67;;;;13206:7;13198:52;;;;-1:-1:-1;;;13198:52:0;;19370:2:1;13198:52:0;;;19352:21:1;;;19389:18;;;19382:30;19448:34;19428:18;;;19421:62;19500:18;;13198:52:0;19168:356:1;13198:52:0;13267:17;;:21;13263:224;;13409:10;13398:30;;;;;;;;;;;;:::i;:::-;13390:85;;;;-1:-1:-1;;;13390:85:0;;19731:2:1;13390:85:0;;;19713:21:1;19770:2;19750:18;;;19743:30;19809:34;19789:18;;;19782:62;-1:-1:-1;;;19860:18:1;;;19853:40;19910:19;;13390:85:0;19529:406:1;14:131;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:247::-;348:6;401:2;389:9;380:7;376:23;372:32;369:52;;;417:1;414;407:12;369:52;456:9;443:23;475:31;500:5;475:31;:::i;723:388::-;791:6;799;852:2;840:9;831:7;827:23;823:32;820:52;;;868:1;865;858:12;820:52;907:9;894:23;926:31;951:5;926:31;:::i;:::-;976:5;-1:-1:-1;1033:2:1;1018:18;;1005:32;1046:33;1005:32;1046:33;:::i;:::-;1098:7;1088:17;;;723:388;;;;;:::o;1116:118::-;1202:5;1195:13;1188:21;1181:5;1178:32;1168:60;;1224:1;1221;1214:12;1239:241;1295:6;1348:2;1336:9;1327:7;1323:23;1319:32;1316:52;;;1364:1;1361;1354:12;1316:52;1403:9;1390:23;1422:28;1444:5;1422:28;:::i;1714:315::-;1782:6;1790;1843:2;1831:9;1822:7;1818:23;1814:32;1811:52;;;1859:1;1856;1849:12;1811:52;1898:9;1885:23;1917:31;1942:5;1917:31;:::i;:::-;1967:5;2019:2;2004:18;;;;1991:32;;-1:-1:-1;;;1714:315:1:o;2034:180::-;2093:6;2146:2;2134:9;2125:7;2121:23;2117:32;2114:52;;;2162:1;2159;2152:12;2114:52;-1:-1:-1;2185:23:1;;2034:180;-1:-1:-1;2034:180:1:o;2219:127::-;2280:10;2275:3;2271:20;2268:1;2261:31;2311:4;2308:1;2301:15;2335:4;2332:1;2325:15;2351:908;2405:5;2458:3;2451:4;2443:6;2439:17;2435:27;2425:55;;2476:1;2473;2466:12;2425:55;2512:6;2499:20;2538:4;2561:18;2598:2;2594;2591:10;2588:36;;;2604:18;;:::i;:::-;2650:2;2647:1;2643:10;2682:2;2676:9;2745:2;2741:7;2736:2;2732;2728:11;2724:25;2716:6;2712:38;2800:6;2788:10;2785:22;2780:2;2768:10;2765:18;2762:46;2759:72;;;2811:18;;:::i;:::-;2847:2;2840:22;2897:18;;;2973:15;;;2969:24;;;2931:15;;;;-1:-1:-1;3005:15:1;;;3002:35;;;3033:1;3030;3023:12;3002:35;3069:2;3061:6;3057:15;3046:26;;3081:148;3097:6;3092:3;3089:15;3081:148;;;3163:23;3182:3;3163:23;:::i;:::-;3151:36;;3207:12;;;;3114;;;;3081:148;;;3247:6;2351:908;-1:-1:-1;;;;;;;2351:908:1:o;3264:483::-;3357:6;3365;3418:2;3406:9;3397:7;3393:23;3389:32;3386:52;;;3434:1;3431;3424:12;3386:52;3473:9;3460:23;3492:31;3517:5;3492:31;:::i;:::-;3542:5;-1:-1:-1;3598:2:1;3583:18;;3570:32;3625:18;3614:30;;3611:50;;;3657:1;3654;3647:12;3611:50;3680:61;3733:7;3724:6;3713:9;3709:22;3680:61;:::i;:::-;3670:71;;;3264:483;;;;;:::o;4954:348::-;5038:6;5091:2;5079:9;5070:7;5066:23;5062:32;5059:52;;;5107:1;5104;5097:12;5059:52;5147:9;5134:23;5180:18;5172:6;5169:30;5166:50;;;5212:1;5209;5202:12;5166:50;5235:61;5288:7;5279:6;5268:9;5264:22;5235:61;:::i;5737:456::-;5814:6;5822;5830;5883:2;5871:9;5862:7;5858:23;5854:32;5851:52;;;5899:1;5896;5889:12;5851:52;5935:9;5922:23;5912:33;;5995:2;5984:9;5980:18;5967:32;6008:31;6033:5;6008:31;:::i;:::-;6058:5;-1:-1:-1;6115:2:1;6100:18;;6087:32;6128:33;6087:32;6128:33;:::i;:::-;6180:7;6170:17;;;5737:456;;;;;:::o;6198:::-;6275:6;6283;6291;6344:2;6332:9;6323:7;6319:23;6315:32;6312:52;;;6360:1;6357;6350:12;6312:52;6399:9;6386:23;6418:31;6443:5;6418:31;:::i;:::-;6468:5;-1:-1:-1;6525:2:1;6510:18;;6497:32;6538:33;6497:32;6538:33;:::i;:::-;6198:456;;6590:7;;-1:-1:-1;;;6644:2:1;6629:18;;;;6616:32;;6198:456::o;6912:251::-;6982:6;7035:2;7023:9;7014:7;7010:23;7006:32;7003:52;;;7051:1;7048;7041:12;7003:52;7083:9;7077:16;7102:31;7127:5;7102:31;:::i;7168:337::-;7370:2;7352:21;;;7409:2;7389:18;;;7382:30;-1:-1:-1;;;7443:2:1;7428:18;;7421:43;7496:2;7481:18;;7168:337::o;8214:274::-;-1:-1:-1;;;;;8406:32:1;;;;8388:51;;8470:2;8455:18;;8448:34;8376:2;8361:18;;8214:274::o;8493:245::-;8560:6;8613:2;8601:9;8592:7;8588:23;8584:32;8581:52;;;8629:1;8626;8619:12;8581:52;8661:9;8655:16;8680:28;8702:5;8680:28;:::i;9459:127::-;9520:10;9515:3;9511:20;9508:1;9501:31;9551:4;9548:1;9541:15;9575:4;9572:1;9565:15;9591:128;9631:3;9662:1;9658:6;9655:1;9652:13;9649:39;;;9668:18;;:::i;:::-;-1:-1:-1;9704:9:1;;9591:128::o;9724:127::-;9785:10;9780:3;9776:20;9773:1;9766:31;9816:4;9813:1;9806:15;9840:4;9837:1;9830:15;9856:135;9895:3;-1:-1:-1;;9916:17:1;;9913:43;;;9936:18;;:::i;:::-;-1:-1:-1;9983:1:1;9972:13;;9856:135::o;10342:355::-;10544:2;10526:21;;;10583:2;10563:18;;;10556:30;10622:33;10617:2;10602:18;;10595:61;10688:2;10673:18;;10342:355::o;11380:184::-;11450:6;11503:2;11491:9;11482:7;11478:23;11474:32;11471:52;;;11519:1;11516;11509:12;11471:52;-1:-1:-1;11542:16:1;;11380:184;-1:-1:-1;11380:184:1:o;12555:125::-;12595:4;12623:1;12620;12617:8;12614:34;;;12628:18;;:::i;:::-;-1:-1:-1;12665:9:1;;12555:125::o;12685:127::-;12746:10;12741:3;12737:20;12734:1;12727:31;12777:4;12774:1;12767:15;12801:4;12798:1;12791:15;15849:168;15889:7;15955:1;15951;15947:6;15943:14;15940:1;15937:21;15932:1;15925:9;15918:17;15914:45;15911:71;;;15962:18;;:::i;:::-;-1:-1:-1;16002:9:1;;15849:168::o;16022:217::-;16062:1;16088;16078:132;;16132:10;16127:3;16123:20;16120:1;16113:31;16167:4;16164:1;16157:15;16195:4;16192:1;16185:15;16078:132;-1:-1:-1;16224:9:1;;16022:217::o;17357:245::-;17436:6;17444;17497:2;17485:9;17476:7;17472:23;17468:32;17465:52;;;17513:1;17510;17503:12;17465:52;-1:-1:-1;;17536:16:1;;17592:2;17577:18;;;17571:25;17536:16;;17571:25;;-1:-1:-1;17357:245:1:o;17607:385::-;17686:6;17694;17747:2;17735:9;17726:7;17722:23;17718:32;17715:52;;;17763:1;17760;17753:12;17715:52;17795:9;17789:16;17814:31;17839:5;17814:31;:::i;:::-;17914:2;17899:18;;17893:25;17864:5;;-1:-1:-1;17927:33:1;17893:25;17927:33;:::i;18737:426::-;18866:3;18904:6;18898:13;18929:1;18939:129;18953:6;18950:1;18947:13;18939:129;;;19051:4;19035:14;;;19031:25;;19025:32;19012:11;;;19005:53;18968:12;18939:129;;;19086:6;19083:1;19080:13;19077:48;;;19121:1;19112:6;19107:3;19103:16;19096:27;19077:48;-1:-1:-1;19141:16:1;;;;;18737:426;-1:-1:-1;;18737:426:1:o
Swarm Source
ipfs://c364d76e504becae19e540512d87a614a74ddb23318737b92db9271b21739227
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.