Contract Overview
Balance:
0 FTM
FTM Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x77b00f36ee7972e0e0266026345340b2c003623a0b8165dd9284b763ac06ded7 | 0x60806040 | 57873375 | 5 days 20 mins ago | 0x5c146cd18fa53914580573c9b9604588529406ca | IN | Create: Voter | 0 FTM | 0.360691491037 |
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x77b00f36ee7972e0e0266026345340b2c003623a0b8165dd9284b763ac06ded7 | 57873375 | 5 days 20 mins ago | 0x5c146cd18fa53914580573c9b9604588529406ca | Contract Creation | 0 FTM |
[ Download CSV Export ]
Contract Name:
Voter
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at FtmScan.com on 2023-03-18 */ /** *v1.4.4 *0xC45f2AFEb6E34488cf8987F0458Ab3f93C8D49BF *Submitted for verification at FtmScan.com on 2023-03-09 */ /** *v1.4.3 *0xDFf9bA0A6361EF588398aE5631B0055169e2F072 *Submitted for verification at FtmScan.com on 2023-03-09 */ /** *v1.4.2 *0xB99c82191Ee5Dc240bd2a77827413574075ed2F6 *Submitted for verification at FtmScan.com on 2023-03-06 */ /** *v1.4.1 *0xFE363d3DE8a0beA47cC7d7f5c096D3852AdbC396 *Submitted for verification at FtmScan.com on 2023-02-22 */ /** *v1.3.10 *0x2f2c3a2ee4f63640a044e8a7fd01102c7aaf5186 *Submitted for verification at FtmScan.com on 2023-02-12 */ /** *v1.3.9 *0x81377455214496CA22d9658eFAEFddd83775Aac3 *Submitted for verification at FtmScan.com on 2023-02-11 */ /** *v1.3.7 *0x0A6e8D4d8685F80374FD88f08AbbCA5F5DdE9D4F *Submitted for verification at FtmScan.com on 2023-01-29 */ /** *v1.3.5 *0xb333bb146b29d6caa078905f551679137aabd0c5 *Submitted for verification at FtmScan.com on 2023-01-18 */ /** *v1.3.1 *0x225d1e237b8089734fb15C1C206BbB98415d4B46 *Submitted for verification at FtmScan.com on 2023-01-03 */ /** *v1.3.0 *0x95797abf5988479138c783dbcc97db869b373bdb *Submitted for verification at FtmScan.com on 2022-12-26 */ /** *v1.2.0 *0x6bF6A6185afE3cc88707b0b6474F6AFceE59EFED *Submitted for verification at FtmScan.com on 2022-11-28 */ /**v1.1.0 *0xB171D9126d01E6DDb76Df8dd30e3A0C712f2cF5c *Submitted for verification at FtmScan.com on 2022-11-09 */ /** * EQUALIZER EXCHANGE * The New Liquidity Hub of Fantom chain! * https://equalizer.exchange (Dapp) * https://discord.gg/MaMhbgHMby (Community) * * * * Version: 1.5.0 * * Version: 1.5.0 * - Only `base` as initial `allowedRewards[]` * - Introduce concept of Gaugable * - Introduce concept of protocolFeesTaker * * Version: 1.4.4 * - createGaugeMulti * - LFG! * * * Contributors: * - Andre Cronje, Solidly.Exchange * - Velodrome.finance Team * - @smartcoding51 * - 543#3017 (Sam), ftm.guru & Equalizer.exchange * * * SPDX-License-Identifier: UNLICENSED */ // File: contracts/interfaces/IVotingEscrow.sol pragma solidity 0.8.9; 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/IPairFactory.sol pragma solidity 0.8.9; interface IPairFactory { function isPaused() external view returns (bool); function token0() external view returns (address); function token1() external view returns (address); function allPairsLength() external view returns (uint); function isPair(address pair) external view returns (bool); function getFee(bool _stable) external view returns(uint256); function pairCodeHash() external pure returns (bytes32); function getPair(address tokenA, address token, bool stable) external view returns (address); function getInitializable() external view returns (address, address, bool); function createPair(address tokenA, address tokenB, bool stable) external returns (address pair); } // File: contracts/interfaces/IPair.sol pragma solidity 0.8.9; 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); function stable() external view returns (bool s); } // File: contracts/interfaces/IMinter.sol pragma solidity 0.8.9; interface IMinter { function update_period() external returns (uint); } // File: contracts/interfaces/IERC20.sol pragma solidity 0.8.9; 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/IGaugeFactory.sol pragma solidity 0.8.9; interface IGaugeFactory { function createGauge(address _p, address _b, address _v, bool _n, address[] memory _r) external returns (address); } // File: contracts/interfaces/IGauge.sol pragma solidity 0.8.9; interface IGauge { function notifyRewardAmount(address token, uint amount) external; function getReward(address account, address[] memory tokens) external; function claimFees() external returns (uint claimed0, uint claimed1); function left(address token) external view returns (uint); function isForPair() external view returns (bool); } // File: contracts/interfaces/IBribeFactory.sol pragma solidity 0.8.9; interface IBribeFactory { function createBribe(address[] memory) external returns (address); } // File: contracts/interfaces/IBribe.sol pragma solidity 0.8.9; interface IBribe { function _deposit(uint amount, uint tokenId, address _vtr, address _onr) external; function _withdraw(uint amount, uint tokenId, address _vtr, address _onr) external; function getRewardForOwner(uint tokenId, address[] memory tokens) external; function notifyRewardAmount(address token, uint amount) external; function left(address token) external view returns (uint); } // File: contracts/libraries/Math.sol pragma solidity 0.8.9; library Math { function max(uint a, uint b) internal pure returns (uint) { return a >= b ? a : b; } function min(uint a, uint b) internal pure returns (uint) { return a < b ? a : b; } function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } function cbrt(uint256 n) internal pure returns (uint256) { unchecked { uint256 x = 0; for (uint256 y = 1 << 255; y > 0; y >>= 3) { x <<= 1; uint256 z = 3 * x * (x + 1) + 1; if (n / y >= z) { n -= y * z; x += 1; } } return x; }} } // File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } } // File: contracts/Voter.sol pragma solidity 0.8.9; contract Voter is Initializable { /// @dev rewards are released over 7 days uint public constant DURATION = 7 days; /// @dev the ve token that governs these contracts address public _ve; address public factory; // the PairFactory address public base; address public gaugefactory; address public bribefactory; address public minter; address public ms; // team-governor-council-treasury multi-sig address public governor; // should be set to an IGovernor /// @dev credibly neutral party similar to Curve's Emergency DAO address public emergencyCouncil; address public protocolFeesTaker; uint public protocolFeesPerMillion; uint public totalWeight; // total voting weight address[] public pools; // all pools viable for incentives mapping(address => address) public gauges; // pool => gauge mapping(address => address) public poolForGauge; // gauge => pool mapping(address => address) public bribes; // gauge => unified bribes mapping(address => uint256) public weights; // pool => weight mapping(uint => mapping(address => uint256)) public votes; // nft => pool => votes mapping(uint => address[]) public poolVote; // nft => pools mapping(uint => uint) public usedWeights; // nft => total voting weight of user mapping(uint => uint) public lastVoted; // nft => timestamp of last vote, to ensure one vote per epoch mapping(address => bool) public isGauge; mapping(address => bool) public isWhitelisted; mapping(address => bool) public isAlive; // killed implies no emission allocation bool internal _locked; /// @dev simple re-entrancy check uint public index; mapping(address => uint) public supplyIndex; mapping(address => uint) public claimable; mapping(address => bool) public unvotable; // disable voting for certain pools mapping(address => bool) public gaugable; // enable creation for pools with one of these constituents bool public pokable; // toggle poking /********************************************************************************************/ /*****************************************NON-STORAGE****************************************/ /********************************************************************************************/ /// NON-STORAGE: Events event GaugeAndBribeCreated(address indexed pool, address gauge, address bribe, address indexed creator, address[] gaugeRewards, address[] allowedRewards); event GaugeKilled(address indexed gauge); event GaugeRevived(address indexed gauge); event Voted(address indexed pooladdr, address voter, address indexed tokenOwner, uint indexed tokenId, uint256 weight, uint256 ts); event Abstained(uint indexed tokenId, uint256 weight); event Deposit(address indexed lp, address indexed gauge, uint indexed tokenId, uint amount); event Withdraw(address indexed lp, address indexed gauge, uint indexed tokenId, uint amount); event NotifyReward(address indexed sender, address indexed reward, uint amount); event DistributeReward(address indexed sender, address indexed gauge, uint amount); event Attach(address indexed owner, address indexed gauge, uint indexed tokenId); event Detach(address indexed owner, address indexed gauge, uint indexed tokenId); event Whitelisted(address indexed whitelister, address indexed token, bool indexed status); /// NON-STORAGE: Modifiers modifier lock() { require(!_locked, "No re-entrancy"); _locked = true; _; _locked = false; } /// NON-STORAGE: Functions function initialize( address __ve, address _factory, address _gauges, address _bribes ) public initializer { _ve = __ve; factory = _factory; base = IVotingEscrow(__ve).token(); gaugefactory = _gauges; bribefactory = _bribes; minter = msg.sender; governor = msg.sender; emergencyCouncil = msg.sender; protocolFeesTaker = msg.sender; ms = msg.sender; } modifier onlyNewEpoch(uint _tokenId) { // ensure new epoch since last vote require((block.timestamp / DURATION) * DURATION > lastVoted[_tokenId], "TOKEN_ALREADY_VOTED_THIS_EPOCH"); _; } function initialSetup(address[] memory _tokens, address _minter) external { require(msg.sender == minter, "Not minter!"); for (uint i = 0; i < _tokens.length; i++) { _whitelist(_tokens[i]); } minter = _minter; } function setGovernor(address _governor) public { require(msg.sender == governor, "Not governor!"); governor = _governor; } function setEmergencyCouncil(address _council) public { require(msg.sender == emergencyCouncil, "Not emergency council!"); emergencyCouncil = _council; } function setProtocolFeesTaker(address _pft) public { require(msg.sender == governor, "Not Protocol Fees Taker!"); protocolFeesTaker = _pft; } function setProtocolFeesPerMillion(uint _pf) public { require(msg.sender == governor, "Not governor!"); protocolFeesPerMillion = _pf; } function reset(uint _tokenId) external onlyNewEpoch(_tokenId) { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId), "Neither approved nor owner"); lastVoted[_tokenId] = block.timestamp; _reset(_tokenId); IVotingEscrow(_ve).abstain(_tokenId); } function resetOverride(uint[] memory _ids) external { for(uint i=0;i<_ids.length;i++) { resetOverride(_ids[i]); } } function resetOverride(uint _tokenId) public { require(msg.sender == governor, "Not governor"); _reset(_tokenId); IVotingEscrow(_ve).abstain(_tokenId); } function _reset(uint _tokenId) internal { address[] storage _poolVote = poolVote[_tokenId]; uint _poolVoteCnt = _poolVote.length; uint256 _totalWeight = 0; address _tokenOwner = IVotingEscrow(_ve).ownerOf(_tokenId); for (uint i = 0; i < _poolVoteCnt; i ++) { address _pool = _poolVote[i]; uint256 _votes = votes[_tokenId][_pool]; if (_votes != 0) { _updateFor(gauges[_pool]); weights[_pool] -= _votes; votes[_tokenId][_pool] -= _votes; if (_votes > 0) { IBribe(bribes[gauges[_pool]])._withdraw(uint256(_votes), _tokenId, msg.sender, _tokenOwner); _totalWeight += _votes; } else { _totalWeight -= _votes; } emit Abstained(_tokenId, _votes); } } totalWeight -= uint256(_totalWeight); usedWeights[_tokenId] = 0; delete poolVote[_tokenId]; } function poke(uint _tokenId) external { /// Poke function was depreciated in v1.3.0 due to security reasons. /// Its still callable for backwards compatibility, but does nothing. /// Usage allowed by ms (Official Equălizer Team Multi-Sig) or Public when pokable. if(pokable || msg.sender == ms) { address[] memory _poolVote = poolVote[_tokenId]; uint _poolCnt = _poolVote.length; uint256[] memory _weights = new uint256[](_poolCnt); for (uint i = 0; i < _poolCnt; i ++) { _weights[i] = votes[_tokenId][_poolVote[i]]; } _vote(_tokenId, _poolVote, _weights); } /// else return; } function _vote(uint _tokenId, address[] memory _poolVote, uint256[] memory _weights) internal { ///v1.3.1 Emergency Upgrade ///Prevent voting for specific "unvotable" pools for(uint lol=0;lol<_poolVote.length;lol++) { require( ! unvotable[ _poolVote[lol] ], "This pool is unvotable!" ); } _reset(_tokenId); uint _poolCnt = _poolVote.length; uint256 _weight = IVotingEscrow(_ve).balanceOfNFT(_tokenId); uint256 _totalVoteWeight = 0; uint256 _totalWeight = 0; uint256 _usedWeight = 0; address _tokenOwner = IVotingEscrow(_ve).ownerOf(_tokenId); for (uint i = 0; i < _poolCnt; i++) { _totalVoteWeight += _weights[i]; } for (uint i = 0; i < _poolCnt; i++) { address _pool = _poolVote[i]; address _gauge = gauges[_pool]; if (isGauge[_gauge]) { uint256 _poolWeight = _weights[i] * _weight / _totalVoteWeight; require(votes[_tokenId][_pool] == 0); require(_poolWeight != 0); _updateFor(_gauge); poolVote[_tokenId].push(_pool); weights[_pool] += _poolWeight; votes[_tokenId][_pool] += _poolWeight; IBribe(bribes[_gauge])._deposit(uint256(_poolWeight), _tokenId, msg.sender, _tokenOwner); _usedWeight += _poolWeight; _totalWeight += _poolWeight; emit Voted(_pool, msg.sender, _tokenOwner, _tokenId, _poolWeight, block.timestamp); } } if (_usedWeight > 0) IVotingEscrow(_ve).voting(_tokenId); totalWeight += uint256(_totalWeight); usedWeights[_tokenId] = uint256(_usedWeight); } function vote(uint tokenId, address[] calldata _poolVote, uint256[] calldata _weights) external onlyNewEpoch(tokenId) { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, tokenId)); require(_poolVote.length == _weights.length); lastVoted[tokenId] = block.timestamp; _vote(tokenId, _poolVote, _weights); } function _whitelist(address _token) internal { require(!isWhitelisted[_token], "Already whitelisted"); isWhitelisted[_token] = true; emit Whitelisted(msg.sender, _token, true); } function createGauge(address _pool) public returns (address) { require(gauges[_pool] == address(0x0), "exists"); address[] memory allowedRewards = new address[](3); bool isPair = IPairFactory(factory).isPair(_pool); address tokenA; address tokenB; if (isPair) { (tokenA, tokenB) = IPair(_pool).tokens(); allowedRewards[0] = tokenA; allowedRewards[1] = tokenB; if (base != tokenA && base != tokenB) { allowedRewards[2] = base; } } else { allowedRewards[0] = base; } if (msg.sender != governor) { // gov can create for any pool, even non-Equalizer pairs require(isPair, "!_pool"); require(isWhitelisted[tokenA] && isWhitelisted[tokenB], "!whitelisted"); require(gaugable[tokenA] || gaugable[tokenB], "Pool not Gaugable!"); require(IPair(_pool).stable()==false, "Creation of Stable-pool Gauge not allowed!"); } address _bribe = IBribeFactory(bribefactory).createBribe(allowedRewards); address[] memory gaugeRewards = new address[](1); gaugeRewards[0] = base; address _gauge = IGaugeFactory(gaugefactory).createGauge(_pool, _bribe, _ve, isPair, gaugeRewards); IERC20(base).approve(_gauge, type(uint).max); bribes[_gauge] = _bribe; gauges[_pool] = _gauge; poolForGauge[_gauge] = _pool; isGauge[_gauge] = true; isAlive[_gauge] = true; _updateFor(_gauge); pools.push(_pool); emit GaugeAndBribeCreated(_pool, _gauge, _bribe, msg.sender, gaugeRewards, allowedRewards); return _gauge; } function createGaugeMultiple(address[] memory _pools) external returns (address[] memory) { address[] memory _g_c = new address[](_pools.length); for(uint _j; _j<_pools.length; _j++) { _g_c[_j] = createGauge(_pools[_j]); } return _g_c; } function killGauge(address _gauge) external { require(msg.sender == emergencyCouncil, "not emergency council"); require(isAlive[_gauge], "gauge already dead"); isAlive[_gauge] = false; claimable[_gauge] = 0; emit GaugeKilled(_gauge); } function reviveGauge(address _gauge) external { require(msg.sender == emergencyCouncil, "not emergency council"); require(!isAlive[_gauge], "gauge already alive"); isAlive[_gauge] = true; emit GaugeRevived(_gauge); } function attachTokenToGauge(uint tokenId, address account) external { require(isGauge[msg.sender], "not gauge"); require(isAlive[msg.sender], "killed gauge"); // killed gauges cannot attach tokens to themselves if (tokenId > 0) IVotingEscrow(_ve).attach(tokenId); emit Attach(account, msg.sender, tokenId); } function emitDeposit(uint tokenId, address account, uint amount) external { require(isGauge[msg.sender], "not gauge"); require(isAlive[msg.sender], "killed gauge"); emit Deposit(account, msg.sender, tokenId, amount); } function detachTokenFromGauge(uint tokenId, address account) external { require(isGauge[msg.sender], "not gauge"); if (tokenId > 0) IVotingEscrow(_ve).detach(tokenId); emit Detach(account, msg.sender, tokenId); } function emitWithdraw(uint tokenId, address account, uint amount) external { require(isGauge[msg.sender], "not gauge"); emit Withdraw(account, msg.sender, tokenId, amount); } function length() external view returns (uint) { return pools.length; } function notifyRewardAmount(uint amount) external { _safeTransferFrom(base, msg.sender, address(this), amount); // transfer the distro in uint256 _ratio = amount * 1e18 / totalWeight; // 1e18 adjustment is removed during claim if (_ratio > 0) { index += _ratio; } emit NotifyReward(msg.sender, base, amount); } function updateFor(address[] memory _gauges) external { for (uint i = 0; i < _gauges.length; i++) { _updateFor(_gauges[i]); } } function updateForRange(uint start, uint end) public { for (uint i = start; i < end; i++) { _updateFor(gauges[pools[i]]); } } function updateAll() external { updateForRange(0, pools.length); } function updateGauge(address _gauge) external { _updateFor(_gauge); } function _updateFor(address _gauge) internal { address _pool = poolForGauge[_gauge]; uint256 _supplied = weights[_pool]; if (_supplied > 0) { uint _supplyIndex = supplyIndex[_gauge]; uint _index = index; // get global index0 for accumulated distro supplyIndex[_gauge] = _index; // update _gauge current position to global position uint _delta = _index - _supplyIndex; // see if there is any difference that need to be accrued if (_delta > 0) { uint _share = uint(_supplied) * _delta / 1e18; // add accrued difference for each supplied token if (isAlive[_gauge]) { claimable[_gauge] += _share; } } } else { supplyIndex[_gauge] = index; // new users are set to the default global state } } function claimRewards(address[] memory _gauges, address[][] memory _tokens) public { for (uint i = 0; i < _gauges.length; i++) { IGauge(_gauges[i]).getReward(msg.sender, _tokens[i]); } } function claimBribes(address[] memory _bribes, address[][] memory _tokens, uint _tokenId) public { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId)); for (uint i = 0; i < _bribes.length; i++) { IBribe(_bribes[i]).getRewardForOwner(_tokenId, _tokens[i]); } } function claimEverything( address[] memory _gauges, address[][] memory _gtokens, address[] memory _bribes, address[][] memory _btokens, uint _tokenId ) external { claimRewards(_gauges, _gtokens); if(_tokenId > 0) { claimBribes(_bribes, _btokens, _tokenId); } } function distributeFees(address _gauge) external { IGauge(_gauge).claimFees(); } function distributeFees(address[] memory _gauges) external { for (uint i = 0; i < _gauges.length; i++) { IGauge(_gauges[i]).claimFees(); } } function distributeFees(uint start, uint finish) public { for (uint x = start; x < finish; x++) { IGauge(gauges[pools[x]]).claimFees(); } } function distributeFees() external { distributeFees(0, pools.length); } function distribute(address _gauge) public lock { IMinter(minter).update_period(); _updateFor(_gauge); // should set claimable to 0 if killed uint _claimable = claimable[_gauge]; if (_claimable > IGauge(_gauge).left(base) && _claimable / DURATION > 0) { claimable[_gauge] = 0; IGauge(_gauge).notifyRewardAmount(base, _claimable); emit DistributeReward(msg.sender, _gauge, _claimable); } } function distribute() external { distribute(0, pools.length); } function distribute(uint start, uint finish) public { for (uint x = start; x < finish; x++) { distribute(gauges[pools[x]]); } } function distribute(address[] memory _gauges) external { for (uint x = 0; x < _gauges.length; x++) { distribute(_gauges[x]); } } function _safeTransferFrom(address token, address from, address to, uint256 value) internal { require(token.code.length > 0, "Voter: invalid token"); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function whitelist(address[] calldata _tokens) external { require(msg.sender == governor, "Not governor"); for (uint i = 0; i < _tokens.length; i++) { _whitelist(_tokens[i]); } } function removeFromWhitelist(address[] calldata _tokens) external { require(msg.sender == governor, "Not governor"); for (uint i = 0; i < _tokens.length; i++) { delete isWhitelisted[_tokens[i]]; emit Whitelisted(msg.sender, _tokens[i], false); } } function setGov(address _ms) external { require(msg.sender == ms, "!ms"); governor = _ms; emergencyCouncil = _ms; protocolFeesTaker = _ms; ms = _ms; } function setUnvotablePools(address[] calldata _pools, bool[] calldata _b) external { require(msg.sender == governor, "Not governor"); for (uint i = 0; i < _pools.length; i++) { unvotable [ _pools[i] ] = _b[i]; } } function setGaugable(address[] calldata _pools, bool[] calldata _b) external { require(msg.sender == governor, "Not governor"); for (uint i = 0; i < _pools.length; i++) { gaugable[ _pools[i] ] = _b[i]; } } function setPokable(bool _b) external { require(msg.sender == governor, "Not governor"); pokable = _b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"Abstained","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Attach","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lp","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Detach","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DistributeReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"address","name":"bribe","type":"address"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address[]","name":"gaugeRewards","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"allowedRewards","type":"address[]"}],"name":"GaugeAndBribeCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugeKilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugeRevived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NotifyReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pooladdr","type":"address"},{"indexed":false,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"}],"name":"Voted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"whitelister","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"Whitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lp","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"attachTokenToGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"base","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bribefactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bribes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_bribes","type":"address[]"},{"internalType":"address[][]","name":"_tokens","type":"address[][]"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimBribes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"address[][]","name":"_gtokens","type":"address[][]"},{"internalType":"address[]","name":"_bribes","type":"address[]"},{"internalType":"address[][]","name":"_btokens","type":"address[][]"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimEverything","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"address[][]","name":"_tokens","type":"address[][]"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"createGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_pools","type":"address[]"}],"name":"createGaugeMultiple","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"detachTokenFromGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"finish","type":"uint256"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"finish","type":"uint256"}],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyCouncil","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emitDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emitWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gaugable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gaugefactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gauges","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"address","name":"_minter","type":"address"}],"name":"initialSetup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"__ve","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_gauges","type":"address"},{"internalType":"address","name":"_bribes","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAlive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGauge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"killGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastVoted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"length","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ms","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pokable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"poke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolForGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolVote","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeesPerMillion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeesTaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"reset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"resetOverride","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"resetOverride","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"reviveGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_council","type":"address"}],"name":"setEmergencyCouncil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_pools","type":"address[]"},{"internalType":"bool[]","name":"_b","type":"bool[]"}],"name":"setGaugable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ms","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governor","type":"address"}],"name":"setGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_b","type":"bool"}],"name":"setPokable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pf","type":"uint256"}],"name":"setProtocolFeesPerMillion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pft","type":"address"}],"name":"setProtocolFeesTaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_pools","type":"address[]"},{"internalType":"bool[]","name":"_b","type":"bool[]"}],"name":"setUnvotablePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supplyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unvotable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"updateFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"updateForRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"updateGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedWeights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address[]","name":"_poolVote","type":"address[]"},{"internalType":"uint256[]","name":"_weights","type":"uint256[]"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"votes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"weights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506143f7806100206000396000f3fe608060405234801561001057600080fd5b50600436106104335760003560e01c80637ac09bf711610236578063ad4250181161013b578063d23254b4116100c3578063ea94ee4411610087578063ea94ee4414610a1f578063eb4aa7bb14610a32578063f3594be014610a45578063f8c8765e14610a65578063fa57faeb14610a7857600080fd5b8063d23254b4146109a6578063d560b0d7146109d1578063e380fcad146109e4578063e4fc6b6d14610a04578063e586875f14610a0c57600080fd5b8063bd8aa7801161010a578063bd8aa78014610947578063c42cf5351461095a578063c45a01551461096d578063c527ee1f14610980578063cfad57a21461099357600080fd5b8063ad425018146108e3578063b65c6dc914610903578063b9a09fd514610916578063bb57ad201461093f57600080fd5b80639f06247b116101be578063a7cac8461161018d578063a7cac84614610851578063a86a366d14610871578063a8c5d95a14610884578063aa79979b146108ad578063ac4afa38146108d057600080fd5b80639f06247b14610805578063a0b2d57f14610818578063a5f4301e1461082b578063a61c713a1461083e57600080fd5b80638dd598fb116102055780638dd598fb146107aa5780639413f25c146107c357806396c82e57146107d6578063992a7933146107df5780639b6a9d72146107f257600080fd5b80637ac09bf71461073e5780637e69671a1461075157806381d9eac614610764578063890382981461078757600080fd5b8063402914f51161033c57806363453ae1116102c45780637625391a116102935780637625391a146106d25780637682aa71146106e55780637715ee75146106f85780637778960e1461070b57806379e938241461071e57600080fd5b806363453ae11461068657806368c3acb314610699578063698473e3146106ac5780636ecbe38a146106bf57600080fd5b8063548db1741161030b578063548db17414610627578063558c55a31461063a5780635b0c7cfc1461064d5780635ed0c288146106605780636138889b1461067357600080fd5b8063402914f5146105d9578063411b1f77146105f95780635001f3b51461060c57806353d786931461061f57600080fd5b806320b1cb6f116103bf57806335ddba1f1161038e57806335ddba1f1461057457806338752a9d146105875780633af32abf1461059a5780633c6b16ab146105bd5780633f667825146105d057600080fd5b806320b1cb6f146105325780632986c0e514610545578063310bd74b1461054e57806332145f901461056157600080fd5b806313416d991161040657806313416d99146104b9578063168215fa146104cc5780631703e5f9146104df5780631be05289146105125780631f7b6d321461052a57600080fd5b806306d6a1b214610438578063075461721461047e578063098c66e1146104915780630c340a24146104a6575b600080fd5b610461610446366004613a23565b600e602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b600554610461906001600160a01b031681565b6104a461049f366004613a92565b610a85565b005b600754610461906001600160a01b031681565b600954610461906001600160a01b031681565b6104a46104da366004613afd565b610b56565b6105026104ed366004613a23565b60176020526000908152604090205460ff1681565b6040519015158152602001610475565b61051c62093a8081565b604051908152602001610475565b600c5461051c565b6104a4610540366004613c72565b610ba5565b61051c60195481565b6104a461055c366004613afd565b610c5b565b6104a461056f366004613afd565b610e25565b6104a4610582366004613cd5565b610f95565b600454610461906001600160a01b031681565b6105026105a8366004613a23565b60166020526000908152604090205460ff1681565b6104a46105cb366004613afd565b611041565b61051c600a5481565b61051c6105e7366004613a23565b601b6020526000908152604090205481565b6104a4610607366004613d26565b6110e3565b600254610461906001600160a01b031681565b6104a46111b8565b6104a4610635366004613d4b565b6111c9565b6104a4610648366004613a92565b6112c4565b6104a461065b366004613d8c565b611385565b6104a461066e366004613e2a565b6113c9565b6104a4610681366004613e47565b611406565b6104a4610694366004613a23565b611446565b600354610461906001600160a01b031681565b6104a46106ba366004613d26565b611692565b6104a46106cd366004613a23565b6117b5565b6104a46106e0366004613e83565b6117be565b6104a46106f3366004613a23565b611824565b6104a4610706366004613ea5565b6118a0565b600854610461906001600160a01b031681565b61051c61072c366004613afd565b60136020526000908152604090205481565b6104a461074c366004613f11565b6119e1565b6104a461075f366004613e83565b611b71565b610502610772366004613a23565b601d6020526000908152604090205460ff1681565b610502610795366004613a23565b601c6020526000908152604090205460ff1681565b600054610461906201000090046001600160a01b031681565b6104a46107d1366004613a23565b611c41565b61051c600b5481565b6104a46107ed366004613a23565b611cb3565b6104a4610800366004613e83565b611db8565b6104a4610813366004613a23565b611e1e565b600654610461906001600160a01b031681565b610461610839366004613a23565b611f1b565b6104a461084c366004613f8a565b6126dc565b61051c61085f366004613a23565b60106020526000908152604090205481565b61046161087f366004613e83565b6127ac565b610461610892366004613a23565b600f602052600090815260409020546001600160a01b031681565b6105026108bb366004613a23565b60156020526000908152604090205460ff1681565b6104616108de366004613afd565b6127e4565b6108f66108f1366004613e47565b61280e565b6040516104759190614006565b6104a4610911366004613afd565b6128c8565b610461610924366004613a23565b600d602052600090815260409020546001600160a01b031681565b6104a461295a565b6104a4610955366004613d4b565b612969565b6104a4610968366004613a23565b6129df565b600154610461906001600160a01b031681565b6104a461098e366004613e47565b612a4b565b6104a46109a1366004613a23565b612af7565b61051c6109b4366004613d26565b601160209081526000928352604080842090915290825290205481565b6104a46109df366004613e47565b612b77565b61051c6109f2366004613a23565b601a6020526000908152604090205481565b6104a4612bb7565b6104a4610a1a366004613a23565b612bc6565b6104a4610a2d366004613f8a565b612c3b565b6104a4610a40366004614019565b612cb0565b61051c610a53366004613afd565b60146020526000908152604090205481565b6104a4610a733660046140cd565b612ccb565b601e546105029060ff1681565b6007546001600160a01b03163314610ab85760405162461bcd60e51b8152600401610aaf90614129565b60405180910390fd5b60005b83811015610b4f57828282818110610ad557610ad561414f565b9050602002016020810190610aea9190613e2a565b601c6000878785818110610b0057610b0061414f565b9050602002016020810190610b159190613a23565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610b478161417b565b915050610abb565b5050505050565b6007546001600160a01b03163314610ba05760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420676f7665726e6f722160981b6044820152606401610aaf565b600a55565b60005b8251811015610c5657828181518110610bc357610bc361414f565b60200260200101516001600160a01b03166331279d3d33848481518110610bec57610bec61414f565b60200260200101516040518363ffffffff1660e01b8152600401610c11929190614196565b600060405180830381600087803b158015610c2b57600080fd5b505af1158015610c3f573d6000803e3d6000fd5b505050508080610c4e9061417b565b915050610ba8565b505050565b600081815260146020526040902054819062093a80610c7a81426141ba565b610c8491906141dc565b11610cd15760405162461bcd60e51b815260206004820152601e60248201527f544f4b454e5f414c52454144595f564f5445445f544849535f45504f434800006044820152606401610aaf565b60005460405163430c208160e01b815233600482015260248101849052620100009091046001600160a01b03169063430c20819060440160206040518083038186803b158015610d2057600080fd5b505afa158015610d34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5891906141fb565b610da45760405162461bcd60e51b815260206004820152601a60248201527f4e65697468657220617070726f766564206e6f72206f776e65720000000000006044820152606401610aaf565b6000828152601460205260409020429055610dbe82612ef5565b60005460405163c1f0fb9f60e01b815260048101849052620100009091046001600160a01b03169063c1f0fb9f90602401600060405180830381600087803b158015610e0957600080fd5b505af1158015610e1d573d6000803e3d6000fd5b505050505050565b601e5460ff1680610e4057506006546001600160a01b031633145b15610f9257600081815260126020908152604080832080548251818502810185019093528083529192909190830182828015610ea557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e87575b505050505090506000815190506000816001600160401b03811115610ecc57610ecc613b16565b604051908082528060200260200182016040528015610ef5578160200160208202803683370190505b50905060005b82811015610f8257601160008681526020019081526020016000206000858381518110610f2a57610f2a61414f565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110610f6557610f6561414f565b602090810291909101015280610f7a8161417b565b915050610efb565b50610f8e8484836131b0565b5050505b50565b6005546001600160a01b03163314610fdd5760405162461bcd60e51b815260206004820152600b60248201526a4e6f74206d696e7465722160a81b6044820152606401610aaf565b60005b825181101561101d5761100b838281518110610ffe57610ffe61414f565b60200260200101516136fd565b806110158161417b565b915050610fe0565b50600580546001600160a01b0319166001600160a01b039290921691909117905550565b600254611059906001600160a01b03163330846137b1565b600b5460009061107183670de0b6b3a76400006141dc565b61107b91906141ba565b9050801561109b5780601960008282546110959190614218565b90915550505b6002546040518381526001600160a01b039091169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf508269060200160405180910390a35050565b3360009081526015602052604090205460ff166111125760405162461bcd60e51b8152600401610aaf90614230565b811561117c57600054604051634c35bec560e11b815260048101849052620100009091046001600160a01b03169063986b7d8a90602401600060405180830381600087803b15801561116357600080fd5b505af1158015611177573d6000803e3d6000fd5b505050505b604051829033906001600160a01b038416907fae268d9aab12f3605f58efd74fd3801fa812b03fdb44317eb70f46dff0e19e2290600090a45050565b600c546111c790600090611db8565b565b6007546001600160a01b031633146111f35760405162461bcd60e51b8152600401610aaf90614129565b60005b81811015610c5657601660008484848181106112145761121461414f565b90506020020160208101906112299190613a23565b6001600160a01b0316815260208101919091526040016000908120805460ff1916905583838381811061125e5761125e61414f565b90506020020160208101906112739190613a23565b6001600160a01b0316336001600160a01b03167fc8a125677224e7125b3579c5a10de1afe210f4c1c1d3c27be0f12b0c4a14c91560405160405180910390a4806112bc8161417b565b9150506111f6565b6007546001600160a01b031633146112ee5760405162461bcd60e51b8152600401610aaf90614129565b60005b83811015610b4f5782828281811061130b5761130b61414f565b90506020020160208101906113209190613e2a565b601d60008787858181106113365761133661414f565b905060200201602081019061134b9190613a23565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061137d8161417b565b9150506112f1565b60005b81518110156113c5576113b38282815181106113a6576113a661414f565b60200260200101516128c8565b806113bd8161417b565b915050611388565b5050565b6007546001600160a01b031633146113f35760405162461bcd60e51b8152600401610aaf90614129565b601e805460ff1916911515919091179055565b60005b81518110156113c5576114348282815181106114275761142761414f565b6020026020010151611446565b8061143e8161417b565b915050611409565b60185460ff161561148a5760405162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b6044820152606401610aaf565b6018805460ff191660011790556005546040805163ed29fc1160e01b815290516001600160a01b039092169163ed29fc11916004808201926020929091908290030181600087803b1580156114de57600080fd5b505af11580156114f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115169190614253565b50611520816138db565b6001600160a01b038181166000818152601b602052604090819020546002549151634cde602960e11b81529190931660048201526399bcc0529060240160206040518083038186803b15801561157557600080fd5b505afa158015611589573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ad9190614253565b811180156115c7575060006115c562093a80836141ba565b115b15611684576001600160a01b038281166000818152601b602052604080822091909155600254905163b66503cf60e01b815292166004830152602482018390529063b66503cf90604401600060405180830381600087803b15801561162b57600080fd5b505af115801561163f573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b179060200160405180910390a35b50506018805460ff19169055565b3360009081526015602052604090205460ff166116c15760405162461bcd60e51b8152600401610aaf90614230565b3360009081526017602052604090205460ff1661170f5760405162461bcd60e51b815260206004820152600c60248201526b6b696c6c656420676175676560a01b6044820152606401610aaf565b81156117795760005460405163fbd3a29d60e01b815260048101849052620100009091046001600160a01b03169063fbd3a29d90602401600060405180830381600087803b15801561176057600080fd5b505af1158015611774573d6000803e3d6000fd5b505050505b604051829033906001600160a01b038416907f60940192810a6fb3bce3fd3e2e3a13fd6ccc7605e963fb87ee971aba829989bd90600090a45050565b610f92816138db565b815b81811015610c5657611812600d6000600c84815481106117e2576117e261414f565b60009182526020808320909101546001600160a01b03908116845290830193909352604090910190205416611446565b8061181c8161417b565b9150506117c0565b6007546001600160a01b0316331461187e5760405162461bcd60e51b815260206004820152601860248201527f4e6f742050726f746f636f6c20466565732054616b65722100000000000000006044820152606401610aaf565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60005460405163430c208160e01b815233600482015260248101839052620100009091046001600160a01b03169063430c20819060440160206040518083038186803b1580156118ef57600080fd5b505afa158015611903573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192791906141fb565b61193057600080fd5b60005b8351811015610f8e5783818151811061194e5761194e61414f565b60200260200101516001600160a01b031663a7852afa838584815181106119775761197761414f565b60200260200101516040518363ffffffff1660e01b815260040161199c92919061426c565b600060405180830381600087803b1580156119b657600080fd5b505af11580156119ca573d6000803e3d6000fd5b5050505080806119d99061417b565b915050611933565b600085815260146020526040902054859062093a80611a0081426141ba565b611a0a91906141dc565b11611a575760405162461bcd60e51b815260206004820152601e60248201527f544f4b454e5f414c52454144595f564f5445445f544849535f45504f434800006044820152606401610aaf565b60005460405163430c208160e01b815233600482015260248101889052620100009091046001600160a01b03169063430c20819060440160206040518083038186803b158015611aa657600080fd5b505afa158015611aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ade91906141fb565b611ae757600080fd5b838214611af357600080fd5b60008681526014602090815260409182902042905581518682028181018301909352868152610e1d9289928991899182919085019084908082843760009201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284376000920191909152506131b092505050565b815b81811015610c5657600d6000600c8381548110611b9257611b9261414f565b60009182526020808320909101546001600160a01b039081168452908301939093526040918201812054825163d294f09360e01b81528351919094169363d294f093936004808301949193928390030190829087803b158015611bf457600080fd5b505af1158015611c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2c9190614285565b50508080611c399061417b565b915050611b73565b806001600160a01b031663d294f0936040518163ffffffff1660e01b81526004016040805180830381600087803b158015611c7b57600080fd5b505af1158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c569190614285565b6008546001600160a01b03163314611d055760405162461bcd60e51b81526020600482015260156024820152741b9bdd08195b595c99d95b98de4818dbdd5b98da5b605a1b6044820152606401610aaf565b6001600160a01b03811660009081526017602052604090205460ff16611d625760405162461bcd60e51b815260206004820152601260248201527119d85d59d948185b1c9958591e481919585960721b6044820152606401610aaf565b6001600160a01b0381166000818152601760209081526040808320805460ff19169055601b909152808220829055517f04a5d3f5d80d22d9345acc80618f4a4e7e663cf9e1aed23b57d975acec002ba79190a250565b815b81811015610c5657611e0c600d6000600c8481548110611ddc57611ddc61414f565b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054166138db565b80611e168161417b565b915050611dba565b6008546001600160a01b03163314611e705760405162461bcd60e51b81526020600482015260156024820152741b9bdd08195b595c99d95b98de4818dbdd5b98da5b605a1b6044820152606401610aaf565b6001600160a01b03811660009081526017602052604090205460ff1615611ecf5760405162461bcd60e51b8152602060048201526013602482015272676175676520616c726561647920616c69766560681b6044820152606401610aaf565b6001600160a01b038116600081815260176020526040808220805460ff19166001179055517fed18e9faa3dccfd8aa45f69c4de40546b2ca9cccc4538a2323531656516db1aa9190a250565b6001600160a01b038181166000908152600d602052604081205490911615611f6e5760405162461bcd60e51b815260206004820152600660248201526565786973747360d01b6044820152606401610aaf565b60408051600380825260808201909252600091602082016060803683370190505060015460405163e5e31b1360e01b81526001600160a01b0386811660048301529293506000929091169063e5e31b139060240160206040518083038186803b158015611fda57600080fd5b505afa158015611fee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201291906141fb565b9050600080821561216657856001600160a01b0316639d63848a6040518163ffffffff1660e01b81526004016040805180830381600087803b15801561205757600080fd5b505af115801561206b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208f91906142a9565b809250819350505081846000815181106120ab576120ab61414f565b60200260200101906001600160a01b031690816001600160a01b03168152505080846001815181106120df576120df61414f565b6001600160a01b03928316602091820292909201015260025481169083161480159061211957506002546001600160a01b03828116911614155b15612161576002805485516001600160a01b0390911691869181106121405761214061414f565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6121a9565b60025484516001600160a01b039091169085906000906121885761218861414f565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6007546001600160a01b031633146123bd57826121f15760405162461bcd60e51b81526020600482015260066024820152650857dc1bdbdb60d21b6044820152606401610aaf565b6001600160a01b03821660009081526016602052604090205460ff16801561223157506001600160a01b03811660009081526016602052604090205460ff165b61226c5760405162461bcd60e51b815260206004820152600c60248201526b085dda1a5d195b1a5cdd195960a21b6044820152606401610aaf565b6001600160a01b0382166000908152601d602052604090205460ff16806122ab57506001600160a01b0381166000908152601d602052604090205460ff165b6122ec5760405162461bcd60e51b8152602060048201526012602482015271506f6f6c206e6f74204761756761626c652160701b6044820152606401610aaf565b856001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b15801561232557600080fd5b505afa158015612339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235d91906141fb565b156123bd5760405162461bcd60e51b815260206004820152602a60248201527f4372656174696f6e206f6620537461626c652d706f6f6c204761756765206e6f6044820152697420616c6c6f7765642160b01b6064820152608401610aaf565b6004805460405163897cd6b360e01b81526000926001600160a01b039092169163897cd6b3916123ef91899101614006565b602060405180830381600087803b15801561240957600080fd5b505af115801561241d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244191906142d8565b6040805160018082528183019092529192506000919060208083019080368337505060025482519293506001600160a01b0316918391506000906124875761248761414f565b6001600160a01b03928316602091820292909201015260035460008054604051630f6f2d4760e11b8152919392831692631ede5a8e926124da928e9289926201000090920416908c9089906004016142f5565b602060405180830381600087803b1580156124f457600080fd5b505af1158015612508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252c91906142d8565b60025460405163095ea7b360e01b81526001600160a01b038084166004830152600019602483015292935091169063095ea7b390604401602060405180830381600087803b15801561257d57600080fd5b505af1158015612591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b591906141fb565b506001600160a01b038082166000818152600f602090815260408083208054868a166001600160a01b031991821617909155948e16808452600d83528184208054871686179055938352600e8252808320805490951690931790935560158352818120805460ff19908116600190811790925560179094529190208054909216179055612641816138db565b600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b038b169081179091556040513391907f31cdbca65889efbb92669ea36448e0bc97faaaa16d8ac81502b85dad8f9c2e48906126c8908590889088908e90614331565b60405180910390a398975050505050505050565b3360009081526015602052604090205460ff1661270b5760405162461bcd60e51b8152600401610aaf90614230565b3360009081526017602052604090205460ff166127595760405162461bcd60e51b815260206004820152600c60248201526b6b696c6c656420676175676560a01b6044820152606401610aaf565b82336001600160a01b0316836001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78460405161279f91815260200190565b60405180910390a4505050565b601260205281600052604060002081815481106127c857600080fd5b6000918252602090912001546001600160a01b03169150829050565b600c81815481106127f457600080fd5b6000918252602090912001546001600160a01b0316905081565b6060600082516001600160401b0381111561282b5761282b613b16565b604051908082528060200260200182016040528015612854578160200160208202803683370190505b50905060005b83518110156128c1576128858482815181106128785761287861414f565b6020026020010151611f1b565b8282815181106128975761289761414f565b6001600160a01b0390921660209283029190910190910152806128b98161417b565b91505061285a565b5092915050565b6007546001600160a01b031633146128f25760405162461bcd60e51b8152600401610aaf90614129565b6128fb81612ef5565b60005460405163c1f0fb9f60e01b815260048101839052620100009091046001600160a01b03169063c1f0fb9f90602401600060405180830381600087803b15801561294657600080fd5b505af1158015610b4f573d6000803e3d6000fd5b600c546111c790600090611b71565b6007546001600160a01b031633146129935760405162461bcd60e51b8152600401610aaf90614129565b60005b81811015610c56576129cd8383838181106129b3576129b361414f565b90506020020160208101906129c89190613a23565b6136fd565b806129d78161417b565b915050612996565b6007546001600160a01b03163314612a295760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420676f7665726e6f722160981b6044820152606401610aaf565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60005b81518110156113c557818181518110612a6957612a6961414f565b60200260200101516001600160a01b031663d294f0936040518163ffffffff1660e01b81526004016040805180830381600087803b158015612aaa57600080fd5b505af1158015612abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae29190614285565b50508080612aef9061417b565b915050612a4e565b6006546001600160a01b03163314612b375760405162461bcd60e51b8152602060048201526003602482015262216d7360e81b6044820152606401610aaf565b600780546001600160a01b039092166001600160a01b03199283168117909155600880548316821790556009805483168217905560068054909216179055565b60005b81518110156113c557612ba5828281518110612b9857612b9861414f565b60200260200101516138db565b80612baf8161417b565b915050612b7a565b600c546111c7906000906117be565b6008546001600160a01b03163314612c195760405162461bcd60e51b81526020600482015260166024820152754e6f7420656d657267656e637920636f756e63696c2160501b6044820152606401610aaf565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526015602052604090205460ff16612c6a5760405162461bcd60e51b8152600401610aaf90614230565b82336001600160a01b0316836001600160a01b03167ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb5678460405161279f91815260200190565b612cba8585610ba5565b8015610b4f57610b4f8383836118a0565b600054610100900460ff1615808015612ceb5750600054600160ff909116105b80612d055750303b158015612d05575060005460ff166001145b612d685760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610aaf565b6000805460ff191660011790558015612d8b576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b0388811691820292909217909255600180546001600160a01b03191691871691909117905560408051637e062a3560e11b8152905163fc0c546a91600480820192602092909190829003018186803b158015612e0157600080fd5b505afa158015612e15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3991906142d8565b600280546001600160a01b03199081166001600160a01b03938416179091556003805482168684161790556004805482169285169290921790915560058054339083168117909155600780548316821790556008805483168217905560098054831682179055600680549092161790558015610b4f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6000818152601260205260408082208054835492516331a9108f60e11b81526004810186905291939092909182916201000090046001600160a01b031690636352211e9060240160206040518083038186803b158015612f5457600080fd5b505afa158015612f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8c91906142d8565b905060005b83811015613174576000858281548110612fad57612fad61414f565b60009182526020808320909101548983526011825260408084206001600160a01b0390921680855291909252912054909150801561315f576001600160a01b038083166000908152600d602052604090205461300991166138db565b6001600160a01b0382166000908152601060205260408120805483929061303190849061436f565b909155505060008881526011602090815260408083206001600160a01b03861684529091528120805483929061306890849061436f565b90915550508015613117576001600160a01b038281166000908152600d602090815260408083205484168352600f90915290819020549051630ced1b8360e31b815260048101849052602481018b90523360448201528683166064820152911690636768dc1890608401600060405180830381600087803b1580156130ec57600080fd5b505af1158015613100573d6000803e3d6000fd5b5050505080856131109190614218565b9450613124565b613121818661436f565b94505b877fa9f3ca5f8a9e1580edb2741e0ba560084ec72e0067ba3423f9e9327a176882db8260405161315691815260200190565b60405180910390a25b5050808061316c9061417b565b915050612f91565b5081600b6000828254613187919061436f565b9091555050600085815260136020908152604080832083905560129091528120610b4f916139dc565b60005b825181101561325857601c60008483815181106131d2576131d261414f565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16156132465760405162461bcd60e51b815260206004820152601760248201527f5468697320706f6f6c20697320756e766f7461626c65210000000000000000006044820152606401610aaf565b806132508161417b565b9150506131b3565b5061326283612ef5565b8151600080546040516339f890b560e21b815260048101879052620100009091046001600160a01b03169063e7e242d49060240160206040518083038186803b1580156132ae57600080fd5b505afa1580156132c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e69190614253565b600080546040516331a9108f60e11b81526004810189905292935090918291829182916201000090046001600160a01b031690636352211e9060240160206040518083038186803b15801561333a57600080fd5b505afa15801561334e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061337291906142d8565b905060005b868110156133b8578781815181106133915761339161414f565b6020026020010151856133a49190614218565b9450806133b08161417b565b915050613377565b5060005b8681101561365f5760008982815181106133d8576133d861414f565b6020908102919091018101516001600160a01b038082166000908152600d84526040808220549092168082526015909452205490925060ff161561364a57600087898c868151811061342c5761342c61414f565b602002602001015161343e91906141dc565b61344891906141ba565b60008e81526011602090815260408083206001600160a01b03881684529091529020549091501561347857600080fd5b8061348257600080fd5b61348b826138db565b60008d815260126020908152604080832080546001810182559084528284200180546001600160a01b0319166001600160a01b03881690811790915583526010909152812080548392906134e0908490614218565b909155505060008d81526011602090815260408083206001600160a01b038716845290915281208054839290613517908490614218565b92505081905550600f6000836001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b03166335da504d828f33896040518563ffffffff1660e01b81526004016135aa949392919093845260208401929092526001600160a01b03908116604084015216606082015260800190565b600060405180830381600087803b1580156135c457600080fd5b505af11580156135d8573d6000803e3d6000fd5b5050505080866135e89190614218565b95506135f48188614218565b6040805133815260208101849052428183015290519198508e916001600160a01b0388811692908716917f494cb07910d432267ab6b7ac8f82cbd3955d7fe28c693d83e0ebbfeafa8c7f899181900360600190a4505b505080806136579061417b565b9150506133bc565b5081156136ca5760005460405163fd4a77f160e01b8152600481018b9052620100009091046001600160a01b03169063fd4a77f190602401600060405180830381600087803b1580156136b157600080fd5b505af11580156136c5573d6000803e3d6000fd5b505050505b82600b60008282546136dc9190614218565b90915550505060009788526013602052604090972096909655505050505050565b6001600160a01b03811660009081526016602052604090205460ff161561375c5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481dda1a5d195b1a5cdd1959606a1b6044820152606401610aaf565b6001600160a01b038116600081815260166020526040808220805460ff19166001908117909155905190929133917fc8a125677224e7125b3579c5a10de1afe210f4c1c1d3c27be0f12b0c4a14c9159190a450565b6000846001600160a01b03163b116138025760405162461bcd60e51b81526020600482015260146024820152732b37ba32b91d1034b73b30b634b2103a37b5b2b760611b6044820152606401610aaf565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916138669190614386565b6000604051808303816000865af19150503d80600081146138a3576040519150601f19603f3d011682016040523d82523d6000602084013e6138a8565b606091505b50915091508180156138d25750805115806138d25750808060200190518101906138d291906141fb565b610e1d57600080fd5b6001600160a01b038082166000908152600e602090815260408083205490931680835260109091529190205480156139bb576001600160a01b0383166000908152601a6020526040812080546019549182905591613939838361436f565b90508015610e1d576000670de0b6b3a764000061395683876141dc565b61396091906141ba565b6001600160a01b03881660009081526017602052604090205490915060ff16156139b2576001600160a01b0387166000908152601b6020526040812080548392906139ac908490614218565b90915550505b50505050505050565b6019546001600160a01b0384166000908152601a6020526040902055505050565b5080546000825590600052602060002090810190610f9291905b80821115613a0a57600081556001016139f6565b5090565b6001600160a01b0381168114610f9257600080fd5b600060208284031215613a3557600080fd5b8135613a4081613a0e565b9392505050565b60008083601f840112613a5957600080fd5b5081356001600160401b03811115613a7057600080fd5b6020830191508360208260051b8501011115613a8b57600080fd5b9250929050565b60008060008060408587031215613aa857600080fd5b84356001600160401b0380821115613abf57600080fd5b613acb88838901613a47565b90965094506020870135915080821115613ae457600080fd5b50613af187828801613a47565b95989497509550505050565b600060208284031215613b0f57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613b5457613b54613b16565b604052919050565b60006001600160401b03821115613b7557613b75613b16565b5060051b60200190565b600082601f830112613b9057600080fd5b81356020613ba5613ba083613b5c565b613b2c565b82815260059290921b84018101918181019086841115613bc457600080fd5b8286015b84811015613be8578035613bdb81613a0e565b8352918301918301613bc8565b509695505050505050565b600082601f830112613c0457600080fd5b81356020613c14613ba083613b5c565b82815260059290921b84018101918181019086841115613c3357600080fd5b8286015b84811015613be85780356001600160401b03811115613c565760008081fd5b613c648986838b0101613b7f565b845250918301918301613c37565b60008060408385031215613c8557600080fd5b82356001600160401b0380821115613c9c57600080fd5b613ca886838701613b7f565b93506020850135915080821115613cbe57600080fd5b50613ccb85828601613bf3565b9150509250929050565b60008060408385031215613ce857600080fd5b82356001600160401b03811115613cfe57600080fd5b613d0a85828601613b7f565b9250506020830135613d1b81613a0e565b809150509250929050565b60008060408385031215613d3957600080fd5b823591506020830135613d1b81613a0e565b60008060208385031215613d5e57600080fd5b82356001600160401b03811115613d7457600080fd5b613d8085828601613a47565b90969095509350505050565b60006020808385031215613d9f57600080fd5b82356001600160401b03811115613db557600080fd5b8301601f81018513613dc657600080fd5b8035613dd4613ba082613b5c565b81815260059190911b82018301908381019087831115613df357600080fd5b928401925b82841015613e1157833582529284019290840190613df8565b979650505050505050565b8015158114610f9257600080fd5b600060208284031215613e3c57600080fd5b8135613a4081613e1c565b600060208284031215613e5957600080fd5b81356001600160401b03811115613e6f57600080fd5b613e7b84828501613b7f565b949350505050565b60008060408385031215613e9657600080fd5b50508035926020909101359150565b600080600060608486031215613eba57600080fd5b83356001600160401b0380821115613ed157600080fd5b613edd87838801613b7f565b94506020860135915080821115613ef357600080fd5b50613f0086828701613bf3565b925050604084013590509250925092565b600080600080600060608688031215613f2957600080fd5b8535945060208601356001600160401b0380821115613f4757600080fd5b613f5389838a01613a47565b90965094506040880135915080821115613f6c57600080fd5b50613f7988828901613a47565b969995985093965092949392505050565b600080600060608486031215613f9f57600080fd5b833592506020840135613fb181613a0e565b929592945050506040919091013590565b600081518084526020808501945080840160005b83811015613ffb5781516001600160a01b031687529582019590820190600101613fd6565b509495945050505050565b602081526000613a406020830184613fc2565b600080600080600060a0868803121561403157600080fd5b85356001600160401b038082111561404857600080fd5b61405489838a01613b7f565b9650602088013591508082111561406a57600080fd5b61407689838a01613bf3565b9550604088013591508082111561408c57600080fd5b61409889838a01613b7f565b945060608801359150808211156140ae57600080fd5b506140bb88828901613bf3565b95989497509295608001359392505050565b600080600080608085870312156140e357600080fd5b84356140ee81613a0e565b935060208501356140fe81613a0e565b9250604085013561410e81613a0e565b9150606085013561411e81613a0e565b939692955090935050565b6020808252600c908201526b2737ba1033b7bb32b93737b960a11b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561418f5761418f614165565b5060010190565b6001600160a01b0383168152604060208201819052600090613e7b90830184613fc2565b6000826141d757634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156141f6576141f6614165565b500290565b60006020828403121561420d57600080fd5b8151613a4081613e1c565b6000821982111561422b5761422b614165565b500190565b6020808252600990820152686e6f7420676175676560b81b604082015260600190565b60006020828403121561426557600080fd5b5051919050565b828152604060208201526000613e7b6040830184613fc2565b6000806040838503121561429857600080fd5b505080516020909101519092909150565b600080604083850312156142bc57600080fd5b82516142c781613a0e565b6020840151909250613d1b81613a0e565b6000602082840312156142ea57600080fd5b8151613a4081613a0e565b6001600160a01b038681168252858116602083015284166040820152821515606082015260a060808201819052600090613e1190830184613fc2565b6001600160a01b0385811682528416602082015260806040820181905260009061435d90830185613fc2565b8281036060840152613e118185613fc2565b60008282101561438157614381614165565b500390565b6000825160005b818110156143a7576020818601810151858301520161438d565b818111156143b6576000828501525b50919091019291505056fea26469706673582212204649942224feebb278f9771763e917d709d2b93592b92fffcc4f5d893fd958c864736f6c63430008090033
Deployed ByteCode Sourcemap
22127:19950:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23018:47;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;23018:47:0;;;;;;-1:-1:-1;;;;;566:32:1;;;548:51;;536:2;521:18;23018:47:0;;;;;;;;22481:21;;;;;-1:-1:-1;;;;;22481:21:0;;;41421:258;;;;;;:::i;:::-;;:::i;:::-;;22579:23;;;;;-1:-1:-1;;;;;22579:23:0;;;22752:32;;;;;-1:-1:-1;;;;;22752:32:0;;;27307:158;;;;;;:::i;:::-;;:::i;23676:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2107:14:1;;2100:22;2082:41;;2070:2;2055:18;23676:39:0;1942:187:1;22213:38:0;;22245:6;22213:38;;;;;2280:25:1;;;2268:2;2253:18;22213:38:0;2134:177:1;36022:85:0;36087:5;:12;36022:85;;37923:222;;;;;;:::i;:::-;;:::i;23827:17::-;;;;;;27473:300;;;;;;:::i;:::-;;:::i;29190:736::-;;;;;;:::i;:::-;;:::i;26525:265::-;;;;;;:::i;:::-;;:::i;22447:27::-;;;;;-1:-1:-1;;;;;22447:27:0;;;23624:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;36115:373;;;;;;:::i;:::-;;:::i;22791:34::-;;;;;;23903:41;;;;;;:::i;:::-;;;;;;;;;;;;;;35565:244;;;;;;:::i;:::-;;:::i;22387:19::-;;;;;-1:-1:-1;;;;;22387:19:0;;;36836:80;;;:::i;40904:307::-;;;;;;:::i;:::-;;:::i;41687:250::-;;;;;;:::i;:::-;;:::i;27781:139::-;;;;;;:::i;:::-;;:::i;41945:127::-;;;;;;:::i;:::-;;:::i;40114:164::-;;;;;;:::i;:::-;;:::i;39373:477::-;;;;;;:::i;:::-;;:::i;22413:27::-;;;;;-1:-1:-1;;;;;22413:27:0;;;34950:349;;;;;;:::i;:::-;;:::i;36924:83::-;;;;;;:::i;:::-;;:::i;39943:163::-;;;;;;:::i;:::-;;:::i;27135:164::-;;;;;;:::i;:::-;;:::i;38153:320::-;;;;;;:::i;:::-;;:::i;22712:31::-;;;;;-1:-1:-1;;;;;22712:31:0;;;23384:40;;;;;;:::i;:::-;;;;;;;;;;;;;;31757:351;;;;;;:::i;:::-;;:::i;39097:175::-;;;;;;:::i;:::-;;:::i;24037:40::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23953:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22314:18;;;;;;;;-1:-1:-1;;;;;22314:18:0;;;38811:94;;;;;;:::i;:::-;;:::i;22834:23::-;;;;;;34392:285;;;;;;:::i;:::-;;:::i;36667:161::-;;;;;;:::i;:::-;;:::i;34685:257::-;;;;;;:::i;:::-;;:::i;22511:17::-;;;;;-1:-1:-1;;;;;22511:17:0;;;32334:1754;;;;;;:::i;:::-;;:::i;35307:250::-;;;;;;:::i;:::-;;:::i;23164:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;23319;;;;;;:::i;:::-;;:::i;23089:41::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;23089:41:0;;;23578:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22889:22;;;;;;:::i;:::-;;:::i;34096:288::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27928:185::-;;;;;;:::i;:::-;;:::i;22953:41::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;22953:41:0;;;39280:85;;;:::i;40673:223::-;;;;;;:::i;:::-;;:::i;26798:145::-;;;;;;:::i;:::-;;:::i;22339:22::-;;;;;-1:-1:-1;;;;;22339:22:0;;;38913:176;;;;;;:::i;:::-;;:::i;41219:194::-;;;;;;:::i;:::-;;:::i;23231:57::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;36496:163;;;;;;:::i;:::-;;:::i;23853:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;39858:77;;;:::i;26951:176::-;;;;;;:::i;:::-;;:::i;35817:197::-;;;;;;:::i;:::-;;:::i;38481:322::-;;;;;;:::i;:::-;;:::i;23470:38::-;;;;;;:::i;:::-;;;;;;;;;;;;;;25806:486;;;;;;:::i;:::-;;:::i;24144:19::-;;;;;;;;;41421:258;41537:8;;-1:-1:-1;;;;;41537:8:0;41523:10;:22;41515:47;;;;-1:-1:-1;;;41515:47:0;;;;;;;:::i;:::-;;;;;;;;;41578:6;41573:99;41590:17;;;41573:99;;;41655:2;;41658:1;41655:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41629:9;:23;41641:6;;41648:1;41641:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41629:23:0;;;;;;;;;;;;-1:-1:-1;41629:23:0;:31;;-1:-1:-1;;41629:31:0;;;;;;;;;;41609:3;;;;:::i;:::-;;;;41573:99;;;;41421:258;;;;:::o;27307:158::-;27392:8;;-1:-1:-1;;;;;27392:8:0;27378:10;:22;27370:48;;;;-1:-1:-1;;;27370:48:0;;13813:2:1;27370:48:0;;;13795:21:1;13852:2;13832:18;;;13825:30;-1:-1:-1;;;13871:18:1;;;13864:43;13924:18;;27370:48:0;13611:337:1;27370:48:0;27429:22;:28;27307:158::o;37923:222::-;38022:6;38017:121;38038:7;:14;38034:1;:18;38017:121;;;38081:7;38089:1;38081:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;38074:28:0;;38103:10;38115:7;38123:1;38115:10;;;;;;;;:::i;:::-;;;;;;;38074:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38054:3;;;;;:::i;:::-;;;;38017:121;;;;37923:222;;:::o;27473:300::-;26443:19;;;;:9;:19;;;;;;27525:8;;22245:6;26402:26;22245:6;26402:15;:26;:::i;:::-;26401:39;;;;:::i;:::-;:61;26393:104;;;;-1:-1:-1;;;26393:104:0;;14913:2:1;26393:104:0;;;14895:21:1;14952:2;14932:18;;;14925:30;14991:32;14971:18;;;14964:60;15041:18;;26393:104:0;14711:354:1;26393:104:0;27568:3:::1;::::0;27554:58:::1;::::0;-1:-1:-1;;;27554:58:0;;27591:10:::1;27554:58;::::0;::::1;15244:51:1::0;15311:18;;;15304:34;;;27568:3:0;;;::::1;-1:-1:-1::0;;;;;27568:3:0::1;::::0;27554:36:::1;::::0;15217:18:1;;27554:58:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27546:97;;;::::0;-1:-1:-1;;;27546:97:0;;15801:2:1;27546:97:0::1;::::0;::::1;15783:21:1::0;15840:2;15820:18;;;15813:30;15879:28;15859:18;;;15852:56;15925:18;;27546:97:0::1;15599:350:1::0;27546:97:0::1;27654:19;::::0;;;:9:::1;:19;::::0;;;;27676:15:::1;27654:37:::0;;27702:16:::1;27664:8:::0;27702:6:::1;:16::i;:::-;27743:3;::::0;27729:36:::1;::::0;-1:-1:-1;;;27729:36:0;;::::1;::::0;::::1;2280:25:1::0;;;27743:3:0;;;::::1;-1:-1:-1::0;;;;;27743:3:0::1;::::0;27729:26:::1;::::0;2253:18:1;;27729:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27473:300:::0;;:::o;29190:736::-;29493:7;;;;;:27;;-1:-1:-1;29518:2:0;;-1:-1:-1;;;;;29518:2:0;29504:10;:16;29493:27;29490:403;;;29537:26;29566:18;;;:8;:18;;;;;;;;29537:47;;;;;;;;;;;;;;;;;;;29566:18;;29537:47;;;29566:18;29537:47;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29537:47:0;;;;;;;;;;;;;;;;;;;;;;;29599:13;29615:9;:16;29599:32;;29646:25;29688:8;-1:-1:-1;;;;;29674:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29674:23:0;;29646:51;;29719:6;29714:115;29735:8;29731:1;:12;29714:115;;;29784:5;:15;29790:8;29784:15;;;;;;;;;;;:29;29800:9;29810:1;29800:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;29784:29:0;-1:-1:-1;;;;;29784:29:0;;;;;;;;;;;;;29770:8;29779:1;29770:11;;;;;;;;:::i;:::-;;;;;;;;;;:43;29745:4;;;;:::i;:::-;;;;29714:115;;;;29845:36;29851:8;29861:9;29872:8;29845:5;:36::i;:::-;29522:371;;;29490:403;29190:736;:::o;26525:265::-;26632:6;;-1:-1:-1;;;;;26632:6:0;26618:10;:20;26610:44;;;;-1:-1:-1;;;26610:44:0;;16156:2:1;26610:44:0;;;16138:21:1;16195:2;16175:18;;;16168:30;-1:-1:-1;;;16214:18:1;;;16207:41;16265:18;;26610:44:0;15954:335:1;26610:44:0;26670:6;26665:91;26686:7;:14;26682:1;:18;26665:91;;;26722:22;26733:7;26741:1;26733:10;;;;;;;;:::i;:::-;;;;;;;26722;:22::i;:::-;26702:3;;;;:::i;:::-;;;;26665:91;;;-1:-1:-1;26766:6:0;:16;;-1:-1:-1;;;;;;26766:16:0;-1:-1:-1;;;;;26766:16:0;;;;;;;;;;-1:-1:-1;26525:265:0:o;36115:373::-;36194:4;;36176:58;;-1:-1:-1;;;;;36194:4:0;36200:10;36220:4;36227:6;36176:17;:58::i;:::-;36304:11;;36271:14;;36288:13;:6;36297:4;36288:13;:::i;:::-;:27;;;;:::i;:::-;36271:44;-1:-1:-1;36373:10:0;;36369:58;;36409:6;36400:5;;:15;;;;;;;:::i;:::-;;;;-1:-1:-1;;36369:58:0;36467:4;;36442:38;;2280:25:1;;;-1:-1:-1;;;;;36467:4:0;;;;36455:10;;36442:38;;2268:2:1;2253:18;36442:38:0;;;;;;;36165:323;36115:373;:::o;35565:244::-;35662:10;35654:19;;;;:7;:19;;;;;;;;35646:41;;;;-1:-1:-1;;;35646:41:0;;;;;;;:::i;:::-;35702:11;;35698:51;;35729:3;;35715:34;;-1:-1:-1;;;35715:34:0;;;;;2280:25:1;;;35729:3:0;;;;-1:-1:-1;;;;;35729:3:0;;35715:25;;2253:18:1;;35715:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35698:51;35765:36;;35793:7;;35781:10;;-1:-1:-1;;;;;35765:36:0;;;;;;;;35565:244;;:::o;36836:80::-;36895:5;:12;36877:31;;36892:1;;36877:14;:31::i;:::-;36836:80::o;40904:307::-;41003:8;;-1:-1:-1;;;;;41003:8:0;40989:10;:22;40981:47;;;;-1:-1:-1;;;40981:47:0;;;;;;;:::i;:::-;41044:6;41039:165;41056:18;;;41039:165;;;41103:13;:25;41117:7;;41125:1;41117:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41103:25:0;;;;;;;;;;;;-1:-1:-1;41103:25:0;;;41096:32;;-1:-1:-1;;41096:32:0;;;41172:7;;41180:1;41172:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41148:42:0;41160:10;-1:-1:-1;;;;;41148:42:0;;;;;;;;;;;41076:3;;;;:::i;:::-;;;;41039:165;;41687:250;41797:8;;-1:-1:-1;;;;;41797:8:0;41783:10;:22;41775:47;;;;-1:-1:-1;;;41775:47:0;;;;;;;:::i;:::-;41838:6;41833:97;41850:17;;;41833:97;;;41913:2;;41916:1;41913:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41889:8;:21;41899:6;;41906:1;41899:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41889:21:0;;;;;;;;;;;;-1:-1:-1;41889:21:0;:29;;-1:-1:-1;;41889:29:0;;;;;;;;;;41869:3;;;;:::i;:::-;;;;41833:97;;27781:139;27845:6;27841:72;27856:4;:11;27854:1;:13;27841:72;;;27882:22;27896:4;27901:1;27896:7;;;;;;;;:::i;:::-;;;;;;;27882:13;:22::i;:::-;27868:3;;;;:::i;:::-;;;;27841:72;;;;27781:139;:::o;41945:127::-;42016:8;;-1:-1:-1;;;;;42016:8:0;42002:10;:22;41994:47;;;;-1:-1:-1;;;41994:47:0;;;;;;;:::i;:::-;42052:7;:12;;-1:-1:-1;;42052:12:0;;;;;;;;;;41945:127::o;40114:164::-;40185:6;40180:91;40201:7;:14;40197:1;:18;40180:91;;;40237:22;40248:7;40256:1;40248:10;;;;;;;;:::i;:::-;;;;;;;40237;:22::i;:::-;40217:3;;;;:::i;:::-;;;;40180:91;;39373:477;25672:7;;;;25671:8;25663:35;;;;-1:-1:-1;;;25663:35:0;;16966:2:1;25663:35:0;;;16948:21:1;17005:2;16985:18;;;16978:30;-1:-1:-1;;;17024:18:1;;;17017:44;17078:18;;25663:35:0;16764:338:1;25663:35:0;25709:7;:14;;-1:-1:-1;;25709:14:0;25719:4;25709:14;;;39440:6:::1;::::0;39432:31:::1;::::0;;-1:-1:-1;;;39432:31:0;;;;-1:-1:-1;;;;;39440:6:0;;::::1;::::0;39432:29:::1;::::0;:31:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;25709:7;39440:6;39432:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39474:18;39485:6;39474:10;:18::i;:::-;-1:-1:-1::0;;;;;39560:17:0;;::::1;39542:15;39560:17:::0;;;:9:::1;:17;::::0;;;;;;;39625:4:::1;::::0;39605:25;;-1:-1:-1;;;39605:25:0;;39625:4;;;::::1;39605:25;::::0;::::1;548:51:1::0;39605:19:0::1;::::0;521:18:1;;39605:25:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39592:10;:38;:67;;;;-1:-1:-1::0;39658:1:0::1;39634:21;22245:6;39634:10:::0;:21:::1;:::i;:::-;:25;39592:67;39588:255;;;-1:-1:-1::0;;;;;39676:17:0;;::::1;39696:1;39676:17:::0;;;:9:::1;:17;::::0;;;;;:21;;;;39746:4:::1;::::0;39712:51;;-1:-1:-1;;;39712:51:0;;39746:4;::::1;39712:51;::::0;::::1;15244::1::0;15311:18;;;15304:34;;;39676:17:0;39712:33:::1;::::0;15217:18:1;;39712:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;39783:48:0::1;::::0;2280:25:1;;;-1:-1:-1;;;;;39783:48:0;::::1;::::0;-1:-1:-1;39800:10:0::1;::::0;-1:-1:-1;39783:48:0::1;::::0;2268:2:1;2253:18;39783:48:0::1;;;;;;;39588:255;-1:-1:-1::0;;25746:7:0;:15;;-1:-1:-1;;25746:15:0;;;39373:477::o;34950:349::-;35045:10;35037:19;;;;:7;:19;;;;;;;;35029:41;;;;-1:-1:-1;;;35029:41:0;;;;;;;:::i;:::-;35097:10;35089:19;;;;:7;:19;;;;;;;;35081:44;;;;-1:-1:-1;;;35081:44:0;;17498:2:1;35081:44:0;;;17480:21:1;17537:2;17517:18;;;17510:30;-1:-1:-1;;;17556:18:1;;;17549:42;17608:18;;35081:44:0;17296:336:1;35081:44:0;35192:11;;35188:51;;35219:3;;35205:34;;-1:-1:-1;;;35205:34:0;;;;;2280:25:1;;;35219:3:0;;;;-1:-1:-1;;;;;35219:3:0;;35205:25;;2253:18:1;;35205:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35188:51;35255:36;;35283:7;;35271:10;;-1:-1:-1;;;;;35255:36:0;;;;;;;;34950:349;;:::o;36924:83::-;36981:18;36992:6;36981:10;:18::i;39943:163::-;40020:5;40006:93;40031:6;40027:1;:10;40006:93;;;40059:28;40070:6;:16;40077:5;40083:1;40077:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;40077:8:0;;;40070:16;;;;;;;;;;;;;;;;;40059:10;:28::i;:::-;40039:3;;;;:::i;:::-;;;;40006:93;;27135:164;27219:8;;-1:-1:-1;;;;;27219:8:0;27205:10;:22;27197:59;;;;-1:-1:-1;;;27197:59:0;;17839:2:1;27197:59:0;;;17821:21:1;17878:2;17858:18;;;17851:30;17917:26;17897:18;;;17890:54;17961:18;;27197:59:0;17637:348:1;27197:59:0;27267:17;:24;;-1:-1:-1;;;;;;27267:24:0;-1:-1:-1;;;;;27267:24:0;;;;;;;;;;27135:164::o;38153:320::-;38283:3;;38269:58;;-1:-1:-1;;;38269:58:0;;38306:10;38269:58;;;15244:51:1;15311:18;;;15304:34;;;38283:3:0;;;;-1:-1:-1;;;;;38283:3:0;;38269:36;;15217:18:1;;38269:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38261:67;;;;;;38344:6;38339:127;38360:7;:14;38356:1;:18;38339:127;;;38403:7;38411:1;38403:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;38396:36:0;;38433:8;38443:7;38451:1;38443:10;;;;;;;;:::i;:::-;;;;;;;38396:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38376:3;;;;;:::i;:::-;;;;38339:127;;31757:351;26443:19;;;;:9;:19;;;;;;31866:7;;22245:6;26402:26;22245:6;26402:15;:26;:::i;:::-;26401:39;;;;:::i;:::-;:61;26393:104;;;;-1:-1:-1;;;26393:104:0;;14913:2:1;26393:104:0;;;14895:21:1;14952:2;14932:18;;;14925:30;14991:32;14971:18;;;14964:60;15041:18;;26393:104:0;14711:354:1;26393:104:0;31908:3:::1;::::0;31894:57:::1;::::0;-1:-1:-1;;;31894:57:0;;31931:10:::1;31894:57;::::0;::::1;15244:51:1::0;15311:18;;;15304:34;;;31908:3:0;;;::::1;-1:-1:-1::0;;;;;31908:3:0::1;::::0;31894:36:::1;::::0;15217:18:1;;31894:57:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31886:66;;;::::0;::::1;;31971:35:::0;;::::1;31963:44;;;::::0;::::1;;32018:18;::::0;;;:9:::1;:18;::::0;;;;;;;;32039:15:::1;32018:36:::0;;32065:35;;;;::::1;::::0;;;;;;;;;;;::::1;::::0;32028:7;;32080:9;;;;;;32065:35;;::::1;::::0;32080:9;;32065:35;32080:9;32065:35;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;;32065:35:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;32091:8:0;;-1:-1:-1;32091:8:0;;;;32065:35;::::1;::::0;32091:8;;32065:35;32091:8;32065:35;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32065:5:0::1;::::0;-1:-1:-1;;;32065:35:0:i:1;39097:175::-:0;39178:5;39164:101;39189:6;39185:1;:10;39164:101;;;39224:6;:16;39231:5;39237:1;39231:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;39231:8:0;;;39224:16;;;;;;;;;;;;;;;;39217:36;;-1:-1:-1;;;39217:36:0;;;;39224:16;;;;;39217:34;;:36;;;;;39224:16;;39217:36;;;;;;;;39224:16;39217:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39197:3;;;;;:::i;:::-;;;;39164:101;;38811:94;38878:6;-1:-1:-1;;;;;38871:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34392:285::-;34469:16;;-1:-1:-1;;;;;34469:16:0;34455:10;:30;34447:64;;;;-1:-1:-1;;;34447:64:0;;18779:2:1;34447:64:0;;;18761:21:1;18818:2;18798:18;;;18791:30;-1:-1:-1;;;18837:18:1;;;18830:51;18898:18;;34447:64:0;18577:345:1;34447:64:0;-1:-1:-1;;;;;34530:15:0;;;;;;:7;:15;;;;;;;;34522:46;;;;-1:-1:-1;;;34522:46:0;;19129:2:1;34522:46:0;;;19111:21:1;19168:2;19148:18;;;19141:30;-1:-1:-1;;;19187:18:1;;;19180:48;19245:18;;34522:46:0;18927:342:1;34522:46:0;-1:-1:-1;;;;;34579:15:0;;34597:5;34579:15;;;:7;:15;;;;;;;;:23;;-1:-1:-1;;34579:23:0;;;34613:9;:17;;;;;;:21;;;34650:19;;;34597:5;34650:19;34392:285;:::o;36667:161::-;36745:5;36731:90;36756:3;36752:1;:7;36731:90;;;36781:28;36792:6;:16;36799:5;36805:1;36799:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36799:8:0;;;36792:16;;;;;;;;;;;;;;;;;36781:10;:28::i;:::-;36761:3;;;;:::i;:::-;;;;36731:90;;34685:257;34764:16;;-1:-1:-1;;;;;34764:16:0;34750:10;:30;34742:64;;;;-1:-1:-1;;;34742:64:0;;18779:2:1;34742:64:0;;;18761:21:1;18818:2;18798:18;;;18791:30;-1:-1:-1;;;18837:18:1;;;18830:51;18898:18;;34742:64:0;18577:345:1;34742:64:0;-1:-1:-1;;;;;34826:15:0;;;;;;:7;:15;;;;;;;;34825:16;34817:48;;;;-1:-1:-1;;;34817:48:0;;19476:2:1;34817:48:0;;;19458:21:1;19515:2;19495:18;;;19488:30;-1:-1:-1;;;19534:18:1;;;19527:49;19593:18;;34817:48:0;19274:343:1;34817:48:0;-1:-1:-1;;;;;34876:15:0;;;;;;:7;:15;;;;;;:22;;-1:-1:-1;;34876:22:0;34894:4;34876:22;;;34914:20;;;34876:15;34914:20;34685:257;:::o;32334:1754::-;-1:-1:-1;;;;;32414:13:0;;;32386:7;32414:13;;;:6;:13;;;;;;32386:7;;32414:13;:29;32406:48;;;;-1:-1:-1;;;32406:48:0;;19824:2:1;32406:48:0;;;19806:21:1;19863:1;19843:18;;;19836:29;-1:-1:-1;;;19881:18:1;;;19874:36;19927:18;;32406:48:0;19622:329:1;32406:48:0;32499:16;;;32513:1;32499:16;;;;;;;;;32465:31;;32499:16;;;;;;;;;;-1:-1:-1;;32553:7:0;;32540:35;;-1:-1:-1;;;32540:35:0;;-1:-1:-1;;;;;566:32:1;;;32540:35:0;;;548:51:1;32465:50:0;;-1:-1:-1;32526:11:0;;32553:7;;;;32540:28;;521:18:1;;32540:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32526:49;;32586:14;32611;32642:6;32638:333;;;32690:5;-1:-1:-1;;;;;32684:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32665:40;;;;;;;;32740:6;32720:14;32735:1;32720:17;;;;;;;;:::i;:::-;;;;;;:26;-1:-1:-1;;;;;32720:26:0;;;-1:-1:-1;;;;;32720:26:0;;;;;32781:6;32761:14;32776:1;32761:17;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32761:26:0;;;:17;;;;;;;;;:26;32806:4;;;;:14;;;;;;;:32;;-1:-1:-1;32824:4:0;;-1:-1:-1;;;;;32824:14:0;;;:4;;:14;;32806:32;32802:95;;;32877:4;;;32857:17;;-1:-1:-1;;;;;32877:4:0;;;;32857:14;;:17;;;;;;:::i;:::-;;;;;;:24;-1:-1:-1;;;;;32857:24:0;;;-1:-1:-1;;;;;32857:24:0;;;;;32802:95;32638:333;;;32955:4;;32935:17;;-1:-1:-1;;;;;32955:4:0;;;;32935:14;;32955:4;;32935:17;;;;:::i;:::-;;;;;;:24;-1:-1:-1;;;;;32935:24:0;;;-1:-1:-1;;;;;32935:24:0;;;;;32638:333;33001:8;;-1:-1:-1;;;;;33001:8:0;32987:10;:22;32983:397;;33091:6;33083:25;;;;-1:-1:-1;;;33083:25:0;;20548:2:1;33083:25:0;;;20530:21:1;20587:1;20567:18;;;20560:29;-1:-1:-1;;;20605:18:1;;;20598:36;20651:18;;33083:25:0;20346:329:1;33083:25:0;-1:-1:-1;;;;;33131:21:0;;;;;;:13;:21;;;;;;;;:46;;;;-1:-1:-1;;;;;;33156:21:0;;;;;;:13;:21;;;;;;;;33131:46;33123:71;;;;-1:-1:-1;;;33123:71:0;;20882:2:1;33123:71:0;;;20864:21:1;20921:2;20901:18;;;20894:30;-1:-1:-1;;;20940:18:1;;;20933:42;20992:18;;33123:71:0;20680:336:1;33123:71:0;-1:-1:-1;;;;;33214:16:0;;;;;;:8;:16;;;;;;;;;:36;;-1:-1:-1;;;;;;33234:16:0;;;;;;:8;:16;;;;;;;;33214:36;33206:67;;;;-1:-1:-1;;;33206:67:0;;21223:2:1;33206:67:0;;;21205:21:1;21262:2;21242:18;;;21235:30;-1:-1:-1;;;21281:18:1;;;21274:48;21339:18;;33206:67:0;21021:342:1;33206:67:0;33299:5;-1:-1:-1;;;;;33293:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;33285:83;;;;-1:-1:-1;;;33285:83:0;;21570:2:1;33285:83:0;;;21552:21:1;21609:2;21589:18;;;21582:30;21648:34;21628:18;;;21621:62;-1:-1:-1;;;21699:18:1;;;21692:40;21749:19;;33285:83:0;21368:406:1;33285:83:0;33423:12;;;33409:55;;-1:-1:-1;;;33409:55:0;;33392:14;;-1:-1:-1;;;;;33423:12:0;;;;33409:39;;:55;;33449:14;;33409:55;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33509:16;;;33523:1;33509:16;;;;;;;;;33392:72;;-1:-1:-1;33477:29:0;;33509:16;;;;;;;;;;-1:-1:-1;;33554:4:0;;33536:15;;;;-1:-1:-1;;;;;;33554:4:0;;33536:15;;-1:-1:-1;33554:4:0;;33536:15;;;;:::i;:::-;-1:-1:-1;;;;;33536:22:0;;;:15;;;;;;;;;:22;33600:12;;33569:14;33641:3;;33586:81;;-1:-1:-1;;;33586:81:0;;33569:14;;33600:12;;;;33586:39;;:81;;33626:5;;33633:6;;33641:3;;;;;;33646:6;;33654:12;;33586:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33689:4;;33682:44;;-1:-1:-1;;;33682:44:0;;-1:-1:-1;;;;;15262:32:1;;;33682:44:0;;;15244:51:1;-1:-1:-1;;15311:18:1;;;15304:34;33569:98:0;;-1:-1:-1;33689:4:0;;;33682:20;;15217:18:1;;33682:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;33737:14:0;;;;;;;:6;:14;;;;;;;;:23;;;;;-1:-1:-1;;;;;;33737:23:0;;;;;;;33771:13;;;;;;:6;:13;;;;;:22;;;;;;;;33804:20;;;:12;:20;;;;;:28;;;;;;;;;;;33843:7;:15;;;;;:22;;-1:-1:-1;;33843:22:0;;;33737:23;33843:22;;;;;;33876:7;:15;;;;;;:22;;;;;;;;33909:18;33744:6;33909:10;:18::i;:::-;33938:5;:17;;;;;;;-1:-1:-1;33938:17:0;;;;;;;;-1:-1:-1;;;;;;33938:17:0;-1:-1:-1;;;;;33938:17:0;;;;;;;;33971:85;;34015:10;;33938:17;33971:85;;;;33999:6;;34007;;34027:12;;34041:14;;33971:85;:::i;:::-;;;;;;;;34074:6;32334:1754;-1:-1:-1;;;;;;;;32334:1754:0:o;35307:250::-;35408:10;35400:19;;;;:7;:19;;;;;;;;35392:41;;;;-1:-1:-1;;;35392:41:0;;;;;;;:::i;:::-;35460:10;35452:19;;;;:7;:19;;;;;;;;35444:44;;;;-1:-1:-1;;;35444:44:0;;17498:2:1;35444:44:0;;;17480:21:1;17537:2;17517:18;;;17510:30;-1:-1:-1;;;17556:18:1;;;17549:42;17608:18;;35444:44:0;17296:336:1;35444:44:0;35533:7;35521:10;-1:-1:-1;;;;;35504:45:0;35512:7;-1:-1:-1;;;;;35504:45:0;;35542:6;35504:45;;;;2280:25:1;;2268:2;2253:18;;2134:177;35504:45:0;;;;;;;;35307:250;;;:::o;23319:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23319:42:0;;-1:-1:-1;23319:42:0;;-1:-1:-1;23319:42:0:o;22889:22::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22889:22:0;;-1:-1:-1;22889:22:0;:::o;34096:288::-;34168:16;34194:21;34232:6;:13;-1:-1:-1;;;;;34218:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34218:28:0;;34194:52;;34261:7;34257:98;34273:6;:13;34270:2;:16;34257:98;;;34320:23;34332:6;34339:2;34332:10;;;;;;;;:::i;:::-;;;;;;;34320:11;:23::i;:::-;34309:4;34314:2;34309:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34309:34:0;;;:8;;;;;;;;;;;:34;34288:4;;;;:::i;:::-;;;;34257:98;;;-1:-1:-1;34372:4:0;34096:288;-1:-1:-1;;34096:288:0:o;27928:185::-;28006:8;;-1:-1:-1;;;;;28006:8:0;27992:10;:22;27984:47;;;;-1:-1:-1;;;27984:47:0;;;;;;;:::i;:::-;28042:16;28049:8;28042:6;:16::i;:::-;28083:3;;28069:36;;-1:-1:-1;;;28069:36:0;;;;;2280:25:1;;;28083:3:0;;;;-1:-1:-1;;;;;28083:3:0;;28069:26;;2253:18:1;;28069:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39280:85;39344:5;:12;39326:31;;39341:1;;39326:14;:31::i;40673:223::-;40762:8;;-1:-1:-1;;;;;40762:8:0;40748:10;:22;40740:47;;;;-1:-1:-1;;;40740:47:0;;;;;;;:::i;:::-;40803:6;40798:91;40815:18;;;40798:91;;;40855:22;40866:7;;40874:1;40866:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;40855;:22::i;:::-;40835:3;;;;:::i;:::-;;;;40798:91;;26798:145;26878:8;;-1:-1:-1;;;;;26878:8:0;26864:10;:22;26856:48;;;;-1:-1:-1;;;26856:48:0;;13813:2:1;26856:48:0;;;13795:21:1;13852:2;13832:18;;;13825:30;-1:-1:-1;;;13871:18:1;;;13864:43;13924:18;;26856:48:0;13611:337:1;26856:48:0;26915:8;:20;;-1:-1:-1;;;;;;26915:20:0;-1:-1:-1;;;;;26915:20:0;;;;;;;;;;26798:145::o;38913:176::-;38988:6;38983:99;39004:7;:14;39000:1;:18;38983:99;;;39047:7;39055:1;39047:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;39040:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39020:3;;;;;:::i;:::-;;;;38983:99;;41219:194;41287:2;;-1:-1:-1;;;;;41287:2:0;41273:10;:16;41265:32;;;;-1:-1:-1;;;41265:32:0;;23535:2:1;41265:32:0;;;23517:21:1;23574:1;23554:18;;;23547:29;-1:-1:-1;;;23592:18:1;;;23585:33;23635:18;;41265:32:0;23333:326:1;41265:32:0;41305:8;:14;;-1:-1:-1;;;;;41305:14:0;;;-1:-1:-1;;;;;;41305:14:0;;;;;;;;41330:16;:22;;;;;;;;41363:17;:23;;;;;;;;41397:2;:8;;;;;;;;41219:194::o;36496:163::-;36566:6;36561:91;36582:7;:14;36578:1;:18;36561:91;;;36618:22;36629:7;36637:1;36629:10;;;;;;;;:::i;:::-;;;;;;;36618;:22::i;:::-;36598:3;;;;:::i;:::-;;;;36561:91;;39858:77;39914:5;:12;39900:27;;39911:1;;39900:10;:27::i;26951:176::-;27038:16;;-1:-1:-1;;;;;27038:16:0;27024:10;:30;27016:65;;;;-1:-1:-1;;;27016:65:0;;23866:2:1;27016:65:0;;;23848:21:1;23905:2;23885:18;;;23878:30;-1:-1:-1;;;23924:18:1;;;23917:52;23986:18;;27016:65:0;23664:346:1;27016:65:0;27092:16;:27;;-1:-1:-1;;;;;;27092:27:0;-1:-1:-1;;;;;27092:27:0;;;;;;;;;;26951:176::o;35817:197::-;35919:10;35911:19;;;;:7;:19;;;;;;;;35903:41;;;;-1:-1:-1;;;35903:41:0;;;;;;;:::i;:::-;35990:7;35978:10;-1:-1:-1;;;;;35960:46:0;35969:7;-1:-1:-1;;;;;35960:46:0;;35999:6;35960:46;;;;2280:25:1;;2268:2;2253:18;;2134:177;38481:322:0;38670:31;38683:7;38692:8;38670:12;:31::i;:::-;38715:12;;38712:84;;38744:40;38756:7;38765:8;38775;38744:11;:40::i;25806:486::-;19424:19;19447:13;;;;;;19446:14;;19494:34;;;;-1:-1:-1;19512:12:0;;19527:1;19512:12;;;;:16;19494:34;19493:108;;;-1:-1:-1;19573:4:0;10186:19;:23;;;19534:66;;-1:-1:-1;19583:12:0;;;;;:17;19534:66;19471:204;;;;-1:-1:-1;;;19471:204:0;;24217:2:1;19471:204:0;;;24199:21:1;24256:2;24236:18;;;24229:30;24295:34;24275:18;;;24268:62;-1:-1:-1;;;24346:18:1;;;24339:44;24400:19;;19471:204:0;24015:410:1;19471:204:0;19686:12;:16;;-1:-1:-1;;19686:16:0;19701:1;19686:16;;;19713:67;;;;19748:13;:20;;-1:-1:-1;;19748:20:0;;;;;19713:67;25965:3:::1;:10:::0;;-1:-1:-1;;;;;;25965:10:0::1;::::0;-1:-1:-1;;;;;25965:10:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;25986:18:0;;-1:-1:-1;;;;;;25986:18:0::1;::::0;;::::1;::::0;;;::::1;::::0;;26022:27:::1;::::0;;-1:-1:-1;;;26022:27:0;;;;:25:::1;::::0;:27:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;25965:10;26022:27;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26015:4;:34:::0;;-1:-1:-1;;;;;;26015:34:0;;::::1;-1:-1:-1::0;;;;;26015:34:0;;::::1;;::::0;;;26060:12:::1;:22:::0;;;::::1;::::0;;::::1;;::::0;;26093:12:::1;:22:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;26126:6:::1;:19:::0;;26135:10:::1;26126:19:::0;;::::1;::::0;::::1;::::0;;;26156:8:::1;:21:::0;;;::::1;::::0;::::1;::::0;;26188:16:::1;:29:::0;;;::::1;::::0;::::1;::::0;;26228:17:::1;:30:::0;;;::::1;::::0;::::1;::::0;;26269:2:::1;:15:::0;;;;::::1;;::::0;;19802:102;;;;19853:5;19837:21;;-1:-1:-1;;19837:21:0;;;19878:14;;-1:-1:-1;24582:36:1;;19878:14:0;;24570:2:1;24555:18;19878:14:0;;;;;;;19413:498;25806:486;;;;:::o;28121:1061::-;28172:27;28202:18;;;:8;:18;;;;;;28251:16;;28349:3;;28335:36;;-1:-1:-1;;;28335:36:0;;;;;2280:25:1;;;28202:18:0;;28251:16;;28172:27;;;;28349:3;;;-1:-1:-1;;;;;28349:3:0;;28335:26;;2253:18:1;;28335:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28313:58;;28389:6;28384:672;28405:12;28401:1;:16;28384:672;;;28440:13;28456:9;28466:1;28456:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;28500:15;;;:5;:15;;;;;;-1:-1:-1;;;;;28456:12:0;;;28500:22;;;;;;;;;;28456:12;;-1:-1:-1;28543:11:0;;28539:506;;-1:-1:-1;;;;;28586:13:0;;;;;;;:6;:13;;;;;;28575:25;;28586:13;28575:10;:25::i;:::-;-1:-1:-1;;;;;28619:14:0;;;;;;:7;:14;;;;;:24;;28637:6;;28619:14;:24;;28637:6;;28619:24;:::i;:::-;;;;-1:-1:-1;;28662:15:0;;;;:5;:15;;;;;;;;-1:-1:-1;;;;;28662:22:0;;;;;;;;;:32;;28688:6;;28662:15;:32;;28688:6;;28662:32;:::i;:::-;;;;-1:-1:-1;;28717:10:0;;28713:266;;-1:-1:-1;;;;;28766:13:0;;;28759:21;28766:13;;;:6;:13;;;;;;;;;;;28759:21;;:6;:21;;;;;;;;28752:91;;-1:-1:-1;;;28752:91:0;;;;;24990:25:1;;;25031:18;;;25024:34;;;28819:10:0;25112:18:1;;;25105:43;25184:15;;;25164:18;;;25157:43;28759:21:0;;;28752:39;;24962:19:1;;28752:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28882:6;28866:22;;;;;:::i;:::-;;;28713:266;;;28937:22;28953:6;28937:22;;:::i;:::-;;;28713:266;29012:8;29002:27;29022:6;29002:27;;;;2280:25:1;;2268:2;2253:18;;2134:177;29002:27:0;;;;;;;;28539:506;28425:631;;28419:4;;;;;:::i;:::-;;;;28384:672;;;;29089:12;29066:11;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;29137:1:0;29113:21;;;:11;:21;;;;;;;;:25;;;29156:8;:18;;;;;29149:25;;;:::i;29934:1815::-;30129:8;30125:151;30144:9;:16;30140:3;:20;30125:151;;;30196:9;:27;30207:9;30217:3;30207:14;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;30196:27:0;;;;;;;;;;;-1:-1:-1;30196:27:0;;;;30194:29;30177:90;;;;-1:-1:-1;;;30177:90:0;;25413:2:1;30177:90:0;;;25395:21:1;25452:2;25432:18;;;25425:30;25491:25;25471:18;;;25464:53;25534:18;;30177:90:0;25211:347:1;30177:90:0;30161:5;;;;:::i;:::-;;;;30125:151;;;;30286:16;30293:8;30286:6;:16::i;:::-;30329;;30313:13;30388:3;;30374:41;;-1:-1:-1;;;30374:41:0;;;;;2280:25:1;;;30388:3:0;;;;-1:-1:-1;;;;;30388:3:0;;30374:31;;2253:18:1;;30374:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30426:24;30570:3;;30556:36;;-1:-1:-1;;;30556:36:0;;;;;2280:25:1;;;30356:59:0;;-1:-1:-1;30426:24:0;;;;;;;;30570:3;;;-1:-1:-1;;;;;30570:3:0;;30556:26;;2253:18:1;;30556:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30534:58;;30610:6;30605:94;30626:8;30622:1;:12;30605:94;;;30676:8;30685:1;30676:11;;;;;;;;:::i;:::-;;;;;;;30656:31;;;;;:::i;:::-;;-1:-1:-1;30636:3:0;;;;:::i;:::-;;;;30605:94;;;;30716:6;30711:862;30732:8;30728:1;:12;30711:862;;;30762:13;30778:9;30788:1;30778:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;30822:13:0;;;30805:14;30822:13;;;:6;:13;;;;;;;;;;30856:15;;;:7;:15;;;;;30778:12;;-1:-1:-1;30856:15:0;;30852:710;;;30892:19;30938:16;30928:7;30914:8;30923:1;30914:11;;;;;;;;:::i;:::-;;;;;;;:21;;;;:::i;:::-;:40;;;;:::i;:::-;30981:15;;;;:5;:15;;;;;;;;-1:-1:-1;;;;;30981:22:0;;;;;;;;;;30892:62;;-1:-1:-1;30981:27:0;30973:36;;;;;;31036:16;31028:25;;;;;;31072:18;31083:6;31072:10;:18::i;:::-;31111;;;;:8;:18;;;;;;;;:30;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31111:30:0;-1:-1:-1;;;;;31111:30:0;;;;;;;;31162:14;;:7;:14;;;;;:29;;31180:11;;31111:18;31162:29;;31180:11;;31162:29;:::i;:::-;;;;-1:-1:-1;;31210:15:0;;;;:5;:15;;;;;;;;-1:-1:-1;;;;;31210:22:0;;;;;;;;;:37;;31236:11;;31210:15;:37;;31236:11;;31210:37;:::i;:::-;;;;;;;;31273:6;:14;31280:6;-1:-1:-1;;;;;31273:14:0;-1:-1:-1;;;;;31273:14:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31273:14:0;-1:-1:-1;;;;;31266:31:0;;31306:11;31320:8;31330:10;31342:11;31266:88;;;;;;;;;;;;;;;;;24990:25:1;;;25046:2;25031:18;;25024:34;;;;-1:-1:-1;;;;;25132:15:1;;;25127:2;25112:18;;25105:43;25184:15;25179:2;25164:18;;25157:43;24977:3;24962:19;;24759:447;31266:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31388:11;31373:26;;;;;:::i;:::-;;-1:-1:-1;31418:27:0;31434:11;31418:27;;:::i;:::-;31469:77;;;31482:10;25765:51:1;;25847:2;25832:18;;25825:34;;;31530:15:0;25875:18:1;;;25868:34;31469:77:0;;31418:27;;-1:-1:-1;31507:8:0;;-1:-1:-1;;;;;31469:77:0;;;;;;;;;;;;;25753:2:1;31469:77:0;;;30873:689;30852:710;30747:826;;30742:3;;;;;:::i;:::-;;;;30711:862;;;-1:-1:-1;31587:15:0;;31583:56;;31618:3;;31604:35;;-1:-1:-1;;;31604:35:0;;;;;2280:25:1;;;31618:3:0;;;;-1:-1:-1;;;;;31618:3:0;;31604:25;;2253:18:1;;31604:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31583:56;31673:12;31650:11;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;;31697:21:0;;;;:11;:21;;;;;;:44;;;;-1:-1:-1;;;;;;29934:1815:0:o;32116:210::-;-1:-1:-1;;;;;32181:21:0;;;;;;:13;:21;;;;;;;;32180:22;32172:54;;;;-1:-1:-1;;;32172:54:0;;26115:2:1;32172:54:0;;;26097:21:1;26154:2;26134:18;;;26127:30;-1:-1:-1;;;26173:18:1;;;26166:49;26232:18;;32172:54:0;25913:343:1;32172:54:0;-1:-1:-1;;;;;32237:21:0;;;;;;:13;:21;;;;;;:28;;-1:-1:-1;;32237:28:0;32261:4;32237:28;;;;;;32281:37;;32261:4;;32237:21;32293:10;;32281:37;;32237:21;32281:37;32116:210;:::o;40286:379::-;40417:1;40397:5;-1:-1:-1;;;;;40397:17:0;;:21;40389:54;;;;-1:-1:-1;;;40389:54:0;;26463:2:1;40389:54:0;;;26445:21:1;26502:2;26482:18;;;26475:30;-1:-1:-1;;;26521:18:1;;;26514:50;26581:18;;40389:54:0;26261:344:1;40389:54:0;40510:69;;;-1:-1:-1;;;;;26868:15:1;;;40510:69:0;;;26850:34:1;26920:15;;;26900:18;;;26893:43;26952:18;;;;26945:34;;;40510:69:0;;;;;;;;;;26785:18:1;;;;40510:69:0;;;;;;;-1:-1:-1;;;;;40510:69:0;-1:-1:-1;;;40510:69:0;;;40499:81;;-1:-1:-1;;;;40499:10:0;;;;:81;;40510:69;40499:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40454:126;;;;40599:7;:57;;;;-1:-1:-1;40611:11:0;;:16;;:44;;;40642:4;40631:24;;;;;;;;;;;;:::i;:::-;40591:66;;;;;37015:900;-1:-1:-1;;;;;37087:20:0;;;37071:13;37087:20;;;:12;:20;;;;;;;;;;;;37138:14;;;:7;:14;;;;;;;37167:13;;37163:745;;-1:-1:-1;;;;;37217:19:0;;37197:17;37217:19;;;:11;:19;;;;;;;37265:5;;37329:28;;;;37217:19;37439:21;37217:19;37265:5;37439:21;:::i;:::-;37425:35;-1:-1:-1;37537:10:0;;37533:255;;37568:11;37609:4;37582:24;37600:6;37587:9;37582:24;:::i;:::-;:31;;;;:::i;:::-;-1:-1:-1;;;;;37686:15:0;;;;;;:7;:15;;;;;;37568:45;;-1:-1:-1;37686:15:0;;37682:91;;;-1:-1:-1;;;;;37726:17:0;;;;;;:9;:17;;;;;:27;;37747:6;;37726:17;:27;;37747:6;;37726:27;:::i;:::-;;;;-1:-1:-1;;37682:91:0;37549:239;37182:617;;;38017:121;37923:222;;:::o;37163:745::-;37842:5;;-1:-1:-1;;;;;37820:19:0;;;;;;:11;:19;;;;;:27;37060:855;;37015:900;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;:::-;386:5;150:247;-1:-1:-1;;;150:247:1:o;610:367::-;673:8;683:6;737:3;730:4;722:6;718:17;714:27;704:55;;755:1;752;745:12;704:55;-1:-1:-1;778:20:1;;-1:-1:-1;;;;;810:30:1;;807:50;;;853:1;850;843:12;807:50;890:4;882:6;878:17;866:29;;950:3;943:4;933:6;930:1;926:14;918:6;914:27;910:38;907:47;904:67;;;967:1;964;957:12;904:67;610:367;;;;;:::o;982:770::-;1101:6;1109;1117;1125;1178:2;1166:9;1157:7;1153:23;1149:32;1146:52;;;1194:1;1191;1184:12;1146:52;1234:9;1221:23;-1:-1:-1;;;;;1304:2:1;1296:6;1293:14;1290:34;;;1320:1;1317;1310:12;1290:34;1359:70;1421:7;1412:6;1401:9;1397:22;1359:70;:::i;:::-;1448:8;;-1:-1:-1;1333:96:1;-1:-1:-1;1536:2:1;1521:18;;1508:32;;-1:-1:-1;1552:16:1;;;1549:36;;;1581:1;1578;1571:12;1549:36;;1620:72;1684:7;1673:8;1662:9;1658:24;1620:72;:::i;:::-;982:770;;;;-1:-1:-1;1711:8:1;-1:-1:-1;;;;982:770:1:o;1757:180::-;1816:6;1869:2;1857:9;1848:7;1844:23;1840:32;1837:52;;;1885:1;1882;1875:12;1837:52;-1:-1:-1;1908:23:1;;1757:180;-1:-1:-1;1757:180:1:o;2316:127::-;2377:10;2372:3;2368:20;2365:1;2358:31;2408:4;2405:1;2398:15;2432:4;2429:1;2422:15;2448:275;2519:2;2513:9;2584:2;2565:13;;-1:-1:-1;;2561:27:1;2549:40;;-1:-1:-1;;;;;2604:34:1;;2640:22;;;2601:62;2598:88;;;2666:18;;:::i;:::-;2702:2;2695:22;2448:275;;-1:-1:-1;2448:275:1:o;2728:183::-;2788:4;-1:-1:-1;;;;;2813:6:1;2810:30;2807:56;;;2843:18;;:::i;:::-;-1:-1:-1;2888:1:1;2884:14;2900:4;2880:25;;2728:183::o;2916:737::-;2970:5;3023:3;3016:4;3008:6;3004:17;3000:27;2990:55;;3041:1;3038;3031:12;2990:55;3077:6;3064:20;3103:4;3127:60;3143:43;3183:2;3143:43;:::i;:::-;3127:60;:::i;:::-;3221:15;;;3307:1;3303:10;;;;3291:23;;3287:32;;;3252:12;;;;3331:15;;;3328:35;;;3359:1;3356;3349:12;3328:35;3395:2;3387:6;3383:15;3407:217;3423:6;3418:3;3415:15;3407:217;;;3503:3;3490:17;3520:31;3545:5;3520:31;:::i;:::-;3564:18;;3602:12;;;;3440;;3407:217;;;-1:-1:-1;3642:5:1;2916:737;-1:-1:-1;;;;;;2916:737:1:o;3658:910::-;3722:5;3775:3;3768:4;3760:6;3756:17;3752:27;3742:55;;3793:1;3790;3783:12;3742:55;3829:6;3816:20;3855:4;3879:60;3895:43;3935:2;3895:43;:::i;3879:60::-;3973:15;;;4059:1;4055:10;;;;4043:23;;4039:32;;;4004:12;;;;4083:15;;;4080:35;;;4111:1;4108;4101:12;4080:35;4147:2;4139:6;4135:15;4159:380;4175:6;4170:3;4167:15;4159:380;;;4261:3;4248:17;-1:-1:-1;;;;;4284:11:1;4281:35;4278:125;;;4357:1;4386:2;4382;4375:14;4278:125;4428:68;4492:3;4487:2;4473:11;4465:6;4461:24;4457:33;4428:68;:::i;:::-;4416:81;;-1:-1:-1;4517:12:1;;;;4192;;4159:380;;4573:630;4716:6;4724;4777:2;4765:9;4756:7;4752:23;4748:32;4745:52;;;4793:1;4790;4783:12;4745:52;4833:9;4820:23;-1:-1:-1;;;;;4903:2:1;4895:6;4892:14;4889:34;;;4919:1;4916;4909:12;4889:34;4942:61;4995:7;4986:6;4975:9;4971:22;4942:61;:::i;:::-;4932:71;;5056:2;5045:9;5041:18;5028:32;5012:48;;5085:2;5075:8;5072:16;5069:36;;;5101:1;5098;5091:12;5069:36;;5124:73;5189:7;5178:8;5167:9;5163:24;5124:73;:::i;:::-;5114:83;;;4573:630;;;;;:::o;5208:483::-;5301:6;5309;5362:2;5350:9;5341:7;5337:23;5333:32;5330:52;;;5378:1;5375;5368:12;5330:52;5418:9;5405:23;-1:-1:-1;;;;;5443:6:1;5440:30;5437:50;;;5483:1;5480;5473:12;5437:50;5506:61;5559:7;5550:6;5539:9;5535:22;5506:61;:::i;:::-;5496:71;;;5617:2;5606:9;5602:18;5589:32;5630:31;5655:5;5630:31;:::i;:::-;5680:5;5670:15;;;5208:483;;;;;:::o;5696:315::-;5764:6;5772;5825:2;5813:9;5804:7;5800:23;5796:32;5793:52;;;5841:1;5838;5831:12;5793:52;5877:9;5864:23;5854:33;;5937:2;5926:9;5922:18;5909:32;5950:31;5975:5;5950:31;:::i;6016:437::-;6102:6;6110;6163:2;6151:9;6142:7;6138:23;6134:32;6131:52;;;6179:1;6176;6169:12;6131:52;6219:9;6206:23;-1:-1:-1;;;;;6244:6:1;6241:30;6238:50;;;6284:1;6281;6274:12;6238:50;6323:70;6385:7;6376:6;6365:9;6361:22;6323:70;:::i;:::-;6412:8;;6297:96;;-1:-1:-1;6016:437:1;-1:-1:-1;;;;6016:437:1:o;6458:891::-;6542:6;6573:2;6616;6604:9;6595:7;6591:23;6587:32;6584:52;;;6632:1;6629;6622:12;6584:52;6672:9;6659:23;-1:-1:-1;;;;;6697:6:1;6694:30;6691:50;;;6737:1;6734;6727:12;6691:50;6760:22;;6813:4;6805:13;;6801:27;-1:-1:-1;6791:55:1;;6842:1;6839;6832:12;6791:55;6878:2;6865:16;6901:60;6917:43;6957:2;6917:43;:::i;6901:60::-;6995:15;;;7077:1;7073:10;;;;7065:19;;7061:28;;;7026:12;;;;7101:19;;;7098:39;;;7133:1;7130;7123:12;7098:39;7157:11;;;;7177:142;7193:6;7188:3;7185:15;7177:142;;;7259:17;;7247:30;;7210:12;;;;7297;;;;7177:142;;;7338:5;6458:891;-1:-1:-1;;;;;;;6458:891:1:o;7354:118::-;7440:5;7433:13;7426:21;7419:5;7416:32;7406:60;;7462:1;7459;7452:12;7477:241;7533:6;7586:2;7574:9;7565:7;7561:23;7557:32;7554:52;;;7602:1;7599;7592:12;7554:52;7641:9;7628:23;7660:28;7682:5;7660:28;:::i;7723:348::-;7807:6;7860:2;7848:9;7839:7;7835:23;7831:32;7828:52;;;7876:1;7873;7866:12;7828:52;7916:9;7903:23;-1:-1:-1;;;;;7941:6:1;7938:30;7935:50;;;7981:1;7978;7971:12;7935:50;8004:61;8057:7;8048:6;8037:9;8033:22;8004:61;:::i;:::-;7994:71;7723:348;-1:-1:-1;;;;7723:348:1:o;8076:248::-;8144:6;8152;8205:2;8193:9;8184:7;8180:23;8176:32;8173:52;;;8221:1;8218;8211:12;8173:52;-1:-1:-1;;8244:23:1;;;8314:2;8299:18;;;8286:32;;-1:-1:-1;8076:248:1:o;8329:698::-;8481:6;8489;8497;8550:2;8538:9;8529:7;8525:23;8521:32;8518:52;;;8566:1;8563;8556:12;8518:52;8606:9;8593:23;-1:-1:-1;;;;;8676:2:1;8668:6;8665:14;8662:34;;;8692:1;8689;8682:12;8662:34;8715:61;8768:7;8759:6;8748:9;8744:22;8715:61;:::i;:::-;8705:71;;8829:2;8818:9;8814:18;8801:32;8785:48;;8858:2;8848:8;8845:16;8842:36;;;8874:1;8871;8864:12;8842:36;;8897:73;8962:7;8951:8;8940:9;8936:24;8897:73;:::i;:::-;8887:83;;;9017:2;9006:9;9002:18;8989:32;8979:42;;8329:698;;;;;:::o;9032:841::-;9163:6;9171;9179;9187;9195;9248:2;9236:9;9227:7;9223:23;9219:32;9216:52;;;9264:1;9261;9254:12;9216:52;9300:9;9287:23;9277:33;;9361:2;9350:9;9346:18;9333:32;-1:-1:-1;;;;;9425:2:1;9417:6;9414:14;9411:34;;;9441:1;9438;9431:12;9411:34;9480:70;9542:7;9533:6;9522:9;9518:22;9480:70;:::i;:::-;9569:8;;-1:-1:-1;9454:96:1;-1:-1:-1;9657:2:1;9642:18;;9629:32;;-1:-1:-1;9673:16:1;;;9670:36;;;9702:1;9699;9692:12;9670:36;;9741:72;9805:7;9794:8;9783:9;9779:24;9741:72;:::i;:::-;9032:841;;;;-1:-1:-1;9032:841:1;;-1:-1:-1;9832:8:1;;9715:98;9032:841;-1:-1:-1;;;9032:841:1:o;9878:383::-;9955:6;9963;9971;10024:2;10012:9;10003:7;9999:23;9995:32;9992:52;;;10040:1;10037;10030:12;9992:52;10076:9;10063:23;10053:33;;10136:2;10125:9;10121:18;10108:32;10149:31;10174:5;10149:31;:::i;:::-;9878:383;;10199:5;;-1:-1:-1;;;10251:2:1;10236:18;;;;10223:32;;9878:383::o;10266:461::-;10319:3;10357:5;10351:12;10384:6;10379:3;10372:19;10410:4;10439:2;10434:3;10430:12;10423:19;;10476:2;10469:5;10465:14;10497:1;10507:195;10521:6;10518:1;10515:13;10507:195;;;10586:13;;-1:-1:-1;;;;;10582:39:1;10570:52;;10642:12;;;;10677:15;;;;10618:1;10536:9;10507:195;;;-1:-1:-1;10718:3:1;;10266:461;-1:-1:-1;;;;;10266:461:1:o;10732:261::-;10911:2;10900:9;10893:21;10874:4;10931:56;10983:2;10972:9;10968:18;10960:6;10931:56;:::i;10998:1187::-;11243:6;11251;11259;11267;11275;11328:3;11316:9;11307:7;11303:23;11299:33;11296:53;;;11345:1;11342;11335:12;11296:53;11385:9;11372:23;-1:-1:-1;;;;;11455:2:1;11447:6;11444:14;11441:34;;;11471:1;11468;11461:12;11441:34;11494:61;11547:7;11538:6;11527:9;11523:22;11494:61;:::i;:::-;11484:71;;11608:2;11597:9;11593:18;11580:32;11564:48;;11637:2;11627:8;11624:16;11621:36;;;11653:1;11650;11643:12;11621:36;11676:73;11741:7;11730:8;11719:9;11715:24;11676:73;:::i;:::-;11666:83;;11802:2;11791:9;11787:18;11774:32;11758:48;;11831:2;11821:8;11818:16;11815:36;;;11847:1;11844;11837:12;11815:36;11870:63;11925:7;11914:8;11903:9;11899:24;11870:63;:::i;:::-;11860:73;;11986:2;11975:9;11971:18;11958:32;11942:48;;12015:2;12005:8;12002:16;11999:36;;;12031:1;12028;12021:12;11999:36;;12054:73;12119:7;12108:8;12097:9;12093:24;12054:73;:::i;:::-;10998:1187;;;;-1:-1:-1;10998:1187:1;;12174:3;12159:19;12146:33;;10998:1187;-1:-1:-1;;;10998:1187:1:o;12190:671::-;12276:6;12284;12292;12300;12353:3;12341:9;12332:7;12328:23;12324:33;12321:53;;;12370:1;12367;12360:12;12321:53;12409:9;12396:23;12428:31;12453:5;12428:31;:::i;:::-;12478:5;-1:-1:-1;12535:2:1;12520:18;;12507:32;12548:33;12507:32;12548:33;:::i;:::-;12600:7;-1:-1:-1;12659:2:1;12644:18;;12631:32;12672:33;12631:32;12672:33;:::i;:::-;12724:7;-1:-1:-1;12783:2:1;12768:18;;12755:32;12796:33;12755:32;12796:33;:::i;:::-;12190:671;;;;-1:-1:-1;12190:671:1;;-1:-1:-1;;12190:671:1:o;12866:336::-;13068:2;13050:21;;;13107:2;13087:18;;;13080:30;-1:-1:-1;;;13141:2:1;13126:18;;13119:42;13193:2;13178:18;;12866:336::o;13207:127::-;13268:10;13263:3;13259:20;13256:1;13249:31;13299:4;13296:1;13289:15;13323:4;13320:1;13313:15;13339:127;13400:10;13395:3;13391:20;13388:1;13381:31;13431:4;13428:1;13421:15;13455:4;13452:1;13445:15;13471:135;13510:3;-1:-1:-1;;13531:17:1;;13528:43;;;13551:18;;:::i;:::-;-1:-1:-1;13598:1:1;13587:13;;13471:135::o;13953:358::-;-1:-1:-1;;;;;14160:32:1;;14142:51;;14229:2;14224;14209:18;;14202:30;;;-1:-1:-1;;14249:56:1;;14286:18;;14278:6;14249:56;:::i;14316:217::-;14356:1;14382;14372:132;;14426:10;14421:3;14417:20;14414:1;14407:31;14461:4;14458:1;14451:15;14489:4;14486:1;14479:15;14372:132;-1:-1:-1;14518:9:1;;14316:217::o;14538:168::-;14578:7;14644:1;14640;14636:6;14632:14;14629:1;14626:21;14621:1;14614:9;14607:17;14603:45;14600:71;;;14651:18;;:::i;:::-;-1:-1:-1;14691:9:1;;14538:168::o;15349:245::-;15416:6;15469:2;15457:9;15448:7;15444:23;15440:32;15437:52;;;15485:1;15482;15475:12;15437:52;15517:9;15511:16;15536:28;15558:5;15536:28;:::i;16294:128::-;16334:3;16365:1;16361:6;16358:1;16355:13;16352:39;;;16371:18;;:::i;:::-;-1:-1:-1;16407:9:1;;16294:128::o;16427:332::-;16629:2;16611:21;;;16668:1;16648:18;;;16641:29;-1:-1:-1;;;16701:2:1;16686:18;;16679:39;16750:2;16735:18;;16427:332::o;17107:184::-;17177:6;17230:2;17218:9;17209:7;17205:23;17201:32;17198:52;;;17246:1;17243;17236:12;17198:52;-1:-1:-1;17269:16:1;;17107:184;-1:-1:-1;17107:184:1:o;17990:332::-;18197:6;18186:9;18179:25;18240:2;18235;18224:9;18220:18;18213:30;18160:4;18260:56;18312:2;18301:9;18297:18;18289:6;18260:56;:::i;18327:245::-;18406:6;18414;18467:2;18455:9;18446:7;18442:23;18438:32;18435:52;;;18483:1;18480;18473:12;18435:52;-1:-1:-1;;18506:16:1;;18562:2;18547:18;;;18541:25;18506:16;;18541:25;;-1:-1:-1;18327:245:1:o;19956:385::-;20035:6;20043;20096:2;20084:9;20075:7;20071:23;20067:32;20064:52;;;20112:1;20109;20102:12;20064:52;20144:9;20138:16;20163:31;20188:5;20163:31;:::i;:::-;20263:2;20248:18;;20242:25;20213:5;;-1:-1:-1;20276:33:1;20242:25;20276:33;:::i;21779:251::-;21849:6;21902:2;21890:9;21881:7;21877:23;21873:32;21870:52;;;21918:1;21915;21908:12;21870:52;21950:9;21944:16;21969:31;21994:5;21969:31;:::i;22035:623::-;-1:-1:-1;;;;;22358:15:1;;;22340:34;;22410:15;;;22405:2;22390:18;;22383:43;22462:15;;22457:2;22442:18;;22435:43;22521:14;;22514:22;22509:2;22494:18;;22487:50;22320:3;22568;22553:19;;22546:32;;;22283:4;;22595:57;;22632:19;;22624:6;22595:57;:::i;22663:665::-;-1:-1:-1;;;;;23014:15:1;;;22996:34;;23066:15;;23061:2;23046:18;;23039:43;23118:3;23113:2;23098:18;;23091:31;;;22939:4;;23145:57;;23182:19;;23174:6;23145:57;:::i;:::-;23250:9;23242:6;23238:22;23233:2;23222:9;23218:18;23211:50;23278:44;23315:6;23307;23278:44;:::i;24629:125::-;24669:4;24697:1;24694;24691:8;24688:34;;;24702:18;;:::i;:::-;-1:-1:-1;24739:9:1;;24629:125::o;26990:426::-;27119:3;27157:6;27151:13;27182:1;27192:129;27206:6;27203:1;27200:13;27192:129;;;27304:4;27288:14;;;27284:25;;27278:32;27265:11;;;27258:53;27221:12;27192:129;;;27339:6;27336:1;27333:13;27330:48;;;27374:1;27365:6;27360:3;27356:16;27349:27;27330:48;-1:-1:-1;27394:16:1;;;;;26990:426;-1:-1:-1;;26990:426:1:o
Swarm Source
ipfs://4649942224feebb278f9771763e917d709d2b93592b92fffcc4f5d893fd958c8
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.