Source Code
Overview
DEV Balance
0 DEV
Token Holdings
More Info
ContractCreator:
Multichain Info
N/A
Latest 25 from a total of 25 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 6106903 | 38 days ago | IN | 0 DEV | 0.00025567 | ||||
Deposit | 6106903 | 38 days ago | IN | 0 DEV | 0.00025567 | ||||
Deposit | 6106903 | 38 days ago | IN | 0 DEV | 0.00025567 | ||||
Deposit | 6106903 | 38 days ago | IN | 0 DEV | 0.00063349 | ||||
Deposit With Per... | 6084378 | 41 days ago | IN | 0 DEV | 0.00040715 | ||||
Deposit With Per... | 6084362 | 41 days ago | IN | 0 DEV | 0.00054001 | ||||
Deposit With Per... | 6084359 | 41 days ago | IN | 0 DEV | 0.00091523 | ||||
Deposit | 6084328 | 41 days ago | IN | 0 DEV | 0.00035382 | ||||
Deposit | 4524259 | 291 days ago | IN | 0 DEV | 0.00030728 | ||||
Withdraw | 4364431 | 317 days ago | IN | 0 DEV | 0.00053446 | ||||
Withdraw | 4364422 | 317 days ago | IN | 0 DEV | 0.00039879 | ||||
Deposit | 4364321 | 317 days ago | IN | 0 DEV | 0.00032446 | ||||
Deposit | 4364321 | 317 days ago | IN | 0 DEV | 0.00025568 | ||||
Deposit | 4364320 | 317 days ago | IN | 0 DEV | 0.00050739 | ||||
Withdraw | 4350419 | 319 days ago | IN | 0 DEV | 0.00030874 | ||||
Deposit With Per... | 4350399 | 319 days ago | IN | 0 DEV | 0.00043214 | ||||
Deposit | 4350370 | 319 days ago | IN | 0 DEV | 0.00032444 | ||||
Deposit | 4350363 | 319 days ago | IN | 0 DEV | 0.00025567 | ||||
Deposit | 4350363 | 319 days ago | IN | 0 DEV | 0.00053518 | ||||
Deposit | 4350037 | 319 days ago | IN | 0 DEV | 0.00025567 | ||||
Deposit | 4350035 | 319 days ago | IN | 0 DEV | 0.00032444 | ||||
Deposit | 4350030 | 319 days ago | IN | 0 DEV | 0.00025567 | ||||
Deposit | 4350030 | 319 days ago | IN | 0 DEV | 0.00053518 | ||||
Deposit With Per... | 4251125 | 334 days ago | IN | 0 DEV | 0.00042366 | ||||
Deposit With Per... | 4251089 | 334 days ago | IN | 0 DEV | 0.00060573 |
Latest 25 internal transactions (View All)
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV | ||||
6106903 | 38 days ago | 0 DEV |
Loading...
Loading
Contract Name:
SolarDistributorV2
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at moonbase.moonscan.io on 2021-12-09 */ // Sources flattened with hardhat v2.7.0 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/utils/[email protected] /** * @dev Collection of functions related to the address type */ library Address { /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File contracts/farm/v2/libraries/IBoringERC20.sol // interface IBoringERC20 { function mint(address to, uint256 amount) external; function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); /// @notice EIP 2612 function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } // File contracts/farm/v2/rewarders/IComplexRewarder.sol // interface IComplexRewarder { function onSolarReward( uint256 pid, address user, uint256 newLpAmount ) external; function pendingTokens(uint256 pid, address user) external view returns (uint256 pending); function rewardToken() external view returns (IBoringERC20); function poolRewardsPerSec(uint256 pid) external view returns (uint256); } // File contracts/farm/v2/libraries/BoringERC20.sol // // solhint-disable avoid-low-level-calls library BoringERC20 { bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol() bytes4 private constant SIG_NAME = 0x06fdde03; // name() bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals() bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256) bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256) function returnDataToString(bytes memory data) internal pure returns (string memory) { if (data.length >= 64) { return abi.decode(data, (string)); } else if (data.length == 32) { uint8 i = 0; while (i < 32 && data[i] != 0) { i++; } bytes memory bytesArray = new bytes(i); for (i = 0; i < 32 && data[i] != 0; i++) { bytesArray[i] = data[i]; } return string(bytesArray); } else { return "???"; } } /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token symbol. function safeSymbol(IBoringERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_SYMBOL) ); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.name version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token name. function safeName(IBoringERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_NAME) ); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. /// @param token The address of the ERC-20 token contract. /// @return (uint8) Token decimals. function safeDecimals(IBoringERC20 token) internal view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_DECIMALS) ); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransfer( IBoringERC20 token, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(SIG_TRANSFER, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed" ); } /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param from Transfer tokens from. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransferFrom( IBoringERC20 token, address from, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed" ); } } // File contracts/farm/v2/ISolarPair.sol interface ISolarPair { function initialize(address, address) external; function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } // File contracts/farm/v2/SolarDistributorV2.sol contract SolarDistributorV2 is Ownable, ReentrancyGuard { using BoringERC20 for IBoringERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. uint256 rewardLockedUp; // Reward locked up. uint256 nextHarvestUntil; // When can the user harvest again. } // Info of each pool. struct PoolInfo { IBoringERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. Solar to distribute per block. uint256 lastRewardTimestamp; // Last block number that Solar distribution occurs. uint256 accSolarPerShare; // Accumulated Solar per share, times 1e18. See below. uint16 depositFeeBP; // Deposit fee in basis points uint256 harvestInterval; // Harvest interval in seconds uint256 totalLp; // Total token in Pool IComplexRewarder[] rewarders; // Array of rewarder contract for pools with incentives } IBoringERC20 public solar; // Solar tokens created per second uint256 public solarPerSec; // Max harvest interval: 14 days uint256 public constant MAXIMUM_HARVEST_INTERVAL = 14 days; // Maximum deposit fee rate: 10% uint16 public constant MAXIMUM_DEPOSIT_FEE_RATE = 1000; // Info of each pool PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The timestamp when Solar mining starts. uint256 public startTimestamp; // Total locked up rewards uint256 public totalLockedUpRewards; // Total Solar in Solar Pools (can be multiple pools) uint256 public totalSolarInPools = 0; // Team address. address public teamAddress; // Treasury address. address public treasuryAddress; // Investor address. address public investorAddress; // Percentage of pool rewards that goto the team. uint256 public teamPercent; // Percentage of pool rewards that goes to the treasury. uint256 public treasuryPercent; // Percentage of pool rewards that goes to the investor. uint256 public investorPercent; // The precision factor uint256 private immutable ACC_TOKEN_PRECISION = 1e12; modifier validatePoolByPid(uint256 _pid) { require(_pid < poolInfo.length, "Pool does not exist"); _; } event Add( uint256 indexed pid, uint256 allocPoint, IBoringERC20 indexed lpToken, uint16 depositFeeBP, uint256 harvestInterval, IComplexRewarder[] indexed rewarders ); event Set( uint256 indexed pid, uint256 allocPoint, uint16 depositFeeBP, uint256 harvestInterval, IComplexRewarder[] indexed rewarders ); event UpdatePool( uint256 indexed pid, uint256 lastRewardTimestamp, uint256 lpSupply, uint256 accSolarPerShare ); event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); event EmissionRateUpdated( address indexed caller, uint256 previousValue, uint256 newValue ); event RewardLockedUp( address indexed user, uint256 indexed pid, uint256 amountLockedUp ); event AllocPointsUpdated( address indexed caller, uint256 previousAmount, uint256 newAmount ); event SetTeamAddress( address indexed oldAddress, address indexed newAddress ); event SetTreasuryAddress( address indexed oldAddress, address indexed newAddress ); event SetInvestorAddress( address indexed oldAddress, address indexed newAddress ); event SetTeamPercent(uint256 oldPercent, uint256 newPercent); event SetTreasuryPercent(uint256 oldPercent, uint256 newPercent); event SetInvestorPercent(uint256 oldPercent, uint256 newPercent); constructor( IBoringERC20 _solar, uint256 _solarPerSec, address _teamAddress, address _treasuryAddress, address _investorAddress, uint256 _teamPercent, uint256 _treasuryPercent, uint256 _investorPercent ) { require( 0 <= _teamPercent && _teamPercent <= 1000, "constructor: invalid team percent value" ); require( 0 <= _treasuryPercent && _treasuryPercent <= 1000, "constructor: invalid treasury percent value" ); require( 0 <= _investorPercent && _investorPercent <= 1000, "constructor: invalid investor percent value" ); require( _teamPercent + _treasuryPercent + _investorPercent <= 1000, "constructor: total percent over max" ); //StartBlock always many years later from contract const ruct, will be set later in StartFarming function startTimestamp = block.timestamp + (60 * 60 * 24 * 365); solar = _solar; solarPerSec = _solarPerSec; teamAddress = _teamAddress; treasuryAddress = _treasuryAddress; investorAddress = _investorAddress; teamPercent = _teamPercent; treasuryPercent = _treasuryPercent; investorPercent = _investorPercent; } // Set farming start, can call only once function startFarming() public onlyOwner { require( block.timestamp < startTimestamp, "start farming: farm started already" ); uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { PoolInfo storage pool = poolInfo[pid]; pool.lastRewardTimestamp = block.timestamp; } startTimestamp = block.timestamp; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the owner. // Can add multiple pool with same lp token without messing up rewards, because each pool's balance is tracked using its own totalLp function add( uint256 _allocPoint, IBoringERC20 _lpToken, uint16 _depositFeeBP, uint256 _harvestInterval, IComplexRewarder[] calldata _rewarders ) public onlyOwner { require(_rewarders.length <= 10, "add: too many rewarders"); require( _depositFeeBP <= MAXIMUM_DEPOSIT_FEE_RATE, "add: deposit fee too high" ); require( _harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "add: invalid harvest interval" ); require( Address.isContract(address(_lpToken)), "add: LP token must be a valid contract" ); for ( uint256 rewarderId = 0; rewarderId < _rewarders.length; ++rewarderId ) { require( Address.isContract(address(_rewarders[rewarderId])), "add: rewarder must be contract" ); } _massUpdatePools(); uint256 lastRewardTimestamp = block.timestamp > startTimestamp ? block.timestamp : startTimestamp; totalAllocPoint += _allocPoint; poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardTimestamp: lastRewardTimestamp, accSolarPerShare: 0, depositFeeBP: _depositFeeBP, harvestInterval: _harvestInterval, totalLp: 0, rewarders: _rewarders }) ); emit Add( poolInfo.length - 1, _allocPoint, _lpToken, _depositFeeBP, _harvestInterval, _rewarders ); } // Update the given pool's Solar allocation point and deposit fee. Can only be called by the owner. function set( uint256 _pid, uint256 _allocPoint, uint16 _depositFeeBP, uint256 _harvestInterval, IComplexRewarder[] calldata _rewarders ) public onlyOwner validatePoolByPid(_pid) { require(_rewarders.length <= 10, "set: too many rewarders"); require( _depositFeeBP <= MAXIMUM_DEPOSIT_FEE_RATE, "set: deposit fee too high" ); require( _harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "set: invalid harvest interval" ); for ( uint256 rewarderId = 0; rewarderId < _rewarders.length; ++rewarderId ) { require( Address.isContract(address(_rewarders[rewarderId])), "set: rewarder must be contract" ); } _massUpdatePools(); totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint; poolInfo[_pid].allocPoint = _allocPoint; poolInfo[_pid].depositFeeBP = _depositFeeBP; poolInfo[_pid].harvestInterval = _harvestInterval; poolInfo[_pid].rewarders = _rewarders; emit Set( _pid, _allocPoint, _depositFeeBP, _harvestInterval, _rewarders ); } // View function to see pending rewards on frontend. function pendingTokens(uint256 _pid, address _user) external view validatePoolByPid(_pid) returns ( address[] memory addresses, string[] memory symbols, uint256[] memory decimals, uint256[] memory amounts ) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accSolarPerShare = pool.accSolarPerShare; uint256 lpSupply = pool.totalLp; if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 multiplier = block.timestamp - pool.lastRewardTimestamp; uint256 lpPercent = 1000 - teamPercent - treasuryPercent - investorPercent; uint256 solarReward = ((((multiplier * solarPerSec) * pool.allocPoint) / totalAllocPoint) * lpPercent) / 1000; accSolarPerShare += ( ((solarReward * ACC_TOKEN_PRECISION) / lpSupply) ); } uint256 pendingSolar = (((user.amount * accSolarPerShare) / ACC_TOKEN_PRECISION) - user.rewardDebt) + user.rewardLockedUp; addresses = new address[](pool.rewarders.length + 1); symbols = new string[](pool.rewarders.length + 1); amounts = new uint256[](pool.rewarders.length + 1); decimals = new uint256[](pool.rewarders.length + 1); addresses[0] = address(solar); symbols[0] = IBoringERC20(solar).safeSymbol(); decimals[0] = IBoringERC20(solar).safeDecimals(); amounts[0] = pendingSolar; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { addresses[rewarderId + 1] = address( pool.rewarders[rewarderId].rewardToken() ); symbols[rewarderId + 1] = IBoringERC20( pool.rewarders[rewarderId].rewardToken() ).safeSymbol(); decimals[rewarderId + 1] = IBoringERC20( pool.rewarders[rewarderId].rewardToken() ).safeDecimals(); amounts[rewarderId + 1] = pool.rewarders[rewarderId].pendingTokens( _pid, _user ); } } /// @notice View function to see pool rewards per sec function poolRewardsPerSec(uint256 _pid) external view validatePoolByPid(_pid) returns ( address[] memory addresses, string[] memory symbols, uint256[] memory decimals, uint256[] memory rewardsPerSec ) { PoolInfo storage pool = poolInfo[_pid]; addresses = new address[](pool.rewarders.length + 1); symbols = new string[](pool.rewarders.length + 1); decimals = new uint256[](pool.rewarders.length + 1); rewardsPerSec = new uint256[](pool.rewarders.length + 1); addresses[0] = address(solar); symbols[0] = IBoringERC20(solar).safeSymbol(); decimals[0] = IBoringERC20(solar).safeDecimals(); uint256 lpPercent = 1000 - teamPercent - treasuryPercent - investorPercent; rewardsPerSec[0] = (((pool.allocPoint * solarPerSec) / totalAllocPoint) * lpPercent) / 1000; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { addresses[rewarderId + 1] = address( pool.rewarders[rewarderId].rewardToken() ); symbols[rewarderId + 1] = IBoringERC20( pool.rewarders[rewarderId].rewardToken() ).safeSymbol(); decimals[rewarderId + 1] = IBoringERC20( pool.rewarders[rewarderId].rewardToken() ).safeDecimals(); rewardsPerSec[rewarderId + 1] = pool .rewarders[rewarderId] .poolRewardsPerSec(_pid); } } // View function to see rewarders for a pool function poolRewarders(uint256 _pid) external view validatePoolByPid(_pid) returns (address[] memory rewarders) { PoolInfo storage pool = poolInfo[_pid]; rewarders = new address[](pool.rewarders.length); for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { rewarders[rewarderId] = address(pool.rewarders[rewarderId]); } } // View function to see if user can harvest Solar. function canHarvest(uint256 _pid, address _user) public view validatePoolByPid(_pid) returns (bool) { UserInfo storage user = userInfo[_pid][_user]; return block.timestamp >= startTimestamp && block.timestamp >= user.nextHarvestUntil; } // Update reward vairables for all pools. Be careful of gas spending! function massUpdatePools() external nonReentrant { _massUpdatePools(); } // Internal method for massUpdatePools function _massUpdatePools() internal { for (uint256 pid = 0; pid < poolInfo.length; ++pid) { _updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) external nonReentrant { _updatePool(_pid); } // Internal method for _updatePool function _updatePool(uint256 _pid) internal validatePoolByPid(_pid) { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTimestamp) { return; } uint256 lpSupply = pool.totalLp; if (lpSupply == 0 || pool.allocPoint == 0) { pool.lastRewardTimestamp = block.timestamp; return; } uint256 multiplier = block.timestamp - pool.lastRewardTimestamp; uint256 solarReward = ((multiplier * solarPerSec) * pool.allocPoint) / totalAllocPoint; uint256 lpPercent = 1000 - teamPercent - treasuryPercent - investorPercent; solar.mint(teamAddress, (solarReward * teamPercent) / 1000); solar.mint(treasuryAddress, (solarReward * treasuryPercent) / 1000); solar.mint(investorAddress, (solarReward * investorPercent) / 1000); solar.mint(address(this), (solarReward * lpPercent) / 1000); pool.accSolarPerShare += (((solarReward * ACC_TOKEN_PRECISION) / pool.totalLp) * lpPercent) / 1000; pool.lastRewardTimestamp = block.timestamp; emit UpdatePool( _pid, pool.lastRewardTimestamp, lpSupply, pool.accSolarPerShare ); } function depositWithPermit( uint256 pid, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public nonReentrant validatePoolByPid(pid) { PoolInfo storage pool = poolInfo[pid]; ISolarPair pair = ISolarPair(address(pool.lpToken)); pair.permit(msg.sender, address(this), amount, deadline, v, r, s); _deposit(pid, amount); } // Deposit tokens for Solar allocation. function deposit(uint256 _pid, uint256 _amount) public nonReentrant { _deposit(_pid, _amount); } // Deposit tokens for Solar allocation. function _deposit(uint256 _pid, uint256 _amount) internal validatePoolByPid(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; _updatePool(_pid); payOrLockupPendingSolar(_pid); if (_amount > 0) { uint256 beforeDeposit = pool.lpToken.balanceOf(address(this)); pool.lpToken.safeTransferFrom(msg.sender, address(this), _amount); uint256 afterDeposit = pool.lpToken.balanceOf(address(this)); _amount = afterDeposit - beforeDeposit; if (pool.depositFeeBP > 0) { uint256 depositFee = (_amount * pool.depositFeeBP) / 10000; pool.lpToken.safeTransfer(treasuryAddress, depositFee); _amount = _amount - depositFee; } user.amount += _amount; if (address(pool.lpToken) == address(solar)) { totalSolarInPools += _amount; } } user.rewardDebt = (user.amount * pool.accSolarPerShare) / ACC_TOKEN_PRECISION; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { pool.rewarders[rewarderId].onSolarReward( _pid, msg.sender, user.amount ); } if (_amount > 0) { pool.totalLp += _amount; } emit Deposit(msg.sender, _pid, _amount); } //withdraw tokens function withdraw(uint256 _pid, uint256 _amount) public nonReentrant validatePoolByPid(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; //this will make sure that user can only withdraw from his pool require(user.amount >= _amount, "withdraw: user amount not enough"); //cannot withdraw more than pool's balance require(pool.totalLp >= _amount, "withdraw: pool total not enough"); _updatePool(_pid); payOrLockupPendingSolar(_pid); if (_amount > 0) { user.amount -= _amount; if (address(pool.lpToken) == address(solar)) { totalSolarInPools -= _amount; } pool.lpToken.safeTransfer(msg.sender, _amount); } user.rewardDebt = (user.amount * pool.accSolarPerShare) / ACC_TOKEN_PRECISION; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { pool.rewarders[rewarderId].onSolarReward( _pid, msg.sender, user.amount ); } if (_amount > 0) { pool.totalLp -= _amount; } emit Withdraw(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; //Cannot withdraw more than pool's balance require( pool.totalLp >= amount, "emergency withdraw: pool total not enough" ); user.amount = 0; user.rewardDebt = 0; user.rewardLockedUp = 0; user.nextHarvestUntil = 0; pool.totalLp -= amount; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { pool.rewarders[rewarderId].onSolarReward(_pid, msg.sender, 0); } if (address(pool.lpToken) == address(solar)) { totalSolarInPools -= amount; } pool.lpToken.safeTransfer(msg.sender, amount); emit EmergencyWithdraw(msg.sender, _pid, amount); } // Pay or lockup pending Solar. function payOrLockupPendingSolar(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; if (user.nextHarvestUntil == 0 && block.timestamp >= startTimestamp) { user.nextHarvestUntil = block.timestamp + pool.harvestInterval; } uint256 pending = ((user.amount * pool.accSolarPerShare) / ACC_TOKEN_PRECISION) - user.rewardDebt; if (canHarvest(_pid, msg.sender)) { if (pending > 0 || user.rewardLockedUp > 0) { uint256 pendingRewards = pending + user.rewardLockedUp; // reset lockup totalLockedUpRewards -= user.rewardLockedUp; user.rewardLockedUp = 0; user.nextHarvestUntil = block.timestamp + pool.harvestInterval; // send rewards safeSolarTransfer(msg.sender, pendingRewards); } } else if (pending > 0) { totalLockedUpRewards += pending; user.rewardLockedUp += pending; emit RewardLockedUp(msg.sender, _pid, pending); } } // Safe Solar transfer function, just in case if rounding error causes pool do not have enough Solar. function safeSolarTransfer(address _to, uint256 _amount) internal { if (solar.balanceOf(address(this)) > totalSolarInPools) { //solarBal = total Solar in SolarDistributor - total Solar in Solar pools, this will make sure that SolarDistributor never transfer rewards from deposited Solar pools uint256 solarBal = solar.balanceOf(address(this)) - totalSolarInPools; if (_amount >= solarBal) { solar.safeTransfer(_to, solarBal); } else if (_amount > 0) { solar.safeTransfer(_to, _amount); } } } function updateEmissionRate(uint256 _solarPerSec) public onlyOwner { _massUpdatePools(); emit EmissionRateUpdated(msg.sender, solarPerSec, _solarPerSec); solarPerSec = _solarPerSec; } function updateAllocPoint(uint256 _pid, uint256 _allocPoint) public onlyOwner { _massUpdatePools(); emit AllocPointsUpdated( msg.sender, poolInfo[_pid].allocPoint, _allocPoint ); totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint; poolInfo[_pid].allocPoint = _allocPoint; } function poolTotalLp(uint256 pid) external view returns (uint256) { return poolInfo[pid].totalLp; } // Function to harvest many pools in a single transaction function harvestMany(uint256[] calldata _pids) public nonReentrant { require(_pids.length <= 30, "harvest many: too many pool ids"); for (uint256 index = 0; index < _pids.length; ++index) { _deposit(_pids[index], 0); } } // Update team address by the previous team address. function setTeamAddress(address _teamAddress) public { require( msg.sender == teamAddress, "set team address: only previous team address can call this method" ); teamAddress = _teamAddress; emit SetTeamAddress(msg.sender, _teamAddress); } function setTeamPercent(uint256 _newTeamPercent) public onlyOwner { require( 0 <= _newTeamPercent && _newTeamPercent <= 1000, "set team percent: invalid percent value" ); require( treasuryPercent + _newTeamPercent + investorPercent <= 1000, "set team percent: total percent over max" ); emit SetTeamPercent(teamPercent, _newTeamPercent); teamPercent = _newTeamPercent; } // Update treasury address by the previous treasury. function setTreasuryAddress(address _treasuryAddress) public { require( msg.sender == treasuryAddress, "set treasury address: only previous treasury address can call this method" ); treasuryAddress = _treasuryAddress; emit SetTreasuryAddress(msg.sender, _treasuryAddress); } function setTreasuryPercent(uint256 _newTreasuryPercent) public onlyOwner { require( 0 <= _newTreasuryPercent && _newTreasuryPercent <= 1000, "set treasury percent: invalid percent value" ); require( teamPercent + _newTreasuryPercent + investorPercent <= 1000, "set treasury percent: total percent over max" ); emit SetTreasuryPercent(treasuryPercent, _newTreasuryPercent); treasuryPercent = _newTreasuryPercent; } // Update the investor address by the previous investor. function setInvestorAddress(address _investorAddress) public { require( msg.sender == investorAddress, "set investor address: only previous investor can call this method" ); investorAddress = _investorAddress; emit SetInvestorAddress(msg.sender, _investorAddress); } function setInvestorPercent(uint256 _newInvestorPercent) public onlyOwner { require( 0 <= _newInvestorPercent && _newInvestorPercent <= 1000, "set investor percent: invalid percent value" ); require( teamPercent + _newInvestorPercent + treasuryPercent <= 1000, "set investor percent: total percent over max" ); emit SetInvestorPercent(investorPercent, _newInvestorPercent); investorPercent = _newInvestorPercent; } }
[{"inputs":[{"internalType":"contract IBoringERC20","name":"_solar","type":"address"},{"internalType":"uint256","name":"_solarPerSec","type":"uint256"},{"internalType":"address","name":"_teamAddress","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"address","name":"_investorAddress","type":"address"},{"internalType":"uint256","name":"_teamPercent","type":"uint256"},{"internalType":"uint256","name":"_treasuryPercent","type":"uint256"},{"internalType":"uint256","name":"_investorPercent","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IBoringERC20","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"indexed":true,"internalType":"contract IComplexRewarder[]","name":"rewarders","type":"address[]"}],"name":"Add","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"AllocPointsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"EmissionRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountLockedUp","type":"uint256"}],"name":"RewardLockedUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"indexed":true,"internalType":"contract IComplexRewarder[]","name":"rewarders","type":"address[]"}],"name":"Set","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetInvestorAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"SetInvestorPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetTeamAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"SetTeamPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetTreasuryAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"SetTreasuryPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accSolarPerShare","type":"uint256"}],"name":"UpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAXIMUM_DEPOSIT_FEE_RATE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_HARVEST_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IBoringERC20","name":"_lpToken","type":"address"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"contract IComplexRewarder[]","name":"_rewarders","type":"address[]"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"canHarvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"depositWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_pids","type":"uint256[]"}],"name":"harvestMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"investorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investorPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTokens","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"string[]","name":"symbols","type":"string[]"},{"internalType":"uint256[]","name":"decimals","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBoringERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accSolarPerShare","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"internalType":"uint256","name":"totalLp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewarders","outputs":[{"internalType":"address[]","name":"rewarders","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewardsPerSec","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"string[]","name":"symbols","type":"string[]"},{"internalType":"uint256[]","name":"decimals","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardsPerSec","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"poolTotalLp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"contract IComplexRewarder[]","name":"_rewarders","type":"address[]"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_investorAddress","type":"address"}],"name":"setInvestorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newInvestorPercent","type":"uint256"}],"name":"setInvestorPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_teamAddress","type":"address"}],"name":"setTeamAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTeamPercent","type":"uint256"}],"name":"setTeamPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTreasuryPercent","type":"uint256"}],"name":"setTreasuryPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"solar","outputs":[{"internalType":"contract IBoringERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"solarPerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startFarming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedUpRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSolarInPools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"updateAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_solarPerSec","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"rewardLockedUp","type":"uint256"},{"internalType":"uint256","name":"nextHarvestUntil","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526000600681905560095564e8d4a510006080523480156200002457600080fd5b5060405162005cd638038062005cd68339810160408190526200004791620002cf565b62000052336200027f565b600180556103e8831115620000be5760405162461bcd60e51b815260206004820152602760248201527f636f6e7374727563746f723a20696e76616c6964207465616d2070657263656e604482015266742076616c756560c81b60648201526084015b60405180910390fd5b6103e8821115620001265760405162461bcd60e51b815260206004820152602b60248201527f636f6e7374727563746f723a20696e76616c696420747265617375727920706560448201526a7263656e742076616c756560a81b6064820152608401620000b5565b6103e88111156200018e5760405162461bcd60e51b815260206004820152602b60248201527f636f6e7374727563746f723a20696e76616c696420696e766573746f7220706560448201526a7263656e742076616c756560a81b6064820152608401620000b5565b6103e8816200019e84866200035e565b620001aa91906200035e565b1115620002065760405162461bcd60e51b815260206004820152602360248201527f636f6e7374727563746f723a20746f74616c2070657263656e74206f766572206044820152620dac2f60eb1b6064820152608401620000b5565b62000216426301e133806200035e565b600755600280546001600160a01b03199081166001600160a01b039a8b1617909155600397909755600a8054881696891696909617909555600b8054871694881694909417909355600c80549095169190951617909255600d92909255600e55600f556200039e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600080600080600080610100898b031215620002ed57600080fd5b8851620002fa8162000385565b60208a015160408b01519199509750620003148162000385565b60608a0151909650620003278162000385565b60808a01519095506200033a8162000385565b60a08a015160c08b015160e0909b0151999c989b5096999598909790945092505050565b600082198211156200038057634e487b7160e01b600052601160045260246000fd5b500190565b6001600160a01b03811681146200039b57600080fd5b50565b6080516158f9620003dd6000396000818161110a015281816136a7015281816136f4015281816140aa015281816141d5015261499901526158f96000f3fe608060405234801561001057600080fd5b50600436106102e95760003560e01c80636690864e11610191578063d761595c116100e3578063e6fa6d6d11610097578063eff8976b11610071578063eff8976b146106a0578063f2fde38b146106c0578063ffcd4263146106d357600080fd5b8063e6fa6d6d14610664578063e6fd48bc14610684578063eddf96521461068d57600080fd5b8063de73149d116100c8578063de73149d1461063e578063e164ac5014610648578063e2bbb1581461065157600080fd5b8063d761595c14610622578063dc640ac91461062b57600080fd5b80638da5cb5b116101455780639a26c2fa1161011f5780639a26c2fa146105f1578063afbcfea1146105fa578063c5f956af1461060257600080fd5b80638da5cb5b1461056057806393f1a40b1461057e578063949e6302146105de57600080fd5b8063812c64f111610176578063812c64f11461051e578063876d3c9c1461053a57806389a2bc251461054d57600080fd5b80636690864e14610503578063715018a61461051657600080fd5b806342602f1e1161024a578063515bc323116101fe578063630b5ba1116101d8578063630b5ba1146104d5578063654c9ece146104dd5780636605bfda146104f057600080fd5b8063515bc3231461049c57806351eb05a6146104af5780635312ea8e146104c257600080fd5b8063465e81ec1161022f578063465e81ec1461045d578063474fa63014610480578063508593ab1461048957600080fd5b806342602f1e14610437578063441a3e701461044a57600080fd5b80631526fe27116102a15780631c75f085116102865780631c75f085146103e15780632081ccc4146104015780632e6c998d1461041457600080fd5b80631526fe271461037557806317caf6f1146103d857600080fd5b8063081e3eda116102d2578063081e3eda146103135780630ba84cd21461031b57806312e228fd1461033057600080fd5b806304ef9d58146102ee5780630735b2081461030a575b600080fd5b6102f7600e5481565b6040519081526020015b60405180910390f35b6102f7600f5481565b6004546102f7565b61032e610329366004615377565b6106e6565b005b600c546103509073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610301565b610388610383366004615377565b6107b7565b6040805173ffffffffffffffffffffffffffffffffffffffff9098168852602088019690965294860193909352606085019190915261ffff16608084015260a083015260c082015260e001610301565b6102f760065481565b600a546103509073ffffffffffffffffffffffffffffffffffffffff1681565b61032e61040f366004615475565b610821565b6104276104223660046153a9565b610c7f565b6040519015158152602001610301565b61032e61044536600461520e565b610d3d565b61032e610458366004615453565b610e7b565b61047061046b366004615377565b611277565b6040516103019493929190615614565b6102f760085481565b61032e6104973660046153d9565b6119df565b61032e6104aa3660046154a5565b611f04565b61032e6104bd366004615377565b6120d1565b61032e6104d0366004615377565b612153565b61032e612440565b6102f76104eb366004615377565b6124c0565b61032e6104fe36600461520e565b6124ee565b61032e61051136600461520e565b61262c565b61032e61276a565b6105276103e881565b60405161ffff9091168152602001610301565b61032e610548366004615377565b6127f7565b61032e61055b366004615377565b6129f7565b60005473ffffffffffffffffffffffffffffffffffffffff16610350565b6105be61058c3660046153a9565b600560209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610301565b61032e6105ec366004615377565b612bf7565b6102f760035481565b61032e612df7565b600b546103509073ffffffffffffffffffffffffffffffffffffffff1681565b6102f760095481565b61032e61063936600461522b565b612f5f565b6102f76212750081565b6102f7600d5481565b61032e61065f366004615453565b613083565b6002546103509073ffffffffffffffffffffffffffffffffffffffff1681565b6102f760075481565b61032e61069b366004615453565b613107565b6106b36106ae366004615377565b61327d565b6040516103019190615601565b61032e6106ce36600461520e565b6133fc565b6104706106e13660046153a9565b61352c565b60005473ffffffffffffffffffffffffffffffffffffffff16331461076c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610774613c33565b600354604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2600355565b600481815481106107c757600080fd5b6000918252602090912060089091020180546001820154600283015460038401546004850154600586015460069096015473ffffffffffffffffffffffffffffffffffffffff909516965092949193909261ffff16919087565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6004548690811061090f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600a82111561097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7365743a20746f6f206d616e79207265776172646572730000000000000000006044820152606401610763565b6103e861ffff861611156109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f7365743a206465706f7369742066656520746f6f2068696768000000000000006044820152606401610763565b62127500841115610a57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610763565b60005b82811015610b0857610a92848483818110610a7757610a77615834565b9050602002016020810190610a8c919061520e565b3b151590565b610af8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7365743a207265776172646572206d75737420626520636f6e747261637400006044820152606401610763565b610b01816157ac565b9050610a5a565b50610b11613c33565b8560048881548110610b2557610b25615834565b906000526020600020906008020160010154600654610b449190615769565b610b4e91906156d9565b6006819055508560048881548110610b6857610b68615834565b9060005260206000209060080201600101819055508460048881548110610b9157610b91615834565b906000526020600020906008020160040160006101000a81548161ffff021916908361ffff1602179055508360048881548110610bd057610bd0615834565b906000526020600020906008020160050181905550828260048981548110610bfa57610bfa615834565b90600052602060002090600802016007019190610c18929190615099565b508282604051610c29929190615596565b6040805191829003822088835261ffff881660208401529082018690529088907f5ed6f0deef9ab49d02900b40d596df4cd637a2a7fbfa56bbcb377389d3ce8d289060600160405180910390a350505050505050565b60045460009083908110610cef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600084815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290206007544210801590610d34575080600301544210155b95945050505050565b600c5473ffffffffffffffffffffffffffffffffffffffff163314610e0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f73657420696e766573746f7220616464726573733a206f6e6c7920707265766960448201527f6f757320696e766573746f722063616e2063616c6c2074686973206d6574686f60648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a401610763565b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f6260cb34f06b782e83bde168f7d74ab2133041cb53b63ce22b127822a92b679190600090a350565b60026001541415610ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b600260015560045482908110610f5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048481548110610f6f57610f6f615834565b600091825260208083208784526005825260408085203386529092529220805460089092029092019250841115611002576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f77697468647261773a207573657220616d6f756e74206e6f7420656e6f7567686044820152606401610763565b8382600601541015611070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f77697468647261773a20706f6f6c20746f74616c206e6f7420656e6f756768006044820152606401610763565b61107985613c59565b61108285614161565b8315611101578381600001600082825461109c9190615769565b9091555050600254825473ffffffffffffffffffffffffffffffffffffffff908116911614156110de5783600960008282546110d89190615769565b90915550505b81546111019073ffffffffffffffffffffffffffffffffffffffff163386614316565b600382015481547f0000000000000000000000000000000000000000000000000000000000000000916111339161572c565b61113d91906156f1565b600182015560005b60078301548110156112145782600701818154811061116657611166615834565b60009182526020909120015482546040517ffe8343fb00000000000000000000000000000000000000000000000000000000815260048101899052336024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff9091169063fe8343fb90606401600060405180830381600087803b1580156111eb57600080fd5b505af11580156111ff573d6000803e3d6000fd5b505050508061120d906157ac565b9050611145565b508315611235578382600601600082825461122f9190615769565b90915550505b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a3505060018055505050565b6060806060808460048054905081106112ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b60006004878154811061130157611301615834565b906000526020600020906008020190508060070180549050600161132591906156d9565b67ffffffffffffffff81111561133d5761133d615863565b604051908082528060200260200182016040528015611366578160200160208202803683370190505b50600782015490965061137a9060016156d9565b67ffffffffffffffff81111561139257611392615863565b6040519080825280602002602001820160405280156113c557816020015b60608152602001906001900390816113b05790505b5060078201549095506113d99060016156d9565b67ffffffffffffffff8111156113f1576113f1615863565b60405190808252806020026020018201604052801561141a578160200160208202803683370190505b50600782015490945061142e9060016156d9565b67ffffffffffffffff81111561144657611446615863565b60405190808252806020026020018201604052801561146f578160200160208202803683370190505b50600254875191945073ffffffffffffffffffffffffffffffffffffffff169087906000906114a0576114a0615834565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526002546114d09116614486565b856000815181106114e3576114e3615834565b60209081029190910101526002546115109073ffffffffffffffffffffffffffffffffffffffff1661459e565b60ff168460008151811061152657611526615834565b6020026020010181815250506000600f54600e54600d546103e861154a9190615769565b6115549190615769565b61155e9190615769565b90506103e8816006546003548560010154611579919061572c565b61158391906156f1565b61158d919061572c565b61159791906156f1565b846000815181106115aa576115aa615834565b60200260200101818152505060005b60078301548110156119d4578260070181815481106115da576115da615834565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b15801561164957600080fd5b505afa15801561165d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611681919061528f565b8861168d8360016156d9565b8151811061169d5761169d615834565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506117b18360070182815481106116ef576116ef615834565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b15801561175e57600080fd5b505afa158015611772573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611796919061528f565b73ffffffffffffffffffffffffffffffffffffffff16614486565b876117bd8360016156d9565b815181106117cd576117cd615834565b60200260200101819052506118b28360070182815481106117f0576117f0615834565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b15801561185f57600080fd5b505afa158015611873573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611897919061528f565b73ffffffffffffffffffffffffffffffffffffffff1661459e565b60ff16866118c18360016156d9565b815181106118d1576118d1615834565b6020026020010181815250508260070181815481106118f2576118f2615834565b6000918252602090912001546040517f465e81ec000000000000000000000000000000000000000000000000000000008152600481018b905273ffffffffffffffffffffffffffffffffffffffff9091169063465e81ec9060240160206040518083038186803b15801561196557600080fd5b505afa158015611979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199d9190615390565b856119a98360016156d9565b815181106119b9576119b9615834565b60209081029190910101526119cd816157ac565b90506115b9565b505050509193509193565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b600a811115611acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6164643a20746f6f206d616e79207265776172646572730000000000000000006044820152606401610763565b6103e861ffff85161115611b3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6164643a206465706f7369742066656520746f6f2068696768000000000000006044820152606401610763565b62127500831115611ba8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610763565b843b611c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610763565b60005b81811015611ccc57611c56838383818110610a7757610a77615834565b611cbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f6164643a207265776172646572206d75737420626520636f6e747261637400006044820152606401610763565b611cc5816157ac565b9050611c39565b50611cd5613c33565b60006007544211611ce857600754611cea565b425b90508660066000828254611cfe91906156d9565b9250508190555060046040518061010001604052808873ffffffffffffffffffffffffffffffffffffffff168152602001898152602001838152602001600081526020018761ffff168152602001868152602001600081526020018585808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250939094525050835460018082018655948252602091829020845160089092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911781558382015194810194909455604083015160028501556060830151600385015560808301516004850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff90921691909117905560a0830151600585015560c0830151600685015560e08301518051939493611e74935060078501929190910190615121565b5050508282604051611e87929190615596565b60405190819003902060045473ffffffffffffffffffffffffffffffffffffffff881690611eb790600190615769565b604080518b815261ffff8a1660208201529081018890527f5ed295c4f5af5aeb1ccd905e1cd55a86ab3bb9fc1fe2346ff64ac47dbef366619060600160405180910390a450505050505050565b60026001541415611f71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b600260015560045486908110611fe3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048881548110611ff857611ff8615834565b6000918252602090912060089091020180546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018a90526064810189905260ff8816608482015260a4810187905260c4810186905291925073ffffffffffffffffffffffffffffffffffffffff1690819063d505accf9060e401600060405180830381600087803b1580156120a057600080fd5b505af11580156120b4573d6000803e3d6000fd5b505050506120c28989614691565b50506001805550505050505050565b6002600154141561213e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b600260015561214c81613c59565b5060018055565b600260015414156121c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b60026001819055506000600482815481106121dd576121dd615834565b6000918252602080832085845260058252604080852033865290925292208054600892909202909201600681015490935081111561229d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f656d657267656e63792077697468647261773a20706f6f6c20746f74616c206e60448201527f6f7420656e6f75676800000000000000000000000000000000000000000000006064820152608401610763565b60008083556001830181905560028301819055600383018190556006840180548392906122cb908490615769565b90915550600090505b600784015481101561239e578360070181815481106122f5576122f5615834565b60009182526020822001546040517ffe8343fb00000000000000000000000000000000000000000000000000000000815260048101889052336024820152604481019290925273ffffffffffffffffffffffffffffffffffffffff169063fe8343fb90606401600060405180830381600087803b15801561237557600080fd5b505af1158015612389573d6000803e3d6000fd5b5050505080612397906157ac565b90506122d4565b50600254835473ffffffffffffffffffffffffffffffffffffffff908116911614156123dc5780600960008282546123d69190615769565b90915550505b82546123ff9073ffffffffffffffffffffffffffffffffffffffff163383614316565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a35050600180555050565b600260015414156124ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b60026001556124ba613c33565b60018055565b6000600482815481106124d5576124d5615834565b9060005260206000209060080201600601549050919050565b600b5473ffffffffffffffffffffffffffffffffffffffff1633146125bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f73657420747265617375727920616464726573733a206f6e6c7920707265766960448201527f6f757320747265617375727920616464726573732063616e2063616c6c20746860648201527f6973206d6574686f640000000000000000000000000000000000000000000000608482015260a401610763565b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f61885cdba916be748ff3e3f6f15e4206153b8ea3b7acabade9d04b4063a8351090600090a350565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146126f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f736574207465616d20616464726573733a206f6e6c792070726576696f75732060448201527f7465616d20616464726573732063616e2063616c6c2074686973206d6574686f60648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a401610763565b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f42fbc17d847fdc3e5c82da842a5ef3979c64f3b94cd4e7382310fd5525c6ee0f90600090a350565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6127f56000614b02565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314612878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6103e881111561290a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f73657420696e766573746f722070657263656e743a20696e76616c696420706560448201527f7263656e742076616c75650000000000000000000000000000000000000000006064820152608401610763565b6103e8600e5482600d5461291e91906156d9565b61292891906156d9565b11156129b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f73657420696e766573746f722070657263656e743a20746f74616c207065726360448201527f656e74206f766572206d617800000000000000000000000000000000000000006064820152608401610763565b600f5460408051918252602082018390527f905b464403a98b455243c8b4d30c545b8fbd70cda670142b9326425b2c039f3b910160405180910390a1600f55565b60005473ffffffffffffffffffffffffffffffffffffffff163314612a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6103e8811115612b0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f7365742074726561737572792070657263656e743a20696e76616c696420706560448201527f7263656e742076616c75650000000000000000000000000000000000000000006064820152608401610763565b6103e8600f5482600d54612b1e91906156d9565b612b2891906156d9565b1115612bb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f7365742074726561737572792070657263656e743a20746f74616c207065726360448201527f656e74206f766572206d617800000000000000000000000000000000000000006064820152608401610763565b600e5460408051918252602082018390527fa565895c0101fca10e6a7b85742e56cf52ac5f58b09ce030425d3555b47069fd910160405180910390a1600e55565b60005473ffffffffffffffffffffffffffffffffffffffff163314612c78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6103e8811115612d0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f736574207465616d2070657263656e743a20696e76616c69642070657263656e60448201527f742076616c7565000000000000000000000000000000000000000000000000006064820152608401610763565b6103e8600f5482600e54612d1e91906156d9565b612d2891906156d9565b1115612db6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f736574207465616d2070657263656e743a20746f74616c2070657263656e742060448201527f6f766572206d61780000000000000000000000000000000000000000000000006064820152608401610763565b600d5460408051918252602082018390527f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6910160405180910390a1600d55565b60005473ffffffffffffffffffffffffffffffffffffffff163314612e78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6007544210612f09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f7374617274206661726d696e673a206661726d207374617274656420616c726560448201527f61647900000000000000000000000000000000000000000000000000000000006064820152608401610763565b60045460005b81811015612f5757600060048281548110612f2c57612f2c615834565b906000526020600020906008020190504281600201819055505080612f50906157ac565b9050612f0f565b505042600755565b60026001541415612fcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b6002600155601e81111561303c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f68617276657374206d616e793a20746f6f206d616e7920706f6f6c20696473006044820152606401610763565b60005b8181101561307a5761306a83838381811061305c5761305c615834565b905060200201356000614691565b613073816157ac565b905061303f565b50506001805550565b600260015414156130f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b60026001556130ff8282614691565b505060018055565b60005473ffffffffffffffffffffffffffffffffffffffff163314613188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b613190613c33565b3373ffffffffffffffffffffffffffffffffffffffff167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef3600484815481106131db576131db615834565b90600052602060002090600802016001015483604051613205929190918252602082015260400190565b60405180910390a2806004838154811061322157613221615834565b9060005260206000209060080201600101546006546132409190615769565b61324a91906156d9565b600681905550806004838154811061326457613264615834565b9060005260206000209060080201600101819055505050565b600454606090829081106132ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b60006004848154811061330257613302615834565b90600052602060002090600802019050806007018054905067ffffffffffffffff81111561333257613332615863565b60405190808252806020026020018201604052801561335b578160200160208202803683370190505b50925060005b60078201548110156133f45781600701818154811061338257613382615834565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168482815181106133bf576133bf615834565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526133ed816157ac565b9050613361565b505050919050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461347d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b73ffffffffffffffffffffffffffffffffffffffff8116613520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610763565b61352981614b02565b50565b6060806060808560048054905081106135a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b6000600488815481106135b6576135b6615834565b600091825260208083208b845260058252604080852073ffffffffffffffffffffffffffffffffffffffff8d168652909252922060036008909202909201908101546006820154600283015492945090914211801561361457508015155b156136e657600084600201544261362b9190615769565b90506000600f54600e54600d546103e86136459190615769565b61364f9190615769565b6136599190615769565b905060006103e882600654896001015460035487613677919061572c565b613681919061572c565b61368b91906156f1565b613695919061572c565b61369f91906156f1565b9050836136cc7f00000000000000000000000000000000000000000000000000000000000000008361572c565b6136d691906156f1565b6136e090866156d9565b94505050505b6000836002015484600101547f0000000000000000000000000000000000000000000000000000000000000000858760000154613723919061572c565b61372d91906156f1565b6137379190615769565b61374191906156d9565b60078601549091506137549060016156d9565b67ffffffffffffffff81111561376c5761376c615863565b604051908082528060200260200182016040528015613795578160200160208202803683370190505b506007860154909a506137a99060016156d9565b67ffffffffffffffff8111156137c1576137c1615863565b6040519080825280602002602001820160405280156137f457816020015b60608152602001906001900390816137df5790505b5060078601549099506138089060016156d9565b67ffffffffffffffff81111561382057613820615863565b604051908082528060200260200182016040528015613849578160200160208202803683370190505b50600786015490975061385d9060016156d9565b67ffffffffffffffff81111561387557613875615863565b60405190808252806020026020018201604052801561389e578160200160208202803683370190505b506002548b5191995073ffffffffffffffffffffffffffffffffffffffff16908b906000906138cf576138cf615834565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526002546138ff9116614486565b8960008151811061391257613912615834565b602090810291909101015260025461393f9073ffffffffffffffffffffffffffffffffffffffff1661459e565b60ff168860008151811061395557613955615834565b602002602001018181525050808760008151811061397557613975615834565b60200260200101818152505060005b6007860154811015613c23578560070181815481106139a5576139a5615834565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b158015613a1457600080fd5b505afa158015613a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a4c919061528f565b8b613a588360016156d9565b81518110613a6857613a68615834565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613aba8660070182815481106116ef576116ef615834565b8a613ac68360016156d9565b81518110613ad657613ad6615834565b6020026020010181905250613af98660070182815481106117f0576117f0615834565b60ff1689613b088360016156d9565b81518110613b1857613b18615834565b602002602001018181525050856007018181548110613b3957613b39615834565b6000918252602090912001546040517fffcd4263000000000000000000000000000000000000000000000000000000008152600481018f905273ffffffffffffffffffffffffffffffffffffffff8e811660248301529091169063ffcd42639060440160206040518083038186803b158015613bb457600080fd5b505afa158015613bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bec9190615390565b88613bf88360016156d9565b81518110613c0857613c08615834565b6020908102919091010152613c1c816157ac565b9050613984565b5050505050505092959194509250565b60005b60045481101561352957613c4981613c59565b613c52816157ac565b9050613c36565b60045481908110613cc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048381548110613cdb57613cdb615834565b9060005260206000209060080201905080600201544211613cfb57505050565b6006810154801580613d0f57506001820154155b15613d205750426002909101555050565b6000826002015442613d329190615769565b90506000600654846001015460035484613d4c919061572c565b613d56919061572c565b613d6091906156f1565b90506000600f54600e54600d546103e8613d7a9190615769565b613d849190615769565b613d8e9190615769565b600254600a54600d5492935073ffffffffffffffffffffffffffffffffffffffff918216926340c10f1992909116906103e890613dcb908761572c565b613dd591906156f1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613e4057600080fd5b505af1158015613e54573d6000803e3d6000fd5b5050600254600b54600e5473ffffffffffffffffffffffffffffffffffffffff92831694506340c10f1993509116906103e890613e91908761572c565b613e9b91906156f1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613f0657600080fd5b505af1158015613f1a573d6000803e3d6000fd5b5050600254600c54600f5473ffffffffffffffffffffffffffffffffffffffff92831694506340c10f1993509116906103e890613f57908761572c565b613f6191906156f1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613fcc57600080fd5b505af1158015613fe0573d6000803e3d6000fd5b505060025473ffffffffffffffffffffffffffffffffffffffff1691506340c10f199050306103e8614012858761572c565b61401c91906156f1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b15801561408757600080fd5b505af115801561409b573d6000803e3d6000fd5b505050506103e88186600601547f0000000000000000000000000000000000000000000000000000000000000000856140d4919061572c565b6140de91906156f1565b6140e8919061572c565b6140f291906156f1565b85600301600082825461410591906156d9565b909155505042600286018190556003860154604080519283526020830187905282015287907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469060600160405180910390a250505050505b5050565b60006004828154811061417657614176615834565b6000918252602080832085845260058252604080852033865290925292206003810154600890920290920192501580156141b257506007544210155b156141cc5760058201546141c690426156d9565b60038201555b600081600101547f000000000000000000000000000000000000000000000000000000000000000084600301548460000154614208919061572c565b61421291906156f1565b61421c9190615769565b90506142288433610c7f565b156142a0576000811180614240575060008260020154115b1561429b57600082600201548261425791906156d9565b905082600201546008600082825461426f9190615769565b909155505060006002840155600584015461428a90426156d9565b60038401556142993382614b77565b505b614310565b80156143105780600860008282546142b891906156d9565b92505081905550808260020160008282546142d391906156d9565b9091555050604051818152849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c19060200160405180910390a35b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916143ad91906155e5565b6000604051808303816000865af19150503d80600081146143ea576040519150601f19603f3d011682016040523d82523d6000602084013e6143ef565b606091505b5091509150818015614419575080511580614419575080806020019051810190614419919061526d565b61447f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c6564000000006044820152606401610763565b5050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161450891906155e5565b600060405180830381855afa9150503d8060008114614543576040519150601f19603f3d011682016040523d82523d6000602084013e614548565b606091505b50915091508161458d576040518060400160405280600381526020017f3f3f3f0000000000000000000000000000000000000000000000000000000000815250614596565b61459681614d2d565b949350505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169161461f91906155e5565b600060405180830381855afa9150503d806000811461465a576040519150601f19603f3d011682016040523d82523d6000602084013e61465f565b606091505b5091509150818015614672575080516020145b61467d576012614596565b8080602001905181019061459691906154f8565b600454829081106146fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b60006004848154811061471357614713615834565b6000918252602080832087845260058252604080852033865290925292206008909102909101915061474485613c59565b61474d85614161565b83156149905781546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156147bc57600080fd5b505afa1580156147d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147f49190615390565b835490915061481b9073ffffffffffffffffffffffffffffffffffffffff16333088614f20565b82546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561488457600080fd5b505afa158015614898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148bc9190615390565b90506148c88282615769565b600485015490965061ffff1615614937576004840154600090612710906148f39061ffff168961572c565b6148fd91906156f1565b600b5486549192506149299173ffffffffffffffffffffffffffffffffffffffff908116911683614316565b6149338188615769565b9650505b8583600001600082825461494b91906156d9565b9091555050600254845473ffffffffffffffffffffffffffffffffffffffff9081169116141561498d57856009600082825461498791906156d9565b90915550505b50505b600382015481547f0000000000000000000000000000000000000000000000000000000000000000916149c29161572c565b6149cc91906156f1565b600182015560005b6007830154811015614aa3578260070181815481106149f5576149f5615834565b60009182526020909120015482546040517ffe8343fb00000000000000000000000000000000000000000000000000000000815260048101899052336024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff9091169063fe8343fb90606401600060405180830381600087803b158015614a7a57600080fd5b505af1158015614a8e573d6000803e3d6000fd5b5050505080614a9c906157ac565b90506149d4565b508315614ac45783826006016000828254614abe91906156d9565b90915550505b604051848152859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a35050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6009546002546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b158015614be357600080fd5b505afa158015614bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c1b9190615390565b111561415d576009546002546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000929173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015614c8f57600080fd5b505afa158015614ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cc79190615390565b614cd19190615769565b9050808210614d0357600254614cfe9073ffffffffffffffffffffffffffffffffffffffff168483614316565b505050565b8115614cfe57600254614cfe9073ffffffffffffffffffffffffffffffffffffffff168484614316565b60606040825110614d525781806020019051810190614d4c91906152ac565b92915050565b815160201415614ee25760005b60208160ff16108015614dac5750828160ff1681518110614d8257614d82615834565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15614dc35780614dbb816157e5565b915050614d5f565b60008160ff1667ffffffffffffffff811115614de157614de1615863565b6040519080825280601f01601f191660200182016040528015614e0b576020820181803683370190505b509050600091505b60208260ff16108015614e605750838260ff1681518110614e3657614e36615834565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15614edb57838260ff1681518110614e7a57614e7a615834565b602001015160f81c60f81b818360ff1681518110614e9a57614e9a615834565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081614ed3816157e5565b925050614e13565b9392505050565b505060408051808201909152600381527f3f3f3f0000000000000000000000000000000000000000000000000000000000602082015290565b919050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691614fbf91906155e5565b6000604051808303816000865af19150503d8060008114614ffc576040519150601f19603f3d011682016040523d82523d6000602084013e615001565b606091505b509150915081801561502b57508051158061502b57508080602001905181019061502b919061526d565b615091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646044820152606401610763565b505050505050565b828054828255906000526020600020908101928215615111579160200282015b828111156151115781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8435161782556020909201916001909101906150b9565b5061511d92915061519b565b5090565b828054828255906000526020600020908101928215615111579160200282015b8281111561511157825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190615141565b5b8082111561511d576000815560010161519c565b60008083601f8401126151c257600080fd5b50813567ffffffffffffffff8111156151da57600080fd5b6020830191508360208260051b85010111156151f557600080fd5b9250929050565b803561ffff81168114614f1b57600080fd5b60006020828403121561522057600080fd5b8135614edb81615892565b6000806020838503121561523e57600080fd5b823567ffffffffffffffff81111561525557600080fd5b615261858286016151b0565b90969095509350505050565b60006020828403121561527f57600080fd5b81518015158114614edb57600080fd5b6000602082840312156152a157600080fd5b8151614edb81615892565b6000602082840312156152be57600080fd5b815167ffffffffffffffff808211156152d657600080fd5b818401915084601f8301126152ea57600080fd5b8151818111156152fc576152fc615863565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561534257615342615863565b8160405282815287602084870101111561535b57600080fd5b61536c836020830160208801615780565b979650505050505050565b60006020828403121561538957600080fd5b5035919050565b6000602082840312156153a257600080fd5b5051919050565b600080604083850312156153bc57600080fd5b8235915060208301356153ce81615892565b809150509250929050565b60008060008060008060a087890312156153f257600080fd5b86359550602087013561540481615892565b9450615412604088016151fc565b935060608701359250608087013567ffffffffffffffff81111561543557600080fd5b61544189828a016151b0565b979a9699509497509295939492505050565b6000806040838503121561546657600080fd5b50508035926020909101359150565b60008060008060008060a0878903121561548e57600080fd5b8635955060208701359450615412604088016151fc565b60008060008060008060c087890312156154be57600080fd5b86359550602087013594506040870135935060608701356154de816158b4565b9598949750929560808101359460a0909101359350915050565b60006020828403121561550a57600080fd5b8151614edb816158b4565b600081518084526020808501945080840160005b8381101561555b57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101615529565b509495945050505050565b600081518084526020808501945080840160005b8381101561555b5781518752958201959082019060010161557a565b60008184825b858110156155da5781356155af81615892565b73ffffffffffffffffffffffffffffffffffffffff168352602092830192919091019060010161559c565b509095945050505050565b600082516155f7818460208701615780565b9190910192915050565b602081526000614edb6020830184615515565b6080815260006156276080830187615515565b6020838203818501528187518084528284019150828160051b850101838a0160005b838110156156ad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808885030186528251805180865261568f818a88018b8501615780565b96880196601f01909116939093018601925090850190600101615649565b505086810360408801526156c1818a615566565b945050505050828103606084015261536c8185615566565b600082198211156156ec576156ec615805565b500190565b600082615727577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561576457615764615805565b500290565b60008282101561577b5761577b615805565b500390565b60005b8381101561579b578181015183820152602001615783565b838111156143105750506000910152565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156157de576157de615805565b5060010190565b600060ff821660ff8114156157fc576157fc615805565b60010192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461352957600080fd5b60ff8116811461352957600080fdfea26469706673582212206c72d31bca8a003d2d27cfd92bf840e1e233fe8f9b3e35dd554947ab2669a0e164736f6c63430008070033000000000000000000000000744eb7c95ece05b849e84c45a3574e943eef665b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ead8220873fdb206ed458bd5dfb8eb3985ef230a000000000000000000000000a6fd062fc0c8e06a439f1dc6299872bf653cec06000000000000000000000000654a8fb01c955f6036f8f8b3e84c28e659385d68000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102e95760003560e01c80636690864e11610191578063d761595c116100e3578063e6fa6d6d11610097578063eff8976b11610071578063eff8976b146106a0578063f2fde38b146106c0578063ffcd4263146106d357600080fd5b8063e6fa6d6d14610664578063e6fd48bc14610684578063eddf96521461068d57600080fd5b8063de73149d116100c8578063de73149d1461063e578063e164ac5014610648578063e2bbb1581461065157600080fd5b8063d761595c14610622578063dc640ac91461062b57600080fd5b80638da5cb5b116101455780639a26c2fa1161011f5780639a26c2fa146105f1578063afbcfea1146105fa578063c5f956af1461060257600080fd5b80638da5cb5b1461056057806393f1a40b1461057e578063949e6302146105de57600080fd5b8063812c64f111610176578063812c64f11461051e578063876d3c9c1461053a57806389a2bc251461054d57600080fd5b80636690864e14610503578063715018a61461051657600080fd5b806342602f1e1161024a578063515bc323116101fe578063630b5ba1116101d8578063630b5ba1146104d5578063654c9ece146104dd5780636605bfda146104f057600080fd5b8063515bc3231461049c57806351eb05a6146104af5780635312ea8e146104c257600080fd5b8063465e81ec1161022f578063465e81ec1461045d578063474fa63014610480578063508593ab1461048957600080fd5b806342602f1e14610437578063441a3e701461044a57600080fd5b80631526fe27116102a15780631c75f085116102865780631c75f085146103e15780632081ccc4146104015780632e6c998d1461041457600080fd5b80631526fe271461037557806317caf6f1146103d857600080fd5b8063081e3eda116102d2578063081e3eda146103135780630ba84cd21461031b57806312e228fd1461033057600080fd5b806304ef9d58146102ee5780630735b2081461030a575b600080fd5b6102f7600e5481565b6040519081526020015b60405180910390f35b6102f7600f5481565b6004546102f7565b61032e610329366004615377565b6106e6565b005b600c546103509073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610301565b610388610383366004615377565b6107b7565b6040805173ffffffffffffffffffffffffffffffffffffffff9098168852602088019690965294860193909352606085019190915261ffff16608084015260a083015260c082015260e001610301565b6102f760065481565b600a546103509073ffffffffffffffffffffffffffffffffffffffff1681565b61032e61040f366004615475565b610821565b6104276104223660046153a9565b610c7f565b6040519015158152602001610301565b61032e61044536600461520e565b610d3d565b61032e610458366004615453565b610e7b565b61047061046b366004615377565b611277565b6040516103019493929190615614565b6102f760085481565b61032e6104973660046153d9565b6119df565b61032e6104aa3660046154a5565b611f04565b61032e6104bd366004615377565b6120d1565b61032e6104d0366004615377565b612153565b61032e612440565b6102f76104eb366004615377565b6124c0565b61032e6104fe36600461520e565b6124ee565b61032e61051136600461520e565b61262c565b61032e61276a565b6105276103e881565b60405161ffff9091168152602001610301565b61032e610548366004615377565b6127f7565b61032e61055b366004615377565b6129f7565b60005473ffffffffffffffffffffffffffffffffffffffff16610350565b6105be61058c3660046153a9565b600560209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610301565b61032e6105ec366004615377565b612bf7565b6102f760035481565b61032e612df7565b600b546103509073ffffffffffffffffffffffffffffffffffffffff1681565b6102f760095481565b61032e61063936600461522b565b612f5f565b6102f76212750081565b6102f7600d5481565b61032e61065f366004615453565b613083565b6002546103509073ffffffffffffffffffffffffffffffffffffffff1681565b6102f760075481565b61032e61069b366004615453565b613107565b6106b36106ae366004615377565b61327d565b6040516103019190615601565b61032e6106ce36600461520e565b6133fc565b6104706106e13660046153a9565b61352c565b60005473ffffffffffffffffffffffffffffffffffffffff16331461076c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610774613c33565b600354604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2600355565b600481815481106107c757600080fd5b6000918252602090912060089091020180546001820154600283015460038401546004850154600586015460069096015473ffffffffffffffffffffffffffffffffffffffff909516965092949193909261ffff16919087565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6004548690811061090f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600a82111561097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7365743a20746f6f206d616e79207265776172646572730000000000000000006044820152606401610763565b6103e861ffff861611156109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f7365743a206465706f7369742066656520746f6f2068696768000000000000006044820152606401610763565b62127500841115610a57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610763565b60005b82811015610b0857610a92848483818110610a7757610a77615834565b9050602002016020810190610a8c919061520e565b3b151590565b610af8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7365743a207265776172646572206d75737420626520636f6e747261637400006044820152606401610763565b610b01816157ac565b9050610a5a565b50610b11613c33565b8560048881548110610b2557610b25615834565b906000526020600020906008020160010154600654610b449190615769565b610b4e91906156d9565b6006819055508560048881548110610b6857610b68615834565b9060005260206000209060080201600101819055508460048881548110610b9157610b91615834565b906000526020600020906008020160040160006101000a81548161ffff021916908361ffff1602179055508360048881548110610bd057610bd0615834565b906000526020600020906008020160050181905550828260048981548110610bfa57610bfa615834565b90600052602060002090600802016007019190610c18929190615099565b508282604051610c29929190615596565b6040805191829003822088835261ffff881660208401529082018690529088907f5ed6f0deef9ab49d02900b40d596df4cd637a2a7fbfa56bbcb377389d3ce8d289060600160405180910390a350505050505050565b60045460009083908110610cef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600084815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290206007544210801590610d34575080600301544210155b95945050505050565b600c5473ffffffffffffffffffffffffffffffffffffffff163314610e0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f73657420696e766573746f7220616464726573733a206f6e6c7920707265766960448201527f6f757320696e766573746f722063616e2063616c6c2074686973206d6574686f60648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a401610763565b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f6260cb34f06b782e83bde168f7d74ab2133041cb53b63ce22b127822a92b679190600090a350565b60026001541415610ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b600260015560045482908110610f5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048481548110610f6f57610f6f615834565b600091825260208083208784526005825260408085203386529092529220805460089092029092019250841115611002576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f77697468647261773a207573657220616d6f756e74206e6f7420656e6f7567686044820152606401610763565b8382600601541015611070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f77697468647261773a20706f6f6c20746f74616c206e6f7420656e6f756768006044820152606401610763565b61107985613c59565b61108285614161565b8315611101578381600001600082825461109c9190615769565b9091555050600254825473ffffffffffffffffffffffffffffffffffffffff908116911614156110de5783600960008282546110d89190615769565b90915550505b81546111019073ffffffffffffffffffffffffffffffffffffffff163386614316565b600382015481547f000000000000000000000000000000000000000000000000000000e8d4a51000916111339161572c565b61113d91906156f1565b600182015560005b60078301548110156112145782600701818154811061116657611166615834565b60009182526020909120015482546040517ffe8343fb00000000000000000000000000000000000000000000000000000000815260048101899052336024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff9091169063fe8343fb90606401600060405180830381600087803b1580156111eb57600080fd5b505af11580156111ff573d6000803e3d6000fd5b505050508061120d906157ac565b9050611145565b508315611235578382600601600082825461122f9190615769565b90915550505b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a3505060018055505050565b6060806060808460048054905081106112ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b60006004878154811061130157611301615834565b906000526020600020906008020190508060070180549050600161132591906156d9565b67ffffffffffffffff81111561133d5761133d615863565b604051908082528060200260200182016040528015611366578160200160208202803683370190505b50600782015490965061137a9060016156d9565b67ffffffffffffffff81111561139257611392615863565b6040519080825280602002602001820160405280156113c557816020015b60608152602001906001900390816113b05790505b5060078201549095506113d99060016156d9565b67ffffffffffffffff8111156113f1576113f1615863565b60405190808252806020026020018201604052801561141a578160200160208202803683370190505b50600782015490945061142e9060016156d9565b67ffffffffffffffff81111561144657611446615863565b60405190808252806020026020018201604052801561146f578160200160208202803683370190505b50600254875191945073ffffffffffffffffffffffffffffffffffffffff169087906000906114a0576114a0615834565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526002546114d09116614486565b856000815181106114e3576114e3615834565b60209081029190910101526002546115109073ffffffffffffffffffffffffffffffffffffffff1661459e565b60ff168460008151811061152657611526615834565b6020026020010181815250506000600f54600e54600d546103e861154a9190615769565b6115549190615769565b61155e9190615769565b90506103e8816006546003548560010154611579919061572c565b61158391906156f1565b61158d919061572c565b61159791906156f1565b846000815181106115aa576115aa615834565b60200260200101818152505060005b60078301548110156119d4578260070181815481106115da576115da615834565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b15801561164957600080fd5b505afa15801561165d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611681919061528f565b8861168d8360016156d9565b8151811061169d5761169d615834565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506117b18360070182815481106116ef576116ef615834565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b15801561175e57600080fd5b505afa158015611772573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611796919061528f565b73ffffffffffffffffffffffffffffffffffffffff16614486565b876117bd8360016156d9565b815181106117cd576117cd615834565b60200260200101819052506118b28360070182815481106117f0576117f0615834565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b15801561185f57600080fd5b505afa158015611873573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611897919061528f565b73ffffffffffffffffffffffffffffffffffffffff1661459e565b60ff16866118c18360016156d9565b815181106118d1576118d1615834565b6020026020010181815250508260070181815481106118f2576118f2615834565b6000918252602090912001546040517f465e81ec000000000000000000000000000000000000000000000000000000008152600481018b905273ffffffffffffffffffffffffffffffffffffffff9091169063465e81ec9060240160206040518083038186803b15801561196557600080fd5b505afa158015611979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199d9190615390565b856119a98360016156d9565b815181106119b9576119b9615834565b60209081029190910101526119cd816157ac565b90506115b9565b505050509193509193565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b600a811115611acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6164643a20746f6f206d616e79207265776172646572730000000000000000006044820152606401610763565b6103e861ffff85161115611b3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6164643a206465706f7369742066656520746f6f2068696768000000000000006044820152606401610763565b62127500831115611ba8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610763565b843b611c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610763565b60005b81811015611ccc57611c56838383818110610a7757610a77615834565b611cbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f6164643a207265776172646572206d75737420626520636f6e747261637400006044820152606401610763565b611cc5816157ac565b9050611c39565b50611cd5613c33565b60006007544211611ce857600754611cea565b425b90508660066000828254611cfe91906156d9565b9250508190555060046040518061010001604052808873ffffffffffffffffffffffffffffffffffffffff168152602001898152602001838152602001600081526020018761ffff168152602001868152602001600081526020018585808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250939094525050835460018082018655948252602091829020845160089092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911781558382015194810194909455604083015160028501556060830151600385015560808301516004850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff90921691909117905560a0830151600585015560c0830151600685015560e08301518051939493611e74935060078501929190910190615121565b5050508282604051611e87929190615596565b60405190819003902060045473ffffffffffffffffffffffffffffffffffffffff881690611eb790600190615769565b604080518b815261ffff8a1660208201529081018890527f5ed295c4f5af5aeb1ccd905e1cd55a86ab3bb9fc1fe2346ff64ac47dbef366619060600160405180910390a450505050505050565b60026001541415611f71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b600260015560045486908110611fe3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048881548110611ff857611ff8615834565b6000918252602090912060089091020180546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018a90526064810189905260ff8816608482015260a4810187905260c4810186905291925073ffffffffffffffffffffffffffffffffffffffff1690819063d505accf9060e401600060405180830381600087803b1580156120a057600080fd5b505af11580156120b4573d6000803e3d6000fd5b505050506120c28989614691565b50506001805550505050505050565b6002600154141561213e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b600260015561214c81613c59565b5060018055565b600260015414156121c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b60026001819055506000600482815481106121dd576121dd615834565b6000918252602080832085845260058252604080852033865290925292208054600892909202909201600681015490935081111561229d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f656d657267656e63792077697468647261773a20706f6f6c20746f74616c206e60448201527f6f7420656e6f75676800000000000000000000000000000000000000000000006064820152608401610763565b60008083556001830181905560028301819055600383018190556006840180548392906122cb908490615769565b90915550600090505b600784015481101561239e578360070181815481106122f5576122f5615834565b60009182526020822001546040517ffe8343fb00000000000000000000000000000000000000000000000000000000815260048101889052336024820152604481019290925273ffffffffffffffffffffffffffffffffffffffff169063fe8343fb90606401600060405180830381600087803b15801561237557600080fd5b505af1158015612389573d6000803e3d6000fd5b5050505080612397906157ac565b90506122d4565b50600254835473ffffffffffffffffffffffffffffffffffffffff908116911614156123dc5780600960008282546123d69190615769565b90915550505b82546123ff9073ffffffffffffffffffffffffffffffffffffffff163383614316565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a35050600180555050565b600260015414156124ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b60026001556124ba613c33565b60018055565b6000600482815481106124d5576124d5615834565b9060005260206000209060080201600601549050919050565b600b5473ffffffffffffffffffffffffffffffffffffffff1633146125bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f73657420747265617375727920616464726573733a206f6e6c7920707265766960448201527f6f757320747265617375727920616464726573732063616e2063616c6c20746860648201527f6973206d6574686f640000000000000000000000000000000000000000000000608482015260a401610763565b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f61885cdba916be748ff3e3f6f15e4206153b8ea3b7acabade9d04b4063a8351090600090a350565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146126f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f736574207465616d20616464726573733a206f6e6c792070726576696f75732060448201527f7465616d20616464726573732063616e2063616c6c2074686973206d6574686f60648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a401610763565b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f42fbc17d847fdc3e5c82da842a5ef3979c64f3b94cd4e7382310fd5525c6ee0f90600090a350565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6127f56000614b02565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314612878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6103e881111561290a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f73657420696e766573746f722070657263656e743a20696e76616c696420706560448201527f7263656e742076616c75650000000000000000000000000000000000000000006064820152608401610763565b6103e8600e5482600d5461291e91906156d9565b61292891906156d9565b11156129b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f73657420696e766573746f722070657263656e743a20746f74616c207065726360448201527f656e74206f766572206d617800000000000000000000000000000000000000006064820152608401610763565b600f5460408051918252602082018390527f905b464403a98b455243c8b4d30c545b8fbd70cda670142b9326425b2c039f3b910160405180910390a1600f55565b60005473ffffffffffffffffffffffffffffffffffffffff163314612a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6103e8811115612b0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f7365742074726561737572792070657263656e743a20696e76616c696420706560448201527f7263656e742076616c75650000000000000000000000000000000000000000006064820152608401610763565b6103e8600f5482600d54612b1e91906156d9565b612b2891906156d9565b1115612bb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f7365742074726561737572792070657263656e743a20746f74616c207065726360448201527f656e74206f766572206d617800000000000000000000000000000000000000006064820152608401610763565b600e5460408051918252602082018390527fa565895c0101fca10e6a7b85742e56cf52ac5f58b09ce030425d3555b47069fd910160405180910390a1600e55565b60005473ffffffffffffffffffffffffffffffffffffffff163314612c78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6103e8811115612d0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f736574207465616d2070657263656e743a20696e76616c69642070657263656e60448201527f742076616c7565000000000000000000000000000000000000000000000000006064820152608401610763565b6103e8600f5482600e54612d1e91906156d9565b612d2891906156d9565b1115612db6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f736574207465616d2070657263656e743a20746f74616c2070657263656e742060448201527f6f766572206d61780000000000000000000000000000000000000000000000006064820152608401610763565b600d5460408051918252602082018390527f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6910160405180910390a1600d55565b60005473ffffffffffffffffffffffffffffffffffffffff163314612e78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6007544210612f09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f7374617274206661726d696e673a206661726d207374617274656420616c726560448201527f61647900000000000000000000000000000000000000000000000000000000006064820152608401610763565b60045460005b81811015612f5757600060048281548110612f2c57612f2c615834565b906000526020600020906008020190504281600201819055505080612f50906157ac565b9050612f0f565b505042600755565b60026001541415612fcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b6002600155601e81111561303c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f68617276657374206d616e793a20746f6f206d616e7920706f6f6c20696473006044820152606401610763565b60005b8181101561307a5761306a83838381811061305c5761305c615834565b905060200201356000614691565b613073816157ac565b905061303f565b50506001805550565b600260015414156130f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b60026001556130ff8282614691565b505060018055565b60005473ffffffffffffffffffffffffffffffffffffffff163314613188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b613190613c33565b3373ffffffffffffffffffffffffffffffffffffffff167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef3600484815481106131db576131db615834565b90600052602060002090600802016001015483604051613205929190918252602082015260400190565b60405180910390a2806004838154811061322157613221615834565b9060005260206000209060080201600101546006546132409190615769565b61324a91906156d9565b600681905550806004838154811061326457613264615834565b9060005260206000209060080201600101819055505050565b600454606090829081106132ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b60006004848154811061330257613302615834565b90600052602060002090600802019050806007018054905067ffffffffffffffff81111561333257613332615863565b60405190808252806020026020018201604052801561335b578160200160208202803683370190505b50925060005b60078201548110156133f45781600701818154811061338257613382615834565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168482815181106133bf576133bf615834565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526133ed816157ac565b9050613361565b505050919050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461347d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b73ffffffffffffffffffffffffffffffffffffffff8116613520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610763565b61352981614b02565b50565b6060806060808560048054905081106135a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b6000600488815481106135b6576135b6615834565b600091825260208083208b845260058252604080852073ffffffffffffffffffffffffffffffffffffffff8d168652909252922060036008909202909201908101546006820154600283015492945090914211801561361457508015155b156136e657600084600201544261362b9190615769565b90506000600f54600e54600d546103e86136459190615769565b61364f9190615769565b6136599190615769565b905060006103e882600654896001015460035487613677919061572c565b613681919061572c565b61368b91906156f1565b613695919061572c565b61369f91906156f1565b9050836136cc7f000000000000000000000000000000000000000000000000000000e8d4a510008361572c565b6136d691906156f1565b6136e090866156d9565b94505050505b6000836002015484600101547f000000000000000000000000000000000000000000000000000000e8d4a51000858760000154613723919061572c565b61372d91906156f1565b6137379190615769565b61374191906156d9565b60078601549091506137549060016156d9565b67ffffffffffffffff81111561376c5761376c615863565b604051908082528060200260200182016040528015613795578160200160208202803683370190505b506007860154909a506137a99060016156d9565b67ffffffffffffffff8111156137c1576137c1615863565b6040519080825280602002602001820160405280156137f457816020015b60608152602001906001900390816137df5790505b5060078601549099506138089060016156d9565b67ffffffffffffffff81111561382057613820615863565b604051908082528060200260200182016040528015613849578160200160208202803683370190505b50600786015490975061385d9060016156d9565b67ffffffffffffffff81111561387557613875615863565b60405190808252806020026020018201604052801561389e578160200160208202803683370190505b506002548b5191995073ffffffffffffffffffffffffffffffffffffffff16908b906000906138cf576138cf615834565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526002546138ff9116614486565b8960008151811061391257613912615834565b602090810291909101015260025461393f9073ffffffffffffffffffffffffffffffffffffffff1661459e565b60ff168860008151811061395557613955615834565b602002602001018181525050808760008151811061397557613975615834565b60200260200101818152505060005b6007860154811015613c23578560070181815481106139a5576139a5615834565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b158015613a1457600080fd5b505afa158015613a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a4c919061528f565b8b613a588360016156d9565b81518110613a6857613a68615834565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613aba8660070182815481106116ef576116ef615834565b8a613ac68360016156d9565b81518110613ad657613ad6615834565b6020026020010181905250613af98660070182815481106117f0576117f0615834565b60ff1689613b088360016156d9565b81518110613b1857613b18615834565b602002602001018181525050856007018181548110613b3957613b39615834565b6000918252602090912001546040517fffcd4263000000000000000000000000000000000000000000000000000000008152600481018f905273ffffffffffffffffffffffffffffffffffffffff8e811660248301529091169063ffcd42639060440160206040518083038186803b158015613bb457600080fd5b505afa158015613bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bec9190615390565b88613bf88360016156d9565b81518110613c0857613c08615834565b6020908102919091010152613c1c816157ac565b9050613984565b5050505050505092959194509250565b60005b60045481101561352957613c4981613c59565b613c52816157ac565b9050613c36565b60045481908110613cc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048381548110613cdb57613cdb615834565b9060005260206000209060080201905080600201544211613cfb57505050565b6006810154801580613d0f57506001820154155b15613d205750426002909101555050565b6000826002015442613d329190615769565b90506000600654846001015460035484613d4c919061572c565b613d56919061572c565b613d6091906156f1565b90506000600f54600e54600d546103e8613d7a9190615769565b613d849190615769565b613d8e9190615769565b600254600a54600d5492935073ffffffffffffffffffffffffffffffffffffffff918216926340c10f1992909116906103e890613dcb908761572c565b613dd591906156f1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613e4057600080fd5b505af1158015613e54573d6000803e3d6000fd5b5050600254600b54600e5473ffffffffffffffffffffffffffffffffffffffff92831694506340c10f1993509116906103e890613e91908761572c565b613e9b91906156f1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613f0657600080fd5b505af1158015613f1a573d6000803e3d6000fd5b5050600254600c54600f5473ffffffffffffffffffffffffffffffffffffffff92831694506340c10f1993509116906103e890613f57908761572c565b613f6191906156f1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613fcc57600080fd5b505af1158015613fe0573d6000803e3d6000fd5b505060025473ffffffffffffffffffffffffffffffffffffffff1691506340c10f199050306103e8614012858761572c565b61401c91906156f1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b15801561408757600080fd5b505af115801561409b573d6000803e3d6000fd5b505050506103e88186600601547f000000000000000000000000000000000000000000000000000000e8d4a51000856140d4919061572c565b6140de91906156f1565b6140e8919061572c565b6140f291906156f1565b85600301600082825461410591906156d9565b909155505042600286018190556003860154604080519283526020830187905282015287907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469060600160405180910390a250505050505b5050565b60006004828154811061417657614176615834565b6000918252602080832085845260058252604080852033865290925292206003810154600890920290920192501580156141b257506007544210155b156141cc5760058201546141c690426156d9565b60038201555b600081600101547f000000000000000000000000000000000000000000000000000000e8d4a5100084600301548460000154614208919061572c565b61421291906156f1565b61421c9190615769565b90506142288433610c7f565b156142a0576000811180614240575060008260020154115b1561429b57600082600201548261425791906156d9565b905082600201546008600082825461426f9190615769565b909155505060006002840155600584015461428a90426156d9565b60038401556142993382614b77565b505b614310565b80156143105780600860008282546142b891906156d9565b92505081905550808260020160008282546142d391906156d9565b9091555050604051818152849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c19060200160405180910390a35b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916143ad91906155e5565b6000604051808303816000865af19150503d80600081146143ea576040519150601f19603f3d011682016040523d82523d6000602084013e6143ef565b606091505b5091509150818015614419575080511580614419575080806020019051810190614419919061526d565b61447f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c6564000000006044820152606401610763565b5050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161450891906155e5565b600060405180830381855afa9150503d8060008114614543576040519150601f19603f3d011682016040523d82523d6000602084013e614548565b606091505b50915091508161458d576040518060400160405280600381526020017f3f3f3f0000000000000000000000000000000000000000000000000000000000815250614596565b61459681614d2d565b949350505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169161461f91906155e5565b600060405180830381855afa9150503d806000811461465a576040519150601f19603f3d011682016040523d82523d6000602084013e61465f565b606091505b5091509150818015614672575080516020145b61467d576012614596565b8080602001905181019061459691906154f8565b600454829081106146fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b60006004848154811061471357614713615834565b6000918252602080832087845260058252604080852033865290925292206008909102909101915061474485613c59565b61474d85614161565b83156149905781546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156147bc57600080fd5b505afa1580156147d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147f49190615390565b835490915061481b9073ffffffffffffffffffffffffffffffffffffffff16333088614f20565b82546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561488457600080fd5b505afa158015614898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148bc9190615390565b90506148c88282615769565b600485015490965061ffff1615614937576004840154600090612710906148f39061ffff168961572c565b6148fd91906156f1565b600b5486549192506149299173ffffffffffffffffffffffffffffffffffffffff908116911683614316565b6149338188615769565b9650505b8583600001600082825461494b91906156d9565b9091555050600254845473ffffffffffffffffffffffffffffffffffffffff9081169116141561498d57856009600082825461498791906156d9565b90915550505b50505b600382015481547f000000000000000000000000000000000000000000000000000000e8d4a51000916149c29161572c565b6149cc91906156f1565b600182015560005b6007830154811015614aa3578260070181815481106149f5576149f5615834565b60009182526020909120015482546040517ffe8343fb00000000000000000000000000000000000000000000000000000000815260048101899052336024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff9091169063fe8343fb90606401600060405180830381600087803b158015614a7a57600080fd5b505af1158015614a8e573d6000803e3d6000fd5b5050505080614a9c906157ac565b90506149d4565b508315614ac45783826006016000828254614abe91906156d9565b90915550505b604051848152859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a35050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6009546002546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b158015614be357600080fd5b505afa158015614bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c1b9190615390565b111561415d576009546002546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000929173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015614c8f57600080fd5b505afa158015614ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cc79190615390565b614cd19190615769565b9050808210614d0357600254614cfe9073ffffffffffffffffffffffffffffffffffffffff168483614316565b505050565b8115614cfe57600254614cfe9073ffffffffffffffffffffffffffffffffffffffff168484614316565b60606040825110614d525781806020019051810190614d4c91906152ac565b92915050565b815160201415614ee25760005b60208160ff16108015614dac5750828160ff1681518110614d8257614d82615834565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15614dc35780614dbb816157e5565b915050614d5f565b60008160ff1667ffffffffffffffff811115614de157614de1615863565b6040519080825280601f01601f191660200182016040528015614e0b576020820181803683370190505b509050600091505b60208260ff16108015614e605750838260ff1681518110614e3657614e36615834565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15614edb57838260ff1681518110614e7a57614e7a615834565b602001015160f81c60f81b818360ff1681518110614e9a57614e9a615834565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081614ed3816157e5565b925050614e13565b9392505050565b505060408051808201909152600381527f3f3f3f0000000000000000000000000000000000000000000000000000000000602082015290565b919050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691614fbf91906155e5565b6000604051808303816000865af19150503d8060008114614ffc576040519150601f19603f3d011682016040523d82523d6000602084013e615001565b606091505b509150915081801561502b57508051158061502b57508080602001905181019061502b919061526d565b615091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646044820152606401610763565b505050505050565b828054828255906000526020600020908101928215615111579160200282015b828111156151115781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8435161782556020909201916001909101906150b9565b5061511d92915061519b565b5090565b828054828255906000526020600020908101928215615111579160200282015b8281111561511157825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190615141565b5b8082111561511d576000815560010161519c565b60008083601f8401126151c257600080fd5b50813567ffffffffffffffff8111156151da57600080fd5b6020830191508360208260051b85010111156151f557600080fd5b9250929050565b803561ffff81168114614f1b57600080fd5b60006020828403121561522057600080fd5b8135614edb81615892565b6000806020838503121561523e57600080fd5b823567ffffffffffffffff81111561525557600080fd5b615261858286016151b0565b90969095509350505050565b60006020828403121561527f57600080fd5b81518015158114614edb57600080fd5b6000602082840312156152a157600080fd5b8151614edb81615892565b6000602082840312156152be57600080fd5b815167ffffffffffffffff808211156152d657600080fd5b818401915084601f8301126152ea57600080fd5b8151818111156152fc576152fc615863565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561534257615342615863565b8160405282815287602084870101111561535b57600080fd5b61536c836020830160208801615780565b979650505050505050565b60006020828403121561538957600080fd5b5035919050565b6000602082840312156153a257600080fd5b5051919050565b600080604083850312156153bc57600080fd5b8235915060208301356153ce81615892565b809150509250929050565b60008060008060008060a087890312156153f257600080fd5b86359550602087013561540481615892565b9450615412604088016151fc565b935060608701359250608087013567ffffffffffffffff81111561543557600080fd5b61544189828a016151b0565b979a9699509497509295939492505050565b6000806040838503121561546657600080fd5b50508035926020909101359150565b60008060008060008060a0878903121561548e57600080fd5b8635955060208701359450615412604088016151fc565b60008060008060008060c087890312156154be57600080fd5b86359550602087013594506040870135935060608701356154de816158b4565b9598949750929560808101359460a0909101359350915050565b60006020828403121561550a57600080fd5b8151614edb816158b4565b600081518084526020808501945080840160005b8381101561555b57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101615529565b509495945050505050565b600081518084526020808501945080840160005b8381101561555b5781518752958201959082019060010161557a565b60008184825b858110156155da5781356155af81615892565b73ffffffffffffffffffffffffffffffffffffffff168352602092830192919091019060010161559c565b509095945050505050565b600082516155f7818460208701615780565b9190910192915050565b602081526000614edb6020830184615515565b6080815260006156276080830187615515565b6020838203818501528187518084528284019150828160051b850101838a0160005b838110156156ad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808885030186528251805180865261568f818a88018b8501615780565b96880196601f01909116939093018601925090850190600101615649565b505086810360408801526156c1818a615566565b945050505050828103606084015261536c8185615566565b600082198211156156ec576156ec615805565b500190565b600082615727577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561576457615764615805565b500290565b60008282101561577b5761577b615805565b500390565b60005b8381101561579b578181015183820152602001615783565b838111156143105750506000910152565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156157de576157de615805565b5060010190565b600060ff821660ff8114156157fc576157fc615805565b60010192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461352957600080fd5b60ff8116811461352957600080fdfea26469706673582212206c72d31bca8a003d2d27cfd92bf840e1e233fe8f9b3e35dd554947ab2669a0e164736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000744eb7c95ece05b849e84c45a3574e943eef665b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ead8220873fdb206ed458bd5dfb8eb3985ef230a000000000000000000000000a6fd062fc0c8e06a439f1dc6299872bf653cec06000000000000000000000000654a8fb01c955f6036f8f8b3e84c28e659385d68000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064
-----Decoded View---------------
Arg [0] : _solar (address): 0x744eB7c95eCe05B849e84c45A3574e943EeF665B
Arg [1] : _solarPerSec (uint256): 0
Arg [2] : _teamAddress (address): 0xEaD8220873fDB206Ed458bD5DFB8Eb3985EF230a
Arg [3] : _treasuryAddress (address): 0xA6fd062Fc0c8e06A439f1dC6299872bf653CeC06
Arg [4] : _investorAddress (address): 0x654a8FB01c955f6036f8F8b3e84C28E659385D68
Arg [5] : _teamPercent (uint256): 100
Arg [6] : _treasuryPercent (uint256): 100
Arg [7] : _investorPercent (uint256): 100
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000744eb7c95ece05b849e84c45a3574e943eef665b
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 000000000000000000000000ead8220873fdb206ed458bd5dfb8eb3985ef230a
Arg [3] : 000000000000000000000000a6fd062fc0c8e06a439f1dc6299872bf653cec06
Arg [4] : 000000000000000000000000654a8fb01c955f6036f8f8b3e84c28e659385d68
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode Sourcemap
19639:27880:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21988:30;;;;;;;;;24588:25:1;;;24576:2;24561:18;21988:30:0;;;;;;;;22089;;;;;;26080:95;26152:8;:15;26080:95;;43643:219;;;;;;:::i;:::-;;:::i;:::-;;21797:30;;;;;;;;;;;;8519:42:1;8507:55;;;8489:74;;8477:2;8462:18;21797:30:0;8343:226:1;21095:26:0;;;;;;:::i;:::-;;:::i;:::-;;;;12681:42:1;12669:55;;;12651:74;;12756:2;12741:18;;12734:34;;;;12784:18;;;12777:34;;;;12842:2;12827:18;;12820:34;;;;12903:6;12891:19;12885:3;12870:19;;12863:48;12942:3;12927:19;;12920:35;12986:3;12971:19;;12964:35;12638:3;12623:19;21095:26:0;12318:687:1;21340:34:0;;;;;;21671:26;;;;;;;;;28325:1410;;;;;;:::i;:::-;;:::i;34600:326::-;;;;;;:::i;:::-;;:::i;:::-;;;12040:14:1;;12033:22;12015:41;;12003:2;11988:18;34600:326:0;11875:187:1;46650:333:0;;;;;;:::i;:::-;;:::i;39166:1414::-;;;;;;:::i;:::-;;:::i;32257:1727::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;21501:35::-;;;;;;26388:1824;;;;;;:::i;:::-;;:::i;36889:435::-;;;;;;:::i;:::-;;:::i;35373:92::-;;;;;;:::i;:::-;;:::i;40651:1016::-;;;;;;:::i;:::-;;:::i;35009:86::-;;;:::i;44331:113::-;;;;;;:::i;:::-;;:::i;45706:341::-;;;;;;:::i;:::-;;:::i;44846:305::-;;;;;;:::i;:::-;;:::i;2565:94::-;;;:::i;21006:54::-;;21056:4;21006:54;;;;;24423:6:1;24411:19;;;24393:38;;24381:2;24366:18;21006:54:0;24249:188:1;46991:525:0;;;;;;:::i;:::-;;:::i;46055:::-;;;;;;:::i;:::-;;:::i;1914:87::-;1960:7;1987:6;;;1914:87;;21179:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26823:25:1;;;26879:2;26864:18;;26857:34;;;;26907:18;;;26900:34;26965:2;26950:18;;26943:34;26810:3;26795:19;21179:64:0;26592:391:1;45159:481:0;;;;;;:::i;:::-;;:::i;20828:26::-;;;;;;25631:441;;;:::i;21732:30::-;;;;;;;;;21604:36;;;;;;44515:265;;;;;;:::i;:::-;;:::i;20901:58::-;;20952:7;20901:58;;21891:26;;;;;;37377:110;;;;;;:::i;:::-;;:::i;20754:25::-;;;;;;;;;21431:29;;;;;;43870:453;;;;;;:::i;:::-;;:::i;34042:494::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2814:192::-;;;;;;:::i;:::-;;:::i;29801:2389::-;;;;;;:::i;:::-;;:::i;43643:219::-;1960:7;1987:6;2134:23;1987:6;805:10;2134:23;2126:68;;;;;;;21016:2:1;2126:68:0;;;20998:21:1;;;21035:18;;;21028:30;21094:34;21074:18;;;21067:62;21146:18;;2126:68:0;;;;;;;;;43721:18:::1;:16;:18::i;:::-;43789:11;::::0;43757:58:::1;::::0;;26189:25:1;;;26245:2;26230:18;;26223:34;;;43777:10:0::1;::::0;43757:58:::1;::::0;26162:18:1;43757:58:0::1;;;;;;;43828:11;:26:::0;43643:219::o;21095:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21095:26:0;;;;;;;;;;;:::o;28325:1410::-;1960:7;1987:6;2134:23;1987:6;805:10;2134:23;2126:68;;;;;;;21016:2:1;2126:68:0;;;20998:21:1;;;21035:18;;;21028:30;21094:34;21074:18;;;21067:62;21146:18;;2126:68:0;20814:356:1;2126:68:0;22285:8:::1;:15:::0;28548:4;;22278:22;::::1;22270:54;;;::::0;::::1;::::0;;16119:2:1;22270:54:0::1;::::0;::::1;16101:21:1::0;16158:2;16138:18;;;16131:30;16197:21;16177:18;;;16170:49;16236:18;;22270:54:0::1;15917:343:1::0;22270:54:0::1;28594:2:::2;28573:23:::0;::::2;;28565:59;;;::::0;::::2;::::0;;13923:2:1;28565:59:0::2;::::0;::::2;13905:21:1::0;13962:2;13942:18;;;13935:30;14001:25;13981:18;;;13974:53;14044:18;;28565:59:0::2;13721:347:1::0;28565:59:0::2;21056:4;28659:41;::::0;::::2;;;28637:116;;;::::0;::::2;::::0;;13212:2:1;28637:116:0::2;::::0;::::2;13194:21:1::0;13251:2;13231:18;;;13224:30;13290:27;13270:18;;;13263:55;13335:18;;28637:116:0::2;13010:349:1::0;28637:116:0::2;20952:7;28786:16;:44;;28764:123;;;::::0;::::2;::::0;;21377:2:1;28764:123:0::2;::::0;::::2;21359:21:1::0;21416:2;21396:18;;;21389:30;21455:31;21435:18;;;21428:59;21504:18;;28764:123:0::2;21175:353:1::0;28764:123:0::2;28919:18;28900:295;28956:30:::0;;::::2;28900:295;;;29066:51;29093:10;;29104;29093:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;6933:20:::0;6981:8;;;6610:387;29066:51:::2;29040:143;;;::::0;::::2;::::0;;15760:2:1;29040:143:0::2;::::0;::::2;15742:21:1::0;15799:2;15779:18;;;15772:30;15838:32;15818:18;;;15811:60;15888:18;;29040:143:0::2;15558:354:1::0;29040:143:0::2;29001:12;::::0;::::2;:::i;:::-;;;28900:295;;;;29207:18;:16;:18::i;:::-;29341:11;29300:8;29309:4;29300:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;29269:15;;:56;;;;:::i;:::-;:83;;;;:::i;:::-;29238:15;:114;;;;29393:11;29365:8;29374:4;29365:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;29445:13;29415:8;29424:4;29415:14;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;29502:16;29469:8;29478:4;29469:14;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;:49;;;;29556:10;;29529:8;29538:4;29529:14;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;:37;;;;;;;:::i;:::-;;29706:10;;29584:143;;;;;;;:::i;:::-;;::::0;;;;;::::2;::::0;;25880:25:1;;;25953:6;25941:19;;25936:2;25921:18;;25914:47;25977:18;;;25970:34;;;29584:143:0;29602:4;;29584:143:::2;::::0;25868:2:1;25853:18;29584:143:0::2;;;;;;;2205:1:::1;28325:1410:::0;;;;;;:::o;34600:326::-;22285:8;:15;34730:4;;34706;;22278:22;;22270:54;;;;;;;16119:2:1;22270:54:0;;;16101:21:1;16158:2;16138:18;;;16131:30;16197:21;16177:18;;;16170:49;16236:18;;22270:54:0;15917:343:1;22270:54:0;34752:21:::1;34776:14:::0;;;:8:::1;:14;::::0;;;;;;;:21:::1;::::0;::::1;::::0;;;;;;;34847:14:::1;::::0;34828:15:::1;:33;::::0;::::1;::::0;:90:::1;;;34897:4;:21;;;34878:15;:40;;34828:90;34808:110:::0;34600:326;-1:-1:-1;;;;;34600:326:0:o;46650:333::-;46758:15;;;;46744:10;:29;46722:144;;;;;;;17241:2:1;46722:144:0;;;17223:21:1;17280:2;17260:18;;;17253:30;17319:34;17299:18;;;17292:62;17390:34;17370:18;;;17363:62;17462:3;17441:19;;;17434:32;17483:19;;46722:144:0;17039:469:1;46722:144:0;46877:15;:34;;;;;;;;;;;;;46927:48;;46946:10;;46927:48;;-1:-1:-1;;46927:48:0;46650:333;:::o;39166:1414::-;4920:1;5516:7;;:19;;5508:63;;;;;;;23266:2:1;5508:63:0;;;23248:21:1;23305:2;23285:18;;;23278:30;23344:33;23324:18;;;23317:61;23395:18;;5508:63:0;23064:355:1;5508:63:0;4920:1;5649:7;:18;22285:8:::1;:15:::0;39280:4;;22278:22;::::1;22270:54;;;::::0;::::1;::::0;;16119:2:1;22270:54:0::1;::::0;::::1;16101:21:1::0;16158:2;16138:18;;;16131:30;16197:21;16177:18;;;16170:49;16236:18;;22270:54:0::1;15917:343:1::0;22270:54:0::1;39302:21:::2;39326:8;39335:4;39326:14;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;39375;;;:8:::2;:14:::0;;;;;;39390:10:::2;39375:26:::0;;;;;;;39495:11;;39326:14:::2;::::0;;::::2;::::0;;::::2;::::0;-1:-1:-1;39495:22:0;-1:-1:-1;39495:22:0::2;39487:67;;;::::0;::::2;::::0;;16880:2:1;39487:67:0::2;::::0;::::2;16862:21:1::0;;;16899:18;;;16892:30;16958:34;16938:18;;;16931:62;17010:18;;39487:67:0::2;16678:356:1::0;39487:67:0::2;39643:7;39627:4;:12;;;:23;;39619:67;;;::::0;::::2;::::0;;15400:2:1;39619:67:0::2;::::0;::::2;15382:21:1::0;15439:2;15419:18;;;15412:30;15478:33;15458:18;;;15451:61;15529:18;;39619:67:0::2;15198:355:1::0;39619:67:0::2;39699:17;39711:4;39699:11;:17::i;:::-;39729:29;39753:4;39729:23;:29::i;:::-;39775:11:::0;;39771:249:::2;;39818:7;39803:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;39877:5:0::2;::::0;39852:12;;39877:5:::2;39852:12:::0;;::::2;39877:5:::0;::::2;39844:39;39840:108;;;39925:7;39904:17;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;39840:108:0::2;39962:12:::0;;:46:::2;::::0;:12:::2;;39988:10;40000:7:::0;39962:25:::2;:46::i;:::-;40078:21;::::0;::::2;::::0;40064:11;;40116:19:::2;::::0;40064:35:::2;::::0;::::2;:::i;:::-;40063:72;;;;:::i;:::-;40032:15;::::0;::::2;:103:::0;40167:18:::2;40148:293;40217:14;::::0;::::2;:21:::0;40204:34;::::2;40148:293;;;40292:4;:14;;40307:10;40292:26;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;40403:11;;40292:137:::2;::::0;;;;::::2;::::0;::::2;25136:25:1::0;;;40374:10:0::2;25177:18:1::0;;;25170:83;25269:18;;;25262:34;;;;40292:26:0::2;::::0;;::::2;::::0;:40:::2;::::0;25109:18:1;;40292:137:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;40253:12;;;;:::i;:::-;;;40148:293;;;-1:-1:-1::0;40457:11:0;;40453:67:::2;;40501:7;40485:4;:12;;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40453:67:0::2;40537:35;::::0;24588:25:1;;;40558:4:0;;40546:10:::2;::::0;40537:35:::2;::::0;24576:2:1;24561:18;40537:35:0::2;;;;;;;-1:-1:-1::0;;4876:1:0;5828:22;;-1:-1:-1;;;39166:1414:0:o;32257:1727::-;32395:26;32436:23;32474:25;32514:30;32357:4;22285:8;:15;;;;22278:4;:22;22270:54;;;;;;;16119:2:1;22270:54:0;;;16101:21:1;16158:2;16138:18;;;16131:30;16197:21;16177:18;;;16170:49;16236:18;;22270:54:0;15917:343:1;22270:54:0;32572:21:::1;32596:8;32605:4;32596:14;;;;;;;;:::i;:::-;;;;;;;;;;;32572:38;;32649:4;:14;;:21;;;;32673:1;32649:25;;;;:::i;:::-;32635:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;32635:40:0::1;-1:-1:-1::0;32709:14:0::1;::::0;::::1;:21:::0;32623:52;;-1:-1:-1;32709:25:0::1;::::0;32733:1:::1;32709:25;:::i;:::-;32696:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;32771:14:0::1;::::0;::::1;:21:::0;32686:49;;-1:-1:-1;32771:25:0::1;::::0;32795:1:::1;32771:25;:::i;:::-;32757:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;32757:40:0::1;-1:-1:-1::0;32838:14:0::1;::::0;::::1;:21:::0;32746:51;;-1:-1:-1;32838:25:0::1;::::0;32862:1:::1;32838:25;:::i;:::-;32824:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;32824:40:0::1;-1:-1:-1::0;32900:5:0::1;::::0;32877:12;;32808:56;;-1:-1:-1;32900:5:0::1;;::::0;32877:9;;32900:5:::1;::::0;32877:12:::1;;;;:::i;:::-;:29;::::0;;::::1;:12;::::0;;::::1;::::0;;;;;:29;32943:5:::1;::::0;32930:32:::1;::::0;32943:5:::1;32930:30;:32::i;:::-;32917:7;32925:1;32917:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:45;33000:5:::1;::::0;32987:34:::1;::::0;33000:5:::1;;32987:32;:34::i;:::-;32973:48;;:8;32982:1;32973:11;;;;;;;;:::i;:::-;;;;;;:48;;;::::0;::::1;33034:17;33132:15;;33101;;33074:11;;33054:4;:31;;;;:::i;:::-;:62;;;;:::i;:::-;:93;;;;:::i;:::-;33034:113;;33273:4;33247:9;33228:15;;33213:11;;33195:4;:15;;;:29;;;;:::i;:::-;33194:49;;;;:::i;:::-;33193:63;;;;:::i;:::-;33192:85;;;;:::i;:::-;33160:13;33174:1;33160:16;;;;;;;;:::i;:::-;;;;;;:117;;;::::0;::::1;33309:18;33290:687;33359:14;::::0;::::1;:21:::0;33346:34;::::1;33290:687;;;33488:4;:14;;33503:10;33488:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;;;;;;:26:::1;::::0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33434:9:::0;33444:14:::1;:10:::0;33457:1:::1;33444:14;:::i;:::-;33434:25;;;;;;;;:::i;:::-;;;;;;:109;;;;;;;;;::::0;::::1;33586:99;33617:4;:14;;33632:10;33617:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;;;;;;:26:::1;::::0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33586:97;;;:99::i;:::-;33560:7:::0;33568:14:::1;:10:::0;33581:1:::1;33568:14;:::i;:::-;33560:23;;;;;;;;:::i;:::-;;;;;;:125;;;;33729:101;33760:4;:14;;33775:10;33760:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;;;;;;:26:::1;::::0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33729:99;;;:101::i;:::-;33702:128;;:8:::0;33711:14:::1;:10:::0;33724:1:::1;33711:14;:::i;:::-;33702:24;;;;;;;;:::i;:::-;;;;;;:128;;;::::0;::::1;33879:4;:32;;33912:10;33879:44;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;:86:::1;::::0;;;;::::1;::::0;::::1;24588:25:1::0;;;33879:44:0::1;::::0;;::::1;::::0;:80:::1;::::0;24561:18:1;;33879:86:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33847:13:::0;33861:14:::1;:10:::0;33874:1:::1;33861:14;:::i;:::-;33847:29;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:118;33395:12:::1;::::0;::::1;:::i;:::-;;;33290:687;;;;32561:1423;;32257:1727:::0;;;;;;:::o;26388:1824::-;1960:7;1987:6;2134:23;1987:6;805:10;2134:23;2126:68;;;;;;;21016:2:1;2126:68:0;;;20998:21:1;;;21035:18;;;21028:30;21094:34;21074:18;;;21067:62;21146:18;;2126:68:0;20814:356:1;2126:68:0;26642:2:::1;26621:23:::0;::::1;;26613:59;;;::::0;::::1;::::0;;17715:2:1;26613:59:0::1;::::0;::::1;17697:21:1::0;17754:2;17734:18;;;17727:30;17793:25;17773:18;;;17766:53;17836:18;;26613:59:0::1;17513:347:1::0;26613:59:0::1;21056:4;26705:41;::::0;::::1;;;26683:116;;;::::0;::::1;::::0;;22912:2:1;26683:116:0::1;::::0;::::1;22894:21:1::0;22951:2;22931:18;;;22924:30;22990:27;22970:18;;;22963:55;23035:18;;26683:116:0::1;22710:349:1::0;26683:116:0::1;20952:7;26832:16;:44;;26810:123;;;::::0;::::1;::::0;;15042:2:1;26810:123:0::1;::::0;::::1;15024:21:1::0;15081:2;15061:18;;;15054:30;15120:31;15100:18;;;15093:59;15169:18;;26810:123:0::1;14840:353:1::0;26810:123:0::1;6933:20:::0;;26944:125:::1;;;::::0;::::1;::::0;;21735:2:1;26944:125:0::1;::::0;::::1;21717:21:1::0;21774:2;21754:18;;;21747:30;21813:34;21793:18;;;21786:62;21884:8;21864:18;;;21857:36;21910:19;;26944:125:0::1;21533:402:1::0;26944:125:0::1;27101:18;27082:295;27138:30:::0;;::::1;27082:295;;;27248:51;27275:10;;27286;27275:22;;;;;;;:::i;27248:51::-;27222:143;;;::::0;::::1;::::0;;18067:2:1;27222:143:0::1;::::0;::::1;18049:21:1::0;18106:2;18086:18;;;18079:30;18145:32;18125:18;;;18118:60;18195:18;;27222:143:0::1;17865:354:1::0;27222:143:0::1;27183:12;::::0;::::1;:::i;:::-;;;27082:295;;;;27389:18;:16;:18::i;:::-;27420:27;27468:14;;27450:15;:32;:93;;27529:14;;27450:93;;;27498:15;27450:93;27420:123;;27575:11;27556:15;;:30;;;;;;;:::i;:::-;;;;;;;;27599:8;27627:367;;;;;;;;27664:8;27627:367;;;;;;27703:11;27627:367;;;;27754:19;27627:367;;;;27810:1;27627:367;;;;27844:13;27627:367;;;;;;27893:16;27627:367;;;;27937:1;27627:367;;;;27968:10;;27627:367;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;27627:367:0;;;;-1:-1:-1;;27599:406:0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;27599:406:0::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;:::i;:::-;;;;28183:10;;28023:181;;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;28041:8:::1;:15:::0;28023:181:::1;::::0;::::1;::::0;28041:19:::1;::::0;28059:1:::1;::::0;28041:19:::1;:::i;:::-;28023:181;::::0;;25880:25:1;;;25953:6;25941:19;;25936:2;25921:18;;25914:47;25977:18;;;25970:34;;;28023:181:0::1;::::0;25868:2:1;25853:18;28023:181:0::1;;;;;;;26602:1610;26388:1824:::0;;;;;;:::o;36889:435::-;4920:1;5516:7;;:19;;5508:63;;;;;;;23266:2:1;5508:63:0;;;23248:21:1;23305:2;23285:18;;;23278:30;23344:33;23324:18;;;23317:61;23395:18;;5508:63:0;23064:355:1;5508:63:0;4920:1;5649:7;:18;22285:8:::1;:15:::0;37093:3;;22278:22;::::1;22270:54;;;::::0;::::1;::::0;;16119:2:1;22270:54:0::1;::::0;::::1;16101:21:1::0;16158:2;16138:18;;;16131:30;16197:21;16177:18;;;16170:49;16236:18;;22270:54:0::1;15917:343:1::0;22270:54:0::1;37109:21:::2;37133:8;37142:3;37133:13;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;37194:12:::0;;37219:65:::2;::::0;;;;37231:10:::2;37219:65;::::0;::::2;9349:34:1::0;37251:4:0::2;9399:18:1::0;;;9392:43;9451:18;;;9444:34;;;9494:18;;;9487:34;;;9570:4;9558:17;;9537:19;;;9530:46;9592:19;;;9585:35;;;9636:19;;;9629:35;;;37133:13:0;;-1:-1:-1;37194:12:0::2;;::::0;;;37219:11:::2;::::0;9260:19:1;;37219:65:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;37295:21;37304:3;37309:6;37295:8;:21::i;:::-;-1:-1:-1::0;;4876:1:0;5828:22;;-1:-1:-1;;;;;;;36889:435:0:o;35373:92::-;4920:1;5516:7;;:19;;5508:63;;;;;;;23266:2:1;5508:63:0;;;23248:21:1;23305:2;23285:18;;;23278:30;23344:33;23324:18;;;23317:61;23395:18;;5508:63:0;23064:355:1;5508:63:0;4920:1;5649:7;:18;35440:17:::1;35452:4:::0;35440:11:::1;:17::i;:::-;-1:-1:-1::0;4876:1:0;5828:22;;35373:92::o;40651:1016::-;4920:1;5516:7;;:19;;5508:63;;;;;;;23266:2:1;5508:63:0;;;23248:21:1;23305:2;23285:18;;;23278:30;23344:33;23324:18;;;23317:61;23395:18;;5508:63:0;23064:355:1;5508:63:0;4920:1;5649:7;:18;;;;40723:21:::1;40747:8;40756:4;40747:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;40796;;;:8:::1;:14:::0;;;;;;40811:10:::1;40796:26:::0;;;;;;;40850:11;;40747:14:::1;::::0;;;::::1;::::0;;::::1;40948:12;::::0;::::1;::::0;40747:14;;-1:-1:-1;;;40948:22:0::1;40926:113;;;::::0;::::1;::::0;;18426:2:1;40926:113:0::1;::::0;::::1;18408:21:1::0;18465:2;18445:18;;;18438:30;18504:34;18484:18;;;18477:62;18575:11;18555:18;;;18548:39;18604:19;;40926:113:0::1;18224:405:1::0;40926:113:0::1;41066:1;41052:15:::0;;;41078::::1;::::0;::::1;:19:::0;;;41108::::1;::::0;::::1;:23:::0;;;41142:21:::1;::::0;::::1;:25:::0;;;41178:12:::1;::::0;::::1;:22:::0;;41194:6;;41066:1;41178:22:::1;::::0;41194:6;;41178:22:::1;:::i;:::-;::::0;;;-1:-1:-1;41232:18:0::1;::::0;-1:-1:-1;41213:217:0::1;41282:14;::::0;::::1;:21:::0;41269:34;::::1;41213:217;;;41357:4;:14;;41372:10;41357:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;:61:::1;::::0;;;;::::1;::::0;::::1;25136:25:1::0;;;41404:10:0::1;25177:18:1::0;;;25170:83;25269:18;;;25262:34;;;;41357:26:0::1;;::::0;:40:::1;::::0;25109:18:1;;41357:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41318:12;;;;:::i;:::-;;;41213:217;;;-1:-1:-1::0;41479:5:0::1;::::0;41454:12;;41479:5:::1;41454:12:::0;;::::1;41479:5:::0;::::1;41446:39;41442:99;;;41523:6;41502:17;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;41442:99:0::1;41553:12:::0;;:45:::1;::::0;:12:::1;;41579:10;41591:6:::0;41553:25:::1;:45::i;:::-;41616:43;::::0;24588:25:1;;;41646:4:0;;41634:10:::1;::::0;41616:43:::1;::::0;24576:2:1;24561:18;41616:43:0::1;;;;;;;-1:-1:-1::0;;4876:1:0;5828:22;;-1:-1:-1;;40651:1016:0:o;35009:86::-;4920:1;5516:7;;:19;;5508:63;;;;;;;23266:2:1;5508:63:0;;;23248:21:1;23305:2;23285:18;;;23278:30;23344:33;23324:18;;;23317:61;23395:18;;5508:63:0;23064:355:1;5508:63:0;4920:1;5649:7;:18;35069::::1;:16;:18::i;:::-;4876:1:::0;5828:22;;35009:86::o;44331:113::-;44388:7;44415:8;44424:3;44415:13;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;;44408:28;;44331:113;;;:::o;45706:341::-;45814:15;;;;45800:10;:29;45778:152;;;;;;;20126:2:1;45778:152:0;;;20108:21:1;20165:2;20145:18;;;20138:30;20204:34;20184:18;;;20177:62;20275:34;20255:18;;;20248:62;20347:11;20326:19;;;20319:40;20376:19;;45778:152:0;19924:477:1;45778:152:0;45941:15;:34;;;;;;;;;;;;;45991:48;;46010:10;;45991:48;;-1:-1:-1;;45991:48:0;45706:341;:::o;44846:305::-;44946:11;;;;44932:10;:25;44910:140;;;;;;;19652:2:1;44910:140:0;;;19634:21:1;19691:2;19671:18;;;19664:30;19730:34;19710:18;;;19703:62;19801:34;19781:18;;;19774:62;19873:3;19852:19;;;19845:32;19894:19;;44910:140:0;19450:469:1;44910:140:0;45061:11;:26;;;;;;;;;;;;;45103:40;;45118:10;;45103:40;;-1:-1:-1;;45103:40:0;44846:305;:::o;2565:94::-;1960:7;1987:6;2134:23;1987:6;805:10;2134:23;2126:68;;;;;;;21016:2:1;2126:68:0;;;20998:21:1;;;21035:18;;;21028:30;21094:34;21074:18;;;21067:62;21146:18;;2126:68:0;20814:356:1;2126:68:0;2630:21:::1;2648:1;2630:9;:21::i;:::-;2565:94::o:0;46991:525::-;1960:7;1987:6;2134:23;1987:6;805:10;2134:23;2126:68;;;;;;;21016:2:1;2126:68:0;;;20998:21:1;;;21035:18;;;21028:30;21094:34;21074:18;;;21067:62;21146:18;;2126:68:0;20814:356:1;2126:68:0;47149:4:::1;47126:19;:27;;47076:148;;;::::0;::::1;::::0;;23626:2:1;47076:148:0::1;::::0;::::1;23608:21:1::0;23665:2;23645:18;;;23638:30;23704:34;23684:18;;;23677:62;23775:13;23755:18;;;23748:41;23806:19;;47076:148:0::1;23424:407:1::0;47076:148:0::1;47312:4;47293:15;;47271:19;47257:11;;:33;;;;:::i;:::-;:51;;;;:::i;:::-;:59;;47235:153;;;::::0;::::1;::::0;;16467:2:1;47235:153:0::1;::::0;::::1;16449:21:1::0;16506:2;16486:18;;;16479:30;16545:34;16525:18;;;16518:62;16616:14;16596:18;;;16589:42;16648:19;;47235:153:0::1;16265:408:1::0;47235:153:0::1;47423:15;::::0;47404:56:::1;::::0;;26189:25:1;;;26245:2;26230:18;;26223:34;;;47404:56:0::1;::::0;26162:18:1;47404:56:0::1;;;;;;;47471:15;:37:::0;46991:525::o;46055:::-;1960:7;1987:6;2134:23;1987:6;805:10;2134:23;2126:68;;;;;;;21016:2:1;2126:68:0;;;20998:21:1;;;21035:18;;;21028:30;21094:34;21074:18;;;21067:62;21146:18;;2126:68:0;20814:356:1;2126:68:0;46213:4:::1;46190:19;:27;;46140:148;;;::::0;::::1;::::0;;19240:2:1;46140:148:0::1;::::0;::::1;19222:21:1::0;19279:2;19259:18;;;19252:30;19318:34;19298:18;;;19291:62;19389:13;19369:18;;;19362:41;19420:19;;46140:148:0::1;19038:407:1::0;46140:148:0::1;46376:4;46357:15;;46335:19;46321:11;;:33;;;;:::i;:::-;:51;;;;:::i;:::-;:59;;46299:153;;;::::0;::::1;::::0;;24038:2:1;46299:153:0::1;::::0;::::1;24020:21:1::0;24077:2;24057:18;;;24050:30;24116:34;24096:18;;;24089:62;24187:14;24167:18;;;24160:42;24219:19;;46299:153:0::1;23836:408:1::0;46299:153:0::1;46487:15;::::0;46468:56:::1;::::0;;26189:25:1;;;26245:2;26230:18;;26223:34;;;46468:56:0::1;::::0;26162:18:1;46468:56:0::1;;;;;;;46535:15;:37:::0;46055:525::o;45159:481::-;1960:7;1987:6;2134:23;1987:6;805:10;2134:23;2126:68;;;;;;;21016:2:1;2126:68:0;;;20998:21:1;;;21035:18;;;21028:30;21094:34;21074:18;;;21067:62;21146:18;;2126:68:0;20814:356:1;2126:68:0;45301:4:::1;45282:15;:23;;45236:136;;;::::0;::::1;::::0;;20608:2:1;45236:136:0::1;::::0;::::1;20590:21:1::0;20647:2;20627:18;;;20620:30;20686:34;20666:18;;;20659:62;20757:9;20737:18;;;20730:37;20784:19;;45236:136:0::1;20406:403:1::0;45236:136:0::1;45460:4;45441:15;;45423;45405;;:33;;;;:::i;:::-;:51;;;;:::i;:::-;:59;;45383:149;;;::::0;::::1;::::0;;22142:2:1;45383:149:0::1;::::0;::::1;22124:21:1::0;22181:2;22161:18;;;22154:30;22220:34;22200:18;;;22193:62;22291:10;22271:18;;;22264:38;22319:19;;45383:149:0::1;21940:404:1::0;45383:149:0::1;45563:11;::::0;45548:44:::1;::::0;;26189:25:1;;;26245:2;26230:18;;26223:34;;;45548:44:0::1;::::0;26162:18:1;45548:44:0::1;;;;;;;45603:11;:29:::0;45159:481::o;25631:441::-;1960:7;1987:6;2134:23;1987:6;805:10;2134:23;2126:68;;;;;;;21016:2:1;2126:68:0;;;20998:21:1;;;21035:18;;;21028:30;21094:34;21074:18;;;21067:62;21146:18;;2126:68:0;20814:356:1;2126:68:0;25723:14:::1;;25705:15;:32;25683:117;;;::::0;::::1;::::0;;18836:2:1;25683:117:0::1;::::0;::::1;18818:21:1::0;18875:2;18855:18;;;18848:30;18914:34;18894:18;;;18887:62;18985:5;18965:18;;;18958:33;19008:19;;25683:117:0::1;18634:399:1::0;25683:117:0::1;25830:8;:15:::0;25813:14:::1;25856:164;25884:6;25878:3;:12;25856:164;;;25914:21;25938:8;25947:3;25938:13;;;;;;;;:::i;:::-;;;;;;;;;;;25914:37;;25993:15;25966:4;:24;;:42;;;;25899:121;25892:5;;;;:::i;:::-;;;25856:164;;;-1:-1:-1::0;;26049:15:0::1;26032:14;:32:::0;25631:441::o;44515:265::-;4920:1;5516:7;;:19;;5508:63;;;;;;;23266:2:1;5508:63:0;;;23248:21:1;23305:2;23285:18;;;23278:30;23344:33;23324:18;;;23317:61;23395:18;;5508:63:0;23064:355:1;5508:63:0;4920:1;5649:7;:18;44617:2:::1;44601:18:::0;::::1;;44593:62;;;::::0;::::1;::::0;;14682:2:1;44593:62:0::1;::::0;::::1;14664:21:1::0;14721:2;14701:18;;;14694:30;14760:33;14740:18;;;14733:61;14811:18;;44593:62:0::1;14480:355:1::0;44593:62:0::1;44671:13;44666:107;44690:20:::0;;::::1;44666:107;;;44736:25;44745:5;;44751;44745:12;;;;;;;:::i;:::-;;;;;;;44759:1;44736:8;:25::i;:::-;44712:7;::::0;::::1;:::i;:::-;;;44666:107;;;-1:-1:-1::0;;4876:1:0;5828:22;;-1:-1:-1;44515:265:0:o;37377:110::-;4920:1;5516:7;;:19;;5508:63;;;;;;;23266:2:1;5508:63:0;;;23248:21:1;23305:2;23285:18;;;23278:30;23344:33;23324:18;;;23317:61;23395:18;;5508:63:0;23064:355:1;5508:63:0;4920:1;5649:7;:18;37456:23:::1;37465:4:::0;37471:7;37456:8:::1;:23::i;:::-;-1:-1:-1::0;;4876:1:0;5828:22;;37377:110::o;43870:453::-;1960:7;1987:6;2134:23;1987:6;805:10;2134:23;2126:68;;;;;;;21016:2:1;2126:68:0;;;20998:21:1;;;21035:18;;;21028:30;21094:34;21074:18;;;21067:62;21146:18;;2126:68:0;20814:356:1;2126:68:0;43982:18:::1;:16;:18::i;:::-;44051:10;44018:120;;;44076:8;44085:4;44076:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;44116:11;44018:120;;;;;;26189:25:1::0;;;26245:2;26230:18;;26223:34;26177:2;26162:18;;26015:248;44018:120:0::1;;;;;;;;44254:11;44213:8;44222:4;44213:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;44182:15;;:56;;;;:::i;:::-;:83;;;;:::i;:::-;44151:15;:114;;;;44304:11;44276:8;44285:4;44276:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;43870:453:::0;;:::o;34042:494::-;22285:8;:15;34162:26;;34138:4;;22278:22;;22270:54;;;;;;;16119:2:1;22270:54:0;;;16101:21:1;16158:2;16138:18;;;16131:30;16197:21;16177:18;;;16170:49;16236:18;;22270:54:0;15917:343:1;22270:54:0;34206:21:::1;34230:8;34239:4;34230:14;;;;;;;;:::i;:::-;;;;;;;;;;;34206:38;;34281:4;:14;;:21;;;;34267:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;34267:36:0::1;;34255:48;;34333:18;34314:215;34383:14;::::0;::::1;:21:::0;34370:34;::::1;34314:215;;;34490:4;:14;;34505:10;34490:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34458:9;34468:10;34458:21;;;;;;;;:::i;:::-;:59;::::0;;::::1;:21;::::0;;::::1;::::0;;;;;;;:59;34419:12:::1;::::0;::::1;:::i;:::-;;;34314:215;;;;34195:341;34042:494:::0;;;;:::o;2814:192::-;1960:7;1987:6;2134:23;1987:6;805:10;2134:23;2126:68;;;;;;;21016:2:1;2126:68:0;;;20998:21:1;;;21035:18;;;21028:30;21094:34;21074:18;;;21067:62;21146:18;;2126:68:0;20814:356:1;2126:68:0;2903:22:::1;::::0;::::1;2895:73;;;::::0;::::1;::::0;;14275:2:1;2895:73:0::1;::::0;::::1;14257:21:1::0;14314:2;14294:18;;;14287:30;14353:34;14333:18;;;14326:62;14424:8;14404:18;;;14397:36;14450:19;;2895:73:0::1;14073:402:1::0;2895:73:0::1;2979:19;2989:8;2979:9;:19::i;:::-;2814:192:::0;:::o;29801:2389::-;29950:26;29991:23;30029:25;30069:24;29912:4;22285:8;:15;;;;22278:4;:22;22270:54;;;;;;;16119:2:1;22270:54:0;;;16101:21:1;16158:2;16138:18;;;16131:30;16197:21;16177:18;;;16170:49;16236:18;;22270:54:0;15917:343:1;22270:54:0;30121:21:::1;30145:8;30154:4;30145:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;30194;;;:8:::1;:14:::0;;;;;;:21:::1;::::0;::::1;::::0;;;;;;;30253::::1;30145:14;::::0;;::::1;::::0;;::::1;30253:21:::0;;::::1;::::0;30304:12:::1;::::0;::::1;::::0;30351:24:::1;::::0;::::1;::::0;30145:14;;-1:-1:-1;30253:21:0;;30333:15:::1;:42;:59:::0;::::1;;;-1:-1:-1::0;30379:13:0;;::::1;30333:59;30329:557;;;30409:18;30448:4;:24;;;30430:15;:42;;;;:::i;:::-;30409:63;;30487:17;30597:15;;30562;;30531:11;;30507:4;:35;;;;:::i;:::-;:70;;;;:::i;:::-;:105;;;;:::i;:::-;30487:125;;30629:19;30751:4;30738:9;30719:15;;30700:4;:15;;;30668:11;;30655:10;:24;;;;:::i;:::-;30654:61;;;;:::i;:::-;30653:81;;;;:::i;:::-;30652:95;;;;:::i;:::-;30651:104;;;;:::i;:::-;30629:126:::0;-1:-1:-1;30850:8:0;30813:33:::1;30827:19;30629:126:::0;30813:33:::1;:::i;:::-;30812:46;;;;:::i;:::-;30772:102;::::0;;::::1;:::i;:::-;;;30394:492;;;30329:557;30898:20;31013:4;:19;;;30994:4;:15;;;30971:19;30938:16;30924:4;:11;;;:30;;;;:::i;:::-;30923:67;;;;:::i;:::-;30922:87;;;;:::i;:::-;30921:111;;;;:::i;:::-;31071:14;::::0;::::1;:21:::0;30898:134;;-1:-1:-1;31071:25:0::1;::::0;31095:1:::1;31071:25;:::i;:::-;31057:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;31057:40:0::1;-1:-1:-1::0;31131:14:0::1;::::0;::::1;:21:::0;31045:52;;-1:-1:-1;31131:25:0::1;::::0;31155:1:::1;31131:25;:::i;:::-;31118:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;31192:14:0::1;::::0;::::1;:21:::0;31108:49;;-1:-1:-1;31192:25:0::1;::::0;31216:1:::1;31192:25;:::i;:::-;31178:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;31178:40:0::1;-1:-1:-1::0;31254:14:0::1;::::0;::::1;:21:::0;31168:50;;-1:-1:-1;31254:25:0::1;::::0;31278:1:::1;31254:25;:::i;:::-;31240:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;31240:40:0::1;-1:-1:-1::0;31316:5:0::1;::::0;31293:12;;31229:51;;-1:-1:-1;31316:5:0::1;;::::0;31293:9;;31316:5:::1;::::0;31293:12:::1;;;;:::i;:::-;:29;::::0;;::::1;:12;::::0;;::::1;::::0;;;;;:29;31359:5:::1;::::0;31346:32:::1;::::0;31359:5:::1;31346:30;:32::i;:::-;31333:7;31341:1;31333:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:45;31416:5:::1;::::0;31403:34:::1;::::0;31416:5:::1;;31403:32;:34::i;:::-;31389:48;;:8;31398:1;31389:11;;;;;;;;:::i;:::-;;;;;;:48;;;::::0;::::1;31461:12;31448:7;31456:1;31448:10;;;;;;;;:::i;:::-;;;;;;:25;;;::::0;::::1;31505:18;31486:697;31555:14;::::0;::::1;:21:::0;31542:34;::::1;31486:697;;;31684:4;:14;;31699:10;31684:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;;;;;;:26:::1;::::0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31630:9:::0;31640:14:::1;:10:::0;31653:1:::1;31640:14;:::i;:::-;31630:25;;;;;;;;:::i;:::-;;;;;;:109;;;;;;;;;::::0;::::1;31782:99;31813:4;:14;;31828:10;31813:26;;;;;;;;:::i;31782:99::-;31756:7:::0;31764:14:::1;:10:::0;31777:1:::1;31764:14;:::i;:::-;31756:23;;;;;;;;:::i;:::-;;;;;;:125;;;;31925:101;31956:4;:14;;31971:10;31956:26;;;;;;;;:::i;31925:101::-;31898:128;;:8:::0;31907:14:::1;:10:::0;31920:1:::1;31907:14;:::i;:::-;31898:24;;;;;;;;:::i;:::-;;;;;;:128;;;::::0;::::1;32069:4;:14;;32084:10;32069:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;:102:::1;::::0;;;;::::1;::::0;::::1;24798:25:1::0;;;32069:26:0::1;24859:55:1::0;;;24839:18;;;24832:83;32069:26:0;;::::1;::::0;:40:::1;::::0;24771:18:1;;32069:102:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32043:7:::0;32051:14:::1;:10:::0;32064:1:::1;32051:14;:::i;:::-;32043:23;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:128;31591:12:::1;::::0;::::1;:::i;:::-;;;31486:697;;;;30110:2080;;;;;29801:2389:::0;;;;;;;;:::o;35147:150::-;35200:11;35195:95;35223:8;:15;35217:21;;35195:95;;;35262:16;35274:3;35262:11;:16::i;:::-;35240:5;;;:::i;:::-;;;35195:95;;35513:1368;22285:8;:15;35575:4;;22278:22;;22270:54;;;;;;;16119:2:1;22270:54:0;;;16101:21:1;16158:2;16138:18;;;16131:30;16197:21;16177:18;;;16170:49;16236:18;;22270:54:0;15917:343:1;22270:54:0;35592:21:::1;35616:8;35625:4;35616:14;;;;;;;;:::i;:::-;;;;;;;;;;;35592:38;;35666:4;:24;;;35647:15;:43;35643:82;;35707:7;35513:1368:::0;;:::o;35643:82::-:1;35756:12;::::0;::::1;::::0;35785:13;;;:37:::1;;-1:-1:-1::0;35802:15:0::1;::::0;::::1;::::0;:20;35785:37:::1;35781:133;;;-1:-1:-1::0;35866:15:0::1;35839:24;::::0;;::::1;:42:::0;35513:1368;;:::o;35781:133::-:1;35926:18;35965:4;:24;;;35947:15;:42;;;;:::i;:::-;35926:63;;36002:19;36086:15;;36054:4;:15;;;36039:11;;36026:10;:24;;;;:::i;:::-;36025:44;;;;:::i;:::-;36024:77;;;;:::i;:::-;36002:99;;36114:17;36212:15;;36181;;36154:11;;36134:4;:31;;;;:::i;:::-;:62;;;;:::i;:::-;:93;;;;:::i;:::-;36240:5;::::0;36251:11:::1;::::0;36279::::1;::::0;36114:113;;-1:-1:-1;36240:5:0::1;::::0;;::::1;::::0;:10:::1;::::0;36251:11;;::::1;::::0;36294:4:::1;::::0;36265:25:::1;::::0;:11;:25:::1;:::i;:::-;36264:34;;;;:::i;:::-;36240:59;::::0;;::::1;::::0;;;;;;9879:42:1;9867:55;;;36240:59:0::1;::::0;::::1;9849:74:1::0;9939:18;;;9932:34;9822:18;;36240:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36310:5:0::1;::::0;36321:15:::1;::::0;36353::::1;::::0;36310:5:::1;::::0;;::::1;::::0;-1:-1:-1;36310:10:0::1;::::0;-1:-1:-1;36321:15:0;::::1;::::0;36372:4:::1;::::0;36339:29:::1;::::0;:11;:29:::1;:::i;:::-;36338:38;;;;:::i;:::-;36310:67;::::0;;::::1;::::0;;;;;;9879:42:1;9867:55;;;36310:67:0::1;::::0;::::1;9849:74:1::0;9939:18;;;9932:34;9822:18;;36310:67:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36388:5:0::1;::::0;36399:15:::1;::::0;36431::::1;::::0;36388:5:::1;::::0;;::::1;::::0;-1:-1:-1;36388:10:0::1;::::0;-1:-1:-1;36399:15:0;::::1;::::0;36450:4:::1;::::0;36417:29:::1;::::0;:11;:29:::1;:::i;:::-;36416:38;;;;:::i;:::-;36388:67;::::0;;::::1;::::0;;;;;;9879:42:1;9867:55;;;36388:67:0::1;::::0;::::1;9849:74:1::0;9939:18;;;9932:34;9822:18;;36388:67:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36466:5:0::1;::::0;::::1;;::::0;-1:-1:-1;36466:10:0::1;::::0;-1:-1:-1;36485:4:0::1;36520;36493:23;36507:9:::0;36493:11;:23:::1;:::i;:::-;36492:32;;;;:::i;:::-;36466:59;::::0;;::::1;::::0;;;;;;9879:42:1;9867:55;;;36466:59:0::1;::::0;::::1;9849:74:1::0;9939:18;;;9932:34;9822:18;;36466:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36658:4;36632:9;36616:4;:12;;;36593:19;36579:11;:33;;;;:::i;:::-;36578:50;;;;:::i;:::-;36577:64;;;;:::i;:::-;36576:86;;;;:::i;:::-;36538:4;:21;;;:124;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36702:15:0::1;36675:24;::::0;::::1;:42:::0;;;36841:21:::1;::::0;::::1;::::0;36735:138:::1;::::0;;26470:25:1;;;26526:2;26511:18;;26504:34;;;26554:18;;26547:34;36760:4:0;;36735:138:::1;::::0;26458:2:1;26443:18;36735:138:0::1;;;;;;;35581:1300;;;;;22335:1;35513:1368:::0;;:::o;41712:1178::-;41779:21;41803:8;41812:4;41803:14;;;;;;;;:::i;:::-;;;;;;;;;41852;;;:8;:14;;;;;;41867:10;41852:26;;;;;;;41895:21;;;;41803:14;;;;;;;;-1:-1:-1;41895:26:0;:63;;;;;41944:14;;41925:15;:33;;41895:63;41891:158;;;42017:20;;;;41999:38;;:15;:38;:::i;:::-;41975:21;;;:62;41891:158;42061:15;42156:4;:15;;;42133:19;42095:4;:21;;;42081:4;:11;;;:35;;;;:::i;:::-;42080:72;;;;:::i;:::-;42079:92;;;;:::i;:::-;42061:110;;42188:28;42199:4;42205:10;42188;:28::i;:::-;42184:699;;;42247:1;42237:7;:11;:38;;;;42274:1;42252:4;:19;;;:23;42237:38;42233:452;;;42296:22;42331:4;:19;;;42321:7;:29;;;;:::i;:::-;42296:54;;42428:4;:19;;;42404:20;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;;42488:1:0;42466:19;;;:23;42550:20;;;;42532:38;;:15;:38;:::i;:::-;42508:21;;;:62;42624:45;42642:10;42654:14;42624:17;:45::i;:::-;42277:408;42233:452;42184:699;;;42706:11;;42702:181;;42758:7;42734:20;;:31;;;;;;;:::i;:::-;;;;;;;;42803:7;42780:4;:19;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;42830:41:0;;24588:25:1;;;42857:4:0;;42845:10;;42830:41;;24576:2:1;24561:18;42830:41:0;;;;;;;42702:181;41768:1122;;;41712:1178;:::o;18070:407::-;18264:48;;;18230:19;9867:55:1;;;18264:48:0;;;9849:74:1;9939:18;;;;9932:34;;;18264:48:0;;;;;;;;;;9822:18:1;;;;18264:48:0;;;;;;;;;18287:12;18264:48;;;18230:93;;-1:-1:-1;;;;18230:19:0;;;;:93;;18264:48;18230:93;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18194:129;;;;18356:7;:57;;;;-1:-1:-1;18368:11:0;;:16;;:44;;;18399:4;18388:24;;;;;;;;;;;;:::i;:::-;18334:135;;;;;;;13566:2:1;18334:135:0;;;13548:21:1;13605:2;13585:18;;;13578:30;13644;13624:18;;;13617:58;13692:18;;18334:135:0;13364:352:1;18334:135:0;18183:294;;18070:407;;;:::o;16476:310::-;16673:34;;;;;;;;;;;;;;;;;;16696:10;16673:34;;;16633:85;;16566:13;;16598:12;;;;16633:25;;;;:85;;16673:34;16633:85;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16597:121;;;;16736:7;:42;;;;;;;;;;;;;;;;;;;;;;16746:24;16765:4;16746:18;:24::i;:::-;16729:49;16476:310;-1:-1:-1;;;;16476:310:0:o;17501:293::-;17660:36;;;;;;;;;;;;;;;;;;17683:12;17660:36;;;17620:87;;17566:5;;;;;;17620:25;;;;:87;;17660:36;17620:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17584:123;;;;17725:7;:28;;;;;17736:4;:11;17751:2;17736:17;17725:28;:61;;17784:2;17725:61;;;17767:4;17756:25;;;;;;;;;;;;:::i;37540:1595::-;22285:8;:15;37634:4;;22278:22;;22270:54;;;;;;;16119:2:1;22270:54:0;;;16101:21:1;16158:2;16138:18;;;16131:30;16197:21;16177:18;;;16170:49;16236:18;;22270:54:0;15917:343:1;22270:54:0;37656:21:::1;37680:8;37689:4;37680:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;37729;;;:8:::1;:14:::0;;;;;;37744:10:::1;37729:26:::0;;;;;;;37680:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;37768:17:0::1;37738:4:::0;37768:11:::1;:17::i;:::-;37798:29;37822:4;37798:23;:29::i;:::-;37844:11:::0;;37840:738:::1;;37896:12:::0;;:37:::1;::::0;;;;37927:4:::1;37896:37;::::0;::::1;8489:74:1::0;37872:21:0::1;::::0;37896:12:::1;;::::0;:22:::1;::::0;8462:18:1;;37896:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37948:12:::0;;37872:61;;-1:-1:-1;37948:65:0::1;::::0;:12:::1;;37978:10;37998:4;38005:7:::0;37948:29:::1;:65::i;:::-;38051:12:::0;;:37:::1;::::0;;;;38082:4:::1;38051:37;::::0;::::1;8489:74:1::0;38028:20:0::1;::::0;38051:12:::1;;::::0;:22:::1;::::0;8462:18:1;;38051:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38028:60:::0;-1:-1:-1;38115:28:0::1;38130:13:::0;38028:60;38115:28:::1;:::i;:::-;38164:17;::::0;::::1;::::0;38105:38;;-1:-1:-1;38164:17:0::1;;:21:::0;38160:244:::1;;38238:17;::::0;::::1;::::0;38206:18:::1;::::0;38259:5:::1;::::0;38228:27:::1;::::0;38238:17:::1;;38228:7:::0;:27:::1;:::i;:::-;38227:37;;;;:::i;:::-;38309:15;::::0;38283:12;;38206:58;;-1:-1:-1;38283:54:0::1;::::0;38309:15:::1;38283:12:::0;;::::1;::::0;38309:15:::1;38206:58:::0;38283:25:::1;:54::i;:::-;38368:20;38378:10:::0;38368:7;:20:::1;:::i;:::-;38358:30;;38187:217;38160:244;38435:7;38420:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;38496:5:0::1;::::0;38471:12;;38496:5:::1;38471:12:::0;;::::1;38496:5:::0;::::1;38463:39;38459:108;;;38544:7;38523:17;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;38459:108:0::1;37857:721;;37840:738;38634:21;::::0;::::1;::::0;38620:11;;38672:19:::1;::::0;38620:35:::1;::::0;::::1;:::i;:::-;38619:72;;;;:::i;:::-;38588:15;::::0;::::1;:103:::0;38723:18:::1;38704:293;38773:14;::::0;::::1;:21:::0;38760:34;::::1;38704:293;;;38848:4;:14;;38863:10;38848:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;38959:11;;38848:137:::1;::::0;;;;::::1;::::0;::::1;25136:25:1::0;;;38930:10:0::1;25177:18:1::0;;;25170:83;25269:18;;;25262:34;;;;38848:26:0::1;::::0;;::::1;::::0;:40:::1;::::0;25109:18:1;;38848:137:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38809:12;;;;:::i;:::-;;;38704:293;;;-1:-1:-1::0;39013:11:0;;39009:67:::1;;39057:7;39041:4;:12;;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;39009:67:0::1;39093:34;::::0;24588:25:1;;;39113:4:0;;39101:10:::1;::::0;39093:34:::1;::::0;24576:2:1;24561:18;39093:34:0::1;;;;;;;37645:1490;;37540:1595:::0;;;:::o;3014:173::-;3070:16;3089:6;;;3106:17;;;;;;;;;;3139:40;;3089:6;;;;;;;3139:40;;3070:16;3139:40;3059:128;3014:173;:::o;43005:630::-;43119:17;;43086:5;;:30;;;;;43110:4;43086:30;;;8489:74:1;43086:5:0;;;;;:15;;8462:18:1;;43086:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;43082:546;;;43402:17;;43352:5;;:30;;;;;43376:4;43352:30;;;8489:74:1;43333:16:0;;43402:17;43352:5;;;:15;;8462:18:1;;43352:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;;;:::i;:::-;43333:86;;43449:8;43438:7;:19;43434:183;;43478:5;;:33;;:5;;43497:3;43502:8;43478:18;:33::i;:::-;43138:490;43005:630;;:::o;43434:183::-;43537:11;;43533:84;;43569:5;;:32;;:5;;43588:3;43593:7;43569:18;:32::i;15651:619::-;15748:13;15798:2;15783:4;:11;:17;15779:484;;15835:4;15824:26;;;;;;;;;;;;:::i;:::-;15817:33;15651:619;-1:-1:-1;;15651:619:0:o;15779:484::-;15872:4;:11;15887:2;15872:17;15868:395;;;15906:7;15932:69;15943:2;15939:1;:6;;;:22;;;;;15949:4;15954:1;15949:7;;;;;;;;;;:::i;:::-;;;;;;;:12;;15939:22;15932:69;;;15982:3;;;;:::i;:::-;;;;15932:69;;;16015:23;16051:1;16041:12;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16041:12:0;;16015:38;;16077:1;16073:5;;16068:99;16084:2;16080:1;:6;;;:22;;;;;16090:4;16095:1;16090:7;;;;;;;;;;:::i;:::-;;;;;;;:12;;16080:22;16068:99;;;16144:4;16149:1;16144:7;;;;;;;;;;:::i;:::-;;;;;;;;;16128:10;16139:1;16128:13;;;;;;;;;;:::i;:::-;;;;:23;;;;;;;;;;-1:-1:-1;16104:3:0;;;;:::i;:::-;;;;16068:99;;;16195:10;15651:619;-1:-1:-1;;;15651:619:0:o;15868:395::-;-1:-1:-1;;16239:12:0;;;;;;;;;;;;;;;;;;15651:619::o;15868:395::-;15651:619;;;:::o;18800:449::-;19021:59;;;18987:19;8855:15:1;;;19021:59:0;;;8837:34:1;8907:15;;;8887:18;;;8880:43;8939:18;;;;8932:34;;;19021:59:0;;;;;;;;;;8749:18:1;;;;19021:59:0;;;;;;;;;19044:17;19021:59;;;18987:104;;-1:-1:-1;;;;18987:19:0;;;;:104;;19021:59;18987:104;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18951:140;;;;19124:7;:57;;;;-1:-1:-1;19136:11:0;;:16;;:44;;;19167:4;19156:24;;;;;;;;;;;;:::i;:::-;19102:139;;;;;;;22551:2:1;19102:139:0;;;22533:21:1;;;22570:18;;;22563:30;22629:34;22609:18;;;22602:62;22681:18;;19102:139:0;22349:356:1;19102:139:0;18940:309;;18800:449;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:385:1;95:8;105:6;159:3;152:4;144:6;140:17;136:27;126:55;;177:1;174;167:12;126:55;-1:-1:-1;200:20:1;;243:18;232:30;;229:50;;;275:1;272;265:12;229:50;312:4;304:6;300:17;288:29;;372:3;365:4;355:6;352:1;348:14;340:6;336:27;332:38;329:47;326:67;;;389:1;386;379:12;326:67;14:385;;;;;:::o;404:159::-;471:20;;531:6;520:18;;510:29;;500:57;;553:1;550;543:12;568:247;627:6;680:2;668:9;659:7;655:23;651:32;648:52;;;696:1;693;686:12;648:52;735:9;722:23;754:31;779:5;754:31;:::i;820:455::-;906:6;914;967:2;955:9;946:7;942:23;938:32;935:52;;;983:1;980;973:12;935:52;1023:9;1010:23;1056:18;1048:6;1045:30;1042:50;;;1088:1;1085;1078:12;1042:50;1127:88;1207:7;1198:6;1187:9;1183:22;1127:88;:::i;:::-;1234:8;;1101:114;;-1:-1:-1;820:455:1;-1:-1:-1;;;;820:455:1:o;1280:277::-;1347:6;1400:2;1388:9;1379:7;1375:23;1371:32;1368:52;;;1416:1;1413;1406:12;1368:52;1448:9;1442:16;1501:5;1494:13;1487:21;1480:5;1477:32;1467:60;;1523:1;1520;1513:12;1562:271;1652:6;1705:2;1693:9;1684:7;1680:23;1676:32;1673:52;;;1721:1;1718;1711:12;1673:52;1753:9;1747:16;1772:31;1797:5;1772:31;:::i;2114:943::-;2194:6;2247:2;2235:9;2226:7;2222:23;2218:32;2215:52;;;2263:1;2260;2253:12;2215:52;2296:9;2290:16;2325:18;2366:2;2358:6;2355:14;2352:34;;;2382:1;2379;2372:12;2352:34;2420:6;2409:9;2405:22;2395:32;;2465:7;2458:4;2454:2;2450:13;2446:27;2436:55;;2487:1;2484;2477:12;2436:55;2516:2;2510:9;2538:2;2534;2531:10;2528:36;;;2544:18;;:::i;:::-;2678:2;2672:9;2740:4;2732:13;;2583:66;2728:22;;;2752:2;2724:31;2720:40;2708:53;;;2776:18;;;2796:22;;;2773:46;2770:72;;;2822:18;;:::i;:::-;2862:10;2858:2;2851:22;2897:2;2889:6;2882:18;2937:7;2932:2;2927;2923;2919:11;2915:20;2912:33;2909:53;;;2958:1;2955;2948:12;2909:53;2971:55;3023:2;3018;3010:6;3006:15;3001:2;2997;2993:11;2971:55;:::i;:::-;3045:6;2114:943;-1:-1:-1;;;;;;;2114:943:1:o;3062:180::-;3121:6;3174:2;3162:9;3153:7;3149:23;3145:32;3142:52;;;3190:1;3187;3180:12;3142:52;-1:-1:-1;3213:23:1;;3062:180;-1:-1:-1;3062:180:1:o;3247:184::-;3317:6;3370:2;3358:9;3349:7;3345:23;3341:32;3338:52;;;3386:1;3383;3376:12;3338:52;-1:-1:-1;3409:16:1;;3247:184;-1:-1:-1;3247:184:1:o;3436:315::-;3504:6;3512;3565:2;3553:9;3544:7;3540:23;3536:32;3533:52;;;3581:1;3578;3571:12;3533:52;3617:9;3604:23;3594:33;;3677:2;3666:9;3662:18;3649:32;3690:31;3715:5;3690:31;:::i;:::-;3740:5;3730:15;;;3436:315;;;;;:::o;3756:844::-;3921:6;3929;3937;3945;3953;3961;4014:3;4002:9;3993:7;3989:23;3985:33;3982:53;;;4031:1;4028;4021:12;3982:53;4067:9;4054:23;4044:33;;4127:2;4116:9;4112:18;4099:32;4140:31;4165:5;4140:31;:::i;:::-;4190:5;-1:-1:-1;4214:37:1;4247:2;4232:18;;4214:37;:::i;:::-;4204:47;;4298:2;4287:9;4283:18;4270:32;4260:42;;4353:3;4342:9;4338:19;4325:33;4381:18;4373:6;4370:30;4367:50;;;4413:1;4410;4403:12;4367:50;4452:88;4532:7;4523:6;4512:9;4508:22;4452:88;:::i;:::-;3756:844;;;;-1:-1:-1;3756:844:1;;-1:-1:-1;3756:844:1;;4559:8;;3756:844;-1:-1:-1;;;3756:844:1:o;4605:248::-;4673:6;4681;4734:2;4722:9;4713:7;4709:23;4705:32;4702:52;;;4750:1;4747;4740:12;4702:52;-1:-1:-1;;4773:23:1;;;4843:2;4828:18;;;4815:32;;-1:-1:-1;4605:248:1:o;4858:757::-;5003:6;5011;5019;5027;5035;5043;5096:3;5084:9;5075:7;5071:23;5067:33;5064:53;;;5113:1;5110;5103:12;5064:53;5149:9;5136:23;5126:33;;5206:2;5195:9;5191:18;5178:32;5168:42;;5229:37;5262:2;5251:9;5247:18;5229:37;:::i;5620:586::-;5722:6;5730;5738;5746;5754;5762;5815:3;5803:9;5794:7;5790:23;5786:33;5783:53;;;5832:1;5829;5822:12;5783:53;5868:9;5855:23;5845:33;;5925:2;5914:9;5910:18;5897:32;5887:42;;5976:2;5965:9;5961:18;5948:32;5938:42;;6030:2;6019:9;6015:18;6002:32;6043:29;6066:5;6043:29;:::i;:::-;5620:586;;;;-1:-1:-1;5620:586:1;;6143:3;6128:19;;6115:33;;6195:3;6180:19;;;6167:33;;-1:-1:-1;5620:586:1;-1:-1:-1;;5620:586:1:o;6211:247::-;6279:6;6332:2;6320:9;6311:7;6307:23;6303:32;6300:52;;;6348:1;6345;6338:12;6300:52;6380:9;6374:16;6399:29;6422:5;6399:29;:::i;6463:484::-;6516:3;6554:5;6548:12;6581:6;6576:3;6569:19;6607:4;6636:2;6631:3;6627:12;6620:19;;6673:2;6666:5;6662:14;6694:1;6704:218;6718:6;6715:1;6712:13;6704:218;;;6783:13;;6798:42;6779:62;6767:75;;6862:12;;;;6897:15;;;;6740:1;6733:9;6704:218;;;-1:-1:-1;6938:3:1;;6463:484;-1:-1:-1;;;;;6463:484:1:o;6952:435::-;7005:3;7043:5;7037:12;7070:6;7065:3;7058:19;7096:4;7125:2;7120:3;7116:12;7109:19;;7162:2;7155:5;7151:14;7183:1;7193:169;7207:6;7204:1;7201:13;7193:169;;;7268:13;;7256:26;;7302:12;;;;7337:15;;;;7229:1;7222:9;7193:169;;7392:667;7587:3;7618;7665:6;7587:3;7699:333;7713:6;7710:1;7707:13;7699:333;;;7788:6;7775:20;7808:31;7833:5;7808:31;:::i;:::-;7877:42;7866:54;7852:69;;7944:4;7970:14;;;;8007:15;;;;;7735:1;7728:9;7699:333;;;-1:-1:-1;8048:5:1;;7392:667;-1:-1:-1;;;;;7392:667:1:o;8064:274::-;8193:3;8231:6;8225:13;8247:53;8293:6;8288:3;8281:4;8273:6;8269:17;8247:53;:::i;:::-;8316:16;;;;;8064:274;-1:-1:-1;;8064:274:1:o;9977:261::-;10156:2;10145:9;10138:21;10119:4;10176:56;10228:2;10217:9;10213:18;10205:6;10176:56;:::i;10243:1627::-;10676:3;10665:9;10658:22;10639:4;10703:57;10755:3;10744:9;10740:19;10732:6;10703:57;:::i;:::-;10779:2;10829:9;10821:6;10817:22;10812:2;10801:9;10797:18;10790:50;10860:6;10895;10889:13;10926:6;10918;10911:22;10961:2;10953:6;10949:15;10942:22;;11020:2;11010:6;11007:1;11003:14;10995:6;10991:27;10987:36;11058:2;11050:6;11046:15;11079:1;11089:529;11103:6;11100:1;11097:13;11089:529;;;11162:66;11278:2;11269:6;11261;11257:19;11253:28;11248:3;11241:41;11311:6;11305:13;11353:2;11347:9;11384:8;11376:6;11369:24;11406:61;11458:8;11453:2;11445:6;11441:15;11436:2;11432;11428:11;11406:61;:::i;:::-;11596:12;;;;11524:2;11510:17;11506:26;;;11494:39;;;;11490:48;;;-1:-1:-1;11561:15:1;;;;11125:1;11118:9;11089:529;;;11093:3;;11666:9;11658:6;11654:22;11649:2;11638:9;11634:18;11627:50;11700:44;11737:6;11729;11700:44;:::i;:::-;11686:58;;;;;;11792:9;11784:6;11780:22;11775:2;11764:9;11760:18;11753:50;11820:44;11857:6;11849;11820:44;:::i;26988:128::-;27028:3;27059:1;27055:6;27052:1;27049:13;27046:39;;;27065:18;;:::i;:::-;-1:-1:-1;27101:9:1;;26988:128::o;27121:274::-;27161:1;27187;27177:189;;27222:77;27219:1;27212:88;27323:4;27320:1;27313:15;27351:4;27348:1;27341:15;27177:189;-1:-1:-1;27380:9:1;;27121:274::o;27400:228::-;27440:7;27566:1;27498:66;27494:74;27491:1;27488:81;27483:1;27476:9;27469:17;27465:105;27462:131;;;27573:18;;:::i;:::-;-1:-1:-1;27613:9:1;;27400:228::o;27633:125::-;27673:4;27701:1;27698;27695:8;27692:34;;;27706:18;;:::i;:::-;-1:-1:-1;27743:9:1;;27633:125::o;27763:258::-;27835:1;27845:113;27859:6;27856:1;27853:13;27845:113;;;27935:11;;;27929:18;27916:11;;;27909:39;27881:2;27874:10;27845:113;;;27976:6;27973:1;27970:13;27967:48;;;-1:-1:-1;;28011:1:1;27993:16;;27986:27;27763:258::o;28026:195::-;28065:3;28096:66;28089:5;28086:77;28083:103;;;28166:18;;:::i;:::-;-1:-1:-1;28213:1:1;28202:13;;28026:195::o;28226:175::-;28263:3;28307:4;28300:5;28296:16;28336:4;28327:7;28324:17;28321:43;;;28344:18;;:::i;:::-;28393:1;28380:15;;28226:175;-1:-1:-1;;28226:175:1:o;28406:184::-;28458:77;28455:1;28448:88;28555:4;28552:1;28545:15;28579:4;28576:1;28569:15;28595:184;28647:77;28644:1;28637:88;28744:4;28741:1;28734:15;28768:4;28765:1;28758:15;28784:184;28836:77;28833:1;28826:88;28933:4;28930:1;28923:15;28957:4;28954:1;28947:15;28973:154;29059:42;29052:5;29048:54;29041:5;29038:65;29028:93;;29117:1;29114;29107:12;29132:114;29216:4;29209:5;29205:16;29198:5;29195:27;29185:55;;29236:1;29233;29226:12
Swarm Source
ipfs://6c72d31bca8a003d2d27cfd92bf840e1e233fe8f9b3e35dd554947ab2669a0e1
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.