Contract 0x6d608c51c198c728c0a00bfdfa8fef5d57ff4424 2

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xea63994a6397aedea8ef565c8d9ae8e70ed0ffd163fb7656de748d2db954fd8dZap Out318695342022-08-14 5:33:46117 days 38 mins ago0x258c855f34875a29fcbed9bd1ed8958f157c8616 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.018660369709 33.471575213
0xef7f43e4bb62d38efff3f6cae15b78d7d016fd9e52cfd356e21e0a7f8df7b8b0Zap Out318695342022-08-14 5:33:46117 days 38 mins ago0x258c855f34875a29fcbed9bd1ed8958f157c8616 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.0193187221 34.652478481
0x151c822db17cd31fd949a5bb7306622150573b279b84bb49697ffe56d4d45d00Zap Out318684612022-08-14 4:50:28117 days 1 hr ago0x2b5fb453471de5c16d8e22922ab915a066e4d4cf IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.021504412845.6
0x433237608f5d93bc9592eb3a4e71d5821b2067c1b2b0e098df7ebabecaf2a837Zap Out317991612022-08-12 7:56:30118 days 22 hrs ago0xa729f614c9b4609ef53ab6a8fca0411abeb8efc6 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.019530310842.6
0xe894e0f215e84ee18969237127bebdfd87d209f1b7548d0356043e9c54c47458Zap Out317991302022-08-12 7:55:28118 days 22 hrs ago0xa729f614c9b4609ef53ab6a8fca0411abeb8efc6 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.018930724440.6
0x7521adfc813903bdb7f17b453f92af4195abb64c9e70dc0e23e6fb50fd1d488aZap Out2Pair Tok...317989342022-08-12 7:48:44118 days 22 hrs ago0xa729f614c9b4609ef53ab6a8fca0411abeb8efc6 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.012390568845.6
0xe47ef8f50861cbc40b533d07dca12318c6530ceeb383c5449fede9fd6c4bddf6Zap Out317988162022-08-12 7:44:40118 days 22 hrs ago0xa729f614c9b4609ef53ab6a8fca0411abeb8efc6 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.016393106435.8
0x5e1b605379479e5a7a44f4cd0f1d904ff3301432842e52deaf4c5f41ecbcf496Zap Out317342522022-08-10 14:21:22120 days 15 hrs ago0x2b5fb453471de5c16d8e22922ab915a066e4d4cf IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.124412781293
0xcc2938a21c94264887f999fb9ac88e4636c5c9aa2bdd6d62fbede816ccaf4f31Zap Out313775322022-08-01 2:57:40130 days 3 hrs ago0x2b5fb453471de5c16d8e22922ab915a066e4d4cf IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.023756548250.6
0x5cd6b6e441481d50d8c81c27068ab4b97f188b26bcdbf0aeaec02a2c522d0d4dZap Out309775102022-07-21 14:07:51140 days 16 hrs ago0x22d5d0d52cbf16d83f7c9cca59b6b3fc543f99a0 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.018979150746 39.748660666
0x55678f1ff818a861df59209db1b6028ab7761e97a9505585f0bba0d18ad0a9a9Zap Out309770332022-07-21 13:51:29140 days 16 hrs ago0xc087fb0b504561885d9813930591577a07197397 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.049306810256 105.176643038
0x7583fd1248a3c348ecfae9a7530aee16d5b6ae9d4fceaf16246f1986193abd28Zap Out309769602022-07-21 13:48:59140 days 16 hrs ago0x4e7b72e9f941e3e866753a8d737d8abb2bd5fb3a IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.080935698472 124.787920912
0x3d32ba81171b206fec4204ca8613af89e5b02842a0d30f03afcac58e559a6945Zap Out309768262022-07-21 13:44:19140 days 16 hrs ago0xec30bdec6eaf0864f7dc2db09ea3da90e1e6f7f7 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.055030840211 118.637000062
0x8b70a7873782c89209ff20b3fd474acd0877cfaf2d1de0a8d5e8a50d0c510858Zap Out309764792022-07-21 13:28:09140 days 16 hrs ago0x6e9a9176cec1a54d217bb00856c81f70938406b0 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.026822388 50.615441808
0xb12a545d24490eb6e7f5a7c76fffb8e1bf92f9f0fe3b29d79f684c8cadce20b1Zap Out309764122022-07-21 13:25:51140 days 16 hrs ago0x32e30d7f7bdbcec633be815bdded46a4a84441c0 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.039254620729 51.038356472
0x1817422e7aff580f4084b62e76490acc9c6a0a761f6ef73dade6e4310399dec2Zap Out309763142022-07-21 13:22:27140 days 16 hrs ago0xb2e7987fdfffec8f476421f63c4f2b866e83192c IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.019152216725 36.537480876
0x0d13cd8c3b2a15011e3260cc5f82fd7a657322f174f738119bb67a525ea2c2b3Zap Out309762622022-07-21 13:20:43140 days 16 hrs ago0x8e847ac17f867003cccda475e256d44c65fcb989 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.019176383176 43.478045288
0xdebd04eecf96d47c920b2f1bffa2905a25574d06201a0ef659cba5a09c87c234Zap Out309760852022-07-21 13:14:37140 days 16 hrs ago0xf27b9349a9b1a00d43f627b178e5f0bd1c736bd6 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.021089389137 39.860341379
0xdee374a1202ee40d327cb6746588c57a6dc01ee33279c388b32282544049351dZap Out309759732022-07-21 13:10:45140 days 17 hrs ago0xd3c5c581dcf61541c8990e24ef8fbea8656b001f IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.018459219893 41.775700483
0xf7afd948ba764889f8d45d72af3979da7dd3be97f97ac856acef7ff2fcd6a42bZap Out309758122022-07-21 13:05:15140 days 17 hrs ago0xfdcb12af7725256e30322697153c26def7888fb5 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.032693996244 63.333455202
0xbffe24d480342dbcb0efc3d1fec870755d919e0baa09f2bdd59ceb67dd729e9aZap Out309756912022-07-21 13:01:05140 days 17 hrs ago0x1090028a06fc63f25a1387727164066884ba748c IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.074716805027 159.380210214
0x4b888aeae54941c69e94297592795058a93a23011f34f11d1d9d770c864d6057Zap Out309756452022-07-21 12:58:21140 days 17 hrs ago0xde8b327f1ec27ce749ab5142d93f635471d582ba IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.059516025085 130.766801394
0x00eadca06d793b8ba9dd83031d479b542bf0a2497627fb346f177e9f8eacdc1cZap Out309644302022-07-21 5:36:16141 days 36 mins ago0xa2ccac08b70dcc0cd50fa9ffd81071f591c77749 IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.020524920324 30.000000475
0x45b9cca3d73d90f24805647f859709c687d0a34324b4466a774eb2103fdd3d57Zap Out309637332022-07-21 5:10:10141 days 1 hr ago0x38917f5963720a8ff8c75e8fad36bc793c95d11a IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.01393367522 32.01671696
0xf6144e7713e56d3739d352540300c96409261252a87ab21f16a82b02b593b9dcZap Out309634872022-07-21 4:55:18141 days 1 hr ago0x4177a5c0e2369f6830a4c3825afc8fb3dd47790d IN  Zapper.Fi: Quickswap Zap Out0 MATIC0.013600920652 30.00000144
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x00eadca06d793b8ba9dd83031d479b542bf0a2497627fb346f177e9f8eacdc1c309644302022-07-21 5:36:16141 days 36 mins ago Zapper.Fi: Quickswap Zap Out0xa2ccac08b70dcc0cd50fa9ffd81071f591c777490.325441470420675722 MATIC
0x00eadca06d793b8ba9dd83031d479b542bf0a2497627fb346f177e9f8eacdc1c309644302022-07-21 5:36:16141 days 36 mins ago 0x: Exchange Proxy Flash Wallet Zapper.Fi: Quickswap Zap Out0.162324463640891018 MATIC
0x00eadca06d793b8ba9dd83031d479b542bf0a2497627fb346f177e9f8eacdc1c309644302022-07-21 5:36:16141 days 36 mins ago 0x: Exchange Proxy Flash Wallet Zapper.Fi: Quickswap Zap Out0.163117006779784704 MATIC
0x45b9cca3d73d90f24805647f859709c687d0a34324b4466a774eb2103fdd3d57309637332022-07-21 5:10:10141 days 1 hr ago Zapper.Fi: Quickswap Zap Out0x38917f5963720a8ff8c75e8fad36bc793c95d11a27.073956222656309033 MATIC
0x45b9cca3d73d90f24805647f859709c687d0a34324b4466a774eb2103fdd3d57309637332022-07-21 5:10:10141 days 1 hr ago 0x: Exchange Proxy Flash Wallet Zapper.Fi: Quickswap Zap Out13.516624880818845856 MATIC
0x45b9cca3d73d90f24805647f859709c687d0a34324b4466a774eb2103fdd3d57309637332022-07-21 5:10:10141 days 1 hr ago Polygon: WMATIC Token Zapper.Fi: Quickswap Zap Out13.557331341837463177 MATIC
0x40182dfb5da57717fcb2e691c1f17f87fbdf520fa0a82aaa4bd8163f1af11af9309608522022-07-21 3:20:16141 days 2 hrs ago Zapper.Fi: Quickswap Zap Out0x488bbf7ae21d8082a202a34cccf2b84bce1d4a0c0.339650478162523179 MATIC
0x40182dfb5da57717fcb2e691c1f17f87fbdf520fa0a82aaa4bd8163f1af11af9309608522022-07-21 3:20:16141 days 2 hrs ago 0x: Exchange Proxy Flash Wallet Zapper.Fi: Quickswap Zap Out0.169018692230674931 MATIC
0x40182dfb5da57717fcb2e691c1f17f87fbdf520fa0a82aaa4bd8163f1af11af9309608522022-07-21 3:20:16141 days 2 hrs ago 0x: Exchange Proxy Flash Wallet Zapper.Fi: Quickswap Zap Out0.170631785931848248 MATIC
0xa993b96ccd0f0beefce8a4d58ac92aa1fe9b69586c3eba5ccb8eb08979af7ed7309445312022-07-20 17:19:37141 days 12 hrs ago Zapper.Fi: Quickswap Zap Out0x64aeb121fc52446a54f5ceec5cb029b0c638937b1.565038544151160475 MATIC
0xa993b96ccd0f0beefce8a4d58ac92aa1fe9b69586c3eba5ccb8eb08979af7ed7309445312022-07-20 17:19:37141 days 12 hrs ago 0x: Exchange Proxy Flash Wallet Zapper.Fi: Quickswap Zap Out0.781308993682381048 MATIC
0xa993b96ccd0f0beefce8a4d58ac92aa1fe9b69586c3eba5ccb8eb08979af7ed7309445312022-07-20 17:19:37141 days 12 hrs ago 0x: Exchange Proxy Flash Wallet Zapper.Fi: Quickswap Zap Out0.783729550468779427 MATIC
0xaa5fa599456f007a9d832a7bf59beac9de8b85cf84102d4dbf379d96c69db248309419702022-07-20 15:49:21141 days 14 hrs ago Zapper.Fi: Quickswap Zap Out0xca1fefc2209d28b39d8f8135e9c37fa4d0431ddb2.752095064594039244 MATIC
0xaa5fa599456f007a9d832a7bf59beac9de8b85cf84102d4dbf379d96c69db248309419702022-07-20 15:49:21141 days 14 hrs ago 0x: Exchange Proxy Flash Wallet Zapper.Fi: Quickswap Zap Out1.376553297988742026 MATIC
0xaa5fa599456f007a9d832a7bf59beac9de8b85cf84102d4dbf379d96c69db248309419702022-07-20 15:49:21141 days 14 hrs ago Polygon: WMATIC Token Zapper.Fi: Quickswap Zap Out1.375541766605297218 MATIC
0xd885d5f4d1930113c2751a9a4b3bcf88780cb45b271cefaad64bfef34c28190a309382492022-07-20 13:37:43141 days 16 hrs ago Zapper.Fi: Quickswap Zap Out0x30ad7e2b6cde7db98c8cc864853d80a69bf589d3144.321155671941148198 MATIC
0xd885d5f4d1930113c2751a9a4b3bcf88780cb45b271cefaad64bfef34c28190a309382492022-07-20 13:37:43141 days 16 hrs ago QuickSwap: Router Zapper.Fi: Quickswap Zap Out144.321155671941148198 MATIC
0x79189380392ccf68a7ffa965f10dd44646580d1f122d76f9d39dce3a2ef8d133309374112022-07-20 13:06:55141 days 17 hrs ago Zapper.Fi: Quickswap Zap Out0x2811034b8b10067f3a6e24402268d7e1609457ca10.873392827311816896 MATIC
0x79189380392ccf68a7ffa965f10dd44646580d1f122d76f9d39dce3a2ef8d133309374112022-07-20 13:06:55141 days 17 hrs ago 0x: Exchange Proxy Flash Wallet Zapper.Fi: Quickswap Zap Out5.443269918450546456 MATIC
0x79189380392ccf68a7ffa965f10dd44646580d1f122d76f9d39dce3a2ef8d133309374112022-07-20 13:06:55141 days 17 hrs ago 0x: Exchange Proxy Flash Wallet Zapper.Fi: Quickswap Zap Out5.43012290886127044 MATIC
0xcc94ba123157937ba4209620b0cdd2b5ac4e7d67ada6593ce3801bbbf80b79d3309286982022-07-20 7:53:53141 days 22 hrs ago Zapper.Fi: Quickswap Zap Out0xd5314c237d09576da8176d337ade1369e8e4f13b61.195805477074724352 MATIC
0xcc94ba123157937ba4209620b0cdd2b5ac4e7d67ada6593ce3801bbbf80b79d3309286982022-07-20 7:53:53141 days 22 hrs ago 0x: Exchange Proxy Flash Wallet Zapper.Fi: Quickswap Zap Out30.58747583966014245 MATIC
0xcc94ba123157937ba4209620b0cdd2b5ac4e7d67ada6593ce3801bbbf80b79d3309286982022-07-20 7:53:53141 days 22 hrs ago Polygon: WMATIC Token Zapper.Fi: Quickswap Zap Out30.608329637414581902 MATIC
0x48a317d9182957647b50d9393ba11db521fd603e1b8d2b52682e49500d71652a309284322022-07-20 7:42:37141 days 22 hrs ago Zapper.Fi: Quickswap Zap Out0x0e4296624c99e571c53eb69a98d0f21b64f6722b80.473205437607699617 MATIC
0x48a317d9182957647b50d9393ba11db521fd603e1b8d2b52682e49500d71652a309284322022-07-20 7:42:37141 days 22 hrs ago 0x: Exchange Proxy Flash Wallet Zapper.Fi: Quickswap Zap Out40.230246926286238473 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Quickswap_ZapOut_V2

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv2 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-06-10
*/

