More Info
Private Name Tags
ContractCreator
Multi Chain
Multichain Addresses
12 addresses found via
Latest 25 from a total of 1,788 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 17638988 | 84 days 7 hrs ago | IN | 0 ETH | 0.00588653 | ||||
Withdraw | 17265152 | 136 days 21 hrs ago | IN | 0 ETH | 0.01120642 | ||||
Withdraw | 17023179 | 171 days 3 hrs ago | IN | 0 ETH | 0.00500288 | ||||
Get Reward | 17023168 | 171 days 3 hrs ago | IN | 0 ETH | 0.00181587 | ||||
Get Reward | 17020502 | 171 days 12 hrs ago | IN | 0 ETH | 0.00312939 | ||||
Withdraw | 17020490 | 171 days 12 hrs ago | IN | 0 ETH | 0.00593549 | ||||
Withdraw | 16998474 | 174 days 15 hrs ago | IN | 0 ETH | 0.00548633 | ||||
Get Reward | 16998301 | 174 days 16 hrs ago | IN | 0 ETH | 0.00187147 | ||||
Get Reward | 16760967 | 208 days 2 hrs ago | IN | 0 ETH | 0.00144193 | ||||
Exit | 16665603 | 221 days 11 hrs ago | IN | 0 ETH | 0.00532278 | ||||
Get Reward | 16663335 | 221 days 19 hrs ago | IN | 0 ETH | 0.00252669 | ||||
Exit | 16661318 | 222 days 2 hrs ago | IN | 0 ETH | 0.00619362 | ||||
Exit | 16584081 | 232 days 21 hrs ago | IN | 0 ETH | 0.01002721 | ||||
Exit | 16551070 | 237 days 12 hrs ago | IN | 0 ETH | 0.01009996 | ||||
Get Reward | 16524154 | 241 days 6 hrs ago | IN | 0 ETH | 0.00203327 | ||||
Withdraw | 16523994 | 241 days 7 hrs ago | IN | 0 ETH | 0.0052345 | ||||
Withdraw | 16492181 | 245 days 17 hrs ago | IN | 0 ETH | 0.01178491 | ||||
Exit | 16464011 | 249 days 16 hrs ago | IN | 0 ETH | 0.00509971 | ||||
Exit | 16447376 | 251 days 23 hrs ago | IN | 0 ETH | 0.00425824 | ||||
Get Reward | 16447341 | 252 days 6 mins ago | IN | 0 ETH | 0.00180069 | ||||
Withdraw | 16447323 | 252 days 10 mins ago | IN | 0 ETH | 0.0037414 | ||||
Get Reward | 16437910 | 253 days 7 hrs ago | IN | 0 ETH | 0.00273248 | ||||
Exit | 16404798 | 257 days 22 hrs ago | IN | 0 ETH | 0.00547331 | ||||
Get Reward | 16322576 | 269 days 10 hrs ago | IN | 0 ETH | 0.00128036 | ||||
Withdraw | 16322550 | 269 days 10 hrs ago | IN | 0 ETH | 0.0043716 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
YAMIncentivizerWithVoting
Compiler Version
v0.5.15+commit.6a57276f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-09 */ /* ____ __ __ __ _ / __/__ __ ___ / /_ / / ___ / /_ (_)__ __ _\ \ / // // _ \/ __// _ \/ -_)/ __// / \ \ / /___/ \_, //_//_/\__//_//_/\__/ \__//_/ /_\_\ /___/ * Synthetix: YAMIncentives.sol * * Docs: https://docs.synthetix.io/ * * * MIT License * =========== * * Copyright (c) 2020 Synthetix * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE */ // File: @openzeppelin/contracts/math/Math.sol pragma solidity 0.5.15; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity 0.5.15; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity 0.5.15; /* * @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 GSN 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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/ownership/Ownable.sol pragma solidity 0.5.15; /** * @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. * * 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. */ 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 () internal { _owner = _msgSender(); emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _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 onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity 0.5.15; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); function mint(address account, uint amount) external; /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity 0.5.15; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * 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. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != 0x0 && codehash != accountHash); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @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]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity 0.5.15; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/IRewardDistributionRecipient.sol pragma solidity 0.5.15; contract IRewardDistributionRecipient is Ownable { address public rewardDistribution; function notifyRewardAmount(uint256 reward) external; modifier onlyRewardDistribution() { require(_msgSender() == rewardDistribution, "Caller is not reward distribution"); _; } function setRewardDistribution(address _rewardDistribution) external onlyOwner { rewardDistribution = _rewardDistribution; } } // File: contracts/CurveRewards.sol pragma solidity 0.5.15; interface MasterChef { function deposit(uint256, uint256) external; function withdraw(uint256, uint256) external; function emergencyWithdraw(uint256) external; } interface SushiBar { function enter(uint256) external; function leave(uint256) external; } contract LPTokenWrapper is Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; // -- yam things IERC20 public slp = IERC20(0x0F82E57804D0B1F6FAb2370A43dcFAd3c7cB239c); IERC20 public yam = IERC20(0x0AaCfbeC6a24756c20D41914F2caba817C0d8521); address public reserves = address(0x97990B693835da58A281636296D2Bf02787DEa17); // -- Sushi things IERC20 public sushi = IERC20(0x6B3595068778DD592e39A122f4f5a5cF09C90fE2); SushiBar public sushibar = SushiBar(0x8798249c2E607446EfB7Ad49eC89dD1865Ff4272); MasterChef public masterchef = MasterChef(0xc2EdaD668740f1aA35E4D8f227fB8E17dcA888Cd); uint256 public pid = 44; // YAM/ETH pool id bool public chefEmergency; // approve masterchef on initiation constructor () internal { slp.approve(address(masterchef), uint256(-1)); } uint256 public minBlockBeforeVoting; bool public minBlockSet; uint256 private _totalSupply; uint256 public constant BASE = 10**18; mapping(address => uint256) private _balances; mapping(address => address) public delegates; /// @notice A checkpoint for marking number of lp tokens staked from a given block struct Checkpoint { uint32 fromBlock; uint256 lpStake; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The number of checkpoints for total supply mapping (uint32 => Checkpoint) public totalSupplyCheckpoints; uint32 public numSupplyCheckpoints; function totalSupply() public view returns (uint256) { return _totalSupply; } function balanceOf(address account) public view returns (uint256) { return _balances[account]; } function delegate(address delegatee) public { _delegate(msg.sender, delegatee); } function _delegate(address delegator, address delegatee) internal { address currentDelegate = delegates[msg.sender]; uint256 delegatorBalance = _balances[msg.sender]; delegates[msg.sender] = delegatee; _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].lpStake : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].lpStake : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepNew); } } } function stake(uint256 amount) public { _totalSupply = _totalSupply.add(amount); uint256 new_bal = _balances[msg.sender].add(amount); _balances[msg.sender] = new_bal; address delegate = delegates[msg.sender]; if (delegate == address(0)) { delegates[msg.sender] = msg.sender; delegate = msg.sender; } _moveDelegates(address(0), delegate, amount); _writeSupplyCheckpoint(); // deposit here slp.safeTransferFrom(msg.sender, address(this), amount); // deposit to masterchef depositToMasterChef(amount); } function withdraw(uint256 amount) public { _totalSupply = _totalSupply.sub(amount); uint256 new_bal = _balances[msg.sender].sub(amount); _balances[msg.sender] = new_bal; _moveDelegates(delegates[msg.sender], address(0), amount); _writeSupplyCheckpoint(); // withdraw from masterchef withdrawFromMasterChef(amount); // send to user slp.safeTransfer(msg.sender, amount); } function depositToMasterChef(uint256 amount) internal { // LP token allowance does not decrease when set to -1 if (!chefEmergency) { masterchef.deposit(pid, amount); } } function withdrawFromMasterChef(uint256 amount) internal { if (!chefEmergency) { masterchef.withdraw(pid, amount); } } // callable by anyone, this function sweeps earned rewards into sushibar function sweepToXSushi() public { masterchef.withdraw(pid, 0); uint256 sushi_bal = sushi.balanceOf(address(this)); if (sushi.allowance(address(this), address(sushibar)) < sushi_bal) { sushi.approve(address(sushibar), uint256(-1)); } sushibar.enter(sushi_bal); } function sushiToReserves(uint256 xsushi_amt) public { require(owner() == msg.sender, "!owner"); // if -1, sweep all if (xsushi_amt == uint256(-1)) { xsushi_amt = IERC20(address(sushibar)).balanceOf(address(this)); } sushibar.leave(xsushi_amt); sushi.transfer(reserves, sushi.balanceOf(address(this))); } function setReserves(address newReserves) public { require(owner() == msg.sender, "!owner"); reserves = newReserves; } function emergencyMasterChefWithdraw() public { require(owner() == msg.sender, "!owner"); masterchef.emergencyWithdraw(pid); chefEmergency = true; } function reenableChef() public { require(owner() == msg.sender, "!owner"); require(chefEmergency, "!emergency"); masterchef.deposit(pid, slp.balanceOf(address(this))); chefEmergency = false; } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { if (!minBlockSet || block.number < minBlockBeforeVoting) { return 0; } uint256 poolVotes = YAM(address(yam)).getCurrentVotes(address(slp)); uint32 nCheckpoints = numCheckpoints[account]; uint256 lpStake = nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].lpStake : 0; uint256 percOfVotes = lpStake.mul(BASE).div(_totalSupply); return poolVotes.mul(percOfVotes).div(BASE); } function getPriorVotes(address account, uint256 blockNumber) public view returns (uint256) { require(blockNumber < block.number, "Incentivizer::getPriorVotes: not yet determined"); if (!minBlockSet || blockNumber < minBlockBeforeVoting) { return 0; } // get incentivizer's uniswap pool yam votes uint256 poolVotes = YAM(address(yam)).getPriorVotes(address(slp), blockNumber); if (poolVotes == 0) { return 0; } // get prior stake uint256 priorStake = _getPriorLPStake(account, blockNumber); if (priorStake == 0) { return 0; } // get prior LP stake uint256 lpTotalSupply = getPriorSupply(blockNumber); if (lpTotalSupply == 0) { return 0; } // get percent ownership of staked LPs uint256 percentOfVote = priorStake.mul(BASE).div(lpTotalSupply); // votes * percentage / percentage max // note: this will overestimate the number of votes based on // % of LP pool tokens staked here return poolVotes.mul(percentOfVote).div(BASE); } function getPriorLPStake(address account, uint256 blockNumber) public view returns (uint256) { require(blockNumber < block.number, "Incentivizer::_getPriorLPStake: not yet determined"); return _getPriorLPStake(account, blockNumber); } function _getPriorLPStake(address account, uint256 blockNumber) internal view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].lpStake; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.lpStake; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].lpStake; } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 newStake ) internal { // this means this contract can lock funds in approximately 1766 years from now. uint32 blockNumber = safe32(block.number, "Incentivizer::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].lpStake = newStake; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newStake); numCheckpoints[delegatee] = nCheckpoints + 1; } } function _writeSupplyCheckpoint() internal { uint32 blockNumber = safe32(block.number, "Incentivizer::_writeSupplyCheckpoint: block number exceeds 32 bits"); // overwrite totalSupplyCheckpoint for block, increment counter if needed if (numSupplyCheckpoints > 0 && totalSupplyCheckpoints[numSupplyCheckpoints - 1].fromBlock == blockNumber) { totalSupplyCheckpoints[numSupplyCheckpoints - 1].lpStake = _totalSupply; } else { totalSupplyCheckpoints[numSupplyCheckpoints] = Checkpoint(blockNumber, _totalSupply); numSupplyCheckpoints += 1; } } function getPriorSupply(uint256 blockNumber) public view returns (uint256) { if (numSupplyCheckpoints == 0) { return 0; } // First check most recent balance if (totalSupplyCheckpoints[numSupplyCheckpoints - 1].fromBlock <= blockNumber) { return totalSupplyCheckpoints[numSupplyCheckpoints - 1].lpStake; } // Next check implicit zero balance if (totalSupplyCheckpoints[0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = numSupplyCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = totalSupplyCheckpoints[center]; if (cp.fromBlock == blockNumber) { return cp.lpStake; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return totalSupplyCheckpoints[lower].lpStake; } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function setMinBlockBeforeVoting(uint256 blockNum) external { // only gov require(msg.sender == owner(), "!governance"); require(!minBlockSet, "minBlockSet"); minBlockBeforeVoting = blockNum; minBlockSet = true; } } interface YAM { function yamsScalingFactor() external returns (uint256); function mint(address to, uint256 amount) external; function getPriorVotes(address account, uint256 blockNumber) external view returns (uint256); function getCurrentVotes(address account) external view returns (uint256); } contract YAMIncentivizerWithVoting is LPTokenWrapper, IRewardDistributionRecipient { uint256 public constant DURATION = 7 days; uint256 public initreward = 5000 * 10**18; // 5000 yams uint256 public starttime = 1605204000; // Thursday, November 12, 2020 18:00:00 GMT uint256 public periodFinish = 0; uint256 public rewardRate = 0; uint256 public lastUpdateTime; uint256 public rewardPerTokenStored; bool public initialized = false; bool public breaker; mapping(address => uint256) public userRewardPerTokenPaid; mapping(address => uint256) public rewards; event RewardAdded(uint256 reward); event Staked(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event RewardPaid(address indexed user, uint256 reward); modifier updateReward(address account) { rewardPerTokenStored = rewardPerToken(); lastUpdateTime = lastTimeRewardApplicable(); if (account != address(0)) { rewards[account] = earned(account); userRewardPerTokenPaid[account] = rewardPerTokenStored; } _; } function lastTimeRewardApplicable() public view returns (uint256) { return Math.max(starttime, Math.min(block.timestamp, periodFinish)); } function rewardPerToken() public view returns (uint256) { if (totalSupply() == 0) { return rewardPerTokenStored; } return rewardPerTokenStored.add( lastTimeRewardApplicable() .sub(lastUpdateTime) .mul(rewardRate) .mul(1e18) .div(totalSupply()) ); } function earned(address account) public view returns (uint256) { return balanceOf(account) .mul(rewardPerToken().sub(userRewardPerTokenPaid[account])) .div(1e18) .add(rewards[account]); } // stake visibility is public as overriding LPTokenWrapper's stake() function function stake(uint256 amount) public updateReward(msg.sender) checkhalve { require(amount > 0, "Cannot stake 0"); super.stake(amount); emit Staked(msg.sender, amount); } function withdraw(uint256 amount) public updateReward(msg.sender) { require(amount > 0, "Cannot withdraw 0"); super.withdraw(amount); emit Withdrawn(msg.sender, amount); } function exit() external { withdraw(balanceOf(msg.sender)); getReward(); } function getReward() public updateReward(msg.sender) checkhalve { uint256 reward = rewards[msg.sender]; if (reward > 0) { rewards[msg.sender] = 0; uint256 scalingFactor = YAM(address(yam)).yamsScalingFactor(); uint256 trueReward = reward.mul(scalingFactor).div(10**18); yam.safeTransfer(msg.sender, trueReward); emit RewardPaid(msg.sender, trueReward); } } modifier checkhalve() { if (breaker) { // do nothing } else if (block.timestamp >= periodFinish && initialized) { /* initreward = initreward.mul(90).div(100); */ // static 5k per week uint256 scalingFactor = YAM(address(yam)).yamsScalingFactor(); uint256 newRewards = initreward.mul(scalingFactor).div(10**18); yam.mint(address(this), newRewards); lastUpdateTime = block.timestamp; rewardRate = initreward.div(DURATION); periodFinish = block.timestamp.add(DURATION); emit RewardAdded(newRewards); } _; } function notifyRewardAmount(uint256 reward) external onlyRewardDistribution updateReward(address(0)) { // https://sips.synthetix.io/sips/sip-77 // increased buffer for scaling factor ( supports up to 10**4 * 10**18 scaling factor) require(reward < uint256(-1) / 10**22, "rewards too large, would lock"); if (block.timestamp > starttime && initialized) { if (block.timestamp >= periodFinish) { rewardRate = reward.div(DURATION); } else { uint256 remaining = periodFinish.sub(block.timestamp); uint256 leftover = remaining.mul(rewardRate); rewardRate = reward.add(leftover).div(DURATION); } lastUpdateTime = block.timestamp; periodFinish = block.timestamp.add(DURATION); uint256 scalingFactor = YAM(address(yam)).yamsScalingFactor(); uint256 newRewards = reward.mul(scalingFactor).div(10**18); emit RewardAdded(newRewards); } else { // increased buffer for scaling factor require(initreward < uint256(-1) / 10**22, "rewards too large, would lock"); require(!initialized, "already initialized"); initialized = true; uint256 scalingFactor = YAM(address(yam)).yamsScalingFactor(); uint256 newRewards = initreward.mul(scalingFactor).div(10**18); yam.mint(address(this), newRewards); rewardRate = initreward.div(DURATION); lastUpdateTime = starttime; periodFinish = starttime.add(DURATION); emit RewardAdded(newRewards); } } // This function allows governance to take unsupported tokens out of the // contract, since this one exists longer than the other pools. // This is in an effort to make someone whole, should they seriously // mess up. There is no guarantee governance will vote to return these. // It also allows for removal of airdropped tokens. function rescueTokens(IERC20 _token, uint256 amount, address to) external { // only gov require(msg.sender == owner(), "!governance"); // cant take staked asset require(_token != slp, "slp"); // cant take reward asset require(_token != yam, "yam"); // transfer to _token.safeTransfer(to, amount); } function setBreaker(bool breaker_) external { // only gov require(msg.sender == owner(), "!governance"); breaker = breaker_; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"constant":true,"inputs":[],"name":"BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"breaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"lpStake","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"chefEmergency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"emergencyMasterChefWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorLPStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"getReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"initreward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"masterchef","outputs":[{"internalType":"contract MasterChef","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minBlockBeforeVoting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minBlockSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numSupplyCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"reenableChef","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"rescueTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reserves","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardDistribution","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"breaker_","type":"bool"}],"name":"setBreaker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"blockNum","type":"uint256"}],"name":"setMinBlockBeforeVoting","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newReserves","type":"address"}],"name":"setReserves","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardDistribution","type":"address"}],"name":"setRewardDistribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"slp","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"starttime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"sushi","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"xsushi_amt","type":"uint256"}],"name":"sushiToReserves","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sushibar","outputs":[{"internalType":"contract SushiBar","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sweepToXSushi","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"totalSupplyCheckpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"lpStake","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"yam","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600180546001600160a01b0319908116730f82e57804d0b1f6fab2370a43dcfad3c7cb239c17909155600280548216730aacfbec6a24756c20d41914f2caba817c0d85211790556003805482167397990b693835da58a281636296d2bf02787dea17179055600480548216736b3595068778dd592e39a122f4f5a5cf09c90fe2179055600580548216738798249c2e607446efb7ad49ec89dd1865ff42721790556006805490911673c2edad668740f1aa35e4d8f227fb8e17dca888cd179055602c60075569010f0cf064dd59200000601255635fad7820601355600060148190556015556018805460ff19169055620001066001600160e01b03620001de16565b600080546001600160a01b0319166001600160a01b03928316178082556040519216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001546006546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b158015620001a957600080fd5b505af1158015620001be573d6000803e3d6000fd5b505050506040513d6020811015620001d557600080fd5b50620001e29050565b3390565b61454a80620001f26000396000f3fe608060405234801561001057600080fd5b50600436106103775760003560e01c80637b0a47ee116101d3578063b4b5ea5711610104578063e9fad8ee116100a2578063f10684541161007c578063f1068454146108a1578063f1127ed8146108a9578063f2fde38b146108e8578063fb1db2781461091b57610377565b8063e9fad8ee14610889578063ebe2b12b14610891578063ec342ad01461089957610377565b8063cd3daf9d116100de578063cd3daf9d14610823578063dda710d51461082b578063df136d6514610864578063e3ac761e1461086c57610377565b8063b4b5ea57146107e0578063bb026f2d14610813578063c8f33c911461081b57610377565b80638f32d59b11610171578063a4db24e41161014b578063a4db24e414610720578063a694fc3a14610763578063b2cb321714610780578063b37fd1901461079d57610377565b80638f32d59b146106dd57806397e18f35146106e55780639c907b581461071857610377565b80638b876347116101ad5780638b8763471461067d5780638cbdaace146106b05780638da58897146106cd5780638da5cb5b146106d557610377565b80637b0a47ee1461066557806380faa57d1461066d578063872490c61461067557610377565b80633c6b16ab116102ad57806364d7a2c51161024b57806370a082311161022557806370a08231146105e9578063715018a61461061c57806375172a8b14610624578063782d6fe11461062c57610377565b806364d7a2c5146105a65780636dc8f5b0146105ae5780636fcfff45146105b657610377565b8063587cde1e11610287578063587cde1e146105195780635c0aeb0e1461054c5780635c19a95c1461056b5780635c20ff9b1461059e57610377565b80633c6b16ab146104ec5780633d18b912146105095780634afe0e391461051157610377565b8063101114cf1161031a5780631be05289116102f45780631be052891461049e5780632e1a7d4d146104a657806335eb897d146104c3578063390c3dc8146104cb57610377565b8063101114cf14610486578063158ef93e1461048e57806318160ddd1461049657610377565b8063071c033211610356578063071c0332146104255780630a0879031461042d5780630d68b761146104355780630f41e0d21461046a57610377565b80628cc2621461037c57806302824acc146103c15780630700037d146103f2575b600080fd5b6103af6004803603602081101561039257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610923565b60408051918252519081900360200190f35b6103c96109b8565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103af6004803603602081101561040857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166109d4565b6103c96109e6565b6103c9610a02565b6104686004803603602081101561044b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610a1e565b005b610472610ae0565b604080519115158252519081900360200190f35b6103c9610aee565b610472610b12565b6103af610b1b565b6103af610b22565b610468600480360360208110156104bc57600080fd5b5035610b29565b610468610c50565b6104d3610d96565b6040805163ffffffff9092168252519081900360200190f35b6104686004803603602081101561050257600080fd5b5035610da2565b6104686113b7565b61047261175b565b6103c96004803603602081101561052f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611764565b6104686004803603602081101561056257600080fd5b5035151561178c565b6104686004803603602081101561058157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611864565b610468611871565b610472611bb3565b610468611bbc565b6104d3600480360360208110156105cc57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611e03565b6103af600480360360208110156105ff57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611e1b565b610468611e43565b6103c9611f25565b6103af6004803603604081101561064257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611f41565b6103af6120fe565b6103af612104565b6103c9612122565b6103af6004803603602081101561069357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661213e565b610468600480360360208110156106c657600080fd5b5035612150565b6103af612293565b6103c9612299565b6104726122b5565b610468600480360360208110156106fb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166122f3565b6103af6123c5565b6107436004803603602081101561073657600080fd5b503563ffffffff166123cb565b6040805163ffffffff909316835260208301919091528051918290030190f35b6104686004803603602081101561077957600080fd5b50356123ed565b6104686004803603602081101561079657600080fd5b50356126fe565b610468600480360360608110156107b357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359160409091013516612a2c565b6103af600480360360208110156107f657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612c08565b6103af612db9565b6103af612dbf565b6103af612dc5565b6103af6004803603604081101561084157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612e19565b6103af612e84565b6103af6004803603602081101561088257600080fd5b5035612e8a565b610468613056565b6103af613071565b6103af613077565b6103af613083565b610743600480360360408110156108bf57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013563ffffffff16613089565b610468600480360360208110156108fe57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166130b6565b6103c9613132565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601a602090815260408083205460199092528220546109b091906109a490670de0b6b3a7640000906109989061098390610977612dc5565b9063ffffffff61314e16565b61098c88611e1b565b9063ffffffff61319016565b9063ffffffff61320316565b9063ffffffff61324516565b90505b919050565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b601a6020526000908152604090205481565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b610a266122b5565b610a9157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6011805473ffffffffffffffffffffffffffffffffffffffff909216640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909216919091179055565b601854610100900460ff1681565b601154640100000000900473ffffffffffffffffffffffffffffffffffffffff1681565b60185460ff1681565b600b545b90565b62093a8081565b33610b32612dc5565b601755610b3d612104565b60165573ffffffffffffffffffffffffffffffffffffffff811615610b9e57610b6581610923565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601a60209081526040808320939093556017546019909152919020555b60008211610c0d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f43616e6e6f742077697468647261772030000000000000000000000000000000604482015290519081900360640190fd5b610c16826132b9565b60408051838152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050565b33610c59612299565b73ffffffffffffffffffffffffffffffffffffffff1614610cdb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f216f776e65720000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600654600754604080517f5312ea8e00000000000000000000000000000000000000000000000000000000815260048101929092525173ffffffffffffffffffffffffffffffffffffffff90921691635312ea8e9160248082019260009290919082900301818387803b158015610d5157600080fd5b505af1158015610d65573d6000803e3d6000fd5b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050565b60115463ffffffff1681565b601154640100000000900473ffffffffffffffffffffffffffffffffffffffff16610dcb61336b565b73ffffffffffffffffffffffffffffffffffffffff1614610e37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806144896021913960400191505060405180910390fd5b6000610e41612dc5565b601755610e4c612104565b60165573ffffffffffffffffffffffffffffffffffffffff811615610ead57610e7481610923565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601a60209081526040808320939093556017546019909152919020555b7678e480405d7b9658a9926345896eb19c38658a4109e5538210610f3257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265776172647320746f6f206c617267652c20776f756c64206c6f636b000000604482015290519081900360640190fd5b60135442118015610f45575060185460ff165b156110ce576014544210610f6e57610f668262093a8063ffffffff61320316565b601555610fbc565b601454600090610f84904263ffffffff61314e16565b90506000610f9d6015548361319090919063ffffffff16565b9050610fb662093a80610998868463ffffffff61324516565b60155550505b426016819055610fd59062093a8063ffffffff61324516565b601455600254604080517fb6fa8576000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163b6fa857691600480830192602092919082900301818787803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b505050506040513d602081101561106e57600080fd5b505190506000611090670de0b6b3a7640000610998868563ffffffff61319016565b6040805182815290519192507fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d919081900360200190a150506113b3565b6012547678e480405d7b9658a9926345896eb19c38658a4109e5531161115557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265776172647320746f6f206c617267652c20776f756c64206c6f636b000000604482015290519081900360640190fd5b60185460ff16156111c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f616c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b601880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600254604080517fb6fa8576000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163b6fa857691600480830192602092919082900301818787803b15801561125e57600080fd5b505af1158015611272573d6000803e3d6000fd5b505050506040513d602081101561128857600080fd5b50516012549091506000906112b190670de0b6b3a764000090610998908563ffffffff61319016565b600254604080517f40c10f1900000000000000000000000000000000000000000000000000000000815230600482015260248101849052905192935073ffffffffffffffffffffffffffffffffffffffff909116916340c10f199160448082019260009290919082900301818387803b15801561132d57600080fd5b505af1158015611341573d6000803e3d6000fd5b505060125461135c9250905062093a8063ffffffff61320316565b601555601354601681905561137a9062093a8063ffffffff61324516565b6014556040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a150505b5050565b336113c0612dc5565b6017556113cb612104565b60165573ffffffffffffffffffffffffffffffffffffffff81161561142c576113f381610923565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601a60209081526040808320939093556017546019909152919020555b601854610100900460ff161561144157611616565b6014544210158015611455575060185460ff165b1561161657600254604080517fb6fa8576000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163b6fa857691600480830192602092919082900301818787803b1580156114c657600080fd5b505af11580156114da573d6000803e3d6000fd5b505050506040513d60208110156114f057600080fd5b505160125490915060009061151990670de0b6b3a764000090610998908563ffffffff61319016565b600254604080517f40c10f1900000000000000000000000000000000000000000000000000000000815230600482015260248101849052905192935073ffffffffffffffffffffffffffffffffffffffff909116916340c10f199160448082019260009290919082900301818387803b15801561159557600080fd5b505af11580156115a9573d6000803e3d6000fd5b50504260165550506012546115c79062093a8063ffffffff61320316565b6015556115dd4262093a8063ffffffff61324516565b6014556040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a150505b336000908152601a602052604090205480156113b357336000908152601a6020908152604080832083905560025481517fb6fa8576000000000000000000000000000000000000000000000000000000008152915173ffffffffffffffffffffffffffffffffffffffff9091169263b6fa8576926004808201939182900301818787803b1580156116a657600080fd5b505af11580156116ba573d6000803e3d6000fd5b505050506040513d60208110156116d057600080fd5b5051905060006116f2670de0b6b3a7640000610998858563ffffffff61319016565b60025490915061171f9073ffffffffffffffffffffffffffffffffffffffff16338363ffffffff61336f16565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a250505050565b600a5460ff1681565b600d6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b611794612299565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461182d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f21676f7665726e616e6365000000000000000000000000000000000000000000604482015290519081900360640190fd5b60188054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b61186e33826133fc565b50565b600654600754604080517f441a3e700000000000000000000000000000000000000000000000000000000081526004810192909252600060248301819052905173ffffffffffffffffffffffffffffffffffffffff9093169263441a3e7092604480820193929182900301818387803b1580156118ed57600080fd5b505af1158015611901573d6000803e3d6000fd5b505060048054604080517f70a082310000000000000000000000000000000000000000000000000000000081523093810193909352516000945073ffffffffffffffffffffffffffffffffffffffff90911692506370a0823191602480820192602092909190829003018186803b15801561197b57600080fd5b505afa15801561198f573d6000803e3d6000fd5b505050506040513d60208110156119a557600080fd5b505160048054600554604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152309481019490945273ffffffffffffffffffffffffffffffffffffffff918216602485015251939450849391169163dd62ed3e916044808301926020929190829003018186803b158015611a2857600080fd5b505afa158015611a3c573d6000803e3d6000fd5b505050506040513d6020811015611a5257600080fd5b50511015611b255760048054600554604080517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316948101949094527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248501525191169163095ea7b39160448083019260209291908290030181600087803b158015611af857600080fd5b505af1158015611b0c573d6000803e3d6000fd5b505050506040513d6020811015611b2257600080fd5b50505b600554604080517fa59f3e0c00000000000000000000000000000000000000000000000000000000815260048101849052905173ffffffffffffffffffffffffffffffffffffffff9092169163a59f3e0c9160248082019260009290919082900301818387803b158015611b9857600080fd5b505af1158015611bac573d6000803e3d6000fd5b5050505050565b60085460ff1681565b33611bc5612299565b73ffffffffffffffffffffffffffffffffffffffff1614611c4757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f216f776e65720000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60085460ff16611cb857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f21656d657267656e637900000000000000000000000000000000000000000000604482015290519081900360640190fd5b600654600754600154604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff9485169463e2bbb158949316916370a08231916024808301926020929190829003018186803b158015611d3757600080fd5b505afa158015611d4b573d6000803e3d6000fd5b505050506040513d6020811015611d6157600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915251604480830192600092919082900301818387803b158015611dc157600080fd5b505af1158015611dd5573d6000803e3d6000fd5b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050565b600f6020526000908152604090205463ffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c602052604090205490565b611e4b6122b5565b611eb657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b6000438210611f9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806143fd602f913960400191505060405180910390fd5b600a5460ff161580611fae575060095482105b15611fbb575060006120f8565b600254600154604080517f782d6fe100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481018690529051600093929092169163782d6fe191604480820192602092909190829003018186803b15801561203c57600080fd5b505afa158015612050573d6000803e3d6000fd5b505050506040513d602081101561206657600080fd5b50519050806120795760009150506120f8565b60006120858585613471565b905080612097576000925050506120f8565b60006120a285612e8a565b9050806120b557600093505050506120f8565b60006120d38261099885670de0b6b3a764000063ffffffff61319016565b90506120f1670de0b6b3a7640000610998868463ffffffff61319016565b9450505050505b92915050565b60155481565b600061211d601354612118426014546136e1565b6136f7565b905090565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60196020526000908152604090205481565b612158612299565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f21676f7665726e616e6365000000000000000000000000000000000000000000604482015290519081900360640190fd5b600a5460ff161561226357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6d696e426c6f636b536574000000000000000000000000000000000000000000604482015290519081900360640190fd5b600955600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60135481565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6000805473ffffffffffffffffffffffffffffffffffffffff166122d761336b565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b336122fc612299565b73ffffffffffffffffffffffffffffffffffffffff161461237e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f216f776e65720000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60125481565b6010602052600090815260409020805460019091015463ffffffff9091169082565b336123f6612dc5565b601755612401612104565b60165573ffffffffffffffffffffffffffffffffffffffff8116156124625761242981610923565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601a60209081526040808320939093556017546019909152919020555b601854610100900460ff16156124775761264c565b601454421015801561248b575060185460ff165b1561264c57600254604080517fb6fa8576000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163b6fa857691600480830192602092919082900301818787803b1580156124fc57600080fd5b505af1158015612510573d6000803e3d6000fd5b505050506040513d602081101561252657600080fd5b505160125490915060009061254f90670de0b6b3a764000090610998908563ffffffff61319016565b600254604080517f40c10f1900000000000000000000000000000000000000000000000000000000815230600482015260248101849052905192935073ffffffffffffffffffffffffffffffffffffffff909116916340c10f199160448082019260009290919082900301818387803b1580156125cb57600080fd5b505af11580156125df573d6000803e3d6000fd5b50504260165550506012546125fd9062093a8063ffffffff61320316565b6015556126134262093a8063ffffffff61324516565b6014556040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a150505b600082116126bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b6126c482613707565b60408051838152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25050565b33612707612299565b73ffffffffffffffffffffffffffffffffffffffff161461278957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f216f776e65720000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81141561285157600554604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561282257600080fd5b505afa158015612836573d6000803e3d6000fd5b505050506040513d602081101561284c57600080fd5b505190505b600554604080517f67dfd4c900000000000000000000000000000000000000000000000000000000815260048101849052905173ffffffffffffffffffffffffffffffffffffffff909216916367dfd4c99160248082019260009290919082900301818387803b1580156128c457600080fd5b505af11580156128d8573d6000803e3d6000fd5b505060048054600354604080517f70a0823100000000000000000000000000000000000000000000000000000000815230948101949094525173ffffffffffffffffffffffffffffffffffffffff928316955063a9059cbb945091169184916370a0823191602480820192602092909190829003018186803b15801561295d57600080fd5b505afa158015612971573d6000803e3d6000fd5b505050506040513d602081101561298757600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b1580156129fd57600080fd5b505af1158015612a11573d6000803e3d6000fd5b505050506040513d6020811015612a2757600080fd5b505050565b612a34612299565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612acd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f21676f7665726e616e6365000000000000000000000000000000000000000000604482015290519081900360640190fd5b60015473ffffffffffffffffffffffffffffffffffffffff84811691161415612b5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f736c700000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff84811691161415612be157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f79616d0000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b612a2773ffffffffffffffffffffffffffffffffffffffff8416828463ffffffff61336f16565b600a5460009060ff161580612c1e575060095443105b15612c2b575060006109b3565b600254600154604080517fb4b5ea5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529051600093929092169163b4b5ea5791602480820192602092909190829003018186803b158015612ca557600080fd5b505afa158015612cb9573d6000803e3d6000fd5b505050506040513d6020811015612ccf57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff84166000908152600f602052604081205491925063ffffffff9091169081612d0f576000612d6c565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600e6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87011684529091529020600101545b90506000612d91600b54610998670de0b6b3a76400008561319090919063ffffffff16565b9050612daf670de0b6b3a7640000610998868463ffffffff61319016565b9695505050505050565b60095481565b60165481565b6000612dcf610b1b565b612ddc5750601754610b1f565b61211d612e0a612dea610b1b565b610998670de0b6b3a764000061098c60155461098c601654610977612104565b6017549063ffffffff61324516565b6000438210612e73576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806143cb6032913960400191505060405180910390fd5b612e7d8383613471565b9392505050565b60175481565b60115460009063ffffffff16612ea2575060006109b3565b6011547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff918216018116600090815260106020526040902054168210612f2d57506011547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff91821601166000908152601060205260409020600101546109b3565b6000805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb015463ffffffff16821015612f6d575060006109b3565b60115460009063ffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8163ffffffff168163ffffffff16111561303757600282820363ffffffff16048103612fc661438d565b5063ffffffff808216600090815260106020908152604091829020825180840190935280549093168083526001909301549082015290861415613012576020015193506109b392505050565b805163ffffffff1686111561302957819350613030565b6001820392505b5050612f9c565b5063ffffffff1660009081526010602052604090206001015492915050565b61306761306233611e1b565b610b29565b61306f6113b7565b565b60145481565b670de0b6b3a764000081565b60075481565b600e6020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6130be6122b5565b61312957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61186e816137f9565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b6000612e7d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506138f2565b60008261319f575060006120f8565b828202828482816131ac57fe5b0414612e7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061442c6021913960400191505060405180910390fd5b6000612e7d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506139a3565b600082820183811015612e7d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600b546132cc908263ffffffff61314e16565b600b55336000908152600c60205260408120546132ef908363ffffffff61314e16565b336000908152600c60209081526040808320849055600d9091528120549192506133309173ffffffffffffffffffffffffffffffffffffffff169084613a22565b613338613c15565b61334182613d5a565b6001546113b39073ffffffffffffffffffffffffffffffffffffffff16338463ffffffff61336f16565b3390565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612a27908490613de1565b336000908152600d602081815260408084208054600c845291909420549290915273ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff00000000000000000000000000000000000000008316179093559091169061346b828483613a22565b50505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600f602052604081205463ffffffff16806134ac5760009150506120f8565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600e6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8601811685529252909120541683106135715773ffffffffffffffffffffffffffffffffffffffff84166000908152600e602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490940163ffffffff168352929052206001015490506120f8565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600e6020908152604080832083805290915290205463ffffffff168310156135b95760009150506120f8565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8163ffffffff168163ffffffff16111561369d57600282820363ffffffff1604810361360961438d565b5073ffffffffffffffffffffffffffffffffffffffff87166000908152600e6020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915290871415613678576020015194506120f89350505050565b805163ffffffff1687111561368f57819350613696565b6001820392505b50506135df565b5073ffffffffffffffffffffffffffffffffffffffff85166000908152600e6020908152604080832063ffffffff9094168352929052206001015491505092915050565b60008183106136f05781612e7d565b5090919050565b6000818310156136f05781612e7d565b600b5461371a908263ffffffff61324516565b600b55336000908152600c602052604081205461373d908363ffffffff61324516565b336000908152600c60209081526040808320849055600d90915290205490915073ffffffffffffffffffffffffffffffffffffffff16806137b15750336000818152600d6020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790555b6137bd60008285613a22565b6137c5613c15565b6001546137f09073ffffffffffffffffffffffffffffffffffffffff1633308663ffffffff61401f16565b612a27836140b4565b73ffffffffffffffffffffffffffffffffffffffff8116613865576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806143a56026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000818484111561399b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613960578181015183820152602001613948565b50505050905090810190601f16801561398d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315613960578181015183820152602001613948565b506000838581613a1857fe5b0495945050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613a5e5750600081115b15612a275773ffffffffffffffffffffffffffffffffffffffff831615613b3a5773ffffffffffffffffffffffffffffffffffffffff83166000908152600f602052604081205463ffffffff169081613ab8576000613b15565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600e6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87011684529091529020600101545b90506000613b29828563ffffffff61314e16565b9050613b3686848361413b565b5050505b73ffffffffffffffffffffffffffffffffffffffff821615612a275773ffffffffffffffffffffffffffffffffffffffff82166000908152600f602052604081205463ffffffff169081613b8f576000613bec565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600e6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87011684529091529020600101545b90506000613c00828563ffffffff61324516565b9050613c0d85848361413b565b505050505050565b6000613c39436040518060800160405280604281526020016144aa604291396142d9565b60115490915063ffffffff1615801590613c9357506011547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff9182160181166000908152601060205260409020548116908216145b15613ce057600b546011547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff918216011660009081526010602052604090206001015561186e565b60408051808201825263ffffffff8084168252600b54602080840191825260118054841660009081526010909252949020925183549083167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000091821617845590516001938401558354808316909301909116911617905550565b60085460ff1661186e57600654600754604080517f441a3e700000000000000000000000000000000000000000000000000000000081526004810192909252602482018490525173ffffffffffffffffffffffffffffffffffffffff9092169163441a3e709160448082019260009290919082900301818387803b158015611b9857600080fd5b613e008273ffffffffffffffffffffffffffffffffffffffff16614351565b613e6b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310613ed457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613e97565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613f36576040519150601f19603f3d011682016040523d82523d6000602084013e613f3b565b606091505b509150915081613fac57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561346b57808060200190516020811015613fc857600080fd5b505161346b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806144ec602a913960400191505060405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261346b908590613de1565b60085460ff1661186e57600654600754604080517fe2bbb1580000000000000000000000000000000000000000000000000000000081526004810192909252602482018490525173ffffffffffffffffffffffffffffffffffffffff9092169163e2bbb1589160448082019260009290919082900301818387803b158015611b9857600080fd5b600061415f436040518060600160405280603c815260200161444d603c91396142d9565b905060008363ffffffff161180156141d3575073ffffffffffffffffffffffffffffffffffffffff84166000908152600e6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8801811685529252909120548282169116145b1561423b5773ffffffffffffffffffffffffffffffffffffffff84166000908152600e6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8801168452909152902060010182905561346b565b60408051808201825263ffffffff8084168252602080830186815273ffffffffffffffffffffffffffffffffffffffff89166000818152600e84528681208a861682528452868120955186549086167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009182161787559251600196870155908152600f90925293902080549287019091169190921617905550505050565b6000816401000000008410614349576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315613960578181015183820152602001613948565b509192915050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906143855750808214155b949350505050565b60408051808201909152600080825260208201529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373496e63656e746976697a65723a3a5f6765745072696f724c505374616b653a206e6f74207965742064657465726d696e6564496e63656e746976697a65723a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77496e63656e746976697a65723a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747343616c6c6572206973206e6f742072657761726420646973747269627574696f6e496e63656e746976697a65723a3a5f7772697465537570706c79436865636b706f696e743a20626c6f636b206e756d626572206578636565647320333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a723158208e792b099a36851b2558077270ef7bfcd922d8cb598d08671b5887bd25a6a01b64736f6c634300050f0032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103775760003560e01c80637b0a47ee116101d3578063b4b5ea5711610104578063e9fad8ee116100a2578063f10684541161007c578063f1068454146108a1578063f1127ed8146108a9578063f2fde38b146108e8578063fb1db2781461091b57610377565b8063e9fad8ee14610889578063ebe2b12b14610891578063ec342ad01461089957610377565b8063cd3daf9d116100de578063cd3daf9d14610823578063dda710d51461082b578063df136d6514610864578063e3ac761e1461086c57610377565b8063b4b5ea57146107e0578063bb026f2d14610813578063c8f33c911461081b57610377565b80638f32d59b11610171578063a4db24e41161014b578063a4db24e414610720578063a694fc3a14610763578063b2cb321714610780578063b37fd1901461079d57610377565b80638f32d59b146106dd57806397e18f35146106e55780639c907b581461071857610377565b80638b876347116101ad5780638b8763471461067d5780638cbdaace146106b05780638da58897146106cd5780638da5cb5b146106d557610377565b80637b0a47ee1461066557806380faa57d1461066d578063872490c61461067557610377565b80633c6b16ab116102ad57806364d7a2c51161024b57806370a082311161022557806370a08231146105e9578063715018a61461061c57806375172a8b14610624578063782d6fe11461062c57610377565b806364d7a2c5146105a65780636dc8f5b0146105ae5780636fcfff45146105b657610377565b8063587cde1e11610287578063587cde1e146105195780635c0aeb0e1461054c5780635c19a95c1461056b5780635c20ff9b1461059e57610377565b80633c6b16ab146104ec5780633d18b912146105095780634afe0e391461051157610377565b8063101114cf1161031a5780631be05289116102f45780631be052891461049e5780632e1a7d4d146104a657806335eb897d146104c3578063390c3dc8146104cb57610377565b8063101114cf14610486578063158ef93e1461048e57806318160ddd1461049657610377565b8063071c033211610356578063071c0332146104255780630a0879031461042d5780630d68b761146104355780630f41e0d21461046a57610377565b80628cc2621461037c57806302824acc146103c15780630700037d146103f2575b600080fd5b6103af6004803603602081101561039257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610923565b60408051918252519081900360200190f35b6103c96109b8565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103af6004803603602081101561040857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166109d4565b6103c96109e6565b6103c9610a02565b6104686004803603602081101561044b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610a1e565b005b610472610ae0565b604080519115158252519081900360200190f35b6103c9610aee565b610472610b12565b6103af610b1b565b6103af610b22565b610468600480360360208110156104bc57600080fd5b5035610b29565b610468610c50565b6104d3610d96565b6040805163ffffffff9092168252519081900360200190f35b6104686004803603602081101561050257600080fd5b5035610da2565b6104686113b7565b61047261175b565b6103c96004803603602081101561052f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611764565b6104686004803603602081101561056257600080fd5b5035151561178c565b6104686004803603602081101561058157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611864565b610468611871565b610472611bb3565b610468611bbc565b6104d3600480360360208110156105cc57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611e03565b6103af600480360360208110156105ff57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611e1b565b610468611e43565b6103c9611f25565b6103af6004803603604081101561064257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611f41565b6103af6120fe565b6103af612104565b6103c9612122565b6103af6004803603602081101561069357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661213e565b610468600480360360208110156106c657600080fd5b5035612150565b6103af612293565b6103c9612299565b6104726122b5565b610468600480360360208110156106fb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166122f3565b6103af6123c5565b6107436004803603602081101561073657600080fd5b503563ffffffff166123cb565b6040805163ffffffff909316835260208301919091528051918290030190f35b6104686004803603602081101561077957600080fd5b50356123ed565b6104686004803603602081101561079657600080fd5b50356126fe565b610468600480360360608110156107b357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359160409091013516612a2c565b6103af600480360360208110156107f657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612c08565b6103af612db9565b6103af612dbf565b6103af612dc5565b6103af6004803603604081101561084157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612e19565b6103af612e84565b6103af6004803603602081101561088257600080fd5b5035612e8a565b610468613056565b6103af613071565b6103af613077565b6103af613083565b610743600480360360408110156108bf57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013563ffffffff16613089565b610468600480360360208110156108fe57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166130b6565b6103c9613132565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601a602090815260408083205460199092528220546109b091906109a490670de0b6b3a7640000906109989061098390610977612dc5565b9063ffffffff61314e16565b61098c88611e1b565b9063ffffffff61319016565b9063ffffffff61320316565b9063ffffffff61324516565b90505b919050565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b601a6020526000908152604090205481565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b610a266122b5565b610a9157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6011805473ffffffffffffffffffffffffffffffffffffffff909216640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909216919091179055565b601854610100900460ff1681565b601154640100000000900473ffffffffffffffffffffffffffffffffffffffff1681565b60185460ff1681565b600b545b90565b62093a8081565b33610b32612dc5565b601755610b3d612104565b60165573ffffffffffffffffffffffffffffffffffffffff811615610b9e57610b6581610923565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601a60209081526040808320939093556017546019909152919020555b60008211610c0d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f43616e6e6f742077697468647261772030000000000000000000000000000000604482015290519081900360640190fd5b610c16826132b9565b60408051838152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050565b33610c59612299565b73ffffffffffffffffffffffffffffffffffffffff1614610cdb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f216f776e65720000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600654600754604080517f5312ea8e00000000000000000000000000000000000000000000000000000000815260048101929092525173ffffffffffffffffffffffffffffffffffffffff90921691635312ea8e9160248082019260009290919082900301818387803b158015610d5157600080fd5b505af1158015610d65573d6000803e3d6000fd5b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050565b60115463ffffffff1681565b601154640100000000900473ffffffffffffffffffffffffffffffffffffffff16610dcb61336b565b73ffffffffffffffffffffffffffffffffffffffff1614610e37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806144896021913960400191505060405180910390fd5b6000610e41612dc5565b601755610e4c612104565b60165573ffffffffffffffffffffffffffffffffffffffff811615610ead57610e7481610923565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601a60209081526040808320939093556017546019909152919020555b7678e480405d7b9658a9926345896eb19c38658a4109e5538210610f3257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265776172647320746f6f206c617267652c20776f756c64206c6f636b000000604482015290519081900360640190fd5b60135442118015610f45575060185460ff165b156110ce576014544210610f6e57610f668262093a8063ffffffff61320316565b601555610fbc565b601454600090610f84904263ffffffff61314e16565b90506000610f9d6015548361319090919063ffffffff16565b9050610fb662093a80610998868463ffffffff61324516565b60155550505b426016819055610fd59062093a8063ffffffff61324516565b601455600254604080517fb6fa8576000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163b6fa857691600480830192602092919082900301818787803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b505050506040513d602081101561106e57600080fd5b505190506000611090670de0b6b3a7640000610998868563ffffffff61319016565b6040805182815290519192507fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d919081900360200190a150506113b3565b6012547678e480405d7b9658a9926345896eb19c38658a4109e5531161115557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265776172647320746f6f206c617267652c20776f756c64206c6f636b000000604482015290519081900360640190fd5b60185460ff16156111c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f616c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b601880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600254604080517fb6fa8576000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163b6fa857691600480830192602092919082900301818787803b15801561125e57600080fd5b505af1158015611272573d6000803e3d6000fd5b505050506040513d602081101561128857600080fd5b50516012549091506000906112b190670de0b6b3a764000090610998908563ffffffff61319016565b600254604080517f40c10f1900000000000000000000000000000000000000000000000000000000815230600482015260248101849052905192935073ffffffffffffffffffffffffffffffffffffffff909116916340c10f199160448082019260009290919082900301818387803b15801561132d57600080fd5b505af1158015611341573d6000803e3d6000fd5b505060125461135c9250905062093a8063ffffffff61320316565b601555601354601681905561137a9062093a8063ffffffff61324516565b6014556040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a150505b5050565b336113c0612dc5565b6017556113cb612104565b60165573ffffffffffffffffffffffffffffffffffffffff81161561142c576113f381610923565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601a60209081526040808320939093556017546019909152919020555b601854610100900460ff161561144157611616565b6014544210158015611455575060185460ff165b1561161657600254604080517fb6fa8576000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163b6fa857691600480830192602092919082900301818787803b1580156114c657600080fd5b505af11580156114da573d6000803e3d6000fd5b505050506040513d60208110156114f057600080fd5b505160125490915060009061151990670de0b6b3a764000090610998908563ffffffff61319016565b600254604080517f40c10f1900000000000000000000000000000000000000000000000000000000815230600482015260248101849052905192935073ffffffffffffffffffffffffffffffffffffffff909116916340c10f199160448082019260009290919082900301818387803b15801561159557600080fd5b505af11580156115a9573d6000803e3d6000fd5b50504260165550506012546115c79062093a8063ffffffff61320316565b6015556115dd4262093a8063ffffffff61324516565b6014556040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a150505b336000908152601a602052604090205480156113b357336000908152601a6020908152604080832083905560025481517fb6fa8576000000000000000000000000000000000000000000000000000000008152915173ffffffffffffffffffffffffffffffffffffffff9091169263b6fa8576926004808201939182900301818787803b1580156116a657600080fd5b505af11580156116ba573d6000803e3d6000fd5b505050506040513d60208110156116d057600080fd5b5051905060006116f2670de0b6b3a7640000610998858563ffffffff61319016565b60025490915061171f9073ffffffffffffffffffffffffffffffffffffffff16338363ffffffff61336f16565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a250505050565b600a5460ff1681565b600d6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b611794612299565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461182d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f21676f7665726e616e6365000000000000000000000000000000000000000000604482015290519081900360640190fd5b60188054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b61186e33826133fc565b50565b600654600754604080517f441a3e700000000000000000000000000000000000000000000000000000000081526004810192909252600060248301819052905173ffffffffffffffffffffffffffffffffffffffff9093169263441a3e7092604480820193929182900301818387803b1580156118ed57600080fd5b505af1158015611901573d6000803e3d6000fd5b505060048054604080517f70a082310000000000000000000000000000000000000000000000000000000081523093810193909352516000945073ffffffffffffffffffffffffffffffffffffffff90911692506370a0823191602480820192602092909190829003018186803b15801561197b57600080fd5b505afa15801561198f573d6000803e3d6000fd5b505050506040513d60208110156119a557600080fd5b505160048054600554604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152309481019490945273ffffffffffffffffffffffffffffffffffffffff918216602485015251939450849391169163dd62ed3e916044808301926020929190829003018186803b158015611a2857600080fd5b505afa158015611a3c573d6000803e3d6000fd5b505050506040513d6020811015611a5257600080fd5b50511015611b255760048054600554604080517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316948101949094527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248501525191169163095ea7b39160448083019260209291908290030181600087803b158015611af857600080fd5b505af1158015611b0c573d6000803e3d6000fd5b505050506040513d6020811015611b2257600080fd5b50505b600554604080517fa59f3e0c00000000000000000000000000000000000000000000000000000000815260048101849052905173ffffffffffffffffffffffffffffffffffffffff9092169163a59f3e0c9160248082019260009290919082900301818387803b158015611b9857600080fd5b505af1158015611bac573d6000803e3d6000fd5b5050505050565b60085460ff1681565b33611bc5612299565b73ffffffffffffffffffffffffffffffffffffffff1614611c4757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f216f776e65720000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60085460ff16611cb857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f21656d657267656e637900000000000000000000000000000000000000000000604482015290519081900360640190fd5b600654600754600154604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff9485169463e2bbb158949316916370a08231916024808301926020929190829003018186803b158015611d3757600080fd5b505afa158015611d4b573d6000803e3d6000fd5b505050506040513d6020811015611d6157600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915251604480830192600092919082900301818387803b158015611dc157600080fd5b505af1158015611dd5573d6000803e3d6000fd5b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050565b600f6020526000908152604090205463ffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c602052604090205490565b611e4b6122b5565b611eb657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b6000438210611f9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806143fd602f913960400191505060405180910390fd5b600a5460ff161580611fae575060095482105b15611fbb575060006120f8565b600254600154604080517f782d6fe100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481018690529051600093929092169163782d6fe191604480820192602092909190829003018186803b15801561203c57600080fd5b505afa158015612050573d6000803e3d6000fd5b505050506040513d602081101561206657600080fd5b50519050806120795760009150506120f8565b60006120858585613471565b905080612097576000925050506120f8565b60006120a285612e8a565b9050806120b557600093505050506120f8565b60006120d38261099885670de0b6b3a764000063ffffffff61319016565b90506120f1670de0b6b3a7640000610998868463ffffffff61319016565b9450505050505b92915050565b60155481565b600061211d601354612118426014546136e1565b6136f7565b905090565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60196020526000908152604090205481565b612158612299565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f21676f7665726e616e6365000000000000000000000000000000000000000000604482015290519081900360640190fd5b600a5460ff161561226357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6d696e426c6f636b536574000000000000000000000000000000000000000000604482015290519081900360640190fd5b600955600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60135481565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6000805473ffffffffffffffffffffffffffffffffffffffff166122d761336b565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b336122fc612299565b73ffffffffffffffffffffffffffffffffffffffff161461237e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f216f776e65720000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60125481565b6010602052600090815260409020805460019091015463ffffffff9091169082565b336123f6612dc5565b601755612401612104565b60165573ffffffffffffffffffffffffffffffffffffffff8116156124625761242981610923565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601a60209081526040808320939093556017546019909152919020555b601854610100900460ff16156124775761264c565b601454421015801561248b575060185460ff165b1561264c57600254604080517fb6fa8576000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163b6fa857691600480830192602092919082900301818787803b1580156124fc57600080fd5b505af1158015612510573d6000803e3d6000fd5b505050506040513d602081101561252657600080fd5b505160125490915060009061254f90670de0b6b3a764000090610998908563ffffffff61319016565b600254604080517f40c10f1900000000000000000000000000000000000000000000000000000000815230600482015260248101849052905192935073ffffffffffffffffffffffffffffffffffffffff909116916340c10f199160448082019260009290919082900301818387803b1580156125cb57600080fd5b505af11580156125df573d6000803e3d6000fd5b50504260165550506012546125fd9062093a8063ffffffff61320316565b6015556126134262093a8063ffffffff61324516565b6014556040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a150505b600082116126bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b6126c482613707565b60408051838152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25050565b33612707612299565b73ffffffffffffffffffffffffffffffffffffffff161461278957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f216f776e65720000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81141561285157600554604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561282257600080fd5b505afa158015612836573d6000803e3d6000fd5b505050506040513d602081101561284c57600080fd5b505190505b600554604080517f67dfd4c900000000000000000000000000000000000000000000000000000000815260048101849052905173ffffffffffffffffffffffffffffffffffffffff909216916367dfd4c99160248082019260009290919082900301818387803b1580156128c457600080fd5b505af11580156128d8573d6000803e3d6000fd5b505060048054600354604080517f70a0823100000000000000000000000000000000000000000000000000000000815230948101949094525173ffffffffffffffffffffffffffffffffffffffff928316955063a9059cbb945091169184916370a0823191602480820192602092909190829003018186803b15801561295d57600080fd5b505afa158015612971573d6000803e3d6000fd5b505050506040513d602081101561298757600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b1580156129fd57600080fd5b505af1158015612a11573d6000803e3d6000fd5b505050506040513d6020811015612a2757600080fd5b505050565b612a34612299565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612acd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f21676f7665726e616e6365000000000000000000000000000000000000000000604482015290519081900360640190fd5b60015473ffffffffffffffffffffffffffffffffffffffff84811691161415612b5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f736c700000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff84811691161415612be157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f79616d0000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b612a2773ffffffffffffffffffffffffffffffffffffffff8416828463ffffffff61336f16565b600a5460009060ff161580612c1e575060095443105b15612c2b575060006109b3565b600254600154604080517fb4b5ea5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529051600093929092169163b4b5ea5791602480820192602092909190829003018186803b158015612ca557600080fd5b505afa158015612cb9573d6000803e3d6000fd5b505050506040513d6020811015612ccf57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff84166000908152600f602052604081205491925063ffffffff9091169081612d0f576000612d6c565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600e6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87011684529091529020600101545b90506000612d91600b54610998670de0b6b3a76400008561319090919063ffffffff16565b9050612daf670de0b6b3a7640000610998868463ffffffff61319016565b9695505050505050565b60095481565b60165481565b6000612dcf610b1b565b612ddc5750601754610b1f565b61211d612e0a612dea610b1b565b610998670de0b6b3a764000061098c60155461098c601654610977612104565b6017549063ffffffff61324516565b6000438210612e73576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806143cb6032913960400191505060405180910390fd5b612e7d8383613471565b9392505050565b60175481565b60115460009063ffffffff16612ea2575060006109b3565b6011547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff918216018116600090815260106020526040902054168210612f2d57506011547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff91821601166000908152601060205260409020600101546109b3565b6000805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb015463ffffffff16821015612f6d575060006109b3565b60115460009063ffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8163ffffffff168163ffffffff16111561303757600282820363ffffffff16048103612fc661438d565b5063ffffffff808216600090815260106020908152604091829020825180840190935280549093168083526001909301549082015290861415613012576020015193506109b392505050565b805163ffffffff1686111561302957819350613030565b6001820392505b5050612f9c565b5063ffffffff1660009081526010602052604090206001015492915050565b61306761306233611e1b565b610b29565b61306f6113b7565b565b60145481565b670de0b6b3a764000081565b60075481565b600e6020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6130be6122b5565b61312957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61186e816137f9565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b6000612e7d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506138f2565b60008261319f575060006120f8565b828202828482816131ac57fe5b0414612e7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061442c6021913960400191505060405180910390fd5b6000612e7d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506139a3565b600082820183811015612e7d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600b546132cc908263ffffffff61314e16565b600b55336000908152600c60205260408120546132ef908363ffffffff61314e16565b336000908152600c60209081526040808320849055600d9091528120549192506133309173ffffffffffffffffffffffffffffffffffffffff169084613a22565b613338613c15565b61334182613d5a565b6001546113b39073ffffffffffffffffffffffffffffffffffffffff16338463ffffffff61336f16565b3390565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612a27908490613de1565b336000908152600d602081815260408084208054600c845291909420549290915273ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff00000000000000000000000000000000000000008316179093559091169061346b828483613a22565b50505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600f602052604081205463ffffffff16806134ac5760009150506120f8565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600e6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8601811685529252909120541683106135715773ffffffffffffffffffffffffffffffffffffffff84166000908152600e602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490940163ffffffff168352929052206001015490506120f8565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600e6020908152604080832083805290915290205463ffffffff168310156135b95760009150506120f8565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8163ffffffff168163ffffffff16111561369d57600282820363ffffffff1604810361360961438d565b5073ffffffffffffffffffffffffffffffffffffffff87166000908152600e6020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915290871415613678576020015194506120f89350505050565b805163ffffffff1687111561368f57819350613696565b6001820392505b50506135df565b5073ffffffffffffffffffffffffffffffffffffffff85166000908152600e6020908152604080832063ffffffff9094168352929052206001015491505092915050565b60008183106136f05781612e7d565b5090919050565b6000818310156136f05781612e7d565b600b5461371a908263ffffffff61324516565b600b55336000908152600c602052604081205461373d908363ffffffff61324516565b336000908152600c60209081526040808320849055600d90915290205490915073ffffffffffffffffffffffffffffffffffffffff16806137b15750336000818152600d6020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790555b6137bd60008285613a22565b6137c5613c15565b6001546137f09073ffffffffffffffffffffffffffffffffffffffff1633308663ffffffff61401f16565b612a27836140b4565b73ffffffffffffffffffffffffffffffffffffffff8116613865576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806143a56026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000818484111561399b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613960578181015183820152602001613948565b50505050905090810190601f16801561398d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315613960578181015183820152602001613948565b506000838581613a1857fe5b0495945050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613a5e5750600081115b15612a275773ffffffffffffffffffffffffffffffffffffffff831615613b3a5773ffffffffffffffffffffffffffffffffffffffff83166000908152600f602052604081205463ffffffff169081613ab8576000613b15565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600e6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87011684529091529020600101545b90506000613b29828563ffffffff61314e16565b9050613b3686848361413b565b5050505b73ffffffffffffffffffffffffffffffffffffffff821615612a275773ffffffffffffffffffffffffffffffffffffffff82166000908152600f602052604081205463ffffffff169081613b8f576000613bec565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600e6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87011684529091529020600101545b90506000613c00828563ffffffff61324516565b9050613c0d85848361413b565b505050505050565b6000613c39436040518060800160405280604281526020016144aa604291396142d9565b60115490915063ffffffff1615801590613c9357506011547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff9182160181166000908152601060205260409020548116908216145b15613ce057600b546011547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff918216011660009081526010602052604090206001015561186e565b60408051808201825263ffffffff8084168252600b54602080840191825260118054841660009081526010909252949020925183549083167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000091821617845590516001938401558354808316909301909116911617905550565b60085460ff1661186e57600654600754604080517f441a3e700000000000000000000000000000000000000000000000000000000081526004810192909252602482018490525173ffffffffffffffffffffffffffffffffffffffff9092169163441a3e709160448082019260009290919082900301818387803b158015611b9857600080fd5b613e008273ffffffffffffffffffffffffffffffffffffffff16614351565b613e6b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310613ed457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613e97565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613f36576040519150601f19603f3d011682016040523d82523d6000602084013e613f3b565b606091505b509150915081613fac57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561346b57808060200190516020811015613fc857600080fd5b505161346b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806144ec602a913960400191505060405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261346b908590613de1565b60085460ff1661186e57600654600754604080517fe2bbb1580000000000000000000000000000000000000000000000000000000081526004810192909252602482018490525173ffffffffffffffffffffffffffffffffffffffff9092169163e2bbb1589160448082019260009290919082900301818387803b158015611b9857600080fd5b600061415f436040518060600160405280603c815260200161444d603c91396142d9565b905060008363ffffffff161180156141d3575073ffffffffffffffffffffffffffffffffffffffff84166000908152600e6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8801811685529252909120548282169116145b1561423b5773ffffffffffffffffffffffffffffffffffffffff84166000908152600e6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8801168452909152902060010182905561346b565b60408051808201825263ffffffff8084168252602080830186815273ffffffffffffffffffffffffffffffffffffffff89166000818152600e84528681208a861682528452868120955186549086167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009182161787559251600196870155908152600f90925293902080549287019091169190921617905550505050565b6000816401000000008410614349576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315613960578181015183820152602001613948565b509192915050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906143855750808214155b949350505050565b60408051808201909152600080825260208201529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373496e63656e746976697a65723a3a5f6765745072696f724c505374616b653a206e6f74207965742064657465726d696e6564496e63656e746976697a65723a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77496e63656e746976697a65723a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747343616c6c6572206973206e6f742072657761726420646973747269627574696f6e496e63656e746976697a65723a3a5f7772697465537570706c79436865636b706f696e743a20626c6f636b206e756d626572206578636565647320333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a723158208e792b099a36851b2558077270ef7bfcd922d8cb598d08671b5887bd25a6a01b64736f6c634300050f0032
Deployed Bytecode Sourcemap
35228:6403:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35228:6403:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37005:265;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37005:265:0;;;;:::i;:::-;;;;;;;;;;;;;;;;22381:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35806:42;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35806:42:0;;;;:::i;22458:70::-;;;:::i;22645:72::-;;;:::i;21725:161::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21725:161:0;;;;:::i;:::-;;35712:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;21469:33;;;:::i;35674:31::-;;;:::i;24006:91::-;;;:::i;35318:41::-;;;:::i;37571:203::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37571:203:0;;:::i;28030:180::-;;;:::i;23963:34::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39015:1677;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39015:1677:0;;:::i;37887:453::-;;;:::i;23164:23::-;;;:::i;23335:44::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23335:44:0;;;;:::i;41456:172::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41456:172:0;;;;:::i;24223:95::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24223:95:0;;;;:::i;27164:324::-;;;:::i;22951:25::-;;;:::i;28218:233::-;;;:::i;23776:49::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23776:49:0;;;;:::i;24105:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24105:110:0;;;;:::i;10692:140::-;;;:::i;22535:77::-;;;:::i;29230:1223::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29230:1223:0;;;;;;;;;:::i;35558:29::-;;;:::i;36417:152::-;;;:::i;22724:79::-;;;:::i;35742:57::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35742:57:0;;;;:::i;34624:277::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34624:277:0;;:::i;35429:37::-;;;:::i;9881:79::-;;;:::i;10247:94::-;;;:::i;27881:141::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27881:141:0;;;;:::i;35368:41::-;;;:::i;23894:60::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23894:60:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;37361:202;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37361:202:0;;:::i;27496:377::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27496:377:0;;:::i;41057:391::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41057:391:0;;;;;;;;;;;;;;;;;;:::i;28652:570::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28652:570:0;;;;:::i;23122:35::-;;;:::i;35594:29::-;;;:::i;36577:420::-;;;:::i;30461:289::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30461:289:0;;;;;;;;;:::i;35630:35::-;;;:::i;33308:1139::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33308:1139:0;;:::i;37782:97::-;;;:::i;35520:31::-;;;:::i;23233:37::-;;;:::i;22902:23::-;;;:::i;23637:70::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23637:70:0;;;;;;;;;;;:::i;10987:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10987:109:0;;;;:::i;22810:85::-;;;:::i;37005:265::-;37245:16;;;37059:7;37245:16;;;:7;:16;;;;;;;;;37161:22;:31;;;;;;37099:163;;37245:16;37099:123;;37217:4;;37099:95;;37140:53;;:16;:14;:16::i;:::-;:20;:53;:20;:53;:::i;:::-;37099:18;37109:7;37099:9;:18::i;:::-;:40;:95;:40;:95;:::i;:::-;:117;:123;:117;:123;:::i;:::-;:145;:163;:145;:163;:::i;:::-;37079:183;;37005:265;;;;:::o;22381:70::-;;;;;;:::o;35806:42::-;;;;;;;;;;;;;:::o;22458:70::-;;;;;;:::o;22645:72::-;;;;;;:::o;21725:161::-;10093:9;:7;:9::i;:::-;10085:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21838:18;:40;;;;;;;;;;;;;;;;;;21725:161::o;35712:19::-;;;;;;;;;:::o;21469:33::-;;;;;;;;;:::o;35674:31::-;;;;;;:::o;24006:91::-;24077:12;;24006:91;;:::o;35318:41::-;35353:6;35318:41;:::o;37571:203::-;37625:10;36152:16;:14;:16::i;:::-;36129:20;:39;36196:26;:24;:26::i;:::-;36179:14;:43;36237:21;;;;36233:157;;36294:15;36301:7;36294:6;:15::i;:::-;36275:16;;;;;;;:7;:16;;;;;;;;:34;;;;36358:20;;36324:22;:31;;;;;;:54;36233:157;37665:1;37656:6;:10;37648:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37699:22;37714:6;37699:14;:22::i;:::-;37737:29;;;;;;;;37747:10;;37737:29;;;;;;;;;;37571:203;;:::o;28030:180::-;28106:10;28095:7;:5;:7::i;:::-;:21;;;28087:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28138:10;;28167:3;;28138:33;;;;;;;;;;;;;;:10;;;;;:28;;:33;;;;;:10;;:33;;;;;;;;:10;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;28138:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;28182:13:0;:20;;;;28198:4;28182:20;;;-1:-1:-1;;28030:180:0:o;23963:34::-;;;;;;:::o;39015:1677::-;21641:18;;;;;;;21625:12;:10;:12::i;:::-;:34;;;21617:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39139:1;36152:16;:14;:16::i;:::-;36129:20;:39;36196:26;:24;:26::i;:::-;36179:14;:43;36237:21;;;;36233:157;;36294:15;36301:7;36294:6;:15::i;:::-;36275:16;;;;;;;:7;:16;;;;;;;;:34;;;;36358:20;;36324:22;:31;;;;;;:54;36233:157;39322:20;39313:29;;39305:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39409:9;;39391:15;:27;:42;;;;-1:-1:-1;39422:11:0;;;;39391:42;39387:1298;;;39471:12;;39452:15;:31;39448:316;;39515:20;:6;35353;39515:20;:10;:20;:::i;:::-;39502:10;:33;39448:316;;;39592:12;;39572:17;;39592:33;;39609:15;39592:33;:16;:33;:::i;:::-;39572:53;;39642:16;39661:25;39675:10;;39661:9;:13;;:25;;;;:::i;:::-;39642:44;-1:-1:-1;39716:34:0;35353:6;39716:20;:6;39642:44;39716:20;:10;:20;:::i;:34::-;39703:10;:47;-1:-1:-1;;39448:316:0;39793:15;39776:14;:32;;;39836:29;;35353:6;39836:29;:19;:29;:::i;:::-;39821:12;:44;39914:3;;39902:37;;;;;;;;39878:21;;39914:3;;;39902:35;;:37;;;;;;;;;;;;;;39878:21;39914:3;39902:37;;;5:2:-1;;;;30:1;27;20:12;5:2;39902:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39902:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39902:37:0;;-1:-1:-1;39952:18:0;39973:37;40003:6;39973:25;:6;39902:37;39973:25;:10;:25;:::i;:37::-;40028:23;;;;;;;;39952:58;;-1:-1:-1;40028:23:0;;;;;;;;;;39387:1298;;;;;40140:10;;40153:20;-1:-1:-1;40132:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40229:11;;;;40228:12;40220:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40277:11;:18;;;;40291:4;40277:18;;;40344:3;;40332:37;;;;;;;;40277:11;;40344:3;;;40332:35;;:37;;;;;;;;;;;;;;40277:11;40344:3;40332:37;;;5:2:-1;;;;30:1;27;20:12;5:2;40332:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40332:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40332:37:0;40403:10;;40332:37;;-1:-1:-1;40382:18:0;;40403:41;;40437:6;;40403:29;;40332:37;40403:29;:14;:29;:::i;:41::-;40457:3;;:35;;;;;;40474:4;40457:35;;;;;;;;;;;;40382:62;;-1:-1:-1;40457:3:0;;;;;:8;;:35;;;;;:3;;:35;;;;;;;;:3;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;40457:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;40518:10:0;;:24;;-1:-1:-1;40518:10:0;-1:-1:-1;35353:6:0;40518:24;:14;:24;:::i;:::-;40505:10;:37;40572:9;;40555:14;:26;;;40609:23;;35353:6;40609:23;:13;:23;:::i;:::-;40594:12;:38;40650:23;;;;;;;;;;;;;;;;;39387:1298;;;21708:1;39015:1677;:::o;37887:453::-;37928:10;36152:16;:14;:16::i;:::-;36129:20;:39;36196:26;:24;:26::i;:::-;36179:14;:43;36237:21;;;;36233:157;;36294:15;36301:7;36294:6;:15::i;:::-;36275:16;;;;;;;:7;:16;;;;;;;;:34;;;;36358:20;;36324:22;:31;;;;;;:54;36233:157;38385:7;;;;;;;38381:607;;;;;;38460:12;;38441:15;:31;;:46;;;;-1:-1:-1;38476:11:0;;;;38441:46;38437:551;;;38623:3;;38611:37;;;;;;;;38587:21;;38623:3;;;38611:35;;:37;;;;;;;;;;;;;;38587:21;38623:3;38611:37;;;5:2:-1;;;;30:1;27;20:12;5:2;38611:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38611:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38611:37:0;38684:10;;38611:37;;-1:-1:-1;38663:18:0;;38684:41;;38718:6;;38684:29;;38611:37;38684:29;:14;:29;:::i;:41::-;38740:3;;:35;;;;;;38757:4;38740:35;;;;;;;;;;;;38663:62;;-1:-1:-1;38740:3:0;;;;;:8;;:35;;;;;:3;;:35;;;;;;;;:3;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;38740:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;38807:15:0;38790:14;:32;-1:-1:-1;;38850:10:0;;:24;;35353:6;38850:24;:14;:24;:::i;:::-;38837:10;:37;38904:29;:15;35353:6;38904:29;:19;:29;:::i;:::-;38889:12;:44;38953:23;;;;;;;;;;;;;;;;;38437:551;;;37987:10;37962:14;37979:19;;;:7;:19;;;;;;38013:10;;38009:324;;38048:10;38062:1;38040:19;;;:7;:19;;;;;;;;:23;;;38114:3;;38102:37;;;;;;;38040:19;38114:3;;;;38102:35;;:37;;;;;;;;;;;38062:1;38114:3;38102:37;;;5:2:-1;;;;30:1;27;20:12;5:2;38102:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38102:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38102:37:0;;-1:-1:-1;38154:18:0;38175:37;38205:6;38175:25;:6;38102:37;38175:25;:10;:25;:::i;:37::-;38227:3;;38154:58;;-1:-1:-1;38227:40:0;;:3;;38244:10;38154:58;38227:40;:16;:40;:::i;:::-;38287:34;;;;;;;;38298:10;;38287:34;;;;;;;;;;38009:324;;38998:1;37887:453;:::o;23164:23::-;;;;;;:::o;23335:44::-;;;;;;;;;;;;;;;:::o;41456:172::-;41568:7;:5;:7::i;:::-;41554:21;;:10;:21;;;41546:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41602:7;:18;;;;;;;;;;;;;;;;;41456:172::o;24223:95::-;24278:32;24288:10;24300:9;24278;:32::i;:::-;24223:95;:::o;27164:324::-;27207:10;;27227:3;;27207:27;;;;;;;;;;;;;:10;:27;;;;;;;;:10;;;;;:19;;:27;;;;;:10;:27;;;;;;:10;;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;27207:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;27265:5:0;;;:30;;;;;;27289:4;27265:30;;;;;;;;27245:17;;-1:-1:-1;27265:5:0;;;;;-1:-1:-1;27265:15:0;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;27265:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27265:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27265:30:0;27310:5;;;27349:8;;27310:49;;;;;;27334:4;27310:49;;;;;;;:5;27349:8;;;27310:49;;;;;27265:30;;-1:-1:-1;27265:30:0;;27310:5;;;:15;;:49;;;;;27265:30;;27310:49;;;;;;;:5;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;27310:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27310:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27310:49:0;:61;27306:139;;;27388:5;;;27410:8;;27388:45;;;;;;:5;27410:8;;;27388:45;;;;;;;27429:2;27388:45;;;;;:5;;;:13;;:45;;;;;;;;;;;;;;:5;;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;27388:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27388:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;27306:139:0;27455:8;;:25;;;;;;;;;;;;;;:8;;;;;:14;;:25;;;;;:8;;:25;;;;;;;;:8;;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;27455:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27455:25:0;;;;27164:324;:::o;22951:25::-;;;;;;:::o;28218:233::-;28279:10;28268:7;:5;:7::i;:::-;:21;;;28260:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28319:13;;;;28311:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28358:10;;28377:3;;28358:10;28382:3;:28;;;;;;28404:4;28382:28;;;;;;28358:10;;;;;:18;;28377:3;28382;;:13;;:28;;;;;;;;;;;;;;:3;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;28382:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28382:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28382:28:0;28358:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28358:53:0;;;;;;;-1:-1:-1;28358:53:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;28358:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;28422:13:0;:21;;;;;;-1:-1:-1;;28218:233:0:o;23776:49::-;;;;;;;;;;;;;;;:::o;24105:110::-;24189:18;;24162:7;24189:18;;;:9;:18;;;;;;;24105:110::o;10692:140::-;10093:9;:7;:9::i;:::-;10085:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10791:1;10775:6;;10754:40;;;10775:6;;;;10754:40;;10791:1;;10754:40;10822:1;10805:19;;;;;;10692:140::o;22535:77::-;;;;;;:::o;29230:1223::-;29339:7;29386:12;29372:11;:26;29364:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29466:11;;;;29465:12;;:50;;;29495:20;;29481:11;:34;29465:50;29461:91;;;-1:-1:-1;29539:1:0;29532:8;;29461:91;29648:3;;;29676;29636:58;;;;;;29648:3;29676;;;29636:58;;;;;;;;;;;;29616:17;;29648:3;;;;;29636:31;;:58;;;;;;;;;;;;;;;29648:3;29636:58;;;5:2:-1;;;;30:1;27;20:12;5:2;29636:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29636:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29636:58:0;;-1:-1:-1;29711:14:0;29707:55;;29749:1;29742:8;;;;;29707:55;29802:18;29823:38;29840:7;29849:11;29823:16;:38::i;:::-;29802:59;-1:-1:-1;29878:15:0;29874:56;;29917:1;29910:8;;;;;;29874:56;29973:21;29997:27;30012:11;29997:14;:27::i;:::-;29973:51;-1:-1:-1;30041:18:0;30037:59;;30083:1;30076:8;;;;;;;30037:59;30156:21;30180:39;30205:13;30180:20;:10;23264:6;30180:20;:14;:20;:::i;:39::-;30156:63;-1:-1:-1;30407:38:0;23264:6;30407:28;:9;30156:63;30407:28;:13;:28;:::i;:38::-;30400:45;;;;;;29230:1223;;;;;:::o;35558:29::-;;;;:::o;36417:152::-;36474:7;36501:60;36510:9;;36521:39;36530:15;36547:12;;36521:8;:39::i;:::-;36501:8;:60::i;:::-;36494:67;;36417:152;:::o;22724:79::-;;;;;;:::o;35742:57::-;;;;;;;;;;;;;:::o;34624:277::-;34752:7;:5;:7::i;:::-;34738:21;;:10;:21;;;34730:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34795:11;;;;34794:12;34786:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34833:20;:31;34875:11;:18;;;;34889:4;34875:18;;;34624:277::o;35429:37::-;;;;:::o;9881:79::-;9919:7;9946:6;;;9881:79;:::o;10247:94::-;10287:4;10327:6;;;;10311:12;:10;:12::i;:::-;:22;;;10304:29;;10247:94;:::o;27881:141::-;27960:10;27949:7;:5;:7::i;:::-;:21;;;27941:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27992:8;:22;;;;;;;;;;;;;;;27881:141::o;35368:41::-;;;;:::o;23894:60::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;37361:202::-;37412:10;36152:16;:14;:16::i;:::-;36129:20;:39;36196:26;:24;:26::i;:::-;36179:14;:43;36237:21;;;;36233:157;;36294:15;36301:7;36294:6;:15::i;:::-;36275:16;;;;;;;:7;:16;;;;;;;;:34;;;;36358:20;;36324:22;:31;;;;;;:54;36233:157;38385:7;;;;;;;38381:607;;;;;;38460:12;;38441:15;:31;;:46;;;;-1:-1:-1;38476:11:0;;;;38441:46;38437:551;;;38623:3;;38611:37;;;;;;;;38587:21;;38623:3;;;38611:35;;:37;;;;;;;;;;;;;;38587:21;38623:3;38611:37;;;5:2:-1;;;;30:1;27;20:12;5:2;38611:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38611:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38611:37:0;38684:10;;38611:37;;-1:-1:-1;38663:18:0;;38684:41;;38718:6;;38684:29;;38611:37;38684:29;:14;:29;:::i;:41::-;38740:3;;:35;;;;;;38757:4;38740:35;;;;;;;;;;;;38663:62;;-1:-1:-1;38740:3:0;;;;;:8;;:35;;;;;:3;;:35;;;;;;;;:3;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;38740:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;38807:15:0;38790:14;:32;-1:-1:-1;;38850:10:0;;:24;;35353:6;38850:24;:14;:24;:::i;:::-;38837:10;:37;38904:29;:15;35353:6;38904:29;:19;:29;:::i;:::-;38889:12;:44;38953:23;;;;;;;;;;;;;;;;;38437:551;;;37463:1;37454:6;:10;37446:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37494:19;37506:6;37494:11;:19::i;:::-;37529:26;;;;;;;;37536:10;;37529:26;;;;;;;;;;37361:202;;:::o;27496:377::-;27578:10;27567:7;:5;:7::i;:::-;:21;;;27559:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27667:2;27645:10;:25;27641:119;;;27713:8;;27698:50;;;;;;27742:4;27698:50;;;;;;27713:8;;;;;27698:35;;:50;;;;;;;;;;;;;;;27713:8;27698:50;;;5:2:-1;;;;30:1;27;20:12;5:2;27698:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27698:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27698:50:0;;-1:-1:-1;27641:119:0;27772:8;;:26;;;;;;;;;;;;;;:8;;;;;:14;;:26;;;;;:8;;:26;;;;;;;;:8;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;27772:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;27809:5:0;;;27824:8;;27834:30;;;;;;27858:4;27834:30;;;;;;;;27809:5;;;;;-1:-1:-1;27809:14:0;;-1:-1:-1;27824:8:0;;;27809:5;;27834:15;;:30;;;;;;;;;;;;;;;27809:5;27834:30;;;5:2:-1;;;;30:1;27;20:12;5:2;27834:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27834:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27834:30:0;27809:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27834:30;;27809:56;;;;;;;-1:-1:-1;27809:56:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;27809:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27809:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;27496:377:0:o;41057:391::-;41199:7;:5;:7::i;:::-;41185:21;;:10;:21;;;41177:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41286:3;;;41276:13;;;41286:3;;41276:13;;41268:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41361:3;;;41351:13;;;41361:3;;41351:13;;41343:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41409:31;:19;;;41429:2;41433:6;41409:31;:19;:31;:::i;28652:570::-;28774:11;;28744:7;;28774:11;;28773:12;;:51;;;28804:20;;28789:12;:35;28773:51;28769:92;;;-1:-1:-1;28848:1:0;28841:8;;28769:92;28903:3;;;28933;28891:47;;;;;;28903:3;28933;;;28891:47;;;;;;28871:17;;28903:3;;;;;28891:33;;:47;;;;;;;;;;;;;;;28903:3;28891:47;;;5:2:-1;;;;30:1;27;20:12;5:2;28891:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28891:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28891:47:0;28971:23;;;28949:19;28971:23;;;:14;28891:47;28971:23;;;;;28891:47;;-1:-1:-1;28971:23:0;;;;;29023:16;:69;;29091:1;29023:69;;;29042:20;;;;;;;:11;:20;;;;;;;;:38;29063:16;;;29042:38;;;;;;;;29078:1;29042:46;;29023:69;29005:87;;29103:19;29125:35;29147:12;;29125:17;23264:6;29125:7;:11;;:17;;;;:::i;:35::-;29103:57;-1:-1:-1;29178:36:0;23264:6;29178:26;:9;29103:57;29178:26;:13;:26;:::i;:36::-;29171:43;28652:570;-1:-1:-1;;;;;;28652:570:0:o;23122:35::-;;;;:::o;35594:29::-;;;;:::o;36577:420::-;36624:7;36648:13;:11;:13::i;:::-;36644:78;;-1:-1:-1;36690:20:0;;36683:27;;36644:78;36752:237;36795:179;36960:13;:11;:13::i;:::-;36795:138;36928:4;36795:106;36890:10;;36795:68;36848:14;;36795:26;:24;:26::i;:179::-;36752:20;;;:237;:24;:237;:::i;30461:289::-;30572:7;30619:12;30605:11;:26;30597:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30704:38;30721:7;30730:11;30704:16;:38::i;:::-;30697:45;30461:289;-1:-1:-1;;;30461:289:0:o;35630:35::-;;;;:::o;33308:1139::-;33430:20;;33401:7;;33430:20;;33426:66;;-1:-1:-1;33479:1:0;33472:8;;33426:66;33575:20;;:24;:20;;;;:24;33552:48;;;;;;:22;:48;;;;;:58;;:73;-1:-1:-1;33548:169:0;;-1:-1:-1;33672:20:0;;:24;:20;;;;:24;33649:48;;;;;:22;:48;;;;;33695:1;33649:56;;33642:63;;33548:169;33778:25;;;:22;:25;;;:35;:25;:35;:49;-1:-1:-1;33774:90:0;;;-1:-1:-1;33851:1:0;33844:8;;33774:90;33918:20;;33876:12;;33918:20;;:24;;33953:432;33968:5;33960:13;;:5;:13;;;33953:432;;;34032:1;34015:13;;;34014:19;;;34006:27;;34075:20;;:::i;:::-;-1:-1:-1;34098:30:0;;;;;;;;:22;:30;;;;;;;;;34075:53;;;;;;;;;;;;;;;;;;;;;;;;;;34147:27;;34143:231;;;34202:10;;;;-1:-1:-1;34195:17:0;;-1:-1:-1;;;34195:17:0;34143:231;34238:12;;:26;;;-1:-1:-1;34234:140:0;;;34293:6;34285:14;;34234:140;;;34357:1;34348:6;:10;34340:18;;34234:140;33953:432;;;;;-1:-1:-1;34402:29:0;;;;;;:22;:29;;;;;:37;;;;33308:1139;-1:-1:-1;;33308:1139:0:o;37782:97::-;37818:31;37827:21;37837:10;37827:9;:21::i;:::-;37818:8;:31::i;:::-;37860:11;:9;:11::i;:::-;37782:97::o;35520:31::-;;;;:::o;23233:37::-;23264:6;23233:37;:::o;22902:23::-;;;;:::o;23637:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10987:109::-;10093:9;:7;:9::i;:::-;10085:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11060:28;11079:8;11060:18;:28::i;22810:85::-;;;;;;:::o;3631:136::-;3689:7;3716:43;3720:1;3723;3716:43;;;;;;;;;;;;;;;;;:3;:43::i;4547:471::-;4605:7;4850:6;4846:47;;-1:-1:-1;4880:1:0;4873:8;;4846:47;4917:5;;;4921:1;4917;:5;:1;4941:5;;;;;:10;4933:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5486:132;5544:7;5571:39;5575:1;5578;5571:39;;;;;;;;;;;;;;;;;:3;:39::i;3175:181::-;3233:7;3265:5;;;3289:6;;;;3281:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26238:456;26305:12;;:24;;26322:6;26305:24;:16;:24;:::i;:::-;26290:12;:39;26368:10;26340:15;26358:21;;;:9;:21;;;;;;:33;;26384:6;26358:33;:25;:33;:::i;:::-;26412:10;26402:21;;;;:9;:21;;;;;;;;:31;;;26459:9;:21;;;;;;26340:51;;-1:-1:-1;26444:57:0;;26402:21;26459;;26494:6;26444:14;:57::i;:::-;26512:24;:22;:24::i;:::-;26584:30;26607:6;26584:22;:30::i;:::-;26650:3;;:36;;:3;;26667:10;26679:6;26650:36;:16;:36;:::i;8630:98::-;8710:10;8630:98;:::o;18167:176::-;18276:58;;;18299:14;18276:58;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18276:58:0;;;;;;;;25:18:-1;;61:17;;18276:58:0;182:15:-1;18299:23:0;179:29:-1;160:49;;18250:85:0;;18269:5;;18250:18;:85::i;24326:322::-;24453:10;24417:23;24443:21;;;:9;:21;;;;;;;;;;24502:9;:21;;;;;;;24534;;;;24443;24534:33;;;;;;;;;;24443:21;;;;24580:60;24443:21;24558:9;24502:21;24580:14;:60::i;:::-;24326:322;;;;:::o;30758:1174::-;30919:23;;;30872:7;30919:23;;;:14;:23;;;;;;;;30957:17;30953:58;;30998:1;30991:8;;;;;30953:58;31071:20;;;;;;;:11;:20;;;;;;;;:38;31092:16;;;31071:38;;;;;;;;;:48;;:63;-1:-1:-1;31067:149:0;;31158:20;;;;;;;:11;:20;;;;;;;;31179:16;;;;;31158:38;;;;;;;;31194:1;31158:46;;;-1:-1:-1;31151:53:0;;31067:149;31277:20;;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;31273:88:0;;;31348:1;31341:8;;;;;31273:88;31373:12;31415:16;;;31442:430;31457:5;31449:13;;:5;:13;;;31442:430;;;31521:1;31504:13;;;31503:19;;;31495:27;;31564:20;;:::i;:::-;-1:-1:-1;31587:20:0;;;;;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;31564:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31634:27;;31630:231;;;31689:10;;;;-1:-1:-1;31682:17:0;;-1:-1:-1;;;;31682:17:0;31630:231;31725:12;;:26;;;-1:-1:-1;31721:140:0;;;31780:6;31772:14;;31721:140;;;31844:1;31835:6;:10;31827:18;;31721:140;31442:430;;;;;-1:-1:-1;31889:20:0;;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:35;;;;-1:-1:-1;;30758:1174:0;;;;:::o;1837:106::-;1895:7;1926:1;1922;:5;:13;;1934:1;1922:13;;;-1:-1:-1;1930:1:0;;1837:106;-1:-1:-1;1837:106:0:o;1654:107::-;1712:7;1744:1;1739;:6;;:14;;1752:1;1739:14;;25595:635;25659:12;;:24;;25676:6;25659:24;:16;:24;:::i;:::-;25644:12;:39;25722:10;25694:15;25712:21;;;:9;:21;;;;;;:33;;25738:6;25712:33;:25;:33;:::i;:::-;25766:10;25756:21;;;;:9;:21;;;;;;;;:31;;;25817:9;:21;;;;;;25694:51;;-1:-1:-1;25756:21:0;25817;25853:22;25849:121;;-1:-1:-1;25914:10:0;25890:21;;;;:9;:21;;;;;:34;;;;;;;;25849:121;25980:44;26003:1;26007:8;26017:6;25980:14;:44::i;:::-;26035:24;:22;:24::i;:::-;26095:3;;:55;;:3;;26116:10;26136:4;26143:6;26095:55;:20;:55;:::i;:::-;26195:27;26215:6;26195:19;:27::i;11202:229::-;11276:22;;;11268:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11378:6;;;11357:38;;;;;;;11378:6;;;11357:38;;;11406:6;:17;;;;;;;;;;;;;;;11202:229::o;4104:192::-;4190:7;4226:12;4218:6;;;;4210:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4210:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4262:5:0;;;4104:192::o;6148:345::-;6234:7;6336:12;6329:5;6321:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;6321:28:0;;6360:9;6376:1;6372;:5;;;;;;;6148:345;-1:-1:-1;;;;;6148:345:0:o;24656:929::-;24762:6;24752:16;;:6;:16;;;;:30;;;;;24781:1;24772:6;:10;24752:30;24748:830;;;24803:20;;;;24799:376;;24911:22;;;24892:16;24911:22;;;:14;:22;;;;;;;;;24972:13;:62;;25033:1;24972:62;;;24988:19;;;;;;;:11;:19;;;;;;;;:34;25008:13;;;24988:34;;;;;;;;25020:1;24988:42;;24972:62;24952:82;-1:-1:-1;25053:17:0;25073:21;24952:82;25087:6;25073:21;:13;:21;:::i;:::-;25053:41;;25113:46;25130:6;25138:9;25149;25113:16;:46::i;:::-;24799:376;;;;25195:20;;;;25191:376;;25303:22;;;25284:16;25303:22;;;:14;:22;;;;;;;;;25364:13;:62;;25425:1;25364:62;;;25380:19;;;;;;;:11;:19;;;;;;;;:34;25400:13;;;25380:34;;;;;;;;25412:1;25380:42;;25364:62;25344:82;-1:-1:-1;25445:17:0;25465:21;25344:82;25479:6;25465:21;:13;:21;:::i;:::-;25445:41;;25505:46;25522:6;25530:9;25541;25505:16;:46::i;:::-;25191:376;;;24656:929;;;:::o;32656:644::-;32724:18;32745:90;32752:12;32745:90;;;;;;;;;;;;;;;;;:6;:90::i;:::-;32935:20;;32724:111;;-1:-1:-1;32935:20:0;;:24;;;;:101;;-1:-1:-1;32986:20:0;;:24;32963:73;32986:20;;;:24;32963:48;;;;;;:22;:48;;;;;:58;;;:73;;;;32935:101;32931:362;;;33112:12;;33076:20;;:24;:20;;;;:24;33053:48;;;;;:22;:48;;;;;33099:1;33053:56;:71;32931:362;;;33204:37;;;;;;;;;;;;;;33228:12;;33204:37;;;;;;;33180:20;;;;;-1:-1:-1;33157:44:0;;;:22;:44;;;;;;:84;;;;;;;;;;;;;;;;33180:20;33157:84;;;;33256:25;;;;;;;;;;;;;;;;32656:644;:::o;26924:154::-;26997:13;;;;26992:79;;27027:10;;27047:3;;27027:32;;;;;;;;;;;;;;;;;;;;:10;;;;;:19;;:32;;;;;:10;;:32;;;;;;;;:10;;:32;;;5:2:-1;;;;30:1;27;20:12;20206:1114:0;20810:27;20818:5;20810:25;;;:27::i;:::-;20802:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20947:12;20961:23;20996:5;20988:19;;21008:4;20988:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20988:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;20946:67:0;;;;21032:7;21024:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21093:17;;:21;21089:224;;21235:10;21224:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21224:30:0;21216:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18351:204;18478:68;;;18501:18;18478:68;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18478:68:0;;;;;;;;25:18:-1;;61:17;;18478:68:0;182:15:-1;18501:27:0;179:29:-1;160:49;;18452:95:0;;18471:5;;18452:18;:95::i;26702:214::-;26836:13;;;;26831:78;;26866:10;;26885:3;;26866:31;;;;;;;;;;;;;;;;;;;;:10;;;;;:18;;:31;;;;;:10;;:31;;;;;;;;:10;;:31;;;5:2:-1;;;;30:1;27;20:12;31940:708:0;32182:18;32203:84;32210:12;32203:84;;;;;;;;;;;;;;;;;:6;:84::i;:::-;32182:105;;32319:1;32304:12;:16;;;:85;;;;-1:-1:-1;32324:22:0;;;;;;;:11;:22;;;;;;;;:65;32347:16;;;32324:40;;;;;;;;;:50;:65;;;:50;;:65;32304:85;32300:341;;;32406:22;;;;;;;:11;:22;;;;;;;;:40;32429:16;;;32406:40;;;;;;;;32444:1;32406:48;:59;;;32300:341;;;32537:33;;;;;;;;;;;;;;;;;;;;;32498:22;;;-1:-1:-1;32498:22:0;;;:11;:22;;;;;:36;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;32585:25;;;:14;:25;;;;;;:44;;32613:16;;;32585:44;;;;;;;;;;31940:708;;;;:::o;34455:161::-;34530:6;34568:12;34561:5;34557:9;;34549:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;34549:32:0;-1:-1:-1;34606:1:0;;34455:161;-1:-1:-1;;34455:161:0:o;15005:810::-;15065:4;15724:20;;15567:66;15764:15;;;;;:42;;;15795:11;15783:8;:23;;15764:42;15756:51;15005:810;-1:-1:-1;;;;15005:810:0:o;35228:6403::-;;;;;;;;;;-1:-1:-1;35228:6403:0;;;;;;;;:::o
Swarm Source
bzzr://8e792b099a36851b2558077270ef7bfcd922d8cb598d08671b5887bd25a6a01b
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ 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.