Token Archerswap LPs

Overview ERC-20

Total Supply:
0.000007 Archer-LP

Holders:
2 addresses

Profile Summary

 
Contract:
0x87e3e808427f78f69f8daa5027abf8e2395c7fbe0x87E3e808427f78f69F8DaA5027aBF8e2395C7FBE

Decimals:
18
Balance
0.000000000000001 Archer-LP
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x623dfd0eda42aeb183dac70847db5bd5b51a0e9b

Contract Name:
ArcherswapPair

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-19
*/

// SPDX-License-Identifier: MIT

// Sources flattened with hardhat v2.12.7 https://hardhat.org

// File contracts/libraries/Context.sol



pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File contracts/libraries/Ownable.sol



pragma solidity >=0.6.0 <0.8.0;
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        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 virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File contracts/interfaces/IArcherswapFactory.sol



pragma solidity >=0.5.0;

interface IArcherswapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function expectPairFor(address token0, address token1) external view returns (address);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


// File contracts/libraries/Math.sol



pragma solidity >=0.5.16;

// a library for performing various math operations

library Math {
    function min(uint x, uint y) internal pure returns (uint z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}


// File contracts/libraries/SafeMath.sol



pragma solidity >=0.4.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, 'SafeMath: addition overflow');

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, 'SafeMath: subtraction overflow');
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, 'SafeMath: multiplication overflow');

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, 'SafeMath: division by zero');
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, 'SafeMath: modulo by zero');
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}


// File contracts/swap/Pair.sol



pragma solidity >=0.6.6;
interface IArcherswapERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}