// ███████╗░█████╗░██████╗░██████╗░███████╗██████╗░░░░███████╗██╗
// ╚════██║██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔══██╗░░░██╔════╝██║
// ░░███╔═╝███████║██████╔╝██████╔╝█████╗░░██████╔╝░░░█████╗░░██║
// ██╔══╝░░██╔══██║██╔═══╝░██╔═══╝░██╔══╝░░██╔══██╗░░░██╔══╝░░██║
// ███████╗██║░░██║██║░░░░░██║░░░░░███████╗██║░░██║██╗██║░░░░░██║
// ╚══════╝╚═╝░░╚═╝╚═╝░░░░░╚═╝░░░░░╚══════╝╚═╝░░╚═╝╚═╝╚═╝░░░░░╚═╝
// Copyright (C) 2021 zapper

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// Visit <https://www.gnu.org/licenses/>for a copy of the GNU Affero General Public License

///@author Zapper
///@notice this contract removes liquidity from Quickswap pools on Polygon (Matic), receiving ETH, ERC20 or both.
// SPDX-License-Identifier: GPL-2.0 AND MIT

// File contracts/oz/0.8.0/utils/Context.sol


pragma solidity ^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 meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

// File contracts/oz/0.8.0/access/Ownable.sol


pragma solidity ^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() {
        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/oz/0.8.0/token/ERC20/IERC20.sol


pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

// File contracts/oz/0.8.0/utils/Address.sol


pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) =
            target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File contracts/oz/0.8.0/token/ERC20/utils/SafeERC20.sol


pragma solidity ^0.8.0;

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(
                oldAllowance >= value,
                "SafeERC20: decreased allowance below zero"
            );
            uint256 newAllowance = oldAllowance - 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. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata =
            address(token).functionCall(
                data,
                "SafeERC20: low-level call failed"
            );
        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

// File contracts/_base/ZapBaseV2.sol

pragma solidity ^0.8.0;

abstract contract ZapBaseV2 is Ownable {
    using SafeERC20 for IERC20;
    bool public stopped = false;

    // if true, goodwill is not deducted
    mapping(address => bool) public feeWhitelist;

    uint256 public goodwill;
    // % share of goodwill (0-100 %)
    uint256 affiliateSplit;
    // restrict affiliates
    mapping(address => bool) public affiliates;
    // affiliate => token => amount
    mapping(address => mapping(address => uint256)) public affiliateBalance;
    // token => amount
    mapping(address => uint256) public totalAffiliateBalance;
    // swapTarget => approval status
    mapping(address => bool) public approvedTargets;

    address internal constant ETHAddress =
        0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

    constructor(uint256 _goodwill, uint256 _affiliateSplit) {
        goodwill = _goodwill;
        affiliateSplit = _affiliateSplit;
    }

    // circuit breaker modifiers
    modifier stopInEmergency {
        if (stopped) {
            revert("Temporarily Paused");
        } else {
            _;
        }
    }

    function _getBalance(address token)
        internal
        view
        returns (uint256 balance)
    {
        if (token == address(0)) {
            balance = address(this).balance;
        } else {
            balance = IERC20(token).balanceOf(address(this));
        }
    }

    function _approveToken(address token, address spender) internal {
        IERC20 _token = IERC20(token);
        if (_token.allowance(address(this), spender) > 0) return;
        else {
            _token.safeApprove(spender, type(uint256).max);
        }
    }

    function _approveToken(
        address token,
        address spender,
        uint256 amount
    ) internal {
        IERC20(token).safeApprove(spender, 0);
        IERC20(token).safeApprove(spender, amount);
    }

    // - to Pause the contract
    function toggleContractActive() public onlyOwner {
        stopped = !stopped;
    }

    function set_feeWhitelist(address zapAddress, bool status)
        external
        onlyOwner
    {
        feeWhitelist[zapAddress] = status;
    }

    function set_new_goodwill(uint256 _new_goodwill) public onlyOwner {
        require(
            _new_goodwill >= 0 && _new_goodwill <= 100,
            "GoodWill Value not allowed"
        );
        goodwill = _new_goodwill;
    }

    function set_new_affiliateSplit(uint256 _new_affiliateSplit)
        external
        onlyOwner
    {
        require(
            _new_affiliateSplit <= 100,
            "Affiliate Split Value not allowed"
        );
        affiliateSplit = _new_affiliateSplit;
    }

    function set_affiliate(address _affiliate, bool _status)
        external
        onlyOwner
    {
        affiliates[_affiliate] = _status;
    }

    ///@notice Withdraw goodwill share, retaining affilliate share
    function withdrawTokens(address[] calldata tokens) external onlyOwner {
        for (uint256 i = 0; i < tokens.length; i++) {
            uint256 qty;

            if (tokens[i] == ETHAddress) {
                qty = address(this).balance - totalAffiliateBalance[tokens[i]];

                Address.sendValue(payable(owner()), qty);
            } else {
                qty =
                    IERC20(tokens[i]).balanceOf(address(this)) -
                    totalAffiliateBalance[tokens[i]];
                IERC20(tokens[i]).safeTransfer(owner(), qty);
            }
        }
    }

    ///@notice Withdraw affilliate share, retaining goodwill share
    function affilliateWithdraw(address[] calldata tokens) external {
        uint256 tokenBal;
        for (uint256 i = 0; i < tokens.length; i++) {
            tokenBal = affiliateBalance[msg.sender][tokens[i]];
            affiliateBalance[msg.sender][tokens[i]] = 0;
            totalAffiliateBalance[tokens[i]] =
                totalAffiliateBalance[tokens[i]] -
                tokenBal;

            if (tokens[i] == ETHAddress) {
                Address.sendValue(payable(msg.sender), tokenBal);
            } else {
                IERC20(tokens[i]).safeTransfer(msg.sender, tokenBal);
            }
        }
    }

    function setApprovedTargets(
        address[] calldata targets,
        bool[] calldata isApproved
    ) external onlyOwner {
        require(targets.length == isApproved.length, "Invalid Input length");

        for (uint256 i = 0; i < targets.length; i++) {
            approvedTargets[targets[i]] = isApproved[i];
        }
    }

    receive() external payable {
        require(msg.sender != tx.origin, "Do not send ETH directly");
    }
}

// File contracts/_base/ZapOutBaseV3.sol


pragma solidity ^0.8.0;

abstract contract ZapOutBaseV3 is ZapBaseV2 {
    using SafeERC20 for IERC20;

    /**
        @dev Transfer tokens from msg.sender to this contract
        @param token The ERC20 token to transfer to this contract
        @param shouldSellEntireBalance If True transfers entrire allowable amount from another contract
        @return Quantity of tokens transferred to this contract
     */
    function _pullTokens(
        address token,
        uint256 amount,
        bool shouldSellEntireBalance
    ) internal returns (uint256) {
        if (shouldSellEntireBalance) {
            require(
                Address.isContract(msg.sender),
                "ERR: shouldSellEntireBalance is true for EOA"
            );

            uint256 allowance =
                IERC20(token).allowance(msg.sender, address(this));
            IERC20(token).safeTransferFrom(
                msg.sender,
                address(this),
                allowance
            );

            return allowance;
        } else {
            IERC20(token).safeTransferFrom(msg.sender, address(this), amount);

            return amount;
        }
    }

    function _subtractGoodwill(
        address token,
        uint256 amount,
        address affiliate,
        bool enableGoodwill
    ) internal returns (uint256 totalGoodwillPortion) {
        bool whitelisted = feeWhitelist[msg.sender];
        if (enableGoodwill && !whitelisted && goodwill > 0) {
            totalGoodwillPortion = (amount * goodwill) / 10000;

            if (affiliates[affiliate]) {
                if (token == address(0)) {
                    token = ETHAddress;
                }

                uint256 affiliatePortion =
                    (totalGoodwillPortion * affiliateSplit) / 100;
                affiliateBalance[affiliate][token] += affiliatePortion;
                totalAffiliateBalance[token] += affiliatePortion;
            }
        }
    }
}

// File contracts/Polygon/QuickSwap/Quickswap_ZapOut_V2.sol

pragma solidity ^0.8.0;

interface IUniswapV2Factory {
    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);
}

interface IUniswapV2Router02 {
    function WETH() external pure returns (address);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);
}

interface IUniswapV2Pair {
    function token0() external pure returns (address);

    function token1() external pure returns (address);

    function balanceOf(address user) external view returns (uint256);

    function totalSupply() external view returns (uint256);

