Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 343 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 19171473 | 198 days ago | IN | 0 ETH | 0.00124569 | ||||
Claim Any Token | 17762856 | 396 days ago | IN | 0 ETH | 0.00154258 | ||||
Claim Any Token | 17491355 | 434 days ago | IN | 0 ETH | 0.0006971 | ||||
Claim Any Token | 17491353 | 434 days ago | IN | 0 ETH | 0.00073857 | ||||
Withdraw | 17013645 | 501 days ago | IN | 0 ETH | 0.0005128 | ||||
Claim | 16759854 | 537 days ago | IN | 0 ETH | 0.00213449 | ||||
Claim | 16759853 | 537 days ago | IN | 0 ETH | 0.00323428 | ||||
Withdraw | 16410537 | 586 days ago | IN | 0 ETH | 0.0041775 | ||||
Claim | 16410521 | 586 days ago | IN | 0 ETH | 0.00381482 | ||||
Withdraw | 16383698 | 590 days ago | IN | 0 ETH | 0.00587317 | ||||
Claim | 16328211 | 597 days ago | IN | 0 ETH | 0.00123573 | ||||
Claim | 16328211 | 597 days ago | IN | 0 ETH | 0.0054821 | ||||
Withdraw | 16270415 | 605 days ago | IN | 0 ETH | 0.00456239 | ||||
Withdraw | 16249638 | 608 days ago | IN | 0 ETH | 0.00444035 | ||||
Withdraw | 16214041 | 613 days ago | IN | 0 ETH | 0.00328437 | ||||
Claim | 16214026 | 613 days ago | IN | 0 ETH | 0.00178275 | ||||
Withdraw | 16213356 | 613 days ago | IN | 0 ETH | 0.00331742 | ||||
Claim | 16212444 | 614 days ago | IN | 0 ETH | 0.00306478 | ||||
Withdraw | 16195632 | 616 days ago | IN | 0 ETH | 0.0044278 | ||||
Withdraw | 16171321 | 619 days ago | IN | 0 ETH | 0.00612098 | ||||
Claim | 16142374 | 623 days ago | IN | 0 ETH | 0.00316394 | ||||
Withdraw | 16105221 | 629 days ago | IN | 0 ETH | 0.00415251 | ||||
Withdraw | 16092019 | 630 days ago | IN | 0 ETH | 0.00516613 | ||||
Withdraw | 16017765 | 641 days ago | IN | 0 ETH | 0.00291156 | ||||
Withdraw | 16016988 | 641 days ago | IN | 0 ETH | 0.00421854 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
FarmProRata
Compiler Version
v0.6.11+commit.5ef660b1
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-14 */ pragma solidity 0.6.11; // SPDX-License-Identifier: BSD-3-Clause /** * @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. */ 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. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { 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. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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); /** * @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); } /** * @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 IERC20;` 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ 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. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "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"); } } } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) onlyOwner public { require(newOwner != address(0)); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } } interface IUniswapV2Router { function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Pair { function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function token0() external view returns (address); function token1() external view returns (address); function sync() external; } interface StakingContract { function depositByContract(address account, uint amount, uint _amountOutMin_stakingReferralFee, uint deadline) external; } /** * @dev Staking Smart Contract * * - Users stake Uniswap LP Tokens to receive WETH and DYP Tokens as Rewards * * - Reward Tokens (DYP) are added to contract balance upon deployment by deployer * * - After Adding the DYP rewards, admin is supposed to transfer ownership to Governance contract * * - Users deposit Set (Predecided) Uniswap LP Tokens and get a share of the farm * * - The smart contract disburses `disburseAmount` DYP as rewards over `disburseDuration` * * - A swap is attempted periodically at atleast a set delay from last swap * * - The swap is attempted according to SWAP_PATH for difference deployments of this contract * * - For 4 different deployments of this contract, the SWAP_PATH will be: * - DYP-WETH * - DYP-WBTC-WETH (assumes appropriate liquidity is available in WBTC-WETH pair) * - DYP-USDT-WETH (assumes appropriate liquidity is available in USDT-WETH pair) * - DYP-USDC-WETH (assumes appropriate liquidity is available in USDC-WETH pair) * * - Any swap may not have a price impact on DYP price of more than approx ~2.49% for the related DYP pair * DYP-WETH swap may not have a price impact of more than ~2.49% on DYP price in DYP-WETH pair * DYP-WBTC-WETH swap may not have a price impact of more than ~2.49% on DYP price in DYP-WBTC pair * DYP-USDT-WETH swap may not have a price impact of more than ~2.49% on DYP price in DYP-USDT pair * DYP-USDC-WETH swap may not have a price impact of more than ~2.49% on DYP price in DYP-USDC pair * * - After the swap,converted WETH is distributed to stakers at pro-rata basis, according to their share of the staking pool * on the moment when the WETH distribution is done. And remaining DYP is added to the amount to be distributed or burnt. * The remaining DYP are also attempted to be swapped to WETH in the next swap if the price impact is ~2.49% or less * * - At a set delay from last execution, Governance contract (owner) may execute disburse or burn features * * - Burn feature should send the DYP tokens to set BURN_ADDRESS * * - Disburse feature should disburse the DYP * (which would have a max price impact ~2.49% if it were to be swapped, at disburse time * - remaining DYP are sent to BURN_ADDRESS) * to stakers at pro-rata basis according to their share of * the staking pool at the moment the disburse is done * * - Users may claim their pending WETH and DYP anytime * * - Pending rewards are auto-claimed on any deposit or withdraw * * - Users need to wait `cliffTime` duration since their last deposit before withdrawing any LP Tokens * * - Owner may not transfer out LP Tokens from this contract anytime * * - Owner may transfer out WETH and DYP Tokens from this contract once `adminClaimableTime` is reached * * - CONTRACT VARIABLES must be changed to appropriate values before live deployment */ contract FarmProRata is Ownable { using SafeMath for uint; using EnumerableSet for EnumerableSet.AddressSet; using Address for address; using SafeERC20 for IERC20; event RewardsTransferred(address holder, uint amount); event EthRewardsTransferred(address holder, uint amount); event RewardsDisbursed(uint amount); event EthRewardsDisbursed(uint amount); event EmergencyDeclared(address owner); event UniswapV2RouterChanged(address router); event StakingFeeChanged(uint fee); event UnstakingFeeChanged(uint fee); event MagicNumberChanged(uint newMagicNumber); event LockupTimeChanged(uint lockupTime); event FeeRecipientAddressChanged(address newAddress); // ============ SMART CONTRACT VARIABLES ========================== // Must be changed to appropriate configuration before live deployment // deposit token contract address and reward token contract address // these contracts (and uniswap pair & router) are "trusted" // and checked to not contain re-entrancy pattern // to safely avoid checks-effects-interactions where needed to simplify logic address public constant trustedDepositTokenAddress = 0x7463286A379F6F128058bb92B355e3d6E8BDB219; // uniswap pair address // token used for rewards - this must be one of the tokens in uniswap pair. address public constant trustedRewardTokenAddress = 0xBD100d061E120b2c67A24453CF6368E63f1Be056; address public constant trustedStakingContractAddress = 0x1aB008CbfC99d0CA7e3FD8987ce1ebf832506F53; // the main token which is normally claimed as reward address public constant trustedPlatformTokenAddress = 0x961C8c0B1aaD0c0b10a51FeF6a867E3091BCef17; // the other token in the uniswap pair used address public constant trustedBaseTokenAddress = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // Make sure to double-check BURN_ADDRESS address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD; // cliffTime - withdraw is not possible within cliffTime of deposit uint public cliffTime = 90 days; // Amount of tokens uint public constant disburseAmount = 2760000e18; // To be disbursed continuously over this duration uint public constant disburseDuration = 365 days; // If there are any undistributed or unclaimed tokens left in contract after this time // Admin can claim them uint public constant adminCanClaimAfter = 395 days; // delays between attempted swaps uint public constant swapAttemptPeriod = 1 days; // delays between attempted burns or token disbursement uint public constant burnOrDisburseTokensPeriod = 7 days; // do not change this => disburse 100% rewards over `disburseDuration` uint public constant disbursePercentX100 = 100e2; uint public constant EMERGENCY_WAIT_TIME = 3 days; uint public STAKING_FEE_RATE_X_100 = 0; uint public UNSTAKING_FEE_RATE_X_100 = 0; uint public MAGIC_NUMBER = 5025125628140614; // ============ END CONTRACT VARIABLES ========================== event ClaimableTokenAdded(address indexed tokenAddress); event ClaimableTokenRemoved(address indexed tokenAddress); mapping (address => bool) public trustedClaimableTokens; function addTrustedClaimableToken(address trustedClaimableTokenAddress) external onlyOwner { trustedClaimableTokens[trustedClaimableTokenAddress] = true; emit ClaimableTokenAdded(trustedClaimableTokenAddress); } function removeTrustedClaimableToken(address trustedClaimableTokenAddress) external onlyOwner { trustedClaimableTokens[trustedClaimableTokenAddress] = false; emit ClaimableTokenRemoved(trustedClaimableTokenAddress); } uint public contractDeployTime; uint public adminClaimableTime; uint public lastDisburseTime; uint public lastSwapExecutionTime; uint public lastBurnOrTokenDistributeTime; bool public isEmergency = false; IUniswapV2Router public uniswapRouterV2; IUniswapV2Pair public uniswapV2Pair; address[] public SWAP_PATH; address public feeRecipientAddress; constructor(address[] memory swapPath, address _uniswapV2RouterAddress, address _feeRecipientAddress) public { contractDeployTime = now; adminClaimableTime = contractDeployTime.add(adminCanClaimAfter); lastDisburseTime = contractDeployTime; lastSwapExecutionTime = lastDisburseTime; lastBurnOrTokenDistributeTime = lastDisburseTime; setUniswapV2Router(IUniswapV2Router(_uniswapV2RouterAddress)); setFeeRecipientAddress(_feeRecipientAddress); uniswapV2Pair = IUniswapV2Pair(trustedDepositTokenAddress); SWAP_PATH = swapPath; } function setFeeRecipientAddress(address newFeeRecipientAddress) public onlyOwner { require(newFeeRecipientAddress != address(0), "Invalid address!"); feeRecipientAddress = newFeeRecipientAddress; emit FeeRecipientAddressChanged(feeRecipientAddress); } // Contracts are not allowed to deposit, claim or withdraw modifier noContractsAllowed() { require(!(address(msg.sender).isContract()) && tx.origin == msg.sender, "No Contracts Allowed!"); _; } modifier notDuringEmergency() { require(!isEmergency, "Cannot execute during emergency!"); _; } function declareEmergency() external onlyOwner notDuringEmergency { isEmergency = true; adminClaimableTime = now.add(EMERGENCY_WAIT_TIME); cliffTime = 0; emit EmergencyDeclared(owner); } uint public totalClaimedRewards = 0; uint public totalClaimedRewardsEth = 0; EnumerableSet.AddressSet private holders; mapping (address => uint) public depositedTokens; mapping (address => uint) public depositTime; mapping (address => uint) public lastClaimedTime; mapping (address => uint) public totalEarnedTokens; mapping (address => uint) public totalEarnedEth; mapping (address => uint) public lastDivPoints; mapping (address => uint) public lastEthDivPoints; uint public contractBalance = 0; uint public totalDivPoints = 0; uint public totalEthDivPoints = 0; uint public totalTokens = 0; uint public tokensToBeDisbursedOrBurnt = 0; uint public tokensToBeSwapped = 0; uint internal constant pointMultiplier = 1e18; function setUniswapV2Router(IUniswapV2Router router) public onlyOwner { require(address(router) != address(0), "Invalid router address!"); uniswapRouterV2 = router; emit UniswapV2RouterChanged(address(uniswapRouterV2)); } function setStakingFeeRateX100(uint newStakingFeeRateX100) public onlyOwner { require(newStakingFeeRateX100 < 100e2, "Invalid fee!"); STAKING_FEE_RATE_X_100 = newStakingFeeRateX100; emit StakingFeeChanged(STAKING_FEE_RATE_X_100); } function setUnstakingFeeRateX100(uint newUnstakingFeeRateX100) public onlyOwner { require(newUnstakingFeeRateX100 < 100e2, "Invalid fee!"); UNSTAKING_FEE_RATE_X_100 = newUnstakingFeeRateX100; emit UnstakingFeeChanged(UNSTAKING_FEE_RATE_X_100); } function setMagicNumber(uint newMagicNumber) public onlyOwner { MAGIC_NUMBER = newMagicNumber; emit MagicNumberChanged(MAGIC_NUMBER); } function setLockupTime(uint _newLockupTime) public onlyOwner { require(_newLockupTime <= 90 days, "Lockup time too long!"); cliffTime = _newLockupTime; emit LockupTimeChanged(cliffTime); } function setContractVariables( uint newMagicNumber, uint lockupTime, uint stakingFeeRateX100, uint unstakingFeeRateX100, address _uniswapV2RouterAddress, address newFeeRecipientAddress ) external onlyOwner { setMagicNumber(newMagicNumber); setLockupTime(lockupTime); setStakingFeeRateX100(stakingFeeRateX100); setUnstakingFeeRateX100(unstakingFeeRateX100); setUniswapV2Router(IUniswapV2Router(_uniswapV2RouterAddress)); setFeeRecipientAddress(newFeeRecipientAddress); } // To be executed by admin after deployment to add DYP to contract function addContractBalance(uint amount) public onlyOwner { IERC20(trustedRewardTokenAddress).safeTransferFrom(msg.sender, address(this), amount); contractBalance = contractBalance.add(amount); } function doSwap(address fromToken, address toToken, uint fromTokenAmount, uint amountOutMin, uint deadline) private returns (uint _toTokenReceived) { if (fromToken == toToken) { return fromTokenAmount; } IERC20(fromToken).safeApprove(address(uniswapRouterV2), 0); IERC20(fromToken).safeApprove(address(uniswapRouterV2), fromTokenAmount); uint oldToTokenBalance = IERC20(toToken).balanceOf(address(this)); address[] memory path; if (fromToken == uniswapRouterV2.WETH() || toToken == uniswapRouterV2.WETH()) { path = new address[](2); path[0] = fromToken; path[1] = toToken; } else { path = new address[](3); path[0] = fromToken; path[1] = uniswapRouterV2.WETH(); path[2] = toToken; } uniswapRouterV2.swapExactTokensForTokens(fromTokenAmount, amountOutMin, path, address(this), deadline); uint newToTokenBalance = IERC20(toToken).balanceOf(address(this)); uint toTokenReceived = newToTokenBalance.sub(oldToTokenBalance); return toTokenReceived; } // Private function to update account information and auto-claim pending rewards function updateAccount( address account, address claimAsToken, uint _amountOutMin_claimAsToken_weth, uint _amountOutMin_claimAsToken_dyp, uint _amountOutMin_attemptSwap, uint _deadline ) private { disburseTokens(); attemptSwap(_amountOutMin_attemptSwap, _deadline); uint pendingDivs = getPendingDivs(account); if (pendingDivs > 0) { uint amountToTransfer; address tokenToTransfer; if (claimAsToken == address(0) || claimAsToken == trustedPlatformTokenAddress) { tokenToTransfer = trustedPlatformTokenAddress; amountToTransfer = doSwap(trustedRewardTokenAddress, trustedPlatformTokenAddress, pendingDivs, _amountOutMin_claimAsToken_dyp, _deadline); } else { tokenToTransfer = claimAsToken; amountToTransfer = doSwap(trustedRewardTokenAddress, claimAsToken, pendingDivs, _amountOutMin_claimAsToken_dyp, _deadline); } IERC20(tokenToTransfer).safeTransfer(account, amountToTransfer); totalEarnedTokens[account] = totalEarnedTokens[account].add(pendingDivs); totalClaimedRewards = totalClaimedRewards.add(pendingDivs); emit RewardsTransferred(account, pendingDivs); } uint pendingDivsEth = getPendingDivsEth(account); if (pendingDivsEth > 0) { if (claimAsToken == address(0) || claimAsToken == uniswapRouterV2.WETH()) { IERC20(uniswapRouterV2.WETH()).safeTransfer(account, pendingDivsEth); } else { require(trustedClaimableTokens[claimAsToken], "cannot claim as this token!"); IERC20(uniswapRouterV2.WETH()).safeApprove(address(uniswapRouterV2), 0); IERC20(uniswapRouterV2.WETH()).safeApprove(address(uniswapRouterV2), pendingDivsEth); address[] memory path = new address[](2); path[0] = uniswapRouterV2.WETH(); path[1] = claimAsToken; uniswapRouterV2.swapExactTokensForTokens(pendingDivsEth, _amountOutMin_claimAsToken_weth, path, account, _deadline); } totalEarnedEth[account] = totalEarnedEth[account].add(pendingDivsEth); totalClaimedRewardsEth = totalClaimedRewardsEth.add(pendingDivsEth); emit EthRewardsTransferred(account, pendingDivsEth); } lastClaimedTime[account] = now; lastDivPoints[account] = totalDivPoints; lastEthDivPoints[account] = totalEthDivPoints; } function updateAccount(address account, uint _amountOutMin_claimAsToken_dyp, uint _amountOutMin_attemptSwap, uint _deadline) private { updateAccount(account, address(0), 0, _amountOutMin_claimAsToken_dyp, _amountOutMin_attemptSwap, _deadline); } // view function to check last updated DYP pending rewards function getPendingDivs(address _holder) public view returns (uint) { if (!holders.contains(_holder)) return 0; if (depositedTokens[_holder] == 0) return 0; uint newDivPoints = totalDivPoints.sub(lastDivPoints[_holder]); uint depositedAmount = depositedTokens[_holder]; uint pendingDivs = depositedAmount.mul(newDivPoints).div(pointMultiplier); return pendingDivs; } // view function to check last updated WETH pending rewards function getPendingDivsEth(address _holder) public view returns (uint) { if (!holders.contains(_holder)) return 0; if (depositedTokens[_holder] == 0) return 0; uint newDivPoints = totalEthDivPoints.sub(lastEthDivPoints[_holder]); uint depositedAmount = depositedTokens[_holder]; uint pendingDivs = depositedAmount.mul(newDivPoints).div(pointMultiplier); return pendingDivs; } // view functon to get number of stakers function getNumberOfHolders() public view returns (uint) { return holders.length(); } // deposit function to stake LP Tokens function deposit( address depositToken, uint amountToStake, uint[] memory minAmounts, // uint _amountOutMin_25Percent, // 0 // uint _amountOutMin_stakingReferralFee, // 1 // uint amountLiquidityMin_rewardTokenReceived, // 2 // uint amountLiquidityMin_baseTokenReceived, // 3 // uint _amountOutMin_rewardTokenReceived, // 4 // uint _amountOutMin_baseTokenReceived, // 5 // uint _amountOutMin_claimAsToken_dyp, // 6 // uint _amountOutMin_attemptSwap, // 7 uint _deadline ) public noContractsAllowed notDuringEmergency { require(minAmounts.length == 8, "Invalid minAmounts length!"); require(trustedClaimableTokens[depositToken], "Invalid deposit token!"); // can deposit reward token directly // require(depositToken != trustedRewardTokenAddress, "Cannot deposit reward token!"); require(depositToken != trustedDepositTokenAddress, "Cannot deposit LP directly!"); require(depositToken != address(0), "Deposit token cannot be 0!"); require(amountToStake > 0, "Invalid amount to Stake!"); IERC20(depositToken).safeTransferFrom(msg.sender, address(this), amountToStake); uint fee = amountToStake.mul(STAKING_FEE_RATE_X_100).div(100e2); uint amountAfterFee = amountToStake.sub(fee); if (fee > 0) { IERC20(depositToken).safeTransfer(feeRecipientAddress, fee); } uint _75Percent = amountAfterFee.mul(75e2).div(100e2); uint _25Percent = amountAfterFee.sub(_75Percent); uint amountToDepositByContract = doSwap(depositToken, trustedPlatformTokenAddress, _25Percent, /*_amountOutMin_25Percent*/minAmounts[0], _deadline); IERC20(trustedPlatformTokenAddress).safeApprove(address(trustedStakingContractAddress), 0); IERC20(trustedPlatformTokenAddress).safeApprove(address(trustedStakingContractAddress), amountToDepositByContract); StakingContract(trustedStakingContractAddress).depositByContract(msg.sender, amountToDepositByContract, /*_amountOutMin_stakingReferralFee*/minAmounts[1], _deadline); uint half = _75Percent.div(2); uint otherHalf = _75Percent.sub(half); uint _rewardTokenReceived = doSwap(depositToken, trustedRewardTokenAddress, half, /*_amountOutMin_rewardTokenReceived*/minAmounts[4], _deadline); uint _baseTokenReceived = doSwap(depositToken, trustedBaseTokenAddress, otherHalf, /*_amountOutMin_baseTokenReceived*/minAmounts[5], _deadline); uint amountToDeposit = addLiquidityAndGetAmountToDeposit( _rewardTokenReceived, _baseTokenReceived, minAmounts, _deadline ); require(amountToDeposit > 0, "Cannot deposit 0 Tokens"); updateAccount(msg.sender, /*_amountOutMin_claimAsToken_dyp*/minAmounts[6], /*_amountOutMin_attemptSwap*/minAmounts[7], _deadline); depositedTokens[msg.sender] = depositedTokens[msg.sender].add(amountToDeposit); totalTokens = totalTokens.add(amountToDeposit); holders.add(msg.sender); depositTime[msg.sender] = now; } function addLiquidityAndGetAmountToDeposit( uint _rewardTokenReceived, uint _baseTokenReceived, uint[] memory minAmounts, uint _deadline ) private returns (uint) { require(_rewardTokenReceived >= minAmounts[2], "Reward Token Received lower than expected!"); require(_baseTokenReceived >= minAmounts[3], "Base Token Received lower than expected!"); uint oldLpBalance = IERC20(trustedDepositTokenAddress).balanceOf(address(this)); IERC20(trustedRewardTokenAddress).safeApprove(address(uniswapRouterV2), 0); IERC20(trustedRewardTokenAddress).safeApprove(address(uniswapRouterV2), _rewardTokenReceived); IERC20(trustedBaseTokenAddress).safeApprove(address(uniswapRouterV2), 0); IERC20(trustedBaseTokenAddress).safeApprove(address(uniswapRouterV2), _baseTokenReceived); uniswapRouterV2.addLiquidity( trustedRewardTokenAddress, trustedBaseTokenAddress, _rewardTokenReceived, _baseTokenReceived, /*amountLiquidityMin_rewardTokenReceived*/minAmounts[2], /*amountLiquidityMin_baseTokenReceived*/minAmounts[3], address(this), _deadline ); uint newLpBalance = IERC20(trustedDepositTokenAddress).balanceOf(address(this)); uint lpTokensReceived = newLpBalance.sub(oldLpBalance); return lpTokensReceived; } // withdraw function to unstake LP Tokens function withdraw( address withdrawAsToken, uint amountToWithdraw, uint[] memory minAmounts, // uint _amountLiquidityMin_rewardToken, // 0 // uint _amountLiquidityMin_baseToken, // 1 // uint _amountOutMin_withdrawAsToken_rewardTokenReceived, // 2 // uint _amountOutMin_withdrawAsToken_baseTokenReceived, // 3 // uint _amountOutMin_claimAsToken_dyp, // 4 // uint _amountOutMin_attemptSwap, // 5 uint _deadline ) public noContractsAllowed { require(minAmounts.length == 6, "Invalid minAmounts!"); require(withdrawAsToken != address(0), "Invalid withdraw token!"); require(trustedClaimableTokens[withdrawAsToken], "Withdraw token not trusted!"); require(amountToWithdraw > 0, "Cannot withdraw 0 Tokens!"); require(depositedTokens[msg.sender] >= amountToWithdraw, "Invalid amount to withdraw"); require(now.sub(depositTime[msg.sender]) > cliffTime, "You recently deposited, please wait before withdrawing."); updateAccount(msg.sender, /*_amountOutMin_claimAsToken_dyp*/ minAmounts[4] , /*_amountOutMin_attemptSwap*/ minAmounts[5], _deadline); uint fee = amountToWithdraw.mul(UNSTAKING_FEE_RATE_X_100).div(100e2); uint amountAfterFee = amountToWithdraw.sub(fee); if (fee > 0) { IERC20(trustedDepositTokenAddress).safeTransfer(feeRecipientAddress, fee); } uint withdrawTokenReceived = removeLiquidityAndGetWithdrawTokenReceived(withdrawAsToken, amountAfterFee, minAmounts, _deadline); IERC20(withdrawAsToken).safeTransfer(msg.sender, withdrawTokenReceived); depositedTokens[msg.sender] = depositedTokens[msg.sender].sub(amountToWithdraw); totalTokens = totalTokens.sub(amountToWithdraw); if (holders.contains(msg.sender) && depositedTokens[msg.sender] == 0) { holders.remove(msg.sender); } } function removeLiquidityAndGetWithdrawTokenReceived( address withdrawAsToken, uint amountAfterFee, uint[] memory minAmounts, uint _deadline ) private returns (uint) { IERC20(trustedDepositTokenAddress).safeApprove(address(uniswapRouterV2), 0); IERC20(trustedDepositTokenAddress).safeApprove(address(uniswapRouterV2), amountAfterFee); uint _oldRewardTokenBalance = IERC20(trustedRewardTokenAddress).balanceOf(address(this)); uint _oldBaseTokenBalance = IERC20(trustedBaseTokenAddress).balanceOf(address(this)); uniswapRouterV2.removeLiquidity( trustedRewardTokenAddress, trustedBaseTokenAddress, amountAfterFee, /*_amountLiquidityMin_rewardToken*/ minAmounts[0], /*_amountLiquidityMin_baseToken*/minAmounts[1], address(this), _deadline ); uint _newRewardTokenBalance = IERC20(trustedRewardTokenAddress).balanceOf(address(this)); uint _newBaseTokenBalance = IERC20(trustedBaseTokenAddress).balanceOf(address(this)); uint _rewardTokenReceivedAfterRemovingLiquidity = _newRewardTokenBalance.sub(_oldRewardTokenBalance); uint _baseTokenReceivedAfterRemovingLiquidity = _newBaseTokenBalance.sub(_oldBaseTokenBalance); uint withdrawTokenReceived1 = doSwap(trustedRewardTokenAddress, withdrawAsToken, _rewardTokenReceivedAfterRemovingLiquidity, /*_amountOutMin_withdrawAsToken_rewardTokenReceived*/minAmounts[2], _deadline); uint withdrawTokenReceived2 = doSwap(trustedBaseTokenAddress, withdrawAsToken, _baseTokenReceivedAfterRemovingLiquidity, /*_amountOutMin_withdrawAsToken_baseTokenReceived*/minAmounts[3], _deadline); uint tokensReceived = withdrawTokenReceived1.add(withdrawTokenReceived2); return tokensReceived; } // claim function to claim pending rewards function claim(uint _amountOutMin_claimAsToken_dyp, uint _amountOutMin_attemptSwap, uint _deadline) public noContractsAllowed notDuringEmergency { updateAccount(msg.sender, _amountOutMin_claimAsToken_dyp, _amountOutMin_attemptSwap, _deadline); } function claimAs(address claimAsToken, uint _amountOutMin_claimAsToken_weth, uint _amountOutMin_claimAsToken_dyp, uint _amountOutMin_attemptSwap, uint _deadline) public noContractsAllowed notDuringEmergency { require(trustedClaimableTokens[claimAsToken], "cannot claim as this token!"); updateAccount(msg.sender, claimAsToken, _amountOutMin_claimAsToken_weth, _amountOutMin_claimAsToken_dyp, _amountOutMin_attemptSwap, _deadline); } // private function to distribute DYP rewards function distributeDivs(uint amount) private { require(amount > 0 && totalTokens > 0, "distributeDivs failed!"); totalDivPoints = totalDivPoints.add(amount.mul(pointMultiplier).div(totalTokens)); emit RewardsDisbursed(amount); } // private function to distribute WETH rewards function distributeDivsEth(uint amount) private { require(amount > 0 && totalTokens > 0, "distributeDivsEth failed!"); totalEthDivPoints = totalEthDivPoints.add(amount.mul(pointMultiplier).div(totalTokens)); emit EthRewardsDisbursed(amount); } // private function to allocate DYP to be disbursed calculated according to time passed function disburseTokens() private { uint amount = getPendingDisbursement(); if (contractBalance < amount) { amount = contractBalance; } if (amount == 0 || totalTokens == 0) return; tokensToBeSwapped = tokensToBeSwapped.add(amount); contractBalance = contractBalance.sub(amount); lastDisburseTime = now; } function attemptSwap(uint _amountOutMin_attemptSwap, uint _deadline) private { // do not attemptSwap if no one has staked if (totalTokens == 0) { return; } // Cannot execute swap so quickly if (now.sub(lastSwapExecutionTime) < swapAttemptPeriod) { return; } // force reserves to match balances uniswapV2Pair.sync(); uint _tokensToBeSwapped = tokensToBeSwapped.add(tokensToBeDisbursedOrBurnt); uint maxSwappableAmount = getMaxSwappableAmount(); // don't proceed if no liquidity if (maxSwappableAmount == 0) return; if (maxSwappableAmount < tokensToBeSwapped) { uint diff = tokensToBeSwapped.sub(maxSwappableAmount); _tokensToBeSwapped = tokensToBeSwapped.sub(diff); tokensToBeDisbursedOrBurnt = tokensToBeDisbursedOrBurnt.add(diff); tokensToBeSwapped = 0; } else if (maxSwappableAmount < _tokensToBeSwapped) { uint diff = _tokensToBeSwapped.sub(maxSwappableAmount); _tokensToBeSwapped = _tokensToBeSwapped.sub(diff); tokensToBeDisbursedOrBurnt = diff; tokensToBeSwapped = 0; } else { tokensToBeSwapped = 0; tokensToBeDisbursedOrBurnt = 0; } // don't execute 0 swap tokens if (_tokensToBeSwapped == 0) { return; } // cannot execute swap at insufficient balance if (IERC20(trustedRewardTokenAddress).balanceOf(address(this)) < _tokensToBeSwapped) { return; } IERC20(trustedRewardTokenAddress).safeApprove(address(uniswapRouterV2), 0); IERC20(trustedRewardTokenAddress).safeApprove(address(uniswapRouterV2), _tokensToBeSwapped); uint oldWethBalance = IERC20(uniswapRouterV2.WETH()).balanceOf(address(this)); uniswapRouterV2.swapExactTokensForTokens(_tokensToBeSwapped, _amountOutMin_attemptSwap, SWAP_PATH, address(this), _deadline); uint newWethBalance = IERC20(uniswapRouterV2.WETH()).balanceOf(address(this)); uint wethReceived = newWethBalance.sub(oldWethBalance); if (wethReceived > 0) { distributeDivsEth(wethReceived); } lastSwapExecutionTime = now; } // Owner is supposed to be a Governance Contract function disburseRewardTokens() public onlyOwner { require(now.sub(lastBurnOrTokenDistributeTime) > burnOrDisburseTokensPeriod, "Recently executed, Please wait!"); // force reserves to match balances uniswapV2Pair.sync(); uint maxSwappableAmount = getMaxSwappableAmount(); uint _tokensToBeDisbursed = tokensToBeDisbursedOrBurnt; uint _tokensToBeBurnt; if (maxSwappableAmount < _tokensToBeDisbursed) { _tokensToBeBurnt = _tokensToBeDisbursed.sub(maxSwappableAmount); _tokensToBeDisbursed = maxSwappableAmount; } distributeDivs(_tokensToBeDisbursed); if (_tokensToBeBurnt > 0) { IERC20(trustedRewardTokenAddress).safeTransfer(BURN_ADDRESS, _tokensToBeBurnt); } tokensToBeDisbursedOrBurnt = 0; lastBurnOrTokenDistributeTime = now; } // Owner is suposed to be a Governance Contract function burnRewardTokens() public onlyOwner { require(now.sub(lastBurnOrTokenDistributeTime) > burnOrDisburseTokensPeriod, "Recently executed, Please wait!"); IERC20(trustedRewardTokenAddress).safeTransfer(BURN_ADDRESS, tokensToBeDisbursedOrBurnt); tokensToBeDisbursedOrBurnt = 0; lastBurnOrTokenDistributeTime = now; } // get token amount which has a max price impact according to MAGIC_NUMBER for sells // !!IMPORTANT!! => Any functions using return value from this // MUST call `sync` on the pair before calling this function! function getMaxSwappableAmount() public view returns (uint) { uint tokensAvailable = IERC20(trustedRewardTokenAddress).balanceOf(trustedDepositTokenAddress); uint maxSwappableAmount = tokensAvailable.mul(MAGIC_NUMBER).div(1e18); return maxSwappableAmount; } // view function to calculate amount of DYP pending to be allocated since `lastDisburseTime` function getPendingDisbursement() public view returns (uint) { uint timeDiff; uint _now = now; uint _stakingEndTime = contractDeployTime.add(disburseDuration); if (_now > _stakingEndTime) { _now = _stakingEndTime; } if (lastDisburseTime >= _now) { timeDiff = 0; } else { timeDiff = _now.sub(lastDisburseTime); } uint pendingDisburse = disburseAmount .mul(disbursePercentX100) .mul(timeDiff) .div(disburseDuration) .div(10000); return pendingDisburse; } // view function to get depositors list function getDepositorsList(uint startIndex, uint endIndex) public view returns (address[] memory stakers, uint[] memory stakingTimestamps, uint[] memory lastClaimedTimeStamps, uint[] memory stakedTokens) { require (startIndex < endIndex); uint length = endIndex.sub(startIndex); address[] memory _stakers = new address[](length); uint[] memory _stakingTimestamps = new uint[](length); uint[] memory _lastClaimedTimeStamps = new uint[](length); uint[] memory _stakedTokens = new uint[](length); for (uint i = startIndex; i < endIndex; i = i.add(1)) { address staker = holders.at(i); uint listIndex = i.sub(startIndex); _stakers[listIndex] = staker; _stakingTimestamps[listIndex] = depositTime[staker]; _lastClaimedTimeStamps[listIndex] = lastClaimedTime[staker]; _stakedTokens[listIndex] = depositedTokens[staker]; } return (_stakers, _stakingTimestamps, _lastClaimedTimeStamps, _stakedTokens); } // admin can claim any tokens left in the contract after it expires or during emergency function claimAnyToken(address token, address recipient, uint amount) external onlyOwner { require(recipient != address(0), "Invalid Recipient"); require(now > adminClaimableTime, "Contract not expired yet!"); if (token == address(0)) { address payable _recipient = payable(recipient); _recipient.transfer(amount); return; } IERC20(token).safeTransfer(recipient, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[]","name":"swapPath","type":"address[]"},{"internalType":"address","name":"_uniswapV2RouterAddress","type":"address"},{"internalType":"address","name":"_feeRecipientAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"ClaimableTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"ClaimableTokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"EmergencyDeclared","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthRewardsDisbursed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthRewardsTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"FeeRecipientAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockupTime","type":"uint256"}],"name":"LockupTimeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMagicNumber","type":"uint256"}],"name":"MagicNumberChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsDisbursed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"StakingFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"router","type":"address"}],"name":"UniswapV2RouterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"UnstakingFeeChanged","type":"event"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_WAIT_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAGIC_NUMBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_FEE_RATE_X_100","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"SWAP_PATH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNSTAKING_FEE_RATE_X_100","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addContractBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"trustedClaimableTokenAddress","type":"address"}],"name":"addTrustedClaimableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminCanClaimAfter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminClaimableTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnOrDisburseTokensPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOutMin_claimAsToken_dyp","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin_attemptSwap","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimAnyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"claimAsToken","type":"address"},{"internalType":"uint256","name":"_amountOutMin_claimAsToken_weth","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin_claimAsToken_dyp","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin_attemptSwap","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"claimAs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cliffTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractDeployTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declareEmergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositToken","type":"address"},{"internalType":"uint256","name":"amountToStake","type":"uint256"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disburseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disburseDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disbursePercentX100","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disburseRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeRecipientAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"endIndex","type":"uint256"}],"name":"getDepositorsList","outputs":[{"internalType":"address[]","name":"stakers","type":"address[]"},{"internalType":"uint256[]","name":"stakingTimestamps","type":"uint256[]"},{"internalType":"uint256[]","name":"lastClaimedTimeStamps","type":"uint256[]"},{"internalType":"uint256[]","name":"stakedTokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSwappableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingDisbursement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getPendingDivs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getPendingDivsEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isEmergency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBurnOrTokenDistributeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDisburseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDivPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastEthDivPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapExecutionTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"trustedClaimableTokenAddress","type":"address"}],"name":"removeTrustedClaimableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMagicNumber","type":"uint256"},{"internalType":"uint256","name":"lockupTime","type":"uint256"},{"internalType":"uint256","name":"stakingFeeRateX100","type":"uint256"},{"internalType":"uint256","name":"unstakingFeeRateX100","type":"uint256"},{"internalType":"address","name":"_uniswapV2RouterAddress","type":"address"},{"internalType":"address","name":"newFeeRecipientAddress","type":"address"}],"name":"setContractVariables","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFeeRecipientAddress","type":"address"}],"name":"setFeeRecipientAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLockupTime","type":"uint256"}],"name":"setLockupTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMagicNumber","type":"uint256"}],"name":"setMagicNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newStakingFeeRateX100","type":"uint256"}],"name":"setStakingFeeRateX100","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IUniswapV2Router","name":"router","type":"address"}],"name":"setUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newUnstakingFeeRateX100","type":"uint256"}],"name":"setUnstakingFeeRateX100","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAttemptPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensToBeDisbursedOrBurnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensToBeSwapped","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimedRewardsEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDivPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalEarnedEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalEarnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEthDivPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trustedBaseTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedClaimableTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedDepositTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedPlatformTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedRewardTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedStakingContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouterV2","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawAsToken","type":"address"},{"internalType":"uint256","name":"amountToWithdraw","type":"uint256"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526276a7006001556000600281905560038190556611da533c045c46600455600b805460ff19169055600f8190556010819055601a819055601b819055601c819055601d819055601e819055601f553480156200005f57600080fd5b506040516200546738038062005467833981810160405260608110156200008557600080fd5b8101908080516040519392919084640100000000821115620000a657600080fd5b908301906020820185811115620000bc57600080fd5b8251866020820283011164010000000082111715620000da57600080fd5b82525081516020918201928201910280838360005b8381101562000109578181015183820152602001620000ef565b505050509190910160409081526020838101519390910151600080546001600160a01b0319163317905542600681905593955093506200015a929150630208c08090620028d4620001da821b17901c565b60075560065460088190556009819055600a5562000181826001600160e01b036200023c16565b62000195816001600160e01b036200031416565b600c80546001600160a01b031916737463286a379f6f128058bb92b355e3d6e8bdb2191790558251620001d090600d906020860190620003d5565b5050505062000469565b60008282018381101562000235576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000546001600160a01b031633146200025457600080fd5b6001600160a01b038116620002b0576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420726f75746572206164647265737321000000000000000000604482015290519081900360640190fd5b600b80546001600160a01b03808416610100908102610100600160a81b03199093169290921792839055604080519290930416815290517f49381de8f56ca0c45bdd955e613a01e042fdf45d2ae4b0cfd920226fe0ed2ede9181900360200190a150565b6000546001600160a01b031633146200032c57600080fd5b6001600160a01b0381166200037b576040805162461bcd60e51b815260206004820152601060248201526f496e76616c696420616464726573732160801b604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b03838116919091179182905560408051929091168252517fafc54c644914e872610dbc4334999d957d145108fd88d63d83cc3a710dc6ee71916020908290030190a150565b8280548282559060005260206000209081019282156200042d579160200282015b828111156200042d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620003f6565b506200043b9291506200043f565b5090565b6200046691905b808211156200043b5780546001600160a01b031916815560010162000446565b90565b614fee80620004796000396000f3fe608060405234801561001057600080fd5b50600436106104075760003560e01c80638b21990911610220578063c326bf4f11610130578063e3956a95116100b8578063f2fde38b11610087578063f2fde38b14610b05578063f3f91fa014610b2b578063f7e453b714610b51578063fccc281314610c09578063fe547f7214610c1157610407565b8063e3956a9514610a96578063e9dc18ec14610a9e578063efa9a9be14610ad4578063f1bab2ec14610afd57610407565b8063d140d6eb116100ff578063d140d6eb14610a1a578063d578ceab14610a58578063d7130e1414610a60578063dbcdc2cc14610a68578063e027c61f14610a8e57610407565b8063c326bf4f146109be578063c725e6d2146109e4578063ca7e083514610a0a578063ca9a213214610a1257610407565b8063a3c962c7116101b3578063ac51de8d11610182578063ac51de8d14610963578063b7ad18c41461096b578063b7d3786e14610973578063b9dffd3214610990578063c1665f40146109b657610407565b8063a3c962c714610893578063a6f5388c1461089b578063a891fa8914610953578063aabcad821461095b57610407565b80638f5705be116101ef5780638f5705be1461084057806398896d10146108485780639f54790d1461086e578063a1ccb8131461087657610407565b80638b219909146108025780638b7afe2e146108285780638da5cb5b146108305780638e20a1d91461083857610407565b8063452b4cfc1161031b57806358ee82fe116102ae5780636949b9d61161027d5780636949b9d6146107da578063765ae8bf146107e25780637a6eb0d0146107ea5780637e1c0c09146107f25780637e44b933146107fa57610407565b806358ee82fe1461077e578063596fa9e3146107a45780635f9e8f82146107ac5780636270cd18146107b457610407565b806349bd5a5e116102ea57806349bd5a5e146107495780634b62b70b146107515780634ca5610b1461076e57806358a3d9631461077657610407565b8063452b4cfc146106f6578063468b4d411461071357806346a28f631461071b57806346c648731461072357610407565b80632ba2ed981161039e57806331a5dda11161036d57806331a5dda1146106b057806331e244e5146106b85780633992fba5146106c05780633bed5043146106c857806344aa796a146106ee57610407565b80632ba2ed981461060b5780632e9f87a614610628578063307e52a71461066e578063308feec3146106a857610407565b80631cfa8021116103da5780631cfa80211461059c5780631f04461c146105c0578063271c23fa146105e65780632b4beea6146105ee57610407565b806305447d251461040c5780630c9a0c78146105525780630f1a64441461056c5780631419841d14610574575b600080fd5b61042f6004803603604081101561042257600080fd5b5080359060200135610c19565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b8381101561047b578181015183820152602001610463565b50505050905001858103845288818151815260200191508051906020019060200280838360005b838110156104ba5781810151838201526020016104a2565b50505050905001858103835287818151815260200191508051906020019060200280838360005b838110156104f95781810151838201526020016104e1565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015610538578181015183820152602001610520565b505050509050019850505050505050505060405180910390f35b61055a610e9d565b60408051918252519081900360200190f35b61055a610ea3565b61059a6004803603602081101561058a57600080fd5b50356001600160a01b0316610ea9565b005b6105a4610f7f565b604080516001600160a01b039092168252519081900360200190f35b61055a600480360360208110156105d657600080fd5b50356001600160a01b0316610f97565b61055a610fa9565b6105a46004803603602081101561060457600080fd5b5035610faf565b61059a6004803603602081101561062157600080fd5b5035610fd6565b61059a600480360360c081101561063e57600080fd5b508035906020810135906040810135906060810135906001600160a01b03608082013581169160a0013516611028565b6106946004803603602081101561068457600080fd5b50356001600160a01b031661107d565b604080519115158252519081900360200190f35b61055a611092565b6105a46110a3565b61059a6110b5565b61055a61117b565b61055a600480360360208110156106de57600080fd5b50356001600160a01b0316611181565b61055a61123f565b61059a6004803603602081101561070c57600080fd5b5035611246565b61055a611296565b61055a611355565b61055a6004803603602081101561073957600080fd5b50356001600160a01b031661135b565b6105a461136d565b61059a6004803603602081101561076757600080fd5b503561137c565b6105a461141e565b61055a611436565b61055a6004803603602081101561079457600080fd5b50356001600160a01b031661143c565b6105a461144e565b610694611462565b61055a600480360360208110156107ca57600080fd5b50356001600160a01b031661146b565b61055a61147d565b6105a4611483565b61055a61149b565b61055a6114a1565b61055a6114a7565b61055a6004803603602081101561081857600080fd5b50356001600160a01b03166114ad565b61055a6114bf565b6105a46114c5565b61055a6114d4565b61055a6114da565b61055a6004803603602081101561085e57600080fd5b50356001600160a01b03166114e2565b61055a611551565b61059a6004803603602081101561088c57600080fd5b5035611557565b6105a46115ee565b61059a600480360360808110156108b157600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156108e057600080fd5b8201836020820111156108f257600080fd5b803590602001918460208302840111600160201b8311171561091357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611606915050565b61055a6119eb565b61059a6119f2565b61055a611b4a565b61055a611be3565b61059a6004803603602081101561098957600080fd5b5035611be9565b61059a600480360360208110156109a657600080fd5b50356001600160a01b0316611c80565b61055a611ce3565b61055a600480360360208110156109d457600080fd5b50356001600160a01b0316611ce9565b61059a600480360360208110156109fa57600080fd5b50356001600160a01b0316611cfb565b61055a611d5b565b61055a611d61565b61059a600480360360a0811015610a3057600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135611d68565b61055a611e8e565b61055a611e94565b61059a60048036036020811015610a7e57600080fd5b50356001600160a01b0316611e9c565b61055a611f5b565b61059a611f61565b61059a60048036036060811015610ab457600080fd5b506001600160a01b03813581169160208101359091169060400135612014565b61059a60048036036060811015610aea57600080fd5b508035906020810135906040013561213c565b6105a46121ec565b61059a60048036036020811015610b1b57600080fd5b50356001600160a01b03166121fb565b61055a60048036036020811015610b4157600080fd5b50356001600160a01b0316612280565b61059a60048036036080811015610b6757600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115610b9657600080fd5b820183602082011115610ba857600080fd5b803590602001918460208302840111600160201b83111715610bc957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250612292915050565b6105a46128bf565b61055a6128c5565b606080606080848610610c2b57600080fd5b6000610c3d868863ffffffff61293716565b905060608167ffffffffffffffff81118015610c5857600080fd5b50604051908082528060200260200182016040528015610c82578160200160208202803683370190505b50905060608267ffffffffffffffff81118015610c9e57600080fd5b50604051908082528060200260200182016040528015610cc8578160200160208202803683370190505b50905060608367ffffffffffffffff81118015610ce457600080fd5b50604051908082528060200260200182016040528015610d0e578160200160208202803683370190505b50905060608467ffffffffffffffff81118015610d2a57600080fd5b50604051908082528060200260200182016040528015610d54578160200160208202803683370190505b5090508a5b8a811015610e8b576000610d7460118363ffffffff61297916565b90506000610d88838f63ffffffff61293716565b905081878281518110610d9757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060146000836001600160a01b03166001600160a01b0316815260200190815260200160002054868281518110610de957fe5b60200260200101818152505060156000836001600160a01b03166001600160a01b0316815260200190815260200160002054858281518110610e2757fe5b60200260200101818152505060136000836001600160a01b03166001600160a01b0316815260200190815260200160002054848281518110610e6557fe5b602090810291909101015250610e84905081600163ffffffff6128d416565b9050610d59565b50929a91995097509095509350505050565b61271081565b60015481565b6000546001600160a01b03163314610ec057600080fd5b6001600160a01b038116610f1b576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420726f75746572206164647265737321000000000000000000604482015290519081900360640190fd5b600b80546001600160a01b03808416610100908102610100600160a81b03199093169290921792839055604080519290930416815290517f49381de8f56ca0c45bdd955e613a01e042fdf45d2ae4b0cfd920226fe0ed2ede9181900360200190a150565b737463286a379f6f128058bb92b355e3d6e8bdb21981565b60186020526000908152604090205481565b60095481565b600d8181548110610fbc57fe5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314610fed57600080fd5b60048190556040805182815290517ffb06af695e3e2ab9f65ec2316a3cb72fd442f2288bb3bb1fa8f52cea13e446db9181900360200190a150565b6000546001600160a01b0316331461103f57600080fd5b61104886610fd6565b6110518561137c565b61105a84611be9565b61106383611557565b61106c82610ea9565b61107581611e9c565b505050505050565b60056020526000908152604090205460ff1681565b600061109e6011612985565b905090565b600080516020614f0283398151915281565b6000546001600160a01b031633146110cc57600080fd5b600b5460ff1615611112576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6f833981519152604482015290519081900360640190fd5b600b805460ff19166001179055611132426203f48063ffffffff6128d416565b6007556000600181905554604080516001600160a01b039092168252517fe465b068e033879ed58088ba05882c35e2a52240ea1432b95753d6aebdd0814a9181900360200190a1565b60045481565b600061119460118363ffffffff61299016565b6111a05750600061123a565b6001600160a01b0382166000908152601360205260409020546111c55750600061123a565b6001600160a01b038216600090815260196020526040812054601c546111f09163ffffffff61293716565b6001600160a01b038416600090815260136020526040812054919250611234670de0b6b3a7640000611228848663ffffffff6129a516565b9063ffffffff6129fe16565b93505050505b919050565b6201518081565b6000546001600160a01b0316331461125d57600080fd5b61127d600080516020614f0283398151915233308463ffffffff612a4016565b601a54611290908263ffffffff6128d416565b601a5550565b604080516370a0823160e01b8152737463286a379f6f128058bb92b355e3d6e8bdb219600482015290516000918291600080516020614f02833981519152916370a08231916024808301926020929190829003018186803b1580156112fa57600080fd5b505afa15801561130e573d6000803e3d6000fd5b505050506040513d602081101561132457600080fd5b505160045490915060009061134e90670de0b6b3a76400009061122890859063ffffffff6129a516565b9250505090565b60105481565b60146020526000908152604090205481565b600c546001600160a01b031681565b6000546001600160a01b0316331461139357600080fd5b6276a7008111156113e3576040805162461bcd60e51b81526020600482015260156024820152744c6f636b75702074696d6520746f6f206c6f6e672160581b604482015290519081900360640190fd5b60018190556040805182815290517fadbac78f382a6f10bef84ad4b704cac4817788ffec4f83ac665d7a1152dc44729181900360200190a150565b731ab008cbfc99d0ca7e3fd8987ce1ebf832506f5381565b601f5481565b60176020526000908152604090205481565b600b5461010090046001600160a01b031681565b600b5460ff1681565b60166020526000908152604090205481565b600a5481565b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1781565b601e5481565b601d5481565b60025481565b60196020526000908152604090205481565b601a5481565b6000546001600160a01b031681565b601b5481565b6301e1338081565b60006114f560118363ffffffff61299016565b6115015750600061123a565b6001600160a01b0382166000908152601360205260409020546115265750600061123a565b6001600160a01b038216600090815260186020526040812054601b546111f09163ffffffff61293716565b60065481565b6000546001600160a01b0316331461156e57600080fd5b61271081106115b3576040805162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206665652160a01b604482015290519081900360640190fd5b60038190556040805182815290517f0a9e89cff3f9f01bd1c6aeb9b71324bb138123c40d02eb478613fb3427b231009181900360200190a150565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61160f33612aa0565b15801561161b57503233145b611664576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b81516006146116b0576040805162461bcd60e51b8152602060048201526013602482015272496e76616c6964206d696e416d6f756e74732160681b604482015290519081900360640190fd5b6001600160a01b03841661170b576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420776974686472617720746f6b656e21000000000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526005602052604090205460ff16611778576040805162461bcd60e51b815260206004820152601b60248201527f576974686472617720746f6b656e206e6f742074727573746564210000000000604482015290519081900360640190fd5b600083116117cd576040805162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207769746864726177203020546f6b656e732100000000000000604482015290519081900360640190fd5b33600090815260136020526040902054831115611831576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420616d6f756e7420746f207769746864726177000000000000604482015290519081900360640190fd5b6001543360009081526014602052604090205461185590429063ffffffff61293716565b116118915760405162461bcd60e51b8152600401808060200182810382526037815260200180614f226037913960400191505060405180910390fd5b6118c533836004815181106118a257fe5b6020026020010151846005815181106118b757fe5b602002602001015184612aa6565b60006118e2612710611228600354876129a590919063ffffffff16565b905060006118f6858363ffffffff61293716565b9050811561193057600e5461193090737463286a379f6f128058bb92b355e3d6e8bdb219906001600160a01b03168463ffffffff612ab516565b600061193e87838787612b07565b905061195a6001600160a01b038816338363ffffffff612ab516565b3360009081526013602052604090205461197a908763ffffffff61293716565b33600090815260136020526040902055601d5461199d908763ffffffff61293716565b601d556119b160113363ffffffff61299016565b80156119ca575033600090815260136020526040902054155b156119e2576119e060113363ffffffff612f0e16565b505b50505050505050565b62093a8081565b6000546001600160a01b03163314611a0957600080fd5b62093a80611a22600a544261293790919063ffffffff16565b11611a74576040805162461bcd60e51b815260206004820152601f60248201527f526563656e746c792065786563757465642c20506c6561736520776169742100604482015290519081900360640190fd5b600c60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ac457600080fd5b505af1158015611ad8573d6000803e3d6000fd5b505050506000611ae6611296565b601e54909150600081831015611b0c57611b06828463ffffffff61293716565b90508291505b611b1582612f23565b8015611b3c57611b3c600080516020614f0283398151915261dead8363ffffffff612ab516565b50506000601e555042600a55565b600654600090819042908290611b6a906301e1338063ffffffff6128d416565b905080821115611b78578091505b8160085410611b8a5760009250611ba1565b600854611b9e90839063ffffffff61293716565b92505b6000611bda6127106112286301e133808188611bce6a024873e6597d482d0000008663ffffffff6129a516565b9063ffffffff6129a516565b94505050505090565b601c5481565b6000546001600160a01b03163314611c0057600080fd5b6127108110611c45576040805162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206665652160a01b604482015290519081900360640190fd5b60028190556040805182815290517f327680b8ba8221210809b2aae37f88a529ae9eec9a3a3fe952fe0a3a262b487f9181900360200190a150565b6000546001600160a01b03163314611c9757600080fd5b6001600160a01b038116600081815260056020526040808220805460ff19166001179055517f74bd711825aaf93834b0d2fb7bce500caae1be2723cbe48022e2584d6151e3329190a250565b60035481565b60136020526000908152604090205481565b6000546001600160a01b03163314611d1257600080fd5b6001600160a01b038116600081815260056020526040808220805460ff19169055517f091fc62f7712ef1aa0d7d7957476c0cf7e066e7cd795eae019e0f45f64ea00989190a250565b60075481565b6203f48081565b611d7133612aa0565b158015611d7d57503233145b611dc6576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b600b5460ff1615611e0c576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6f833981519152604482015290519081900360640190fd5b6001600160a01b03851660009081526005602052604090205460ff16611e79576040805162461bcd60e51b815260206004820152601b60248201527f63616e6e6f7420636c61696d206173207468697320746f6b656e210000000000604482015290519081900360640190fd5b611e87338686868686612fea565b5050505050565b600f5481565b630208c08081565b6000546001600160a01b03163314611eb357600080fd5b6001600160a01b038116611f01576040805162461bcd60e51b815260206004820152601060248201526f496e76616c696420616464726573732160801b604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b03838116919091179182905560408051929091168252517fafc54c644914e872610dbc4334999d957d145108fd88d63d83cc3a710dc6ee71916020908290030190a150565b60085481565b6000546001600160a01b03163314611f7857600080fd5b62093a80611f91600a544261293790919063ffffffff16565b11611fe3576040805162461bcd60e51b815260206004820152601f60248201527f526563656e746c792065786563757465642c20506c6561736520776169742100604482015290519081900360640190fd5b601e5461200990600080516020614f028339815191529061dead9063ffffffff612ab516565b6000601e5542600a55565b6000546001600160a01b0316331461202b57600080fd5b6001600160a01b03821661207a576040805162461bcd60e51b8152602060048201526011602482015270125b9d985b1a5908149958da5c1a595b9d607a1b604482015290519081900360640190fd5b60075442116120d0576040805162461bcd60e51b815260206004820152601960248201527f436f6e7472616374206e6f742065787069726564207965742100000000000000604482015290519081900360640190fd5b6001600160a01b03831661211d5760405182906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612116573d6000803e3d6000fd5b5050612137565b6121376001600160a01b038416838363ffffffff612ab516565b505050565b61214533612aa0565b15801561215157503233145b61219a576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b600b5460ff16156121e0576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6f833981519152604482015290519081900360640190fd5b61213733848484612aa6565b600e546001600160a01b031681565b6000546001600160a01b0316331461221257600080fd5b6001600160a01b03811661222557600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60156020526000908152604090205481565b61229b33612aa0565b1580156122a757503233145b6122f0576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b600b5460ff1615612336576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6f833981519152604482015290519081900360640190fd5b815160081461238c576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206d696e416d6f756e7473206c656e67746821000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526005602052604090205460ff166123f2576040805162461bcd60e51b8152602060048201526016602482015275496e76616c6964206465706f73697420746f6b656e2160501b604482015290519081900360640190fd5b6001600160a01b038416737463286a379f6f128058bb92b355e3d6e8bdb2191415612464576040805162461bcd60e51b815260206004820152601b60248201527f43616e6e6f74206465706f736974204c50206469726563746c79210000000000604482015290519081900360640190fd5b6001600160a01b0384166124bf576040805162461bcd60e51b815260206004820152601a60248201527f4465706f73697420746f6b656e2063616e6e6f74206265203021000000000000604482015290519081900360640190fd5b60008311612514576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420616d6f756e7420746f205374616b65210000000000000000604482015290519081900360640190fd5b61252f6001600160a01b03851633308663ffffffff612a4016565b600061254c612710611228600254876129a590919063ffffffff16565b90506000612560858363ffffffff61293716565b9050811561258857600e54612588906001600160a01b0388811691168463ffffffff612ab516565b60006125a261271061122884611d4c63ffffffff6129a516565b905060006125b6838363ffffffff61293716565b905060006125ef8973961c8c0b1aad0c0b10a51fef6a867e3091bcef17848a6000815181106125e157fe5b60200260200101518a61375a565b905061262b73961c8c0b1aad0c0b10a51fef6a867e3091bcef17731ab008cbfc99d0ca7e3fd8987ce1ebf832506f53600063ffffffff613d1416565b61266473961c8c0b1aad0c0b10a51fef6a867e3091bcef17731ab008cbfc99d0ca7e3fd8987ce1ebf832506f538363ffffffff613d1416565b731ab008cbfc99d0ca7e3fd8987ce1ebf832506f536001600160a01b03166355468afa33838a60018151811061269657fe5b60200260200101518a6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001848152602001838152602001828152602001945050505050600060405180830381600087803b1580156126fc57600080fd5b505af1158015612710573d6000803e3d6000fd5b50505050600061272a6002856129fe90919063ffffffff16565b9050600061273e858363ffffffff61293716565b905060006127718c600080516020614f02833981519152858d60048151811061276357fe5b60200260200101518d61375a565b905060006127aa8d73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2858e60058151811061279c57fe5b60200260200101518e61375a565b905060006127ba83838e8e613e27565b905060008111612811576040805162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206465706f736974203020546f6b656e73000000000000000000604482015290519081900360640190fd5b612845338d60068151811061282257fe5b60200260200101518e60078151811061283757fe5b60200260200101518e612aa6565b33600090815260136020526040902054612865908263ffffffff6128d416565b33600090815260136020526040902055601d54612888908263ffffffff6128d416565b601d5561289c60113363ffffffff6141ca16565b505033600090815260146020526040902042905550505050505050505050505050565b61dead81565b6a024873e6597d482d00000081565b60008282018381101561292e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b600061292e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506141df565b600061292e838361427b565b6000612931826142df565b600061292e836001600160a01b0384166142e3565b6000826129b457506000612931565b828202828482816129c157fe5b041461292e5760405162461bcd60e51b8152600401808060200182810382526021815260200180614eb96021913960400191505060405180910390fd5b600061292e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506142fb565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a9a908590614360565b50505050565b3b151590565b612a9a84600080868686612fea565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612137908490614360565b600b54600090612b3b90737463286a379f6f128058bb92b355e3d6e8bdb2199061010090046001600160a01b031683613d14565b600b54612b6c90737463286a379f6f128058bb92b355e3d6e8bdb2199061010090046001600160a01b031686613d14565b604080516370a0823160e01b81523060048201529051600091600080516020614f02833981519152916370a0823191602480820192602092909190829003018186803b158015612bbb57600080fd5b505afa158015612bcf573d6000803e3d6000fd5b505050506040513d6020811015612be557600080fd5b5051604080516370a0823160e01b8152306004820152905191925060009173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2916370a08231916024808301926020929190829003018186803b158015612c3e57600080fd5b505afa158015612c52573d6000803e3d6000fd5b505050506040513d6020811015612c6857600080fd5b5051600b54865191925061010090046001600160a01b03169063baa2abde90600080516020614f028339815191529073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2908a908a90600090612cba57fe5b60200260200101518a600181518110612ccf57fe5b6020908102919091010151604080516001600160e01b031960e089901b1681526001600160a01b0396871660048201529490951660248501526044840192909252606483015260848201523060a482015260c48101889052815160e480830193928290030181600087803b158015612d4657600080fd5b505af1158015612d5a573d6000803e3d6000fd5b505050506040513d6040811015612d7057600080fd5b5050604080516370a0823160e01b81523060048201529051600091600080516020614f02833981519152916370a0823191602480820192602092909190829003018186803b158015612dc157600080fd5b505afa158015612dd5573d6000803e3d6000fd5b505050506040513d6020811015612deb57600080fd5b5051604080516370a0823160e01b8152306004820152905191925060009173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2916370a08231916024808301926020929190829003018186803b158015612e4457600080fd5b505afa158015612e58573d6000803e3d6000fd5b505050506040513d6020811015612e6e57600080fd5b505190506000612e84838663ffffffff61293716565b90506000612e98838663ffffffff61293716565b90506000612ebd600080516020614f028339815191528d858d60028151811061276357fe5b90506000612ee873c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28e858e60038151811061279c57fe5b90506000612efc838363ffffffff6128d416565b9e9d5050505050505050505050505050565b600061292e836001600160a01b038416614411565b600081118015612f3557506000601d54115b612f7f576040805162461bcd60e51b81526020600482015260166024820152756469737472696275746544697673206661696c65642160501b604482015290519081900360640190fd5b601d54612fb190612fa29061122884670de0b6b3a764000063ffffffff6129a516565b601b549063ffffffff6128d416565b601b556040805182815290517f497e6c34cb46390a801e970e8c72fd87aa7fded87c9b77cdac588f235904a8259181900360200190a150565b612ff26144d7565b612ffc828261453e565b6000613007876114e2565b9050801561315a576000806001600160a01b038816158061304457506001600160a01b03881673961c8c0b1aad0c0b10a51fef6a867e3091bcef17145b15613081575073961c8c0b1aad0c0b10a51fef6a867e3091bcef1761307a600080516020614f028339815191528285898861375a565b91506130a1565b508661309e600080516020614f028339815191528285898861375a565b91505b6130bb6001600160a01b0382168a8463ffffffff612ab516565b6001600160a01b0389166000908152601660205260409020546130e4908463ffffffff6128d416565b6001600160a01b038a16600090815260166020526040902055600f54613110908463ffffffff6128d416565b600f55604080516001600160a01b038b1681526020810185905281517f586b2e63a21a7a4e1402e36f48ce10cb1ec94684fea254c186b76d1f98ecf130929181900390910190a150505b600061316588611181565b9050801561371b576001600160a01b03871615806132075750600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156131cc57600080fd5b505afa1580156131e0573d6000803e3d6000fd5b505050506040513d60208110156131f657600080fd5b50516001600160a01b038881169116145b156132a6576132a18882600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561325f57600080fd5b505afa158015613273573d6000803e3d6000fd5b505050506040513d602081101561328957600080fd5b50516001600160a01b0316919063ffffffff612ab516565b61367e565b6001600160a01b03871660009081526005602052604090205460ff16613313576040805162461bcd60e51b815260206004820152601b60248201527f63616e6e6f7420636c61696d206173207468697320746f6b656e210000000000604482015290519081900360640190fd5b600b54604080516315ab88c960e31b815290516133a59261010090046001600160a01b031691600091839163ad5c4648916004808301926020929190829003018186803b15801561336357600080fd5b505afa158015613377573d6000803e3d6000fd5b505050506040513d602081101561338d57600080fd5b50516001600160a01b0316919063ffffffff613d1416565b600b54604080516315ab88c960e31b815290516133f49261010090046001600160a01b0316918491839163ad5c4648916004808301926020929190829003018186803b15801561336357600080fd5b6040805160028082526060808301845292602083019080368337019050509050600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561346257600080fd5b505afa158015613476573d6000803e3d6000fd5b505050506040513d602081101561348c57600080fd5b50518151829060009061349b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505087816001815181106134c957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b60019054906101000a90046001600160a01b03166001600160a01b03166338ed17398389848d896040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561358b578181015183820152602001613573565b505050509050019650505050505050600060405180830381600087803b1580156135b457600080fd5b505af11580156135c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156135f157600080fd5b8101908080516040519392919084600160201b82111561361057600080fd5b90830190602082018581111561362557600080fd5b82518660208202830111600160201b8211171561364157600080fd5b82525081516020918201928201910280838360005b8381101561366e578181015183820152602001613656565b5050505090500160405250505050505b6001600160a01b0388166000908152601760205260409020546136a7908263ffffffff6128d416565b6001600160a01b0389166000908152601760205260409020556010546136d3908263ffffffff6128d416565b601055604080516001600160a01b038a1681526020810183905281517ff17669744a2126d947b5b82df9711ffdcc0fcea345193964bf642c98e1563b99929181900390910190a15b5050506001600160a01b039094166000908152601560209081526040808320429055601b546018835281842055601c5460199092529091205550505050565b6000846001600160a01b0316866001600160a01b0316141561377d575082613d0b565b600b546137a3906001600160a01b0388811691610100900416600063ffffffff613d1416565b600b546137c8906001600160a01b03888116916101009004168663ffffffff613d1416565b604080516370a0823160e01b815230600482015290516000916001600160a01b038816916370a0823191602480820192602092909190829003018186803b15801561381257600080fd5b505afa158015613826573d6000803e3d6000fd5b505050506040513d602081101561383c57600080fd5b5051600b54604080516315ab88c960e31b815290519293506060926101009092046001600160a01b03169163ad5c464891600480820192602092909190829003018186803b15801561388d57600080fd5b505afa1580156138a1573d6000803e3d6000fd5b505050506040513d60208110156138b757600080fd5b50516001600160a01b03898116911614806139565750600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561391b57600080fd5b505afa15801561392f573d6000803e3d6000fd5b505050506040513d602081101561394557600080fd5b50516001600160a01b038881169116145b156139dc576040805160028082526060820183529091602083019080368337019050509050878160008151811061398957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505086816001815181106139b757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613b03565b6040805160038082526080820190925290602082016060803683370190505090508781600081518110613a0b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613a7957600080fd5b505afa158015613a8d573d6000803e3d6000fd5b505050506040513d6020811015613aa357600080fd5b5051815182906001908110613ab457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508681600281518110613ae257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600b546040516338ed173960e01b8152600481018881526024820188905230606483018190526084830188905260a060448401908152855160a485015285516101009095046001600160a01b0316946338ed1739948c948c94899490938d9360c401906020878101910280838360005b83811015613b8b578181015183820152602001613b73565b505050509050019650505050505050600060405180830381600087803b158015613bb457600080fd5b505af1158015613bc8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613bf157600080fd5b8101908080516040519392919084600160201b821115613c1057600080fd5b908301906020820185811115613c2557600080fd5b82518660208202830111600160201b82111715613c4157600080fd5b82525081516020918201928201910280838360005b83811015613c6e578181015183820152602001613c56565b505050509190910160408181526370a0823160e01b825230600483015251600096506001600160a01b038e1695506370a08231945060248083019450602093509091829003018186803b158015613cc457600080fd5b505afa158015613cd8573d6000803e3d6000fd5b505050506040513d6020811015613cee57600080fd5b505190506000613d04828563ffffffff61293716565b9450505050505b95945050505050565b801580613d9a575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613d6c57600080fd5b505afa158015613d80573d6000803e3d6000fd5b505050506040513d6020811015613d9657600080fd5b5051155b613dd55760405162461bcd60e51b8152600401808060200182810382526036815260200180614f836036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612137908490614360565b600082600281518110613e3657fe5b6020026020010151851015613e7c5760405162461bcd60e51b815260040180806020018281038252602a815260200180614e8f602a913960400191505060405180910390fd5b82600381518110613e8957fe5b6020026020010151841015613ecf5760405162461bcd60e51b8152600401808060200182810382526028815260200180614eda6028913960400191505060405180910390fd5b604080516370a0823160e01b81523060048201529051600091737463286a379f6f128058bb92b355e3d6e8bdb219916370a0823191602480820192602092909190829003018186803b158015613f2457600080fd5b505afa158015613f38573d6000803e3d6000fd5b505050506040513d6020811015613f4e57600080fd5b5051600b54909150613f7f90600080516020614f028339815191529061010090046001600160a01b03166000613d14565b600b54613faa90600080516020614f028339815191529061010090046001600160a01b031688613d14565b600b54613fdc9073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29061010090046001600160a01b03166000613d14565b600b5461400d9073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29061010090046001600160a01b031687613d14565b600b60019054906101000a90046001600160a01b03166001600160a01b031663e8e33700600080516020614f0283398151915273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc289898960028151811061406457fe5b60200260200101518a60038151811061407957fe5b6020908102919091010151604080516001600160e01b031960e08a901b1681526001600160a01b03978816600482015295909616602486015260448501939093526064840191909152608483015260a48201523060c482015260e4810187905290516101048083019260609291908290030181600087803b1580156140fd57600080fd5b505af1158015614111573d6000803e3d6000fd5b505050506040513d606081101561412757600080fd5b5050604080516370a0823160e01b81523060048201529051600091737463286a379f6f128058bb92b355e3d6e8bdb219916370a0823191602480820192602092909190829003018186803b15801561417e57600080fd5b505afa158015614192573d6000803e3d6000fd5b505050506040513d60208110156141a857600080fd5b5051905060006141be828463ffffffff61293716565b98975050505050505050565b600061292e836001600160a01b038416614b35565b6000818484111561426e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561423357818101518382015260200161421b565b50505050905090810190601f1680156142605780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50508183035b9392505050565b815460009082106142bd5760405162461bcd60e51b8152600401808060200182810382526022815260200180614e276022913960400191505060405180910390fd5b8260000182815481106142cc57fe5b9060005260206000200154905092915050565b5490565b60009081526001919091016020526040902054151590565b6000818361434a5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561423357818101518382015260200161421b565b50600083858161435657fe5b0495945050505050565b60606143b5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614b7f9092919063ffffffff16565b805190915015612137578080602001905160208110156143d457600080fd5b50516121375760405162461bcd60e51b815260040180806020018281038252602a815260200180614f59602a913960400191505060405180910390fd5b600081815260018301602052604081205480156144cd578354600019808301919081019060009087908390811061444457fe5b906000526020600020015490508087600001848154811061446157fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061449157fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612931565b6000915050612931565b60006144e1611b4a565b905080601a5410156144f25750601a545b8015806144ff5750601d54155b1561450a575061453c565b601f5461451d908263ffffffff6128d416565b601f55601a54614533908263ffffffff61293716565b601a5550426008555b565b601d5461454a57614b31565b620151806145636009544261293790919063ffffffff16565b101561456e57614b31565b600c60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156145be57600080fd5b505af11580156145d2573d6000803e3d6000fd5b5050505060006145ef601e54601f546128d490919063ffffffff16565b905060006145fb611296565b905080614609575050614b31565b601f5481101561466357601f54600090614629908363ffffffff61293716565b601f5490915061463f908263ffffffff61293716565b601e54909350614655908263ffffffff6128d416565b601e55506000601f556146ac565b818110156146a157600061467d838363ffffffff61293716565b905061468f838263ffffffff61293716565b601e919091556000601f5591506146ac565b6000601f819055601e555b816146b8575050614b31565b604080516370a0823160e01b815230600482015290518391600080516020614f02833981519152916370a0823191602480820192602092909190829003018186803b15801561470657600080fd5b505afa15801561471a573d6000803e3d6000fd5b505050506040513d602081101561473057600080fd5b5051101561473f575050614b31565b600b5461476b90600080516020614f028339815191529061010090046001600160a01b03166000613d14565b600b5461479690600080516020614f028339815191529061010090046001600160a01b031684613d14565b6000600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156147e657600080fd5b505afa1580156147fa573d6000803e3d6000fd5b505050506040513d602081101561481057600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561485a57600080fd5b505afa15801561486e573d6000803e3d6000fd5b505050506040513d602081101561488457600080fd5b5051600b546040516338ed173960e01b8152600481018681526024820189905230606483018190526084830189905260a060448401908152600d805460a486018190529697506101009095046001600160a01b0316956338ed1739958a958d959194938d93909160c401908690801561492657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614908575b50509650505050505050600060405180830381600087803b15801561494a57600080fd5b505af115801561495e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561498757600080fd5b8101908080516040519392919084600160201b8211156149a657600080fd5b9083019060208201858111156149bb57600080fd5b82518660208202830111600160201b821117156149d757600080fd5b82525081516020918201928201910280838360005b83811015614a045781810151838201526020016149ec565b50505050905001604052505050506000600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015614a6257600080fd5b505afa158015614a76573d6000803e3d6000fd5b505050506040513d6020811015614a8c57600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015614ad657600080fd5b505afa158015614aea573d6000803e3d6000fd5b505050506040513d6020811015614b0057600080fd5b505190506000614b16828463ffffffff61293716565b90508015614b2757614b2781614b96565b5050426009555050505b5050565b6000614b4183836142e3565b614b7757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155612931565b506000612931565b6060614b8e8484600085614c64565b949350505050565b600081118015614ba857506000601d54115b614bf9576040805162461bcd60e51b815260206004820152601960248201527f6469737472696275746544697673457468206661696c65642100000000000000604482015290519081900360640190fd5b601d54614c2b90614c1c9061122884670de0b6b3a764000063ffffffff6129a516565b601c549063ffffffff6128d416565b601c556040805182815290517f56ce0eae0b79fabf707cf07252ae767ac575085fbf32b98546f8f0f01725b9749181900360200190a150565b606082471015614ca55760405162461bcd60e51b8152600401808060200182810382526026815260200180614e496026913960400191505060405180910390fd5b614cae85612aa0565b614cff576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310614d3e5780518252601f199092019160209182019101614d1f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614da0576040519150601f19603f3d011682016040523d82523d6000602084013e614da5565b606091505b5091509150614db5828286614dc0565b979650505050505050565b60608315614dcf575081614274565b825115614ddf5782518084602001fd5b60405162461bcd60e51b815260206004820181815284516024840152845185939192839260440191908501908083836000831561423357818101518382015260200161421b56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c43616e6e6f74206578656375746520647572696e6720656d657267656e63792152657761726420546f6b656e205265636569766564206c6f776572207468616e20657870656374656421536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774261736520546f6b656e205265636569766564206c6f776572207468616e20657870656374656421000000000000000000000000bd100d061e120b2c67a24453cf6368e63f1be056596f7520726563656e746c79206465706f73697465642c20706c656173652077616974206265666f7265207769746864726177696e672e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212201f1d5648b4bbd8065606ac0eef705979e95d4500ee02179ea2b3ed9bf7d4a53064736f6c634300060b003300000000000000000000000000000000000000000000000000000000000000600000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000910090ea889b64b4e722ea4b8ff6d5e734dfb38f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000bd100d061e120b2c67a24453cf6368e63f1be056000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106104075760003560e01c80638b21990911610220578063c326bf4f11610130578063e3956a95116100b8578063f2fde38b11610087578063f2fde38b14610b05578063f3f91fa014610b2b578063f7e453b714610b51578063fccc281314610c09578063fe547f7214610c1157610407565b8063e3956a9514610a96578063e9dc18ec14610a9e578063efa9a9be14610ad4578063f1bab2ec14610afd57610407565b8063d140d6eb116100ff578063d140d6eb14610a1a578063d578ceab14610a58578063d7130e1414610a60578063dbcdc2cc14610a68578063e027c61f14610a8e57610407565b8063c326bf4f146109be578063c725e6d2146109e4578063ca7e083514610a0a578063ca9a213214610a1257610407565b8063a3c962c7116101b3578063ac51de8d11610182578063ac51de8d14610963578063b7ad18c41461096b578063b7d3786e14610973578063b9dffd3214610990578063c1665f40146109b657610407565b8063a3c962c714610893578063a6f5388c1461089b578063a891fa8914610953578063aabcad821461095b57610407565b80638f5705be116101ef5780638f5705be1461084057806398896d10146108485780639f54790d1461086e578063a1ccb8131461087657610407565b80638b219909146108025780638b7afe2e146108285780638da5cb5b146108305780638e20a1d91461083857610407565b8063452b4cfc1161031b57806358ee82fe116102ae5780636949b9d61161027d5780636949b9d6146107da578063765ae8bf146107e25780637a6eb0d0146107ea5780637e1c0c09146107f25780637e44b933146107fa57610407565b806358ee82fe1461077e578063596fa9e3146107a45780635f9e8f82146107ac5780636270cd18146107b457610407565b806349bd5a5e116102ea57806349bd5a5e146107495780634b62b70b146107515780634ca5610b1461076e57806358a3d9631461077657610407565b8063452b4cfc146106f6578063468b4d411461071357806346a28f631461071b57806346c648731461072357610407565b80632ba2ed981161039e57806331a5dda11161036d57806331a5dda1146106b057806331e244e5146106b85780633992fba5146106c05780633bed5043146106c857806344aa796a146106ee57610407565b80632ba2ed981461060b5780632e9f87a614610628578063307e52a71461066e578063308feec3146106a857610407565b80631cfa8021116103da5780631cfa80211461059c5780631f04461c146105c0578063271c23fa146105e65780632b4beea6146105ee57610407565b806305447d251461040c5780630c9a0c78146105525780630f1a64441461056c5780631419841d14610574575b600080fd5b61042f6004803603604081101561042257600080fd5b5080359060200135610c19565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b8381101561047b578181015183820152602001610463565b50505050905001858103845288818151815260200191508051906020019060200280838360005b838110156104ba5781810151838201526020016104a2565b50505050905001858103835287818151815260200191508051906020019060200280838360005b838110156104f95781810151838201526020016104e1565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015610538578181015183820152602001610520565b505050509050019850505050505050505060405180910390f35b61055a610e9d565b60408051918252519081900360200190f35b61055a610ea3565b61059a6004803603602081101561058a57600080fd5b50356001600160a01b0316610ea9565b005b6105a4610f7f565b604080516001600160a01b039092168252519081900360200190f35b61055a600480360360208110156105d657600080fd5b50356001600160a01b0316610f97565b61055a610fa9565b6105a46004803603602081101561060457600080fd5b5035610faf565b61059a6004803603602081101561062157600080fd5b5035610fd6565b61059a600480360360c081101561063e57600080fd5b508035906020810135906040810135906060810135906001600160a01b03608082013581169160a0013516611028565b6106946004803603602081101561068457600080fd5b50356001600160a01b031661107d565b604080519115158252519081900360200190f35b61055a611092565b6105a46110a3565b61059a6110b5565b61055a61117b565b61055a600480360360208110156106de57600080fd5b50356001600160a01b0316611181565b61055a61123f565b61059a6004803603602081101561070c57600080fd5b5035611246565b61055a611296565b61055a611355565b61055a6004803603602081101561073957600080fd5b50356001600160a01b031661135b565b6105a461136d565b61059a6004803603602081101561076757600080fd5b503561137c565b6105a461141e565b61055a611436565b61055a6004803603602081101561079457600080fd5b50356001600160a01b031661143c565b6105a461144e565b610694611462565b61055a600480360360208110156107ca57600080fd5b50356001600160a01b031661146b565b61055a61147d565b6105a4611483565b61055a61149b565b61055a6114a1565b61055a6114a7565b61055a6004803603602081101561081857600080fd5b50356001600160a01b03166114ad565b61055a6114bf565b6105a46114c5565b61055a6114d4565b61055a6114da565b61055a6004803603602081101561085e57600080fd5b50356001600160a01b03166114e2565b61055a611551565b61059a6004803603602081101561088c57600080fd5b5035611557565b6105a46115ee565b61059a600480360360808110156108b157600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156108e057600080fd5b8201836020820111156108f257600080fd5b803590602001918460208302840111600160201b8311171561091357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611606915050565b61055a6119eb565b61059a6119f2565b61055a611b4a565b61055a611be3565b61059a6004803603602081101561098957600080fd5b5035611be9565b61059a600480360360208110156109a657600080fd5b50356001600160a01b0316611c80565b61055a611ce3565b61055a600480360360208110156109d457600080fd5b50356001600160a01b0316611ce9565b61059a600480360360208110156109fa57600080fd5b50356001600160a01b0316611cfb565b61055a611d5b565b61055a611d61565b61059a600480360360a0811015610a3057600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135611d68565b61055a611e8e565b61055a611e94565b61059a60048036036020811015610a7e57600080fd5b50356001600160a01b0316611e9c565b61055a611f5b565b61059a611f61565b61059a60048036036060811015610ab457600080fd5b506001600160a01b03813581169160208101359091169060400135612014565b61059a60048036036060811015610aea57600080fd5b508035906020810135906040013561213c565b6105a46121ec565b61059a60048036036020811015610b1b57600080fd5b50356001600160a01b03166121fb565b61055a60048036036020811015610b4157600080fd5b50356001600160a01b0316612280565b61059a60048036036080811015610b6757600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115610b9657600080fd5b820183602082011115610ba857600080fd5b803590602001918460208302840111600160201b83111715610bc957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250612292915050565b6105a46128bf565b61055a6128c5565b606080606080848610610c2b57600080fd5b6000610c3d868863ffffffff61293716565b905060608167ffffffffffffffff81118015610c5857600080fd5b50604051908082528060200260200182016040528015610c82578160200160208202803683370190505b50905060608267ffffffffffffffff81118015610c9e57600080fd5b50604051908082528060200260200182016040528015610cc8578160200160208202803683370190505b50905060608367ffffffffffffffff81118015610ce457600080fd5b50604051908082528060200260200182016040528015610d0e578160200160208202803683370190505b50905060608467ffffffffffffffff81118015610d2a57600080fd5b50604051908082528060200260200182016040528015610d54578160200160208202803683370190505b5090508a5b8a811015610e8b576000610d7460118363ffffffff61297916565b90506000610d88838f63ffffffff61293716565b905081878281518110610d9757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060146000836001600160a01b03166001600160a01b0316815260200190815260200160002054868281518110610de957fe5b60200260200101818152505060156000836001600160a01b03166001600160a01b0316815260200190815260200160002054858281518110610e2757fe5b60200260200101818152505060136000836001600160a01b03166001600160a01b0316815260200190815260200160002054848281518110610e6557fe5b602090810291909101015250610e84905081600163ffffffff6128d416565b9050610d59565b50929a91995097509095509350505050565b61271081565b60015481565b6000546001600160a01b03163314610ec057600080fd5b6001600160a01b038116610f1b576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420726f75746572206164647265737321000000000000000000604482015290519081900360640190fd5b600b80546001600160a01b03808416610100908102610100600160a81b03199093169290921792839055604080519290930416815290517f49381de8f56ca0c45bdd955e613a01e042fdf45d2ae4b0cfd920226fe0ed2ede9181900360200190a150565b737463286a379f6f128058bb92b355e3d6e8bdb21981565b60186020526000908152604090205481565b60095481565b600d8181548110610fbc57fe5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314610fed57600080fd5b60048190556040805182815290517ffb06af695e3e2ab9f65ec2316a3cb72fd442f2288bb3bb1fa8f52cea13e446db9181900360200190a150565b6000546001600160a01b0316331461103f57600080fd5b61104886610fd6565b6110518561137c565b61105a84611be9565b61106383611557565b61106c82610ea9565b61107581611e9c565b505050505050565b60056020526000908152604090205460ff1681565b600061109e6011612985565b905090565b600080516020614f0283398151915281565b6000546001600160a01b031633146110cc57600080fd5b600b5460ff1615611112576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6f833981519152604482015290519081900360640190fd5b600b805460ff19166001179055611132426203f48063ffffffff6128d416565b6007556000600181905554604080516001600160a01b039092168252517fe465b068e033879ed58088ba05882c35e2a52240ea1432b95753d6aebdd0814a9181900360200190a1565b60045481565b600061119460118363ffffffff61299016565b6111a05750600061123a565b6001600160a01b0382166000908152601360205260409020546111c55750600061123a565b6001600160a01b038216600090815260196020526040812054601c546111f09163ffffffff61293716565b6001600160a01b038416600090815260136020526040812054919250611234670de0b6b3a7640000611228848663ffffffff6129a516565b9063ffffffff6129fe16565b93505050505b919050565b6201518081565b6000546001600160a01b0316331461125d57600080fd5b61127d600080516020614f0283398151915233308463ffffffff612a4016565b601a54611290908263ffffffff6128d416565b601a5550565b604080516370a0823160e01b8152737463286a379f6f128058bb92b355e3d6e8bdb219600482015290516000918291600080516020614f02833981519152916370a08231916024808301926020929190829003018186803b1580156112fa57600080fd5b505afa15801561130e573d6000803e3d6000fd5b505050506040513d602081101561132457600080fd5b505160045490915060009061134e90670de0b6b3a76400009061122890859063ffffffff6129a516565b9250505090565b60105481565b60146020526000908152604090205481565b600c546001600160a01b031681565b6000546001600160a01b0316331461139357600080fd5b6276a7008111156113e3576040805162461bcd60e51b81526020600482015260156024820152744c6f636b75702074696d6520746f6f206c6f6e672160581b604482015290519081900360640190fd5b60018190556040805182815290517fadbac78f382a6f10bef84ad4b704cac4817788ffec4f83ac665d7a1152dc44729181900360200190a150565b731ab008cbfc99d0ca7e3fd8987ce1ebf832506f5381565b601f5481565b60176020526000908152604090205481565b600b5461010090046001600160a01b031681565b600b5460ff1681565b60166020526000908152604090205481565b600a5481565b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1781565b601e5481565b601d5481565b60025481565b60196020526000908152604090205481565b601a5481565b6000546001600160a01b031681565b601b5481565b6301e1338081565b60006114f560118363ffffffff61299016565b6115015750600061123a565b6001600160a01b0382166000908152601360205260409020546115265750600061123a565b6001600160a01b038216600090815260186020526040812054601b546111f09163ffffffff61293716565b60065481565b6000546001600160a01b0316331461156e57600080fd5b61271081106115b3576040805162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206665652160a01b604482015290519081900360640190fd5b60038190556040805182815290517f0a9e89cff3f9f01bd1c6aeb9b71324bb138123c40d02eb478613fb3427b231009181900360200190a150565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61160f33612aa0565b15801561161b57503233145b611664576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b81516006146116b0576040805162461bcd60e51b8152602060048201526013602482015272496e76616c6964206d696e416d6f756e74732160681b604482015290519081900360640190fd5b6001600160a01b03841661170b576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420776974686472617720746f6b656e21000000000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526005602052604090205460ff16611778576040805162461bcd60e51b815260206004820152601b60248201527f576974686472617720746f6b656e206e6f742074727573746564210000000000604482015290519081900360640190fd5b600083116117cd576040805162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207769746864726177203020546f6b656e732100000000000000604482015290519081900360640190fd5b33600090815260136020526040902054831115611831576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420616d6f756e7420746f207769746864726177000000000000604482015290519081900360640190fd5b6001543360009081526014602052604090205461185590429063ffffffff61293716565b116118915760405162461bcd60e51b8152600401808060200182810382526037815260200180614f226037913960400191505060405180910390fd5b6118c533836004815181106118a257fe5b6020026020010151846005815181106118b757fe5b602002602001015184612aa6565b60006118e2612710611228600354876129a590919063ffffffff16565b905060006118f6858363ffffffff61293716565b9050811561193057600e5461193090737463286a379f6f128058bb92b355e3d6e8bdb219906001600160a01b03168463ffffffff612ab516565b600061193e87838787612b07565b905061195a6001600160a01b038816338363ffffffff612ab516565b3360009081526013602052604090205461197a908763ffffffff61293716565b33600090815260136020526040902055601d5461199d908763ffffffff61293716565b601d556119b160113363ffffffff61299016565b80156119ca575033600090815260136020526040902054155b156119e2576119e060113363ffffffff612f0e16565b505b50505050505050565b62093a8081565b6000546001600160a01b03163314611a0957600080fd5b62093a80611a22600a544261293790919063ffffffff16565b11611a74576040805162461bcd60e51b815260206004820152601f60248201527f526563656e746c792065786563757465642c20506c6561736520776169742100604482015290519081900360640190fd5b600c60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ac457600080fd5b505af1158015611ad8573d6000803e3d6000fd5b505050506000611ae6611296565b601e54909150600081831015611b0c57611b06828463ffffffff61293716565b90508291505b611b1582612f23565b8015611b3c57611b3c600080516020614f0283398151915261dead8363ffffffff612ab516565b50506000601e555042600a55565b600654600090819042908290611b6a906301e1338063ffffffff6128d416565b905080821115611b78578091505b8160085410611b8a5760009250611ba1565b600854611b9e90839063ffffffff61293716565b92505b6000611bda6127106112286301e133808188611bce6a024873e6597d482d0000008663ffffffff6129a516565b9063ffffffff6129a516565b94505050505090565b601c5481565b6000546001600160a01b03163314611c0057600080fd5b6127108110611c45576040805162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206665652160a01b604482015290519081900360640190fd5b60028190556040805182815290517f327680b8ba8221210809b2aae37f88a529ae9eec9a3a3fe952fe0a3a262b487f9181900360200190a150565b6000546001600160a01b03163314611c9757600080fd5b6001600160a01b038116600081815260056020526040808220805460ff19166001179055517f74bd711825aaf93834b0d2fb7bce500caae1be2723cbe48022e2584d6151e3329190a250565b60035481565b60136020526000908152604090205481565b6000546001600160a01b03163314611d1257600080fd5b6001600160a01b038116600081815260056020526040808220805460ff19169055517f091fc62f7712ef1aa0d7d7957476c0cf7e066e7cd795eae019e0f45f64ea00989190a250565b60075481565b6203f48081565b611d7133612aa0565b158015611d7d57503233145b611dc6576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b600b5460ff1615611e0c576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6f833981519152604482015290519081900360640190fd5b6001600160a01b03851660009081526005602052604090205460ff16611e79576040805162461bcd60e51b815260206004820152601b60248201527f63616e6e6f7420636c61696d206173207468697320746f6b656e210000000000604482015290519081900360640190fd5b611e87338686868686612fea565b5050505050565b600f5481565b630208c08081565b6000546001600160a01b03163314611eb357600080fd5b6001600160a01b038116611f01576040805162461bcd60e51b815260206004820152601060248201526f496e76616c696420616464726573732160801b604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b03838116919091179182905560408051929091168252517fafc54c644914e872610dbc4334999d957d145108fd88d63d83cc3a710dc6ee71916020908290030190a150565b60085481565b6000546001600160a01b03163314611f7857600080fd5b62093a80611f91600a544261293790919063ffffffff16565b11611fe3576040805162461bcd60e51b815260206004820152601f60248201527f526563656e746c792065786563757465642c20506c6561736520776169742100604482015290519081900360640190fd5b601e5461200990600080516020614f028339815191529061dead9063ffffffff612ab516565b6000601e5542600a55565b6000546001600160a01b0316331461202b57600080fd5b6001600160a01b03821661207a576040805162461bcd60e51b8152602060048201526011602482015270125b9d985b1a5908149958da5c1a595b9d607a1b604482015290519081900360640190fd5b60075442116120d0576040805162461bcd60e51b815260206004820152601960248201527f436f6e7472616374206e6f742065787069726564207965742100000000000000604482015290519081900360640190fd5b6001600160a01b03831661211d5760405182906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612116573d6000803e3d6000fd5b5050612137565b6121376001600160a01b038416838363ffffffff612ab516565b505050565b61214533612aa0565b15801561215157503233145b61219a576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b600b5460ff16156121e0576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6f833981519152604482015290519081900360640190fd5b61213733848484612aa6565b600e546001600160a01b031681565b6000546001600160a01b0316331461221257600080fd5b6001600160a01b03811661222557600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60156020526000908152604090205481565b61229b33612aa0565b1580156122a757503233145b6122f0576040805162461bcd60e51b81526020600482015260156024820152744e6f20436f6e74726163747320416c6c6f7765642160581b604482015290519081900360640190fd5b600b5460ff1615612336576040805162461bcd60e51b81526020600482018190526024820152600080516020614e6f833981519152604482015290519081900360640190fd5b815160081461238c576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206d696e416d6f756e7473206c656e67746821000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526005602052604090205460ff166123f2576040805162461bcd60e51b8152602060048201526016602482015275496e76616c6964206465706f73697420746f6b656e2160501b604482015290519081900360640190fd5b6001600160a01b038416737463286a379f6f128058bb92b355e3d6e8bdb2191415612464576040805162461bcd60e51b815260206004820152601b60248201527f43616e6e6f74206465706f736974204c50206469726563746c79210000000000604482015290519081900360640190fd5b6001600160a01b0384166124bf576040805162461bcd60e51b815260206004820152601a60248201527f4465706f73697420746f6b656e2063616e6e6f74206265203021000000000000604482015290519081900360640190fd5b60008311612514576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420616d6f756e7420746f205374616b65210000000000000000604482015290519081900360640190fd5b61252f6001600160a01b03851633308663ffffffff612a4016565b600061254c612710611228600254876129a590919063ffffffff16565b90506000612560858363ffffffff61293716565b9050811561258857600e54612588906001600160a01b0388811691168463ffffffff612ab516565b60006125a261271061122884611d4c63ffffffff6129a516565b905060006125b6838363ffffffff61293716565b905060006125ef8973961c8c0b1aad0c0b10a51fef6a867e3091bcef17848a6000815181106125e157fe5b60200260200101518a61375a565b905061262b73961c8c0b1aad0c0b10a51fef6a867e3091bcef17731ab008cbfc99d0ca7e3fd8987ce1ebf832506f53600063ffffffff613d1416565b61266473961c8c0b1aad0c0b10a51fef6a867e3091bcef17731ab008cbfc99d0ca7e3fd8987ce1ebf832506f538363ffffffff613d1416565b731ab008cbfc99d0ca7e3fd8987ce1ebf832506f536001600160a01b03166355468afa33838a60018151811061269657fe5b60200260200101518a6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001848152602001838152602001828152602001945050505050600060405180830381600087803b1580156126fc57600080fd5b505af1158015612710573d6000803e3d6000fd5b50505050600061272a6002856129fe90919063ffffffff16565b9050600061273e858363ffffffff61293716565b905060006127718c600080516020614f02833981519152858d60048151811061276357fe5b60200260200101518d61375a565b905060006127aa8d73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2858e60058151811061279c57fe5b60200260200101518e61375a565b905060006127ba83838e8e613e27565b905060008111612811576040805162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206465706f736974203020546f6b656e73000000000000000000604482015290519081900360640190fd5b612845338d60068151811061282257fe5b60200260200101518e60078151811061283757fe5b60200260200101518e612aa6565b33600090815260136020526040902054612865908263ffffffff6128d416565b33600090815260136020526040902055601d54612888908263ffffffff6128d416565b601d5561289c60113363ffffffff6141ca16565b505033600090815260146020526040902042905550505050505050505050505050565b61dead81565b6a024873e6597d482d00000081565b60008282018381101561292e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b600061292e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506141df565b600061292e838361427b565b6000612931826142df565b600061292e836001600160a01b0384166142e3565b6000826129b457506000612931565b828202828482816129c157fe5b041461292e5760405162461bcd60e51b8152600401808060200182810382526021815260200180614eb96021913960400191505060405180910390fd5b600061292e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506142fb565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a9a908590614360565b50505050565b3b151590565b612a9a84600080868686612fea565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612137908490614360565b600b54600090612b3b90737463286a379f6f128058bb92b355e3d6e8bdb2199061010090046001600160a01b031683613d14565b600b54612b6c90737463286a379f6f128058bb92b355e3d6e8bdb2199061010090046001600160a01b031686613d14565b604080516370a0823160e01b81523060048201529051600091600080516020614f02833981519152916370a0823191602480820192602092909190829003018186803b158015612bbb57600080fd5b505afa158015612bcf573d6000803e3d6000fd5b505050506040513d6020811015612be557600080fd5b5051604080516370a0823160e01b8152306004820152905191925060009173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2916370a08231916024808301926020929190829003018186803b158015612c3e57600080fd5b505afa158015612c52573d6000803e3d6000fd5b505050506040513d6020811015612c6857600080fd5b5051600b54865191925061010090046001600160a01b03169063baa2abde90600080516020614f028339815191529073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2908a908a90600090612cba57fe5b60200260200101518a600181518110612ccf57fe5b6020908102919091010151604080516001600160e01b031960e089901b1681526001600160a01b0396871660048201529490951660248501526044840192909252606483015260848201523060a482015260c48101889052815160e480830193928290030181600087803b158015612d4657600080fd5b505af1158015612d5a573d6000803e3d6000fd5b505050506040513d6040811015612d7057600080fd5b5050604080516370a0823160e01b81523060048201529051600091600080516020614f02833981519152916370a0823191602480820192602092909190829003018186803b158015612dc157600080fd5b505afa158015612dd5573d6000803e3d6000fd5b505050506040513d6020811015612deb57600080fd5b5051604080516370a0823160e01b8152306004820152905191925060009173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2916370a08231916024808301926020929190829003018186803b158015612e4457600080fd5b505afa158015612e58573d6000803e3d6000fd5b505050506040513d6020811015612e6e57600080fd5b505190506000612e84838663ffffffff61293716565b90506000612e98838663ffffffff61293716565b90506000612ebd600080516020614f028339815191528d858d60028151811061276357fe5b90506000612ee873c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28e858e60038151811061279c57fe5b90506000612efc838363ffffffff6128d416565b9e9d5050505050505050505050505050565b600061292e836001600160a01b038416614411565b600081118015612f3557506000601d54115b612f7f576040805162461bcd60e51b81526020600482015260166024820152756469737472696275746544697673206661696c65642160501b604482015290519081900360640190fd5b601d54612fb190612fa29061122884670de0b6b3a764000063ffffffff6129a516565b601b549063ffffffff6128d416565b601b556040805182815290517f497e6c34cb46390a801e970e8c72fd87aa7fded87c9b77cdac588f235904a8259181900360200190a150565b612ff26144d7565b612ffc828261453e565b6000613007876114e2565b9050801561315a576000806001600160a01b038816158061304457506001600160a01b03881673961c8c0b1aad0c0b10a51fef6a867e3091bcef17145b15613081575073961c8c0b1aad0c0b10a51fef6a867e3091bcef1761307a600080516020614f028339815191528285898861375a565b91506130a1565b508661309e600080516020614f028339815191528285898861375a565b91505b6130bb6001600160a01b0382168a8463ffffffff612ab516565b6001600160a01b0389166000908152601660205260409020546130e4908463ffffffff6128d416565b6001600160a01b038a16600090815260166020526040902055600f54613110908463ffffffff6128d416565b600f55604080516001600160a01b038b1681526020810185905281517f586b2e63a21a7a4e1402e36f48ce10cb1ec94684fea254c186b76d1f98ecf130929181900390910190a150505b600061316588611181565b9050801561371b576001600160a01b03871615806132075750600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156131cc57600080fd5b505afa1580156131e0573d6000803e3d6000fd5b505050506040513d60208110156131f657600080fd5b50516001600160a01b038881169116145b156132a6576132a18882600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561325f57600080fd5b505afa158015613273573d6000803e3d6000fd5b505050506040513d602081101561328957600080fd5b50516001600160a01b0316919063ffffffff612ab516565b61367e565b6001600160a01b03871660009081526005602052604090205460ff16613313576040805162461bcd60e51b815260206004820152601b60248201527f63616e6e6f7420636c61696d206173207468697320746f6b656e210000000000604482015290519081900360640190fd5b600b54604080516315ab88c960e31b815290516133a59261010090046001600160a01b031691600091839163ad5c4648916004808301926020929190829003018186803b15801561336357600080fd5b505afa158015613377573d6000803e3d6000fd5b505050506040513d602081101561338d57600080fd5b50516001600160a01b0316919063ffffffff613d1416565b600b54604080516315ab88c960e31b815290516133f49261010090046001600160a01b0316918491839163ad5c4648916004808301926020929190829003018186803b15801561336357600080fd5b6040805160028082526060808301845292602083019080368337019050509050600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561346257600080fd5b505afa158015613476573d6000803e3d6000fd5b505050506040513d602081101561348c57600080fd5b50518151829060009061349b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505087816001815181106134c957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b60019054906101000a90046001600160a01b03166001600160a01b03166338ed17398389848d896040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561358b578181015183820152602001613573565b505050509050019650505050505050600060405180830381600087803b1580156135b457600080fd5b505af11580156135c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156135f157600080fd5b8101908080516040519392919084600160201b82111561361057600080fd5b90830190602082018581111561362557600080fd5b82518660208202830111600160201b8211171561364157600080fd5b82525081516020918201928201910280838360005b8381101561366e578181015183820152602001613656565b5050505090500160405250505050505b6001600160a01b0388166000908152601760205260409020546136a7908263ffffffff6128d416565b6001600160a01b0389166000908152601760205260409020556010546136d3908263ffffffff6128d416565b601055604080516001600160a01b038a1681526020810183905281517ff17669744a2126d947b5b82df9711ffdcc0fcea345193964bf642c98e1563b99929181900390910190a15b5050506001600160a01b039094166000908152601560209081526040808320429055601b546018835281842055601c5460199092529091205550505050565b6000846001600160a01b0316866001600160a01b0316141561377d575082613d0b565b600b546137a3906001600160a01b0388811691610100900416600063ffffffff613d1416565b600b546137c8906001600160a01b03888116916101009004168663ffffffff613d1416565b604080516370a0823160e01b815230600482015290516000916001600160a01b038816916370a0823191602480820192602092909190829003018186803b15801561381257600080fd5b505afa158015613826573d6000803e3d6000fd5b505050506040513d602081101561383c57600080fd5b5051600b54604080516315ab88c960e31b815290519293506060926101009092046001600160a01b03169163ad5c464891600480820192602092909190829003018186803b15801561388d57600080fd5b505afa1580156138a1573d6000803e3d6000fd5b505050506040513d60208110156138b757600080fd5b50516001600160a01b03898116911614806139565750600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561391b57600080fd5b505afa15801561392f573d6000803e3d6000fd5b505050506040513d602081101561394557600080fd5b50516001600160a01b038881169116145b156139dc576040805160028082526060820183529091602083019080368337019050509050878160008151811061398957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505086816001815181106139b757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613b03565b6040805160038082526080820190925290602082016060803683370190505090508781600081518110613a0b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613a7957600080fd5b505afa158015613a8d573d6000803e3d6000fd5b505050506040513d6020811015613aa357600080fd5b5051815182906001908110613ab457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508681600281518110613ae257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600b546040516338ed173960e01b8152600481018881526024820188905230606483018190526084830188905260a060448401908152855160a485015285516101009095046001600160a01b0316946338ed1739948c948c94899490938d9360c401906020878101910280838360005b83811015613b8b578181015183820152602001613b73565b505050509050019650505050505050600060405180830381600087803b158015613bb457600080fd5b505af1158015613bc8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613bf157600080fd5b8101908080516040519392919084600160201b821115613c1057600080fd5b908301906020820185811115613c2557600080fd5b82518660208202830111600160201b82111715613c4157600080fd5b82525081516020918201928201910280838360005b83811015613c6e578181015183820152602001613c56565b505050509190910160408181526370a0823160e01b825230600483015251600096506001600160a01b038e1695506370a08231945060248083019450602093509091829003018186803b158015613cc457600080fd5b505afa158015613cd8573d6000803e3d6000fd5b505050506040513d6020811015613cee57600080fd5b505190506000613d04828563ffffffff61293716565b9450505050505b95945050505050565b801580613d9a575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613d6c57600080fd5b505afa158015613d80573d6000803e3d6000fd5b505050506040513d6020811015613d9657600080fd5b5051155b613dd55760405162461bcd60e51b8152600401808060200182810382526036815260200180614f836036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612137908490614360565b600082600281518110613e3657fe5b6020026020010151851015613e7c5760405162461bcd60e51b815260040180806020018281038252602a815260200180614e8f602a913960400191505060405180910390fd5b82600381518110613e8957fe5b6020026020010151841015613ecf5760405162461bcd60e51b8152600401808060200182810382526028815260200180614eda6028913960400191505060405180910390fd5b604080516370a0823160e01b81523060048201529051600091737463286a379f6f128058bb92b355e3d6e8bdb219916370a0823191602480820192602092909190829003018186803b158015613f2457600080fd5b505afa158015613f38573d6000803e3d6000fd5b505050506040513d6020811015613f4e57600080fd5b5051600b54909150613f7f90600080516020614f028339815191529061010090046001600160a01b03166000613d14565b600b54613faa90600080516020614f028339815191529061010090046001600160a01b031688613d14565b600b54613fdc9073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29061010090046001600160a01b03166000613d14565b600b5461400d9073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29061010090046001600160a01b031687613d14565b600b60019054906101000a90046001600160a01b03166001600160a01b031663e8e33700600080516020614f0283398151915273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc289898960028151811061406457fe5b60200260200101518a60038151811061407957fe5b6020908102919091010151604080516001600160e01b031960e08a901b1681526001600160a01b03978816600482015295909616602486015260448501939093526064840191909152608483015260a48201523060c482015260e4810187905290516101048083019260609291908290030181600087803b1580156140fd57600080fd5b505af1158015614111573d6000803e3d6000fd5b505050506040513d606081101561412757600080fd5b5050604080516370a0823160e01b81523060048201529051600091737463286a379f6f128058bb92b355e3d6e8bdb219916370a0823191602480820192602092909190829003018186803b15801561417e57600080fd5b505afa158015614192573d6000803e3d6000fd5b505050506040513d60208110156141a857600080fd5b5051905060006141be828463ffffffff61293716565b98975050505050505050565b600061292e836001600160a01b038416614b35565b6000818484111561426e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561423357818101518382015260200161421b565b50505050905090810190601f1680156142605780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50508183035b9392505050565b815460009082106142bd5760405162461bcd60e51b8152600401808060200182810382526022815260200180614e276022913960400191505060405180910390fd5b8260000182815481106142cc57fe5b9060005260206000200154905092915050565b5490565b60009081526001919091016020526040902054151590565b6000818361434a5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561423357818101518382015260200161421b565b50600083858161435657fe5b0495945050505050565b60606143b5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614b7f9092919063ffffffff16565b805190915015612137578080602001905160208110156143d457600080fd5b50516121375760405162461bcd60e51b815260040180806020018281038252602a815260200180614f59602a913960400191505060405180910390fd5b600081815260018301602052604081205480156144cd578354600019808301919081019060009087908390811061444457fe5b906000526020600020015490508087600001848154811061446157fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061449157fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612931565b6000915050612931565b60006144e1611b4a565b905080601a5410156144f25750601a545b8015806144ff5750601d54155b1561450a575061453c565b601f5461451d908263ffffffff6128d416565b601f55601a54614533908263ffffffff61293716565b601a5550426008555b565b601d5461454a57614b31565b620151806145636009544261293790919063ffffffff16565b101561456e57614b31565b600c60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156145be57600080fd5b505af11580156145d2573d6000803e3d6000fd5b5050505060006145ef601e54601f546128d490919063ffffffff16565b905060006145fb611296565b905080614609575050614b31565b601f5481101561466357601f54600090614629908363ffffffff61293716565b601f5490915061463f908263ffffffff61293716565b601e54909350614655908263ffffffff6128d416565b601e55506000601f556146ac565b818110156146a157600061467d838363ffffffff61293716565b905061468f838263ffffffff61293716565b601e919091556000601f5591506146ac565b6000601f819055601e555b816146b8575050614b31565b604080516370a0823160e01b815230600482015290518391600080516020614f02833981519152916370a0823191602480820192602092909190829003018186803b15801561470657600080fd5b505afa15801561471a573d6000803e3d6000fd5b505050506040513d602081101561473057600080fd5b5051101561473f575050614b31565b600b5461476b90600080516020614f028339815191529061010090046001600160a01b03166000613d14565b600b5461479690600080516020614f028339815191529061010090046001600160a01b031684613d14565b6000600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156147e657600080fd5b505afa1580156147fa573d6000803e3d6000fd5b505050506040513d602081101561481057600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561485a57600080fd5b505afa15801561486e573d6000803e3d6000fd5b505050506040513d602081101561488457600080fd5b5051600b546040516338ed173960e01b8152600481018681526024820189905230606483018190526084830189905260a060448401908152600d805460a486018190529697506101009095046001600160a01b0316956338ed1739958a958d959194938d93909160c401908690801561492657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614908575b50509650505050505050600060405180830381600087803b15801561494a57600080fd5b505af115801561495e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561498757600080fd5b8101908080516040519392919084600160201b8211156149a657600080fd5b9083019060208201858111156149bb57600080fd5b82518660208202830111600160201b821117156149d757600080fd5b82525081516020918201928201910280838360005b83811015614a045781810151838201526020016149ec565b50505050905001604052505050506000600b60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015614a6257600080fd5b505afa158015614a76573d6000803e3d6000fd5b505050506040513d6020811015614a8c57600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015614ad657600080fd5b505afa158015614aea573d6000803e3d6000fd5b505050506040513d6020811015614b0057600080fd5b505190506000614b16828463ffffffff61293716565b90508015614b2757614b2781614b96565b5050426009555050505b5050565b6000614b4183836142e3565b614b7757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155612931565b506000612931565b6060614b8e8484600085614c64565b949350505050565b600081118015614ba857506000601d54115b614bf9576040805162461bcd60e51b815260206004820152601960248201527f6469737472696275746544697673457468206661696c65642100000000000000604482015290519081900360640190fd5b601d54614c2b90614c1c9061122884670de0b6b3a764000063ffffffff6129a516565b601c549063ffffffff6128d416565b601c556040805182815290517f56ce0eae0b79fabf707cf07252ae767ac575085fbf32b98546f8f0f01725b9749181900360200190a150565b606082471015614ca55760405162461bcd60e51b8152600401808060200182810382526026815260200180614e496026913960400191505060405180910390fd5b614cae85612aa0565b614cff576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310614d3e5780518252601f199092019160209182019101614d1f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614da0576040519150601f19603f3d011682016040523d82523d6000602084013e614da5565b606091505b5091509150614db5828286614dc0565b979650505050505050565b60608315614dcf575081614274565b825115614ddf5782518084602001fd5b60405162461bcd60e51b815260206004820181815284516024840152845185939192839260440191908501908083836000831561423357818101518382015260200161421b56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c43616e6e6f74206578656375746520647572696e6720656d657267656e63792152657761726420546f6b656e205265636569766564206c6f776572207468616e20657870656374656421536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774261736520546f6b656e205265636569766564206c6f776572207468616e20657870656374656421000000000000000000000000bd100d061e120b2c67a24453cf6368e63f1be056596f7520726563656e746c79206465706f73697465642c20706c656173652077616974206265666f7265207769746864726177696e672e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212201f1d5648b4bbd8065606ac0eef705979e95d4500ee02179ea2b3ed9bf7d4a53064736f6c634300060b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000600000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000910090ea889b64b4e722ea4b8ff6d5e734dfb38f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000bd100d061e120b2c67a24453cf6368e63f1be056000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : swapPath (address[]): 0xBD100d061E120b2c67A24453CF6368E63f1Be056,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [1] : _uniswapV2RouterAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _feeRecipientAddress (address): 0x910090Ea889B64B4e722ea4b8fF6D5e734dFb38F
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 000000000000000000000000910090ea889b64b4e722ea4b8ff6d5e734dfb38f
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [4] : 000000000000000000000000bd100d061e120b2c67a24453cf6368e63f1be056
Arg [5] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode Sourcemap
33491:32102:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63894:1131;;;;;;;;;;;;;;;;-1:-1:-1;63894:1131:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36352:48;;;:::i;:::-;;;;;;;;;;;;;;;;35636:31;;;:::i;40172:253::-;;;;;;;;;;;;;;;;-1:-1:-1;40172:253:0;-1:-1:-1;;;;;40172:253:0;;:::i;:::-;;34671:95;;;:::i;:::-;;;;-1:-1:-1;;;;;34671:95:0;;;;;;;;;;;;;;39759:46;;;;;;;;;;;;;;;;-1:-1:-1;39759:46:0;-1:-1:-1;;;;;39759:46:0;;:::i;37497:33::-;;;:::i;37719:26::-;;;;;;;;;;;;;;;;-1:-1:-1;37719:26:0;;:::i;40983:158::-;;;;;;;;;;;;;;;;-1:-1:-1;40983:158:0;;:::i;41375:588::-;;;;;;;;;;;;;;;;-1:-1:-1;41375:588:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41375:588:0;;;;;;;;;;;;:::i;36838:55::-;;;;;;;;;;;;;;;;-1:-1:-1;36838:55:0;-1:-1:-1;;;;;36838:55:0;;:::i;:::-;;;;;;;;;;;;;;;;;;47751:99;;;:::i;34884:94::-;;;:::i;39104:237::-;;;:::i;36573:43::-;;;:::i;47251:442::-;;;;;;;;;;;;;;;;-1:-1:-1;47251:442:0;-1:-1:-1;;;;;47251:442:0;;:::i;36096:47::-;;;:::i;42043:218::-;;;;;;;;;;;;;;;;-1:-1:-1;42043:218:0;;:::i;62709:289::-;;;:::i;39391:38::-;;;:::i;39542:44::-;;;;;;;;;;;;;;;;-1:-1:-1;39542:44:0;-1:-1:-1;;;;;39542:44:0;;:::i;37677:35::-;;;:::i;41147:220::-;;;;;;;;;;;;;;;;-1:-1:-1;41147:220:0;;:::i;34987:98::-;;;:::i;40076:33::-;;;:::i;39705:47::-;;;;;;;;;;;;;;;;-1:-1:-1;39705:47:0;-1:-1:-1;;;;;39705:47:0;;:::i;37631:39::-;;;:::i;37587:31::-;;;:::i;39648:50::-;;;;;;;;;;;;;;;;-1:-1:-1;39648:50:0;-1:-1:-1;;;;;39648:50:0;;:::i;37537:41::-;;;:::i;35159:96::-;;;:::i;40027:42::-;;;:::i;39987:27::-;;;:::i;36475:38::-;;;:::i;39812:49::-;;;;;;;;;;;;;;;;-1:-1:-1;39812:49:0;-1:-1:-1;;;;;39812:49:0;;:::i;39870:31::-;;;:::i;27843:20::-;;;:::i;39910:30::-;;;:::i;35812:48::-;;;:::i;46741:433::-;;;;;;;;;;;;;;;;-1:-1:-1;46741:433:0;-1:-1:-1;;;;;46741:433:0;;:::i;37388:30::-;;;:::i;40700:277::-;;;;;;;;;;;;;;;;-1:-1:-1;40700:277:0;;:::i;35317:92::-;;;:::i;52690:1998::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52690:1998:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52690:1998:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52690:1998:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52690:1998:0;;-1:-1:-1;;52690:1998:0;;;-1:-1:-1;52690:1998:0;;-1:-1:-1;;52690:1998:0:i;36211:56::-;;;:::i;61106:940::-;;;:::i;63105:736::-;;;:::i;39947:33::-;;;:::i;40431:263::-;;;;;;;;;;;;;;;;-1:-1:-1;40431:263:0;;:::i;36900:234::-;;;;;;;;;;;;;;;;-1:-1:-1;36900:234:0;-1:-1:-1;;;;;36900:234:0;;:::i;36520:40::-;;;:::i;39487:48::-;;;;;;;;;;;;;;;;-1:-1:-1;39487:48:0;-1:-1:-1;;;;;39487:48:0;;:::i;37140:240::-;;;;;;;;;;;;;;;;-1:-1:-1;37140:240:0;-1:-1:-1;;;;;37140:240:0;;:::i;37425:30::-;;;:::i;36413:49::-;;;:::i;56942:455::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;56942:455:0;;;;;;;;;;;;;;;;;;;;;;;:::i;39349:35::-;;;:::i;35994:50::-;;;:::i;38454:283::-;;;;;;;;;;;;;;;;-1:-1:-1;38454:283:0;-1:-1:-1;;;;;38454:283:0;;:::i;37462:28::-;;;:::i;62111:361::-;;;:::i;65128:462::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;65128:462:0;;;;;;;;;;;;;;;;;:::i;56671:259::-;;;;;;;;;;;;;;;;-1:-1:-1;56671:259:0;;;;;;;;;;;;:::i;37758:34::-;;;:::i;28462:178::-;;;;;;;;;;;;;;;;-1:-1:-1;28462:178:0;-1:-1:-1;;;;;28462:178:0;;:::i;39593:48::-;;;;;;;;;;;;;;;;-1:-1:-1;39593:48:0;-1:-1:-1;;;;;39593:48:0;;:::i;47902:3257::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47902:3257:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47902:3257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47902:3257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47902:3257:0;;-1:-1:-1;;47902:3257:0;;;-1:-1:-1;47902:3257:0;;-1:-1:-1;;47902:3257:0:i;35469:81::-;;;:::i;35701:48::-;;;:::i;63894:1131::-;64001:24;64040:31;64086:35;64136:26;64197:8;64184:10;:21;64175:31;;;;;;64219:11;64233:24;:8;64246:10;64233:24;:12;:24;:::i;:::-;64219:38;;64268:25;64310:6;64296:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64296:21:0;;64268:49;;64328:32;64374:6;64363:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64363:18:0;;64328:53;;64392:36;64442:6;64431:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64431:18:0;;64392:57;;64460:27;64501:6;64490:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64490:18:0;-1:-1:-1;64460:48:0;-1:-1:-1;64535:10:0;64521:408;64551:8;64547:1;:12;64521:408;;;64590:14;64607:13;:7;64618:1;64607:13;:10;:13;:::i;:::-;64590:30;-1:-1:-1;64635:14:0;64652:17;:1;64658:10;64652:17;:5;:17;:::i;:::-;64635:34;;64706:6;64684:8;64693:9;64684:19;;;;;;;;;;;;;:28;-1:-1:-1;;;;;64684:28:0;;;-1:-1:-1;;;;;64684:28:0;;;;;64759:11;:19;64771:6;-1:-1:-1;;;;;64759:19:0;-1:-1:-1;;;;;64759:19:0;;;;;;;;;;;;;64727:18;64746:9;64727:29;;;;;;;;;;;;;:51;;;;;64829:15;:23;64845:6;-1:-1:-1;;;;;64829:23:0;-1:-1:-1;;;;;64829:23:0;;;;;;;;;;;;;64793:22;64816:9;64793:33;;;;;;;;;;;;;:59;;;;;64894:15;:23;64910:6;-1:-1:-1;;;;;64894:23:0;-1:-1:-1;;;;;64894:23:0;;;;;;;;;;;;;64867:13;64881:9;64867:24;;;;;;;;;;;;;;;;;:50;-1:-1:-1;64565:8:0;;-1:-1:-1;64565:1:0;64571;64565:8;:5;:8;:::i;:::-;64561:12;;64521:408;;;-1:-1:-1;64949:8:0;;64959:18;;-1:-1:-1;64959:18:0;-1:-1:-1;64949:8:0;;-1:-1:-1;63894:1131:0;-1:-1:-1;;;;63894:1131:0:o;36352:48::-;36395:5;36352:48;:::o;35636:31::-;;;;:::o;40172:253::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;-1:-1:-1;;;;;40261:29:0;::::1;40253:65;;;::::0;;-1:-1:-1;;;40253:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;40329:15;:24:::0;;-1:-1:-1;;;;;40329:24:0;;::::1;;::::0;;::::1;-1:-1:-1::0;;;;;;40329:24:0;;::::1;::::0;;;::::1;::::0;;;;40369:48:::1;::::0;;40400:15;;;::::1;;40369:48:::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;40172:253:::0;:::o;34671:95::-;34724:42;34671:95;:::o;39759:46::-;;;;;;;;;;;;;:::o;37497:33::-;;;;:::o;37719:26::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37719:26:0;;-1:-1:-1;37719:26:0;:::o;40983:158::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;41056:12:::1;:29:::0;;;41101:32:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;40983:158:::0;:::o;41375:588::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;41652:30:::1;41667:14;41652;:30::i;:::-;41693:25;41707:10;41693:13;:25::i;:::-;41729:41;41751:18;41729:21;:41::i;:::-;41781:45;41805:20;41781:23;:45::i;:::-;41837:61;41873:23;41837:18;:61::i;:::-;41909:46;41932:22;41909;:46::i;:::-;41375:588:::0;;;;;;:::o;36838:55::-;;;;;;;;;;;;;;;:::o;47751:99::-;47802:4;47826:16;:7;:14;:16::i;:::-;47819:23;;47751:99;:::o;34884:94::-;-1:-1:-1;;;;;;;;;;;34884:94:0;:::o;39104:237::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;39024:11:::1;::::0;::::1;;39023:12;39015:57;;;::::0;;-1:-1:-1;;;39015:57:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;39015:57:0;;;;;;;;;;;;;::::1;;39181:11:::2;:18:::0;;-1:-1:-1;;39181:18:0::2;39195:4;39181:18;::::0;;39231:28:::2;:3;36456:6;39231:28;:7;:28;:::i;:::-;39210:18;:49:::0;39282:1:::2;39270:9;:13:::0;;;39327:5;39309:24:::2;::::0;;-1:-1:-1;;;;;39327:5:0;;::::2;39309:24:::0;;;::::2;::::0;;;;::::2;::::0;;::::2;39104:237::o:0;36573:43::-;;;;:::o;47251:442::-;47316:4;47338:25;:7;47355;47338:25;:16;:25;:::i;:::-;47333:40;;-1:-1:-1;47372:1:0;47365:8;;47333:40;-1:-1:-1;;;;;47388:24:0;;;;;;:15;:24;;;;;;47384:43;;-1:-1:-1;47426:1:0;47419:8;;47384:43;-1:-1:-1;;;;;47482:25:0;;47440:17;47482:25;;;:16;:25;;;;;;47460:17;;:48;;;:21;:48;:::i;:::-;-1:-1:-1;;;;;47544:24:0;;47521:20;47544:24;;;:15;:24;;;;;;47440:68;;-1:-1:-1;47600:54:0;40159:4;47600:33;47544:24;47440:68;47600:33;:19;:33;:::i;:::-;:37;:54;:37;:54;:::i;:::-;47581:73;-1:-1:-1;;;;47251:442:0;;;;:::o;36096:47::-;36137:6;36096:47;:::o;42043:218::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;42112:85:::1;-1:-1:-1::0;;;;;;;;;;;42163:10:0::1;42183:4;42190:6:::0;42112:85:::1;:50;:85;:::i;:::-;42226:15;::::0;:27:::1;::::0;42246:6;42226:27:::1;:19;:27;:::i;:::-;42208:15;:45:::0;-1:-1:-1;42043:218:0:o;62709:289::-;62803:71;;;-1:-1:-1;;;62803:71:0;;34724:42;62803:71;;;;;;62763:4;;;;-1:-1:-1;;;;;;;;;;;34936:42:0;62803:43;;:71;;;;;;;;;;;;;;34936:42;62803:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62803:71:0;62931:12;;62803:71;;-1:-1:-1;62885:23:0;;62911:43;;62949:4;;62911:33;;62803:71;;62911:33;:19;:33;:::i;:43::-;62885:69;-1:-1:-1;;;62709:289:0;:::o;39391:38::-;;;;:::o;39542:44::-;;;;;;;;;;;;;:::o;37677:35::-;;;-1:-1:-1;;;;;37677:35:0;;:::o;41147:220::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;41245:7:::1;41227:14;:25;;41219:59;;;::::0;;-1:-1:-1;;;41219:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41219:59:0;;;;;;;;;;;;;::::1;;41289:9;:26:::0;;;41331:28:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;41147:220:::0;:::o;34987:98::-;35043:42;34987:98;:::o;40076:33::-;;;;:::o;39705:47::-;;;;;;;;;;;;;:::o;37631:39::-;;;;;;-1:-1:-1;;;;;37631:39:0;;:::o;37587:31::-;;;;;;:::o;39648:50::-;;;;;;;;;;;;;:::o;37537:41::-;;;;:::o;35159:96::-;35213:42;35159:96;:::o;40027:42::-;;;;:::o;39987:27::-;;;;:::o;36475:38::-;;;;:::o;39812:49::-;;;;;;;;;;;;;:::o;39870:31::-;;;;:::o;27843:20::-;;;-1:-1:-1;;;;;27843:20:0;;:::o;39910:30::-;;;;:::o;35812:48::-;35852:8;35812:48;:::o;46741:433::-;46803:4;46825:25;:7;46842;46825:25;:16;:25;:::i;:::-;46820:40;;-1:-1:-1;46859:1:0;46852:8;;46820:40;-1:-1:-1;;;;;46875:24:0;;;;;;:15;:24;;;;;;46871:43;;-1:-1:-1;46913:1:0;46906:8;;46871:43;-1:-1:-1;;;;;46966:22:0;;46927:17;46966:22;;;:13;:22;;;;;;46947:14;;:42;;;:18;:42;:::i;37388:30::-;;;;:::o;40700:277::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;40825:5:::1;40799:23;:31;40791:56;;;::::0;;-1:-1:-1;;;40791:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40791:56:0;;;;;;;;;;;;;::::1;;40858:24;:50:::0;;;40924:45:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;40700:277:::0;:::o;35317:92::-;35367:42;35317:92;:::o;52690:1998::-;38860:32;38868:10;38860:30;:32::i;:::-;38858:35;:62;;;;-1:-1:-1;38897:9:0;38910:10;38897:23;38858:62;38850:96;;;;;-1:-1:-1;;;38850:96:0;;;;;;;;;;;;-1:-1:-1;;;38850:96:0;;;;;;;;;;;;;;;53245:10:::1;:17;53266:1;53245:22;53237:54;;;::::0;;-1:-1:-1;;;53237:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;53237:54:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;53310:29:0;::::1;53302:65;;;::::0;;-1:-1:-1;;;53302:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;53386:39:0;::::1;;::::0;;;:22:::1;:39;::::0;;;;;::::1;;53378:79;;;::::0;;-1:-1:-1;;;53378:79:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;53495:1;53476:16;:20;53468:58;;;::::0;;-1:-1:-1;;;53468:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;53563:10;53547:27;::::0;;;:15:::1;:27;::::0;;;;;:47;-1:-1:-1;53547:47:0::1;53539:86;;;::::0;;-1:-1:-1;;;53539:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;53679:9;::::0;53664:10:::1;53652:23;::::0;;;:11:::1;:23;::::0;;;;;53644:32:::1;::::0;:3:::1;::::0;:32:::1;:7;:32;:::i;:::-;:44;53636:112;;;;-1:-1:-1::0;;;53636:112:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53769:132;53783:10;53830;53841:1;53830:13;;;;;;;;;;;;;;53876:10;53887:1;53876:13;;;;;;;;;;;;;;53891:9;53769:13;:132::i;:::-;53922:8;53933:57;53984:5;53933:46;53954:24;;53933:16;:20;;:46;;;;:::i;:57::-;53922:68:::0;-1:-1:-1;54001:19:0::1;54023:25;:16:::0;53922:68;54023:25:::1;:20;:25;:::i;:::-;54001:47:::0;-1:-1:-1;54063:7:0;;54059:113:::1;;54135:19;::::0;54087:73:::1;::::0;34724:42:::1;::::0;-1:-1:-1;;;;;54135:19:0::1;54156:3:::0;54087:73:::1;:47;:73;:::i;:::-;54184:26;54213:98;54256:15;54273:14;54289:10;54301:9;54213:42;:98::i;:::-;54184:127:::0;-1:-1:-1;54324:71:0::1;-1:-1:-1::0;;;;;54324:36:0;::::1;54361:10;54184:127:::0;54324:71:::1;:36;:71;:::i;:::-;54454:10;54438:27;::::0;;;:15:::1;:27;::::0;;;;;:49:::1;::::0;54470:16;54438:49:::1;:31;:49;:::i;:::-;54424:10;54408:27;::::0;;;:15:::1;:27;::::0;;;;:79;54512:11:::1;::::0;:33:::1;::::0;54528:16;54512:33:::1;:15;:33;:::i;:::-;54498:11;:47:::0;54562:28:::1;:7;54579:10;54562:28;:16;:28;:::i;:::-;:64;;;;-1:-1:-1::0;54610:10:0::1;54594:27;::::0;;;:15:::1;:27;::::0;;;;;:32;54562:64:::1;54558:123;;;54643:26;:7;54658:10;54643:26;:14;:26;:::i;:::-;;54558:123;38957:1;;;52690:1998:::0;;;;:::o;36211:56::-;36261:6;36211:56;:::o;61106:940::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;36261:6:::1;61174:38;61182:29;;61174:3;:7;;:38;;;;:::i;:::-;:67;61166:111;;;::::0;;-1:-1:-1;;;61166:111:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;61343:13;;;;;;;;;-1:-1:-1::0;;;;;61343:13:0::1;-1:-1:-1::0;;;;;61343:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;61384:23;61410;:21;:23::i;:::-;61482:26;::::0;61384:49;;-1:-1:-1;61454:25:0::1;61565:41:::0;;::::1;61561:193;;;61642:44;:20:::0;61667:18;61642:44:::1;:24;:44;:::i;:::-;61623:63;;61724:18;61701:41;;61561:193;61774:36;61789:20;61774:14;:36::i;:::-;61825:20:::0;;61821:131:::1;;61862:78;-1:-1:-1::0;;;;;;;;;;;35508:42:0::1;61923:16:::0;61862:78:::1;:46;:78;:::i;:::-;-1:-1:-1::0;;61991:1:0::1;61962:26;:30:::0;-1:-1:-1;62035:3:0::1;62003:29;:35:::0;61106:940::o;63105:736::-;63250:18;;63160:4;;;;63213:3;;63160:4;;63250:40;;35852:8;63250:40;:22;:40;:::i;:::-;63227:63;;63312:15;63305:4;:22;63301:77;;;63351:15;63344:22;;63301:77;63412:4;63392:16;;:24;63388:139;;63444:1;63433:12;;63388:139;;;63498:16;;63489:26;;:4;;:26;:8;:26;:::i;:::-;63478:37;;63388:139;63539:20;63562:238;63794:5;63562:189;35852:8;63562:189;63682:8;63562:77;35739:10;63794:5;63562:77;:56;:77;:::i;:::-;:119;:129;:119;:129;:::i;:238::-;63539:261;-1:-1:-1;;;;;63105:736:0;:::o;39947:33::-;;;;:::o;40431:263::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;40550:5:::1;40526:21;:29;40518:54;;;::::0;;-1:-1:-1;;;40518:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40518:54:0;;;;;;;;;;;;;::::1;;40583:22;:46:::0;;;40645:41:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;40431:263:::0;:::o;36900:234::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;-1:-1:-1;;;;;37002:52:0;::::1;;::::0;;;:22:::1;:52;::::0;;;;;:59;;-1:-1:-1;;37002:59:0::1;37057:4;37002:59;::::0;;37077:49;::::1;::::0;37002:52;37077:49:::1;36900:234:::0;:::o;36520:40::-;;;;:::o;39487:48::-;;;;;;;;;;;;;:::o;37140:240::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;-1:-1:-1;;;;;37245:52:0;::::1;37300:5;37245:52:::0;;;:22:::1;:52;::::0;;;;;:60;;-1:-1:-1;;37245:60:0::1;::::0;;37321:51;::::1;::::0;37300:5;37321:51:::1;37140:240:::0;:::o;37425:30::-;;;;:::o;36413:49::-;36456:6;36413:49;:::o;56942:455::-;38860:32;38868:10;38860:30;:32::i;:::-;38858:35;:62;;;;-1:-1:-1;38897:9:0;38910:10;38897:23;38858:62;38850:96;;;;;-1:-1:-1;;;38850:96:0;;;;;;;;;;;;-1:-1:-1;;;38850:96:0;;;;;;;;;;;;;;;39024:11:::1;::::0;::::1;;39023:12;39015:57;;;::::0;;-1:-1:-1;;;39015:57:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;39015:57:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;57168:36:0;::::2;;::::0;;;:22:::2;:36;::::0;;;;;::::2;;57160:76;;;::::0;;-1:-1:-1;;;57160:76:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;57247:142;57261:10;57273:12;57287:31;57320:30;57352:25;57379:9;57247:13;:142::i;:::-;56942:455:::0;;;;;:::o;39349:35::-;;;;:::o;35994:50::-;36036:8;35994:50;:::o;38454:283::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;-1:-1:-1;;;;;38554:36:0;::::1;38546:65;;;::::0;;-1:-1:-1;;;38546:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38546:65:0;;;;;;;;;;;;;::::1;;38622:19;:44:::0;;-1:-1:-1;;;;;;38622:44:0::1;-1:-1:-1::0;;;;;38622:44:0;;::::1;::::0;;;::::1;::::0;;;;38682:47:::1;::::0;;38709:19;;;::::1;38682:47:::0;;;::::1;::::0;::::1;::::0;;;;;;::::1;38454:283:::0;:::o;37462:28::-;;;;:::o;62111:361::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;36261:6:::1;62175:38;62183:29;;62175:3;:7;;:38;;;;:::i;:::-;:67;62167:111;;;::::0;;-1:-1:-1;;;62167:111:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;62350:26;::::0;62289:88:::1;::::0;-1:-1:-1;;;;;;;;;;;34936:42:0;35508::::1;::::0;62289:88:::1;:46;:88;:::i;:::-;62417:1;62388:26;:30:::0;62461:3:::1;62429:29;:35:::0;62111:361::o;65128:462::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;-1:-1:-1;;;;;65236:23:0;::::1;65228:53;;;::::0;;-1:-1:-1;;;65228:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;65228:53:0;;;;;;;;;;;;;::::1;;65306:18;;65300:3;:24;65292:62;;;::::0;;-1:-1:-1;;;65292:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;65369:19:0;::::1;65365:162;;65467:27;::::0;65442:9;;-1:-1:-1;;;;;65467:19:0;::::1;::::0;:27;::::1;;;::::0;65487:6;;65405:26:::1;65467:27:::0;65405:26;65467:27;65487:6;65467:19;:27;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;65509:7;;;65365:162;65537:45;-1:-1:-1::0;;;;;65537:26:0;::::1;65564:9:::0;65575:6;65537:45:::1;:26;:45;:::i;:::-;65128:462:::0;;;:::o;56671:259::-;38860:32;38868:10;38860:30;:32::i;:::-;38858:35;:62;;;;-1:-1:-1;38897:9:0;38910:10;38897:23;38858:62;38850:96;;;;;-1:-1:-1;;;38850:96:0;;;;;;;;;;;;-1:-1:-1;;;38850:96:0;;;;;;;;;;;;;;;39024:11:::1;::::0;::::1;;39023:12;39015:57;;;::::0;;-1:-1:-1;;;39015:57:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;39015:57:0;;;;;;;;;;;;;::::1;;56827:95:::2;56841:10;56853:30;56885:25;56912:9;56827:13;:95::i;37758:34::-:0;;;-1:-1:-1;;;;;37758:34:0;;:::o;28462:178::-;28273:5;;-1:-1:-1;;;;;28273:5:0;28259:10;:19;28251:28;;;;;;-1:-1:-1;;;;;28539:22:0;::::1;28531:31;;;::::0;::::1;;28595:5;::::0;;28574:37:::1;::::0;-1:-1:-1;;;;;28574:37:0;;::::1;::::0;28595:5;::::1;::::0;28574:37:::1;::::0;::::1;28618:5;:16:::0;;-1:-1:-1;;;;;;28618:16:0::1;-1:-1:-1::0;;;;;28618:16:0;;;::::1;::::0;;;::::1;::::0;;28462:178::o;39593:48::-;;;;;;;;;;;;;:::o;47902:3257::-;38860:32;38868:10;38860:30;:32::i;:::-;38858:35;:62;;;;-1:-1:-1;38897:9:0;38910:10;38897:23;38858:62;38850:96;;;;;-1:-1:-1;;;38850:96:0;;;;;;;;;;;;-1:-1:-1;;;38850:96:0;;;;;;;;;;;;;;;39024:11:::1;::::0;::::1;;39023:12;39015:57;;;::::0;;-1:-1:-1;;;39015:57:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;39015:57:0;;;;;;;;;;;;;::::1;;48552:10:::2;:17;48573:1;48552:22;48544:61;;;::::0;;-1:-1:-1;;;48544:61:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;48634:36:0;::::2;;::::0;;;:22:::2;:36;::::0;;;;;::::2;;48626:71;;;::::0;;-1:-1:-1;;;48626:71:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48626:71:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;48870:42:0;::::2;34724;48870;;48862:82;;;::::0;;-1:-1:-1;;;48862:82:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;48963:26:0;::::2;48955:65;;;::::0;;-1:-1:-1;;;48955:65:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;49057:1;49041:13;:17;49033:54;;;::::0;;-1:-1:-1;;;49033:54:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;49100:79;-1:-1:-1::0;;;;;49100:37:0;::::2;49138:10;49158:4;49165:13:::0;49100:79:::2;:37;:79;:::i;:::-;49192:8;49203:52;49249:5;49203:41;49221:22;;49203:13;:17;;:41;;;;:::i;:52::-;49192:63:::0;-1:-1:-1;49266:19:0::2;49288:22;:13:::0;49192:63;49288:22:::2;:17;:22;:::i;:::-;49266:44:::0;-1:-1:-1;49325:7:0;;49321:99:::2;;49383:19;::::0;49349:59:::2;::::0;-1:-1:-1;;;;;49349:33:0;;::::2;::::0;49383:19:::2;49404:3:::0;49349:59:::2;:33;:59;:::i;:::-;49432:15;49450:35;49479:5;49450:24;:14:::0;49469:4:::2;49450:24;:18;:24;:::i;:35::-;49432:53:::0;-1:-1:-1;49496:15:0::2;49514:30;:14:::0;49432:53;49514:30:::2;:18;:30;:::i;:::-;49496:48;;49557:30;49590:114;49597:12;35213:42;49640:10;49679;49690:1;49679:13;;;;;;;;;;;;;;49694:9;49590:6;:114::i;:::-;49557:147:::0;-1:-1:-1;49717:90:0::2;35213:42;35043;49805:1;49717:90;:47;:90;:::i;:::-;49818:114;35213:42;35043;49906:25:::0;49818:114:::2;:47;:114;:::i;:::-;35043:42;-1:-1:-1::0;;;;;49945:64:0::2;;50010:10;50022:25;50085:10;50096:1;50085:13;;;;;;;;;;;;;;50100:9;49945:165;;;;;;;;;;;;;-1:-1:-1::0;;;;;49945:165:0::2;-1:-1:-1::0;;;;;49945:165:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;50123:9;50135:17;50150:1;50135:10;:14;;:17;;;;:::i;:::-;50123:29:::0;-1:-1:-1;50163:14:0::2;50180:20;:10:::0;50123:29;50180:20:::2;:14;:20;:::i;:::-;50163:37;;50213:25;50241:116;50248:12;-1:-1:-1::0;;;;;;;;;;;50289:4:0::2;50332:10;50343:1;50332:13;;;;;;;;;;;;;;50347:9;50241:6;:116::i;:::-;50213:144;;50368:23;50394:117;50401:12;35367:42;50440:9;50486:10;50497:1;50486:13;;;;;;;;;;;;;;50501:9;50394:6;:117::i;:::-;50368:143;;50524:20;50547:162;50595:20;50631:18;50664:10;50689:9;50547:33;:162::i;:::-;50524:185;;50748:1;50730:15;:19;50722:55;;;::::0;;-1:-1:-1;;;50722:55:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;50790:129;50804:10;50850;50861:1;50850:13;;;;;;;;;;;;;;50894:10;50905:1;50894:13;;;;;;;;;;;;;;50909:9;50790:13;:129::i;:::-;50986:10;50970:27;::::0;;;:15:::2;:27;::::0;;;;;:48:::2;::::0;51002:15;50970:48:::2;:31;:48;:::i;:::-;50956:10;50940:27;::::0;;;:15:::2;:27;::::0;;;;:78;51043:11:::2;::::0;:32:::2;::::0;51059:15;51043:32:::2;:15;:32;:::i;:::-;51029:11;:46:::0;51088:23:::2;:7;51100:10;51088:23;:11;:23;:::i;:::-;-1:-1:-1::0;;51134:10:0::2;51122:23;::::0;;;:11:::2;:23;::::0;;;;51148:3:::2;51122:29:::0;;-1:-1:-1;;;;;;;;;;;;;47902:3257:0:o;35469:81::-;35508:42;35469:81;:::o;35701:48::-;35739:10;35701:48;:::o;911:181::-;969:7;1001:5;;;1025:6;;;;1017:46;;;;;-1:-1:-1;;;1017:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1083:1;-1:-1:-1;911:181:0;;;;;:::o;1375:136::-;1433:7;1460:43;1464:1;1467;1460:43;;;;;;;;;;;;;;;;;:3;:43::i;11578:149::-;11652:7;11695:22;11699:3;11711:5;11695:3;:22::i;11117:117::-;11180:7;11207:19;11215:3;11207:7;:19::i;10873:158::-;10953:4;10977:46;10987:3;-1:-1:-1;;;;;11007:14:0;;10977:9;:46::i;2265:471::-;2323:7;2568:6;2564:47;;-1:-1:-1;2598:1:0;2591:8;;2564:47;2635:5;;;2639:1;2635;:5;:1;2659:5;;;;;:10;2651:56;;;;-1:-1:-1;;;2651:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3212:132;3270:7;3297:39;3301:1;3304;3297:39;;;;;;;;;;;;;;;;;:3;:39::i;24738:205::-;24866:68;;;-1:-1:-1;;;;;24866:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24866:68:0;-1:-1:-1;;;24866:68:0;;;24839:96;;24859:5;;24839:19;:96::i;:::-;24738:205;;;;:::o;14022:422::-;14389:20;14428:8;;;14022:422::o;46410:259::-;46554:107;46568:7;46585:1;46589;46592:30;46624:25;46651:9;46554:13;:107::i;24553:177::-;24663:58;;;-1:-1:-1;;;;;24663:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24663:58:0;-1:-1:-1;;;24663:58:0;;;24636:86;;24656:5;;24636:19;:86::i;54700:1911::-;54984:15;;54902:4;;54929:75;;34724:42;;54984:15;;;-1:-1:-1;;;;;54984:15:0;54902:4;54929:46;:75::i;:::-;55070:15;;55015:88;;34724:42;;55070:15;;;-1:-1:-1;;;;;55070:15:0;55088:14;55015:46;:88::i;:::-;55146:58;;;-1:-1:-1;;;55146:58:0;;55198:4;55146:58;;;;;;55116:27;;-1:-1:-1;;;;;;;;;;;34936:42:0;55146:43;;:58;;;;;;;;;;;;;;;34936:42;55146:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55146:58:0;55243:56;;;-1:-1:-1;;;55243:56:0;;55293:4;55243:56;;;;;;55146:58;;-1:-1:-1;55215:25:0;;35367:42;;55243:41;;:56;;;;;55146:58;;55243:56;;;;;;;35367:42;55243:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55243:56:0;55312:15;;55501:13;;55243:56;;-1:-1:-1;55312:15:0;;;-1:-1:-1;;;;;55312:15:0;;:31;;-1:-1:-1;;;;;;;;;;;34936:42:0;35367;;55436:14;;55501:13;;55512:1;;55501:13;;;;;;;;;;55562:10;55573:1;55562:13;;;;;;;;;;;;;;;;;;55312:326;;;-1:-1:-1;;;;;;55312:326:0;;;;;;;-1:-1:-1;;;;;55312:326:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55598:4;55312:326;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55312:326:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55312:326:0;55681:58;;-1:-1:-1;;;55681:58:0;;55733:4;55681:58;;;;;;55651:27;;-1:-1:-1;;;;;;;;;;;34936:42:0;55681:43;;:58;;;;;55312:326;;55681:58;;;;;;;;34936:42;55681:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55681:58:0;55778:56;;;-1:-1:-1;;;55778:56:0;;55828:4;55778:56;;;;;;55681:58;;-1:-1:-1;55750:25:0;;35367:42;;55778:41;;:56;;;;;55681:58;;55778:56;;;;;;;35367:42;55778:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55778:56:0;;-1:-1:-1;55847:47:0;55897:50;:22;55924;55897:50;:26;:50;:::i;:::-;55847:100;-1:-1:-1;55958:45:0;56006:46;:20;56031;56006:46;:24;:46;:::i;:::-;55958:94;;56065:27;56095:173;-1:-1:-1;;;;;;;;;;;56129:15:0;56146:42;56243:10;56254:1;56243:13;;;;;;;56095:173;56065:203;;56279:27;56309:167;35367:42;56341:15;56358:40;56451:10;56462:1;56451:13;;;;;;;56309:167;56279:197;-1:-1:-1;56489:19:0;56511:50;:22;56279:197;56511:50;:26;:50;:::i;:::-;56489:72;54700:1911;-1:-1:-1;;;;;;;;;;;;;;54700:1911:0:o;10638:149::-;10711:4;10735:44;10743:3;-1:-1:-1;;;;;10763:14:0;;10735:7;:44::i;57460:260::-;57533:1;57524:6;:10;:29;;;;;57552:1;57538:11;;:15;57524:29;57516:64;;;;;-1:-1:-1;;;57516:64:0;;;;;;;;;;;;-1:-1:-1;;;57516:64:0;;;;;;;;;;;;;;;57659:11;;57608:64;;57627:44;;:27;:6;40159:4;57627:27;:10;:27;:::i;:44::-;57608:14;;;:64;:18;:64;:::i;:::-;57591:14;:81;57688:24;;;;;;;;;;;;;;;;;57460:260;:::o;43629:2769::-;43899:16;:14;:16::i;:::-;43926:49;43938:25;43965:9;43926:11;:49::i;:::-;43986:16;44005:23;44020:7;44005:14;:23::i;:::-;43986:42;-1:-1:-1;44043:15:0;;44039:998;;44089:21;;-1:-1:-1;;;;;44181:26:0;;;;:73;;-1:-1:-1;;;;;;44211:43:0;;35213:42;44211:43;44181:73;44177:527;;;-1:-1:-1;35213:42:0;44358:118;-1:-1:-1;;;;;;;;;;;35213:42:0;44421:11;44434:30;44466:9;44358:6;:118::i;:::-;44339:137;;44177:527;;;-1:-1:-1;44535:12:0;44585:103;-1:-1:-1;;;;;;;;;;;44535:12:0;44633:11;44646:30;44678:9;44585:6;:103::i;:::-;44566:122;;44177:527;44732:63;-1:-1:-1;;;;;44732:36:0;;44769:7;44778:16;44732:63;:36;:63;:::i;:::-;-1:-1:-1;;;;;44849:26:0;;;;;;:17;:26;;;;;;:43;;44880:11;44849:43;:30;:43;:::i;:::-;-1:-1:-1;;;;;44820:26:0;;;;;;:17;:26;;;;;:72;44929:19;;:36;;44953:11;44929:36;:23;:36;:::i;:::-;44907:19;:58;44985:40;;;-1:-1:-1;;;;;44985:40:0;;;;;;;;;;;;;;;;;;;;;;;44039:998;;;45057:19;45079:26;45097:7;45079:17;:26::i;:::-;45057:48;-1:-1:-1;45120:18:0;;45116:1118;;-1:-1:-1;;;;;45173:26:0;;;;:68;;;45219:15;;;;;;;;;-1:-1:-1;;;;;45219:15:0;-1:-1:-1;;;;;45219:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45219:22:0;-1:-1:-1;;;;;45203:38:0;;;;;;45173:68;45169:808;;;45262:68;45306:7;45315:14;45269:15;;;;;;;;;-1:-1:-1;;;;;45269:15:0;-1:-1:-1;;;;;45269:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45269:22:0;-1:-1:-1;;;;;45262:43:0;;:68;;:43;:68;:::i;:::-;45169:808;;;-1:-1:-1;;;;;45379:36:0;;;;;;:22;:36;;;;;;;;45371:76;;;;;-1:-1:-1;;;45371:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45535:15;;45491:22;;;-1:-1:-1;;;45491:22:0;;;;45484:71;;45535:15;;;-1:-1:-1;;;;;45535:15:0;;45553:1;;45535:15;;45491:20;;:22;;;;;;;;;;;;;;45535:15;45491:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45491:22:0;-1:-1:-1;;;;;45484:42:0;;:71;;:42;:71;:::i;:::-;45625:15;;45581:22;;;-1:-1:-1;;;45581:22:0;;;;45574:84;;45625:15;;;-1:-1:-1;;;;;45625:15:0;;45643:14;;45625:15;;45581:20;;:22;;;;;;;;;;;;;;45625:15;45581:22;;;;;;;;;;45574:84;45701:16;;;45715:1;45701:16;;;45677:21;45701:16;;;;;45677:21;45701:16;;;;;;;;;;-1:-1:-1;45701:16:0;45677:40;;45746:15;;;;;;;;;-1:-1:-1;;;;;45746:15:0;-1:-1:-1;;;;;45746:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45746:22:0;45736:7;;:4;;45741:1;;45736:7;;;;;;;;;:32;-1:-1:-1;;;;;45736:32:0;;;-1:-1:-1;;;;;45736:32:0;;;;;45797:12;45787:4;45792:1;45787:7;;;;;;;;;;;;;:22;-1:-1:-1;;;;;45787:22:0;;;-1:-1:-1;;;;;45787:22:0;;;;;45846:15;;;;;;;;;-1:-1:-1;;;;;45846:15:0;-1:-1:-1;;;;;45846:40:0;;45887:14;45903:31;45936:4;45942:7;45951:9;45846:115;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45846:115:0;-1:-1:-1;;;;;45846:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45846:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45846:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45846:115:0;;;;;;;;;;;;-1:-1:-1;45846:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45169:808;;-1:-1:-1;;;;;46031:23:0;;;;;;:14;:23;;;;;;:43;;46059:14;46031:43;:27;:43;:::i;:::-;-1:-1:-1;;;;;46005:23:0;;;;;;:14;:23;;;;;:69;46114:22;;:42;;46141:14;46114:42;:26;:42;:::i;:::-;46089:22;:67;46176:46;;;-1:-1:-1;;;;;46176:46:0;;;;;;;;;;;;;;;;;;;;;;;45116:1118;-1:-1:-1;;;;;;;;46254:24:0;;;;;;;:15;:24;;;;;;;;46281:3;46254:30;;46320:14;;46295:13;:22;;;;;:39;46373:17;;46345:16;:25;;;;;;:45;-1:-1:-1;;;;43629:2769:0:o;42273:1258::-;42408:21;42473:7;-1:-1:-1;;;;;42460:20:0;:9;-1:-1:-1;;;;;42460:20:0;;42456:75;;;-1:-1:-1;42504:15:0;42497:22;;42456:75;42593:15;;42555:58;;-1:-1:-1;;;;;42555:29:0;;;;42593:15;;;;42611:1;42555:58;:29;:58;:::i;:::-;42662:15;;42624:72;;-1:-1:-1;;;;;42624:29:0;;;;42662:15;;;;42680;42624:72;:29;:72;:::i;:::-;42742:40;;;-1:-1:-1;;;42742:40:0;;42776:4;42742:40;;;;;;42717:22;;-1:-1:-1;;;;;42742:25:0;;;;;:40;;;;;;;;;;;;;;;:25;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42742:40:0;42862:15;;:22;;;-1:-1:-1;;;42862:22:0;;;;42742:40;;-1:-1:-1;42803:21:0;;42862:15;;;;-1:-1:-1;;;;;42862:15:0;;:20;;:22;;;;;42742:40;;42862:22;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42862:22:0;-1:-1:-1;;;;;42849:35:0;;;;;;;:72;;;42899:15;;;;;;;;;-1:-1:-1;;;;;42899:15:0;-1:-1:-1;;;;;42899:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42899:22:0;-1:-1:-1;;;;;42888:33:0;;;;;;42849:72;42845:363;;;42945:16;;;42959:1;42945:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42945:16:0;42938:23;;42986:9;42976:4;42981:1;42976:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;42976:19:0;;;-1:-1:-1;;;;;42976:19:0;;;;;43020:7;43010:4;43015:1;43010:7;;;;;;;;;;;;;:17;-1:-1:-1;;;;;43010:17:0;;;-1:-1:-1;;;;;43010:17:0;;;;;42845:363;;;43067:16;;;43081:1;43067:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43067:16:0;43060:23;;43108:9;43098:4;43103:1;43098:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;43098:19:0;;;-1:-1:-1;;;;;43098:19:0;;;;;43142:15;;;;;;;;;-1:-1:-1;;;;;43142:15:0;-1:-1:-1;;;;;43142:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43142:22:0;43132:7;;:4;;43137:1;;43132:7;;;;;;;;;;;:32;-1:-1:-1;;;;;43132:32:0;;;-1:-1:-1;;;;;43132:32:0;;;;;43189:7;43179:4;43184:1;43179:7;;;;;;;;;;;;;:17;-1:-1:-1;;;;;43179:17:0;;;-1:-1:-1;;;;;43179:17:0;;;;;42845:363;43228:15;;:102;;-1:-1:-1;;;43228:102:0;;;;;;;;;;;;;;43314:4;43228:102;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;;;;-1:-1:-1;;;;;43228:15:0;;:40;;:102;;;;;;43314:4;;43228:102;;;;;-1:-1:-1;43228:102:0;;;;;;;;-1:-1:-1;43228:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43228:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43228:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43228:102:0;;;;;;;;;;;;-1:-1:-1;43228:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;43228:102:0;;;;;;;;-1:-1:-1;;;43376:40:0;;43410:4;43376:40;;;;;43351:22;;-1:-1:-1;;;;;;43376:25:0;;;-1:-1:-1;43376:25:0;;-1:-1:-1;43376:40:0;;;;;-1:-1:-1;43376:40:0;;-1:-1:-1;43376:40:0;;;;;;;:25;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43376:40:0;;-1:-1:-1;43427:20:0;43450:40;43376;43472:17;43450:40;:21;:40;:::i;:::-;43427:63;-1:-1:-1;;;;;42273:1258:0;;;;;;;;:::o;25212:622::-;25582:10;;;25581:62;;-1:-1:-1;25598:39:0;;;-1:-1:-1;;;25598:39:0;;25622:4;25598:39;;;;-1:-1:-1;;;;;25598:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25598:39:0;:44;25581:62;25573:152;;;;-1:-1:-1;;;25573:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25763:62;;;-1:-1:-1;;;;;25763:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25763:62:0;-1:-1:-1;;;25763:62:0;;;25736:90;;25756:5;;25736:19;:90::i;51171:1464::-;51370:4;51419:10;51430:1;51419:13;;;;;;;;;;;;;;51395:20;:37;;51387:92;;;;-1:-1:-1;;;51387:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51520:10;51531:1;51520:13;;;;;;;;;;;;;;51498:18;:35;;51490:88;;;;-1:-1:-1;;;51490:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51611:59;;;-1:-1:-1;;;51611:59:0;;51664:4;51611:59;;;;;;51591:17;;34724:42;;51611:44;;:59;;;;;;;;;;;;;;;34724:42;51611:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51611:59:0;51737:15;;51611:59;;-1:-1:-1;51683:74:0;;-1:-1:-1;;;;;;;;;;;34936:42:0;51737:15;;;-1:-1:-1;;;;;51737:15:0;51755:1;51683:45;:74::i;:::-;51822:15;;51768:93;;-1:-1:-1;;;;;;;;;;;34936:42:0;51822:15;;;-1:-1:-1;;;;;51822:15:0;51840:20;51768:45;:93::i;:::-;51926:15;;51874:72;;35367:42;;51926:15;;;-1:-1:-1;;;;;51926:15:0;51944:1;51874:43;:72::i;:::-;52009:15;;51957:89;;35367:42;;52009:15;;;-1:-1:-1;;;;;52009:15:0;52027:18;51957:43;:89::i;:::-;52059:15;;;;;;;;;-1:-1:-1;;;;;52059:15:0;-1:-1:-1;;;;;52059:28:0;;-1:-1:-1;;;;;;;;;;;35367:42:0;52180:20;52215:18;52290:10;52301:1;52290:13;;;;;;;;;;;;;;52358:10;52369:1;52358:13;;;;;;;;;;;;;;;;;;52059:375;;;-1:-1:-1;;;;;;52059:375:0;;;;;;;-1:-1:-1;;;;;52059:375:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52394:4;52059:375;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52059:375:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52059:375:0;52467:59;;-1:-1:-1;;;52467:59:0;;52520:4;52467:59;;;;;;52447:17;;34724:42;;52467:44;;:59;;;;;52059:375;;52467:59;;;;;;;;34724:42;52467:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52467:59:0;;-1:-1:-1;52537:21:0;52561:30;52467:59;52578:12;52561:30;:16;:30;:::i;:::-;52537:54;51171:1464;-1:-1:-1;;;;;;;;51171:1464:0:o;10319:143::-;10389:4;10413:41;10418:3;-1:-1:-1;;;;;10438:14:0;;10413:4;:41::i;1814:192::-;1900:7;1936:12;1928:6;;;;1920:29;;;;-1:-1:-1;;;1920:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1972:5:0;;;1814:192;;;;;;:::o;9861:204::-;9956:18;;9928:7;;9956:26;-1:-1:-1;9948:73:0;;;;-1:-1:-1;;;9948:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10039:3;:11;;10051:5;10039:18;;;;;;;;;;;;;;;;10032:25;;9861:204;;;;:::o;9408:109::-;9491:18;;9408:109::o;9193:129::-;9266:4;9290:19;;;:12;;;;;:19;;;;;;:24;;;9193:129::o;3840:278::-;3926:7;3961:12;3954:5;3946:28;;;;-1:-1:-1;;;3946:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3985:9;4001:1;3997;:5;;;;;;;3840:278;-1:-1:-1;;;;;3840:278:0:o;26858:761::-;27282:23;27308:69;27336:4;27308:69;;;;;;;;;;;;;;;;;27316:5;-1:-1:-1;;;;;27308:27:0;;;:69;;;;;:::i;:::-;27392:17;;27282:95;;-1:-1:-1;27392:21:0;27388:224;;27534:10;27523:30;;;;;;;;;;;;;;;-1:-1:-1;27523:30:0;27515:85;;;;-1:-1:-1;;;27515:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7563:1544;7629:4;7768:19;;;:12;;;:19;;;;;;7804:15;;7800:1300;;8239:18;;-1:-1:-1;;8190:14:0;;;;8239:22;;;;8166:21;;8239:3;;:22;;8526;;;;;;;;;;;;;;8506:42;;8672:9;8643:3;:11;;8655:13;8643:26;;;;;;;;;;;;;;;;;;;:38;;;;8749:23;;;8791:1;8749:12;;;:23;;;;;;8775:17;;;8749:43;;8901:17;;8749:3;;8901:17;;;;;;;;;;;;;;;;;;;;;;8996:3;:12;;:19;9009:5;8996:19;;;;;;;;;;;8989:26;;;9039:4;9032:11;;;;;;;;7800:1300;9083:5;9076:12;;;;;58160:399;58205:11;58219:24;:22;:24::i;:::-;58205:38;;58278:6;58260:15;;:24;58256:81;;;-1:-1:-1;58310:15:0;;58256:81;58351:11;;;:31;;-1:-1:-1;58366:11:0;;:16;58351:31;58347:44;;;58384:7;;;58347:44;58423:17;;:29;;58445:6;58423:29;:21;:29;:::i;:::-;58403:17;:49;58491:15;;:27;;58511:6;58491:27;:19;:27;:::i;:::-;58473:15;:45;-1:-1:-1;58548:3:0;58529:16;:22;58160:399;:::o;58571:2469::-;58715:11;;58711:55;;58748:7;;58711:55;36137:6;58833:30;58841:21;;58833:3;:7;;:30;;;;:::i;:::-;:50;58829:89;;;58900:7;;58829:89;58979:13;;;;;;;;;-1:-1:-1;;;;;58979:13:0;-1:-1:-1;;;;;58979:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59016:23;59042:49;59064:26;;59042:17;;:21;;:49;;;;:::i;:::-;59016:75;;59112:23;59138;:21;:23::i;:::-;59112:49;-1:-1:-1;59228:23:0;59224:36;;59253:7;;;;59224:36;59301:17;;59280:18;:38;59276:714;;;59361:17;;59349:9;;59361:41;;59383:18;59361:41;:21;:41;:::i;:::-;59438:17;;59349:53;;-1:-1:-1;59438:27:0;;59349:53;59438:27;:21;:27;:::i;:::-;59509:26;;59417:48;;-1:-1:-1;59509:36:0;;59540:4;59509:36;:30;:36;:::i;:::-;59480:26;:65;-1:-1:-1;59580:1:0;59560:17;:21;59276:714;;;59630:18;59609;:39;59605:385;;;59671:9;59683:42;:18;59706;59683:42;:22;:42;:::i;:::-;59671:54;-1:-1:-1;59761:28:0;:18;59671:54;59761:28;:22;:28;:::i;:::-;59804:26;:33;;;;59872:1;59852:17;:21;59740:49;-1:-1:-1;59605:385:0;;;59932:1;59912:17;:21;;;59948:26;:30;59605:385;60050:23;60046:62;;60090:7;;;;60046:62;60184:58;;;-1:-1:-1;;;60184:58:0;;60236:4;60184:58;;;;;;60245:18;;-1:-1:-1;;;;;;;;;;;34936:42:0;60184:43;;:58;;;;;;;;;;;;;;;34936:42;60184:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60184:58:0;:79;60180:118;;;60280:7;;;;60180:118;60368:15;;60314:74;;-1:-1:-1;;;;;;;;;;;34936:42:0;60368:15;;;-1:-1:-1;;;;;60368:15:0;60386:1;60314:45;:74::i;:::-;60453:15;;60399:91;;-1:-1:-1;;;;;;;;;;;34936:42:0;60453:15;;;-1:-1:-1;;;;;60453:15:0;60471:18;60399:45;:91::i;:::-;60507:19;60536:15;;;;;;;;;-1:-1:-1;;;;;60536:15:0;-1:-1:-1;;;;;60536:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60536:22:0;60529:55;;;-1:-1:-1;;;60529:55:0;;60578:4;60529:55;;;;;;-1:-1:-1;;;;;60529:40:0;;;;;;:55;;;;;60536:22;;60529:55;;;;;;;;:40;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60529:55:0;60605:15;;:124;;-1:-1:-1;;;60605:124:0;;;;;;;;;;;;;;60712:4;60605:124;;;;;;;;;;;;;;;;;;;60693:9;60605:124;;;;;;;;60529:55;;-1:-1:-1;60605:15:0;;;;-1:-1:-1;;;;;60605:15:0;;:40;;:124;;;;60693:9;;60712:4;60605:124;;;;;;;60693:9;;60605:124;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60605:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60605:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60605:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60605:124:0;;;;;;;;;;;;-1:-1:-1;60605:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60746:19;60775:15;;;;;;;;;-1:-1:-1;;;;;60775:15:0;-1:-1:-1;;;;;60775:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60775:22:0;60768:55;;;-1:-1:-1;;;60768:55:0;;60817:4;60768:55;;;;;;-1:-1:-1;;;;;60768:40:0;;;;;;:55;;;;;60775:22;;60768:55;;;;;;;;:40;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60768:55:0;;-1:-1:-1;60834:17:0;60854:34;60768:55;60873:14;60854:34;:18;:34;:::i;:::-;60834:54;-1:-1:-1;60913:16:0;;60909:84;;60946:31;60964:12;60946:17;:31::i;:::-;-1:-1:-1;;61029:3:0;61005:21;:27;-1:-1:-1;;;58571:2469:0;;;:::o;6973:414::-;7036:4;7058:21;7068:3;7073:5;7058:9;:21::i;:::-;7053:327;;-1:-1:-1;7096:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;7279:18;;7257:19;;;:12;;;:19;;;;;;:40;;;;7312:11;;7053:327;-1:-1:-1;7363:5:0;7356:12;;16940:195;17043:12;17075:52;17097:6;17105:4;17111:1;17114:12;17075:21;:52::i;:::-;17068:59;16940:195;-1:-1:-1;;;;16940:195:0:o;57784:275::-;57860:1;57851:6;:10;:29;;;;;57879:1;57865:11;;:15;57851:29;57843:67;;;;;-1:-1:-1;;;57843:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57995:11;;57941:67;;57963:44;;:27;:6;40159:4;57963:27;:10;:27;:::i;:44::-;57941:17;;;:67;:21;:67;:::i;:::-;57921:17;:87;58024:27;;;;;;;;;;;;;;;;;57784:275;:::o;17992:530::-;18119:12;18177:5;18152:21;:30;;18144:81;;;;-1:-1:-1;;;18144:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18244:18;18255:6;18244:10;:18::i;:::-;18236:60;;;;;-1:-1:-1;;;18236:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18370:12;18384:23;18411:6;-1:-1:-1;;;;;18411:11:0;18431:5;18439:4;18411:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18411:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18369:75;;;;18462:52;18480:7;18489:10;18501:12;18462:17;:52::i;:::-;18455:59;17992:530;-1:-1:-1;;;;;;;17992:530:0:o;20532:742::-;20647:12;20676:7;20672:595;;;-1:-1:-1;20707:10:0;20700:17;;20672:595;20821:17;;:21;20817:439;;21084:10;21078:17;21145:15;21132:10;21128:2;21124:19;21117:44;21032:148;21220:20;;-1:-1:-1;;;21220:20:0;;;;;;;;;;;;;;;;;21227:12;;21220:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://1f1d5648b4bbd8065606ac0eef705979e95d4500ee02179ea2b3ed9bf7d4a530
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.