Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0xc381e9d8406aa5b4cf26943641131f88ef38628b4d5072494661060560c1811f | 57874205 | 5 days 43 mins ago | 0xce63c53547f340bdc72ab8a0755514055d443b02 | 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-18 */ /** * EQUALIZER EXCHANGE * The New Liquidity Hub of Fantom chain! * https://equalizer.exchange (Dapp) * https://discord.gg/MaMhbgHMby (Community) * * * Version: 1.5.1 * - Backwards-compatibility with version < v1.4.0 * - periodFinish(<token>) * - rewardRate(<token>) * - lastUpdateTime(<token>) * - _ve() * - "Enhanced" Taxable Fee-Claims (This is NOT deposit/withdraw fee!) * - Ability to introduce Protocol Fees * * * 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 (This is NOT deposit/withdraw fee!) * - 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 protocolFeesTaker() external view returns (address); function attachTokenToGauge(uint _tokenId, address account) external; function attachable() external view returns (bool); function protocolFeesPerMillion() external view returns (uint); 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 stake; 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 ) { stake = 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; } /* ========== BACKWARDS-COMPATIBLE VIEW FUNCTIONS ========== */ function _ve() external view returns (address) { return address(ve); } function periodFinish(address _tkn) external view returns (uint) { return rewardData[_tkn].periodFinish; } function rewardRate(address _tkn) external view returns (uint) { return rewardData[_tkn].rewardRate; } function lastUpdateTime(address _tkn) external view returns (uint) { return rewardData[_tkn].lastUpdateTime; } /* ========== 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); stake.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); stake.safeTransferFrom(msg.sender, address(this), amount); emit Deposit(_user, amount); _claimFees(); } function depositAll() external { deposit(stake.balanceOf(msg.sender)); } function depositAllFor(address _user) external { depositFor(_user, stake.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); stake.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(stake), "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) { uint _pfpm = voter.protocolFeesPerMillion(); address _pft = _pfpm > 0 ? voter.protocolFeesTaker() : address(0); /// 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(stake)).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]) { ///Protocol Fees if( ( (_a - _brewbals[_n]) * _pfpm) / 1e6 > 0) { _brews[_n].transfer(_pft, ( (_a.sub(_brewbals[_n])) * _pfpm) / 1e6 ); emit ProtocolFees(msg.sender,_pft,address(_brews[_n]),((_a.sub(_brewbals[_n])) * _pfpm) / 1e6); _a = _brews[_n].balanceOf(address(this)); } ///Normal Fees -> Bribe if (feeTaker == address(0)) { bribe.notifyRewardAmount( address(_brews[_n]), (_a.sub(_brewbals[_n])) ); emit ClaimFees(msg.sender, address(bribe), address(_brews[_n]), (_a - _brewbals[_n]) ); totalFeesPayouts[ address(_brews[_n]) ] += (_a - _brewbals[_n]); } ///Re-channeled Fees -> FeesTaker else { _brews[_n].transfer(feeTaker, (_a.sub(_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(stake)).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(stake)).claimFees(); claimed0 = IERC20(_token0).balanceOf(address(this)) - t0bb; claimed1 = IERC20(_token1).balanceOf(address(this)) - t1bb; //claimed0 = t0ba - t0bb; //claimed1 = t1ba - t1bb; ///ProtocolFees if( ( claimed0 * _pfpm) / 1e6 > 0) { IERC20(_token0).transfer(_pft, (claimed0*_pfpm)/1e6 ); emit ProtocolFees(msg.sender,_token0,_pft,(claimed0*_pfpm)/1e6); claimed0 = IERC20(_token0).balanceOf(address(this)).sub(t0bb); } if( ( claimed1 * _pfpm) / 1e6 > 0) { IERC20(_token1).transfer(_pft, (claimed1*_pfpm)/1e6 ); emit ProtocolFees(msg.sender,_token1,_pft,(claimed1*_pfpm)/1e6); claimed1 = IERC20(_token1).balanceOf(address(this)).sub(t1bb); } ///Normal Fees -> Bribe 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); } } ///Re-channeled Fees -> FeesTaker 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(stake), "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(stake)) { /// 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 = (stake.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(stake), "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 ProtocolFees(address indexed initiator, address indexed taker, address indexed token, uint amount); 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":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"taker","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProtocolFees","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":[],"name":"_ve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"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":"_tkn","type":"address"}],"name":"lastUpdateTime","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":"_tkn","type":"address"}],"name":"periodFinish","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":"address","name":"_tkn","type":"address"}],"name":"rewardRate","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":"stake","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
60806040523480156200001157600080fd5b506040516200544938038062005449833981016040819052620000349162000527565b600160008181558154610100600160a81b0319166101006001600160a01b038a81169190910291909117909255600b80546001600160a01b031990811689851617909155600c8054909116878416179055600d80549286166001600160a81b031990931692909217600160a01b85151502179091555b8151811015620002655760006001600160a01b0316828281518110620000d457620000d462000658565b60200260200101516001600160a01b031614620002505760016007600084848151811062000106576200010662000658565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555060038282815181106200015c576200015c62000658565b6020908102919091018101518254600181018455600093845291832090910180546001600160a01b0319166001600160a01b0390921691909117905582518591600291859085908110620001b457620001b462000658565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555062093a806002600084848151811062000220576200022062000658565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600101819055505b806200025c816200066e565b915050620000aa565b508115620004d757600080876001600160a01b0316639d63848a6040518163ffffffff1660e01b81526004016040805180830381600087803b158015620002ab57600080fd5b505af1158015620002c0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e6919062000698565b60405163095ea7b360e01b81526001600160a01b038a8116600483015260001960248301529294509092509083169063095ea7b390604401602060405180830381600087803b1580156200033957600080fd5b505af11580156200034e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003749190620006d0565b5060405163095ea7b360e01b81526001600160a01b038881166004830152600019602483015282169063095ea7b390604401602060405180830381600087803b158015620003c157600080fd5b505af1158015620003d6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003fc9190620006d0565b5060048054600181810183557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b91820180546001600160a01b038088166001600160a01b031992831681179093558554808501909655949093018054868616941684179055600081815260086020526040808220805460ff19908116861790915594825280822080549095168417909455925191938b16929091600080516020620054298339815191529190a46040516001906001600160a01b03808a1691908416906000805160206200542983398151915290600090a450505b505050505050620006f5565b80516001600160a01b0381168114620004fb57600080fd5b919050565b80518015158114620004fb57600080fd5b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c087890312156200054157600080fd5b6200054c87620004e3565b955060206200055d818901620004e3565b95506200056d60408901620004e3565b94506200057d60608901620004e3565b93506200058d6080890162000500565b60a08901519093506001600160401b0380821115620005ab57600080fd5b818a0191508a601f830112620005c057600080fd5b815181811115620005d557620005d562000511565b8060051b604051601f19603f83011681018181108582111715620005fd57620005fd62000511565b60405291825284820192508381018501918d8311156200061c57600080fd5b938501935b8285101562000645576200063585620004e3565b8452938501939285019262000621565b8096505050505050509295509295509295565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200069157634e487b7160e01b600052601160045260246000fd5b5060010190565b60008060408385031215620006ac57600080fd5b620006b783620004e3565b9150620006c760208401620004e3565b90509250929050565b600060208284031215620006e357600080fd5b620006ee8262000500565b9392505050565b614d2480620007056000396000f3fe608060405234801561001057600080fd5b50600436106103275760003560e01c80635a6e6eab116101b8578063b66503cf11610104578063de5f6268116100a2578063e70b9e271161007c578063e70b9e271461081e578063e9fad8ee14610849578063f122977714610851578063f5ae22401461086457600080fd5b8063de5f6268146107fa578063e574821314610802578063e68863961461081657600080fd5b8063d0ed26ae116100de578063d0ed26ae1461077a578063d294f0931461078d578063da09d19d146107aa578063dd501205146107d757600080fd5b8063b66503cf14610741578063b6b55f2514610754578063bcd110141461076757600080fd5b8063749f1044116101715780638a5011001161014b5780638a501100146107025780638dd598fb146107155780638f27f1041461072657806399bcc0521461072e57600080fd5b8063749f1044146106d45780637bb7bed1146106e7578063853828b6146106fa57600080fd5b80635a6e6eab1461062d5780635c975abb14610640578063638634ee1461064d57806365bcfbe7146106605780637035ab981461068057806370a08231146106ab57600080fd5b80632f4f21e2116102775780633f695b45116102305780634d5ce0381161020a5780634d5ce038146105c15780634ec5908d146105f457806352f18405146106075780635557cc611461061a57600080fd5b80633f695b451461051557806346c96aac1461052857806348e5d9f81461053b57600080fd5b80632f4f21e2146104a95780633010d8ef146104bc57806331279d3d146104cf57806337d0208c146104e25780633a4b66f1146104f55780633d18b9121461050d57600080fd5b80631f850716116102e45780632378bea6116102be5780632378bea61461042c5780632af2cecc1461043f5780632ce9aead1461046a5780632e1a7d4d1461049657600080fd5b80631f850716146103c2578063211dc32d146103ed578063221ca18c1461040057600080fd5b8063023df7671461032c5780630efeb2fb14610341578063102a7ad41461037457806315ae92f71461038757806316c38b3c146103a757806318160ddd146103ba575b600080fd5b61033f61033a366004614823565b610877565b005b61036161034f366004614823565b60106020526000908152604090205481565b6040519081526020015b60405180910390f35b610361610382366004614840565b610b16565b610361610395366004614823565b60126020526000908152604090205481565b61033f6103b5366004614887565b610bb1565b600954610361565b600c546103d5906001600160a01b031681565b6040516001600160a01b03909116815260200161036b565b6103616103fb366004614840565b610c7c565b61036161040e366004614823565b6001600160a01b031660009081526002602052604090206003015490565b61033f61043a3660046148a4565b610c88565b61036161044d366004614840565b601160209081526000928352604080842090915290825290205481565b610361610478366004614823565b6001600160a01b031660009081526002602052604090206004015490565b61033f6104a43660046148d0565b610e57565b61033f6104b73660046148a4565b611070565b61033f6104ca366004614823565b6112dc565b61033f6104dd3660046149a1565b611364565b600b546103d5906001600160a01b031681565b6001546103d59061010090046001600160a01b031681565b61033f61142f565b61033f610523366004614840565b6116b7565b600d546103d5906001600160a01b031681565b61058a610549366004614823565b60026020819052600091825260409091208054600182015492820154600383015460048401546005909401546001600160a01b039093169493919290919086565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161036b565b6105e46105cf366004614823565b60076020526000908152604090205460ff1681565b604051901515815260200161036b565b61033f610602366004614823565b61179d565b61033f6106153660046149f1565b611877565b61033f610628366004614823565b61196f565b61033f61063b3660046149f1565b611d24565b6001546105e49060ff1681565b61036161065b366004614823565b611e1c565b61036161066e366004614823565b600f6020526000908152604090205481565b61036161068e366004614840565b600560209081526000928352604080842090915290825290205481565b6103616106b9366004614823565b6001600160a01b03166000908152600a602052604090205490565b600e546103d5906001600160a01b031681565b6103d56106f53660046148d0565b611e43565b61033f611e6d565b61033f610710366004614a26565b611e88565b600c546001600160a01b03166103d5565b600454610361565b61036161073c366004614823565b61210f565b61033f61074f3660046148a4565b612190565b61033f6107623660046148d0565b612793565b610361610775366004614823565b6129b2565b61033f610788366004614a68565b6129de565b610795612c00565b6040805192835260208301919091520161036b565b6103616107b8366004614823565b6001600160a01b03166000908152600260208190526040909120015490565b6105e46107e5366004614823565b60086020526000908152604090205460ff1681565b61033f612c4f565b600d546105e490600160a01b900460ff1681565b600354610361565b61036161082c366004614840565b600660209081526000928352604080842090915290825290205481565b61033f612cd1565b61036161085f366004614823565b612cf2565b6103d56108723660046148d0565b612d94565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156108c757600080fd5b505af11580156108db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff9190614aa9565b6001600160a01b0316336001600160a01b0316146109385760405162461bcd60e51b815260040161092f90614ac6565b60405180910390fd5b6001600160a01b03811660009081526008602052604090205460ff16156109975760405162461bcd60e51b8152602060048201526013602482015272427269626520546f6b656e204163746976652160681b604482015260640161092f565b6001546001600160a01b038281166101009092041614156109fa5760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f74206272696265207374616b696e6720746f6b656e210000000000604482015260640161092f565b600b5460405163095ea7b360e01b81526001600160a01b038381169263095ea7b392610a30929091169060001990600401614aed565b602060405180830381600087803b158015610a4a57600080fd5b505af1158015610a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a829190614b06565b506004805460018082019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b03848116918217909255600081815260086020526040808220805460ff191686179055600b5490519316927f6f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d059190a450565b6001600160a01b038083166000818152600660209081526040808320948616808452948252808320549383526005825280832094835293905291822054610ba89190610ba290670de0b6b3a764000090610b9c90610b7d90610b7789612cf2565b90612da4565b6001600160a01b0389166000908152600a602052604090205490612e0a565b90612e89565b90612ee6565b90505b92915050565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610c0157600080fd5b505af1158015610c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c399190614aa9565b6001600160a01b0316336001600160a01b031614610c695760405162461bcd60e51b815260040161092f90614ac6565b6001805460ff1916911515919091179055565b6000610ba88284610b16565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610cd857600080fd5b505af1158015610cec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d109190614aa9565b6001600160a01b0316336001600160a01b031614610d405760405162461bcd60e51b815260040161092f90614ac6565b6001600160a01b038216600090815260026020819052604090912001544211610dab5760405162461bcd60e51b815260206004820152601a60248201527f52657761726420706572696f64207374696c6c20616374697665000000000000604482015260640161092f565b60008111610dfb5760405162461bcd60e51b815260206004820181905260248201527f526577617264206475726174696f6e206d757374206265206e6f6e2d7a65726f604482015260640161092f565b6001600160a01b03821660008181526002602052604090819020600101839055517fad2f86b01ed93b4b3a150d448c61a4f5d8d38075d3c0c64cc0a26fd6e1f4954590610e4b9084815260200190565b60405180910390a25050565b6001600080828254610e699190614b39565b9091555050600080549033905b600354811015610f6b57600060038281548110610e9557610e95614b51565b6000918252602090912001546001600160a01b03169050610eb581612cf2565b6001600160a01b038216600090815260026020526040902060050155610eda81611e1c565b6001600160a01b03808316600090815260026020526040902060040191909155831615610f5857610f0b8382610b16565b6001600160a01b0380851660008181526006602090815260408083209487168084529482528083209590955560028152848220600590810154938352815284822093825292909252919020555b5080610f6381614b67565b915050610e76565b5060008311610fb05760405162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015260640161092f565b600954610fbd9084612da4565b600955336000908152600a6020526040902054610fda9084612da4565b336000818152600a602052604090209190915560015461100a916101009091046001600160a01b03169085612f45565b60405183815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5906020015b60405180910390a2611048612f9b565b505050600054811461106c5760405162461bcd60e51b815260040161092f90614b82565b5050565b60016000808282546110829190614b39565b909155505060005460015460ff16156110c75760405162461bcd60e51b81526020600482015260076024820152665061757365642160c81b604482015260640161092f565b8260005b6003548110156111c0576000600382815481106110ea576110ea614b51565b6000918252602090912001546001600160a01b0316905061110a81612cf2565b6001600160a01b03821660009081526002602052604090206005015561112f81611e1c565b6001600160a01b038083166000908152600260205260409020600401919091558316156111ad576111608382610b16565b6001600160a01b0380851660008181526006602090815260408083209487168084529482528083209590955560028152848220600590810154938352815284822093825292909252919020555b50806111b881614b67565b9150506110cb565b50600083116112025760405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015260640161092f565b60095461120f9084612ee6565b6009556001600160a01b0384166000908152600a60205260409020546112359084612ee6565b6001600160a01b038086166000908152600a602052604090209190915560015461126891610100909104163330866143b1565b836001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c846040516112a391815260200190565b60405180910390a26112b3612f9b565b50505060005481146112d75760405162461bcd60e51b815260040161092f90614b82565b505050565b6001546040516370a0823160e01b81523360048201526113619183916101009091046001600160a01b0316906370a082319060240160206040518083038186803b15801561132957600080fd5b505afa15801561133d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b79190614bb9565b50565b336001600160a01b03831614806113855750600d546001600160a01b031633145b6113c85760405162461bcd60e51b8152602060048201526014602482015273556e2d617574686f72697a656420636c61696d2160601b604482015260640161092f565b600d546040516363453ae160e01b81523060048201526001600160a01b03909116906363453ae190602401600060405180830381600087803b15801561140d57600080fd5b505af1158015611421573d6000803e3d6000fd5b5050505061106c82826143ef565b60016000808282546114419190614b39565b9091555050600080549033905b6003548110156115435760006003828154811061146d5761146d614b51565b6000918252602090912001546001600160a01b0316905061148d81612cf2565b6001600160a01b0382166000908152600260205260409020600501556114b281611e1c565b6001600160a01b03808316600090815260026020526040902060040191909155831615611530576114e38382610b16565b6001600160a01b0380851660008181526006602090815260408083209487168084529482528083209590955560028152848220600590810154938352815284822093825292909252919020555b508061153b81614b67565b91505061144e565b5060005b60035481101561168a5760006003828154811061156657611566614b51565b60009182526020808320909101543383526006825260408084206001600160a01b03909216808552919092529120549091508015611675573360008181526006602090815260408083206001600160a01b03871680855292528220919091556115cf9183612f45565b6040518181526001600160a01b0383169033907f9aa05b3d70a9e3e2f004f039648839560576334fb45c81f91b6db03ad9e2efc99060200160405180910390a36001600160a01b0382166000908152600f602052604081208054839290611637908490614b39565b90915550503360009081526011602090815260408083206001600160a01b03861684529091528120805483929061166f908490614b39565b90915550505b5050808061168290614b67565b915050611547565b50611693612f9b565b50505060005481146113615760405162461bcd60e51b815260040161092f90614b82565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561170757600080fd5b505af115801561171b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173f9190614aa9565b6001600160a01b0316336001600160a01b03161461176f5760405162461bcd60e51b815260040161092f90614ac6565b6001600160a01b03918216600090815260026020526040902080546001600160a01b03191691909216179055565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156117ed57600080fd5b505af1158015611801573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118259190614aa9565b6001600160a01b0316336001600160a01b0316146118555760405162461bcd60e51b815260040161092f90614ac6565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156118c757600080fd5b505af11580156118db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ff9190614aa9565b6001600160a01b0316336001600160a01b03161461192f5760405162461bcd60e51b815260040161092f90614ac6565b60005b815181101561106c5761195d82828151811061195057611950614b51565b6020026020010151610877565b8061196781614b67565b915050611932565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156119bf57600080fd5b505af11580156119d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f79190614aa9565b6001600160a01b0316336001600160a01b031614611a275760405162461bcd60e51b815260040161092f90614ac6565b6001600160a01b03811660009081526008602052604090205460ff161515600114611a8c5760405162461bcd60e51b8152602060048201526015602482015274427269626520546f6b656e20496e6163746976652160581b604482015260640161092f565b600b5460405163095ea7b360e01b81526001600160a01b038381169263095ea7b392611ac19290911690600090600401614aed565b602060405180830381600087803b158015611adb57600080fd5b505af1158015611aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b139190614b06565b5060048054906001600160a01b03831690611b2f600184614bd2565b81548110611b3f57611b3f614b51565b6000918252602090912001546001600160a01b03161415611bb2576004805480611b6b57611b6b614be9565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841682526008905260409020805460ff19169055611ce2565b60005b600454611bc490600190614bd2565b811015611ce057826001600160a01b031660048281548110611be857611be8614b51565b6000918252602090912001546001600160a01b03161415611cce576004611c10600184614bd2565b81548110611c2057611c20614b51565b600091825260209091200154600480546001600160a01b039092169183908110611c4c57611c4c614b51565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506004805480611c8b57611c8b614be9565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03851682526008905260409020805460ff191690555b80611cd881614b67565b915050611bb5565b505b600b546040516000916001600160a01b0390811691908516907f6f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d05908490a45050565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611d7457600080fd5b505af1158015611d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dac9190614aa9565b6001600160a01b0316336001600160a01b031614611ddc5760405162461bcd60e51b815260040161092f90614ac6565b60005b815181101561106c57611e0a828281518110611dfd57611dfd614b51565b602002602001015161196f565b80611e1481614b67565b915050611ddf565b6001600160a01b038116600090815260026020819052604082200154610bab904290614668565b60038181548110611e5357600080fd5b6000918252602090912001546001600160a01b0316905081565b336000908152600a6020526040902054611e8690610e57565b565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611ed857600080fd5b505af1158015611eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f109190614aa9565b6001600160a01b0316336001600160a01b031614611f405760405162461bcd60e51b815260040161092f90614ac6565b6001546001600160a01b03838116610100909204161415612046576009546001546040516370a0823160e01b8152306004820152600092611fe79290916101009091046001600160a01b0316906370a08231906024015b60206040518083038186803b158015611faf57600080fd5b505afa158015611fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b779190614bb9565b9050808411156120445760405162461bcd60e51b815260206004820152602260248201527f5265736375696e672055736572204465706f736974732050726f686962697465604482015261642160f01b606482015260840161092f565b505b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906120749084908790600401614aed565b602060405180830381600087803b15801561208e57600080fd5b505af11580156120a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c69190614b06565b50816001600160a01b03167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288460405161210291815260200190565b60405180910390a2505050565b6001600160a01b038116600090815260026020819052604082200154421061213957506000919050565b6001600160a01b03821660009081526002602081905260408220015461215f9042612da4565b6001600160a01b038416600090815260026020526040902060030154909150612189908290612e0a565b9392505050565b60016000808282546121a29190614b39565b90915550506000805490805b6003548110156122a3576000600382815481106121cd576121cd614b51565b6000918252602090912001546001600160a01b031690506121ed81612cf2565b6001600160a01b03821660009081526002602052604090206005015561221281611e1c565b6001600160a01b03808316600090815260026020526040902060040191909155831615612290576122438382610b16565b6001600160a01b0380851660008181526006602090815260408083209487168084529482528083209590955560028152848220600590810154938352815284822093825292909252919020555b508061229b81614b67565b9150506121ae565b506001546001600160a01b038581166101009092041614156123185760405162461bcd60e51b815260206004820152602860248201527f43616e27742064697374726962757465207374616b656420746f6b656e206173604482015267207265776172642160c01b606482015260840161092f565b6001600160a01b03841660009081526007602052604090205460ff166123715760405162461bcd60e51b815260206004820152600e60248201526d4e6f74206120726577617264212160901b604482015260640161092f565b612379612f9b565b50506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a082319060240160206040518083038186803b1580156123bd57600080fd5b505afa1580156123d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f59190614bb9565b905061240c6001600160a01b0386163330876143b1565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b15801561244e57600080fd5b505afa158015612462573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124869190614bb9565b90506124928282614bd2565b9450600085116124f25760405162461bcd60e51b815260206004820152602560248201527f52657761726420616d6f756e74206d7573742062652067726561746572207468604482015264616e20302160d81b606482015260840161092f565b6001600160a01b03861660009081526002602081905260409091200154421061255d576001600160a01b03861660009081526002602052604090206001015461253c908690612e89565b6001600160a01b0387166000908152600260205260409020600301556126bc565b6001600160a01b03861660009081526002602081905260408220600381015491015490919061258c9042612da4565b6001600160a01b038916600090815260026020526040812060030154919250906125b7908390612e0a565b6001600160a01b038a166000908152600260205260409020600101549091506125e490610b9c8a84612ee6565b6001600160a01b038a8116600090815260026020526040902060030191909155600d54163314158061263057506001600160a01b03898116600090815260026020526040902054163314155b156126b8576001600160a01b0389166000908152600260205260409020600301548311158061265e57508088115b6126b85760405162461bcd60e51b815260206004820152602560248201527f456e68616e636564204772696566696e672050726f74656374696f6e20456e61604482015264626c65642160d81b606482015260840161092f565b5050505b6001600160a01b038616600090815260026020526040902042600482018190556001909101546126ec9190612ee6565b6001600160a01b038716600081815260026020818152604092839020909101939093555187815233927f0f7cde3c0518e1cc590491be5861d70a2e333f7e65af2e1ebd91a3c9a3cc638d910160405180910390a36001600160a01b03861660009081526010602052604081208054879290612768908490614b39565b9250508190555050505060005481146112d75760405162461bcd60e51b815260040161092f90614b82565b60016000808282546127a59190614b39565b909155505060005460015460ff16156127ea5760405162461bcd60e51b81526020600482015260076024820152665061757365642160c81b604482015260640161092f565b3360005b6003548110156128e35760006003828154811061280d5761280d614b51565b6000918252602090912001546001600160a01b0316905061282d81612cf2565b6001600160a01b03821660009081526002602052604090206005015561285281611e1c565b6001600160a01b038083166000908152600260205260409020600401919091558316156128d0576128838382610b16565b6001600160a01b0380851660008181526006602090815260408083209487168084529482528083209590955560028152848220600590810154938352815284822093825292909252919020555b50806128db81614b67565b9150506127ee565b50600083116129255760405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015260640161092f565b6009546129329084612ee6565b600955336000908152600a602052604090205461294f9084612ee6565b336000818152600a6020526040902091909155600154612980916101009091046001600160a01b03169030866143b1565b60405183815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001611038565b6001600160a01b03811660009081526002602052604081206001810154600390910154610bab91612e0a565b600c60009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612a2e57600080fd5b505af1158015612a42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a669190614aa9565b6001600160a01b0316336001600160a01b031614612a965760405162461bcd60e51b815260040161092f90614ac6565b6001600160a01b03831660009081526007602052604090205460ff16158015612ad857506001600160a01b038316600090815260026020526040902060010154155b612b1b5760405162461bcd60e51b8152602060048201526014602482015273416c726561647920496e697469616c697a65642160601b604482015260640161092f565b6001546001600160a01b03848116610100909204161415612b7e5760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f7420726577617264207374616b696e6720746f6b656e2100000000604482015260640161092f565b6003805460018181019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b039586166001600160a01b031991821681179092556000918252600760209081526040808420805460ff19168617905560029091529091208054949095169316929092178355910155565b6000806001600080828254612c159190614b39565b9091555050600054612c25612f9b565b925092506000548114612c4a5760405162461bcd60e51b815260040161092f90614b82565b509091565b6001546040516370a0823160e01b8152336004820152611e869161010090046001600160a01b0316906370a082319060240160206040518083038186803b158015612c9957600080fd5b505afa158015612cad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107629190614bb9565b336000908152600a6020526040902054612cea90610e57565b611e8661142f565b600060095460001415612d1e57506001600160a01b031660009081526002602052604090206005015490565b6009546001600160a01b03831660009081526002602052604090206003810154600490910154610bab92612d72929091610b9c91670de0b6b3a764000091612d6c91908290610b778b611e1c565b90612e0a565b6001600160a01b03841660009081526002602052604090206005015490612ee6565b60048181548110611e5357600080fd5b600082821115612df65760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015260640161092f565b6000612e028385614bd2565b949350505050565b600082612e1957506000610bab565b6000612e258385614bff565b905082612e328583614c1e565b14610ba85760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161092f565b6000808211612eda5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015260640161092f565b6000612e028385614c1e565b600080612ef38385614b39565b905083811015610ba85760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161092f565b6112d78363a9059cbb60e01b8484604051602401612f64929190614aed565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261467e565b6000806000600d60009054906101000a90046001600160a01b03166001600160a01b0316633f6678256040518163ffffffff1660e01b815260040160206040518083038186803b158015612fee57600080fd5b505afa158015613002573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130269190614bb9565b905060008082116130385760006130be565b600d60009054906101000a90046001600160a01b03166001600160a01b03166313416d996040518163ffffffff1660e01b815260040160206040518083038186803b15801561308657600080fd5b505afa15801561309a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130be9190614aa9565b600d54909150600160a01b900460ff16613a855760045460008167ffffffffffffffff8111156130f0576130f06148e9565b604051908082528060200260200182016040528015613119578160200160208202803683370190505b50905060008267ffffffffffffffff811115613137576131376148e9565b604051908082528060200260200182016040528015613160578160200160208202803683370190505b50905060005b838110156132d0576004818154811061318157613181614b51565b9060005260206000200160009054906101000a90046001600160a01b03168382815181106131b1576131b1614b51565b60200260200101906001600160a01b031690816001600160a01b03168152505060006001600160a01b03168382815181106131ee576131ee614b51565b60200260200101516001600160a01b03161461329e5782818151811061321657613216614b51565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561326157600080fd5b505afa158015613275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132999190614bb9565b6132a1565b60005b8282815181106132b3576132b3614b51565b6020908102919091010152806132c881614b67565b915050613166565b5060018054906101000a90046001600160a01b03166001600160a01b031663d294f0936040518163ffffffff1660e01b81526004016040805180830381600087803b15801561331e57600080fd5b505af192505050801561334e575060408051601f3d908101601f1916820190925261334b91810190614c40565b60015b6133615750600096879650945050505050565b505060005b83811015613a75576000806001600160a01b031684838151811061338c5761338c614b51565b60200260200101516001600160a01b03161461343c578382815181106133b4576133b4614b51565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156133ff57600080fd5b505afa158015613413573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134379190614bb9565b61343f565b60005b905082828151811061345357613453614b51565b6020026020010151811115613a62576000620f42408885858151811061347b5761347b614b51565b60200260200101518461348e9190614bd2565b6134989190614bff565b6134a29190614c1e565b11156136cc578382815181106134ba576134ba614b51565b60200260200101516001600160a01b031663a9059cbb87620f42408a6135028888815181106134eb576134eb614b51565b602002602001015187612da490919063ffffffff16565b61350c9190614bff565b6135169190614c1e565b6040518363ffffffff1660e01b8152600401613533929190614aed565b602060405180830381600087803b15801561354d57600080fd5b505af1158015613561573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135859190614b06565b5083828151811061359857613598614b51565b60200260200101516001600160a01b0316866001600160a01b0316336001600160a01b03167f78c0b7f8dc279098cd35e7f6ed62faef6b268eb5f31ece1326f32e1bc1d5a048620f42408b61360f8989815181106135f8576135f8614b51565b602002602001015188612da490919063ffffffff16565b6136199190614bff565b6136239190614c1e565b60405190815260200160405180910390a483828151811061364657613646614b51565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561369157600080fd5b505afa1580156136a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c99190614bb9565b90505b600e546001600160a01b031661389657600b5484516001600160a01b039091169063b66503cf9086908590811061370557613705614b51565b602002602001015161373986868151811061372257613722614b51565b602002602001015185612da490919063ffffffff16565b6040518363ffffffff1660e01b8152600401613756929190614aed565b600060405180830381600087803b15801561377057600080fd5b505af1158015613784573d6000803e3d6000fd5b5050505083828151811061379a5761379a614b51565b60200260200101516001600160a01b0316600b60009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b0316600080516020614ccf8339815191528686815181106137f5576137f5614b51565b6020026020010151856138089190614bd2565b60405190815260200160405180910390a482828151811061382b5761382b614b51565b60200260200101518161383e9190614bd2565b6012600086858151811061385457613854614b51565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461388b9190614b39565b90915550613a629050565b8382815181106138a8576138a8614b51565b60200260200101516001600160a01b031663a9059cbb600e60009054906101000a90046001600160a01b03166138e986868151811061372257613722614b51565b6040518363ffffffff1660e01b8152600401613906929190614aed565b602060405180830381600087803b15801561392057600080fd5b505af1158015613934573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139589190614b06565b5083828151811061396b5761396b614b51565b60200260200101516001600160a01b0316600e60009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b0316600080516020614ccf8339815191528686815181106139c6576139c6614b51565b6020026020010151856139d99190614bd2565b60405190815260200160405180910390a48282815181106139fc576139fc614b51565b602002602001015181613a0f9190614bd2565b60126000868581518110613a2557613a25614b51565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000828254613a5c9190614b39565b90915550505b5080613a6d81614b67565b915050613366565b5060009788975095505050505050565b60008060018054906101000a90046001600160a01b03166001600160a01b0316639d63848a6040518163ffffffff1660e01b81526004016040805180830381600087803b158015613ad557600080fd5b505af1158015613ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b0d9190614c64565b6040516370a0823160e01b815230600482015291935091506000906001600160a01b038416906370a082319060240160206040518083038186803b158015613b5457600080fd5b505afa158015613b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b8c9190614bb9565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b158015613bd157600080fd5b505afa158015613be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c099190614bb9565b905060018054906101000a90046001600160a01b03166001600160a01b031663d294f0936040518163ffffffff1660e01b81526004016040805180830381600087803b158015613c5857600080fd5b505af1158015613c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c909190614c40565b50506040516370a0823160e01b815230600482015282906001600160a01b038616906370a082319060240160206040518083038186803b158015613cd357600080fd5b505afa158015613ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d0b9190614bb9565b613d159190614bd2565b6040516370a0823160e01b815230600482015290985081906001600160a01b038516906370a082319060240160206040518083038186803b158015613d5957600080fd5b505afa158015613d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d919190614bb9565b613d9b9190614bd2565b96506000620f4240613dad888b614bff565b613db79190614c1e565b1115613ee3576001600160a01b03841663a9059cbb86620f4240613ddb8a8d614bff565b613de59190614c1e565b6040518363ffffffff1660e01b8152600401613e02929190614aed565b602060405180830381600087803b158015613e1c57600080fd5b505af1158015613e30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e549190614b06565b506001600160a01b03808616908516337f78c0b7f8dc279098cd35e7f6ed62faef6b268eb5f31ece1326f32e1bc1d5a048620f4240613e938b8e614bff565b613e9d9190614c1e565b60405190815260200160405180910390a46040516370a0823160e01b8152306004820152613ee09083906001600160a01b038716906370a0823190602401611f97565b97505b6000620f4240613ef3888a614bff565b613efd9190614c1e565b1115614029576001600160a01b03831663a9059cbb86620f4240613f218a8c614bff565b613f2b9190614c1e565b6040518363ffffffff1660e01b8152600401613f48929190614aed565b602060405180830381600087803b158015613f6257600080fd5b505af1158015613f76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f9a9190614b06565b506001600160a01b03808616908416337f78c0b7f8dc279098cd35e7f6ed62faef6b268eb5f31ece1326f32e1bc1d5a048620f4240613fd98b8d614bff565b613fe39190614c1e565b60405190815260200160405180910390a46040516370a0823160e01b81523060048201526140269082906001600160a01b038616906370a0823190602401611f97565b96505b600e546001600160a01b03166141d657871561410557600b5460405163b66503cf60e01b81526001600160a01b039091169063b66503cf906140719087908c90600401614aed565b600060405180830381600087803b15801561408b57600080fd5b505af115801561409f573d6000803e3d6000fd5b505050506001600160a01b038416600090815260126020526040812080548a92906140cb908490614b39565b9091555050600e546040518981526001600160a01b038681169216903390600080516020614ccf8339815191529060200160405180910390a45b86156141d157600b5460405163b66503cf60e01b81526001600160a01b039091169063b66503cf9061413d9086908b90600401614aed565b600060405180830381600087803b15801561415757600080fd5b505af115801561416b573d6000803e3d6000fd5b505050506001600160a01b03831660009081526012602052604081208054899290614197908490614b39565b9091555050600e546040518881526001600160a01b038581169216903390600080516020614ccf8339815191529060200160405180910390a45b6143a7565b600e5460405163a9059cbb60e01b81526001600160a01b038681169263a9059cbb9261420a92909116908c90600401614aed565b602060405180830381600087803b15801561422457600080fd5b505af1158015614238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061425c9190614b06565b50600e5460405163a9059cbb60e01b81526001600160a01b038581169263a9059cbb9261429192909116908b90600401614aed565b602060405180830381600087803b1580156142ab57600080fd5b505af11580156142bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142e39190614b06565b50600e546040518981526001600160a01b038681169216903390600080516020614ccf8339815191529060200160405180910390a4600e546040518881526001600160a01b038581169216903390600080516020614ccf8339815191529060200160405180910390a46001600160a01b038416600090815260126020526040812080548a9290614374908490614b39565b90915550506001600160a01b038316600090815260126020526040812080548992906143a1908490614b39565b90915550505b5050505050509091565b6040516001600160a01b03808516602483015283166044820152606481018290526143e99085906323b872dd60e01b90608401612f64565b50505050565b60016000808282546144019190614b39565b9091555050600080549083905b6003548110156145035760006003828154811061442d5761442d614b51565b6000918252602090912001546001600160a01b0316905061444d81612cf2565b6001600160a01b03821660009081526002602052604090206005015561447281611e1c565b6001600160a01b038083166000908152600260205260409020600401919091558316156144f0576144a38382610b16565b6001600160a01b0380851660008181526006602090815260408083209487168084529482528083209590955560028152848220600590810154938352815284822093825292909252919020555b50806144fb81614b67565b91505061440e565b5060005b835181101561465f57600084828151811061452457614524614b51565b6020908102919091018101516001600160a01b03808916600090815260068452604080822092841682529190935290912054909150801561464a576001600160a01b03808816600090815260066020908152604080832093861680845293909152812055614593908883612f45565b866001600160a01b0316826001600160a01b03167f9aa05b3d70a9e3e2f004f039648839560576334fb45c81f91b6db03ad9e2efc9836040516145d891815260200190565b60405180910390a36001600160a01b0382166000908152600f602052604081208054839290614608908490614b39565b90915550506001600160a01b03808816600090815260116020908152604080832093861683529290529081208054839290614644908490614b39565b90915550505b5050808061465790614b67565b915050614507565b506112b3612f9b565b60008183106146775781610ba8565b5090919050565b6001600160a01b0382163b6146d55760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015260640161092f565b600080836001600160a01b0316836040516146f09190614c93565b6000604051808303816000865af19150503d806000811461472d576040519150601f19603f3d011682016040523d82523d6000602084013e614732565b606091505b5091509150816147845760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015260640161092f565b8051156143e9578080602001905181019061479f9190614b06565b6143e95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161092f565b6001600160a01b038116811461136157600080fd5b803561481e816147fe565b919050565b60006020828403121561483557600080fd5b8135610ba8816147fe565b6000806040838503121561485357600080fd5b823561485e816147fe565b9150602083013561486e816147fe565b809150509250929050565b801515811461136157600080fd5b60006020828403121561489957600080fd5b8135610ba881614879565b600080604083850312156148b757600080fd5b82356148c2816147fe565b946020939093013593505050565b6000602082840312156148e257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261491057600080fd5b8135602067ffffffffffffffff8083111561492d5761492d6148e9565b8260051b604051601f19603f83011681018181108482111715614952576149526148e9565b60405293845285810183019383810192508785111561497057600080fd5b83870191505b848210156149965761498782614813565b83529183019190830190614976565b979650505050505050565b600080604083850312156149b457600080fd5b82356149bf816147fe565b9150602083013567ffffffffffffffff8111156149db57600080fd5b6149e7858286016148ff565b9150509250929050565b600060208284031215614a0357600080fd5b813567ffffffffffffffff811115614a1a57600080fd5b612e02848285016148ff565b600080600060608486031215614a3b57600080fd5b833592506020840135614a4d816147fe565b91506040840135614a5d816147fe565b809150509250925092565b600080600060608486031215614a7d57600080fd5b8335614a88816147fe565b92506020840135614a98816147fe565b929592945050506040919091013590565b600060208284031215614abb57600080fd5b8151610ba8816147fe565b6020808252600d908201526c4f6e6c792076652e7465616d2160981b604082015260600190565b6001600160a01b03929092168252602082015260400190565b600060208284031215614b1857600080fd5b8151610ba881614879565b634e487b7160e01b600052601160045260246000fd5b60008219821115614b4c57614b4c614b23565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415614b7b57614b7b614b23565b5060010190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600060208284031215614bcb57600080fd5b5051919050565b600082821015614be457614be4614b23565b500390565b634e487b7160e01b600052603160045260246000fd5b6000816000190483118215151615614c1957614c19614b23565b500290565b600082614c3b57634e487b7160e01b600052601260045260246000fd5b500490565b60008060408385031215614c5357600080fd5b505080516020909101519092909150565b60008060408385031215614c7757600080fd5b8251614c82816147fe565b602084015190925061486e816147fe565b6000825160005b81811015614cb45760208186018101518583015201614c9a565b81811115614cc3576000828501525b50919091019291505056feee447878094bcc87bd81b55e4831b5e9e3d095866fce10f4f7e4caa64ea7a558a2646970667358221220cebd89c532c39dff28e605d8662ea3f1a93b28f80d12ac1731898220bf59bbd664736f6c634300080900336f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d050000000000000000000000007547d05dff1da6b4a2ebb3f0833afe3c62abd9a1000000000000000000000000b7927d2b2dded7da09795fa5819326898a96715f0000000000000000000000008313f3551c4d3984ffbadfb42f780d0c8763ce940000000000000000000000007e228014e1e676ec84edfc687def804f648394ef000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a6
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007547d05dff1da6b4a2ebb3f0833afe3c62abd9a1000000000000000000000000b7927d2b2dded7da09795fa5819326898a96715f0000000000000000000000008313f3551c4d3984ffbadfb42f780d0c8763ce940000000000000000000000007e228014e1e676ec84edfc687def804f648394ef000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a6
-----Decoded View---------------
Arg [0] : _stake (address): 0x7547d05dff1da6b4a2ebb3f0833afe3c62abd9a1
Arg [1] : _ebribe (address): 0xb7927d2b2dded7da09795fa5819326898a96715f
Arg [2] : __ve (address): 0x8313f3551c4d3984ffbadfb42f780d0c8763ce94
Arg [3] : _voter (address): 0x7e228014e1e676ec84edfc687def804f648394ef
Arg [4] : _forPair (bool): True
Arg [5] : _allowedRewardTokens (address[]): 0x3fd3a0c85b70754efc07ac9ac0cbbdce664865a6
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000007547d05dff1da6b4a2ebb3f0833afe3c62abd9a1
Arg [1] : 000000000000000000000000b7927d2b2dded7da09795fa5819326898a96715f
Arg [2] : 0000000000000000000000008313f3551c4d3984ffbadfb42f780d0c8763ce94
Arg [3] : 0000000000000000000000007e228014e1e676ec84edfc687def804f648394ef
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 0000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a6
Deployed ByteCode Sourcemap
16968:23026:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36619:384;;;;;;:::i;:::-;;:::i;:::-;;18117:47;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;687:25:1;;;675:2;660:18;18117:47:0;;;;;;;;20829:266;;;;;;:::i;:::-;;:::i;18238:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;38326:77;;;;;;:::i;:::-;;:::i;19888:93::-;19961:12;;19888:93;;17953:23;;;;;-1:-1:-1;;;;;17953:23:0;;;;;;-1:-1:-1;;;;;1670:32:1;;;1652:51;;1640:2;1625:18;17953:23:0;1485:224:1;21219:144:0;;;;;;:::i;:::-;;:::i;22407:116::-;;;;;;:::i;:::-;-1:-1:-1;;;;;22488:16:0;22464:4;22488:16;;;:10;:16;;;;;:27;;;;22407:116;36121:490;;;;;;:::i;:::-;;:::i;18171:60::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;22531:124;;;;;;:::i;:::-;-1:-1:-1;;;;;22616:16:0;22592:4;22616:16;;;:10;:16;;;;;:31;;;;22531:124;23932:373;;;;;;:::i;:::-;;:::i;23316:394::-;;;;;;:::i;:::-;;:::i;23812:112::-;;;;;;:::i;:::-;;:::i;25737:255::-;;;;;;:::i;:::-;;:::i;17927:19::-;;;;;-1:-1:-1;;;;;17927:19:0;;;17396;;;;;;;;-1:-1:-1;;;;;17396:19:0;;;24403:652;;;:::i;22717:187::-;;;;;;:::i;:::-;;:::i;17983:19::-;;;;;-1:-1:-1;;;;;17983:19:0;;;17422:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17422:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4723:32:1;;;4705:51;;4787:2;4772:18;;4765:34;;;;4815:18;;;4808:34;;;;4873:2;4858:18;;4851:34;4916:3;4901:19;;4894:35;4743:3;4945:19;;4938:35;4692:3;4677:19;17422:44:0;4418:561:1;17738:40:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5149:14:1;;5142:22;5124:41;;5112:2;5097:18;17738:40:0;4984:187:1;38232:86:0;;;;;;:::i;:::-;;:::i;37723:171::-;;;;;;:::i;:::-;;:::i;37011:704::-;;;;;;:::i;:::-;;:::i;37902:177::-;;;;;;:::i;:::-;;:::i;17371:18::-;;;;;;;;;20109:178;;;;;;:::i;:::-;;:::i;18071:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;17585:77;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;19989:112;;;;;;:::i;:::-;-1:-1:-1;;;;;20075:18:0;20048:7;20075:18;;;:9;:18;;;;;;;19989:112;18039:23;;;;;-1:-1:-1;;;;;18039:23:0;;;17473:29;;;;;;:::i;:::-;;:::i;24313:82::-;;;:::i;35499:614::-;;;;;;:::i;:::-;;:::i;22187:84::-;22260:2;;-1:-1:-1;;;;;22260:2:0;22187:84;;22007:101;22082:11;:18;22007:101;;21573:315;;;;;;:::i;:::-;;:::i;26105:2454::-;;;;;;:::i;:::-;;:::i;22912:396::-;;;;;;:::i;:::-;;:::i;21371:194::-;;;;;;:::i;:::-;;:::i;34775:615::-;;;;;;:::i;:::-;;:::i;28567:120::-;;;:::i;:::-;;;;6833:25:1;;;6889:2;6874:18;;6867:34;;;;6806:18;28567:120:0;6659:248:1;22279:120:0;;;;;;:::i;:::-;-1:-1:-1;;;;;22362:16:0;22338:4;22362:16;;;:10;:16;;;;;;;;:29;;;22279:120;17785:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23718:86;;;:::i;18009:21::-;;;;;-1:-1:-1;;;18009:21:0;;;;;;21896:103;21972:12;:19;21896:103;;17669:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;26000:97;;;:::i;20295:468::-;;;;;;:::i;:::-;;:::i;17509:28::-;;;;;;:::i;:::-;;:::i;36619:384::-;39070:2;;;;;;;;;-1:-1:-1;;;;;39070:2:0;-1:-1:-1;;;;;39070:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39058:21:0;:10;-1:-1:-1;;;;;39058:21:0;;39050:47;;;;-1:-1:-1;;;39050:47:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;36690:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;;::::1;;:25;36682:57;;;::::0;-1:-1:-1;;;36682:57:0;;7712:2:1;36682: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;;36682:57:0::1;7510:343:1::0;36682:57:0::1;36773:5;::::0;-1:-1:-1;;;;;36759:20:0;;::::1;36773:5;::::0;;::::1;;36759:20;;36750:61;;;::::0;-1:-1:-1;;;36750:61:0;;8060:2:1;36750:61:0::1;::::0;::::1;8042:21:1::0;8099:2;8079:18;;;8072:30;8138:29;8118:18;;;8111:57;8185:18;;36750:61:0::1;7858:351:1::0;36750:61:0::1;36849:5;::::0;36822:53:::1;::::0;-1:-1:-1;;;36822:53:0;;-1:-1:-1;;;;;36822:18:0;;::::1;::::0;::::1;::::0;:53:::1;::::0;36849:5;;::::1;::::0;-1:-1:-1;;36857:17:0;36822:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;36886:11:0::1;:20:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;36886:20:0::1;-1:-1:-1::0;;;;;36886:20:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;36917:16:0;;;:12:::1;36886:20;36917:16:::0;;;;;:23;;-1:-1:-1;;36917:23:0::1;::::0;::::1;::::0;;36982:5:::1;::::0;36956:39;;36982:5;::::1;::::0;36956:39:::1;::::0;-1:-1:-1;36956:39:0::1;36619:384:::0;:::o;20829:266::-;-1:-1:-1;;;;;21055:16:0;;;20908:7;21055:16;;;:7;:16;;;;;;;;:31;;;;;;;;;;;;;20992;;;:22;:31;;;;;:46;;;;;;;;;;20935:152;;21055:31;20935:115;;21045:4;;20935:105;;20958:81;;:29;21072:13;20958:14;:29::i;:::-;:33;;:81::i;:::-;-1:-1:-1;;;;;20935:18:0;;;;;;:9;:18;;;;;;;:22;:105::i;:::-;:109;;:115::i;:::-;:119;;:152::i;:::-;20928:159;;20829:266;;;;;:::o;38326:77::-;39070:2;;;;;;;;;-1:-1:-1;;;;;39070:2:0;-1:-1:-1;;;;;39070:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39058:21:0;:10;-1:-1:-1;;;;;39058:21:0;;39050:47;;;;-1:-1:-1;;;39050:47:0;;;;;;;:::i;:::-;38384:6:::1;:11:::0;;-1:-1:-1;;38384:11:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38326:77::o;21219:144::-;21296:7;21323:32;21332:7;21341:13;21323:8;:32::i;36121:490::-;39070:2;;;;;;;;;-1:-1:-1;;;;;39070:2:0;-1:-1:-1;;;;;39070:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39058:21:0;:10;-1:-1:-1;;;;;39058:21:0;;39050:47;;;;-1:-1:-1;;;39050:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36268:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;;;;:38:::1;::::0;36250:15:::1;:56;36228:132;;;::::0;-1:-1:-1;;;36228:132:0;;8945:2:1;36228:132:0::1;::::0;::::1;8927:21:1::0;8984:2;8964:18;;;8957:30;9023:28;9003:18;;;8996:56;9069:18;;36228:132:0::1;8743:350:1::0;36228:132:0::1;36398:1;36379:16;:20;36371:65;;;::::0;-1:-1:-1;;;36371:65:0;;9300:2:1;36371:65:0::1;::::0;::::1;9282:21:1::0;;;9319:18;;;9312:30;9378:34;9358:18;;;9351:62;9430:18;;36371:65:0::1;9098:356:1::0;36371:65:0::1;-1:-1:-1::0;;;;;36447:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;;;:41:::1;;:60:::0;;;36523:80;::::1;::::0;::::1;::::0;36491:16;687:25:1;;675:2;660:18;;541:177;36523:80:0::1;;;;;;;;36121:490:::0;;:::o;23932:373::-;10567:1;10550:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;10579:20:0;10602:13;;;23999:10:::1;::::0;38510:483:::1;38527:12;:19:::0;38523:23;::::1;38510:483;;;38568:13;38584:12;38597:1;38584:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38584:15:0::1;::::0;-1:-1:-1;38655:21:0::1;38584:15:::0;38655:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;38614:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:62:::0;38726:31:::1;38625:5:::0;38726:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;38691:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;38776:21;::::1;::::0;38772:210:::1;;38844:24;38853:7;38862:5;38844:8;:24::i;:::-;-1:-1:-1::0;;;;;38818:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;38928:10:::1;:17:::0;;;;;:38:::1;::::0;;::::1;::::0;38887:31;;;;;;;;:38;;;;;;;;;;:79;38772:210:::1;-1:-1:-1::0;38548:3:0;::::1;::::0;::::1;:::i;:::-;;;;38510:483;;;;24039:1:::2;24030:6;:10;24022:40;;;::::0;-1:-1:-1;;;24022:40:0;;10198:2:1;24022: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;;24022:40:0::2;9996:341:1::0;24022:40:0::2;24088:12;::::0;:24:::2;::::0;24105:6;24088:16:::2;:24::i;:::-;24073:12;:39:::0;24157:10:::2;24147:21;::::0;;;:9:::2;:21;::::0;;;;;:33:::2;::::0;24173:6;24147:25:::2;:33::i;:::-;24133:10;24123:21;::::0;;;:9:::2;:21;::::0;;;;:57;;;;24191:5:::2;::::0;:38:::2;::::0;:5:::2;::::0;;::::2;-1:-1:-1::0;;;;;24191:5:0::2;::::0;24222:6;24191:18:::2;:38::i;:::-;24245:29;::::0;687:25:1;;;24255:10:0::2;::::0;24245:29:::2;::::0;675:2:1;660:18;24245:29:0::2;;;;;;;;24285:12;:10;:12::i;:::-;;;10626:1:::1;10662:13:::0;;10646:12;:29;10638:73;;;;-1:-1:-1;;;10638:73:0;;;;;;;:::i;:::-;10539:180;23932:373;:::o;23316:394::-;10567:1;10550:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;10579:20:0;10602:13;39164:6:::1;::::0;::::1;;39163:7;39155:27;;;::::0;-1:-1:-1;;;39155:27:0;;10904:2:1;39155: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;;39155:27:0::1;10702:330:1::0;39155:27:0::1;23410:5:::2;38515:6;38510:483;38527:12;:19:::0;38523:23;::::2;38510:483;;;38568:13;38584:12;38597:1;38584:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;38584:15:0::2;::::0;-1:-1:-1;38655:21:0::2;38584:15:::0;38655:14:::2;:21::i;:::-;-1:-1:-1::0;;;;;38614:17:0;::::2;;::::0;;;:10:::2;:17;::::0;;;;:38:::2;;:62:::0;38726:31:::2;38625:5:::0;38726:24:::2;:31::i;:::-;-1:-1:-1::0;;;;;38691:17:0;;::::2;;::::0;;;:10:::2;:17;::::0;;;;:32:::2;;:66:::0;;;;38776:21;::::2;::::0;38772:210:::2;;38844:24;38853:7;38862:5;38844:8;:24::i;:::-;-1:-1:-1::0;;;;;38818:16:0;;::::2;;::::0;;;:7:::2;:16;::::0;;;;;;;:23;;::::2;::::0;;;;;;;;;:50;;;;38928:10:::2;:17:::0;;;;;:38:::2;::::0;;::::2;::::0;38887:31;;;;;;;;:38;;;;;;;;;;:79;38772:210:::2;-1:-1:-1::0;38548:3:0;::::2;::::0;::::2;:::i;:::-;;;;38510:483;;;;23445:1:::3;23436:6;:10;23428:37;;;::::0;-1:-1:-1;;;23428:37:0;;11239:2:1;23428: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;;23428:37:0::3;11037:338:1::0;23428:37:0::3;23491:12;::::0;:24:::3;::::0;23508:6;23491:16:::3;:24::i;:::-;23476:12;:39:::0;-1:-1:-1;;;;;23545:16:0;::::3;;::::0;;;:9:::3;:16;::::0;;;;;:28:::3;::::0;23566:6;23545:20:::3;:28::i;:::-;-1:-1:-1::0;;;;;23526:16:0;;::::3;;::::0;;;:9:::3;:16;::::0;;;;:47;;;;23584:5:::3;::::0;:57:::3;::::0;:5:::3;::::0;;::::3;;23607:10;23627:4;23634:6:::0;23584:22:::3;:57::i;:::-;23665:5;-1:-1:-1::0;;;;;23657:22:0::3;;23672:6;23657:22;;;;687:25:1::0;;675:2;660:18;;541:177;23657:22:0::3;;;;;;;;23690:12;:10;:12::i;:::-;;;39193:1:::2;10662:13:::0;;10646:12;:29;10638:73;;;;-1:-1:-1;;;10638:73:0;;;;;;;:::i;:::-;10539:180;23316:394;;:::o;23812:112::-;23888:5;;:27;;-1:-1:-1;;;23888:27:0;;23904:10;23888:27;;;1652:51:1;23870:46:0;;23881:5;;23888;;;;-1:-1:-1;;;;;23888:5:0;;:15;;1625:18:1;;23888:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23870:46::-;23812:112;:::o;25737:255::-;25826:10;-1:-1:-1;;;;;25826:21:0;;;;:53;;-1:-1:-1;25873:5:0;;-1:-1:-1;;;;;25873:5:0;25851:10;:28;25826:53;25818:86;;;;-1:-1:-1;;;25818:86:0;;11771:2:1;25818:86:0;;;11753:21:1;11810:2;11790:18;;;11783:30;-1:-1:-1;;;11829:18:1;;;11822:50;11889:18;;25818:86:0;11569:344:1;25818:86:0;25915:5;;:31;;-1:-1:-1;;;25915:31:0;;25940:4;25915:31;;;1652:51:1;-1:-1:-1;;;;;25915:5:0;;;;:16;;1625:18:1;;25915:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25957:27;25968:7;25977:6;25957:10;:27::i;24403:652::-;10567:1;10550:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;10579:20:0;10602:13;;;24457:10:::1;::::0;38510:483:::1;38527:12;:19:::0;38523:23;::::1;38510:483;;;38568:13;38584:12;38597:1;38584:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38584:15:0::1;::::0;-1:-1:-1;38655:21:0::1;38584:15:::0;38655:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;38614:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:62:::0;38726:31:::1;38625:5:::0;38726:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;38691:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;38776:21;::::1;::::0;38772:210:::1;;38844:24;38853:7;38862:5;38844:8;:24::i;:::-;-1:-1:-1::0;;;;;38818:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;38928:10:::1;:17:::0;;;;;:38:::1;::::0;;::::1;::::0;38887:31;;;;;;;;:38;;;;;;;;;;:79;38772:210:::1;-1:-1:-1::0;38548:3:0;::::1;::::0;::::1;:::i;:::-;;;;38510:483;;;;24487:6:::2;24482:543;24499:12;:19:::0;24495:23;::::2;24482:543;;;24540:21;24564:12;24577:1;24564:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;;::::2;::::0;24620:10:::2;24612:19:::0;;:7:::2;:19:::0;;;;;;-1:-1:-1;;;;;24564:15:0;;::::2;24612:34:::0;;;;;;;;;;24564:15;;-1:-1:-1;24665:11:0;;24661:353:::2;;24705:10;24734:1;24697:19:::0;;;:7:::2;:19;::::0;;;;;;;-1:-1:-1;;;;;24697:34:0;::::2;::::0;;;;;;;:38;;;;24754:55:::2;::::0;24801:7;24754:34:::2;:55::i;:::-;24833:48;::::0;687:25:1;;;-1:-1:-1;;;;;24833:48:0;::::2;::::0;24846:10:::2;::::0;24833:48:::2;::::0;675:2:1;660:18;24833:48:0::2;;;;;;;-1:-1:-1::0;;;;;24900:22:0;::::2;;::::0;;;:7:::2;:22;::::0;;;;:33;;24926:7;;24900:22;:33:::2;::::0;24926:7;;24900:33:::2;:::i;:::-;::::0;;;-1:-1:-1;;24961:10:0::2;24952:20;::::0;;;:8:::2;:20;::::0;;;;;;;-1:-1:-1;;;;;24952:35:0;::::2;::::0;;;;;;;:46;;24991:7;;24952:20;:46:::2;::::0;24991:7;;24952:46:::2;:::i;:::-;::::0;;;-1:-1:-1;;24661:353:0::2;24525:500;;24520:3;;;;;:::i;:::-;;;;24482:543;;;;25035:12;:10;:12::i;:::-;;;10626:1:::1;10662:13:::0;;10646:12;:29;10638:73;;;;-1:-1:-1;;;10638:73:0;;;;;;;:::i;22717:187::-;39070:2;;;;;;;;;-1:-1:-1;;;;;39070:2:0;-1:-1:-1;;;;;39070:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39058:21:0;:10;-1:-1:-1;;;;;39058:21:0;;39050:47;;;;-1:-1:-1;;;39050:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22830:25:0;;::::1;;::::0;;;:10:::1;:25;::::0;;;;:66;;-1:-1:-1;;;;;;22830:66:0::1;::::0;;;::::1;;::::0;;22717:187::o;38232:86::-;39070:2;;;;;;;;;-1:-1:-1;;;;;39070:2:0;-1:-1:-1;;;;;39070:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39058:21:0;:10;-1:-1:-1;;;;;39058:21:0;;39050:47;;;;-1:-1:-1;;;39050:47:0;;;;;;;:::i;:::-;38296:8:::1;:14:::0;;-1:-1:-1;;;;;;38296:14:0::1;-1:-1:-1::0;;;;;38296:14:0;;;::::1;::::0;;;::::1;::::0;;38232:86::o;37723:171::-;39070:2;;;;;;;;;-1:-1:-1;;;;;39070:2:0;-1:-1:-1;;;;;39070:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39058:21:0;:10;-1:-1:-1;;;;;39058:21:0;;39050:47;;;;-1:-1:-1;;;39050:47:0;;;;;;;:::i;:::-;37804:7:::1;37800:87;37818:4;:11;37813:2;:16;37800:87;;;37852:23;37866:4;37871:2;37866:8;;;;;;;;:::i;:::-;;;;;;;37852:13;:23::i;:::-;37831:4:::0;::::1;::::0;::::1;:::i;:::-;;;;37800:87;;37011:704:::0;39070:2;;;;;;;;;-1:-1:-1;;;;;39070:2:0;-1:-1:-1;;;;;39070:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39058:21:0;:10;-1:-1:-1;;;;;39058:21:0;;39050:47;;;;-1:-1:-1;;;39050:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37085:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;;::::1;;:24;;:16:::0;:24:::1;37077:58;;;::::0;-1:-1:-1;;;37077:58:0;;12120:2:1;37077: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;;37077:58:0::1;11918:345:1::0;37077:58:0::1;37173:5;::::0;37146:37:::1;::::0;-1:-1:-1;;;37146:37:0;;-1:-1:-1;;;;;37146:18:0;;::::1;::::0;::::1;::::0;:37:::1;::::0;37173:5;;::::1;::::0;::::1;::::0;37146:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;37205:11:0::1;:18:::0;;;-1:-1:-1;;;;;37237:22:0;::::1;::::0;37249:5:::1;37253:1;37205:18:::0;37249:5:::1;:::i;:::-;37237:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;37237:18:0::1;:22;37234:418;;;37276:11;:17;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;37276:17:0;;;;;-1:-1:-1;;;;;;37276:17:0::1;::::0;;;;;;;;-1:-1:-1;;;;;37308:16:0;::::1;::::0;;:12:::1;:16:::0;;;;;:24;;-1:-1:-1;;37308:24:0::1;::::0;;37234:418:::1;;;37378:6;37374:267;37390:11;:18:::0;:22:::1;::::0;37411:1:::1;::::0;37390:22:::1;:::i;:::-;37386:1;:26;37374:267;;;37457:2;-1:-1:-1::0;;;;;37441:18:0::1;:11;37453:1;37441:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;37441:14:0::1;:18;37438:188;;;37501:11;37513:5;37517:1;37513:3:::0;:5:::1;:::i;:::-;37501:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;37484:11:::1;:14:::0;;-1:-1:-1;;;;;37501:18:0;;::::1;::::0;37496:1;;37484:14;::::1;;;;;:::i;:::-;;;;;;;;;:35;;;;;-1:-1:-1::0;;;;;37484:35:0::1;;;;;-1:-1:-1::0;;;;;37484:35:0::1;;;;;;37542:11;:17;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;37542:17:0;;;;;-1:-1:-1;;;;;;37542:17:0::1;::::0;;;;;;;;-1:-1:-1;;;;;37582:16:0;::::1;::::0;;:12:::1;:16:::0;;;;;:24;;-1:-1:-1;;37582:24:0::1;::::0;;37438:188:::1;37414:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37374:267;;;;37234:418;37693:5;::::0;37667:40:::1;::::0;37701:5:::1;::::0;-1:-1:-1;;;;;37693:5:0;;::::1;::::0;37667:40;;::::1;::::0;::::1;::::0;37701:5;;37667:40:::1;37066:649;37011:704:::0;:::o;37902:177::-;39070:2;;;;;;;;;-1:-1:-1;;;;;39070:2:0;-1:-1:-1;;;;;39070:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39058:21:0;:10;-1:-1:-1;;;;;39058:21:0;;39050:47;;;;-1:-1:-1;;;39050:47:0;;;;;;;:::i;:::-;37986:7:::1;37982:90;38000:4;:11;37995:2;:16;37982:90;;;38034:26;38051:4;38056:2;38051:8;;;;;;;;:::i;:::-;;;;;;;38034:16;:26::i;:::-;38013:4:::0;::::1;::::0;::::1;:::i;:::-;;;;37982:90;;20109:178:::0;-1:-1:-1;;;;;20240:25:0;;20187:7;20240:25;;;:10;:25;;;;;;;:38;;20214:65;;20223:15;;20214:8;:65::i;17473:29::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17473:29:0;;-1:-1:-1;17473:29:0;:::o;24313:82::-;24375:10;24365:21;;;;:9;:21;;;;;;24356:31;;:8;:31::i;:::-;24313:82::o;35499:614::-;39070:2;;;;;;;;;-1:-1:-1;;;;;39070:2:0;-1:-1:-1;;;;;39070:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39058:21:0;:10;-1:-1:-1;;;;;39058:21:0;;39050:47;;;;-1:-1:-1;;;39050:47:0;;;;;;;:::i;:::-;35606:5:::1;::::0;-1:-1:-1;;;;;35588:24:0;;::::1;35606:5;::::0;;::::1;;35588:24;35585:437;;;35918:12;::::0;35882:5:::1;::::0;:30:::1;::::0;-1:-1:-1;;;35882:30:0;;35906:4:::1;35882:30;::::0;::::1;1652:51:1::0;-1:-1:-1;;35881:50:0::1;::::0;35918:12;;35882:5:::1;::::0;;::::1;-1:-1:-1::0;;;;;35882:5:0::1;::::0;:15:::1;::::0;1625:18:1;;35882:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35881:50::-;35865:66;;35963:8;35955:4;:16;;35946:64;;;::::0;-1:-1:-1;;;35946:64:0;;13019:2:1;35946: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;;35946:64:0::1;12817:398:1::0;35946:64:0::1;35614:408;35585:437;36032:34;::::0;-1:-1:-1;;;36032:34:0;;-1:-1:-1;;;;;36032:23:0;::::1;::::0;::::1;::::0;:34:::1;::::0;36056:3;;36061:4;;36032:34:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36092:6;-1:-1:-1::0;;;;;36082:23:0::1;;36100:4;36082:23;;;;687:25:1::0;;675:2;660:18;;541:177;36082:23:0::1;;;;;;;;35499:614:::0;;;:::o;21573:315::-;-1:-1:-1;;;;;21673:25:0;;21633:4;21673:25;;;:10;:25;;;;;;;:38;;21654:15;:57;21650:71;;-1:-1:-1;21720:1:0;;21573:315;-1:-1:-1;21573:315:0:o;21650:71::-;-1:-1:-1;;;;;21752:25:0;;21732:17;21752:25;;;:10;:25;;;;;;;:38;;:59;;21795:15;21752:42;:59::i;:::-;-1:-1:-1;;;;;21843:25:0;;;;;;:10;:25;;;;;:36;;;21732:79;;-1:-1:-1;21829:51:0;;21732:79;;21829:13;:51::i;:::-;21822:58;21573:315;-1:-1:-1;;;21573:315:0:o;26105:2454::-;10567:1;10550:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;10579:20:0;10602:13;;;10579:20;38510:483:::1;38527:12;:19:::0;38523:23;::::1;38510:483;;;38568:13;38584:12;38597:1;38584:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38584:15:0::1;::::0;-1:-1:-1;38655:21:0::1;38584:15:::0;38655:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;38614:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:62:::0;38726:31:::1;38625:5:::0;38726:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;38691:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;38776:21;::::1;::::0;38772:210:::1;;38844:24;38853:7;38862:5;38844:8;:24::i;:::-;-1:-1:-1::0;;;;;38818:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;38928:10:::1;:17:::0;;;;;:38:::1;::::0;;::::1;::::0;38887:31;;;;;;;;:38;;;;;;;;;;:79;38772:210:::1;-1:-1:-1::0;38548:3:0;::::1;::::0;::::1;:::i;:::-;;;;38510:483;;;-1:-1:-1::0;26264:5:0::2;::::0;-1:-1:-1;;;;;26239:31:0;;::::2;26264:5;::::0;;::::2;;26239:31;;26231:84;;;::::0;-1:-1:-1;;;26231:84:0;;13422:2:1;26231:84: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;;26231:84:0::2;13220:404:1::0;26231:84:0::2;-1:-1:-1::0;;;;;26334:23:0;::::2;;::::0;;;:8:::2;:23;::::0;;;;;::::2;;26326:51;;;::::0;-1:-1:-1;;;26326:51:0;;13831:2:1;26326: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;;26326:51:0::2;13629:338:1::0;26326:51:0::2;26596:12;:10;:12::i;:::-;-1:-1:-1::0;;26691:46:0::2;::::0;-1:-1:-1;;;26691:46:0;;26731:4:::2;26691:46;::::0;::::2;1652:51:1::0;26679:9:0::2;::::0;-1:-1:-1;;;;;26691:31:0;::::2;::::0;::::2;::::0;1625:18:1;;26691:46:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26679:58:::0;-1:-1:-1;26918:74:0::2;-1:-1:-1::0;;;;;26918:38:0;::::2;26957:10;26977:4;26984:7:::0;26918:38:::2;:74::i;:::-;27015:46;::::0;-1:-1:-1;;;27015:46:0;;27055:4:::2;27015:46;::::0;::::2;1652:51:1::0;27003:9:0::2;::::0;-1:-1:-1;;;;;27015:31:0;::::2;::::0;::::2;::::0;1625:18:1;;27015:46:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27003:58:::0;-1:-1:-1;27082:11:0::2;27089:4:::0;27003:58;27082:11:::2;:::i;:::-;27072:21;;27122:1;27112:7;:11;27104:61;;;::::0;-1:-1:-1;;;27104:61:0;;14174:2:1;27104: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;;27104:61:0::2;13972:401:1::0;27104:61:0::2;-1:-1:-1::0;;;;;27201:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;;;;:38:::2;::::0;27182:15:::2;:57;27178:1074;;-1:-1:-1::0;;;;;27307:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:41:::2;;::::0;27295:54:::2;::::0;:7;;:11:::2;:54::i;:::-;-1:-1:-1::0;;;;;27256:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:36:::2;;:93:::0;27178:1074:::2;;;-1:-1:-1::0;;;;;27473:25:0;::::2;27451:19;27473:25:::0;;;:10:::2;:25;::::0;;;;;;:36:::2;::::0;::::2;::::0;27544:38;::::2;::::0;27473:36;;27451:19;27544:59:::2;::::0;27587:15:::2;27544:42;:59::i;:::-;-1:-1:-1::0;;;;;27651:25:0;::::2;27618:16;27651:25:::0;;;:10:::2;:25;::::0;;;;:36:::2;;::::0;27524:79;;-1:-1:-1;27618:16:0;27637:51:::2;::::0;27524:79;;27637:13:::2;:51::i;:::-;-1:-1:-1::0;;;;;27768:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:41:::2;;::::0;27618:70;;-1:-1:-1;27742:68:0::2;::::0;:21:::2;:7:::0;27618:70;27742:11:::2;:21::i;:68::-;-1:-1:-1::0;;;;;27703:25:0;;::::2;;::::0;;;:10:::2;:25;::::0;;;;:36:::2;;:107:::0;;;;27866:5:::2;::::0;::::2;27846:10;:26;;::::0;:103:::2;;-1:-1:-1::0;;;;;;27905:25:0;;::::2;;::::0;;;:10:::2;:25;::::0;;;;:44;::::2;27893:10;:56;;27846:103;27825:416;;;-1:-1:-1::0;;;;;28041:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:36:::2;;::::0;:54;-1:-1:-1;28041:54:0::2;::::0;:101:::2;;;28134:8;28124:7;:18;28041:101;27984:241;;;::::0;-1:-1:-1;;;27984:241:0;;14580:2:1;27984: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;;27984:241:0::2;14378:401:1::0;27984:241:0::2;27367:885;;;27178:1074;-1:-1:-1::0;;;;;28264:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;28307:15:::2;28264:40;::::0;::::2;:58:::0;;;28394:41:::2;::::0;;::::2;::::0;28374:62:::2;::::0;28307:15;28374:19:::2;:62::i;:::-;-1:-1:-1::0;;;;;28333:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;;;;;:38;;::::2;:103:::0;;;;28452:47;687:25:1;;;28479:10:0::2;::::0;28452:47:::2;::::0;660:18:1;28452:47:0::2;;;;;;;-1:-1:-1::0;;;;;28510:30:0;::::2;;::::0;;;:15:::2;:30;::::0;;;;:41;;28544:7;;28510:30;:41:::2;::::0;28544:7;;28510:41:::2;:::i;:::-;;;;;;;;26220:2339;;10626:1:::1;10662:13:::0;;10646:12;:29;10638:73;;;;-1:-1:-1;;;10638:73:0;;;;;;;:::i;22912:396::-;10567:1;10550:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;10579:20:0;10602:13;39164:6:::1;::::0;::::1;;39163:7;39155:27;;;::::0;-1:-1:-1;;;39155:27:0;;10904:2:1;39155: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;;39155:27:0::1;10702:330:1::0;39155:27:0::1;22988:10:::2;38515:6;38510:483;38527:12;:19:::0;38523:23;::::2;38510:483;;;38568:13;38584:12;38597:1;38584:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;38584:15:0::2;::::0;-1:-1:-1;38655:21:0::2;38584:15:::0;38655:14:::2;:21::i;:::-;-1:-1:-1::0;;;;;38614:17:0;::::2;;::::0;;;:10:::2;:17;::::0;;;;:38:::2;;:62:::0;38726:31:::2;38625:5:::0;38726:24:::2;:31::i;:::-;-1:-1:-1::0;;;;;38691:17:0;;::::2;;::::0;;;:10:::2;:17;::::0;;;;:32:::2;;:66:::0;;;;38776:21;::::2;::::0;38772:210:::2;;38844:24;38853:7;38862:5;38844:8;:24::i;:::-;-1:-1:-1::0;;;;;38818:16:0;;::::2;;::::0;;;:7:::2;:16;::::0;;;;;;;:23;;::::2;::::0;;;;;;;;;:50;;;;38928:10:::2;:17:::0;;;;;:38:::2;::::0;;::::2;::::0;38887:31;;;;;;;;:38;;;;;;;;;;:79;38772:210:::2;-1:-1:-1::0;38548:3:0;::::2;::::0;::::2;:::i;:::-;;;;38510:483;;;;23028:1:::3;23019:6;:10;23011:37;;;::::0;-1:-1:-1;;;23011:37:0;;11239:2:1;23011: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;;23011:37:0::3;11037:338:1::0;23011:37:0::3;23074:12;::::0;:24:::3;::::0;23091:6;23074:16:::3;:24::i;:::-;23059:12;:39:::0;23143:10:::3;23133:21;::::0;;;:9:::3;:21;::::0;;;;;:33:::3;::::0;23159:6;23133:25:::3;:33::i;:::-;23119:10;23109:21;::::0;;;:9:::3;:21;::::0;;;;:57;;;;23177:5:::3;::::0;:57:::3;::::0;:5:::3;::::0;;::::3;-1:-1:-1::0;;;;;23177:5:0::3;::::0;23220:4:::3;23227:6:::0;23177:22:::3;:57::i;:::-;23250:27;::::0;687:25:1;;;23258:10:0::3;::::0;23250:27:::3;::::0;675:2:1;660:18;23250:27:0::3;541:177:1::0;21371:194:0;-1:-1:-1;;;;;21515:25:0;;21447:7;21515:25;;;:10;:25;;;;;:41;;;;21474:36;;;;;:83;;:40;:83::i;34775:615::-;39070:2;;;;;;;;;-1:-1:-1;;;;;39070:2:0;-1:-1:-1;;;;;39070:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39058:21:0;:10;-1:-1:-1;;;;;39058:21:0;;39050:47;;;;-1:-1:-1;;;39050:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34922:23:0;::::1;;::::0;;;:8:::1;:23;::::0;;;;;::::1;;:32;::::0;::::1;:95;;-1:-1:-1::0;;;;;;34971:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;:41:::1;;::::0;:46;34922:95:::1;34900:166;;;::::0;-1:-1:-1;;;34900:166:0;;14986:2:1;34900: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;;34900:166:0::1;14784:344:1::0;34900:166:0::1;35111:5;::::0;-1:-1:-1;;;;;35086:31:0;;::::1;35111:5;::::0;;::::1;;35086:31;;35077:73;;;::::0;-1:-1:-1;;;35077:73:0;;15335:2:1;35077:73:0::1;::::0;::::1;15317:21:1::0;15374:2;15354:18;;;15347:30;15413;15393:18;;;15386:58;15461:18;;35077:73:0::1;15133:352:1::0;35077:73:0::1;35161:12;:32:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;35161:32:0;;::::1;-1:-1:-1::0;;;;;;35161:32:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;35204:23:0;;;:8:::1;35161:32;35204:23:::0;;;;;;;:30;;-1:-1:-1;;35204:30:0::1;::::0;::::1;::::0;;35245:10:::1;:25:::0;;;;;;:66;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;35322:41;::::1;:60:::0;34775:615::o;28567:120::-;28619:13;28634;10567:1;10550:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;10579:20:0;10602:13;28667:12:::1;:10;:12::i;:::-;28660:19;;;;10662:13:::0;;10646:12;:29;10638:73;;;;-1:-1:-1;;;10638:73:0;;;;;;;:::i;:::-;10539:180;28567:120;;:::o;23718:86::-;23768:5;;:27;;-1:-1:-1;;;23768:27:0;;23784:10;23768:27;;;1652:51:1;23760:36:0;;23768:5;;;-1:-1:-1;;;;;23768:5:0;;:15;;1625:18:1;;23768:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26000:97::-;26055:10;26045:21;;;;:9;:21;;;;;;26036:31;;:8;:31::i;:::-;26078:11;:9;:11::i;20295:468::-;20363:7;20387:12;;20403:1;20387:17;20383:103;;;-1:-1:-1;;;;;;20428:25:0;;;;;:10;:25;;;;;:46;;;;20295:468::o;20383:103::-;20727:12;;-1:-1:-1;;;;;20675:25:0;;;;;;:10;:25;;;;;:36;;;;20629:40;;;;;20516:239;;20585:155;;20727:12;;20585:137;;20717:4;;20585:127;;20675:36;20585:127;;:39;20686:13;20585:24;:39::i;:85::-;:89;;:127::i;:155::-;-1:-1:-1;;;;;20516:25:0;;;;;;:10;:25;;;;;:46;;;;:50;:239::i;17509:28::-;;;;;;;;;;;;14646:184;14704:7;14737:1;14732;:6;;14724:49;;;;-1:-1:-1;;;14724:49:0;;15692:2:1;14724:49:0;;;15674:21:1;15731:2;15711:18;;;15704:30;15770:32;15750:18;;;15743:60;15820:18;;14724:49:0;15490:354:1;14724:49:0;14784:9;14796:5;14800:1;14796;:5;:::i;:::-;14784:17;14646:184;-1:-1:-1;;;;14646:184:0:o;15081:470::-;15139:7;15383:6;15379:47;;-1:-1:-1;15413:1:0;15406:8;;15379:47;15438:9;15450:5;15454:1;15450;:5;:::i;:::-;15438:17;-1:-1:-1;15483:1:0;15474:5;15478:1;15438:17;15474:5;:::i;:::-;:10;15466:56;;;;-1:-1:-1;;;15466:56:0;;16446:2:1;15466: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;;15466:56:0;16244:397:1;16019:333:0;16077:7;16176:1;16172;:5;16164:44;;;;-1:-1:-1;;;16164:44:0;;16848:2:1;16164:44:0;;;16830:21:1;16887:2;16867:18;;;16860:30;16926:28;16906:18;;;16899:56;16972:18;;16164:44:0;16646:350:1;16164:44:0;16219:9;16231:5;16235:1;16231;:5;:::i;14190:181::-;14248:7;;14280:5;14284:1;14280;:5;:::i;:::-;14268:17;;14309:1;14304;:6;;14296:46;;;;-1:-1:-1;;;14296:46:0;;17203:2:1;14296:46:0;;;17185:21:1;17242:2;17222:18;;;17215:30;17281:29;17261:18;;;17254:57;17328:18;;14296:46:0;17001:351:1;10820:176:0;10903:85;10922:5;10952:23;;;10977:2;10981:5;10929:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;10929:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;10929:58:0;-1:-1:-1;;;;;;10929:58:0;;;;;;;;;;10903:18;:85::i;28695:6014::-;28735:13;28750;28777:10;28790:5;;;;;;;;;-1:-1:-1;;;;;28790:5:0;-1:-1:-1;;;;;28790:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28777:43;;28831:12;28854:1;28846:5;:9;:50;;28894:1;28846:50;;;28858:5;;;;;;;;;-1:-1:-1;;;;;28858:5:0;-1:-1:-1;;;;;28858:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28977:9;;28831:65;;-1:-1:-1;;;;28977:9:0;;;;28972:3280;;29230:11;:18;29219:8;29230:18;29285:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29285:17:0;;29260:42;;29314:23;29351:3;29340:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29340:15:0;;29314:41;;29371:7;29367:490;29385:3;29380:2;:8;29367:490;;;29433:11;29445:2;29433:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29433:15:0;29412:6;29419:2;29412:10;;;;;;;;:::i;:::-;;;;;;:38;-1:-1:-1;;;;;29412:38:0;;;-1:-1:-1;;;;;29412:38:0;;;;;29764:1;-1:-1:-1;;;;;29733:33:0;29741:6;29748:2;29741:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;29733:33:0;;:111;;29809:6;29816:2;29809:10;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;-1:-1:-1;;;29809:35:0;;29838:4;29809:35;;;1652:51:1;-1:-1:-1;;;;;29809:20:0;;;;;;1625:18:1;;29809:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29733:111;;;29787:1;29733:111;29699:9;29709:2;29699:13;;;;;;;;:::i;:::-;;;;;;;;;;:145;29390:4;;;;:::i;:::-;;;;29367:490;;;;29889:5;;;;;;;;-1:-1:-1;;;;;29889:5:0;-1:-1:-1;;;;;29875:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29875:33:0;;;;;;;;-1:-1:-1;;29875:33:0;;;;;;;;;;;;:::i;:::-;;;29871:2370;;-1:-1:-1;32220:1:0;;;;-1:-1:-1;28695:6014:0;-1:-1:-1;;;;;28695:6014:0:o;29871:2370::-;;;30152:7;30148:1923;30170:3;30165:2;:8;30148:1923;;;30267:7;30330:1;-1:-1:-1;;;;;30299:33:0;30307:6;30314:2;30307:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30299:33:0;;:119;;30383:6;30390:2;30383:10;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;-1:-1:-1;;;30383:35:0;;30412:4;30383:35;;;1652:51:1;-1:-1:-1;;;;;30383:20:0;;;;;;1625:18:1;;30383:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30299:119;;;30357:1;30299:119;30267:151;;30658:9;30668:2;30658:13;;;;;;;;:::i;:::-;;;;;;;30653:2;:18;30650:1339;;;30786:1;30780:3;30771:5;30754:9;30764:2;30754:13;;;;;;;;:::i;:::-;;;;;;;30749:2;:18;;;;:::i;:::-;30748:28;;;;:::i;:::-;30746:37;;;;:::i;:::-;:41;30742:370;;;30820:6;30827:2;30820:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30820:19:0;;30840:4;30883:3;30874:5;30849:21;30856:9;30866:2;30856:13;;;;;;;;:::i;:::-;;;;;;;30849:2;:6;;:21;;;;:::i;:::-;30848:31;;;;:::i;:::-;30846:40;;;;:::i;:::-;30820:68;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30961:6;30968:2;30961:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30924:89:0;30948:4;-1:-1:-1;;;;;30924:89:0;30937:10;-1:-1:-1;;;;;30924:89:0;;31009:3;31000:5;30975:21;30982:9;30992:2;30982:13;;;;;;;;:::i;:::-;;;;;;;30975:2;:6;;:21;;;;:::i;:::-;30974:31;;;;:::i;:::-;30973:39;;;;:::i;:::-;30924:89;;687:25:1;;;675:2;660:18;30924:89:0;;;;;;;31049:6;31056:2;31049:10;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;-1:-1:-1;;;31049:35:0;;31078:4;31049:35;;;1652:51:1;-1:-1:-1;;;;;31049:20:0;;;;;;1625:18:1;;31049:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31044:40;;30742:370;31191:8;;-1:-1:-1;;;;;31191:8:0;31187:779;;31246:5;;31280:10;;-1:-1:-1;;;;;31246:5:0;;;;:24;;31280:6;;31287:2;;31280:10;;;;;;:::i;:::-;;;;;;;31294:21;31301:9;31311:2;31301:13;;;;;;;;:::i;:::-;;;;;;;31294:2;:6;;:21;;;;:::i;:::-;31246:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31400:6;31407:2;31400:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;31354:81:0;31384:5;;;;;;;;;-1:-1:-1;;;;;31384:5:0;-1:-1:-1;;;;;31354:81:0;31364:10;-1:-1:-1;;;;;31354:81:0;-1:-1:-1;;;;;;;;;;;31419:9:0;31429:2;31419:13;;;;;;;;:::i;:::-;;;;;;;31414:2;:18;;;;:::i;:::-;31354:81;;687:25:1;;;675:2;660:18;31354:81:0;;;;;;;31515:9;31525:2;31515:13;;;;;;;;:::i;:::-;;;;;;;31510:2;:18;;;;:::i;:::-;31466:16;:39;31492:6;31499:2;31492:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;31466:39:0;-1:-1:-1;;;;;31466:39:0;;;;;;;;;;;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;31187:779:0;;-1:-1:-1;31187:779:0;;31678:6;31685:2;31678:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;31678:19:0;;31698:8;;;;;;;;;-1:-1:-1;;;;;31698:8:0;31709:21;31716:9;31726:2;31716:13;;;;;;;;:::i;31709:21::-;31678:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31809:6;31816:2;31809:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;31769:75:0;31791:8;;;;;;;;;-1:-1:-1;;;;;31791:8:0;-1:-1:-1;;;;;31769:75:0;31779:10;-1:-1:-1;;;;;31769:75:0;-1:-1:-1;;;;;;;;;;;31828:9:0;31838:2;31828:13;;;;;;;;:::i;:::-;;;;;;;31823:2;:18;;;;:::i;:::-;31769:75;;687:25:1;;;675:2;660:18;31769:75:0;;;;;;;31924:9;31934:2;31924:13;;;;;;;;:::i;:::-;;;;;;;31919:2;:18;;;;:::i;:::-;31875:16;:39;31901:6;31908:2;31901:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;31875:39:0;-1:-1:-1;;;;;31875:39:0;;;;;;;;;;;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;31187:779:0;-1:-1:-1;30175:4:0;;;;:::i;:::-;;;;30148:1923;;;-1:-1:-1;32097:1:0;;;;-1:-1:-1;28695:6014:0;-1:-1:-1;;;;;;28695:6014:0:o;28972:3280::-;32369:15;32386;32419:5;;;;;;;;-1:-1:-1;;;;;32419:5:0;-1:-1:-1;;;;;32405:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32516:40;;-1:-1:-1;;;32516:40:0;;32550:4;32516:40;;;1652:51:1;32368:67:0;;-1:-1:-1;32368:67:0;-1:-1:-1;32504:9:0;;-1:-1:-1;;;;;32516:25:0;;;;;1625:18:1;;32516:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32579;;-1:-1:-1;;;32579:40:0;;32613:4;32579:40;;;1652:51:1;32504:52:0;;-1:-1:-1;32567:9:0;;-1:-1:-1;;;;;32579:25:0;;;;;1625:18:1;;32579:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32567:52;;32678:5;;;;;;;;-1:-1:-1;;;;;32678:5:0;-1:-1:-1;;;;;32664:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;32719:40:0;;-1:-1:-1;;;32719:40:0;;32753:4;32719:40;;;1652:51:1;32762:4:0;;-1:-1:-1;;;;;32719:25:0;;;;;1625:18:1;;32719:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;32788:40;;-1:-1:-1;;;32788:40:0;;32822:4;32788:40;;;1652:51:1;32708:58:0;;-1:-1:-1;32831:4:0;;-1:-1:-1;;;;;32788:25:0;;;;;1625:18:1;;32788:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;32777:58;-1:-1:-1;32975:1:0;32969:3;32949:16;32960:5;32949:8;:16;:::i;:::-;32947:25;;;;:::i;:::-;:29;32943:269;;;-1:-1:-1;;;;;32993:24:0;;;33018:4;33041:3;33025:14;33034:5;33025:8;:14;:::i;:::-;33024:20;;;;:::i;:::-;32993:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;33066:58:0;;;;;;33079:10;33066:58;33120:3;33104:14;33113:5;33104:8;:14;:::i;:::-;33103:20;;;;:::i;:::-;33066:58;;687:25:1;;;675:2;660:18;33066:58:0;;;;;;;33150:40;;-1:-1:-1;;;33150:40:0;;33184:4;33150:40;;;1652:51:1;33150:50:0;;33195:4;;-1:-1:-1;;;;;33150:25:0;;;;;1625:18:1;;33150:40:0;1485:224:1;33150:50:0;33139:61;;32943:269;33254:1;33248:3;33228:16;33239:5;33228:8;:16;:::i;:::-;33226:25;;;;:::i;:::-;:29;33222:269;;;-1:-1:-1;;;;;33272:24:0;;;33297:4;33320:3;33304:14;33313:5;33304:8;:14;:::i;:::-;33303:20;;;;:::i;:::-;33272:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;33345:58:0;;;;;;33358:10;33345:58;33399:3;33383:14;33392:5;33383:8;:14;:::i;:::-;33382:20;;;;:::i;:::-;33345:58;;687:25:1;;;675:2;660:18;33345:58:0;;;;;;;33429:40;;-1:-1:-1;;;33429:40:0;;33463:4;33429:40;;;1652:51:1;33429:50:0;;33474:4;;-1:-1:-1;;;;;33429:25:0;;;;;1625:18:1;;33429:40:0;1485:224:1;33429:50:0;33418:61;;33222:269;33534:8;;-1:-1:-1;;;;;33534:8:0;33530:1132;;33574:12;;33570:269;;33604:5;;:43;;-1:-1:-1;;;33604:43:0;;-1:-1:-1;;;;;33604:5:0;;;;:24;;:43;;33629:7;;33638:8;;33604:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;33663:27:0;;;;;;:16;:27;;;;;:39;;33694:8;;33663:27;:39;;33694:8;;33663:39;:::i;:::-;;;;-1:-1:-1;;33798:8:0;;33776:50;;687:25:1;;;-1:-1:-1;;;;;33776:50:0;;;;33798:8;;33786:10;;-1:-1:-1;;;;;;;;;;;33776:50:0;675:2:1;660:18;33776:50:0;;;;;;;33570:269;33854:12;;33850:269;;33884:5;;:43;;-1:-1:-1;;;33884:43:0;;-1:-1:-1;;;;;33884:5:0;;;;:24;;:43;;33909:7;;33918:8;;33884:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;33943:27:0;;;;;;:16;:27;;;;;:39;;33974:8;;33943:27;:39;;33974:8;;33943:39;:::i;:::-;;;;-1:-1:-1;;34078:8:0;;34056:50;;687:25:1;;;-1:-1:-1;;;;;34056:50:0;;;;34078:8;;34066:10;;-1:-1:-1;;;;;;;;;;;34056:50:0;675:2:1;660:18;34056:50:0;;;;;;;33850:269;33530:1132;;;34227:8;;34202:44;;-1:-1:-1;;;34202:44:0;;-1:-1:-1;;;;;34202:24:0;;;;;;:44;;34227:8;;;;34237;;34202:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;34283:8:0;;34258:44;;-1:-1:-1;;;34258:44:0;;-1:-1:-1;;;;;34258:24:0;;;;;;:44;;34283:8;;;;34293;;34258:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;34344:8:0;;34322:50;;687:25:1;;;-1:-1:-1;;;;;34322:50:0;;;;34344:8;;34332:10;;-1:-1:-1;;;;;;;;;;;34322:50:0;675:2:1;660:18;34322:50:0;;;;;;;34414:8;;34392:50;;687:25:1;;;-1:-1:-1;;;;;34392:50:0;;;;34414:8;;34402:10;;-1:-1:-1;;;;;;;;;;;34392:50:0;675:2:1;660:18;34392:50:0;;;;;;;-1:-1:-1;;;;;34457:27:0;;;;;;:16;:27;;;;;:39;;34488:8;;34457:27;:39;;34488:8;;34457:39;:::i;:::-;;;;-1:-1:-1;;;;;;;34561:27:0;;;;;;:16;:27;;;;;:39;;34592:8;;34561:27;:39;;34592:8;;34561:39;:::i;:::-;;;;-1:-1:-1;;33530:1132:0;34674:27;;;;;;28695:6014;;:::o;11004:204::-;11131:68;;-1:-1:-1;;;;;18255:15:1;;;11131:68:0;;;18237:34:1;18307:15;;18287:18;;;18280:43;18339:18;;;18332:34;;;11105:95:0;;11124:5;;-1:-1:-1;;;11154:27:0;18172:18:1;;11131:68:0;17997:375:1;11105:95:0;11004:204;;;;:::o;25063:666::-;10567:1;10550:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;10579:20:0;10602:13;;;25161:7;;38510:483:::1;38527:12;:19:::0;38523:23;::::1;38510:483;;;38568:13;38584:12;38597:1;38584:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38584:15:0::1;::::0;-1:-1:-1;38655:21:0::1;38584:15:::0;38655:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;38614:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:62:::0;38726:31:::1;38625:5:::0;38726:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;38691:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;38776:21;::::1;::::0;38772:210:::1;;38844:24;38853:7;38862:5;38844:8;:24::i;:::-;-1:-1:-1::0;;;;;38818:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;38928:10:::1;:17:::0;;;;;:38:::1;::::0;;::::1;::::0;38887:31;;;;;;;;:38;;;;;;;;;;:79;38772:210:::1;-1:-1:-1::0;38548:3:0;::::1;::::0;::::1;:::i;:::-;;;;38510:483;;;;25186:6:::2;25181:518;25198:7;:14;25194:1;:18;25181:518;;;25234:21;25258:7;25266:1;25258:10;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;-1:-1:-1;;;;;25301:16:0;;::::2;25283:15;25301:16:::0;;;:7:::2;:16:::0;;;;;;:31;;::::2;::::0;;;;;;;;;;25258:10;;-1:-1:-1;25351:11:0;;25347:341:::2;;-1:-1:-1::0;;;;;25383:16:0;;::::2;25417:1;25383:16:::0;;;:7:::2;:16;::::0;;;;;;;:31;;::::2;::::0;;;;;;;;;:35;25437:52:::2;::::0;25391:7;25481;25437:34:::2;:52::i;:::-;25541:7;-1:-1:-1::0;;;;;25513:45:0::2;25526:13;-1:-1:-1::0;;;;;25513:45:0::2;;25550:7;25513:45;;;;687:25:1::0;;675:2;660:18;;541:177;25513:45:0::2;;;;;;;;-1:-1:-1::0;;;;;25577:22:0;::::2;;::::0;;;:7:::2;:22;::::0;;;;:33;;25603:7;;25577:22;:33:::2;::::0;25603:7;;25577:33:::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;25629:17:0;;::::2;;::::0;;;:8:::2;:17;::::0;;;;;;;:32;;::::2;::::0;;;;;;;;:43;;25665:7;;25629:17;:43:::2;::::0;25665:7;;25629:43:::2;:::i;:::-;::::0;;;-1:-1:-1;;25347:341:0::2;25219:480;;25214:3;;;;;:::i;:::-;;;;25181:518;;;;25709:12;:10;:12::i;9371:106::-:0;9429:7;9460:1;9456;:5;:13;;9468:1;9456:13;;;-1:-1:-1;9464:1:0;;9371:106;-1:-1:-1;9371:106:0:o;12814:1114::-;-1:-1:-1;;;;;13418:25:0;;9039:20;13410:71;;;;-1:-1:-1;;;13410:71:0;;18579:2:1;13410:71:0;;;18561:21:1;18618:2;18598:18;;;18591:30;18657:33;18637:18;;;18630:61;18708:18;;13410:71:0;18377:355:1;13410:71:0;13555:12;13569:23;13604:5;-1:-1:-1;;;;;13596:19:0;13616:4;13596:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13554:67;;;;13640:7;13632:52;;;;-1:-1:-1;;;13632:52:0;;19370:2:1;13632:52:0;;;19352:21:1;;;19389:18;;;19382:30;19448:34;19428:18;;;19421:62;19500:18;;13632:52:0;19168:356:1;13632:52:0;13701:17;;:21;13697:224;;13843:10;13832:30;;;;;;;;;;;;:::i;:::-;13824:85;;;;-1:-1:-1;;;13824:85:0;;19731:2:1;13824: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;;13824: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;5176:348::-;5260:6;5313:2;5301:9;5292:7;5288:23;5284:32;5281:52;;;5329:1;5326;5319:12;5281:52;5369:9;5356:23;5402:18;5394:6;5391:30;5388:50;;;5434:1;5431;5424:12;5388:50;5457:61;5510:7;5501:6;5490:9;5486:22;5457: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://cebd89c532c39dff28e605d8662ea3f1a93b28f80d12ac1731898220bf59bbd6
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.