contract ArcherswapERC20 is IArcherswapERC20 {
    using SafeMath for uint;

    string public override constant name = 'Archerswap LPs';
    string public override constant symbol = 'Archer-LP';
    uint8 public override constant decimals = 18;
    uint  public override totalSupply;
    mapping(address => uint) public override balanceOf;
    mapping(address => mapping(address => uint)) public override allowance;

    bytes32 public override DOMAIN_SEPARATOR;
    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public override constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
    mapping(address => uint) public override nonces;

    //event Approval(address indexed owner, address indexed spender, uint value);
    //event Transfer(address indexed from, address indexed to, uint value);

    constructor() public {
        uint chainId;
        assembly {
            chainId := chainid()
        }
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
                keccak256(bytes(name)),
                keccak256(bytes('1')),
                chainId,
                address(this)
            )
        );
    }

    function _mint(address to, uint value) internal {
        totalSupply = totalSupply.add(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint value) internal {
        balanceOf[from] = balanceOf[from].sub(value);
        totalSupply = totalSupply.sub(value);
        emit Transfer(from, address(0), value);
    }

    function _approve(address owner, address spender, uint value) private {
        allowance[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    function _transfer(address from, address to, uint value) private {
        balanceOf[from] = balanceOf[from].sub(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(from, to, value);
    }

    function approve(address spender, uint value) external override returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    function transfer(address to, uint value) external override returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(address from, address to, uint value) external override returns (bool) {
        if (allowance[from][msg.sender] != uint(-1)) {
            allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
        }
        _transfer(from, to, value);
        return true;
    }

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external override {
        require(deadline >= block.timestamp, 'Archerswap: EXPIRED');
        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR,
                keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress != address(0) && recoveredAddress == owner, 'Archerswap: INVALID_SIGNATURE');
        _approve(owner, spender, value);
    }
}

// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))
// range: [0, 2**112 - 1]
// resolution: 1 / 2**112
library UQ112x112 {
    uint224 constant Q112 = 2**112;

    // encode a uint112 as a UQ112x112
    function encode(uint112 y) internal pure returns (uint224 z) {
        z = uint224(y) * Q112; // never overflows
    }

    // divide a UQ112x112 by a uint112, returning a UQ112x112
    function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
        z = x / uint224(y);
    }
}

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

interface IArcherswapCallee {
    function archerswapCall(address sender, uint amount0, uint amount1, bytes calldata data) external;
}

contract ArcherswapPair is ArcherswapERC20 {
    using SafeMath  for uint;
    using UQ112x112 for uint224;

    uint public constant MINIMUM_LIQUIDITY = 10**3;
    bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));

    address public factory;
    address public token0;
    address public token1;

    uint112 private reserve0;           // uses single storage slot, accessible via getReserves
    uint112 private reserve1;           // uses single storage slot, accessible via getReserves
    uint32  private blockTimestampLast; // uses single storage slot, accessible via getReserves

    uint public price0CumulativeLast;
    uint public price1CumulativeLast;
    uint public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event

    uint private unlocked = 1;
    modifier lock() {
        require(unlocked == 1, 'Archerswap: LOCKED');
        unlocked = 0;
        _;
        unlocked = 1;
    }

    function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
        _reserve0 = reserve0;
        _reserve1 = reserve1;
        _blockTimestampLast = blockTimestampLast;
    }

    function _safeTransfer(address token, address to, uint value) private {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'Archerswap: TRANSFER_FAILED');
    }

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    constructor() public {
        factory = msg.sender;
    }

    // called once by the factory at time of deployment
    function initialize(address _token0, address _token1) external {
        require(msg.sender == factory, 'Archerswap: FORBIDDEN'); // sufficient check
        token0 = _token0;
        token1 = _token1;
    }

    // update reserves and, on the first call per block, price accumulators
    function _update(uint balance0, uint balance1, uint112 _reserve0, uint112 _reserve1) private {
        require(balance0 <= uint112(-1) && balance1 <= uint112(-1), 'Archerswap: OVERFLOW');
        uint32 blockTimestamp = uint32(block.timestamp % 2**32);
        uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired
        if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {
            // * never overflows, and + overflow is desired
            price0CumulativeLast += uint(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;
            price1CumulativeLast += uint(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;
        }
        reserve0 = uint112(balance0);
        reserve1 = uint112(balance1);
        blockTimestampLast = blockTimestamp;
        emit Sync(reserve0, reserve1);
    }

    // if fee is on, mint liquidity equivalent to 1/6th of the growth in sqrt(k)
    function _mintFee(uint112 _reserve0, uint112 _reserve1) private returns (bool feeOn) {
        address feeTo = IArcherswapFactory(factory).feeTo();
        feeOn = feeTo != address(0);
        uint _kLast = kLast; // gas savings
        if (feeOn) {
            if (_kLast != 0) {
                uint rootK = Math.sqrt(uint(_reserve0).mul(_reserve1));
                uint rootKLast = Math.sqrt(_kLast);
                if (rootK > rootKLast) {
                    uint numerator = totalSupply.mul(rootK.sub(rootKLast));
                    uint denominator = rootK.mul(1).add(rootKLast);
                    uint liquidity = numerator / denominator;
                    if (liquidity > 0) _mint(feeTo, liquidity);
                }
            }
        } else if (_kLast != 0) {
            kLast = 0;
        }
    }

    // this low-level function should be called from a contract which performs important safety checks
    function mint(address to) external lock returns (uint liquidity) {
        (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
        uint balance0 = IERC20(token0).balanceOf(address(this));
        uint balance1 = IERC20(token1).balanceOf(address(this));
        uint amount0 = balance0.sub(_reserve0);
        uint amount1 = balance1.sub(_reserve1);

        bool feeOn = _mintFee(_reserve0, _reserve1);
        uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        if (_totalSupply == 0) {
            liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
           _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
        } else {
            liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);
        }
        require(liquidity > 0, 'Archerswap: INSUFFICIENT_LIQUIDITY_MINTED');
        _mint(to, liquidity);

        _update(balance0, balance1, _reserve0, _reserve1);
        if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
        emit Mint(msg.sender, amount0, amount1);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function burn(address to) external lock returns (uint amount0, uint amount1) {
        (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
        address _token0 = token0;                                // gas savings
        address _token1 = token1;                                // gas savings
        uint balance0 = IERC20(_token0).balanceOf(address(this));
        uint balance1 = IERC20(_token1).balanceOf(address(this));
        uint liquidity = balanceOf[address(this)];

        bool feeOn = _mintFee(_reserve0, _reserve1);
        uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
        amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
        require(amount0 > 0 && amount1 > 0, 'Archerswap: INSUFFICIENT_LIQUIDITY_BURNED');
        _burn(address(this), liquidity);
        _safeTransfer(_token0, to, amount0);
        _safeTransfer(_token1, to, amount1);
        balance0 = IERC20(_token0).balanceOf(address(this));
        balance1 = IERC20(_token1).balanceOf(address(this));

        _update(balance0, balance1, _reserve0, _reserve1);
        if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
        emit Burn(msg.sender, amount0, amount1, to);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock {
        require(amount0Out > 0 || amount1Out > 0, 'Archerswap: INSUFFICIENT_OUTPUT_AMOUNT');
        (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
        require(amount0Out < _reserve0 && amount1Out < _reserve1, 'Archerswap: INSUFFICIENT_LIQUIDITY');

        uint balance0;
        uint balance1;
        { // scope for _token{0,1}, avoids stack too deep errors
        address _token0 = token0;
        address _token1 = token1;
        require(to != _token0 && to != _token1, 'Archerswap: INVALID_TO');
        if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens
        if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens
        if (data.length > 0) IArcherswapCallee(to).archerswapCall(msg.sender, amount0Out, amount1Out, data);
        balance0 = IERC20(_token0).balanceOf(address(this));
        balance1 = IERC20(_token1).balanceOf(address(this));
        }
        uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
        uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;
        require(amount0In > 0 || amount1In > 0, 'Archerswap: INSUFFICIENT_INPUT_AMOUNT');
        { // scope for reserve{0,1}Adjusted, avoids stack too deep errors
        uint balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(2));
        uint balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(2));
        require(balance0Adjusted.mul(balance1Adjusted) >= uint(_reserve0).mul(_reserve1).mul(1000**2), 'Archerswap: K');
        }

        _update(balance0, balance1, _reserve0, _reserve1);
        emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);
    }

    // force balances to match reserves
    function skim(address to) external lock {
        address _token0 = token0; // gas savings
        address _token1 = token1; // gas savings
        _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));
        _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));
    }

    // force reserves to match balances
    function sync() external lock {
        _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526001600c5534801561001557600080fd5b50604080518082018252600e81526d41726368657273776170204c507360901b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527ffefbe3098d4c22b50a0c77d40393c5465765f78c871d23e7850dbdac923157f6818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c09091019092528151910120600355600580546001600160a01b031916331790556122988061010c6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80636a627842116100f9578063ba9a7a5611610097578063d21220a711610071578063d21220a714610534578063d505accf1461053c578063dd62ed3e1461058d578063fff6cae9146105bb576101a9565b8063ba9a7a56146104fe578063bc25cf7714610506578063c45a01551461052c576101a9565b80637ecebe00116100d35780637ecebe001461046557806389afcb441461048b57806395d89b41146104ca578063a9059cbb146104d2576101a9565b80636a6278421461041157806370a08231146104375780637464fc3d1461045d576101a9565b806323b872dd116101665780633644e515116101405780633644e515146103cb578063485cc955146103d35780635909c0d5146104015780635a3d549314610409576101a9565b806323b872dd1461036f57806330adf81f146103a5578063313ce567146103ad576101a9565b8063022c0d9f146101ae57806306fdde031461023c5780630902f1ac146102b9578063095ea7b3146102f15780630dfe16811461033157806318160ddd14610355575b600080fd5b61023a600480360360808110156101c457600080fd5b8135916020810135916001600160a01b0360408301351691908101906080810160608201356401000000008111156101fb57600080fd5b82018360208201111561020d57600080fd5b8035906020019184600183028401116401000000008311171561022f57600080fd5b5090925090506105c3565b005b610244610ace565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561027e578181015183820152602001610266565b50505050905090810190601f1680156102ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102c1610af8565b604080516001600160701b03948516815292909316602083015263ffffffff168183015290519081900360600190f35b61031d6004803603604081101561030757600080fd5b506001600160a01b038135169060200135610b22565b604080519115158252519081900360200190f35b610339610b39565b604080516001600160a01b039092168252519081900360200190f35b61035d610b48565b60408051918252519081900360200190f35b61031d6004803603606081101561038557600080fd5b506001600160a01b03813581169160208101359091169060400135610b4e565b61035d610be2565b6103b5610c06565b6040805160ff9092168252519081900360200190f35b61035d610c0b565b61023a600480360360408110156103e957600080fd5b506001600160a01b0381358116916020013516610c11565b61035d610c96565b61035d610c9c565b61035d6004803603602081101561042757600080fd5b50356001600160a01b0316610ca2565b61035d6004803603602081101561044d57600080fd5b50356001600160a01b0316610f7f565b61035d610f91565b61035d6004803603602081101561047b57600080fd5b50356001600160a01b0316610f97565b6104b1600480360360208110156104a157600080fd5b50356001600160a01b0316610fa9565b6040805192835260208301919091528051918290030190f35b61024461133e565b61031d600480360360408110156104e857600080fd5b506001600160a01b038135169060200135611363565b61035d611370565b61023a6004803603602081101561051c57600080fd5b50356001600160a01b0316611376565b6103396114e9565b6103396114f8565b61023a600480360360e081101561055257600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611507565b61035d600480360360408110156105a357600080fd5b506001600160a01b038135811691602001351661170a565b61023a611727565b600c5460011461060f576040805162461bcd60e51b8152602060048201526012602482015271105c98da195c9cddd85c0e881313d0d2d15160721b604482015290519081900360640190fd5b6000600c55841515806106225750600084115b61065d5760405162461bcd60e51b81526004018080602001828103825260268152602001806121d56026913960400191505060405180910390fd5b600080610668610af8565b5091509150816001600160701b03168710801561068d5750806001600160701b031686105b6106c85760405162461bcd60e51b815260040180806020018281038252602281526020018061221c6022913960400191505060405180910390fd5b60065460075460009182916001600160a01b039182169190811690891682148015906107065750806001600160a01b0316896001600160a01b031614155b610750576040805162461bcd60e51b8152602060048201526016602482015275417263686572737761703a20494e56414c49445f544f60501b604482015290519081900360640190fd5b8a1561076157610761828a8d61188a565b891561077257610772818a8c61188a565b861561082457886001600160a01b031663e4dd2fec338d8d8c8c6040518663ffffffff1660e01b815260040180866001600160a01b03168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b505050505b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561086a57600080fd5b505afa15801561087e573d6000803e3d6000fd5b505050506040513d602081101561089457600080fd5b5051604080516370a0823160e01b815230600482015290519195506001600160a01b038316916370a0823191602480820192602092909190829003018186803b1580156108e057600080fd5b505afa1580156108f4573d6000803e3d6000fd5b505050506040513d602081101561090a57600080fd5b5051925060009150506001600160701b0385168a9003831161092d57600061093c565b89856001600160701b03160383035b9050600089856001600160701b0316038311610959576000610968565b89856001600160701b03160383035b905060008211806109795750600081115b6109b45760405162461bcd60e51b815260040180806020018281038252602581526020018061223e6025913960400191505060405180910390fd5b60006109d66109c4846002611a24565b6109d0876103e8611a24565b90611a84565b905060006109e86109c4846002611a24565b9050610a0d620f4240610a076001600160701b038b8116908b16611a24565b90611a24565b610a178383611a24565b1015610a5a576040805162461bcd60e51b815260206004820152600d60248201526c417263686572737761703a204b60981b604482015290519081900360640190fd5b5050610a6884848888611ac6565b60408051838152602081018390528082018d9052606081018c905290516001600160a01b038b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a350506001600c55505050505050505050565b6040518060400160405280600e81526020016d41726368657273776170204c507360901b81525081565b6008546001600160701b0380821692600160701b830490911691600160e01b900463ffffffff1690565b6000610b2f338484611c86565b5060015b92915050565b6006546001600160a01b031681565b60005481565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610bcd576001600160a01b0384166000908152600260209081526040808320338452909152902054610ba89083611a84565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b610bd8848484611ce8565b5060019392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b60035481565b6005546001600160a01b03163314610c68576040805162461bcd60e51b815260206004820152601560248201527420b931b432b939bbb0b81d102327a92124a22222a760591b604482015290519081900360640190fd5b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b60095481565b600a5481565b6000600c54600114610cf0576040805162461bcd60e51b8152602060048201526012602482015271105c98da195c9cddd85c0e881313d0d2d15160721b604482015290519081900360640190fd5b6000600c81905580610d00610af8565b50600654604080516370a0823160e01b815230600482015290519395509193506000926001600160a01b03909116916370a08231916024808301926020929190829003018186803b158015610d5457600080fd5b505afa158015610d68573d6000803e3d6000fd5b505050506040513d6020811015610d7e57600080fd5b5051600754604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610dd157600080fd5b505afa158015610de5573d6000803e3d6000fd5b505050506040513d6020811015610dfb57600080fd5b505190506000610e14836001600160701b038716611a84565b90506000610e2b836001600160701b038716611a84565b90506000610e398787611d96565b60005490915080610e7057610e5c6103e86109d0610e578787611a24565b611ed6565b9850610e6b60006103e8611f28565b610eb3565b610eb06001600160701b038916610e878684611a24565b81610e8e57fe5b046001600160701b038916610ea38685611a24565b81610eaa57fe5b04611fb2565b98505b60008911610ef25760405162461bcd60e51b81526004018080602001828103825260298152602001806121836029913960400191505060405180910390fd5b610efc8a8a611f28565b610f0886868a8a611ac6565b8115610f3257600854610f2e906001600160701b0380821691600160701b900416611a24565b600b555b6040805185815260208101859052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600c5550949695505050505050565b60016020526000908152604090205481565b600b5481565b60046020526000908152604090205481565b600080600c54600114610ff8576040805162461bcd60e51b8152602060048201526012602482015271105c98da195c9cddd85c0e881313d0d2d15160721b604482015290519081900360640190fd5b6000600c81905580611008610af8565b50600654600754604080516370a0823160e01b815230600482015290519496509294506001600160a01b039182169391169160009184916370a08231916024808301926020929190829003018186803b15801561106457600080fd5b505afa158015611078573d6000803e3d6000fd5b505050506040513d602081101561108e57600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156110dc57600080fd5b505afa1580156110f0573d6000803e3d6000fd5b505050506040513d602081101561110657600080fd5b5051306000908152600160205260408120549192506111258888611d96565b600054909150806111368487611a24565b8161113d57fe5b049a508061114b8486611a24565b8161115257fe5b04995060008b118015611165575060008a115b6111a05760405162461bcd60e51b81526004018080602001828103825260298152602001806121ac6029913960400191505060405180910390fd5b6111aa3084611fc8565b6111b5878d8d61188a565b6111c0868d8c61188a565b604080516370a0823160e01b815230600482015290516001600160a01b038916916370a08231916024808301926020929190829003018186803b15801561120657600080fd5b505afa15801561121a573d6000803e3d6000fd5b505050506040513d602081101561123057600080fd5b5051604080516370a0823160e01b815230600482015290519196506001600160a01b038816916370a0823191602480820192602092909190829003018186803b15801561127c57600080fd5b505afa158015611290573d6000803e3d6000fd5b505050506040513d60208110156112a657600080fd5b505193506112b685858b8b611ac6565b81156112e0576008546112dc906001600160701b0380821691600160701b900416611a24565b600b555b604080518c8152602081018c905281516001600160a01b038f169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a35050505050505050506001600c81905550915091565b6040518060400160405280600981526020016804172636865722d4c560bc1b81525081565b6000610b2f338484611ce8565b6103e881565b600c546001146113c2576040805162461bcd60e51b8152602060048201526012602482015271105c98da195c9cddd85c0e881313d0d2d15160721b604482015290519081900360640190fd5b6000600c55600654600754600854604080516370a0823160e01b815230600482015290516001600160a01b03948516949093169261146b9285928792611466926001600160701b03169185916370a0823191602480820192602092909190829003018186803b15801561143457600080fd5b505afa158015611448573d6000803e3d6000fd5b505050506040513d602081101561145e57600080fd5b505190611a84565b61188a565b6114df81846114666008600e9054906101000a90046001600160701b03166001600160701b0316856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561143457600080fd5b50506001600c5550565b6005546001600160a01b031681565b6007546001600160a01b031681565b42841015611552576040805162461bcd60e51b8152602060048201526013602482015272105c98da195c9cddd85c0e8811561412549151606a1b604482015290519081900360640190fd5b6003546001600160a01b0380891660008181526004602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa15801561166d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906116a35750886001600160a01b0316816001600160a01b0316145b6116f4576040805162461bcd60e51b815260206004820152601d60248201527f417263686572737761703a20494e56414c49445f5349474e4154555245000000604482015290519081900360640190fd5b6116ff898989611c86565b505050505050505050565b600260209081526000928352604080842090915290825290205481565b600c54600114611773576040805162461bcd60e51b8152602060048201526012602482015271105c98da195c9cddd85c0e881313d0d2d15160721b604482015290519081900360640190fd5b6000600c55600654604080516370a0823160e01b81523060048201529051611883926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156117c457600080fd5b505afa1580156117d8573d6000803e3d6000fd5b505050506040513d60208110156117ee57600080fd5b5051600754604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561183b57600080fd5b505afa15801561184f573d6000803e3d6000fd5b505050506040513d602081101561186557600080fd5b50516008546001600160701b0380821691600160701b900416611ac6565b6001600c55565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180516001600160e01b031663a9059cbb60e01b1781529251815160009460609489169392918291908083835b602083106119375780518252601f199092019160209182019101611918565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611999576040519150601f19603f3d011682016040523d82523d6000602084013e61199e565b606091505b50915091508180156119cc5750805115806119cc57508080602001905160208110156119c957600080fd5b50515b611a1d576040805162461bcd60e51b815260206004820152601b60248201527f417263686572737761703a205452414e534645525f4641494c45440000000000604482015290519081900360640190fd5b5050505050565b600082611a3357506000610b33565b82820282848281611a4057fe5b0414611a7d5760405162461bcd60e51b81526004018080602001828103825260218152602001806121fb6021913960400191505060405180910390fd5b9392505050565b6000611a7d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061205a565b6001600160701b038411801590611ae457506001600160701b038311155b611b2c576040805162461bcd60e51b8152602060048201526014602482015273417263686572737761703a204f564552464c4f5760601b604482015290519081900360640190fd5b60085463ffffffff42811691600160e01b90048116820390811615801590611b5c57506001600160701b03841615155b8015611b7057506001600160701b03831615155b15611bdb578063ffffffff16611b9885611b89866120f1565b6001600160e01b031690612103565b600980546001600160e01b03929092169290920201905563ffffffff8116611bc384611b89876120f1565b600a80546001600160e01b0392909216929092020190555b600880546dffffffffffffffffffffffffffff19166001600160701b03888116919091176dffffffffffffffffffffffffffff60701b1916600160701b8883168102919091176001600160e01b0316600160e01b63ffffffff871602179283905560408051848416815291909304909116602082015281517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1929181900390910190a1505050505050565b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316600090815260016020526040902054611d0b9082611a84565b6001600160a01b038085166000908152600160205260408082209390935590841681522054611d3a9082612128565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600080600560009054906101000a90046001600160a01b03166001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b158015611de757600080fd5b505afa158015611dfb573d6000803e3d6000fd5b505050506040513d6020811015611e1157600080fd5b5051600b546001600160a01b038216158015945091925090611ec2578015611ebd576000611e4e610e576001600160701b03888116908816611a24565b90506000611e5b83611ed6565b905080821115611eba576000611e7d611e748484611a84565b60005490611a24565b90506000611e9683611e90866001611a24565b90612128565b90506000818381611ea357fe5b0490508015611eb657611eb68782611f28565b5050505b50505b611ece565b8015611ece576000600b555b505092915050565b60006003821115611f19575080600160028204015b81811015611f1357809150600281828581611f0257fe5b040181611f0b57fe5b049050611eeb565b50611f23565b8115611f23575060015b919050565b600054611f359082612128565b60009081556001600160a01b038316815260016020526040902054611f5a9082612128565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000818310611fc15781611a7d565b5090919050565b6001600160a01b038216600090815260016020526040902054611feb9082611a84565b6001600160a01b038316600090815260016020526040812091909155546120129082611a84565b60009081556040805183815290516001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b600081848411156120e95760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156120ae578181015183820152602001612096565b50505050905090810190601f1680156120db5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160701b0316600160701b0290565b60006001600160701b0382166001600160e01b0384168161212057fe5b049392505050565b600082820183811015611a7d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fdfe417263686572737761703a20494e53554646494349454e545f4c49515549444954595f4d494e544544417263686572737761703a20494e53554646494349454e545f4c49515549444954595f4255524e4544417263686572737761703a20494e53554646494349454e545f4f55545055545f414d4f554e54536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77417263686572737761703a20494e53554646494349454e545f4c4951554944495459417263686572737761703a20494e53554646494349454e545f494e5055545f414d4f554e54a2646970667358221220d41633e7cef3b4772e214ae3efcc8cc6fa2e4343c2792bd232eef160aae441bb64736f6c634300060c0033

Deployed ByteCode Sourcemap

17205:9687:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24403:1896;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24403:1896:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24403:1896:0;;-1:-1:-1;24403:1896:0;-1:-1:-1;24403:1896:0;:::i;:::-;;12212:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18213:231;;;:::i;:::-;;;;-1:-1:-1;;;;;18213:231:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14353:156;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14353:156:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;17501:21;;;:::i;:::-;;;;-1:-1:-1;;;;;17501:21:0;;;;;;;;;;;;;;12384:33;;;:::i;:::-;;;;;;;;;;;;;;;;14673:310;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14673:310:0;;;;;;;;;;;;;;;;;:::i;12712:117::-;;;:::i;12333:44::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12560:40;;;:::i;19274:211::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19274:211:0;;;;;;;;;;:::i;17852:32::-;;;:::i;17891:::-;;;:::i;21471:1241::-;;;;;;;;;;;;;;;;-1:-1:-1;21471:1241:0;-1:-1:-1;;;;;21471:1241:0;;:::i;12424:50::-;;;;;;;;;;;;;;;;-1:-1:-1;12424:50:0;-1:-1:-1;;;;;12424:50:0;;:::i;17930:17::-;;;:::i;12836:47::-;;;;;;;;;;;;;;;;-1:-1:-1;12836:47:0;-1:-1:-1;;;;;12836:47:0;;:::i;22824:1467::-;;;;;;;;;;;;;;;;-1:-1:-1;22824:1467:0;-1:-1:-1;;;;;22824:1467:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12274:52;;;:::i;14517:148::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14517:148:0;;;;;;;;:::i;17322:46::-;;;:::i;26348:334::-;;;;;;;;;;;;;;;;-1:-1:-1;26348:334:0;-1:-1:-1;;;;;26348:334:0;;:::i;17472:22::-;;;:::i;17529:21::-;;;:::i;14991:685::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14991:685:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12481:70::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12481:70:0;;;;;;;;;;:::i;26731:158::-;;;:::i;24403:1896::-;18103:8;;18115:1;18103:13;18095:44;;;;;-1:-1:-1;;;18095:44:0;;;;;;;;;;;;-1:-1:-1;;;18095:44:0;;;;;;;;;;;;;;;18161:1;18150:8;:12;24517:14;;;;:32:::1;;;24548:1;24535:10;:14;24517:32;24509:83;;;;-1:-1:-1::0;;;24509:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24604:17;24623::::0;24645:13:::1;:11;:13::i;:::-;24603:55;;;;;24705:9;-1:-1:-1::0;;;;;24692:22:0::1;:10;:22;:48;;;;;24731:9;-1:-1:-1::0;;;;;24718:22:0::1;:10;:22;24692:48;24684:95;;;;-1:-1:-1::0;;;24684:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24924:6;::::0;24959::::1;::::0;24792:13:::1;::::0;;;-1:-1:-1;;;;;24924:6:0;;::::1;::::0;24959;;::::1;::::0;24984:13;::::1;::::0;::::1;::::0;::::1;::::0;:30:::1;;;25007:7;-1:-1:-1::0;;;;;25001:13:0::1;:2;-1:-1:-1::0;;;;;25001:13:0::1;;;24984:30;24976:65;;;::::0;;-1:-1:-1;;;24976:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24976:65:0;;;;;;;;;;;;;::::1;;25056:14:::0;;25052:58:::1;;25072:38;25086:7;25095:2;25099:10;25072:13;:38::i;:::-;25159:14:::0;;25155:58:::1;;25175:38;25189:7;25198:2;25202:10;25175:13;:38::i;:::-;25262:15:::0;;25258:99:::1;;25297:2;-1:-1:-1::0;;;;;25279:36:0::1;;25316:10;25328;25340;25352:4;;25279:78;;;;;;;;;;;;;-1:-1:-1::0;;;;;25279:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25258:99;25379:40;::::0;;-1:-1:-1;;;25379:40:0;;25413:4:::1;25379:40;::::0;::::1;::::0;;;-1:-1:-1;;;;;25379:25:0;::::1;::::0;::::1;::::0;:40;;;;;::::1;::::0;;;;;;;;:25;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25379:40:0;25441::::1;::::0;;-1:-1:-1;;;25441:40:0;;25475:4:::1;25441:40;::::0;::::1;::::0;;;25379;;-1:-1:-1;;;;;;25441:25:0;::::1;::::0;::::1;::::0;:40;;;;;25379::::1;::::0;25441;;;;;;;;:25;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25441:40:0;;-1:-1:-1;25503:14:0::1;::::0;-1:-1:-1;;;;;;;25531:22:0;::::1;::::0;;::::1;25520:33:::0;::::1;:75;;25594:1;25520:75;;;25580:10;25568:9;-1:-1:-1::0;;;;;25568:22:0::1;;25556:8;:35;25520:75;25503:92;;25606:14;25646:10;25634:9;-1:-1:-1::0;;;;;25634:22:0::1;;25623:8;:33;:75;;25697:1;25623:75;;;25683:10;25671:9;-1:-1:-1::0;;;;;25671:22:0::1;;25659:8;:35;25623:75;25606:92;;25729:1;25717:9;:13;:30;;;;25746:1;25734:9;:13;25717:30;25709:80;;;;-1:-1:-1::0;;;25709:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25875:21;25899:40;25922:16;:9:::0;25936:1:::1;25922:13;:16::i;:::-;25899:18;:8:::0;25912:4:::1;25899:12;:18::i;:::-;:22:::0;::::1;:40::i;:::-;25875:64:::0;-1:-1:-1;25950:21:0::1;25974:40;25997:16;:9:::0;26011:1:::1;25997:13;:16::i;25974:40::-;25950:64:::0;-1:-1:-1;26075:43:0::1;26110:7;26075:30;-1:-1:-1::0;;;;;26075:15:0;;::::1;::::0;:30;::::1;:19;:30::i;:::-;:34:::0;::::1;:43::i;:::-;26033:38;:16:::0;26054;26033:20:::1;:38::i;:::-;:85;;26025:111;;;::::0;;-1:-1:-1;;;26025:111:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26025:111:0;;;;;;;;;;;;;::::1;;18173:1;;26160:49;26168:8;26178;26188:9;26199;26160:7;:49::i;:::-;26225:66;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26225:66:0;::::1;::::0;26230:10:::1;::::0;26225:66:::1;::::0;;;;;;;::::1;-1:-1:-1::0;;18196:1:0;18185:8;:12;-1:-1:-1;;;;;;;;;24403:1896:0:o;12212:55::-;;;;;;;;;;;;;;-1:-1:-1;;;12212:55:0;;;;:::o;18213:231::-;18346:8;;-1:-1:-1;;;;;18346:8:0;;;;-1:-1:-1;;;18377:8:0;;;;;;-1:-1:-1;;;18418:18:0;;;;;18213:231::o;14353:156::-;14426:4;14443:36;14452:10;14464:7;14473:5;14443:8;:36::i;:::-;-1:-1:-1;14497:4:0;14353:156;;;;;:::o;17501:21::-;;;-1:-1:-1;;;;;17501:21:0;;:::o;12384:33::-;;;;:::o;14673:310::-;-1:-1:-1;;;;;14781:15:0;;14760:4;14781:15;;;:9;:15;;;;;;;;14797:10;14781:27;;;;;;;;-1:-1:-1;;14781:39:0;14777:140;;-1:-1:-1;;;;;14867:15:0;;;;;;:9;:15;;;;;;;;14883:10;14867:27;;;;;;;;:38;;14899:5;14867:31;:38::i;:::-;-1:-1:-1;;;;;14837:15:0;;;;;;:9;:15;;;;;;;;14853:10;14837:27;;;;;;;:68;14777:140;14927:26;14937:4;14943:2;14947:5;14927:9;:26::i;:::-;-1:-1:-1;14971:4:0;14673:310;;;;;:::o;12712:117::-;12763:66;12712:117;:::o;12333:44::-;12375:2;12333:44;:::o;12560:40::-;;;;:::o;19274:211::-;19370:7;;-1:-1:-1;;;;;19370:7:0;19356:10;:21;19348:55;;;;;-1:-1:-1;;;19348:55:0;;;;;;;;;;;;-1:-1:-1;;;19348:55:0;;;;;;;;;;;;;;;19434:6;:16;;-1:-1:-1;;;;;19434:16:0;;;-1:-1:-1;;;;;;19434:16:0;;;;;;;19461:6;:16;;;;;;;;;;;19274:211::o;17852:32::-;;;;:::o;17891:::-;;;;:::o;21471:1241::-;21520:14;18103:8;;18115:1;18103:13;18095:44;;;;;-1:-1:-1;;;18095:44:0;;;;;;;;;;;;-1:-1:-1;;;18095:44:0;;;;;;;;;;;;;;;18161:1;18150:8;:12;;;18161:1;21589:13:::1;:11;:13::i;:::-;-1:-1:-1::0;21651:6:0::1;::::0;21644:39:::1;::::0;;-1:-1:-1;;;21644:39:0;;21677:4:::1;21644:39;::::0;::::1;::::0;;;21547:55;;-1:-1:-1;21547:55:0;;-1:-1:-1;21628:13:0::1;::::0;-1:-1:-1;;;;;21651:6:0;;::::1;::::0;21644:24:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;21651:6;21644:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21644:39:0;21717:6:::1;::::0;21710:39:::1;::::0;;-1:-1:-1;;;21710:39:0;;21743:4:::1;21710:39;::::0;::::1;::::0;;;21644;;-1:-1:-1;21694:13:0::1;::::0;-1:-1:-1;;;;;21717:6:0;;::::1;::::0;21710:24:::1;::::0;:39;;;;;21644::::1;::::0;21710;;;;;;;;21717:6;21710:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21710:39:0;;-1:-1:-1;21760:12:0::1;21775:23;:8:::0;-1:-1:-1;;;;;21775:23:0;::::1;:12;:23::i;:::-;21760:38:::0;-1:-1:-1;21809:12:0::1;21824:23;:8:::0;-1:-1:-1;;;;;21824:23:0;::::1;:12;:23::i;:::-;21809:38;;21860:10;21873:30;21882:9;21893;21873:8;:30::i;:::-;21914:17;21934:11:::0;21860:43;;-1:-1:-1;22038:17:0;22034:352:::1;;22084:54;17363:5;22084:31;22094:20;:7:::0;22106;22094:11:::1;:20::i;:::-;22084:9;:31::i;:54::-;22072:66;;22152:36;22166:1;17363:5;22152;:36::i;:::-;22034:352;;;22288:86;-1:-1:-1::0;;;;;22297:37:0;::::1;:25;:7:::0;22309:12;22297:11:::1;:25::i;:::-;:37;;;;;;-1:-1:-1::0;;;;;22336:37:0;::::1;:25;:7:::0;22348:12;22336:11:::1;:25::i;:::-;:37;;;;;;22288:8;:86::i;:::-;22276:98;;22034:352;22416:1;22404:9;:13;22396:67;;;;-1:-1:-1::0;;;22396:67:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22474:20;22480:2;22484:9;22474:5;:20::i;:::-;22507:49;22515:8;22525;22535:9;22546;22507:7;:49::i;:::-;22571:5;22567:47;;;22605:8;::::0;22586:28:::1;::::0;-1:-1:-1;;;;;22591:8:0;;::::1;::::0;-1:-1:-1;;;22605:8:0;::::1;;22586:18;:28::i;:::-;22578:5;:36:::0;22567:47:::1;22670:34;::::0;;;;;::::1;::::0;::::1;::::0;;;;;22675:10:::1;::::0;22670:34:::1;::::0;;;;;;::::1;-1:-1:-1::0;;18196:1:0;18185:8;:12;-1:-1:-1;21471:1241:0;;;-1:-1:-1;;;;;;21471:1241:0:o;12424:50::-;;;;;;;;;;;;;:::o;17930:17::-;;;;:::o;12836:47::-;;;;;;;;;;;;;:::o;22824:1467::-;22873:12;22887;18103:8;;18115:1;18103:13;18095:44;;;;;-1:-1:-1;;;18095:44:0;;;;;;;;;;;;-1:-1:-1;;;18095:44:0;;;;;;;;;;;;;;;18161:1;18150:8;:12;;;18161:1;22954:13:::1;:11;:13::i;:::-;-1:-1:-1::0;23011:6:0::1;::::0;23092::::1;::::0;23171:40:::1;::::0;;-1:-1:-1;;;23171:40:0;;23205:4:::1;23171:40;::::0;::::1;::::0;;;22912:55;;-1:-1:-1;22912:55:0;;-1:-1:-1;;;;;;23011:6:0;;::::1;::::0;23092;::::1;::::0;22993:15:::1;::::0;23011:6;;23171:25:::1;::::0;:40;;;;;::::1;::::0;;;;;;;;23011:6;23171:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23171:40:0;23238::::1;::::0;;-1:-1:-1;;;23238:40:0;;23272:4:::1;23238:40;::::0;::::1;::::0;;;23171;;-1:-1:-1;23222:13:0::1;::::0;-1:-1:-1;;;;;23238:25:0;::::1;::::0;::::1;::::0;:40;;;;;23171::::1;::::0;23238;;;;;;;:25;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23238:40:0;23324:4:::1;23289:14;23306:24:::0;;;:9:::1;23238:40;23306:24:::0;;;;;23238:40;;-1:-1:-1;23356:30:0::1;23365:9:::0;23376;23356:8:::1;:30::i;:::-;23397:17;23417:11:::0;23343:43;;-1:-1:-1;23417:11:0;23527:23:::1;:9:::0;23541:8;23527:13:::1;:23::i;:::-;:38;;;;;;::::0;-1:-1:-1;23660:12:0;23634:23:::1;:9:::0;23648:8;23634:13:::1;:23::i;:::-;:38;;;;;;23624:48;;23749:1;23739:7;:11;:26;;;;;23764:1;23754:7;:11;23739:26;23731:80;;;;-1:-1:-1::0;;;23731:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23822:31;23836:4;23843:9;23822:5;:31::i;:::-;23864:35;23878:7;23887:2;23891:7;23864:13;:35::i;:::-;23910;23924:7;23933:2;23937:7;23910:13;:35::i;:::-;23967:40;::::0;;-1:-1:-1;;;23967:40:0;;24001:4:::1;23967:40;::::0;::::1;::::0;;;-1:-1:-1;;;;;23967:25:0;::::1;::::0;::::1;::::0;:40;;;;;::::1;::::0;;;;;;;;:25;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23967:40:0;24029::::1;::::0;;-1:-1:-1;;;24029:40:0;;24063:4:::1;24029:40;::::0;::::1;::::0;;;23967;;-1:-1:-1;;;;;;24029:25:0;::::1;::::0;::::1;::::0;:40;;;;;23967::::1;::::0;24029;;;;;;;;:25;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24029:40:0;;-1:-1:-1;24082:49:0::1;24090:8:::0;24029:40;24110:9;24121;24082:7:::1;:49::i;:::-;24146:5;24142:47;;;24180:8;::::0;24161:28:::1;::::0;-1:-1:-1;;;;;24166:8:0;;::::1;::::0;-1:-1:-1;;;24180:8:0;::::1;;24161:18;:28::i;:::-;24153:5;:36:::0;24142:47:::1;24245:38;::::0;;;;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;24245:38:0;::::1;::::0;24250:10:::1;::::0;24245:38:::1;::::0;;;;;;;;;::::1;18173:1;;;;;;;;;18196::::0;18185:8;:12;;;;22824:1467;;;:::o;12274:52::-;;;;;;;;;;;;;;-1:-1:-1;;;12274:52:0;;;;:::o;14517:148::-;14586:4;14603:32;14613:10;14625:2;14629:5;14603:9;:32::i;17322:46::-;17363:5;17322:46;:::o;26348:334::-;18103:8;;18115:1;18103:13;18095:44;;;;;-1:-1:-1;;;18095:44:0;;;;;;;;;;;;-1:-1:-1;;;18095:44:0;;;;;;;;;;;;;;;18161:1;18150:8;:12;26417:6:::1;::::0;26467::::1;::::0;26571:8:::1;::::0;26526:40:::1;::::0;;-1:-1:-1;;;26526:40:0;;26560:4:::1;26526:40;::::0;::::1;::::0;;;-1:-1:-1;;;;;26417:6:0;;::::1;::::0;26467;;::::1;::::0;26499:82:::1;::::0;26417:6;;26522:2;;26526:54:::1;::::0;-1:-1:-1;;;;;26571:8:0::1;::::0;26417:6;;26526:25:::1;::::0;:40;;;;;::::1;::::0;;;;;;;;;26417:6;26526:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26526:40:0;;:44:::1;:54::i;:::-;26499:13;:82::i;:::-;26592;26606:7;26615:2;26619:54;26664:8;;;;;;;;;-1:-1:-1::0;;;;;26664:8:0::1;-1:-1:-1::0;;;;;26619:54:0::1;26626:7;-1:-1:-1::0;;;;;26619:25:0::1;;26653:4;26619:40;;;;;;;;;;;;;-1:-1:-1::0;;;;;26619:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;26592:82;-1:-1:-1::0;;18196:1:0;18185:8;:12;-1:-1:-1;26348:334:0:o;17472:22::-;;;-1:-1:-1;;;;;17472:22:0;;:::o;17529:21::-;;;-1:-1:-1;;;;;17529:21:0;;:::o;14991:685::-;15146:15;15134:8;:27;;15126:59;;;;;-1:-1:-1;;;15126:59:0;;;;;;;;;;;;-1:-1:-1;;;15126:59:0;;;;;;;;;;;;;;;15301:16;;-1:-1:-1;;;;;15397:13:0;;;15196:14;15397:13;;;:6;:13;;;;;;;;:15;;;;;;;;;15346:77;;12763:66;15346:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15336:88;;;;;;-1:-1:-1;;;15237:202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15213:237;;;;;;;;;15488:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15196:14;;15397:15;15488:26;;;;;-1:-1:-1;;15488:26:0;;;;;;;;;;15397:15;15488:26;;;;;;;;;;;;;;;-1:-1:-1;;15488:26:0;;-1:-1:-1;;15488:26:0;;;-1:-1:-1;;;;;;;15533:30:0;;;;;;:59;;;15587:5;-1:-1:-1;;;;;15567:25:0;:16;-1:-1:-1;;;;;15567:25:0;;15533:59;15525:101;;;;;-1:-1:-1;;;15525:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15637:31;15646:5;15653:7;15662:5;15637:8;:31::i;:::-;14991:685;;;;;;;;;:::o;12481:70::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;26731:158::-;18103:8;;18115:1;18103:13;18095:44;;;;;-1:-1:-1;;;18095:44:0;;;;;;;;;;;;-1:-1:-1;;;18095:44:0;;;;;;;;;;;;;;;18161:1;18150:8;:12;26787:6:::1;::::0;26780:39:::1;::::0;;-1:-1:-1;;;26780:39:0;;26813:4:::1;26780:39;::::0;::::1;::::0;;;26772:109:::1;::::0;-1:-1:-1;;;;;26787:6:0::1;::::0;26780:24:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;26787:6;26780:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26780:39:0;26828:6:::1;::::0;26821:39:::1;::::0;;-1:-1:-1;;;26821:39:0;;26854:4:::1;26821:39;::::0;::::1;::::0;;;-1:-1:-1;;;;;26828:6:0;;::::1;::::0;26821:24:::1;::::0;:39;;;;;26780::::1;::::0;26821;;;;;;;;26828:6;26821:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26821:39:0;26862:8:::1;::::0;-1:-1:-1;;;;;26862:8:0;;::::1;::::0;-1:-1:-1;;;26872:8:0;::::1;;26772:7;:109::i;:::-;18196:1:::0;18185:8;:12;26731:158::o;18452:288::-;17427:34;;;;;;;;;;;;;;;;;18580:43;;-1:-1:-1;;;;;18580:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18580:43:0;-1:-1:-1;;;18580:43:0;;;18569:55;;;;18534:12;;18548:17;;18569:10;;;18580:43;18569:55;;;18580:43;18569:55;;18580:43;18569:55;;;;;;;;;;-1:-1:-1;;18569:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18533:91;;;;18643:7;:57;;;;-1:-1:-1;18655:11:0;;:16;;:44;;;18686:4;18675:24;;;;;;;;;;;;;;;-1:-1:-1;18675:24:0;18655:44;18635:97;;;;;-1:-1:-1;;;18635:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18452:288;;;;;:::o;7198:471::-;7256:7;7501:6;7497:47;;-1:-1:-1;7531:1:0;7524:8;;7497:47;7568:5;;;7572:1;7568;:5;:1;7592:5;;;;;:10;7584:56;;;;-1:-1:-1;;;7584:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7660:1;7198:471;-1:-1:-1;;;7198:471:0:o;6274:136::-;6332:7;6359:43;6363:1;6366;6359:43;;;;;;;;;;;;;;;;;:3;:43::i;19570:861::-;-1:-1:-1;;;;;19682:23:0;;;;;:50;;-1:-1:-1;;;;;;19709:23:0;;;19682:50;19674:83;;;;;-1:-1:-1;;;19674:83:0;;;;;;;;;;;;-1:-1:-1;;;19674:83:0;;;;;;;;;;;;;;;19872:18;;19799:23;:15;:23;;;-1:-1:-1;;;19872:18:0;;;;19855:35;;;19928:15;;;;;;:33;;-1:-1:-1;;;;;;19947:14:0;;;;19928:33;:51;;;;-1:-1:-1;;;;;;19965:14:0;;;;19928:51;19924:336;;;20134:11;20081:64;;20086:44;20120:9;20086:27;20103:9;20086:16;:27::i;:::-;-1:-1:-1;;;;;20086:33:0;;;:44::i;:::-;20057:20;:88;;-1:-1:-1;;;;;20081:50:0;;;;:64;;;;20057:88;;;20184:64;;;20189:44;20223:9;20189:27;20206:9;20189:16;:27::i;:44::-;20160:20;:88;;-1:-1:-1;;;;;20184:50:0;;;;:64;;;;20160:88;;;19924:336;20270:8;:28;;-1:-1:-1;;20270:28:0;-1:-1:-1;;;;;20270:28:0;;;;;;;-1:-1:-1;;;;20309:28:0;-1:-1:-1;;;20309:28:0;;;;;;;;;-1:-1:-1;;;;;20348:35:0;-1:-1:-1;;;20348:35:0;;;;;;;;;20399:24;;;20404:8;;;20399:24;;20414:8;;;;;;;20399:24;;;;;;;;;;;;;;;;;19570:861;;;;;;:::o;13948:169::-;-1:-1:-1;;;;;14029:16:0;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;:33;;;14078:31;;;;;;;;;;;;;;;;;13948:169;;;:::o;14125:220::-;-1:-1:-1;;;;;14219:15:0;;;;;;:9;:15;;;;;;:26;;14239:5;14219:19;:26::i;:::-;-1:-1:-1;;;;;14201:15:0;;;;;;;:9;:15;;;;;;:44;;;;14272:13;;;;;;;:24;;14290:5;14272:17;:24::i;:::-;-1:-1:-1;;;;;14256:13:0;;;;;;;:9;:13;;;;;;;;;:40;;;;14312:25;;;;;;;14256:13;;14312:25;;;;;;;;;;;;;14125:220;;;:::o;20521:838::-;20594:10;20617:13;20652:7;;;;;;;;;-1:-1:-1;;;;;20652:7:0;-1:-1:-1;;;;;20633:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20633:35:0;20731:5;;-1:-1:-1;;;;;20687:19:0;;;;;;-1:-1:-1;20633:35:0;;-1:-1:-1;20731:5:0;20762:590;;20792:11;;20788:494;;20824:10;20837:41;20847:30;-1:-1:-1;;;;;20847:15:0;;;;:30;;:19;:30::i;20837:41::-;20824:54;;20897:14;20914:17;20924:6;20914:9;:17::i;:::-;20897:34;;20962:9;20954:5;:17;20950:317;;;20996:14;21013:37;21029:20;:5;21039:9;21029;:20::i;:::-;21013:11;;;:15;:37::i;:::-;20996:54;-1:-1:-1;21073:16:0;21092:27;21109:9;21092:12;:5;21102:1;21092:9;:12::i;:::-;:16;;:27::i;:::-;21073:46;;21142:14;21171:11;21159:9;:23;;;;;;;-1:-1:-1;21209:13:0;;21205:42;;21224:23;21230:5;21237:9;21224:5;:23::i;:::-;20950:317;;;;20788:494;;;20762:590;;;21303:11;;21299:53;;21339:1;21331:5;:9;21299:53;20521:838;;;;;;:::o;4582:303::-;4627:6;4654:1;4650;:5;4646:232;;;-1:-1:-1;4676:1:0;4709;4705;4701:5;;:9;4725:92;4736:1;4732;:5;4725:92;;;4762:1;4758:5;;4800:1;4795;4791;4787;:5;;;;;;:9;4786:15;;;;;;4782:19;;4725:92;;;4646:232;;;;4838:6;;4834:44;;-1:-1:-1;4865:1:0;4834:44;4582:303;;;:::o;13522:201::-;13595:11;;:22;;13611:5;13595:15;:22::i;:::-;13581:11;:36;;;-1:-1:-1;;;;;13644:13:0;;;;:9;:13;;;;;;:24;;13662:5;13644:17;:24::i;:::-;-1:-1:-1;;;;;13628:13:0;;;;;;:9;:13;;;;;;;;:40;;;;13684:31;;;;;;;13628:13;;;;13684:31;;;;;;;;;;13522:201;;:::o;4368:96::-;4420:6;4447:1;4443;:5;:13;;4455:1;4443:13;;;-1:-1:-1;4451:1:0;;4439:17;-1:-1:-1;4368:96:0:o;13731:209::-;-1:-1:-1;;;;;13810:15:0;;;;;;:9;:15;;;;;;:26;;13830:5;13810:19;:26::i;:::-;-1:-1:-1;;;;;13792:15:0;;;;;;:9;:15;;;;;:44;;;;13861:11;:22;;13877:5;13861:15;:22::i;:::-;13847:11;:36;;;13899:33;;;;;;;;-1:-1:-1;;;;;13899:33:0;;;;;;;;;;;;;13731:209;;:::o;6713:226::-;6833:7;6869:12;6861:6;;;;6853:29;;;;-1:-1:-1;;;6853:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6905:5:0;;;6713:226::o;15945:120::-;-1:-1:-1;;;;;16021:10:0;-1:-1:-1;;;16021:17:0;;15945:120::o;16136:108::-;16196:9;-1:-1:-1;;;;;16226:10:0;;-1:-1:-1;;;;;16222:14:0;;16226:10;16222:14;;;;;;16136:108;-1:-1:-1;;;16136:108:0:o;5810:181::-;5868:7;5900:5;;;5924:6;;;;5916:46;;;;;-1:-1:-1;;;5916:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://d41633e7cef3b4772e214ae3efcc8cc6fa2e4343c2792bd232eef160aae441bb
Loading