More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x44019e7ab3c21fb2b1964ab0c1f77828e34cb0187d6fd40bad2367f5bbc3e1e0 | Swap | (pending) | 3 hrs ago | IN | 0.0001 ETH | (Pending) | |||
Swap | 20408317 | 62 days ago | IN | 0.00105 ETH | 0.00196227 | ||||
Swap | 20252803 | 83 days ago | IN | 0 ETH | 0.0005011 | ||||
Swap | 20250668 | 84 days ago | IN | 0 ETH | 0.00576476 | ||||
Swap | 17499089 | 469 days ago | IN | 0 ETH | 0.02048866 | ||||
Swap | 17388943 | 485 days ago | IN | 0.01 ETH | 0.00654749 | ||||
Swap | 17333203 | 492 days ago | IN | 0.06924224 ETH | 0.00560552 | ||||
Swap | 15741512 | 716 days ago | IN | 0.14 ETH | 0.02413482 | ||||
Swap | 15741512 | 716 days ago | IN | 0.14 ETH | 0.00544071 | ||||
Swap | 14730294 | 875 days ago | IN | 0.1 ETH | 0.02508373 | ||||
Swap | 14724615 | 876 days ago | IN | 0.1 ETH | 0.01702653 | ||||
Swap | 14223076 | 954 days ago | IN | 0.01 ETH | 0.01871139 | ||||
Swap | 14213022 | 956 days ago | IN | 0 ETH | 0.01975854 | ||||
Swap | 14091912 | 974 days ago | IN | 0 ETH | 0.03425744 | ||||
Swap | 13979019 | 992 days ago | IN | 0 ETH | 0.14769031 | ||||
Swap | 13841436 | 1013 days ago | IN | 0 ETH | 0.05618703 | ||||
Infinite Approve... | 13830779 | 1015 days ago | IN | 0 ETH | 0.00356528 | ||||
Swap | 13475976 | 1071 days ago | IN | 0.0002 ETH | 0.01372931 | ||||
Swap | 13331363 | 1093 days ago | IN | 0 ETH | 0.02566199 | ||||
Swap | 13254149 | 1105 days ago | IN | 0 ETH | 0.01591075 | ||||
Swap | 13196444 | 1114 days ago | IN | 0.0126 ETH | 0.06898534 | ||||
Swap | 13132348 | 1124 days ago | IN | 0 ETH | 0.02146391 | ||||
Swap | 12938746 | 1154 days ago | IN | 0.1 ETH | 0.00582095 | ||||
Swap | 12908991 | 1159 days ago | IN | 0.005 ETH | 0.00534164 | ||||
Swap | 12897615 | 1161 days ago | IN | 0 ETH | 0.00637399 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20408317 | 62 days ago | 0.00105 ETH | ||||
17981692 | 401 days ago | 0.00900817 ETH | ||||
17981692 | 401 days ago | 0.00900817 ETH | ||||
17499089 | 469 days ago | 1.2993453 ETH | ||||
17499089 | 469 days ago | 1.2993453 ETH | ||||
17388943 | 485 days ago | 0.01 ETH | ||||
17333203 | 492 days ago | 0.06924224 ETH | ||||
15741512 | 716 days ago | 0.14 ETH | ||||
15741512 | 716 days ago | 0.14 ETH | ||||
14730294 | 875 days ago | 0.1 ETH | ||||
14724615 | 876 days ago | 0.1 ETH | ||||
14223076 | 954 days ago | 0.01 ETH | ||||
14091912 | 974 days ago | 0.0000004 ETH | ||||
14091912 | 974 days ago | 0.0000004 ETH | ||||
13475976 | 1071 days ago | 0.0002 ETH | ||||
13196444 | 1114 days ago | 0.0126 ETH | ||||
12938746 | 1154 days ago | 0.1 ETH | ||||
12908991 | 1159 days ago | 0.005 ETH | ||||
12795559 | 1177 days ago | 0.045 ETH | ||||
12771845 | 1180 days ago | 0.01 ETH | ||||
12770555 | 1180 days ago | 0.001 ETH | ||||
12765128 | 1181 days ago | 0.02 ETH | ||||
12726307 | 1187 days ago | 0.014 ETH | ||||
12718234 | 1189 days ago | 8.10565768 ETH | ||||
12718234 | 1189 days ago | 8.10565768 ETH |
Loading...
Loading
Contract Name:
OneInchExchange
Compiler Version
v0.5.11+commit.c082d0b4
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-09-28 */ pragma solidity ^0.5.0; pragma experimental ABIEncoderV2; library ExternalCall { // Source: https://github.com/gnosis/MultiSigWallet/blob/master/contracts/MultiSigWallet.sol // call has been separated into its own function in order to take advantage // of the Solidity's code generator to produce a loop that copies tx.data into memory. function externalCall(address destination, uint value, bytes memory data, uint dataOffset, uint dataLength, uint gasLimit) internal returns(bool result) { // solium-disable-next-line security/no-inline-assembly if (gasLimit == 0) { gasLimit = gasleft() - 40000; } assembly { let x := mload(0x40) // "Allocate" memory for output (0x40 is where "free memory" pointer is stored by convention) let d := add(data, 32) // First 32 bytes are the padded length of data, so exclude that result := call( gasLimit, destination, value, add(d, dataOffset), dataLength, // Size of the input (in bytes) - this is what fixes the padding problem x, 0 // Output is ignored, therefore the output size is zero ) } } } /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see `ERC20Detailed`. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @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. * * > 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); } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-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) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be aplied to your functions to restrict their use to * the owner. */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * > Note: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract IZrxExchange { struct Order { address makerAddress; // Address that created the order. address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. address feeRecipientAddress; // Address that will recieve fees when order is filled. address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods. uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted. uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted. uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy. bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy. } struct OrderInfo { uint8 orderStatus; // Status that describes order's validity and fillability. bytes32 orderHash; // EIP712 hash of the order (see IZrxExchange.getOrderHash). uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled. } struct FillResults { uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled. uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled. uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s). uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s). } function getOrderInfo(Order memory order) public view returns (OrderInfo memory orderInfo); function getOrdersInfo(Order[] memory orders) public view returns (OrderInfo[] memory ordersInfo); function fillOrder( Order memory order, uint256 takerAssetFillAmount, bytes memory signature ) public returns (FillResults memory fillResults); function fillOrderNoThrow( Order memory order, uint256 takerAssetFillAmount, bytes memory signature ) public returns (FillResults memory fillResults); } contract IGST2 is IERC20 { function freeUpTo(uint256 value) external returns (uint256 freed); function freeFromUpTo(address from, uint256 value) external returns (uint256 freed); function balanceOf(address who) external view returns (uint256); } /** * @dev Collection of functions related to the address type, */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * > It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } contract IWETH is IERC20 { function deposit() external payable; function withdraw(uint256 amount) external; } contract Shutdownable is Ownable { bool public isShutdown; event Shutdown(); modifier notShutdown { require(!isShutdown, "Smart contract is shut down."); _; } function shutdown() public onlyOwner { isShutdown = true; emit Shutdown(); } } contract IERC20NonView { // Methods are not view to avoid throw on proxy tokens with delegatecall inside function balanceOf(address user) public returns(uint256); function allowance(address from, address to) public returns(uint256); } contract ZrxMarketOrder { using SafeMath for uint256; function marketSellOrdersProportion( IERC20 tokenSell, address tokenBuy, address zrxExchange, address zrxTokenProxy, IZrxExchange.Order[] calldata orders, bytes[] calldata signatures, uint256 mul, uint256 div ) external { uint256 amount = tokenSell.balanceOf(msg.sender).mul(mul).div(div); this.marketSellOrders(tokenBuy, zrxExchange, zrxTokenProxy, amount, orders, signatures); } function marketSellOrders( address makerAsset, address zrxExchange, address zrxTokenProxy, uint256 takerAssetFillAmount, IZrxExchange.Order[] calldata orders, bytes[] calldata signatures ) external returns (IZrxExchange.FillResults memory totalFillResults) { for (uint i = 0; i < orders.length; i++) { // Stop execution if the entire amount of takerAsset has been sold if (totalFillResults.takerAssetFilledAmount >= takerAssetFillAmount) { break; } // Calculate the remaining amount of takerAsset to sell uint256 remainingTakerAmount = takerAssetFillAmount.sub(totalFillResults.takerAssetFilledAmount); IZrxExchange.OrderInfo memory orderInfo = IZrxExchange(zrxExchange).getOrderInfo(orders[i]); uint256 orderRemainingTakerAmount = orders[i].takerAssetAmount.sub(orderInfo.orderTakerAssetFilledAmount); // Check available balance and allowance and update orderRemainingTakerAmount { uint256 balance = IERC20NonView(makerAsset).balanceOf(orders[i].makerAddress); uint256 allowance = IERC20NonView(makerAsset).allowance(orders[i].makerAddress, zrxTokenProxy); uint256 availableMakerAmount = (allowance < balance) ? allowance : balance; uint256 availableTakerAmount = availableMakerAmount.mul(orders[i].takerAssetAmount).div(orders[i].makerAssetAmount); if (availableTakerAmount < orderRemainingTakerAmount) { orderRemainingTakerAmount = availableTakerAmount; } } uint256 takerAmount = (orderRemainingTakerAmount < remainingTakerAmount) ? orderRemainingTakerAmount : remainingTakerAmount; IZrxExchange.FillResults memory fillResults = IZrxExchange(zrxExchange).fillOrderNoThrow( orders[i], takerAmount, signatures[i] ); _addFillResults(totalFillResults, fillResults); } return totalFillResults; } function _addFillResults( IZrxExchange.FillResults memory totalFillResults, IZrxExchange.FillResults memory singleFillResults ) internal pure { totalFillResults.makerAssetFilledAmount = totalFillResults.makerAssetFilledAmount.add(singleFillResults.makerAssetFilledAmount); totalFillResults.takerAssetFilledAmount = totalFillResults.takerAssetFilledAmount.add(singleFillResults.takerAssetFilledAmount); totalFillResults.makerFeePaid = totalFillResults.makerFeePaid.add(singleFillResults.makerFeePaid); totalFillResults.takerFeePaid = totalFillResults.takerFeePaid.add(singleFillResults.takerFeePaid); } function getOrdersInfoRespectingBalancesAndAllowances( IERC20 token, IZrxExchange zrx, address zrxTokenProxy, IZrxExchange.Order[] memory orders ) public view returns (IZrxExchange.OrderInfo[] memory ordersInfo) { ordersInfo = zrx.getOrdersInfo(orders); for (uint i = 0; i < ordersInfo.length; i++) { uint256 balance = token.balanceOf(orders[i].makerAddress); uint256 allowance = token.allowance(orders[i].makerAddress, zrxTokenProxy); uint256 availableMakerAmount = (allowance < balance) ? allowance : balance; uint256 availableTakerAmount = availableMakerAmount.mul(orders[i].takerAssetAmount).div(orders[i].makerAssetAmount); for (uint j = 0; j < i; j++) { if (orders[j].makerAddress == orders[i].makerAddress) { uint256 orderTakerAssetRemainigAmount = orders[j].takerAssetAmount.sub( ordersInfo[j].orderTakerAssetFilledAmount ); if (availableTakerAmount > orderTakerAssetRemainigAmount) { availableTakerAmount = availableTakerAmount.sub(orderTakerAssetRemainigAmount); } else { availableTakerAmount = 0; break; } } } uint256 remainingTakerAmount = orders[i].takerAssetAmount.sub( ordersInfo[i].orderTakerAssetFilledAmount ); if (availableTakerAmount < remainingTakerAmount) { ordersInfo[i].orderTakerAssetFilledAmount = orders[i].takerAssetAmount.sub(availableTakerAmount); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } library UniversalERC20 { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 private constant ZERO_ADDRESS = IERC20(0x0000000000000000000000000000000000000000); IERC20 private constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); function universalTransfer(IERC20 token, address to, uint256 amount) internal { universalTransfer(token, to, amount, false); } function universalTransfer(IERC20 token, address to, uint256 amount, bool mayFail) internal returns(bool) { if (amount == 0) { return true; } if (token == ZERO_ADDRESS || token == ETH_ADDRESS) { if (mayFail) { return address(uint160(to)).send(amount); } else { address(uint160(to)).transfer(amount); return true; } } else { token.safeTransfer(to, amount); return true; } } function universalApprove(IERC20 token, address to, uint256 amount) internal { if (token != ZERO_ADDRESS && token != ETH_ADDRESS) { token.safeApprove(to, amount); } } function universalTransferFrom(IERC20 token, address from, address to, uint256 amount) internal { if (amount == 0) { return; } if (token == ZERO_ADDRESS || token == ETH_ADDRESS) { require(from == msg.sender && msg.value >= amount, "msg.value is zero"); if (to != address(this)) { address(uint160(to)).transfer(amount); } if (msg.value > amount) { msg.sender.transfer(msg.value.sub(amount)); } } else { token.safeTransferFrom(from, to, amount); } } function universalBalanceOf(IERC20 token, address who) internal view returns (uint256) { if (token == ZERO_ADDRESS || token == ETH_ADDRESS) { return who.balance; } else { return token.balanceOf(who); } } } contract TokenSpender { using SafeERC20 for IERC20; address public owner; IGST2 public gasToken; address public gasTokenOwner; constructor(IGST2 _gasToken, address _gasTokenOwner) public { owner = msg.sender; gasToken = _gasToken; gasTokenOwner = _gasTokenOwner; } function claimTokens(IERC20 token, address who, address dest, uint256 amount) external { require(msg.sender == owner, "Access restricted"); token.safeTransferFrom(who, dest, amount); } function burnGasToken(uint gasSpent) external { require(msg.sender == owner, "Access restricted"); uint256 tokens = (gasSpent + 14154) / 41130; gasToken.freeUpTo(tokens); } function() external { if (msg.sender == gasTokenOwner) { gasToken.transfer(msg.sender, gasToken.balanceOf(address(this))); } } } contract OneInchExchange is Shutdownable, ZrxMarketOrder { using SafeMath for uint256; using UniversalERC20 for IERC20; using ExternalCall for address; IERC20 constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); TokenSpender public spender; uint fee; // 10000 => 100%, 1 => 0.01% event History( address indexed sender, IERC20 fromToken, IERC20 toToken, uint256 fromAmount, uint256 toAmount ); event Swapped( IERC20 indexed fromToken, IERC20 indexed toToken, address indexed referrer, uint256 fromAmount, uint256 toAmount, uint256 referrerFee, uint256 fee ); constructor(address _owner, IGST2 _gasToken, uint _fee) public { spender = new TokenSpender( _gasToken, _owner ); _transferOwnership(_owner); fee = _fee; } function() external payable notShutdown { require(msg.sender != tx.origin); } function swap( IERC20 fromToken, IERC20 toToken, uint256 fromTokenAmount, uint256 minReturnAmount, uint256 guaranteedAmount, address payable referrer, address[] memory callAddresses, bytes memory callDataConcat, uint256[] memory starts, uint256[] memory gasLimitsAndValues ) public payable notShutdown returns (uint256 returnAmount) { uint256 gasProvided = gasleft(); require(minReturnAmount > 0, "Min return should be bigger then 0."); require(callAddresses.length > 0, "Call data should exists."); if (fromToken != ETH_ADDRESS) { spender.claimTokens(fromToken, msg.sender, address(this), fromTokenAmount); } for (uint i = 0; i < callAddresses.length; i++) { require(callAddresses[i] != address(spender), "Access denied"); require(callAddresses[i].externalCall( gasLimitsAndValues[i] & ((1 << 128) - 1), callDataConcat, starts[i], starts[i + 1] - starts[i], gasLimitsAndValues[i] >> 128 )); } // Return back all unswapped fromToken.universalTransfer(msg.sender, fromToken.universalBalanceOf(address(this))); returnAmount = toToken.universalBalanceOf(address(this)); (uint256 toTokenAmount, uint256 referrerFee) = _handleFees(toToken, referrer, returnAmount, guaranteedAmount); require(toTokenAmount >= minReturnAmount, "Return amount is not enough"); toToken.universalTransfer(msg.sender, toTokenAmount); emit History( msg.sender, fromToken, toToken, fromTokenAmount, toTokenAmount ); emit Swapped( fromToken, toToken, referrer, fromTokenAmount, toTokenAmount, referrerFee, returnAmount.sub(toTokenAmount) ); spender.burnGasToken(gasProvided.sub(gasleft())); } function _handleFees( IERC20 toToken, address referrer, uint256 returnAmount, uint256 guaranteedAmount ) internal returns ( uint256 toTokenAmount, uint256 referrerFee ) { if (returnAmount <= guaranteedAmount) { return (returnAmount, 0); } uint256 feeAmount = returnAmount.sub(guaranteedAmount).mul(fee).div(10000); if (referrer != address(0) && referrer != msg.sender && referrer != tx.origin) { referrerFee = feeAmount.div(10); if (toToken.universalTransfer(referrer, referrerFee, true)) { returnAmount = returnAmount.sub(referrerFee); feeAmount = feeAmount.sub(referrerFee); } else { referrerFee = 0; } } if (toToken.universalTransfer(owner(), feeAmount, true)) { returnAmount = returnAmount.sub(feeAmount); } return (returnAmount, referrerFee); } function infiniteApproveIfNeeded(IERC20 token, address to) external notShutdown { if (token != ETH_ADDRESS) { if ((token.allowance(address(this), to) >> 255) == 0) { token.universalApprove(to, uint256(- 1)); } } } function withdrawAllToken(IWETH token) external notShutdown { uint256 amount = token.balanceOf(address(this)); token.withdraw(amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"contract IZrxExchange","name":"zrx","type":"address"},{"internalType":"address","name":"zrxTokenProxy","type":"address"},{"components":[{"internalType":"address","name":"makerAddress","type":"address"},{"internalType":"address","name":"takerAddress","type":"address"},{"internalType":"address","name":"feeRecipientAddress","type":"address"},{"internalType":"address","name":"senderAddress","type":"address"},{"internalType":"uint256","name":"makerAssetAmount","type":"uint256"},{"internalType":"uint256","name":"takerAssetAmount","type":"uint256"},{"internalType":"uint256","name":"makerFee","type":"uint256"},{"internalType":"uint256","name":"takerFee","type":"uint256"},{"internalType":"uint256","name":"expirationTimeSeconds","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"makerAssetData","type":"bytes"},{"internalType":"bytes","name":"takerAssetData","type":"bytes"}],"internalType":"struct IZrxExchange.Order[]","name":"orders","type":"tuple[]"}],"name":"getOrdersInfoRespectingBalancesAndAllowances","outputs":[{"components":[{"internalType":"uint8","name":"orderStatus","type":"uint8"},{"internalType":"bytes32","name":"orderHash","type":"bytes32"},{"internalType":"uint256","name":"orderTakerAssetFilledAmount","type":"uint256"}],"internalType":"struct IZrxExchange.OrderInfo[]","name":"ordersInfo","type":"tuple[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"tokenSell","type":"address"},{"internalType":"address","name":"tokenBuy","type":"address"},{"internalType":"address","name":"zrxExchange","type":"address"},{"internalType":"address","name":"zrxTokenProxy","type":"address"},{"components":[{"internalType":"address","name":"makerAddress","type":"address"},{"internalType":"address","name":"takerAddress","type":"address"},{"internalType":"address","name":"feeRecipientAddress","type":"address"},{"internalType":"address","name":"senderAddress","type":"address"},{"internalType":"uint256","name":"makerAssetAmount","type":"uint256"},{"internalType":"uint256","name":"takerAssetAmount","type":"uint256"},{"internalType":"uint256","name":"makerFee","type":"uint256"},{"internalType":"uint256","name":"takerFee","type":"uint256"},{"internalType":"uint256","name":"expirationTimeSeconds","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"makerAssetData","type":"bytes"},{"internalType":"bytes","name":"takerAssetData","type":"bytes"}],"internalType":"struct IZrxExchange.Order[]","name":"orders","type":"tuple[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"},{"internalType":"uint256","name":"mul","type":"uint256"},{"internalType":"uint256","name":"div","type":"uint256"}],"name":"marketSellOrdersProportion","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IWETH","name":"token","type":"address"}],"name":"withdrawAllToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isShutdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"infiniteApproveIfNeeded","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"spender","outputs":[{"internalType":"contract TokenSpender","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"guaranteedAmount","type":"uint256"},{"internalType":"address payable","name":"referrer","type":"address"},{"internalType":"address[]","name":"callAddresses","type":"address[]"},{"internalType":"bytes","name":"callDataConcat","type":"bytes"},{"internalType":"uint256[]","name":"starts","type":"uint256[]"},{"internalType":"uint256[]","name":"gasLimitsAndValues","type":"uint256[]"}],"name":"swap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"shutdown","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"makerAsset","type":"address"},{"internalType":"address","name":"zrxExchange","type":"address"},{"internalType":"address","name":"zrxTokenProxy","type":"address"},{"internalType":"uint256","name":"takerAssetFillAmount","type":"uint256"},{"components":[{"internalType":"address","name":"makerAddress","type":"address"},{"internalType":"address","name":"takerAddress","type":"address"},{"internalType":"address","name":"feeRecipientAddress","type":"address"},{"internalType":"address","name":"senderAddress","type":"address"},{"internalType":"uint256","name":"makerAssetAmount","type":"uint256"},{"internalType":"uint256","name":"takerAssetAmount","type":"uint256"},{"internalType":"uint256","name":"makerFee","type":"uint256"},{"internalType":"uint256","name":"takerFee","type":"uint256"},{"internalType":"uint256","name":"expirationTimeSeconds","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"makerAssetData","type":"bytes"},{"internalType":"bytes","name":"takerAssetData","type":"bytes"}],"internalType":"struct IZrxExchange.Order[]","name":"orders","type":"tuple[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"marketSellOrders","outputs":[{"components":[{"internalType":"uint256","name":"makerAssetFilledAmount","type":"uint256"},{"internalType":"uint256","name":"takerAssetFilledAmount","type":"uint256"},{"internalType":"uint256","name":"makerFeePaid","type":"uint256"},{"internalType":"uint256","name":"takerFeePaid","type":"uint256"}],"internalType":"struct IZrxExchange.FillResults","name":"totalFillResults","type":"tuple"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"contract IGST2","name":"_gasToken","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"fromToken","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"toToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toAmount","type":"uint256"}],"name":"History","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"fromToken","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"toToken","type":"address"},{"indexed":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referrerFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Swapped","type":"event"},{"anonymous":false,"inputs":[],"name":"Shutdown","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"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003e1438038062003e148339810160408190526200003491620001af565b600080546001600160a01b03191633178082556040516001600160a01b0391909116919060008051602062003df4833981519152908290a381836040516200007c9062000174565b6200008992919062000280565b604051809103906000f080158015620000a6573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055620000d283620000de565b600255506200031a9050565b6001600160a01b0381166200012a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200012190620002a6565b60405180910390fd5b600080546040516001600160a01b038085169392169160008051602062003df483398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61094180620034b383390190565b80516200018f81620002ea565b92915050565b80516200018f8162000304565b80516200018f816200030f565b600080600060608486031215620001c557600080fd5b6000620001d3868662000182565b9350506020620001e68682870162000195565b9250506040620001f986828701620001a2565b9150509250925092565b6200020e81620002c1565b82525050565b6200020e81620002ce565b60006200022e602683620002b8565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181527f6464726573730000000000000000000000000000000000000000000000000000602082015260400192915050565b6040810162000290828562000214565b6200029f602083018462000203565b9392505050565b602080825281016200018f816200021f565b90815260200190565b60006200018f82620002db565b60006200018f82620002c1565b6001600160a01b031690565b90565b620002f581620002c1565b81146200030157600080fd5b50565b620002f581620002ce565b620002f581620002e7565b613189806200032a6000396000f3fe6080604052600436106100c25760003560e01c8063bf86d6901161007f578063f2fde38b11610059578063f2fde38b1461022a578063f88309d71461024a578063fc0e74d11461026a578063fcc06f8e1461027f576100c2565b8063bf86d690146101d3578063c9b27359146101e8578063e8edc81614610208576100c2565b8063715018a61461010457806371a2039a146101195780638da5cb5b1461014f5780638f32d59b14610171578063a96c400e14610193578063ae4dd0fc146101b3575b600054600160a01b900460ff16156100f55760405162461bcd60e51b81526004016100ec90612e12565b60405180910390fd5b3332141561010257600080fd5b005b34801561011057600080fd5b506101026102ac565b34801561012557600080fd5b5061013961013436600461229b565b61031a565b6040516101469190612d77565b60405180910390f35b34801561015b57600080fd5b50610164610689565b6040516101469190612cac565b34801561017d57600080fd5b50610186610698565b6040516101469190612d99565b34801561019f57600080fd5b506101026101ae366004612091565b6106a9565b3480156101bf57600080fd5b506101026101ce366004612313565b6107cf565b3480156101df57600080fd5b506101866108dd565b3480156101f457600080fd5b50610102610203366004612057565b6108ed565b34801561021457600080fd5b5061021d6109e2565b6040516101469190612e04565b34801561023657600080fd5b50610102610245366004611f28565b6109f1565b61025d610258366004612178565b610a21565b6040516101469190612f54565b34801561027657600080fd5b50610102610e1c565b34801561028b57600080fd5b5061029f61029a366004611f46565b610e7c565b6040516101469190612f02565b6102b4610698565b6102d05760405162461bcd60e51b81526004016100ec90612eb2565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b604051631fa75d3760e21b81526060906001600160a01b03851690637e9d74dc90610349908590600401612d88565b60006040518083038186803b15801561036157600080fd5b505afa158015610375573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261039d9190810190612005565b905060005b8151811015610680576000866001600160a01b03166370a082318584815181106103c857fe5b6020026020010151600001516040518263ffffffff1660e01b81526004016103f09190612cac565b60206040518083038186803b15801561040857600080fd5b505afa15801561041c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610440919081019061236d565b90506000876001600160a01b031663dd62ed3e86858151811061045f57fe5b602002602001015160000151886040518363ffffffff1660e01b8152600401610489929190612ce3565b60206040518083038186803b1580156104a157600080fd5b505afa1580156104b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104d9919081019061236d565b905060008282106104ea57826104ec565b815b905060006105418786815181106104ff57fe5b60200260200101516080015161053589888151811061051a57fe5b602002602001015160a001518561130e90919063ffffffff16565b9063ffffffff61135116565b905060005b8581101561060e5787868151811061055a57fe5b6020026020010151600001516001600160a01b031688828151811061057b57fe5b6020026020010151600001516001600160a01b031614156106065760006105d98883815181106105a757fe5b6020026020010151604001518a84815181106105bf57fe5b602002602001015160a0015161138690919063ffffffff16565b9050808311156105fa576105f3838263ffffffff61138616565b9250610604565b600092505061060e565b505b600101610546565b50600061063887878151811061062057fe5b6020026020010151604001518988815181106105bf57fe5b90508082101561066f57610652828988815181106105bf57fe5b87878151811061065e57fe5b602002602001015160400181815250505b5050600190930192506103a2915050565b50949350505050565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b600061073b82610535858e6001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016106df9190612cba565b60206040518083038186803b1580156106f757600080fd5b505afa15801561070b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061072f919081019061236d565b9063ffffffff61130e16565b604051637e6037c760e11b8152909150309063fcc06f8e9061076f908d908d908d9087908e908e908e908e90600401612cf1565b608060405180830381600087803b15801561078957600080fd5b505af115801561079d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107c19190810190612331565b505050505050505050505050565b600054600160a01b900460ff16156107f95760405162461bcd60e51b81526004016100ec90612e12565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190610828903090600401612cba565b60206040518083038186803b15801561084057600080fd5b505afa158015610854573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610878919081019061236d565b604051632e1a7d4d60e01b81529091506001600160a01b03831690632e1a7d4d906108a7908490600401612f54565b600060405180830381600087803b1580156108c157600080fd5b505af11580156108d5573d6000803e3d6000fd5b505050505050565b600054600160a01b900460ff1681565b600054600160a01b900460ff16156109175760405162461bcd60e51b81526004016100ec90612e12565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146109de57604051636eb1769f60e11b815260ff906001600160a01b0384169063dd62ed3e9061096c9030908690600401612cc8565b60206040518083038186803b15801561098457600080fd5b505afa158015610998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109bc919081019061236d565b901c6109de576109de6001600160a01b0383168260001963ffffffff6113ae16565b5050565b6001546001600160a01b031681565b6109f9610698565b610a155760405162461bcd60e51b81526004016100ec90612eb2565b610a1e81611407565b50565b60008054600160a01b900460ff1615610a4c5760405162461bcd60e51b81526004016100ec90612e12565b60005a905060008911610a715760405162461bcd60e51b81526004016100ec90612e82565b6000865111610a925760405162461bcd60e51b81526004016100ec90612e32565b6001600160a01b038c1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610b3057600160009054906101000a90046001600160a01b03166001600160a01b0316630a5ea4668d33308e6040518563ffffffff1660e01b8152600401610afd9493929190612da7565b600060405180830381600087803b158015610b1757600080fd5b505af1158015610b2b573d6000803e3d6000fd5b505050505b60005b8651811015610c4a5760015487516001600160a01b0390911690889083908110610b5957fe5b60200260200101516001600160a01b03161415610b885760405162461bcd60e51b81526004016100ec90612ed2565b610c39848281518110610b9757fe5b60200260200101516fffffffffffffffffffffffffffffffff1687878481518110610bbe57fe5b6020026020010151888581518110610bd257fe5b6020026020010151898660010181518110610be957fe5b6020026020010151036080898781518110610c0057fe5b6020026020010151901c8c8781518110610c1657fe5b60200260200101516001600160a01b03166114889095949392919063ffffffff16565b610c4257600080fd5b600101610b33565b50610c7f33610c686001600160a01b038f163063ffffffff6114b616565b6001600160a01b038f16919063ffffffff61158316565b610c986001600160a01b038c163063ffffffff6114b616565b9150600080610ca98d8a868d611596565b915091508a821015610ccd5760405162461bcd60e51b81526004016100ec90612e92565b610ce76001600160a01b038e16338463ffffffff61158316565b336001600160a01b03167f894dbf1262199c24e1750298a384c709160f49d163422cc6cee694c73713f1d28f8f8f86604051610d269493929190612ddc565b60405180910390a2886001600160a01b03168d6001600160a01b03168f6001600160a01b03167fe2cee3f6836059820b673943853afebd9b3026125dab0d774284e6f28a4855be8f8686610d83898c61138690919063ffffffff16565b604051610d939493929190612f62565b60405180910390a46001546001600160a01b031663b1746b86610dbd5a869063ffffffff61138616565b6040518263ffffffff1660e01b8152600401610dd99190612f54565b600060405180830381600087803b158015610df357600080fd5b505af1158015610e07573d6000803e3d6000fd5b505050505050509a9950505050505050505050565b610e24610698565b610e405760405162461bcd60e51b81526004016100ec90612eb2565b6000805460ff60a01b1916600160a01b1781556040517f4426aa1fb73e391071491fcfe21a88b5c38a0a0333a1f6e77161470439704cf89190a1565b610e84611a38565b60005b848110156113015786826020015110610e9f57611301565b6000610eb883602001518961138690919063ffffffff16565b9050610ec2611a60565b8a6001600160a01b031663c75e0a81898986818110610edd57fe5b60200282019050803561017e1936849003018112610efa57600080fd5b6040516001600160e01b031960e086901b168152610f1f939091019150600401612f10565b60606040518083038186803b158015610f3757600080fd5b505afa158015610f4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f6f919081019061234f565b90506000610fb382604001518a8a87818110610f8757fe5b60200282019050803561017e1936849003018112610fa457600080fd5b90910160a00135919050611386565b905060008d6001600160a01b03166370a082318b8b88818110610fd257fe5b60200282019050803561017e1936849003018112610fef57600080fd5b610fff9201602081019150611f28565b6040518263ffffffff1660e01b815260040161101b9190612cac565b602060405180830381600087803b15801561103557600080fd5b505af1158015611049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061106d919081019061236d565b905060008e6001600160a01b031663dd62ed3e8c8c8981811061108c57fe5b60200282019050803561017e19368490030181126110a957600080fd5b6110b99201602081019150611f28565b8f6040518363ffffffff1660e01b81526004016110d7929190612ce3565b602060405180830381600087803b1580156110f157600080fd5b505af1158015611105573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611129919081019061236d565b9050600082821061113a578261113c565b815b905060006111b18d8d8a81811061114f57fe5b60200282019050803561017e193684900301811261116c57600080fd5b80830192505050608001356105358f8f8c81811061118657fe5b60200282019050803561017e19368490030181126111a357600080fd5b87920160a00135905061130e565b9050848110156111bf578094505b5050505060008382106111d257836111d4565b815b90506111de611a38565b8d6001600160a01b0316633e228bae8c8c898181106111f957fe5b60200282019050803561017e193684900301811261121657600080fd5b919091019050848c8c8b81811061122957fe5b602002820190508035601e193684900301811261124557600080fd5b909101602081019150356001600160401b0381111561126357600080fd5b3681900382131561127357600080fd5b6040518563ffffffff1660e01b81526004016112929493929190612f21565b608060405180830381600087803b1580156112ac57600080fd5b505af11580156112c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112e49190810190612331565b90506112f087826116b5565b505060019093019250610e87915050565b5098975050505050505050565b60008261131d5750600061134b565b8282028284828161132a57fe5b04146113485760405162461bcd60e51b81526004016100ec90612ea2565b90505b92915050565b60008082116113725760405162461bcd60e51b81526004016100ec90612e72565b600082848161137d57fe5b04949350505050565b6000828211156113a85760405162461bcd60e51b81526004016100ec90612e62565b50900390565b6001600160a01b038316158015906113e357506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b15611402576114026001600160a01b038416838363ffffffff61172b16565b505050565b6001600160a01b03811661142d5760405162461bcd60e51b81526004016100ec90612e22565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008161149757619c405a0391505b60405160208601600082868884018b8d89f19998505050505050505050565b60006001600160a01b03831615806114ea57506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561150057506001600160a01b0381163161134b565b6040516370a0823160e01b81526001600160a01b038416906370a082319061152c908590600401612cac565b60206040518083038186803b15801561154457600080fd5b505afa158015611558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061157c919081019061236d565b905061134b565b6115908383836000611828565b50505050565b6000808284116115ab575082905060006116ac565b60006115cc61271061053560025461072f888a61138690919063ffffffff16565b90506001600160a01b038616158015906115ef57506001600160a01b0386163314155b801561160457506001600160a01b0386163214155b1561166b5761161a81600a63ffffffff61135116565b91506116386001600160a01b0388168784600163ffffffff61182816565b156116665761164d858363ffffffff61138616565b945061165f818363ffffffff61138616565b905061166b565b600091505b61168f611676610689565b6001600160a01b0389169083600163ffffffff61182816565b156116a7576116a4858263ffffffff61138616565b94505b508391505b94509492505050565b805182516116c89163ffffffff61190616565b8252602080820151908301516116e39163ffffffff61190616565b6020830152604080820151908301516117019163ffffffff61190616565b60408301526060808201519083015161171f9163ffffffff61190616565b60609092019190915250565b8015806117b35750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906117619030908690600401612ce3565b60206040518083038186803b15801561177957600080fd5b505afa15801561178d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117b1919081019061236d565b155b6117cf5760405162461bcd60e51b81526004016100ec90612ee2565b60405161140290849063095ea7b360e01b906117f19086908690602401612d5c565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261192b565b600082611837575060016118fe565b6001600160a01b038516158061186957506001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b156118e05781156118a0576040516001600160a01b0385169084156108fc029085906000818181858888f1935050505090506118fe565b6040516001600160a01b0385169084156108fc029085906000818181858888f193505050501580156118d6573d6000803e3d6000fd5b50600190506118fe565b6118fa6001600160a01b038616858563ffffffff611a1016565b5060015b949350505050565b6000828201838110156113485760405162461bcd60e51b81526004016100ec90612e42565b61193d826001600160a01b0316611a32565b6119595760405162461bcd60e51b81526004016100ec90612ef2565b60006060836001600160a01b0316836040516119759190612ca0565b6000604051808303816000865af19150503d80600081146119b2576040519150601f19603f3d011682016040523d82523d6000602084013e6119b7565b606091505b5091509150816119d95760405162461bcd60e51b81526004016100ec90612e52565b80511561159057808060200190516119f49190810190612039565b6115905760405162461bcd60e51b81526004016100ec90612ec2565b60405161140290849063a9059cbb60e01b906117f19086908690602401612d5c565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b803561134b8161310e565b600082601f830112611a9c57600080fd5b8135611aaf611aaa82612fa3565b612f7d565b91508181835260208401935060208101905083856020840282011115611ad457600080fd5b60005b83811015611b005781611aea8882611a80565b8452506020928301929190910190600101611ad7565b5050505092915050565b60008083601f840112611b1c57600080fd5b5081356001600160401b03811115611b3357600080fd5b602083019150836020820283011115611b4b57600080fd5b9250929050565b600082601f830112611b6357600080fd5b8151611b71611aaa82612fa3565b91508181835260208401935060208101905083856060840282011115611b9657600080fd5b60005b83811015611b005781611bac8882611d70565b84525060209092019160609190910190600101611b99565b600082601f830112611bd557600080fd5b8135611be3611aaa82612fa3565b81815260209384019390925082018360005b83811015611b005781358601611c0b8882611dcb565b8452506020928301929190910190600101611bf5565b600082601f830112611c3257600080fd5b8135611c40611aaa82612fa3565b91508181835260208401935060208101905083856020840282011115611c6557600080fd5b60005b83811015611b005781611c7b8882611f12565b8452506020928301929190910190600101611c68565b805161134b81613122565b805161134b8161312b565b600082601f830112611cb857600080fd5b8135611cc6611aaa82612fc3565b91508082526020830160208301858383011115611ce257600080fd5b611ced8382846130cc565b50505092915050565b803561134b81613134565b600060808284031215611d1357600080fd5b611d1d6080612f7d565b90506000611d2b8484611c9c565b8252506020611d3c84848301611c9c565b6020830152506040611d5084828501611c9c565b6040830152506060611d6484828501611c9c565b60608301525092915050565b600060608284031215611d8257600080fd5b611d8c6060612f7d565b90506000611d9a8484611f1d565b8252506020611dab84848301611c9c565b6020830152506040611dbf84828501611c9c565b60408301525092915050565b60006101808284031215611dde57600080fd5b611de9610180612f7d565b90506000611df78484611a80565b8252506020611e0884848301611a80565b6020830152506040611e1c84828501611a80565b6040830152506060611e3084828501611a80565b6060830152506080611e4484828501611f12565b60808301525060a0611e5884828501611f12565b60a08301525060c0611e6c84828501611f12565b60c08301525060e0611e8084828501611f12565b60e083015250610100611e9584828501611f12565b61010083015250610120611eab84828501611f12565b610120830152506101408201356001600160401b03811115611ecc57600080fd5b611ed884828501611ca7565b610140830152506101608201356001600160401b03811115611ef957600080fd5b611f0584828501611ca7565b6101608301525092915050565b803561134b8161312b565b805161134b8161313d565b600060208284031215611f3a57600080fd5b60006118fe8484611a80565b60008060008060008060008060c0898b031215611f6257600080fd5b6000611f6e8b8b611a80565b9850506020611f7f8b828c01611a80565b9750506040611f908b828c01611a80565b9650506060611fa18b828c01611f12565b95505060808901356001600160401b03811115611fbd57600080fd5b611fc98b828c01611b0a565b945094505060a08901356001600160401b03811115611fe757600080fd5b611ff38b828c01611b0a565b92509250509295985092959890939650565b60006020828403121561201757600080fd5b81516001600160401b0381111561202d57600080fd5b6118fe84828501611b52565b60006020828403121561204b57600080fd5b60006118fe8484611c91565b6000806040838503121561206a57600080fd5b60006120768585611cf6565b925050602061208785828601611a80565b9150509250929050565b6000806000806000806000806000806101008b8d0312156120b157600080fd5b60006120bd8d8d611cf6565b9a505060206120ce8d828e01611a80565b99505060406120df8d828e01611a80565b98505060606120f08d828e01611a80565b97505060808b01356001600160401b0381111561210c57600080fd5b6121188d828e01611b0a565b965096505060a08b01356001600160401b0381111561213657600080fd5b6121428d828e01611b0a565b945094505060c06121558d828e01611f12565b92505060e06121668d828e01611f12565b9150509295989b9194979a5092959850565b6000806000806000806000806000806101408b8d03121561219857600080fd5b60006121a48d8d611cf6565b9a505060206121b58d828e01611cf6565b99505060406121c68d828e01611f12565b98505060606121d78d828e01611f12565b97505060806121e88d828e01611f12565b96505060a06121f98d828e01611a80565b95505060c08b01356001600160401b0381111561221557600080fd5b6122218d828e01611a8b565b94505060e08b01356001600160401b0381111561223d57600080fd5b6122498d828e01611ca7565b9350506101008b01356001600160401b0381111561226657600080fd5b6122728d828e01611c21565b9250506101208b01356001600160401b0381111561228f57600080fd5b6121668d828e01611c21565b600080600080608085870312156122b157600080fd5b60006122bd8787611cf6565b94505060206122ce87828801611cf6565b93505060406122df87828801611a80565b92505060608501356001600160401b038111156122fb57600080fd5b61230787828801611bc4565b91505092959194509250565b60006020828403121561232557600080fd5b60006118fe8484611cf6565b60006080828403121561234357600080fd5b60006118fe8484611d01565b60006060828403121561236157600080fd5b60006118fe8484611d70565b60006020828403121561237f57600080fd5b60006118fe8484611c9c565b60006118fe84848461257e565b60006123a483836129f8565b505060600190565b60006123b88383612a2f565b9392505050565b60006123b88383612b94565b6123d4816130c1565b82525050565b6123d481613094565b60006123ef8385612ff7565b93508360208402850161240184612fea565b8060005b8781101561244557848403895261241c8284613014565b61242786828461238b565b955061243284612fed565b60209b909b019a93505050600101612405565b5091979650505050505050565b600061245d82612ff3565b6124678185612ff7565b935061247283612fed565b8060005b838110156124a057815161248a8882612398565b975061249583612fed565b925050600101612476565b509495945050505050565b60006124b78385612ff7565b9350836020840285016124c984612fea565b8060005b878110156124455784840389526124e48284613064565b6124ee85826123ac565b94506124f983612fed565b60209a909a01999250506001016124cd565b600061251682612ff3565b6125208185612ff7565b93508360208202850161253285612fed565b8060005b85811015612445578484038952815161254f85826123bf565b945061255a83612fed565b60209a909a0199925050600101612536565b6123d48161309f565b6123d481612fea565b600061258a8385612ff7565b93506125978385846130cc565b6125a083613104565b9093019392505050565b60006125b582612ff3565b6125bf8185613000565b93506125cf8185602086016130d8565b9290920192915050565b60006125e482612ff3565b6125ee8185612ff7565b93506125fe8185602086016130d8565b6125a081613104565b6123d4816130a4565b600061261d601c83612ff7565b7f536d61727420636f6e7472616374206973207368757420646f776e2e00000000815260200192915050565b6000612656602683612ff7565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061269e601883612ff7565b7f43616c6c20646174612073686f756c64206578697374732e0000000000000000815260200192915050565b60006126d7601b83612ff7565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000612710602083612ff7565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815260200192915050565b6000612749601e83612ff7565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815260200192915050565b6000612782601a83612ff7565b7f536166654d6174683a206469766973696f6e206279207a65726f000000000000815260200192915050565b60006127bb602383612ff7565b7f4d696e2072657475726e2073686f756c6420626520626967676572207468656e81526210181760e91b602082015260400192915050565b6000612800601b83612ff7565b7f52657475726e20616d6f756e74206973206e6f7420656e6f7567680000000000815260200192915050565b6000612839602183612ff7565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b600061287c602083612ff7565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b60006128b5602a83612ff7565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e8152691bdd081cdd58d8d9595960b21b602082015260400192915050565b6000612901600d83612ff7565b6c1058d8d95cdcc819195b9a5959609a1b815260200192915050565b600061292a603683612ff7565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f81527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b602082015260400192915050565b6000612982601f83612ff7565b7f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400815260200192915050565b805160808301906129bf8482612575565b5060208201516129d26020850182612575565b5060408201516129e56040850182612575565b5060608201516115906060850182612575565b80516060830190612a098482612c97565b506020820151612a1c6020850182612575565b5060408201516115906040850182612575565b60006101808301612a408380613005565b612a4a85826123da565b50612a586020840184613005565b612a6560208601826123da565b50612a736040840184613005565b612a8060408601826123da565b50612a8e6060840184613005565b612a9b60608601826123da565b50612aa96080840184613085565b612ab66080860182612575565b50612ac460a0840184613085565b612ad160a0860182612575565b50612adf60c0840184613085565b612aec60c0860182612575565b50612afa60e0840184613085565b612b0760e0860182612575565b50612b16610100840184613085565b612b24610100860182612575565b50612b33610120840184613085565b612b41610120860182612575565b50612b50610140840184613014565b858303610140870152612b6483828461257e565b92505050612b76610160840184613014565b858303610160870152612b8a83828461257e565b9695505050505050565b8051600090610180840190612ba985826123da565b506020830151612bbc60208601826123da565b506040830151612bcf60408601826123da565b506060830151612be260608601826123da565b506080830151612bf56080860182612575565b5060a0830151612c0860a0860182612575565b5060c0830151612c1b60c0860182612575565b5060e0830151612c2e60e0860182612575565b50610100830151612c43610100860182612575565b50610120830151612c58610120860182612575565b50610140830151848203610140860152612c7282826125d9565b915050610160830151848203610160860152612c8e82826125d9565b95945050505050565b6123d4816130bb565b60006123b882846125aa565b6020810161134b82846123da565b6020810161134b82846123cb565b60408101612cd682856123cb565b6123b860208301846123da565b60408101612cd682856123da565b60c08101612cff828b6123da565b612d0c602083018a6123da565b612d1960408301896123da565b612d266060830188612575565b8181036080830152612d398186886124ab565b905081810360a0830152612d4e8184866123e3565b9a9950505050505050505050565b60408101612d6a82856123da565b6123b86020830184612575565b602080825281016123b88184612452565b602080825281016123b8818461250b565b6020810161134b828461256c565b60808101612db58287612607565b612dc260208301866123cb565b612dcf60408301856123cb565b612c8e6060830184612575565b60808101612dea8287612607565b612df76020830186612607565b612dcf6040830185612575565b6020810161134b8284612607565b6020808252810161134b81612610565b6020808252810161134b81612649565b6020808252810161134b81612691565b6020808252810161134b816126ca565b6020808252810161134b81612703565b6020808252810161134b8161273c565b6020808252810161134b81612775565b6020808252810161134b816127ae565b6020808252810161134b816127f3565b6020808252810161134b8161282c565b6020808252810161134b8161286f565b6020808252810161134b816128a8565b6020808252810161134b816128f4565b6020808252810161134b8161291d565b6020808252810161134b81612975565b6080810161134b82846129ae565b602080825281016123b88184612a2f565b60608082528101612f328187612a2f565b9050612f416020830186612575565b8181036040830152612b8a81848661257e565b6020810161134b8284612575565b60808101612f708287612575565b612df76020830186612575565b6040518181016001600160401b0381118282101715612f9b57600080fd5b604052919050565b60006001600160401b03821115612fb957600080fd5b5060209081020190565b60006001600160401b03821115612fd957600080fd5b506020601f91909101601f19160190565b90565b60200190565b5190565b90815260200190565b919050565b60006123b86020840184611a80565b6000808335601e193685900301811261302c57600080fd5b8381016020810193503591506001600160401b0382111561304c57600080fd5b3682900384131561305c57600080fd5b509250929050565b6000823561017e193684900301811261307c57600080fd5b90910192915050565b60006123b86020840184611f12565b600061134b826130af565b151590565b600061134b82613094565b6001600160a01b031690565b60ff1690565b600061134b826130a4565b82818337506000910152565b60005b838110156130f35781810151838201526020016130db565b838111156115905750506000910152565b601f01601f191690565b61311781613094565b8114610a1e57600080fd5b6131178161309f565b61311781612fea565b613117816130a4565b613117816130bb56fea365627a7a72315820c1a43fede7d704bc97ef81f3eb6109843bed9e1d91537fb3baf3572e1ec5fd506c6578706572696d656e74616cf564736f6c634300050b0040608060405234801561001057600080fd5b5060405161094138038061094183398101604081905261002f91610087565b600080546001600160a01b03199081163317909155600180546001600160a01b0394851690831617905560028054929093169116179055610103565b8051610076816100e3565b92915050565b8051610076816100fa565b6000806040838503121561009a57600080fd5b60006100a6858561007c565b92505060206100b78582860161006b565b9150509250929050565b6000610076826100d7565b6000610076826100c1565b6001600160a01b031690565b6100ec816100c1565b81146100f757600080fd5b50565b6100ec816100cc565b61082f806101126000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630a5ea466146101675780638da5cb5b1461017a578063b1746b8614610198578063c91d59fe146101ab578063ccf1af31146101c0575b6002546001600160a01b0316331415610165576001546040516370a0823160e01b81526001600160a01b039091169063a9059cbb90339083906370a08231906100a490309060040161069a565b60206040518083038186803b1580156100bc57600080fd5b505afa1580156100d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506100f49190810190610525565b6040518363ffffffff1660e01b81526004016101119291906106a8565b602060405180830381600087803b15801561012b57600080fd5b505af115801561013f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506101639190810190610480565b505b005b6101656101753660046104a6565b6101c8565b61018261021c565b60405161018f919061069a565b60405180910390f35b6101656101a6366004610507565b61022b565b6101b36102e4565b60405161018f91906106eb565b6101826102f3565b6000546001600160a01b031633146101fb5760405162461bcd60e51b81526004016101f2906106f9565b60405180910390fd5b6102166001600160a01b03851684848463ffffffff61030216565b50505050565b6000546001600160a01b031681565b6000546001600160a01b031633146102555760405162461bcd60e51b81526004016101f2906106f9565b6001546040516331b35c9b60e11b815261a0aa61374a840104916001600160a01b031690636366b9369061028d908490600401610739565b602060405180830381600087803b1580156102a757600080fd5b505af11580156102bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506102df9190810190610525565b505050565b6001546001600160a01b031681565b6002546001600160a01b031681565b6040516102169085906323b872dd60e01b90610326908790879087906024016106c3565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261036a826001600160a01b031661043d565b6103865760405162461bcd60e51b81526004016101f290610729565b60006060836001600160a01b0316836040516103a29190610687565b6000604051808303816000865af19150503d80600081146103df576040519150601f19603f3d011682016040523d82523d6000602084013e6103e4565b606091505b5091509150816104065760405162461bcd60e51b81526004016101f290610709565b80511561021657808060200190516104219190810190610480565b6102165760405162461bcd60e51b81526004016101f290610719565b3b151590565b803561044e816107ba565b92915050565b805161044e816107d1565b803561044e816107da565b803561044e816107e3565b805161044e816107e3565b60006020828403121561049257600080fd5b600061049e8484610454565b949350505050565b600080600080608085870312156104bc57600080fd5b60006104c8878761045f565b94505060206104d987828801610443565b93505060406104ea87828801610443565b92505060606104fb8782880161046a565b91505092959194509250565b60006020828403121561051957600080fd5b600061049e848461046a565b60006020828403121561053757600080fd5b600061049e8484610475565b61054c81610783565b82525050565b61054c81610759565b600061056682610747565b610570818561074b565b935061058081856020860161078e565b9290920192915050565b61054c81610769565b60006105a0601183610750565b701058d8d95cdcc81c995cdd1c9a58dd1959607a1b815260200192915050565b60006105cd602083610750565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815260200192915050565b6000610606602a83610750565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e8152691bdd081cdd58d8d9595960b21b602082015260400192915050565b6000610652601f83610750565b7f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400815260200192915050565b61054c81610780565b6000610693828461055b565b9392505050565b6020810161044e8284610552565b604081016106b68285610543565b610693602083018461067e565b606081016106d18286610552565b6106de6020830185610552565b61049e604083018461067e565b6020810161044e828461058a565b6020808252810161044e81610593565b6020808252810161044e816105c0565b6020808252810161044e816105f9565b6020808252810161044e81610645565b6020810161044e828461067e565b5190565b919050565b90815260200190565b600061044e82610774565b151590565b600061044e82610759565b6001600160a01b031690565b90565b600061044e82610769565b60005b838110156107a9578181015183820152602001610791565b838111156102165750506000910152565b6107c381610759565b81146107ce57600080fd5b50565b6107c381610764565b6107c381610769565b6107c38161078056fea365627a7a72315820e005115a269ff5c349553b71468dcd1821d809aac683b349abf11d6bdd0925866c6578706572696d656e74616cf564736f6c634300050b00408be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e00000000000000000000000004d37f28d2db99e8d35a6c725a5f1749a085850a30000000000000000000000000000000000b3f879cb30fe243b4dfee438691c040000000000000000000000000000000000000000000000000000000000001388
Deployed Bytecode
0x6080604052600436106100c25760003560e01c8063bf86d6901161007f578063f2fde38b11610059578063f2fde38b1461022a578063f88309d71461024a578063fc0e74d11461026a578063fcc06f8e1461027f576100c2565b8063bf86d690146101d3578063c9b27359146101e8578063e8edc81614610208576100c2565b8063715018a61461010457806371a2039a146101195780638da5cb5b1461014f5780638f32d59b14610171578063a96c400e14610193578063ae4dd0fc146101b3575b600054600160a01b900460ff16156100f55760405162461bcd60e51b81526004016100ec90612e12565b60405180910390fd5b3332141561010257600080fd5b005b34801561011057600080fd5b506101026102ac565b34801561012557600080fd5b5061013961013436600461229b565b61031a565b6040516101469190612d77565b60405180910390f35b34801561015b57600080fd5b50610164610689565b6040516101469190612cac565b34801561017d57600080fd5b50610186610698565b6040516101469190612d99565b34801561019f57600080fd5b506101026101ae366004612091565b6106a9565b3480156101bf57600080fd5b506101026101ce366004612313565b6107cf565b3480156101df57600080fd5b506101866108dd565b3480156101f457600080fd5b50610102610203366004612057565b6108ed565b34801561021457600080fd5b5061021d6109e2565b6040516101469190612e04565b34801561023657600080fd5b50610102610245366004611f28565b6109f1565b61025d610258366004612178565b610a21565b6040516101469190612f54565b34801561027657600080fd5b50610102610e1c565b34801561028b57600080fd5b5061029f61029a366004611f46565b610e7c565b6040516101469190612f02565b6102b4610698565b6102d05760405162461bcd60e51b81526004016100ec90612eb2565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b604051631fa75d3760e21b81526060906001600160a01b03851690637e9d74dc90610349908590600401612d88565b60006040518083038186803b15801561036157600080fd5b505afa158015610375573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261039d9190810190612005565b905060005b8151811015610680576000866001600160a01b03166370a082318584815181106103c857fe5b6020026020010151600001516040518263ffffffff1660e01b81526004016103f09190612cac565b60206040518083038186803b15801561040857600080fd5b505afa15801561041c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610440919081019061236d565b90506000876001600160a01b031663dd62ed3e86858151811061045f57fe5b602002602001015160000151886040518363ffffffff1660e01b8152600401610489929190612ce3565b60206040518083038186803b1580156104a157600080fd5b505afa1580156104b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104d9919081019061236d565b905060008282106104ea57826104ec565b815b905060006105418786815181106104ff57fe5b60200260200101516080015161053589888151811061051a57fe5b602002602001015160a001518561130e90919063ffffffff16565b9063ffffffff61135116565b905060005b8581101561060e5787868151811061055a57fe5b6020026020010151600001516001600160a01b031688828151811061057b57fe5b6020026020010151600001516001600160a01b031614156106065760006105d98883815181106105a757fe5b6020026020010151604001518a84815181106105bf57fe5b602002602001015160a0015161138690919063ffffffff16565b9050808311156105fa576105f3838263ffffffff61138616565b9250610604565b600092505061060e565b505b600101610546565b50600061063887878151811061062057fe5b6020026020010151604001518988815181106105bf57fe5b90508082101561066f57610652828988815181106105bf57fe5b87878151811061065e57fe5b602002602001015160400181815250505b5050600190930192506103a2915050565b50949350505050565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b600061073b82610535858e6001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016106df9190612cba565b60206040518083038186803b1580156106f757600080fd5b505afa15801561070b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061072f919081019061236d565b9063ffffffff61130e16565b604051637e6037c760e11b8152909150309063fcc06f8e9061076f908d908d908d9087908e908e908e908e90600401612cf1565b608060405180830381600087803b15801561078957600080fd5b505af115801561079d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107c19190810190612331565b505050505050505050505050565b600054600160a01b900460ff16156107f95760405162461bcd60e51b81526004016100ec90612e12565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190610828903090600401612cba565b60206040518083038186803b15801561084057600080fd5b505afa158015610854573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610878919081019061236d565b604051632e1a7d4d60e01b81529091506001600160a01b03831690632e1a7d4d906108a7908490600401612f54565b600060405180830381600087803b1580156108c157600080fd5b505af11580156108d5573d6000803e3d6000fd5b505050505050565b600054600160a01b900460ff1681565b600054600160a01b900460ff16156109175760405162461bcd60e51b81526004016100ec90612e12565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146109de57604051636eb1769f60e11b815260ff906001600160a01b0384169063dd62ed3e9061096c9030908690600401612cc8565b60206040518083038186803b15801561098457600080fd5b505afa158015610998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109bc919081019061236d565b901c6109de576109de6001600160a01b0383168260001963ffffffff6113ae16565b5050565b6001546001600160a01b031681565b6109f9610698565b610a155760405162461bcd60e51b81526004016100ec90612eb2565b610a1e81611407565b50565b60008054600160a01b900460ff1615610a4c5760405162461bcd60e51b81526004016100ec90612e12565b60005a905060008911610a715760405162461bcd60e51b81526004016100ec90612e82565b6000865111610a925760405162461bcd60e51b81526004016100ec90612e32565b6001600160a01b038c1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610b3057600160009054906101000a90046001600160a01b03166001600160a01b0316630a5ea4668d33308e6040518563ffffffff1660e01b8152600401610afd9493929190612da7565b600060405180830381600087803b158015610b1757600080fd5b505af1158015610b2b573d6000803e3d6000fd5b505050505b60005b8651811015610c4a5760015487516001600160a01b0390911690889083908110610b5957fe5b60200260200101516001600160a01b03161415610b885760405162461bcd60e51b81526004016100ec90612ed2565b610c39848281518110610b9757fe5b60200260200101516fffffffffffffffffffffffffffffffff1687878481518110610bbe57fe5b6020026020010151888581518110610bd257fe5b6020026020010151898660010181518110610be957fe5b6020026020010151036080898781518110610c0057fe5b6020026020010151901c8c8781518110610c1657fe5b60200260200101516001600160a01b03166114889095949392919063ffffffff16565b610c4257600080fd5b600101610b33565b50610c7f33610c686001600160a01b038f163063ffffffff6114b616565b6001600160a01b038f16919063ffffffff61158316565b610c986001600160a01b038c163063ffffffff6114b616565b9150600080610ca98d8a868d611596565b915091508a821015610ccd5760405162461bcd60e51b81526004016100ec90612e92565b610ce76001600160a01b038e16338463ffffffff61158316565b336001600160a01b03167f894dbf1262199c24e1750298a384c709160f49d163422cc6cee694c73713f1d28f8f8f86604051610d269493929190612ddc565b60405180910390a2886001600160a01b03168d6001600160a01b03168f6001600160a01b03167fe2cee3f6836059820b673943853afebd9b3026125dab0d774284e6f28a4855be8f8686610d83898c61138690919063ffffffff16565b604051610d939493929190612f62565b60405180910390a46001546001600160a01b031663b1746b86610dbd5a869063ffffffff61138616565b6040518263ffffffff1660e01b8152600401610dd99190612f54565b600060405180830381600087803b158015610df357600080fd5b505af1158015610e07573d6000803e3d6000fd5b505050505050509a9950505050505050505050565b610e24610698565b610e405760405162461bcd60e51b81526004016100ec90612eb2565b6000805460ff60a01b1916600160a01b1781556040517f4426aa1fb73e391071491fcfe21a88b5c38a0a0333a1f6e77161470439704cf89190a1565b610e84611a38565b60005b848110156113015786826020015110610e9f57611301565b6000610eb883602001518961138690919063ffffffff16565b9050610ec2611a60565b8a6001600160a01b031663c75e0a81898986818110610edd57fe5b60200282019050803561017e1936849003018112610efa57600080fd5b6040516001600160e01b031960e086901b168152610f1f939091019150600401612f10565b60606040518083038186803b158015610f3757600080fd5b505afa158015610f4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f6f919081019061234f565b90506000610fb382604001518a8a87818110610f8757fe5b60200282019050803561017e1936849003018112610fa457600080fd5b90910160a00135919050611386565b905060008d6001600160a01b03166370a082318b8b88818110610fd257fe5b60200282019050803561017e1936849003018112610fef57600080fd5b610fff9201602081019150611f28565b6040518263ffffffff1660e01b815260040161101b9190612cac565b602060405180830381600087803b15801561103557600080fd5b505af1158015611049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061106d919081019061236d565b905060008e6001600160a01b031663dd62ed3e8c8c8981811061108c57fe5b60200282019050803561017e19368490030181126110a957600080fd5b6110b99201602081019150611f28565b8f6040518363ffffffff1660e01b81526004016110d7929190612ce3565b602060405180830381600087803b1580156110f157600080fd5b505af1158015611105573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611129919081019061236d565b9050600082821061113a578261113c565b815b905060006111b18d8d8a81811061114f57fe5b60200282019050803561017e193684900301811261116c57600080fd5b80830192505050608001356105358f8f8c81811061118657fe5b60200282019050803561017e19368490030181126111a357600080fd5b87920160a00135905061130e565b9050848110156111bf578094505b5050505060008382106111d257836111d4565b815b90506111de611a38565b8d6001600160a01b0316633e228bae8c8c898181106111f957fe5b60200282019050803561017e193684900301811261121657600080fd5b919091019050848c8c8b81811061122957fe5b602002820190508035601e193684900301811261124557600080fd5b909101602081019150356001600160401b0381111561126357600080fd5b3681900382131561127357600080fd5b6040518563ffffffff1660e01b81526004016112929493929190612f21565b608060405180830381600087803b1580156112ac57600080fd5b505af11580156112c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112e49190810190612331565b90506112f087826116b5565b505060019093019250610e87915050565b5098975050505050505050565b60008261131d5750600061134b565b8282028284828161132a57fe5b04146113485760405162461bcd60e51b81526004016100ec90612ea2565b90505b92915050565b60008082116113725760405162461bcd60e51b81526004016100ec90612e72565b600082848161137d57fe5b04949350505050565b6000828211156113a85760405162461bcd60e51b81526004016100ec90612e62565b50900390565b6001600160a01b038316158015906113e357506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b15611402576114026001600160a01b038416838363ffffffff61172b16565b505050565b6001600160a01b03811661142d5760405162461bcd60e51b81526004016100ec90612e22565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008161149757619c405a0391505b60405160208601600082868884018b8d89f19998505050505050505050565b60006001600160a01b03831615806114ea57506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561150057506001600160a01b0381163161134b565b6040516370a0823160e01b81526001600160a01b038416906370a082319061152c908590600401612cac565b60206040518083038186803b15801561154457600080fd5b505afa158015611558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061157c919081019061236d565b905061134b565b6115908383836000611828565b50505050565b6000808284116115ab575082905060006116ac565b60006115cc61271061053560025461072f888a61138690919063ffffffff16565b90506001600160a01b038616158015906115ef57506001600160a01b0386163314155b801561160457506001600160a01b0386163214155b1561166b5761161a81600a63ffffffff61135116565b91506116386001600160a01b0388168784600163ffffffff61182816565b156116665761164d858363ffffffff61138616565b945061165f818363ffffffff61138616565b905061166b565b600091505b61168f611676610689565b6001600160a01b0389169083600163ffffffff61182816565b156116a7576116a4858263ffffffff61138616565b94505b508391505b94509492505050565b805182516116c89163ffffffff61190616565b8252602080820151908301516116e39163ffffffff61190616565b6020830152604080820151908301516117019163ffffffff61190616565b60408301526060808201519083015161171f9163ffffffff61190616565b60609092019190915250565b8015806117b35750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906117619030908690600401612ce3565b60206040518083038186803b15801561177957600080fd5b505afa15801561178d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117b1919081019061236d565b155b6117cf5760405162461bcd60e51b81526004016100ec90612ee2565b60405161140290849063095ea7b360e01b906117f19086908690602401612d5c565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261192b565b600082611837575060016118fe565b6001600160a01b038516158061186957506001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b156118e05781156118a0576040516001600160a01b0385169084156108fc029085906000818181858888f1935050505090506118fe565b6040516001600160a01b0385169084156108fc029085906000818181858888f193505050501580156118d6573d6000803e3d6000fd5b50600190506118fe565b6118fa6001600160a01b038616858563ffffffff611a1016565b5060015b949350505050565b6000828201838110156113485760405162461bcd60e51b81526004016100ec90612e42565b61193d826001600160a01b0316611a32565b6119595760405162461bcd60e51b81526004016100ec90612ef2565b60006060836001600160a01b0316836040516119759190612ca0565b6000604051808303816000865af19150503d80600081146119b2576040519150601f19603f3d011682016040523d82523d6000602084013e6119b7565b606091505b5091509150816119d95760405162461bcd60e51b81526004016100ec90612e52565b80511561159057808060200190516119f49190810190612039565b6115905760405162461bcd60e51b81526004016100ec90612ec2565b60405161140290849063a9059cbb60e01b906117f19086908690602401612d5c565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b803561134b8161310e565b600082601f830112611a9c57600080fd5b8135611aaf611aaa82612fa3565b612f7d565b91508181835260208401935060208101905083856020840282011115611ad457600080fd5b60005b83811015611b005781611aea8882611a80565b8452506020928301929190910190600101611ad7565b5050505092915050565b60008083601f840112611b1c57600080fd5b5081356001600160401b03811115611b3357600080fd5b602083019150836020820283011115611b4b57600080fd5b9250929050565b600082601f830112611b6357600080fd5b8151611b71611aaa82612fa3565b91508181835260208401935060208101905083856060840282011115611b9657600080fd5b60005b83811015611b005781611bac8882611d70565b84525060209092019160609190910190600101611b99565b600082601f830112611bd557600080fd5b8135611be3611aaa82612fa3565b81815260209384019390925082018360005b83811015611b005781358601611c0b8882611dcb565b8452506020928301929190910190600101611bf5565b600082601f830112611c3257600080fd5b8135611c40611aaa82612fa3565b91508181835260208401935060208101905083856020840282011115611c6557600080fd5b60005b83811015611b005781611c7b8882611f12565b8452506020928301929190910190600101611c68565b805161134b81613122565b805161134b8161312b565b600082601f830112611cb857600080fd5b8135611cc6611aaa82612fc3565b91508082526020830160208301858383011115611ce257600080fd5b611ced8382846130cc565b50505092915050565b803561134b81613134565b600060808284031215611d1357600080fd5b611d1d6080612f7d565b90506000611d2b8484611c9c565b8252506020611d3c84848301611c9c565b6020830152506040611d5084828501611c9c565b6040830152506060611d6484828501611c9c565b60608301525092915050565b600060608284031215611d8257600080fd5b611d8c6060612f7d565b90506000611d9a8484611f1d565b8252506020611dab84848301611c9c565b6020830152506040611dbf84828501611c9c565b60408301525092915050565b60006101808284031215611dde57600080fd5b611de9610180612f7d565b90506000611df78484611a80565b8252506020611e0884848301611a80565b6020830152506040611e1c84828501611a80565b6040830152506060611e3084828501611a80565b6060830152506080611e4484828501611f12565b60808301525060a0611e5884828501611f12565b60a08301525060c0611e6c84828501611f12565b60c08301525060e0611e8084828501611f12565b60e083015250610100611e9584828501611f12565b61010083015250610120611eab84828501611f12565b610120830152506101408201356001600160401b03811115611ecc57600080fd5b611ed884828501611ca7565b610140830152506101608201356001600160401b03811115611ef957600080fd5b611f0584828501611ca7565b6101608301525092915050565b803561134b8161312b565b805161134b8161313d565b600060208284031215611f3a57600080fd5b60006118fe8484611a80565b60008060008060008060008060c0898b031215611f6257600080fd5b6000611f6e8b8b611a80565b9850506020611f7f8b828c01611a80565b9750506040611f908b828c01611a80565b9650506060611fa18b828c01611f12565b95505060808901356001600160401b03811115611fbd57600080fd5b611fc98b828c01611b0a565b945094505060a08901356001600160401b03811115611fe757600080fd5b611ff38b828c01611b0a565b92509250509295985092959890939650565b60006020828403121561201757600080fd5b81516001600160401b0381111561202d57600080fd5b6118fe84828501611b52565b60006020828403121561204b57600080fd5b60006118fe8484611c91565b6000806040838503121561206a57600080fd5b60006120768585611cf6565b925050602061208785828601611a80565b9150509250929050565b6000806000806000806000806000806101008b8d0312156120b157600080fd5b60006120bd8d8d611cf6565b9a505060206120ce8d828e01611a80565b99505060406120df8d828e01611a80565b98505060606120f08d828e01611a80565b97505060808b01356001600160401b0381111561210c57600080fd5b6121188d828e01611b0a565b965096505060a08b01356001600160401b0381111561213657600080fd5b6121428d828e01611b0a565b945094505060c06121558d828e01611f12565b92505060e06121668d828e01611f12565b9150509295989b9194979a5092959850565b6000806000806000806000806000806101408b8d03121561219857600080fd5b60006121a48d8d611cf6565b9a505060206121b58d828e01611cf6565b99505060406121c68d828e01611f12565b98505060606121d78d828e01611f12565b97505060806121e88d828e01611f12565b96505060a06121f98d828e01611a80565b95505060c08b01356001600160401b0381111561221557600080fd5b6122218d828e01611a8b565b94505060e08b01356001600160401b0381111561223d57600080fd5b6122498d828e01611ca7565b9350506101008b01356001600160401b0381111561226657600080fd5b6122728d828e01611c21565b9250506101208b01356001600160401b0381111561228f57600080fd5b6121668d828e01611c21565b600080600080608085870312156122b157600080fd5b60006122bd8787611cf6565b94505060206122ce87828801611cf6565b93505060406122df87828801611a80565b92505060608501356001600160401b038111156122fb57600080fd5b61230787828801611bc4565b91505092959194509250565b60006020828403121561232557600080fd5b60006118fe8484611cf6565b60006080828403121561234357600080fd5b60006118fe8484611d01565b60006060828403121561236157600080fd5b60006118fe8484611d70565b60006020828403121561237f57600080fd5b60006118fe8484611c9c565b60006118fe84848461257e565b60006123a483836129f8565b505060600190565b60006123b88383612a2f565b9392505050565b60006123b88383612b94565b6123d4816130c1565b82525050565b6123d481613094565b60006123ef8385612ff7565b93508360208402850161240184612fea565b8060005b8781101561244557848403895261241c8284613014565b61242786828461238b565b955061243284612fed565b60209b909b019a93505050600101612405565b5091979650505050505050565b600061245d82612ff3565b6124678185612ff7565b935061247283612fed565b8060005b838110156124a057815161248a8882612398565b975061249583612fed565b925050600101612476565b509495945050505050565b60006124b78385612ff7565b9350836020840285016124c984612fea565b8060005b878110156124455784840389526124e48284613064565b6124ee85826123ac565b94506124f983612fed565b60209a909a01999250506001016124cd565b600061251682612ff3565b6125208185612ff7565b93508360208202850161253285612fed565b8060005b85811015612445578484038952815161254f85826123bf565b945061255a83612fed565b60209a909a0199925050600101612536565b6123d48161309f565b6123d481612fea565b600061258a8385612ff7565b93506125978385846130cc565b6125a083613104565b9093019392505050565b60006125b582612ff3565b6125bf8185613000565b93506125cf8185602086016130d8565b9290920192915050565b60006125e482612ff3565b6125ee8185612ff7565b93506125fe8185602086016130d8565b6125a081613104565b6123d4816130a4565b600061261d601c83612ff7565b7f536d61727420636f6e7472616374206973207368757420646f776e2e00000000815260200192915050565b6000612656602683612ff7565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061269e601883612ff7565b7f43616c6c20646174612073686f756c64206578697374732e0000000000000000815260200192915050565b60006126d7601b83612ff7565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000612710602083612ff7565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815260200192915050565b6000612749601e83612ff7565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815260200192915050565b6000612782601a83612ff7565b7f536166654d6174683a206469766973696f6e206279207a65726f000000000000815260200192915050565b60006127bb602383612ff7565b7f4d696e2072657475726e2073686f756c6420626520626967676572207468656e81526210181760e91b602082015260400192915050565b6000612800601b83612ff7565b7f52657475726e20616d6f756e74206973206e6f7420656e6f7567680000000000815260200192915050565b6000612839602183612ff7565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b600061287c602083612ff7565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b60006128b5602a83612ff7565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e8152691bdd081cdd58d8d9595960b21b602082015260400192915050565b6000612901600d83612ff7565b6c1058d8d95cdcc819195b9a5959609a1b815260200192915050565b600061292a603683612ff7565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f81527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b602082015260400192915050565b6000612982601f83612ff7565b7f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400815260200192915050565b805160808301906129bf8482612575565b5060208201516129d26020850182612575565b5060408201516129e56040850182612575565b5060608201516115906060850182612575565b80516060830190612a098482612c97565b506020820151612a1c6020850182612575565b5060408201516115906040850182612575565b60006101808301612a408380613005565b612a4a85826123da565b50612a586020840184613005565b612a6560208601826123da565b50612a736040840184613005565b612a8060408601826123da565b50612a8e6060840184613005565b612a9b60608601826123da565b50612aa96080840184613085565b612ab66080860182612575565b50612ac460a0840184613085565b612ad160a0860182612575565b50612adf60c0840184613085565b612aec60c0860182612575565b50612afa60e0840184613085565b612b0760e0860182612575565b50612b16610100840184613085565b612b24610100860182612575565b50612b33610120840184613085565b612b41610120860182612575565b50612b50610140840184613014565b858303610140870152612b6483828461257e565b92505050612b76610160840184613014565b858303610160870152612b8a83828461257e565b9695505050505050565b8051600090610180840190612ba985826123da565b506020830151612bbc60208601826123da565b506040830151612bcf60408601826123da565b506060830151612be260608601826123da565b506080830151612bf56080860182612575565b5060a0830151612c0860a0860182612575565b5060c0830151612c1b60c0860182612575565b5060e0830151612c2e60e0860182612575565b50610100830151612c43610100860182612575565b50610120830151612c58610120860182612575565b50610140830151848203610140860152612c7282826125d9565b915050610160830151848203610160860152612c8e82826125d9565b95945050505050565b6123d4816130bb565b60006123b882846125aa565b6020810161134b82846123da565b6020810161134b82846123cb565b60408101612cd682856123cb565b6123b860208301846123da565b60408101612cd682856123da565b60c08101612cff828b6123da565b612d0c602083018a6123da565b612d1960408301896123da565b612d266060830188612575565b8181036080830152612d398186886124ab565b905081810360a0830152612d4e8184866123e3565b9a9950505050505050505050565b60408101612d6a82856123da565b6123b86020830184612575565b602080825281016123b88184612452565b602080825281016123b8818461250b565b6020810161134b828461256c565b60808101612db58287612607565b612dc260208301866123cb565b612dcf60408301856123cb565b612c8e6060830184612575565b60808101612dea8287612607565b612df76020830186612607565b612dcf6040830185612575565b6020810161134b8284612607565b6020808252810161134b81612610565b6020808252810161134b81612649565b6020808252810161134b81612691565b6020808252810161134b816126ca565b6020808252810161134b81612703565b6020808252810161134b8161273c565b6020808252810161134b81612775565b6020808252810161134b816127ae565b6020808252810161134b816127f3565b6020808252810161134b8161282c565b6020808252810161134b8161286f565b6020808252810161134b816128a8565b6020808252810161134b816128f4565b6020808252810161134b8161291d565b6020808252810161134b81612975565b6080810161134b82846129ae565b602080825281016123b88184612a2f565b60608082528101612f328187612a2f565b9050612f416020830186612575565b8181036040830152612b8a81848661257e565b6020810161134b8284612575565b60808101612f708287612575565b612df76020830186612575565b6040518181016001600160401b0381118282101715612f9b57600080fd5b604052919050565b60006001600160401b03821115612fb957600080fd5b5060209081020190565b60006001600160401b03821115612fd957600080fd5b506020601f91909101601f19160190565b90565b60200190565b5190565b90815260200190565b919050565b60006123b86020840184611a80565b6000808335601e193685900301811261302c57600080fd5b8381016020810193503591506001600160401b0382111561304c57600080fd5b3682900384131561305c57600080fd5b509250929050565b6000823561017e193684900301811261307c57600080fd5b90910192915050565b60006123b86020840184611f12565b600061134b826130af565b151590565b600061134b82613094565b6001600160a01b031690565b60ff1690565b600061134b826130a4565b82818337506000910152565b60005b838110156130f35781810151838201526020016130db565b838111156115905750506000910152565b601f01601f191690565b61311781613094565b8114610a1e57600080fd5b6131178161309f565b61311781612fea565b613117816130a4565b613117816130bb56fea365627a7a72315820c1a43fede7d704bc97ef81f3eb6109843bed9e1d91537fb3baf3572e1ec5fd506c6578706572696d656e74616cf564736f6c634300050b0040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004d37f28d2db99e8d35a6c725a5f1749a085850a30000000000000000000000000000000000b3f879cb30fe243b4dfee438691c040000000000000000000000000000000000000000000000000000000000001388
-----Decoded View---------------
Arg [0] : _owner (address): 0x4D37f28D2db99e8d35A6C725a5f1749A085850a3
Arg [1] : _gasToken (address): 0x0000000000b3F879cb30FE243b4Dfee438691c04
Arg [2] : _fee (uint256): 5000
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000004d37f28d2db99e8d35a6c725a5f1749a085850a3
Arg [1] : 0000000000000000000000000000000000b3f879cb30fe243b4dfee438691c04
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001388
Deployed Bytecode Sourcemap
27203:4752:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14746:10;;-1:-1:-1;;;14746:10:0;;;;14745:11;14737:52;;;;-1:-1:-1;;;14737:52:0;;;;;;;;;;;;;;;;;28249:10;28263:9;28249:23;;28241:32;;;;;;27203:4752;9352:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9352:140:0;;;:::i;18649:1813::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18649:1813:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8541:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8541:79:0;;;:::i;:::-;;;;;;;;8907:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8907:92:0;;;:::i;:::-;;;;;;;;15245:494;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15245:494:0;;;;;;;;:::i;31793:159::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31793:159:0;;;;;;;;:::i;14649:22::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14649:22:0;;;:::i;31506:279::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31506:279:0;;;;;;;;:::i;27468:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27468:27:0;;;:::i;:::-;;;;;;;;9647:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9647:109:0;;;;;;;;:::i;28289:2159::-;;;;;;;;;:::i;:::-;;;;;;;;14817:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14817:99:0;;;:::i;15747:2198::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15747:2198:0;;;;;;;;:::i;:::-;;;;;;;;9352:140;8753:9;:7;:9::i;:::-;8745:54;;;;-1:-1:-1;;;8745:54:0;;;;;;;;;9451:1;9435:6;;9414:40;;-1:-1:-1;;;;;9435:6:0;;;;9414:40;;9451:1;;9414:40;9482:1;9465:19;;-1:-1:-1;;;;;;9465:19:0;;;9352:140::o;18649:1813::-;18958:25;;-1:-1:-1;;;18958:25:0;;18885:42;;-1:-1:-1;;;;;18958:17:0;;;;;:25;;18976:6;;18958:25;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18958:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18958:25:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;18958:25:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;18958:25:0;;;;;;;;;18945:38;-1:-1:-1;19001:6:0;18996:1459;19017:10;:17;19013:1;:21;18996:1459;;;19058:15;19076:5;-1:-1:-1;;;;;19076:15:0;;19092:6;19099:1;19092:9;;;;;;;;;;;;;;:22;;;19076:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19076:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19076:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19076:39:0;;;;;;;;;19058:57;;19130:17;19150:5;-1:-1:-1;;;;;19150:15:0;;19166:6;19173:1;19166:9;;;;;;;;;;;;;;:22;;;19190:13;19150:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19150:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19150:54:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19150:54:0;;;;;;;;;19130:74;;19219:28;19263:7;19251:9;:19;19250:43;;19286:7;19250:43;;;19274:9;19250:43;19219:74;;19308:28;19339:84;19396:6;19403:1;19396:9;;;;;;;;;;;;;;:26;;;19339:52;19364:6;19371:1;19364:9;;;;;;;;;;;;;;:26;;;19339:20;:24;;:52;;;;:::i;:::-;:56;:84;:56;:84;:::i;:::-;19308:115;-1:-1:-1;19445:6:0;19440:653;19461:1;19457;:5;19440:653;;;19520:6;19527:1;19520:9;;;;;;;;;;;;;;:22;;;-1:-1:-1;;;;;19494:48:0;:6;19501:1;19494:9;;;;;;;;;;;;;;:22;;;-1:-1:-1;;;;;19494:48:0;;19490:588;;;19569:37;19609:121;19666:10;19677:1;19666:13;;;;;;;;;;;;;;:41;;;19609:6;19616:1;19609:9;;;;;;;;;;;;;;:26;;;:30;;:121;;;;:::i;:::-;19569:161;;19782:29;19759:20;:52;19755:304;;;19865:55;:20;19890:29;19865:55;:24;:55;:::i;:::-;19842:78;;19755:304;;;20002:1;19979:24;;20030:5;;;19755:304;19490:588;;19464:3;;19440:653;;;;20109:28;20140:105;20189:10;20200:1;20189:13;;;;;;;;;;;;;;:41;;;20140:6;20147:1;20140:9;;;;;;;:105;20109:136;;20289:20;20266;:43;20262:182;;;20376:52;20407:20;20376:6;20383:1;20376:9;;;;;;;:52;20332:10;20343:1;20332:13;;;;;;;;;;;;;;:41;;:96;;;;;20262:182;-1:-1:-1;;19036:3:0;;;;;-1:-1:-1;18996:1459:0;;-1:-1:-1;;18996:1459:0;;;18649:1813;;;;;;:::o;8541:79::-;8579:7;8606:6;-1:-1:-1;;;;;8606:6:0;8541:79;:::o;8907:92::-;8947:4;8985:6;-1:-1:-1;;;;;8985:6:0;8971:10;:20;;8907:92::o;15245:494::-;15567:14;15584:49;15629:3;15584:40;15620:3;15584:9;-1:-1:-1;;;;;15584:19:0;;15604:10;15584:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15584:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15584:31:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15584:31:0;;;;;;;;;:35;:40;:35;:40;:::i;:49::-;15644:87;;-1:-1:-1;;;15644:87:0;;15567:66;;-1:-1:-1;15644:4:0;;:21;;:87;;15666:8;;15676:11;;15689:13;;15567:66;;15712:6;;;;15720:10;;;;15644:87;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15644:87:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15644:87:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15644:87:0;;;;;;;;;;15245:494;;;;;;;;;;;:::o;31793:159::-;14746:10;;-1:-1:-1;;;14746:10:0;;;;14745:11;14737:52;;;;-1:-1:-1;;;14737:52:0;;;;;;;;;31881:30;;-1:-1:-1;;;31881:30:0;;31864:14;;-1:-1:-1;;;;;31881:15:0;;;;;:30;;31905:4;;31881:30;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31881:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31881:30:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;31881:30:0;;;;;;;;;31922:22;;-1:-1:-1;;;31922:22:0;;31864:47;;-1:-1:-1;;;;;;31922:14:0;;;;;:22;;31864:47;;31922:22;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31922:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31922:22:0;;;;14800:1;31793:159;:::o;14649:22::-;;;-1:-1:-1;;;14649:22:0;;;;;:::o;31506:279::-;14746:10;;-1:-1:-1;;;14746:10:0;;;;14745:11;14737:52;;;;-1:-1:-1;;;14737:52:0;;;;;;;;;-1:-1:-1;;;;;31601:20:0;;27416:42;31601:20;31597:181;;31643:34;;-1:-1:-1;;;31643:34:0;;31681:3;;-1:-1:-1;;;;;31643:15:0;;;;;:34;;31667:4;;31674:2;;31643:34;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31643:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31643:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;31643:34:0;;;;;;;;;:41;;31638:129;;31711:40;-1:-1:-1;;;;;31711:22:0;;31734:2;-1:-1:-1;;31711:40:0;:22;:40;:::i;:::-;31506:279;;:::o;27468:27::-;;;-1:-1:-1;;;;;27468:27:0;;:::o;9647:109::-;8753:9;:7;:9::i;:::-;8745:54;;;;-1:-1:-1;;;8745:54:0;;;;;;;;;9720:28;9739:8;9720:18;:28::i;:::-;9647:109;:::o;28289:2159::-;28715:20;14746:10;;-1:-1:-1;;;14746:10:0;;;;14745:11;14737:52;;;;-1:-1:-1;;;14737:52:0;;;;;;;;;28753:19;28775:9;28753:31;;28823:1;28805:15;:19;28797:67;;;;-1:-1:-1;;;28797:67:0;;;;;;;;;28906:1;28883:13;:20;:24;28875:61;;;;-1:-1:-1;;;28875:61:0;;;;;;;;;-1:-1:-1;;;;;28953:24:0;;27416:42;28953:24;28949:131;;28994:7;;;;;;;;;-1:-1:-1;;;;;28994:7:0;-1:-1:-1;;;;;28994:19:0;;29014:9;29025:10;29045:4;29052:15;28994:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28994:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28994:74:0;;;;28949:131;29097:6;29092:416;29113:13;:20;29109:1;:24;29092:416;;;29191:7;;29163:16;;-1:-1:-1;;;;;29191:7:0;;;;29163:13;;29177:1;;29163:16;;;;;;;;;;;;-1:-1:-1;;;;;29163:36:0;;;29155:62;;;;-1:-1:-1;;;29155:62:0;;;;;;;;;29240:255;29288:18;29307:1;29288:21;;;;;;;;;;;;;;29313:14;29288:40;29347:14;29380:6;29387:1;29380:9;;;;;;;;;;;;;;29424:6;29431:1;29424:9;;;;;;;;;;;;;;29408:6;29415:1;29419;29415:5;29408:13;;;;;;;;;;;;;;:25;29477:3;29452:18;29471:1;29452:21;;;;;;;;;;;;;;:28;;29240:13;29254:1;29240:16;;;;;;;;;;;;;;-1:-1:-1;;;;;29240:29:0;;;:255;;;;;;;;:::i;:::-;29232:264;;;;;;29135:3;;29092:416;;;-1:-1:-1;29558:84:0;29586:10;29598:43;-1:-1:-1;;;;;29598:28:0;;29635:4;29598:43;:28;:43;:::i;:::-;-1:-1:-1;;;;;29558:27:0;;;:84;;:27;:84;:::i;:::-;29670:41;-1:-1:-1;;;;;29670:26:0;;29705:4;29670:41;:26;:41;:::i;:::-;29655:56;;29723:21;29746:19;29769:62;29781:7;29790:8;29800:12;29814:16;29769:11;:62::i;:::-;29722:109;;;;29869:15;29852:13;:32;;29844:72;;;;-1:-1:-1;;;29844:72:0;;;;;;;;;29927:52;-1:-1:-1;;;;;29927:25:0;;29953:10;29965:13;29927:52;:25;:52;:::i;:::-;30019:10;-1:-1:-1;;;;;29997:147:0;;30044:9;30068:7;30090:15;30120:13;29997:147;;;;;;;;;;;;;;;;;;30230:8;-1:-1:-1;;;;;30162:217:0;30208:7;-1:-1:-1;;;;;30162:217:0;30184:9;-1:-1:-1;;;;;30162:217:0;;30253:15;30283:13;30311:11;30337:31;30354:13;30337:12;:16;;:31;;;;:::i;:::-;30162:217;;;;;;;;;;;;;;;;;;30392:7;;-1:-1:-1;;;;;30392:7:0;:20;30413:26;30429:9;30413:11;;:26;:15;:26;:::i;:::-;30392:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30392:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30392:48:0;;;;14800:1;;;28289:2159;;;;;;;;;;;;:::o;14817:99::-;8753:9;:7;:9::i;:::-;8745:54;;;;-1:-1:-1;;;8745:54:0;;;;;;;;;14865:10;:17;;-1:-1:-1;;;;14865:17:0;-1:-1:-1;;;14865:17:0;;;14898:10;;;;14865;14898;14817:99::o;15747:2198::-;16031:48;;:::i;:::-;16102:6;16097:1805;16114:17;;;16097:1805;;;16282:20;16239:16;:39;;;:63;16235:109;;16323:5;;16235:109;16429:28;16460:65;16485:16;:39;;;16460:20;:24;;:65;;;;:::i;:::-;16429:96;;16542:39;;:::i;:::-;16597:11;-1:-1:-1;;;;;16584:38:0;;16623:6;;16630:1;16623:9;;;;;;;;;;;;-1:-1:-1;30:25;;-1:-1;;100:14;96:29;;;92:49;68:74;;58:2;;156:1;153;146:12;58:2;16584:49:0;;-1:-1:-1;;;;;;16584:49:0;;;;;;;;;175:33:-1;;;;-1:-1;16584:49:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16584:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16584:49:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16584:49:0;;;;;;;;;16542:91;;16648:33;16684:69;16715:9;:37;;;16684:6;;16691:1;16684:9;;;;;;;;;;;;-1:-1:-1;30:25;;-1:-1;;100:14;96:29;;;92:49;68:74;;58:2;;156:1;153;146:12;58:2;175:33;;;16684:26:0;;;;;-1:-1:-1;16684:30:0;:69::i;:::-;16648:105;;16880:15;16912:10;-1:-1:-1;;;;;16898:35:0;;16934:6;;16941:1;16934:9;;;;;;;;;;;;-1:-1:-1;30:25;;-1:-1;;100:14;96:29;;;92:49;68:74;;58:2;;156:1;153;146:12;58:2;16934:22:0;;175:33:-1;16934:22:0;;;;-1:-1:-1;16934:22:0;;;16898:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16898:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16898:59:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16898:59:0;;;;;;;;;16880:77;;16976:17;17010:10;-1:-1:-1;;;;;16996:35:0;;17032:6;;17039:1;17032:9;;;;;;;;;;;;-1:-1:-1;30:25;;-1:-1;;100:14;96:29;;;92:49;68:74;;58:2;;156:1;153;146:12;58:2;17032:22:0;;175:33:-1;17032:22:0;;;;-1:-1:-1;17032:22:0;;;17056:13;16996:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16996:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16996:74:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16996:74:0;;;;;;;;;16976:94;;17089:28;17133:7;17121:9;:19;17120:43;;17156:7;17120:43;;;17144:9;17120:43;17089:74;;17182:28;17213:84;17270:6;;17277:1;17270:9;;;;;;;;;;;;-1:-1:-1;30:25;;-1:-1;;100:14;96:29;;;92:49;68:74;;58:2;;156:1;153;146:12;58:2;189:18;179:8;175:33;163:45;;0:211;17270:9:0;:26;;;17213:52;17238:6;;17245:1;17238:9;;;;;;;;;;;;-1:-1:-1;30:25;;-1:-1;;100:14;96:29;;;92:49;68:74;;58:2;;156:1;153;146:12;58:2;17213:20:0;;175:33:-1;17238:26:0;;;;-1:-1:-1;17213:24:0;:52::i;:84::-;17182:115;;17345:25;17322:20;:48;17318:145;;;17423:20;17395:48;;17318:145;16097:1805;;;;17494:19;17545:20;17517:25;:48;17516:101;;17597:20;17516:101;;;17569:25;17516:101;17494:123;;17634:43;;:::i;:::-;17693:11;-1:-1:-1;;;;;17680:42:0;;17741:6;;17748:1;17741:9;;;;;;;;;;;;-1:-1:-1;30:25;;-1:-1;;100:14;96:29;;;92:49;68:74;;58:2;;156:1;153;146:12;58:2;175:33;;;;;-1:-1;17769:11:0;17799:10;;17810:1;17799:13;;;;;;;;;;;;-1:-1:-1;30:25;;-1:-1;;100:14;96:29;;;92:48;68:73;;58:2;;155:1;152;145:12;58:2;174:33;;;69:4;55:19;;;-1:-1;16:22;-1:-1;;;;;82:30;;79:2;;;125:1;122;115:12;79:2;155:14;151:37;;;137:52;;134:2;;;202:1;199;192:12;134:2;17680:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17680:147:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17680:147:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17680:147:0;;;;;;;;;17634:193;;17844:46;17860:16;17878:11;17844:15;:46::i;:::-;-1:-1:-1;;16133:3:0;;;;;-1:-1:-1;16097:1805:0;;-1:-1:-1;;16097:1805:0;;-1:-1:-1;15747:2198:0;;;;;;;;;;:::o;5837:471::-;5895:7;6140:6;6136:47;;-1:-1:-1;6170:1:0;6163:8;;6136:47;6207:5;;;6211:1;6207;:5;:1;6231:5;;;;;:10;6223:56;;;;-1:-1:-1;;;6223:56:0;;;;;;;;;6299:1;-1:-1:-1;5837:471:0;;;;;:::o;6776:333::-;6834:7;6933:1;6929;:5;6921:44;;;;-1:-1:-1;;;6921:44:0;;;;;;;;;6976:9;6992:1;6988;:5;;;;;;;6776:333;-1:-1:-1;;;;6776:333:0:o;5402:184::-;5460:7;5493:1;5488;:6;;5480:49;;;;-1:-1:-1;;;5480:49:0;;;;;;;;;-1:-1:-1;5552:5:0;;;5402:184::o;25158:202::-;-1:-1:-1;;;;;25250:21:0;;;;;;:45;;-1:-1:-1;;;;;;25275:20:0;;24397:42;25275:20;;25250:45;25246:107;;;25312:29;-1:-1:-1;;;;;25312:17:0;;25330:2;25334:6;25312:29;:17;:29;:::i;:::-;25158:202;;;:::o;9862:229::-;-1:-1:-1;;;;;9936:22:0;;9928:73;;;;-1:-1:-1;;;9928:73:0;;;;;;;;;10038:6;;;10017:38;;-1:-1:-1;;;;;10017:38:0;;;;10038:6;;;10017:38;;;10066:6;:17;;-1:-1:-1;;;;;;10066:17:0;-1:-1:-1;;;;;10066:17:0;;;;;;;;;;9862:229::o;363:955::-;503:11;596:13;592:74;;649:5;637:9;:17;626:28;;592:74;715:4;709:11;849:2;843:4;839:13;1211:1;1191;1082:10;1052;1049:1;1045:18;1021:5;991:11;964:8;941:359;931:369;685:626;-1:-1:-1;;;;;;;;;685:626:0:o;26000:261::-;26078:7;-1:-1:-1;;;;;26102:21:0;;;;:45;;-1:-1:-1;;;;;;26127:20:0;;24397:42;26127:20;26102:45;26098:156;;;-1:-1:-1;;;;;;26171:11:0;;;26164:18;;26098:156;26222:20;;-1:-1:-1;;;26222:20:0;;-1:-1:-1;;;;;26222:15:0;;;;;:20;;26238:3;;26222:20;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26222:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26222:20:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;26222:20:0;;;;;;;;;26215:27;;;;24449:140;24538:43;24556:5;24563:2;24567:6;24575:5;24538:17;:43::i;:::-;;24449:140;;;:::o;30456:1042::-;30640:21;30672:19;30735:16;30719:12;:32;30715:89;;-1:-1:-1;30776:12:0;;-1:-1:-1;30790:1:0;30768:24;;30715:89;30816:17;30836:54;30884:5;30836:43;30875:3;;30836:34;30853:16;30836:12;:16;;:34;;;;:::i;:54::-;30816:74;-1:-1:-1;;;;;;30907:22:0;;;;;;:48;;-1:-1:-1;;;;;;30933:22:0;;30945:10;30933:22;;30907:48;:73;;;;-1:-1:-1;;;;;;30959:21:0;;30971:9;30959:21;;30907:73;30903:403;;;31011:17;:9;31025:2;31011:17;:13;:17;:::i;:::-;30997:31;-1:-1:-1;31047:54:0;-1:-1:-1;;;;;31047:25:0;;31073:8;30997:31;31096:4;31047:54;:25;:54;:::i;:::-;31043:252;;;31137:29;:12;31154:11;31137:29;:16;:29;:::i;:::-;31122:44;-1:-1:-1;31197:26:0;:9;31211:11;31197:26;:13;:26;:::i;:::-;31185:38;;31043:252;;;31278:1;31264:15;;31043:252;31322:51;31348:7;:5;:7::i;:::-;-1:-1:-1;;;;;31322:25:0;;;31357:9;31368:4;31322:51;:25;:51;:::i;:::-;31318:126;;;31405:27;:12;31422:9;31405:27;:16;:27;:::i;:::-;31390:42;;31318:126;-1:-1:-1;31464:12:0;;-1:-1:-1;30456:1042:0;;;;;;;;:::o;17953:688::-;18238:40;;18194:39;;:85;;;:43;:85;:::i;:::-;18152:127;;18376:40;;;;;18332:39;;;;:85;;;:43;:85;:::i;:::-;18290:39;;;:127;18494:30;;;;;18460:29;;;;:65;;;:33;:65;:::i;:::-;18428:29;;;:97;18602:30;;;;;18568:29;;;;:65;;;:33;:65;:::i;:::-;18536:29;;;;:97;;;;-1:-1:-1;17953:688:0:o;21429:621::-;21799:10;;;21798:62;;-1:-1:-1;21815:39:0;;-1:-1:-1;;;21815:39:0;;-1:-1:-1;;;;;21815:15:0;;;;;:39;;21839:4;;21846:7;;21815:39;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21815:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21815:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21815:39:0;;;;;;;;;:44;21798:62;21790:152;;;;-1:-1:-1;;;21790:152:0;;;;;;;;;21979:62;;21953:89;;21972:5;;-1:-1:-1;;;22002:22:0;21979:62;;22026:7;;22035:5;;21979:62;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;21979:62:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;21979:62:0;;;179:29:-1;;;;160:49;;;21953:18:0;:89::i;24597:553::-;24697:4;24718:11;24714:55;;-1:-1:-1;24753:4:0;24746:11;;24714:55;-1:-1:-1;;;;;24785:21:0;;;;:45;;-1:-1:-1;;;;;;24810:20:0;;24397:42;24810:20;24785:45;24781:362;;;24851:7;24847:196;;;24886:33;;-1:-1:-1;;;;;24886:25:0;;;:33;;;;;24912:6;;24886:33;;;;24912:6;24886:25;:33;;;;;;;24879:40;;;;24847:196;24960:37;;-1:-1:-1;;;;;24960:29:0;;;:37;;;;;24990:6;;24960:37;;;;24990:6;24960:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24960:37:0;25023:4;25016:11;;;;24781:362;25075:30;-1:-1:-1;;;;;25075:18:0;;25094:2;25098:6;25075:30;:18;:30;:::i;:::-;-1:-1:-1;25127:4:0;24781:362;24597:553;;;;;;:::o;4946:181::-;5004:7;5036:5;;;5060:6;;;;5052:46;;;;-1:-1:-1;;;5052:46:0;;;;;;;;23027:1114;23631:27;23639:5;-1:-1:-1;;;;;23631:25:0;;:27::i;:::-;23623:71;;;;-1:-1:-1;;;23623:71:0;;;;;;;;;23768:12;23782:23;23817:5;-1:-1:-1;;;;;23809:19:0;23829:4;23809:25;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;23767:67:0;;;;23853:7;23845:52;;;;-1:-1:-1;;;23845:52:0;;;;;;;;;23914:17;;:21;23910:224;;24056:10;24045:30;;;;;;;;;;;;;;24037:85;;;;-1:-1:-1;;;24037:85:0;;;;;;;;21033:176;21142:58;;21116:85;;21135:5;;-1:-1:-1;;;21165:23:0;21142:58;;21190:2;;21194:5;;21142:58;;;;14042:422;14409:20;14448:8;;;14042:422::o;27203:4752::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;27203:4752:0;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;313:707;;430:3;423:4;415:6;411:17;407:27;397:2;;448:1;445;438:12;397:2;485:6;472:20;507:80;522:64;579:6;522:64;;;507:80;;;498:89;;604:5;629:6;622:5;615:21;659:4;651:6;647:17;637:27;;681:4;676:3;672:14;665:21;;734:6;781:3;773:4;765:6;761:17;756:3;752:27;749:36;746:2;;;798:1;795;788:12;746:2;823:1;808:206;833:6;830:1;827:13;808:206;;;891:3;913:37;946:3;934:10;913:37;;;901:50;;-1:-1;974:4;965:14;;;;993;;;;;855:1;848:9;808:206;;;812:14;390:630;;;;;;;;1044:359;;;1181:3;1174:4;1166:6;1162:17;1158:27;1148:2;;1199:1;1196;1189:12;1148:2;-1:-1;1219:20;;-1:-1;;;;;1248:30;;1245:2;;;1291:1;1288;1281:12;1245:2;1325:4;1317:6;1313:17;1301:29;;1376:3;1368:4;1360:6;1356:17;1346:8;1342:32;1339:41;1336:2;;;1393:1;1390;1383:12;1336:2;1141:262;;;;;;1451:788;;1601:3;1594:4;1586:6;1582:17;1578:27;1568:2;;1619:1;1616;1609:12;1568:2;1649:6;1643:13;1671:102;1686:86;1765:6;1686:86;;1671:102;1662:111;;1790:5;1815:6;1808:5;1801:21;1845:4;1837:6;1833:17;1823:27;;1867:4;1862:3;1858:14;1851:21;;1920:6;1967:3;1959:4;1951:6;1947:17;1942:3;1938:27;1935:36;1932:2;;;1984:1;1981;1974:12;1932:2;2009:1;1994:239;2019:6;2016:1;2013:13;1994:239;;;2077:3;2099:70;2165:3;2153:10;2099:70;;;2087:83;;-1:-1;2193:4;2184:14;;;;2221:4;2212:14;;;;;2041:1;2034:9;1994:239;;2699:732;;2834:3;2827:4;2819:6;2815:17;2811:27;2801:2;;2852:1;2849;2842:12;2801:2;2889:6;2876:20;2911:98;2926:82;3001:6;2926:82;;2911:98;3037:21;;;3081:4;3069:17;;;;2902:107;;-1:-1;3094:14;;3069:17;3189:1;3174:251;3199:6;3196:1;3193:13;3174:251;;;3282:3;3269:17;3261:6;3257:30;3306:55;3357:3;3345:10;3306:55;;;3294:68;;-1:-1;3385:4;3376:14;;;;3404;;;;;3221:1;3214:9;3174:251;;3457:707;;3574:3;3567:4;3559:6;3555:17;3551:27;3541:2;;3592:1;3589;3582:12;3541:2;3629:6;3616:20;3651:80;3666:64;3723:6;3666:64;;3651:80;3642:89;;3748:5;3773:6;3766:5;3759:21;3803:4;3795:6;3791:17;3781:27;;3825:4;3820:3;3816:14;3809:21;;3878:6;3925:3;3917:4;3909:6;3905:17;3900:3;3896:27;3893:36;3890:2;;;3942:1;3939;3932:12;3890:2;3967:1;3952:206;3977:6;3974:1;3971:13;3952:206;;;4035:3;4057:37;4090:3;4078:10;4057:37;;;4045:50;;-1:-1;4118:4;4109:14;;;;4137;;;;;3999:1;3992:9;3952:206;;4172:128;4247:13;;4265:30;4247:13;4265:30;;4307:134;4385:13;;4403:33;4385:13;4403:33;;4449:432;;4546:3;4539:4;4531:6;4527:17;4523:27;4513:2;;4564:1;4561;4554:12;4513:2;4601:6;4588:20;4623:60;4638:44;4675:6;4638:44;;4623:60;4614:69;;4703:6;4696:5;4689:21;4739:4;4731:6;4727:17;4772:4;4765:5;4761:16;4807:3;4798:6;4793:3;4789:16;4786:25;4783:2;;;4824:1;4821;4814:12;4783:2;4834:41;4868:6;4863:3;4858;4834:41;;;4506:375;;;;;;;;5338:158;5419:20;;5444:47;5419:20;5444:47;;5881:864;;6009:4;5997:9;5992:3;5988:19;5984:30;5981:2;;;6027:1;6024;6017:12;5981:2;6045:20;6060:4;6045:20;;;6036:29;-1:-1;6133:1;6164:60;6220:3;6200:9;6164:60;;;6140:85;;-1:-1;6304:2;6337:60;6393:3;6369:22;;;6337:60;;;6330:4;6323:5;6319:16;6312:86;6246:163;6467:2;6500:60;6556:3;6547:6;6536:9;6532:22;6500:60;;;6493:4;6486:5;6482:16;6475:86;6419:153;6630:2;6663:60;6719:3;6710:6;6699:9;6695:22;6663:60;;;6656:4;6649:5;6645:16;6638:86;6582:153;5975:770;;;;;6788:684;;6910:4;6898:9;6893:3;6889:19;6885:30;6882:2;;;6928:1;6925;6918:12;6882:2;6946:20;6961:4;6946:20;;;6937:29;-1:-1;7023:1;7054:58;7108:3;7088:9;7054:58;;;7030:83;;-1:-1;7179:2;7212:60;7268:3;7244:22;;;7212:60;;;7205:4;7198:5;7194:16;7187:86;7134:150;7357:2;7390:60;7446:3;7437:6;7426:9;7422:22;7390:60;;;7383:4;7376:5;7372:16;7365:86;7294:168;6876:596;;;;;8242:2204;;8349:5;8337:9;8332:3;8328:19;8324:31;8321:2;;;8368:1;8365;8358:12;8321:2;8386:21;8401:5;8386:21;;;8377:30;-1:-1;8465:1;8496:49;8541:3;8521:9;8496:49;;;8472:74;;-1:-1;8615:2;8648:49;8693:3;8669:22;;;8648:49;;;8641:4;8634:5;8630:16;8623:75;8567:142;8774:2;8807:49;8852:3;8843:6;8832:9;8828:22;8807:49;;;8800:4;8793:5;8789:16;8782:75;8719:149;8927:2;8960:49;9005:3;8996:6;8985:9;8981:22;8960:49;;;8953:4;8946:5;8942:16;8935:75;8878:143;9083:3;9117:49;9162:3;9153:6;9142:9;9138:22;9117:49;;;9110:4;9103:5;9099:16;9092:75;9031:147;9240:3;9274:49;9319:3;9310:6;9299:9;9295:22;9274:49;;;9267:4;9260:5;9256:16;9249:75;9188:147;9389:3;9423:49;9468:3;9459:6;9448:9;9444:22;9423:49;;;9416:4;9409:5;9405:16;9398:75;9345:139;9538:3;9572:49;9617:3;9608:6;9597:9;9593:22;9572:49;;;9565:4;9558:5;9554:16;9547:75;9494:139;9700:3;9735:49;9780:3;9771:6;9760:9;9756:22;9735:49;;;9727:5;9720;9716:17;9709:76;9643:153;9846:3;9881:49;9926:3;9917:6;9906:9;9902:22;9881:49;;;9873:5;9866;9862:17;9855:76;9806:136;10030:3;10019:9;10015:19;10002:33;-1:-1;;;;;10047:6;10044:30;10041:2;;;10087:1;10084;10077:12;10041:2;10123:54;10173:3;10164:6;10153:9;10149:22;10123:54;;;10115:5;10108;10104:17;10097:81;9952:237;10277:3;10266:9;10262:19;10249:33;-1:-1;;;;;10294:6;10291:30;10288:2;;;10334:1;10331;10324:12;10288:2;10370:54;10420:3;10411:6;10400:9;10396:22;10370:54;;;10362:5;10355;10351:17;10344:81;10199:237;8315:2131;;;;;10453:130;10520:20;;10545:33;10520:20;10545:33;;10731:130;10807:13;;10825:31;10807:13;10825:31;;10868:241;;10972:2;10960:9;10951:7;10947:23;10943:32;10940:2;;;10988:1;10985;10978:12;10940:2;11023:1;11040:53;11085:7;11065:9;11040:53;;11116:1235;;;;;;;;;11402:3;11390:9;11381:7;11377:23;11373:33;11370:2;;;11419:1;11416;11409:12;11370:2;11454:1;11471:53;11516:7;11496:9;11471:53;;;11461:63;;11433:97;11561:2;11579:53;11624:7;11615:6;11604:9;11600:22;11579:53;;;11569:63;;11540:98;11669:2;11687:53;11732:7;11723:6;11712:9;11708:22;11687:53;;;11677:63;;11648:98;11777:2;11795:53;11840:7;11831:6;11820:9;11816:22;11795:53;;;11785:63;;11756:98;11913:3;11902:9;11898:19;11885:33;-1:-1;;;;;11930:6;11927:30;11924:2;;;11970:1;11967;11960:12;11924:2;11998:100;12090:7;12081:6;12070:9;12066:22;11998:100;;;11988:110;;;;11864:240;12163:3;12152:9;12148:19;12135:33;-1:-1;;;;;12180:6;12177:30;12174:2;;;12220:1;12217;12210:12;12174:2;12248:87;12327:7;12318:6;12307:9;12303:22;12248:87;;;12238:97;;;;12114:227;11364:987;;;;;;;;;;;;12358:436;;12520:2;12508:9;12499:7;12495:23;12491:32;12488:2;;;12536:1;12533;12526:12;12488:2;12571:24;;-1:-1;;;;;12604:30;;12601:2;;;12647:1;12644;12637:12;12601:2;12667:111;12770:7;12761:6;12750:9;12746:22;12667:111;;12801:257;;12913:2;12901:9;12892:7;12888:23;12884:32;12881:2;;;12929:1;12926;12919:12;12881:2;12964:1;12981:61;13034:7;13014:9;12981:61;;13065:394;;;13200:2;13188:9;13179:7;13175:23;13171:32;13168:2;;;13216:1;13213;13206:12;13168:2;13251:1;13268:67;13327:7;13307:9;13268:67;;;13258:77;;13230:111;13372:2;13390:53;13435:7;13426:6;13415:9;13411:22;13390:53;;;13380:63;;13351:98;13162:297;;;;;;13466:1515;;;;;;;;;;;13800:3;13788:9;13779:7;13775:23;13771:33;13768:2;;;13817:1;13814;13807:12;13768:2;13852:1;13869:67;13928:7;13908:9;13869:67;;;13859:77;;13831:111;13973:2;13991:53;14036:7;14027:6;14016:9;14012:22;13991:53;;;13981:63;;13952:98;14081:2;14099:53;14144:7;14135:6;14124:9;14120:22;14099:53;;;14089:63;;14060:98;14189:2;14207:53;14252:7;14243:6;14232:9;14228:22;14207:53;;;14197:63;;14168:98;14325:3;14314:9;14310:19;14297:33;-1:-1;;;;;14342:6;14339:30;14336:2;;;14382:1;14379;14372:12;14336:2;14410:100;14502:7;14493:6;14482:9;14478:22;14410:100;;;14400:110;;;;14276:240;14575:3;14564:9;14560:19;14547:33;-1:-1;;;;;14592:6;14589:30;14586:2;;;14632:1;14629;14622:12;14586:2;14660:87;14739:7;14730:6;14719:9;14715:22;14660:87;;;14650:97;;;;14526:227;14784:3;14803:53;14848:7;14839:6;14828:9;14824:22;14803:53;;;14793:63;;14763:99;14893:3;14912:53;14957:7;14948:6;14937:9;14933:22;14912:53;;;14902:63;;14872:99;13762:1219;;;;;;;;;;;;;;14988:1957;;;;;;;;;;;15365:3;15353:9;15344:7;15340:23;15336:33;15333:2;;;15382:1;15379;15372:12;15333:2;15417:1;15434:67;15493:7;15473:9;15434:67;;;15424:77;;15396:111;15538:2;15556:67;15615:7;15606:6;15595:9;15591:22;15556:67;;;15546:77;;15517:112;15660:2;15678:53;15723:7;15714:6;15703:9;15699:22;15678:53;;;15668:63;;15639:98;15768:2;15786:53;15831:7;15822:6;15811:9;15807:22;15786:53;;;15776:63;;15747:98;15876:3;15895:53;15940:7;15931:6;15920:9;15916:22;15895:53;;;15885:63;;15855:99;15985:3;16004:61;16057:7;16048:6;16037:9;16033:22;16004:61;;;15994:71;;15964:107;16130:3;16119:9;16115:19;16102:33;-1:-1;;;;;16147:6;16144:30;16141:2;;;16187:1;16184;16177:12;16141:2;16207:78;16277:7;16268:6;16257:9;16253:22;16207:78;;;16197:88;;16081:210;16350:3;16339:9;16335:19;16322:33;-1:-1;;;;;16367:6;16364:30;16361:2;;;16407:1;16404;16397:12;16361:2;16427:62;16481:7;16472:6;16461:9;16457:22;16427:62;;;16417:72;;16301:194;16554:3;16543:9;16539:19;16526:33;-1:-1;;;;;16571:6;16568:30;16565:2;;;16611:1;16608;16601:12;16565:2;16631:78;16701:7;16692:6;16681:9;16677:22;16631:78;;;16621:88;;16505:210;16774:3;16763:9;16759:19;16746:33;-1:-1;;;;;16791:6;16788:30;16785:2;;;16831:1;16828;16821:12;16785:2;16851:78;16921:7;16912:6;16901:9;16897:22;16851:78;;16952:857;;;;;17184:3;17172:9;17163:7;17159:23;17155:33;17152:2;;;17201:1;17198;17191:12;17152:2;17236:1;17253:67;17312:7;17292:9;17253:67;;;17243:77;;17215:111;17357:2;17375:73;17440:7;17431:6;17420:9;17416:22;17375:73;;;17365:83;;17336:118;17485:2;17503:53;17548:7;17539:6;17528:9;17524:22;17503:53;;;17493:63;;17464:98;17621:2;17610:9;17606:18;17593:32;-1:-1;;;;;17637:6;17634:30;17631:2;;;17677:1;17674;17667:12;17631:2;17697:96;17785:7;17776:6;17765:9;17761:22;17697:96;;;17687:106;;17572:227;17146:663;;;;;;;;17816:267;;17933:2;17921:9;17912:7;17908:23;17904:32;17901:2;;;17949:1;17946;17939:12;17901:2;17984:1;18001:66;18059:7;18039:9;18001:66;;18090:320;;18233:3;18221:9;18212:7;18208:23;18204:33;18201:2;;;18250:1;18247;18240:12;18201:2;18285:1;18302:92;18386:7;18366:9;18302:92;;18417:315;;18558:2;18546:9;18537:7;18533:23;18529:32;18526:2;;;18574:1;18571;18564:12;18526:2;18609:1;18626:90;18708:7;18688:9;18626:90;;18739:263;;18854:2;18842:9;18833:7;18829:23;18825:32;18822:2;;;18870:1;18867;18860:12;18822:2;18905:1;18922:64;18978:7;18958:9;18922:64;;19010:197;;19131:70;19197:3;19189:6;19181;19131:70;;19216:265;;19347:94;19437:3;19429:6;19347:94;;;-1:-1;;19470:4;19461:14;;19340:141;19490:233;;19629:88;19713:3;19705:6;19629:88;;;19615:102;19608:115;-1:-1;;;19608:115;19732:229;;19869:86;19951:3;19943:6;19869:86;;19969:142;20060:45;20099:5;20060:45;;;20055:3;20048:58;20042:69;;;20118:103;20191:24;20209:5;20191:24;;20375:903;;20541:91;20625:6;20620:3;20541:91;;;20534:98;;20655:3;20697:4;20689:6;20685:17;20680:3;20676:27;20724:65;20783:5;20724:65;;;20809:7;20837:1;20822:417;20847:6;20844:1;20841:13;20822:417;;;20909:9;20903:4;20899:20;20894:3;20887:33;20963:49;21005:6;20996:7;20963:49;;;21027:91;21113:4;21098:13;21083;21027:91;;;21019:99;;21135:69;21197:6;21135:69;;;21227:4;21218:14;;;;;21125:79;-1:-1;;;20869:1;20862:9;20822:417;;;-1:-1;21252:4;;20521:757;-1:-1;;;;;;;20521:757;21361:866;;21550:76;21620:5;21550:76;;;21639:108;21740:6;21735:3;21639:108;;;21632:115;;21768:78;21840:5;21768:78;;;21866:7;21894:1;21879:326;21904:6;21901:1;21898:13;21879:326;;;21971:6;21965:13;21992:107;22095:3;22080:13;21992:107;;;21985:114;;22116:82;22191:6;22116:82;;;22106:92;-1:-1;;21926:1;21919:9;21879:326;;;-1:-1;22218:3;;21529:698;-1:-1;;;;;21529:698;22302:977;;22494:104;22591:6;22586:3;22494:104;;;22487:111;;22621:3;22663:4;22655:6;22651:17;22646:3;22642:27;22690:78;22762:5;22690:78;;;22788:7;22816:1;22801:439;22826:6;22823:1;22820:13;22801:439;;;22888:9;22882:4;22878:20;22873:3;22866:33;22927:62;22982:6;22973:7;22927:62;;;23004:102;23101:4;23086:13;23004:102;;;22996:110;;23123:82;23198:6;23123:82;;;23228:4;23219:14;;;;;23113:92;-1:-1;;22848:1;22841:9;22801:439;;23354:992;;23535:72;23601:5;23535:72;;;23620:104;23717:6;23712:3;23620:104;;;23613:111;;23747:3;23789:4;23781:6;23777:17;23772:3;23768:27;23816:74;23884:5;23816:74;;;23910:7;23938:1;23923:384;23948:6;23945:1;23942:13;23923:384;;;24010:9;24004:4;24000:20;23995:3;23988:33;24055:6;24049:13;24077:100;24172:4;24157:13;24077:100;;;24069:108;;24194:78;24265:6;24194:78;;;24295:4;24286:14;;;;;24184:88;-1:-1;;23970:1;23963:9;23923:384;;24354:104;24431:21;24446:5;24431:21;;24465:103;24538:24;24556:5;24538:24;;24598:273;;24698:60;24751:6;24746:3;24698:60;;;24691:67;;24770:43;24806:6;24801:3;24794:5;24770:43;;;24835:29;24857:6;24835:29;;;24826:39;;;;24684:187;-1:-1;;;24684:187;25203:356;;25331:38;25363:5;25331:38;;;25381:88;25462:6;25457:3;25381:88;;;25374:95;;25474:52;25519:6;25514:3;25507:4;25500:5;25496:16;25474:52;;;25538:16;;;;;25311:248;-1:-1;;25311:248;25566:315;;25662:34;25690:5;25662:34;;;25708:60;25761:6;25756:3;25708:60;;;25701:67;;25773:52;25818:6;25813:3;25806:4;25799:5;25795:16;25773:52;;;25846:29;25868:6;25846:29;;25888:154;25985:51;26030:5;25985:51;;26225:364;;26385:67;26449:2;26444:3;26385:67;;;26485:66;26465:87;;26580:2;26571:12;;26371:218;-1:-1;;26371:218;26598:465;;26758:67;26822:2;26817:3;26758:67;;;26858:66;26838:87;;-1:-1;;;26954:2;26945:12;;26938:88;27054:2;27045:12;;26744:319;-1:-1;;26744:319;27072:364;;27232:67;27296:2;27291:3;27232:67;;;27332:66;27312:87;;27427:2;27418:12;;27218:218;-1:-1;;27218:218;27445:364;;27605:67;27669:2;27664:3;27605:67;;;27705:66;27685:87;;27800:2;27791:12;;27591:218;-1:-1;;27591:218;27818:364;;27978:67;28042:2;28037:3;27978:67;;;28078:66;28058:87;;28173:2;28164:12;;27964:218;-1:-1;;27964:218;28191:364;;28351:67;28415:2;28410:3;28351:67;;;28451:66;28431:87;;28546:2;28537:12;;28337:218;-1:-1;;28337:218;28564:364;;28724:67;28788:2;28783:3;28724:67;;;28824:66;28804:87;;28919:2;28910:12;;28710:218;-1:-1;;28710:218;28937:465;;29097:67;29161:2;29156:3;29097:67;;;29197:66;29177:87;;-1:-1;;;29293:2;29284:12;;29277:88;29393:2;29384:12;;29083:319;-1:-1;;29083:319;29411:364;;29571:67;29635:2;29630:3;29571:67;;;29671:66;29651:87;;29766:2;29757:12;;29557:218;-1:-1;;29557:218;29784:465;;29944:67;30008:2;30003:3;29944:67;;;30044:66;30024:87;;-1:-1;;;30140:2;30131:12;;30124:88;30240:2;30231:12;;29930:319;-1:-1;;29930:319;30258:364;;30418:67;30482:2;30477:3;30418:67;;;30518:66;30498:87;;30613:2;30604:12;;30404:218;-1:-1;;30404:218;30631:465;;30791:67;30855:2;30850:3;30791:67;;;30891:66;30871:87;;-1:-1;;;30987:2;30978:12;;30971:88;31087:2;31078:12;;30777:319;-1:-1;;30777:319;31105:364;;31265:67;31329:2;31324:3;31265:67;;;-1:-1;;;31345:87;;31460:2;31451:12;;31251:218;-1:-1;;31251:218;31478:465;;31638:67;31702:2;31697:3;31638:67;;;31738:66;31718:87;;-1:-1;;;31834:2;31825:12;;31818:88;31934:2;31925:12;;31624:319;-1:-1;;31624:319;31952:364;;32112:67;32176:2;32171:3;32112:67;;;32212:66;32192:87;;32307:2;32298:12;;32098:218;-1:-1;;32098:218;32397:840;32630:22;;32546:4;32537:14;;;32658:62;32541:3;32630:22;32658:62;;;32566:160;32817:4;32810:5;32806:16;32800:23;32829:63;32886:4;32881:3;32877:14;32863:12;32829:63;;;32736:162;32979:4;32972:5;32968:16;32962:23;32991:63;33048:4;33043:3;33039:14;33025:12;32991:63;;;32908:152;33141:4;33134:5;33130:16;33124:23;33153:63;33210:4;33205:3;33201:14;33187:12;33153:63;;33313:647;33517:22;;33444:4;33435:14;;;33545:58;33439:3;33517:22;33545:58;;;33464:145;33687:4;33680:5;33676:16;33670:23;33699:63;33756:4;33751:3;33747:14;33733:12;33699:63;;;33619:149;33864:4;33857:5;33853:16;33847:23;33876:63;33933:4;33928:3;33924:14;33910:12;33876:63;;34028:2671;;34161:5;34152:15;;34236:49;34273:5;;34236:49;;;34291:62;34343:3;34325:12;34291:62;;;34182:177;34423:50;34467:4;34460:5;34456:16;34449:5;34423:50;;;34479:63;34536:4;34531:3;34527:14;34513:12;34479:63;;;34369:179;34619:50;34663:4;34656:5;34652:16;34645:5;34619:50;;;34675:63;34732:4;34727:3;34723:14;34709:12;34675:63;;;34558:186;34809:50;34853:4;34846:5;34842:16;34835:5;34809:50;;;34865:63;34922:4;34917:3;34913:14;34899:12;34865:63;;;34754:180;35002:50;35046:4;35039:5;35035:16;35028:5;35002:50;;;35058:63;35115:4;35110:3;35106:14;35092:12;35058:63;;;34944:183;35195:50;35239:4;35232:5;35228:16;35221:5;35195:50;;;35251:63;35308:4;35303:3;35299:14;35285:12;35251:63;;;35137:183;35380:50;35424:4;35417:5;35413:16;35406:5;35380:50;;;35436:63;35493:4;35488:3;35484:14;35470:12;35436:63;;;35330:175;35565:50;35609:4;35602:5;35598:16;35591:5;35565:50;;;35621:63;35678:4;35673:3;35669:14;35655:12;35621:63;;;35515:175;35763:51;35807:5;35800;35796:17;35789:5;35763:51;;;35820:64;35877:5;35872:3;35868:15;35854:12;35820:64;;;35700:190;35946:51;35990:5;35983;35979:17;35972:5;35946:51;;;36003:64;36060:5;36055:3;36051:15;36037:12;36003:64;;;35900:173;36153:58;36204:5;36197;36193:17;36186:5;36153:58;;;36258:3;36252:4;36248:14;36240:5;36235:3;36231:15;36224:39;36278:83;36356:4;36342:12;36328;36278:83;;;36270:91;;36083:290;;36453:58;36504:5;36497;36493:17;36486:5;36453:58;;;36558:3;36552:4;36548:14;36540:5;36535:3;36531:15;36524:39;36578:83;36656:4;36642:12;36628;36578:83;;;36570:91;34134:2565;-1:-1;;;;;;34134:2565;39516:2271;39722:22;;39516:2271;;39647:5;39638:15;;;39750:62;39642:3;39722:22;39750:62;;;39668:150;39899:4;39892:5;39888:16;39882:23;39911:63;39968:4;39963:3;39959:14;39945:12;39911:63;;;39828:152;40068:4;40061:5;40057:16;40051:23;40080:63;40137:4;40132:3;40128:14;40114:12;40080:63;;;39990:159;40231:4;40224:5;40220:16;40214:23;40243:63;40300:4;40295:3;40291:14;40277:12;40243:63;;;40159:153;40397:4;40390:5;40386:16;40380:23;40409:63;40466:4;40461:3;40457:14;40443:12;40409:63;;;40322:156;40563:4;40556:5;40552:16;40546:23;40575:63;40632:4;40627:3;40623:14;40609:12;40575:63;;;40488:156;40721:4;40714:5;40710:16;40704:23;40733:63;40790:4;40785:3;40781:14;40767:12;40733:63;;;40654:148;40879:4;40872:5;40868:16;40862:23;40891:63;40948:4;40943:3;40939:14;40925:12;40891:63;;;40812:148;41050:5;41043;41039:17;41033:24;41063:64;41120:5;41115:3;41111:15;41097:12;41063:64;;;40970:163;41206:5;41199;41195:17;41189:24;41219:64;41276:5;41271:3;41267:15;41253:12;41219:64;;;41143:146;41372:5;41365;41361:17;41355:24;41426:3;41420:4;41416:14;41408:5;41403:3;41399:15;41392:39;41446:67;41508:4;41494:12;41446:67;;;41438:75;;41299:226;41608:5;41601;41597:17;41591:24;41662:3;41656:4;41652:14;41644:5;41639:3;41635:15;41628:39;41682:67;41744:4;41730:12;41682:67;;;41674:75;39620:2167;-1:-1;;;;;39620:2167;42024:97;42093:22;42109:5;42093:22;;42128:262;;42272:93;42361:3;42352:6;42272:93;;42397:213;42515:2;42500:18;;42529:71;42504:9;42573:6;42529:71;;42617:229;42743:2;42728:18;;42757:79;42732:9;42809:6;42757:79;;42853:340;43007:2;42992:18;;43021:79;42996:9;43073:6;43021:79;;;43111:72;43179:2;43168:9;43164:18;43155:6;43111:72;;43200:324;43346:2;43331:18;;43360:71;43335:9;43404:6;43360:71;;43531:1207;43959:3;43944:19;;43974:71;43948:9;44018:6;43974:71;;;44056:72;44124:2;44113:9;44109:18;44100:6;44056:72;;;44139;44207:2;44196:9;44192:18;44183:6;44139:72;;;44222;44290:2;44279:9;44275:18;44266:6;44222:72;;;44343:9;44337:4;44333:20;44327:3;44316:9;44312:19;44305:49;44368:156;44519:4;44510:6;44502;44368:156;;;44360:164;;44573:9;44567:4;44563:20;44557:3;44546:9;44542:19;44535:49;44598:130;44723:4;44714:6;44706;44598:130;;;44590:138;43930:808;-1:-1;;;;;;;;;;43930:808;44745:324;44891:2;44876:18;;44905:71;44880:9;44949:6;44905:71;;;44987:72;45055:2;45044:9;45040:18;45031:6;44987:72;;45076:449;45288:2;45302:47;;;45273:18;;45363:152;45273:18;45501:6;45363:152;;45532:433;45736:2;45750:47;;;45721:18;;45811:144;45721:18;45941:6;45811:144;;45972:201;46084:2;46069:18;;46098:65;46073:9;46136:6;46098:65;;46180:607;46412:3;46397:19;;46427:85;46401:9;46485:6;46427:85;;;46523:80;46599:2;46588:9;46584:18;46575:6;46523:80;;;46614;46690:2;46679:9;46675:18;46666:6;46614:80;;;46705:72;46773:2;46762:9;46758:18;46749:6;46705:72;;46794:603;47024:3;47009:19;;47039:85;47013:9;47097:6;47039:85;;;47135:86;47217:2;47206:9;47202:18;47193:6;47135:86;;;47232:72;47300:2;47289:9;47285:18;47276:6;47232:72;;47404:255;47543:2;47528:18;;47557:92;47532:9;47622:6;47557:92;;47666:407;47857:2;47871:47;;;47842:18;;47932:131;47842:18;47932:131;;48080:407;48271:2;48285:47;;;48256:18;;48346:131;48256:18;48346:131;;48494:407;48685:2;48699:47;;;48670:18;;48760:131;48670:18;48760:131;;48908:407;49099:2;49113:47;;;49084:18;;49174:131;49084:18;49174:131;;49322:407;49513:2;49527:47;;;49498:18;;49588:131;49498:18;49588:131;;49736:407;49927:2;49941:47;;;49912:18;;50002:131;49912:18;50002:131;;50150:407;50341:2;50355:47;;;50326:18;;50416:131;50326:18;50416:131;;50564:407;50755:2;50769:47;;;50740:18;;50830:131;50740:18;50830:131;;50978:407;51169:2;51183:47;;;51154:18;;51244:131;51154:18;51244:131;;51392:407;51583:2;51597:47;;;51568:18;;51658:131;51568:18;51658:131;;51806:407;51997:2;52011:47;;;51982:18;;52072:131;51982:18;52072:131;;52220:407;52411:2;52425:47;;;52396:18;;52486:131;52396:18;52486:131;;52634:407;52825:2;52839:47;;;52810:18;;52900:131;52810:18;52900:131;;53048:407;53239:2;53253:47;;;53224:18;;53314:131;53224:18;53314:131;;53462:407;53653:2;53667:47;;;53638:18;;53728:131;53638:18;53728:131;;53876:326;54050:3;54035:19;;54065:127;54039:9;54165:6;54065:127;;54209:345;54369:2;54383:47;;;54354:18;;54444:100;54354:18;54530:6;54444:100;;54561:663;54801:2;54815:47;;;54786:18;;54876:100;54786:18;54962:6;54876:100;;;54868:108;;54987:72;55055:2;55044:9;55040:18;55031:6;54987:72;;;55107:9;55101:4;55097:20;55092:2;55081:9;55077:18;55070:48;55132:82;55209:4;55200:6;55192;55132:82;;55231:213;55349:2;55334:18;;55363:71;55338:9;55407:6;55363:71;;55451:547;55653:3;55638:19;;55668:71;55642:9;55712:6;55668:71;;;55750:72;55818:2;55807:9;55803:18;55794:6;55750:72;;56005:256;56067:2;56061:9;56093:17;;;-1:-1;;;;;56153:34;;56189:22;;;56150:62;56147:2;;;56225:1;56222;56215:12;56147:2;56241;56234:22;56045:216;;-1:-1;56045:216;56268:304;;-1:-1;;;;;56419:6;56416:30;56413:2;;;56459:1;56456;56449:12;56413:2;-1:-1;56494:4;56482:17;;;56547:15;;56350:222;57552:317;;-1:-1;;;;;57683:6;57680:30;57677:2;;;57723:1;57720;57713:12;57677:2;-1:-1;57854:4;57790;57767:17;;;;-1:-1;;57763:33;57844:15;;57614:255;58204:125;58299:3;58285:44;58336:173;58482:4;58473:14;;58430:79;58837:159;58962:12;;58933:63;59949:183;60072:19;;;60121:4;60112:14;;60065:67;60887:144;61022:3;61000:31;-1:-1;61000:31;61212:119;;61286:39;61321:2;61316:3;61312:12;61307:3;61286:39;;61340:496;;;61447:17;;-1:-1;;61512:14;61508:29;;;61504:48;61480:73;;61470:2;;61567:1;61564;61557:12;61470:2;61586:33;;;61686:4;61675:16;;;-1:-1;61641:19;;-1:-1;;;;;;61700:30;;61697:2;;;61743:1;61740;61733:12;61697:2;61774:14;61770:37;;;61756:52;;61753:2;;;61821:1;61818;61811:12;61753:2;61414:422;;;;;;;61845:297;;61957:17;;-1:-1;;62022:14;62018:29;;;62014:49;61990:74;;61980:2;;62078:1;62075;62068:12;61980:2;62097:33;;;;61924:218;-1:-1;;61924:218;62151:119;;62225:39;62260:2;62255:3;62251:12;62246:3;62225:39;;62278:91;;62340:24;62358:5;62340:24;;62482:85;62548:13;62541:21;;62524:43;62653:105;;62729:24;62747:5;62729:24;;62994:121;-1:-1;;;;;63056:54;;63039:76;63201:81;63272:4;63261:16;;63244:38;63289:129;;63376:37;63407:5;63376:37;;64260:145;64341:6;64336:3;64331;64318:30;-1:-1;64397:1;64379:16;;64372:27;64311:94;64414:268;64479:1;64486:101;64500:6;64497:1;64494:13;64486:101;;;64567:11;;;64561:18;64548:11;;;64541:39;64522:2;64515:10;64486:101;;;64602:6;64599:1;64596:13;64593:2;;;-1:-1;;64667:1;64649:16;;64642:27;64463:219;64690:97;64778:2;64758:14;-1:-1;;64754:28;;64738:49;64795:117;64864:24;64882:5;64864:24;;;64857:5;64854:35;64844:2;;64903:1;64900;64893:12;65059:111;65125:21;65140:5;65125:21;;65177:117;65246:24;65264:5;65246:24;;65301:145;65384:38;65416:5;65384:38;;65891:113;65958:22;65974:5;65958:22;
Swarm Source
bzzr://e005115a269ff5c349553b71468dcd1821d809aac683b349abf11d6bdd092586
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.