    function getReserves()
        external
        view
        returns (
            uint112 _reserve0,
            uint112 _reserve1,
            uint32 _blockTimestampLast
        );

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

interface IWETH {
    function withdraw(uint256 wad) external;
}

contract Quickswap_ZapOut_V2 is ZapOutBaseV3 {
    using SafeERC20 for IERC20;

    uint256 private constant deadline =
        0xf000000000000000000000000000000000000000000000000000000000000000;

    uint256 private constant permitAllowance = 79228162514260000000000000000;

    IUniswapV2Router02 private constant quickswapRouter =
        IUniswapV2Router02(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff);
    IUniswapV2Factory private constant quickswapFactory =
        IUniswapV2Factory(0x5757371414417b8C6CAad45bAeF941aBc7d3Ab32);

    address private constant wmaticTokenAddress =
        address(0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270);

    constructor(uint256 _goodwill, uint256 _affiliateSplit)
        ZapBaseV2(_goodwill, _affiliateSplit)
    {
        // 0x exchange
        approvedTargets[0xDef1C0ded9bec7F1a1670819833240f027b25EfF] = true;
    }

    event zapOut(
        address sender,
        address pool,
        address token,
        uint256 tokensRec
    );

    /**
        @notice Zap out in both tokens
        @param fromPoolAddress Pool from which to remove liquidity
        @param incomingLP Quantity of LP to remove from pool
        @param affiliate Affiliate address
        @return amountA Quantity of tokenA received after zapout
        @return amountB Quantity of tokenB received after zapout
    */
    function ZapOut2PairToken(
        address fromPoolAddress,
        uint256 incomingLP,
        address affiliate
    ) public stopInEmergency returns (uint256 amountA, uint256 amountB) {
        IUniswapV2Pair pair = IUniswapV2Pair(fromPoolAddress);

        require(address(pair) != address(0), "Pool Cannot be Zero Address");

        // get reserves
        address token0 = pair.token0();
        address token1 = pair.token1();

        IERC20(fromPoolAddress).safeTransferFrom(
            msg.sender,
            address(this),
            incomingLP
        );

        _approveToken(fromPoolAddress, address(quickswapRouter), incomingLP);

        if (token0 == wmaticTokenAddress || token1 == wmaticTokenAddress) {
            address _token = token0 == wmaticTokenAddress ? token1 : token0;
            (amountA, amountB) = quickswapRouter.removeLiquidityETH(
                _token,
                incomingLP,
                1,
                1,
                address(this),
                deadline
            );

            // subtract goodwill
            uint256 tokenGoodwill =
                _subtractGoodwill(_token, amountA, affiliate, true);
            uint256 ethGoodwill =
                _subtractGoodwill(ETHAddress, amountB, affiliate, true);

            // send tokens
            IERC20(_token).safeTransfer(msg.sender, amountA - tokenGoodwill);
            Address.sendValue(payable(msg.sender), amountB - ethGoodwill);
        } else {
            (amountA, amountB) = quickswapRouter.removeLiquidity(
                token0,
                token1,
                incomingLP,
                1,
                1,
                address(this),
                deadline
            );

            // subtract goodwill
            uint256 tokenAGoodwill =
                _subtractGoodwill(token0, amountA, affiliate, true);
            uint256 tokenBGoodwill =
                _subtractGoodwill(token1, amountB, affiliate, true);

            // send tokens
            IERC20(token0).safeTransfer(msg.sender, amountA - tokenAGoodwill);
            IERC20(token1).safeTransfer(msg.sender, amountB - tokenBGoodwill);
        }
        emit zapOut(msg.sender, fromPoolAddress, token0, amountA);
        emit zapOut(msg.sender, fromPoolAddress, token1, amountB);
    }

    /**
    @notice Zap out in a single token
    @param toTokenAddress Address of desired token
    @param fromPoolAddress Pool from which to remove liquidity
    @param incomingLP Quantity of LP to remove from pool
    @param minTokensRec Minimum quantity of tokens to receive
    @param swapTargets Execution targets for swaps
    @param swapData DEX swap data
    @param affiliate Affiliate address
    @param shouldSellEntireBalance If True transfers entrire allowable amount from another contract
    */
    function ZapOut(
        address toTokenAddress,
        address fromPoolAddress,
        uint256 incomingLP,
        uint256 minTokensRec,
        address[] memory swapTargets,
        bytes[] memory swapData,
        address affiliate,
        bool shouldSellEntireBalance
    ) public stopInEmergency returns (uint256 tokensRec) {
        (uint256 amount0, uint256 amount1) =
            _removeLiquidity(
                fromPoolAddress,
                incomingLP,
                shouldSellEntireBalance
            );

        //swaps tokens to token
        tokensRec = _swapTokens(
            fromPoolAddress,
            amount0,
            amount1,
            toTokenAddress,
            swapTargets,
            swapData
        );
        require(tokensRec >= minTokensRec, "High Slippage");

        uint256 totalGoodwillPortion;

        // transfer toTokens to sender
        if (toTokenAddress == address(0)) {
            totalGoodwillPortion = _subtractGoodwill(
                ETHAddress,
                tokensRec,
                affiliate,
                true
            );

            payable(msg.sender).transfer(tokensRec - totalGoodwillPortion);
        } else {
            totalGoodwillPortion = _subtractGoodwill(
                toTokenAddress,
                tokensRec,
                affiliate,
                true
            );

            IERC20(toTokenAddress).safeTransfer(
                msg.sender,
                tokensRec - totalGoodwillPortion
            );
        }

        tokensRec = tokensRec - totalGoodwillPortion;

        emit zapOut(msg.sender, fromPoolAddress, toTokenAddress, tokensRec);

        return tokensRec;
    }

    /**
    @notice Zap out in both tokens with permit
    @param fromPoolAddress Pool from which to remove liquidity
    @param incomingLP Quantity of LP to remove from pool
    @param affiliate Affiliate address to share fees
    @param permitSig Signature for permit
    @return amountA Quantity of tokenA received
    @return amountB Quantity of tokenB received
    */
    function ZapOut2PairTokenWithPermit(
        address fromPoolAddress,
        uint256 incomingLP,
        address affiliate,
        bytes calldata permitSig
    ) external stopInEmergency returns (uint256 amountA, uint256 amountB) {
        // permit
        _permit(fromPoolAddress, permitAllowance, permitSig);

        (amountA, amountB) = ZapOut2PairToken(
            fromPoolAddress,
            incomingLP,
            affiliate
        );
    }

    /**
    @notice Zap out in a single token with permit
    @param toTokenAddress Address of desired token
    @param fromPoolAddress Pool from which to remove liquidity
    @param incomingLP Quantity of LP to remove from pool
    @param minTokensRec Minimum quantity of tokens to receive
    @param permitSig Signature for permit
    @param swapTargets Execution targets for swaps
    @param swapData DEX swap data
    @param affiliate Affiliate address
    */
    function ZapOutWithPermit(
        address toTokenAddress,
        address fromPoolAddress,
        uint256 incomingLP,
        uint256 minTokensRec,
        bytes calldata permitSig,
        address[] memory swapTargets,
        bytes[] memory swapData,
        address affiliate
    ) public stopInEmergency returns (uint256) {
        // permit
        _permit(fromPoolAddress, permitAllowance, permitSig);

        return (
            ZapOut(
                toTokenAddress,
                fromPoolAddress,
                incomingLP,
                minTokensRec,
                swapTargets,
                swapData,
                affiliate,
                false
            )
        );
    }

    function _permit(
        address fromPoolAddress,
        uint256 amountIn,
        bytes memory permitSig
    ) internal {
        require(permitSig.length == 65, "Invalid signature length");

        bytes32 r;
        bytes32 s;
        uint8 v;
        assembly {
            r := mload(add(permitSig, 32))
            s := mload(add(permitSig, 64))
            v := byte(0, mload(add(permitSig, 96)))
        }
        IUniswapV2Pair(fromPoolAddress).permit(
            msg.sender,
            address(this),
            amountIn,
            deadline,
            v,
            r,
            s
        );
    }

    function _removeLiquidity(
        address fromPoolAddress,
        uint256 incomingLP,
        bool shouldSellEntireBalance
    ) internal returns (uint256 amount0, uint256 amount1) {
        IUniswapV2Pair pair = IUniswapV2Pair(fromPoolAddress);

        require(address(pair) != address(0), "Pool Cannot be Zero Address");

        address token0 = pair.token0();
        address token1 = pair.token1();

        _pullTokens(fromPoolAddress, incomingLP, shouldSellEntireBalance);

        _approveToken(fromPoolAddress, address(quickswapRouter), incomingLP);

        (amount0, amount1) = quickswapRouter.removeLiquidity(
            token0,
            token1,
            incomingLP,
            1,
            1,
            address(this),
            deadline
        );
        require(amount0 > 0 && amount1 > 0, "Removed Insufficient Liquidity");
    }

    function _swapTokens(
        address fromPoolAddress,
        uint256 amount0,
        uint256 amount1,
        address toToken,
        address[] memory swapTargets,
        bytes[] memory swapData
    ) internal returns (uint256 tokensBought) {
        address token0 = IUniswapV2Pair(fromPoolAddress).token0();
        address token1 = IUniswapV2Pair(fromPoolAddress).token1();

        //swap token0 to toToken
        if (token0 == toToken) {
            tokensBought = tokensBought + amount0;
        } else {
            //swap token using 0x swap
            tokensBought =
                tokensBought +
                _fillQuote(
                    token0,
                    toToken,
                    amount0,
                    swapTargets[0],
                    swapData[0]
                );
        }

        //swap token1 to toToken
        if (token1 == toToken) {
            tokensBought = tokensBought + amount1;
        } else {
            //swap token using 0x swap
            tokensBought =
                tokensBought +
                _fillQuote(
                    token1,
                    toToken,
                    amount1,
                    swapTargets[1],
                    swapData[1]
                );
        }
    }

    function _fillQuote(
        address fromTokenAddress,
        address toToken,
        uint256 amount,
        address swapTarget,
        bytes memory swapData
    ) internal returns (uint256) {
        if (fromTokenAddress == wmaticTokenAddress && toToken == address(0)) {
            IWETH(wmaticTokenAddress).withdraw(amount);
            return amount;
        }

        uint256 valueToSend;
        if (fromTokenAddress == address(0)) {
            valueToSend = amount;
        } else {
            _approveToken(fromTokenAddress, swapTarget, amount);
        }

        uint256 initialBalance = _getBalance(toToken);

        require(approvedTargets[swapTarget], "Target not Authorized");
        (bool success, ) = swapTarget.call{ value: valueToSend }(swapData);
        require(success, "Error Swapping Tokens");

        uint256 finalBalance = _getBalance(toToken) - initialBalance;

        require(finalBalance > 0, "Swapped to Invalid Intermediate");

        return finalBalance;
    }

    /**
        @notice Utility function to determine quantity and addresses of tokens being removed
        @param fromPoolAddress Pool from which to remove liquidity
        @param liquidity Quantity of LP tokens to remove.
        @return amountA Quantity of tokenA removed
        @return amountB Quantity of tokenB removed
        @return token0 Address of the underlying token to be removed
        @return token1 Address of the underlying token to be removed
    */
    function removeLiquidityReturn(address fromPoolAddress, uint256 liquidity)
        external
        view
        returns (
            uint256 amountA,
            uint256 amountB,
            address token0,
            address token1
        )
    {
        IUniswapV2Pair pair = IUniswapV2Pair(fromPoolAddress);
        token0 = pair.token0();
        token1 = pair.token1();

        uint256 balance0 = IERC20(token0).balanceOf(fromPoolAddress);
        uint256 balance1 = IERC20(token1).balanceOf(fromPoolAddress);

        uint256 _totalSupply = pair.totalSupply();

        amountA = (liquidity * balance0) / _totalSupply;
        amountB = (liquidity * balance1) / _totalSupply;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_goodwill","type":"uint256"},{"internalType":"uint256","name":"_affiliateSplit","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensRec","type":"uint256"}],"name":"zapOut","type":"event"},{"inputs":[{"internalType":"address","name":"toTokenAddress","type":"address"},{"internalType":"address","name":"fromPoolAddress","type":"address"},{"internalType":"uint256","name":"incomingLP","type":"uint256"},{"internalType":"uint256","name":"minTokensRec","type":"uint256"},{"internalType":"address[]","name":"swapTargets","type":"address[]"},{"internalType":"bytes[]","name":"swapData","type":"bytes[]"},{"internalType":"address","name":"affiliate","type":"address"},{"internalType":"bool","name":"shouldSellEntireBalance","type":"bool"}],"name":"ZapOut","outputs":[{"internalType":"uint256","name":"tokensRec","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromPoolAddress","type":"address"},{"internalType":"uint256","name":"incomingLP","type":"uint256"},{"internalType":"address","name":"affiliate","type":"address"}],"name":"ZapOut2PairToken","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromPoolAddress","type":"address"},{"internalType":"uint256","name":"incomingLP","type":"uint256"},{"internalType":"address","name":"affiliate","type":"address"},{"internalType":"bytes","name":"permitSig","type":"bytes"}],"name":"ZapOut2PairTokenWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toTokenAddress","type":"address"},{"internalType":"address","name":"fromPoolAddress","type":"address"},{"internalType":"uint256","name":"incomingLP","type":"uint256"},{"internalType":"uint256","name":"minTokensRec","type":"uint256"},{"internalType":"bytes","name":"permitSig","type":"bytes"},{"internalType":"address[]","name":"swapTargets","type":"address[]"},{"internalType":"bytes[]","name":"swapData","type":"bytes[]"},{"internalType":"address","name":"affiliate","type":"address"}],"name":"ZapOutWithPermit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"affiliateBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"affiliates","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"affilliateWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedTargets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goodwill","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromPoolAddress","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"removeLiquidityReturn","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bool[]","name":"isApproved","type":"bool[]"}],"name":"setApprovedTargets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_affiliate","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"set_affiliate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"zapAddress","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"set_feeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new_affiliateSplit","type":"uint256"}],"name":"set_new_affiliateSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new_goodwill","type":"uint256"}],"name":"set_new_goodwill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleContractActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalAffiliateBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000805460ff60a01b191690553480156200001e57600080fd5b5060405162003271380380620032718339810160408190526200004191620000e0565b600080546001600160a01b03191633908117825560405184928492918291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600291909155600355505073def1c0ded9bec7f1a1670819833240f027b25eff60005260076020527ff6019cd1944dc466e824190b288e5a63528dd4c9a6d8cbd707956fd30d2f1e0d805460ff1916600117905562000104565b60008060408385031215620000f3578182fd5b505080516020909101519092909150565b61315d80620001146000396000f3fe6080604052600436106101445760003560e01c8063715018a6116100b65780639779d1a61161006f5780639779d1a614610435578063cfd7789c14610465578063d408f6571461049a578063f21d3ab5146104ca578063f2fde38b146104ea578063fbec27bf1461050a57600080fd5b8063715018a61461034857806375f12b211461035d5780637ee992831461037e5780638da5cb5b146103cd57806391027c5b146103f55780639735a6341461041557600080fd5b8063247482ba11610108578063247482ba146102725780633ff428c7146102925780634f51e294146102b2578063550bfa56146102f25780635de0398e146103125780635ecb16cd1461032857600080fd5b806301e980d4146101a55780630dc9de85146101c55780631385d24c146101e55780631781261f146101fa57806318b135e31461024557600080fd5b366101a0573332141561019e5760405162461bcd60e51b815260206004820152601860248201527f446f206e6f742073656e6420455448206469726563746c79000000000000000060448201526064015b60405180910390fd5b005b600080fd5b3480156101b157600080fd5b5061019e6101c0366004612e5e565b61052a565b3480156101d157600080fd5b5061019e6101e0366004612d7d565b6105b4565b3480156101f157600080fd5b5061019e61080f565b34801561020657600080fd5b50610232610215366004612aab565b600560209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b34801561025157600080fd5b50610232610260366004612a73565b60066020526000908152604090205481565b34801561027e57600080fd5b5061023261028d366004612ae3565b61085a565b34801561029e57600080fd5b5061019e6102ad366004612c73565b6109dc565b3480156102be57600080fd5b506102e26102cd366004612a73565b60046020526000908152604090205460ff1681565b604051901515815260200161023c565b3480156102fe57600080fd5b5061019e61030d366004612e5e565b610a31565b34801561031e57600080fd5b5061023260025481565b34801561033457600080fd5b5061019e610343366004612d7d565b610ab1565b34801561035457600080fd5b5061019e610d22565b34801561036957600080fd5b506000546102e290600160a01b900460ff1681565b34801561038a57600080fd5b5061039e610399366004612ca0565b610d96565b6040805194855260208501939093526001600160a01b039182169284019290925216606082015260800161023c565b3480156103d957600080fd5b506000546040516001600160a01b03909116815260200161023c565b34801561040157600080fd5b50610232610410366004612ba4565b611035565b34801561042157600080fd5b5061019e610430366004612dbd565b6110cc565b34801561044157600080fd5b506102e2610450366004612a73565b60076020526000908152604090205460ff1681565b34801561047157600080fd5b50610485610480366004612d0c565b6111f6565b6040805192835260208301919091520161023c565b3480156104a657600080fd5b506102e26104b5366004612a73565b60016020526000908152604090205460ff1681565b3480156104d657600080fd5b506104856104e5366004612ccb565b611289565b3480156104f657600080fd5b5061019e610505366004612a73565b611742565b34801561051657600080fd5b5061019e610525366004612c73565b61182c565b6000546001600160a01b031633146105545760405162461bcd60e51b815260040161019590612f96565b60648111156105af5760405162461bcd60e51b815260206004820152602160248201527f416666696c696174652053706c69742056616c7565206e6f7420616c6c6f77656044820152601960fa1b6064820152608401610195565b600355565b6000805b8281101561080957336000908152600560205260408120908585848181106105f057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906106059190612a73565b6001600160a01b0316815260208082019290925260409081016000908120543382526005909352908120919350908186868581811061065457634e487b7160e01b600052603260045260246000fd5b90506020020160208101906106699190612a73565b6001600160a01b03166001600160a01b031681526020019081526020016000208190555081600660008686858181106106b257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906106c79190612a73565b6001600160a01b03166001600160a01b03168152602001908152602001600020546106f29190613077565b6006600086868581811061071657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061072b9190612a73565b6001600160a01b0316815260208101919091526040016000205573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84848381811061077a57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061078f9190612a73565b6001600160a01b031614156107ad576107a83383611881565b6107f7565b6107f733838686858181106107d257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906107e79190612a73565b6001600160a01b0316919061199a565b80610801816130ba565b9150506105b8565b50505050565b6000546001600160a01b031633146108395760405162461bcd60e51b815260040161019590612f96565b6000805460ff60a01b198116600160a01b9182900460ff1615909102179055565b60008054600160a01b900460ff16156108855760405162461bcd60e51b815260040161019590612f6a565b6000806108938a8a866119fd565b915091506108a58a83838e8b8b611c70565b9250878310156108e75760405162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b6044820152606401610195565b60006001600160a01b038c166109565761091873eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee85886001611e84565b9050336108fc6109288387613077565b6040518115909202916000818181858888f19350505050158015610950573d6000803e3d6000fd5b50610984565b6109638c85886001611e84565b9050610984336109738387613077565b6001600160a01b038f16919061199a565b61098e8185613077565b93507ff2d3e32195f8631c70e1d996c9bd5d4a3369d0580786dcd662bf13139310355d338c8e876040516109c59493929190612ecd565b60405180910390a150505098975050505050505050565b6000546001600160a01b03163314610a065760405162461bcd60e51b815260040161019590612f96565b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314610a5b5760405162461bcd60e51b815260040161019590612f96565b6064811115610aac5760405162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f7765640000000000006044820152606401610195565b600255565b6000546001600160a01b03163314610adb5760405162461bcd60e51b815260040161019590612f96565b60005b81811015610d1d57600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee848484818110610b1d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610b329190612a73565b6001600160a01b03161415610bc05760066000858585818110610b6557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610b7a9190612a73565b6001600160a01b03168152602081019190915260400160002054610b9e9047613077565b9050610bbb610bb56000546001600160a01b031690565b82611881565b610d0a565b60066000858585818110610be457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610bf99190612a73565b6001600160a01b03166001600160a01b0316815260200190815260200160002054848484818110610c3a57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c4f9190612a73565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a082319060240160206040518083038186803b158015610c9057600080fd5b505afa158015610ca4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc89190612e76565b610cd29190613077565b9050610d0a610ce96000546001600160a01b031690565b828686868181106107d257634e487b7160e01b600052603260045260246000fd5b5080610d15816130ba565b915050610ade565b505050565b6000546001600160a01b03163314610d4c5760405162461bcd60e51b815260040161019590612f96565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000806000806000869050806001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610dda57600080fd5b505afa158015610dee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e129190612a8f565b9250806001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4d57600080fd5b505afa158015610e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e859190612a8f565b6040516370a0823160e01b81526001600160a01b0389811660048301529193506000918516906370a082319060240160206040518083038186803b158015610ecc57600080fd5b505afa158015610ee0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f049190612e76565b6040516370a0823160e01b81526001600160a01b038a811660048301529192506000918516906370a082319060240160206040518083038186803b158015610f4b57600080fd5b505afa158015610f5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f839190612e76565b90506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fc057600080fd5b505afa158015610fd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff89190612e76565b905080611005848b613058565b61100f9190613038565b97508061101c838b613058565b6110269190613038565b96505050505092959194509250565b60008054600160a01b900460ff16156110605760405162461bcd60e51b815260040161019590612f6a565b6110ad896bfffffffffff096fb4da2000088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611faf92505050565b6110be8a8a8a8a888888600061085a565b9a9950505050505050505050565b6000546001600160a01b031633146110f65760405162461bcd60e51b815260040161019590612f96565b82811461113c5760405162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c84092dce0eae840d8cadccee8d60631b6044820152606401610195565b60005b838110156111ef5782828281811061116757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061117c9190612e26565b600760008787858181106111a057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111b59190612a73565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806111e7816130ba565b91505061113f565b5050505050565b600080548190600160a01b900460ff16156112235760405162461bcd60e51b815260040161019590612f6a565b611270876bfffffffffff096fb4da2000086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611faf92505050565b61127b878787611289565b909890975095505050505050565b600080548190600160a01b900460ff16156112b65760405162461bcd60e51b815260040161019590612f6a565b846001600160a01b03811661130d5760405162461bcd60e51b815260206004820152601b60248201527f506f6f6c2043616e6e6f74206265205a65726f204164647265737300000000006044820152606401610195565b6000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561134857600080fd5b505afa15801561135c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113809190612a8f565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156113bd57600080fd5b505afa1580156113d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f59190612a8f565b905061140c6001600160a01b03891633308a6120a4565b61142b8873a5e0829caced8ffdd4de3c43696c57f7d7a678ff896120dc565b6001600160a01b038216730d500b1d8e8ef31e21c99d1db9a6444d3adf1270148061147257506001600160a01b038116730d500b1d8e8ef31e21c99d1db9a6444d3adf1270145b156115cd5760006001600160a01b038316730d500b1d8e8ef31e21c99d1db9a6444d3adf1270146114a357826114a5565b815b604051629d473b60e21b81526001600160a01b0382166004820152602481018a90526001604482018190526064820152306084820152600f60fc1b60a482015290915073a5e0829caced8ffdd4de3c43696c57f7d7a678ff906302751cec9060c4016040805180830381600087803b15801561152057600080fd5b505af1158015611534573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115589190612e8e565b9096509450600061156c82888a6001611e84565b9050600061159173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee888b6001611e84565b90506115b2336115a1848b613077565b6001600160a01b038616919061199a565b6115c5336115c0838a613077565b611881565b5050506116bd565b604051635d5155ef60e11b815273a5e0829caced8ffdd4de3c43696c57f7d7a678ff9063baa2abde9061161590859085908c9060019081903090600f60fc1b90600401612ef7565b6040805180830381600087803b15801561162e57600080fd5b505af1158015611642573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116669190612e8e565b9095509350600061167a8387896001611e84565b9050600061168b83878a6001611e84565b90506116ac3361169b848a613077565b6001600160a01b038716919061199a565b6116ba336115a18389613077565b50505b7ff2d3e32195f8631c70e1d996c9bd5d4a3369d0580786dcd662bf13139310355d338984886040516116f29493929190612ecd565b60405180910390a17ff2d3e32195f8631c70e1d996c9bd5d4a3369d0580786dcd662bf13139310355d3389838760405161172f9493929190612ecd565b60405180910390a1505050935093915050565b6000546001600160a01b0316331461176c5760405162461bcd60e51b815260040161019590612f96565b6001600160a01b0381166117d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610195565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118565760405162461bcd60e51b815260040161019590612f96565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b804710156118d15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610195565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461191e576040519150601f19603f3d011682016040523d82523d6000602084013e611923565b606091505b5050905080610d1d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610195565b6040516001600160a01b038316602482015260448101829052610d1d90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612105565b600080846001600160a01b038116611a575760405162461bcd60e51b815260206004820152601b60248201527f506f6f6c2043616e6e6f74206265205a65726f204164647265737300000000006044820152606401610195565b6000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611a9257600080fd5b505afa158015611aa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aca9190612a8f565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611b0757600080fd5b505afa158015611b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3f9190612a8f565b9050611b4c8888886121d7565b50611b6c8873a5e0829caced8ffdd4de3c43696c57f7d7a678ff896120dc565b604051635d5155ef60e11b815273a5e0829caced8ffdd4de3c43696c57f7d7a678ff9063baa2abde90611bb490859085908c9060019081903090600f60fc1b90600401612ef7565b6040805180830381600087803b158015611bcd57600080fd5b505af1158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c059190612e8e565b90955093508415801590611c195750600084115b611c655760405162461bcd60e51b815260206004820152601e60248201527f52656d6f76656420496e73756666696369656e74204c697175696469747900006044820152606401610195565b505050935093915050565b600080876001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611cac57600080fd5b505afa158015611cc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce49190612a8f565b90506000886001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611d2157600080fd5b505afa158015611d35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d599190612a8f565b9050856001600160a01b0316826001600160a01b03161415611d8657611d7f8884613020565b9250611df0565b611de382878a88600081518110611dad57634e487b7160e01b600052603260045260246000fd5b602002602001015188600081518110611dd657634e487b7160e01b600052603260045260246000fd5b60200260200101516122ff565b611ded9084613020565b92505b856001600160a01b0316816001600160a01b03161415611e1b57611e148784613020565b9250611e78565b611e6b81878988600181518110611e4257634e487b7160e01b600052603260045260246000fd5b602002602001015188600181518110611dd657634e487b7160e01b600052603260045260246000fd5b611e759084613020565b92505b50509695505050505050565b3360009081526001602052604081205460ff16828015611ea2575080155b8015611eb057506000600254115b15611fa65761271060025486611ec69190613058565b611ed09190613038565b6001600160a01b03851660009081526004602052604090205490925060ff1615611fa6576001600160a01b038616611f1a5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee95505b6000606460035484611f2c9190613058565b611f369190613038565b6001600160a01b038087166000908152600560209081526040808320938c16835292905290812080549293508392909190611f72908490613020565b90915550506001600160a01b03871660009081526006602052604081208054839290611f9f908490613020565b9091555050505b50949350505050565b80516041146120005760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207369676e6174757265206c656e67746800000000000000006044820152606401610195565b60208101516040808301516060840151915163d505accf60e01b815233600482015230602482015260448101869052600f60fc1b606482015260009290921a6084830181905260a4830184905260c4830182905290916001600160a01b0387169063d505accf9060e401600060405180830381600087803b15801561208457600080fd5b505af1158015612098573d6000803e3d6000fd5b50505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526108099085906323b872dd60e01b906084016119c6565b6120f16001600160a01b038416836000612553565b610d1d6001600160a01b0384168383612553565b600061215a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126779092919063ffffffff16565b805190915015610d1d57808060200190518101906121789190612e42565b610d1d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610195565b600081156122e057333b6122425760405162461bcd60e51b815260206004820152602c60248201527f4552523a2073686f756c6453656c6c456e7469726542616c616e63652069732060448201526b7472756520666f7220454f4160a01b6064820152608401610195565b604051636eb1769f60e11b81523360048201523060248201526000906001600160a01b0386169063dd62ed3e9060440160206040518083038186803b15801561228a57600080fd5b505afa15801561229e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c29190612e76565b90506122d96001600160a01b0386163330846120a4565b90506122f8565b6122f56001600160a01b0385163330866120a4565b50815b9392505050565b60006001600160a01b038616730d500b1d8e8ef31e21c99d1db9a6444d3adf127014801561233457506001600160a01b038516155b156123a657604051632e1a7d4d60e01b815260048101859052730d500b1d8e8ef31e21c99d1db9a6444d3adf127090632e1a7d4d90602401600060405180830381600087803b15801561238657600080fd5b505af115801561239a573d6000803e3d6000fd5b5050505083905061254a565b60006001600160a01b0387166123bd5750836123c8565b6123c88785876120dc565b60006123d38761268e565b6001600160a01b03861660009081526007602052604090205490915060ff166124365760405162461bcd60e51b815260206004820152601560248201527415185c99d95d081b9bdd08105d5d1a1bdc9a5e9959605a1b6044820152606401610195565b6000856001600160a01b031683866040516124519190612eb1565b60006040518083038185875af1925050503d806000811461248e576040519150601f19603f3d011682016040523d82523d6000602084013e612493565b606091505b50509050806124dc5760405162461bcd60e51b81526020600482015260156024820152744572726f72205377617070696e6720546f6b656e7360581b6044820152606401610195565b6000826124e88a61268e565b6124f29190613077565b9050600081116125445760405162461bcd60e51b815260206004820152601f60248201527f5377617070656420746f20496e76616c696420496e7465726d656469617465006044820152606401610195565b93505050505b95945050505050565b8015806125dc5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156125a257600080fd5b505afa1580156125b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125da9190612e76565b155b6126475760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610195565b6040516001600160a01b038316602482015260448101829052610d1d90849063095ea7b360e01b906064016119c6565b60606126868484600085612724565b949350505050565b60006001600160a01b0382166126a5575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b1580156126e457600080fd5b505afa1580156126f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271c9190612e76565b90505b919050565b6060824710156127855760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610195565b843b6127d35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610195565b600080866001600160a01b031685876040516127ef9190612eb1565b60006040518083038185875af1925050503d806000811461282c576040519150601f19603f3d011682016040523d82523d6000602084013e612831565b606091505b509150915061284182828661284c565b979650505050505050565b6060831561285b5750816122f8565b82511561286b5782518084602001fd5b8160405162461bcd60e51b81526004016101959190612f37565b803561271f81613101565b60008083601f8401126128a1578182fd5b50813567ffffffffffffffff8111156128b8578182fd5b6020830191508360208260051b85010111156128d357600080fd5b9250929050565b600082601f8301126128ea578081fd5b813560206128ff6128fa83612ffc565b612fcb565b80838252828201915082860187848660051b890101111561291e578586fd5b855b8581101561294557813561293381613101565b84529284019290840190600101612920565b5090979650505050505050565b6000601f8381840112612963578182fd5b823560206129736128fa83612ffc565b80838252828201915082870188848660051b8a01011115612992578687fd5b865b85811015612a2557813567ffffffffffffffff808211156129b357898afd5b818b0191508b603f8301126129c657898afd5b868201356040828211156129dc576129dc6130eb565b6129ed828c01601f19168a01612fcb565b92508183528d81838601011115612a02578b8cfd5b818185018a85013750810187018a90528552509284019290840190600101612994565b509098975050505050505050565b60008083601f840112612a44578182fd5b50813567ffffffffffffffff811115612a5b578182fd5b6020830191508360208285010111156128d357600080fd5b600060208284031215612a84578081fd5b81356122f881613101565b600060208284031215612aa0578081fd5b81516122f881613101565b60008060408385031215612abd578081fd5b8235612ac881613101565b91506020830135612ad881613101565b809150509250929050565b600080600080600080600080610100898b031215612aff578384fd5b8835612b0a81613101565b97506020890135612b1a81613101565b96506040890135955060608901359450608089013567ffffffffffffffff80821115612b44578586fd5b612b508c838d016128da565b955060a08b0135915080821115612b65578485fd5b50612b728b828c01612952565b93505060c0890135612b8381613101565b915060e0890135612b9381613119565b809150509295985092959890939650565b60008060008060008060008060006101008a8c031215612bc2578081fd5b612bcb8a612885565b9850612bd960208b01612885565b975060408a0135965060608a0135955060808a013567ffffffffffffffff80821115612c03578283fd5b612c0f8d838e01612a33565b909750955060a08c0135915080821115612c27578283fd5b612c338d838e016128da565b945060c08c0135915080821115612c48578283fd5b50612c558c828d01612952565b925050612c6460e08b01612885565b90509295985092959850929598565b60008060408385031215612c85578182fd5b8235612c9081613101565b91506020830135612ad881613119565b60008060408385031215612cb2578182fd5b8235612cbd81613101565b946020939093013593505050565b600080600060608486031215612cdf578081fd5b8335612cea81613101565b9250602084013591506040840135612d0181613101565b809150509250925092565b600080600080600060808688031215612d23578283fd5b8535612d2e81613101565b9450602086013593506040860135612d4581613101565b9250606086013567ffffffffffffffff811115612d60578182fd5b612d6c88828901612a33565b969995985093965092949392505050565b60008060208385031215612d8f578182fd5b823567ffffffffffffffff811115612da5578283fd5b612db185828601612890565b90969095509350505050565b60008060008060408587031215612dd2578182fd5b843567ffffffffffffffff80821115612de9578384fd5b612df588838901612890565b90965094506020870135915080821115612e0d578384fd5b50612e1a87828801612890565b95989497509550505050565b600060208284031215612e37578081fd5b81356122f881613119565b600060208284031215612e53578081fd5b81516122f881613119565b600060208284031215612e6f578081fd5b5035919050565b600060208284031215612e87578081fd5b5051919050565b60008060408385031215612ea0578182fd5b505080516020909101519092909150565b60008251612ec381846020870161308e565b9190910192915050565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b039788168152958716602087015260408601949094526060850192909252608084015290921660a082015260c081019190915260e00190565b6020815260008251806020840152612f5681604085016020870161308e565b601f01601f19169190910160400192915050565b60208082526012908201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612ff457612ff46130eb565b604052919050565b600067ffffffffffffffff821115613016576130166130eb565b5060051b60200190565b60008219821115613033576130336130d5565b500190565b60008261305357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613072576130726130d5565b500290565b600082821015613089576130896130d5565b500390565b60005b838110156130a9578181015183820152602001613091565b838111156108095750506000910152565b60006000198214156130ce576130ce6130d5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461311657600080fd5b50565b801515811461311657600080fdfea26469706673582212208d90f02172c42d198ceecca0b296b3c3bcf93a1e8fa039763c1ca1c35e69d66764736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _goodwill (uint256): 0
Arg [1] : _affiliateSplit (uint256): 0

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

29953:13223:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26194:10;26208:9;26194:23;;26186:60;;;;-1:-1:-1;;;26186:60:0;;16306:2:1;26186:60:0;;;16288:21:1;16345:2;16325:18;;;16318:30;16384:26;16364:18;;;16357:54;16428:18;;26186:60:0;;;;;;;;;29953:13223;;;;;23964:278;;;;;;;;;;-1:-1:-1;23964:278:0;;;;;:::i;:::-;;:::i;25154:636::-;;;;;;;;;;-1:-1:-1;25154:636:0;;;;;:::i;:::-;;:::i;23463:86::-;;;;;;;;;;;;;:::i;21936:71::-;;;;;;;;;;-1:-1:-1;21936:71:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;23741:25:1;;;23729:2;23714:18;21936:71:0;;;;;;;;22038:56;;;;;;;;;;-1:-1:-1;22038:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;34239:1749;;;;;;;;;;-1:-1:-1;34239:1749:0;;;;;:::i;:::-;;:::i;24250:150::-;;;;;;;;;;-1:-1:-1;24250:150:0;;;;;:::i;:::-;;:::i;21850:42::-;;;;;;;;;;-1:-1:-1;21850:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15339:14:1;;15332:22;15314:41;;15302:2;15287:18;21850:42:0;15269:92:1;23718:238:0;;;;;;;;;;-1:-1:-1;23718:238:0;;;;;:::i;:::-;;:::i;21725:23::-;;;;;;;;;;;;;;;;24476:602;;;;;;;;;;-1:-1:-1;24476:602:0;;;;;:::i;:::-;;:::i;4707:148::-;;;;;;;;;;;;;:::i;21594:27::-;;;;;;;;;;-1:-1:-1;21594:27:0;;;;-1:-1:-1;;;21594:27:0;;;;;;42460:713;;;;;;;;;;-1:-1:-1;42460:713:0;;;;;:::i;:::-;;:::i;:::-;;;;24261:25:1;;;24317:2;24302:18;;24295:34;;;;-1:-1:-1;;;;;24403:15:1;;;24383:18;;;24376:43;;;;24455:15;24450:2;24435:18;;24428:43;24248:3;24233:19;42460:713:0;24215:262:1;4056:87:0;;;;;;;;;;-1:-1:-1;4102:7:0;4129:6;4056:87;;-1:-1:-1;;;;;4129:6:0;;;11703:51:1;;11691:2;11676:18;4056:87:0;11658:102:1;37328:730:0;;;;;;;;;;-1:-1:-1;37328:730:0;;;;;:::i;:::-;;:::i;25798:342::-;;;;;;;;;;-1:-1:-1;25798:342:0;;;;;:::i;:::-;;:::i;22139:47::-;;;;;;;;;;-1:-1:-1;22139:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36378:467;;;;;;;;;;-1:-1:-1;36378:467:0;;;;;:::i;:::-;;:::i;:::-;;;;23951:25:1;;;24007:2;23992:18;;23985:34;;;;23924:18;36378:467:0;23906:119:1;21672:44:0;;;;;;;;;;-1:-1:-1;21672:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31337:2373;;;;;;;;;;-1:-1:-1;31337:2373:0;;;;;:::i;:::-;;:::i;5010:281::-;;;;;;;;;;-1:-1:-1;5010:281:0;;;;;:::i;:::-;;:::i;23557:153::-;;;;;;;;;;-1:-1:-1;23557:153:0;;;;;:::i;:::-;;:::i;23964:278::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;24123:3:::1;24100:19;:26;;24078:109;;;::::0;-1:-1:-1;;;24078:109:0;;20357:2:1;24078:109:0::1;::::0;::::1;20339:21:1::0;20396:2;20376:18;;;20369:30;20435:34;20415:18;;;20408:62;-1:-1:-1;;;20486:18:1;;;20479:31;20527:19;;24078:109:0::1;20329:223:1::0;24078:109:0::1;24198:14;:36:::0;23964:278::o;25154:636::-;25229:16;;25256:527;25276:17;;;25256:527;;;25343:10;25326:28;;;;:16;:28;;;;;;25355:6;;25362:1;25355:9;;;;;-1:-1:-1;;;25355:9:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25326:39:0;;;;;;;;;;;;;;;-1:-1:-1;25326:39:0;;;;25397:10;25380:28;;:16;:28;;;;;;25326:39;;-1:-1:-1;;;25409:6:0;;25416:1;25409:9;;;;;-1:-1:-1;;;25409:9:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25380:39:0;-1:-1:-1;;;;;25380:39:0;;;;;;;;;;;;:43;;;;25542:8;25490:21;:32;25512:6;;25519:1;25512:9;;;;;-1:-1:-1;;;25512:9:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25490:32:0;-1:-1:-1;;;;;25490:32:0;;;;;;;;;;;;;:60;;;;:::i;:::-;25438:21;:32;25460:6;;25467:1;25460:9;;;;;-1:-1:-1;;;25460:9:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25438:32:0;;;;;;;;;;;;-1:-1:-1;25438:32:0;:112;22243:42;25571:6;;25578:1;25571:9;;;;;-1:-1:-1;;;25571:9:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25571:23:0;;25567:205;;;25615:48;25641:10;25654:8;25615:17;:48::i;:::-;25567:205;;;25704:52;25735:10;25747:8;25711:6;;25718:1;25711:9;;;;;-1:-1:-1;;;25711:9:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25704:30:0;;:52;:30;:52::i;:::-;25295:3;;;;:::i;:::-;;;;25256:527;;;;25154:636;;;:::o;23463:86::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;23534:7:::1;::::0;;-1:-1:-1;;;;23523:18:0;::::1;-1:-1:-1::0;;;23534:7:0;;;::::1;;;23533:8;23523:18:::0;;::::1;;::::0;;23463:86::o;34239:1749::-;34561:17;22514:7;;-1:-1:-1;;;22514:7:0;;;;22510:102;;;22538:28;;-1:-1:-1;;;22538:28:0;;;;;;;:::i;22510:102::-;34592:15:::1;34609::::0;34641:136:::1;34676:15;34710:10;34739:23;34641:16;:136::i;:::-;34591:186;;;;34835:174;34861:15;34891:7;34913;34935:14;34964:11;34990:8;34835:11;:174::i;:::-;34823:186;;35041:12;35028:9;:25;;35020:51;;;::::0;-1:-1:-1;;;35020:51:0;;16659:2:1;35020:51:0::1;::::0;::::1;16641:21:1::0;16698:2;16678:18;;;16671:30;-1:-1:-1;;;16717:18:1;;;16710:43;16770:18;;35020:51:0::1;16631:163:1::0;35020:51:0::1;35084:28;-1:-1:-1::0;;;;;35169:28:0;::::1;35165:650;;35237:140;22243:42;35302:9;35330;35358:4;35237:17;:140::i;:::-;35214:163:::0;-1:-1:-1;35402:10:0::1;35394:62;35423:32;35214:163:::0;35423:9;:32:::1;:::i;:::-;35394:62;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;35165:650;;;35512:144;35548:14;35581:9;35609;35637:4;35512:17;:144::i;:::-;35489:167:::0;-1:-1:-1;35673:130:0::1;35727:10;35756:32;35489:167:::0;35756:9;:32:::1;:::i;:::-;-1:-1:-1::0;;;;;35673:35:0;::::1;::::0;:130;:35:::1;:130::i;:::-;35839:32;35851:20:::0;35839:9;:32:::1;:::i;:::-;35827:44;;35889:62;35896:10;35908:15;35925:14;35941:9;35889:62;;;;;;;;;:::i;:::-;;;;;;;;35964:16;;;34239:1749:::0;;;;;;;;;;:::o;24250:150::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24360:22:0;;;::::1;;::::0;;;:10:::1;:22;::::0;;;;:32;;-1:-1:-1;;24360:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;24250:150::o;23718:238::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;23856:3:::1;23839:13;:20;;23795:118;;;::::0;-1:-1:-1;;;23795:118:0;;19297:2:1;23795:118:0::1;::::0;::::1;19279:21:1::0;19336:2;19316:18;;;19309:30;19375:28;19355:18;;;19348:56;19421:18;;23795:118:0::1;19269:176:1::0;23795:118:0::1;23924:8;:24:::0;23718:238::o;24476:602::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;24562:9:::1;24557:514;24577:17:::0;;::::1;24557:514;;;24616:11;22243:42;24648:6:::0;;24655:1;24648:9;;::::1;;;-1:-1:-1::0;;;24648:9:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24648:23:0::1;;24644:416;;;24722:21;:32;24744:6;;24751:1;24744:9;;;;;-1:-1:-1::0;;;24744:9:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24722:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;24722:32:0;;24698:56:::1;::::0;:21:::1;:56;:::i;:::-;24692:62;;24775:40;24801:7;4102::::0;4129:6;-1:-1:-1;;;;;4129:6:0;;4056:87;24801:7:::1;24811:3;24775:17;:40::i;:::-;24644:416;;;24949:21;:32;24971:6;;24978:1;24971:9;;;;;-1:-1:-1::0;;;24971:9:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24949:32:0::1;-1:-1:-1::0;;;;;24949:32:0::1;;;;;;;;;;;;;24890:6;;24897:1;24890:9;;;;;-1:-1:-1::0;;;24890:9:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24883:42;::::0;-1:-1:-1;;;24883:42:0;;24919:4:::1;24883:42;::::0;::::1;11703:51:1::0;-1:-1:-1;;;;;24883:27:0;;;::::1;::::0;::::1;::::0;11676:18:1;;24883:42:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:98;;;;:::i;:::-;24856:125;;25000:44;25031:7;4102::::0;4129:6;-1:-1:-1;;;;;4129:6:0;;4056:87;25031:7:::1;25040:3;25007:6;;25014:1;25007:9;;;;;-1:-1:-1::0;;;25007:9:0::1;;;;;;;;25000:44;-1:-1:-1::0;24596:3:0;::::1;::::0;::::1;:::i;:::-;;;;24557:514;;;;24476:602:::0;;:::o;4707:148::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;4814:1:::1;4798:6:::0;;4777:40:::1;::::0;-1:-1:-1;;;;;4798:6:0;;::::1;::::0;4777:40:::1;::::0;4814:1;;4777:40:::1;4845:1;4828:19:::0;;-1:-1:-1;;;;;;4828:19:0::1;::::0;;4707:148::o;42460:713::-;42599:15;42629;42659:14;42688;42730:19;42767:15;42730:53;;42803:4;-1:-1:-1;;;;;42803:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42794:22;;42836:4;-1:-1:-1;;;;;42836:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42881:41;;-1:-1:-1;;;42881:41:0;;-1:-1:-1;;;;;11721:32:1;;;42881:41:0;;;11703:51:1;42827:22:0;;-1:-1:-1;42862:16:0;;42881:24;;;;;11676:18:1;;42881:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42952;;-1:-1:-1;;;42952:41:0;;-1:-1:-1;;;;;11721:32:1;;;42952:41:0;;;11703:51:1;42862:60:0;;-1:-1:-1;42933:16:0;;42952:24;;;;;11676:18:1;;42952:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42933:60;;43006:20;43029:4;-1:-1:-1;;;;;43029:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43006:41;-1:-1:-1;43006:41:0;43071:20;43083:8;43071:9;:20;:::i;:::-;43070:37;;;;:::i;:::-;43060:47;-1:-1:-1;43153:12:0;43129:20;43141:8;43129:9;:20;:::i;:::-;43128:37;;;;:::i;:::-;43118:47;;42460:713;;;;;;;;;;;:::o;37328:730::-;37656:7;22514;;-1:-1:-1;;;22514:7:0;;;;22510:102;;;22538:28;;-1:-1:-1;;;22538:28:0;;;;;;;:::i;22510:102::-;37695:52:::1;37703:15;30203:29;37737:9;;37695:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37695:7:0::1;::::0;-1:-1:-1;;;37695:52:0:i:1;:::-;37782:257;37807:14;37840:15;37874:10;37903:12;37934:11;37964:8;37991:9;38019:5;37782:6;:257::i;:::-;37760:290:::0;37328:730;-1:-1:-1;;;;;;;;;;37328:730:0:o;25798:342::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;25945:35;;::::1;25937:68;;;::::0;-1:-1:-1;;;25937:68:0;;20008:2:1;25937:68:0::1;::::0;::::1;19990:21:1::0;20047:2;20027:18;;;20020:30;-1:-1:-1;;;20066:18:1;;;20059:50;20126:18;;25937:68:0::1;19980:170:1::0;25937:68:0::1;26023:9;26018:115;26038:18:::0;;::::1;26018:115;;;26108:10;;26119:1;26108:13;;;;;-1:-1:-1::0;;;26108:13:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26078:15;:27;26094:7;;26102:1;26094:10;;;;;-1:-1:-1::0;;;26094:10:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26078:27:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;26078:27:0;:43;;-1:-1:-1;;26078:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;26058:3;::::1;::::0;::::1;:::i;:::-;;;;26018:115;;;;25798:342:::0;;;;:::o;36378:467::-;36581:15;22514:7;;36581:15;;-1:-1:-1;;;22514:7:0;;;;22510:102;;;22538:28;;-1:-1:-1;;;22538:28:0;;;;;;;:::i;22510:102::-;36645:52:::1;36653:15;30203:29;36687:9;;36645:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36645:7:0::1;::::0;-1:-1:-1;;;36645:52:0:i:1;:::-;36731:106;36762:15;36792:10;36817:9;36731:16;:106::i;:::-;36710:127:::0;;;;-1:-1:-1;36378:467:0;-1:-1:-1;;;;;;36378:467:0:o;31337:2373::-;31493:15;22514:7;;31493:15;;-1:-1:-1;;;22514:7:0;;;;22510:102;;;22538:28;;-1:-1:-1;;;22538:28:0;;;;;;;:::i;22510:102::-;31575:15;-1:-1:-1;;;;;31612:27:0;::::1;31604:67;;;::::0;-1:-1:-1;;;31604:67:0;;19652:2:1;31604:67:0::1;::::0;::::1;19634:21:1::0;19691:2;19671:18;;;19664:30;19730:29;19710:18;;;19703:57;19777:18;;31604:67:0::1;19624:177:1::0;31604:67:0::1;31709:14;31726:4;-1:-1:-1::0;;;;;31726:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31709:30;;31750:14;31767:4;-1:-1:-1::0;;;;;31767:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31750:30:::0;-1:-1:-1;31793:129:0::1;-1:-1:-1::0;;;;;31793:40:0;::::1;31848:10;31881:4;31901:10:::0;31793:40:::1;:129::i;:::-;31935:68;31949:15;30323:42;31992:10;31935:13;:68::i;:::-;-1:-1:-1::0;;;;;32020:28:0;::::1;30569:42;32020:28;::::0;:60:::1;;-1:-1:-1::0;;;;;;32052:28:0;::::1;30569:42;32052:28;32020:60;32016:1551;;;32097:14;-1:-1:-1::0;;;;;32114:28:0;::::1;30569:42;32114:28;:46;;32154:6;32114:46;;;32145:6;32114:46;32196:202;::::0;-1:-1:-1;;;32196:202:0;;-1:-1:-1;;;;;14921:15:1;;32196:202:0::1;::::0;::::1;14903:34:1::0;14953:18;;;14946:34;;;32303:1:0::1;14996:18:1::0;;;14989:34;;;15039:18;;;15032:34;32351:4:0::1;15082:19:1::0;;;15075:44;-1:-1:-1;;;15135:19:1;;;15128:35;32097:63:0;;-1:-1:-1;30323:42:0::1;::::0;32196:34:::1;::::0;14837:19:1;;32196:202:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32175:223:::0;;-1:-1:-1;32175:223:0;-1:-1:-1;32449:21:0::1;32490:51;32508:6:::0;32175:223;32525:9;32536:4:::1;32490:17;:51::i;:::-;32449:92;;32556:19;32595:55;22243:42;32625:7;32634:9;32645:4;32595:17;:55::i;:::-;32556:94:::0;-1:-1:-1;32695:64:0::1;32723:10;32735:23;32745:13:::0;32735:7;:23:::1;:::i;:::-;-1:-1:-1::0;;;;;32695:27:0;::::1;::::0;:64;:27:::1;:64::i;:::-;32774:61;32800:10;32813:21;32823:11:::0;32813:7;:21:::1;:::i;:::-;32774:17;:61::i;:::-;32016:1551;;;;;;32889:224;::::0;-1:-1:-1;;;32889:224:0;;30323:42:::1;::::0;32889:31:::1;::::0;:224:::1;::::0;32939:6;;32964;;32989:10;;33018:1:::1;::::0;;;33066:4:::1;::::0;-1:-1:-1;;;30085:66:0;32889:224:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32868:245:::0;;-1:-1:-1;32868:245:0;-1:-1:-1;33164:22:0::1;33206:51;33224:6:::0;32868:245;33241:9;33252:4:::1;33206:17;:51::i;:::-;33164:93;;33272:22;33314:51;33332:6;33340:7;33349:9;33360:4;33314:17;:51::i;:::-;33272:93:::0;-1:-1:-1;33410:65:0::1;33438:10;33450:24;33460:14:::0;33450:7;:24:::1;:::i;:::-;-1:-1:-1::0;;;;;33410:27:0;::::1;::::0;:65;:27:::1;:65::i;:::-;33490;33518:10;33530:24;33540:14:::0;33530:7;:24:::1;:::i;33490:65::-;32016:1551;;;33582:52;33589:10;33601:15;33618:6;33626:7;33582:52;;;;;;;;;:::i;:::-;;;;;;;;33650;33657:10;33669:15;33686:6;33694:7;33650:52;;;;;;;;;:::i;:::-;;;;;;;;22599:1;;;31337:2373:::0;;;;;;:::o;5010:281::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5113:22:0;::::1;5091:110;;;::::0;-1:-1:-1;;;5091:110:0;;17001:2:1;5091:110:0::1;::::0;::::1;16983:21:1::0;17040:2;17020:18;;;17013:30;17079:34;17059:18;;;17052:62;-1:-1:-1;;;17130:18:1;;;17123:36;17176:19;;5091:110:0::1;16973:228:1::0;5091:110:0::1;5238:6;::::0;;5217:38:::1;::::0;-1:-1:-1;;;;;5217:38:0;;::::1;::::0;5238:6;::::1;::::0;5217:38:::1;::::0;::::1;5266:6;:17:::0;;-1:-1:-1;;;;;;5266:17:0::1;-1:-1:-1::0;;;;;5266:17:0;;;::::1;::::0;;;::::1;::::0;;5010:281::o;23557:153::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23669:24:0;;;::::1;;::::0;;;:12:::1;:24;::::0;;;;:33;;-1:-1:-1;;23669:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23557:153::o;10343:471::-;10472:6;10447:21;:31;;10425:110;;;;-1:-1:-1;;;10425:110:0;;18532:2:1;10425:110:0;;;18514:21:1;18571:2;18551:18;;;18544:30;18610:31;18590:18;;;18583:59;18659:18;;10425:110:0;18504:179:1;10425:110:0;10627:12;10645:9;-1:-1:-1;;;;;10645:14:0;10668:6;10645:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10626:54;;;10713:7;10691:115;;;;-1:-1:-1;;;10691:115:0;;17758:2:1;10691:115:0;;;17740:21:1;17797:2;17777:18;;;17770:30;17836:34;17816:18;;;17809:62;17907:28;17887:18;;;17880:56;17953:19;;10691:115:0;17730:248:1;17534::0;17705:58;;-1:-1:-1;;;;;14475:32:1;;17705:58:0;;;14457:51:1;14524:18;;;14517:34;;;17651:123:0;;17685:5;;-1:-1:-1;;;17728:23:0;14430:18:1;;17705:58:0;;;;-1:-1:-1;;17705:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;17705:58:0;-1:-1:-1;;;;;;17705:58:0;;;;;;;;;;17651:19;:123::i;38718:888::-;38871:15;;38953;-1:-1:-1;;;;;38990:27:0;;38982:67;;;;-1:-1:-1;;;38982:67:0;;19652:2:1;38982:67:0;;;19634:21:1;19691:2;19671:18;;;19664:30;19730:29;19710:18;;;19703:57;19777:18;;38982:67:0;19624:177:1;38982:67:0;39062:14;39079:4;-1:-1:-1;;;;;39079:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39062:30;;39103:14;39120:4;-1:-1:-1;;;;;39120:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39103:30;;39146:65;39158:15;39175:10;39187:23;39146:11;:65::i;:::-;;39224:68;39238:15;30323:42;39281:10;39224:13;:68::i;:::-;39326:192;;-1:-1:-1;;;39326:192:0;;30323:42;;39326:31;;:192;;39372:6;;39393;;39414:10;;39439:1;;;;39479:4;;-1:-1:-1;;;30085:66:0;39326:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39305:213;;-1:-1:-1;39305:213:0;-1:-1:-1;39537:11:0;;;;;:26;;;39562:1;39552:7;:11;39537:26;39529:69;;;;-1:-1:-1;;;39529:69:0;;22604:2:1;39529:69:0;;;22586:21:1;22643:2;22623:18;;;22616:30;22682:32;22662:18;;;22655:60;22732:18;;39529:69:0;22576:180:1;39529:69:0;38718:888;;;;;;;;;:::o;39614:1315::-;39845:20;39878:14;39910:15;-1:-1:-1;;;;;39895:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39878:57;;39946:14;39978:15;-1:-1:-1;;;;;39963:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39946:57;;40064:7;-1:-1:-1;;;;;40054:17:0;:6;-1:-1:-1;;;;;40054:17:0;;40050:413;;;40103:22;40118:7;40103:12;:22;:::i;:::-;40088:37;;40050:413;;;40262:189;40295:6;40324:7;40354;40384:11;40396:1;40384:14;;;;;;-1:-1:-1;;;40384:14:0;;;;;;;;;;;;;;;40421:8;40430:1;40421:11;;;;;;-1:-1:-1;;;40421:11:0;;;;;;;;;;;;;;;40262:10;:189::i;:::-;40230:221;;:12;:221;:::i;:::-;40198:253;;40050:413;40523:7;-1:-1:-1;;;;;40513:17:0;:6;-1:-1:-1;;;;;40513:17:0;;40509:413;;;40562:22;40577:7;40562:12;:22;:::i;:::-;40547:37;;40509:413;;;40721:189;40754:6;40783:7;40813;40843:11;40855:1;40843:14;;;;;;-1:-1:-1;;;40843:14:0;;;;;;;;;;;;;;;40880:8;40889:1;40880:11;;;;;;-1:-1:-1;;;40880:11:0;;;;;;;;40721:189;40689:221;;:12;:221;:::i;:::-;40657:253;;40509:413;39614:1315;;;;;;;;;;:::o;27513:807::-;27745:10;27672:28;27732:24;;;:12;:24;;;;;;;;27771:14;:30;;;;;27790:11;27789:12;27771:30;:46;;;;;27816:1;27805:8;;:12;27771:46;27767:546;;;27879:5;27867:8;;27858:6;:17;;;;:::i;:::-;27857:27;;;;:::i;:::-;-1:-1:-1;;;;;27905:21:0;;;;;;:10;:21;;;;;;27834:50;;-1:-1:-1;27905:21:0;;27901:401;;;-1:-1:-1;;;;;27951:19:0;;27947:86;;22243:42;27995:18;;27947:86;28053:24;28143:3;28125:14;;28102:20;:37;;;;:::i;:::-;28101:45;;;;:::i;:::-;-1:-1:-1;;;;;28165:27:0;;;;;;;:16;:27;;;;;;;;:34;;;;;;;;;;;:54;;28053:93;;-1:-1:-1;28053:93:0;;28165:34;;:27;:54;;28053:93;;28165:54;:::i;:::-;;;;-1:-1:-1;;;;;;;28238:28:0;;;;;;:21;:28;;;;;:48;;28270:16;;28238:28;:48;;28270:16;;28238:48;:::i;:::-;;;;-1:-1:-1;;;27901:401:0;27513:807;;;;;;;:::o;38066:644::-;38212:9;:16;38232:2;38212:22;38204:59;;;;-1:-1:-1;;;38204:59:0;;22251:2:1;38204:59:0;;;22233:21:1;22290:2;22270:18;;;22263:30;22329:26;22309:18;;;22302:54;22373:18;;38204:59:0;22223:174:1;38204:59:0;38384:2;38369:18;;38363:25;38428:2;38413:18;;;38407:25;38480:2;38465:18;;38459:25;38506:196;;-1:-1:-1;;;38506:196:0;;38559:10;38506:196;;;13957:34:1;38592:4:0;14007:18:1;;;14000:43;14059:18;;;14052:34;;;-1:-1:-1;;;14102:18:1;;;14095:34;38276:9:0;38451:34;;;;14145:19:1;;;14138:46;;;14200:19;;;14193:35;;;14244:19;;;14237:35;;;38407:25:0;;-1:-1:-1;;;;;38506:38:0;;;;;13891:19:1;;38506:196:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38066:644;;;;;;:::o;17790:285::-;17988:68;;-1:-1:-1;;;;;12793:15:1;;;17988:68:0;;;12775:34:1;12845:15;;12825:18;;;12818:43;12877:18;;;12870:34;;;17934:133:0;;17968:5;;-1:-1:-1;;;18011:27:0;12710:18:1;;17988:68:0;12692:218:1;23200:223:0;23325:37;-1:-1:-1;;;;;23325:25:0;;23351:7;23360:1;23325:25;:37::i;:::-;23373:42;-1:-1:-1;;;;;23373:25:0;;23399:7;23408:6;23373:25;:42::i;20555:885::-;20979:23;21018:118;21064:4;21018:118;;;;;;;;;;;;;;;;;21026:5;-1:-1:-1;;;;;21018:27:0;;;:118;;;;;:::i;:::-;21151:17;;20979:157;;-1:-1:-1;21151:21:0;21147:286;;21324:10;21313:30;;;;;;;;;;;;:::i;:::-;21287:134;;;;-1:-1:-1;;;21287:134:0;;22963:2:1;21287:134:0;;;22945:21:1;23002:2;22982:18;;;22975:30;23041:34;23021:18;;;23014:62;-1:-1:-1;;;23092:18:1;;;23085:40;23142:19;;21287:134:0;22935:232:1;26738:767:0;26872:7;26896:23;26892:606;;;26981:10;9344:20;26936:136;;;;-1:-1:-1;;;26936:136:0;;21120:2:1;26936:136:0;;;21102:21:1;21159:2;21139:18;;;21132:30;21198:34;21178:18;;;21171:62;-1:-1:-1;;;21249:18:1;;;21242:42;21301:19;;26936:136:0;21092:234:1;26936:136:0;27126:50;;-1:-1:-1;;;27126:50:0;;27150:10;27126:50;;;11977:34:1;27170:4:0;12027:18:1;;;12020:43;27089:17:0;;-1:-1:-1;;;;;27126:23:0;;;;;11912:18:1;;27126:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27089:87;-1:-1:-1;27191:134:0;-1:-1:-1;;;;;27191:30:0;;27240:10;27277:4;27089:87;27191:30;:134::i;:::-;27349:9;-1:-1:-1;27342:16:0;;26892:606;27391:65;-1:-1:-1;;;;;27391:30:0;;27422:10;27442:4;27449:6;27391:30;:65::i;:::-;-1:-1:-1;27480:6:0;26892:606;26738:767;;;;;:::o;40937:1033::-;41129:7;-1:-1:-1;;;;;41153:38:0;;30569:42;41153:38;:63;;;;-1:-1:-1;;;;;;41195:21:0;;;41153:63;41149:166;;;41233:42;;-1:-1:-1;;;41233:42:0;;;;;23741:25:1;;;30569:42:0;;41233:34;;23714:18:1;;41233:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41297:6;41290:13;;;;41149:166;41327:19;-1:-1:-1;;;;;41361:30:0;;41357:167;;-1:-1:-1;41422:6:0;41357:167;;;41461:51;41475:16;41493:10;41505:6;41461:13;:51::i;:::-;41536:22;41561:20;41573:7;41561:11;:20::i;:::-;-1:-1:-1;;;;;41602:27:0;;;;;;:15;:27;;;;;;41536:45;;-1:-1:-1;41602:27:0;;41594:61;;;;-1:-1:-1;;;41594:61:0;;15956:2:1;41594:61:0;;;15938:21:1;15995:2;15975:18;;;15968:30;-1:-1:-1;;;16014:18:1;;;16007:51;16075:18;;41594:61:0;15928:171:1;41594:61:0;41667:12;41685:10;-1:-1:-1;;;;;41685:15:0;41709:11;41723:8;41685:47;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41666:66;;;41751:7;41743:41;;;;-1:-1:-1;;;41743:41:0;;17408:2:1;41743:41:0;;;17390:21:1;17447:2;17427:18;;;17420:30;-1:-1:-1;;;17466:18:1;;;17459:51;17527:18;;41743:41:0;17380:171:1;41743:41:0;41797:20;41843:14;41820:20;41832:7;41820:11;:20::i;:::-;:37;;;;:::i;:::-;41797:60;;41893:1;41878:12;:16;41870:60;;;;-1:-1:-1;;;41870:60:0;;21533:2:1;41870:60:0;;;21515:21:1;21572:2;21552:18;;;21545:30;21611:33;21591:18;;;21584:61;21662:18;;41870:60:0;21505:181:1;41870:60:0;41950:12;-1:-1:-1;;;;40937:1033:0;;;;;;;;:::o;18344:707::-;18762:10;;;18761:62;;-1:-1:-1;18778:39:0;;-1:-1:-1;;;18778:39:0;;18802:4;18778:39;;;11977:34:1;-1:-1:-1;;;;;12047:15:1;;;12027:18;;;12020:43;18778:15:0;;;;;11912:18:1;;18778:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;18761:62;18739:166;;;;-1:-1:-1;;;18739:166:0;;23374:2:1;18739:166:0;;;23356:21:1;23413:2;23393:18;;;23386:30;23452:34;23432:18;;;23425:62;-1:-1:-1;;;23503:18:1;;;23496:52;23565:19;;18739:166:0;23346:244:1;18739:166:0;18970:62;;-1:-1:-1;;;;;14475:32:1;;18970:62:0;;;14457:51:1;14524:18;;;14517:34;;;18916:127:0;;18950:5;;-1:-1:-1;;;18993:22:0;14430:18:1;;18970:62:0;14412:145:1;12003:229:0;12140:12;12172:52;12194:6;12202:4;12208:1;12211:12;12172:21;:52::i;:::-;12165:59;12003:229;-1:-1:-1;;;;12003:229:0:o;22627:290::-;22713:15;-1:-1:-1;;;;;22750:19:0;;22746:164;;-1:-1:-1;22796:21:0;22627:290;;;:::o;22746:164::-;22860:38;;-1:-1:-1;;;22860:38:0;;22892:4;22860:38;;;11703:51:1;-1:-1:-1;;;;;22860:23:0;;;;;11676:18:1;;22860:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22850:48;;22746:164;22627:290;;;:::o;13219:623::-;13389:12;13461:5;13436:21;:30;;13414:118;;;;-1:-1:-1;;;13414:118:0;;18890:2:1;13414:118:0;;;18872:21:1;18929:2;18909:18;;;18902:30;18968:34;18948:18;;;18941:62;-1:-1:-1;;;19019:18:1;;;19012:36;19065:19;;13414:118:0;18862:228:1;13414:118:0;9344:20;;13543:60;;;;-1:-1:-1;;;13543:60:0;;21893:2:1;13543:60:0;;;21875:21:1;21932:2;21912:18;;;21905:30;21971:31;21951:18;;;21944:59;22020:18;;13543:60:0;21865:179:1;13543:60:0;13677:12;13691:23;13731:6;-1:-1:-1;;;;;13731:11:0;13751:5;13759:4;13731:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13676:88;;;;13782:52;13800:7;13809:10;13821:12;13782:17;:52::i;:::-;13775:59;13219:623;-1:-1:-1;;;;;;;13219:623:0:o;16133:777::-;16283:12;16312:7;16308:595;;;-1:-1:-1;16343:10:0;16336:17;;16308:595;16457:17;;:21;16453:439;;16720:10;16714:17;16781:15;16768:10;16764:2;16760:19;16753:44;16668:148;16863:12;16856:20;;-1:-1:-1;;;16856:20:0;;;;;;;;:::i;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;153:395::-;216:8;226:6;280:3;273:4;265:6;261:17;257:27;247:2;;305:8;295;288:26;247:2;-1:-1:-1;335:20:1;;378:18;367:30;;364:2;;;417:8;407;400:26;364:2;461:4;453:6;449:17;437:29;;521:3;514:4;504:6;501:1;497:14;489:6;485:27;481:38;478:47;475:2;;;538:1;535;528:12;475:2;237:311;;;;;:::o;553:768::-;607:5;660:3;653:4;645:6;641:17;637:27;627:2;;682:5;675;668:20;627:2;722:6;709:20;748:4;772:60;788:43;828:2;788:43;:::i;:::-;772:60;:::i;:::-;854:3;878:2;873:3;866:15;906:2;901:3;897:12;890:19;;941:2;933:6;929:15;993:3;988:2;982;979:1;975:10;967:6;963:23;959:32;956:41;953:2;;;1014:5;1007;1000:20;953:2;1040:5;1054:238;1068:2;1065:1;1062:9;1054:238;;;1139:3;1126:17;1156:31;1181:5;1156:31;:::i;:::-;1200:18;;1238:12;;;;1270;;;;1086:1;1079:9;1054:238;;;-1:-1:-1;1310:5:1;;617:704;-1:-1:-1;;;;;;;617:704:1:o;1326:1385::-;1378:5;1408:4;1452:3;1447:2;1439:6;1435:15;1431:25;1421:2;;1474:5;1467;1460:20;1421:2;1514:6;1501:20;1540:4;1564:60;1580:43;1620:2;1580:43;:::i;1564:60::-;1646:3;1670:2;1665:3;1658:15;1698:2;1693:3;1689:12;1682:19;;1733:2;1725:6;1721:15;1785:3;1780:2;1774;1771:1;1767:10;1759:6;1755:23;1751:32;1748:41;1745:2;;;1806:5;1799;1792:20;1745:2;1832:5;1846:836;1860:2;1857:1;1854:9;1846:836;;;1937:3;1924:17;1964:18;2014:2;2001:11;1998:19;1995:2;;;2034:5;2027;2020:20;1995:2;2077:11;2069:6;2065:24;2055:34;;2129:3;2124:2;2120;2116:11;2112:21;2102:2;;2151:5;2144;2137:20;2102:2;2203;2199;2195:11;2182:25;2230:2;2255;2251;2248:10;2245:2;;;2261:18;;:::i;:::-;2309:51;2333:11;;;-1:-1:-1;;2329:25:1;2325:34;;2309:51;:::i;:::-;2294:66;;2389:2;2380:7;2373:19;2433:3;2428:2;2423;2419;2415:11;2411:20;2408:29;2405:2;;;2454:5;2447;2440:20;2405:2;2519;2514;2510;2506:11;2501:2;2492:7;2488:16;2475:47;-1:-1:-1;2546:16:1;;2542:25;;2535:40;;;2588:20;;-1:-1:-1;2628:12:1;;;;2660;;;;1878:1;1871:9;1846:836;;;-1:-1:-1;2700:5:1;;1388:1323;-1:-1:-1;;;;;;;;1388:1323:1:o;2716:375::-;2767:8;2777:6;2831:3;2824:4;2816:6;2812:17;2808:27;2798:2;;2856:8;2846;2839:26;2798:2;-1:-1:-1;2886:20:1;;2929:18;2918:30;;2915:2;;;2968:8;2958;2951:26;2915:2;3012:4;3004:6;3000:17;2988:29;;3064:3;3057:4;3048:6;3040;3036:19;3032:30;3029:39;3026:2;;;3081:1;3078;3071:12;3096:257;3155:6;3208:2;3196:9;3187:7;3183:23;3179:32;3176:2;;;3229:6;3221;3214:22;3176:2;3273:9;3260:23;3292:31;3317:5;3292:31;:::i;3358:261::-;3428:6;3481:2;3469:9;3460:7;3456:23;3452:32;3449:2;;;3502:6;3494;3487:22;3449:2;3539:9;3533:16;3558:31;3583:5;3558:31;:::i;3624:398::-;3692:6;3700;3753:2;3741:9;3732:7;3728:23;3724:32;3721:2;;;3774:6;3766;3759:22;3721:2;3818:9;3805:23;3837:31;3862:5;3837:31;:::i;:::-;3887:5;-1:-1:-1;3944:2:1;3929:18;;3916:32;3957:33;3916:32;3957:33;:::i;:::-;4009:7;3999:17;;;3711:311;;;;;:::o;4027:1325::-;4205:6;4213;4221;4229;4237;4245;4253;4261;4314:3;4302:9;4293:7;4289:23;4285:33;4282:2;;;4336:6;4328;4321:22;4282:2;4380:9;4367:23;4399:31;4424:5;4399:31;:::i;:::-;4449:5;-1:-1:-1;4506:2:1;4491:18;;4478:32;4519:33;4478:32;4519:33;:::i;:::-;4571:7;-1:-1:-1;4625:2:1;4610:18;;4597:32;;-1:-1:-1;4676:2:1;4661:18;;4648:32;;-1:-1:-1;4731:3:1;4716:19;;4703:33;4755:18;4785:14;;;4782:2;;;4817:6;4809;4802:22;4782:2;4845:61;4898:7;4889:6;4878:9;4874:22;4845:61;:::i;:::-;4835:71;;4959:3;4948:9;4944:19;4931:33;4915:49;;4989:2;4979:8;4976:16;4973:2;;;5010:6;5002;4995:22;4973:2;;5038:61;5091:7;5080:8;5069:9;5065:24;5038:61;:::i;:::-;5028:71;;;5151:3;5140:9;5136:19;5123:33;5165;5190:7;5165:33;:::i;:::-;5217:7;-1:-1:-1;5276:3:1;5261:19;;5248:33;5290:30;5248:33;5290:30;:::i;:::-;5339:7;5329:17;;;4272:1080;;;;;;;;;;;:::o;5357:1292::-;5549:6;5557;5565;5573;5581;5589;5597;5605;5613;5666:3;5654:9;5645:7;5641:23;5637:33;5634:2;;;5688:6;5680;5673:22;5634:2;5716:29;5735:9;5716:29;:::i;:::-;5706:39;;5764:38;5798:2;5787:9;5783:18;5764:38;:::i;:::-;5754:48;;5849:2;5838:9;5834:18;5821:32;5811:42;;5900:2;5889:9;5885:18;5872:32;5862:42;;5955:3;5944:9;5940:19;5927:33;5979:18;6020:2;6012:6;6009:14;6006:2;;;6041:6;6033;6026:22;6006:2;6085:58;6135:7;6126:6;6115:9;6111:22;6085:58;:::i;:::-;6162:8;;-1:-1:-1;6059:84:1;-1:-1:-1;6250:3:1;6235:19;;6222:33;;-1:-1:-1;6267:16:1;;;6264:2;;;6301:6;6293;6286:22;6264:2;6329:63;6384:7;6373:8;6362:9;6358:24;6329:63;:::i;:::-;6319:73;;6445:3;6434:9;6430:19;6417:33;6401:49;;6475:2;6465:8;6462:16;6459:2;;;6496:6;6488;6481:22;6459:2;;6524:61;6577:7;6566:8;6555:9;6551:24;6524:61;:::i;:::-;6514:71;;;6604:39;6638:3;6627:9;6623:19;6604:39;:::i;:::-;6594:49;;5624:1025;;;;;;;;;;;:::o;6654:392::-;6719:6;6727;6780:2;6768:9;6759:7;6755:23;6751:32;6748:2;;;6801:6;6793;6786:22;6748:2;6845:9;6832:23;6864:31;6889:5;6864:31;:::i;:::-;6914:5;-1:-1:-1;6971:2:1;6956:18;;6943:32;6984:30;6943:32;6984:30;:::i;7051:325::-;7119:6;7127;7180:2;7168:9;7159:7;7155:23;7151:32;7148:2;;;7201:6;7193;7186:22;7148:2;7245:9;7232:23;7264:31;7289:5;7264:31;:::i;:::-;7314:5;7366:2;7351:18;;;;7338:32;;-1:-1:-1;;;7138:238:1:o;7381:466::-;7458:6;7466;7474;7527:2;7515:9;7506:7;7502:23;7498:32;7495:2;;;7548:6;7540;7533:22;7495:2;7592:9;7579:23;7611:31;7636:5;7611:31;:::i;:::-;7661:5;-1:-1:-1;7713:2:1;7698:18;;7685:32;;-1:-1:-1;7769:2:1;7754:18;;7741:32;7782:33;7741:32;7782:33;:::i;:::-;7834:7;7824:17;;;7485:362;;;;;:::o;7852:774::-;7949:6;7957;7965;7973;7981;8034:3;8022:9;8013:7;8009:23;8005:33;8002:2;;;8056:6;8048;8041:22;8002:2;8100:9;8087:23;8119:31;8144:5;8119:31;:::i;:::-;8169:5;-1:-1:-1;8221:2:1;8206:18;;8193:32;;-1:-1:-1;8277:2:1;8262:18;;8249:32;8290:33;8249:32;8290:33;:::i;:::-;8342:7;-1:-1:-1;8400:2:1;8385:18;;8372:32;8427:18;8416:30;;8413:2;;;8464:6;8456;8449:22;8413:2;8508:58;8558:7;8549:6;8538:9;8534:22;8508:58;:::i;:::-;7992:634;;;;-1:-1:-1;7992:634:1;;-1:-1:-1;8585:8:1;;8482:84;7992:634;-1:-1:-1;;;7992:634:1:o;8631:457::-;8717:6;8725;8778:2;8766:9;8757:7;8753:23;8749:32;8746:2;;;8799:6;8791;8784:22;8746:2;8844:9;8831:23;8877:18;8869:6;8866:30;8863:2;;;8914:6;8906;8899:22;8863:2;8958:70;9020:7;9011:6;9000:9;8996:22;8958:70;:::i;:::-;9047:8;;8932:96;;-1:-1:-1;8736:352:1;-1:-1:-1;;;;8736:352:1:o;9093:800::-;9212:6;9220;9228;9236;9289:2;9277:9;9268:7;9264:23;9260:32;9257:2;;;9310:6;9302;9295:22;9257:2;9355:9;9342:23;9384:18;9425:2;9417:6;9414:14;9411:2;;;9446:6;9438;9431:22;9411:2;9490:70;9552:7;9543:6;9532:9;9528:22;9490:70;:::i;:::-;9579:8;;-1:-1:-1;9464:96:1;-1:-1:-1;9667:2:1;9652:18;;9639:32;;-1:-1:-1;9683:16:1;;;9680:2;;;9717:6;9709;9702:22;9680:2;;9761:72;9825:7;9814:8;9803:9;9799:24;9761:72;:::i;:::-;9247:646;;;;-1:-1:-1;9852:8:1;-1:-1:-1;;;;9247:646:1:o;9898:251::-;9954:6;10007:2;9995:9;9986:7;9982:23;9978:32;9975:2;;;10028:6;10020;10013:22;9975:2;10072:9;10059:23;10091:28;10113:5;10091:28;:::i;10154:255::-;10221:6;10274:2;10262:9;10253:7;10249:23;10245:32;10242:2;;;10295:6;10287;10280:22;10242:2;10332:9;10326:16;10351:28;10373:5;10351:28;:::i;10414:190::-;10473:6;10526:2;10514:9;10505:7;10501:23;10497:32;10494:2;;;10547:6;10539;10532:22;10494:2;-1:-1:-1;10575:23:1;;10484:120;-1:-1:-1;10484:120:1:o;10609:194::-;10679:6;10732:2;10720:9;10711:7;10707:23;10703:32;10700:2;;;10753:6;10745;10738:22;10700:2;-1:-1:-1;10781:16:1;;10690:113;-1:-1:-1;10690:113:1:o;10808:255::-;10887:6;10895;10948:2;10936:9;10927:7;10923:23;10919:32;10916:2;;;10969:6;10961;10954:22;10916:2;-1:-1:-1;;10997:16:1;;11053:2;11038:18;;;11032:25;10997:16;;11032:25;;-1:-1:-1;10906:157:1:o;11068:274::-;11197:3;11235:6;11229:13;11251:53;11297:6;11292:3;11285:4;11277:6;11273:17;11251:53;:::i;:::-;11320:16;;;;;11205:137;-1:-1:-1;;11205:137:1:o;12074:456::-;-1:-1:-1;;;;;12361:15:1;;;12343:34;;12413:15;;;12408:2;12393:18;;12386:43;12465:15;;12460:2;12445:18;;12438:43;12512:2;12497:18;;12490:34;;;;12292:3;12277:19;;12259:271::o;12915:688::-;-1:-1:-1;;;;;13302:15:1;;;13284:34;;13354:15;;;13349:2;13334:18;;13327:43;13401:2;13386:18;;13379:34;;;;13444:2;13429:18;;13422:34;;;;13487:3;13472:19;;13465:35;13537:15;;;13264:3;13516:19;;13509:44;13584:3;13569:19;;13562:35;;;;13233:3;13218:19;;13200:403::o;15366:383::-;15515:2;15504:9;15497:21;15478:4;15547:6;15541:13;15590:6;15585:2;15574:9;15570:18;15563:34;15606:66;15665:6;15660:2;15649:9;15645:18;15640:2;15632:6;15628:15;15606:66;:::i;:::-;15733:2;15712:15;-1:-1:-1;;15708:29:1;15693:45;;;;15740:2;15689:54;;15487:262;-1:-1:-1;;15487:262:1:o;17983:342::-;18185:2;18167:21;;;18224:2;18204:18;;;18197:30;-1:-1:-1;;;18258:2:1;18243:18;;18236:48;18316:2;18301:18;;18157:168::o;20557:356::-;20759:2;20741:21;;;20778:18;;;20771:30;20837:34;20832:2;20817:18;;20810:62;20904:2;20889:18;;20731:182::o;24482:275::-;24553:2;24547:9;24618:2;24599:13;;-1:-1:-1;;24595:27:1;24583:40;;24653:18;24638:34;;24674:22;;;24635:62;24632:2;;;24700:18;;:::i;:::-;24736:2;24729:22;24527:230;;-1:-1:-1;24527:230:1:o;24762:183::-;24822:4;24855:18;24847:6;24844:30;24841:2;;;24877:18;;:::i;:::-;-1:-1:-1;24922:1:1;24918:14;24934:4;24914:25;;24831:114::o;24950:128::-;24990:3;25021:1;25017:6;25014:1;25011:13;25008:2;;;25027:18;;:::i;:::-;-1:-1:-1;25063:9:1;;24998:80::o;25083:217::-;25123:1;25149;25139:2;;-1:-1:-1;;;25174:31:1;;25228:4;25225:1;25218:15;25256:4;25181:1;25246:15;25139:2;-1:-1:-1;25285:9:1;;25129:171::o;25305:168::-;25345:7;25411:1;25407;25403:6;25399:14;25396:1;25393:21;25388:1;25381:9;25374:17;25370:45;25367:2;;;25418:18;;:::i;:::-;-1:-1:-1;25458:9:1;;25357:116::o;25478:125::-;25518:4;25546:1;25543;25540:8;25537:2;;;25551:18;;:::i;:::-;-1:-1:-1;25588:9:1;;25527:76::o;25608:258::-;25680:1;25690:113;25704:6;25701:1;25698:13;25690:113;;;25780:11;;;25774:18;25761:11;;;25754:39;25726:2;25719:10;25690:113;;;25821:6;25818:1;25815:13;25812:2;;;-1:-1:-1;;25856:1:1;25838:16;;25831:27;25661:205::o;25871:135::-;25910:3;-1:-1:-1;;25931:17:1;;25928:2;;;25951:18;;:::i;:::-;-1:-1:-1;25998:1:1;25987:13;;25918:88::o;26011:127::-;26072:10;26067:3;26063:20;26060:1;26053:31;26103:4;26100:1;26093:15;26127:4;26124:1;26117:15;26143:127;26204:10;26199:3;26195:20;26192:1;26185:31;26235:4;26232:1;26225:15;26259:4;26256:1;26249:15;26275:131;-1:-1:-1;;;;;26350:31:1;;26340:42;;26330:2;;26396:1;26393;26386:12;26330:2;26320:86;:::o;26411:118::-;26497:5;26490:13;26483:21;26476:5;26473:32;26463:2;;26519:1;26516;26509:12

Swarm Source

ipfs://8d90f02172c42d198ceecca0b296b3c3bcf93a1e8fa039763c1ca1c35e69d667
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.