Contract 0xB0880df8420974ef1b040111e5e0e95f05F8fee1

 
Ad
Ad
Txn Hash Method
Block
From
To
Value
0x0c3e45344bb32a076c403e197cea4a9e6d83c05e075422b20d7c5f4bc3761861Toggle Contract ...126509392021-06-17 8:40:295 days 11 hrs agoZapper.Fi: Deployer 2 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.00037150414
0xeee8e17406fb2fd1c1b89b055309e4b0af908d436fe0fcea9581ac41846f7cb5Zap Out124971432021-05-24 13:02:4329 days 6 hrs ago0xc95e072dbee94beff15cc9208d2907dc7b1a09df IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.008114022213
0x9735294ba9c4f2cce070659eb4b1d416607d0395d92a2ed679b79041559d3150Zap Out124971432021-05-24 13:02:4329 days 6 hrs ago0xc95e072dbee94beff15cc9208d2907dc7b1a09df IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.00533484140
0x52396c6643c782a0fda70600bf1e67d50eca4e5923a8422c060a54a62c5eba6fZap Out123637682021-05-03 21:47:3449 days 22 hrs ago0xc95e072dbee94beff15cc9208d2907dc7b1a09df IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.006516126171
0xfdaec30cb2081ebaf843254ec2602f82ed8feaa223c4b50e38446a73db18ecc7Zap Out123544382021-05-02 11:20:0551 days 8 hrs ago0xdee676e09081428b907374a55d5a6688136cdaf9 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.01234230822
0x4d5ea49f600d3f731209a4ee96fad593c39332f0843db7db706a630afd255e00Zap Out123017622021-04-24 8:10:4759 days 11 hrs ago0xe2b9d119f21bd0f0be15abbc70404d6d767e07d9 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.0179171265
0x202b0e588c671a6ec0d5dcc6a1b5045fc9d965f6a635661676a627e53dc26869Zap Out123016792021-04-24 7:48:4159 days 12 hrs ago0x2f4e16541458eab1e320debcdd90546e1df3f42d IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.03026766666
0xb37209b4cbeb9e3e8e8a0046729c0dc58333dce51efe4169671913423a350691Zap Out123015412021-04-24 7:19:0059 days 12 hrs ago0x5f5127974e6fab7128fe6baa3f35fc5d12cc939a IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.0777550260
0x58a548d3b060e3fa80a2a7f348e265cfd5548de646cc28bda614eb8a82175542Zap Out123015232021-04-24 7:14:3159 days 12 hrs ago0x98e7d41cb1822fc5e86f41c0290561cffcf87e99 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.02087831256
0x91bb3b723b520ccae674abed8d4460de57f289b0693dab817dd15804c2529787Zap Out123014062021-04-24 6:51:4759 days 13 hrs ago0xafa49611a2135ee59715e7b5396db74337909f42 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.02560404258
0xca973cd7776d391e697a89f62dff266f57b892f263e4b168ba3a44524738e728Zap Out123012042021-04-24 6:01:2659 days 13 hrs ago0xe8b0314541ea52802fbdc34addcf6fac3854eee1 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.0068917860
0x19f302d4927625dfebf04e9bb56358f3418b79cb6c37836d540fd7d4470c6d3eZap Out123007542021-04-24 4:26:3159 days 15 hrs ago0x46298b69f93378140ce8d980f4077f35568b61e5 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.0715680660
0xba6fe2227370459834063f648702d63e1bb7db1a6bcf920a059b031685e6ceb8Zap Out123007472021-04-24 4:25:1559 days 15 hrs ago0xd663354a09ab4b0e67d077a540d77c2740e30290 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.0628355460
0xad0816c6ce749eee3d90d6bce98c7fc8172dbf0745399e8cf1f86691e6c57ffaZap Out123007442021-04-24 4:24:3359 days 15 hrs ago0xc4c2661dad8aee92f6bd24f0996a49d97ce18ea6 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.18651689461
0x455fbeb7f01d0f4ace1ce75f641e37e69923f53dd919c651c82c424a058c7437Zap Out123006522021-04-24 4:06:1159 days 15 hrs ago0x8e430677ddfe39ccfbdb6e264b7b1393565a79de IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.0648045762
0xdf422cf0c4f1601f9ff45223b7ed5026cbc4ad519dc90c08a2ef0b20952b47e4Zap Out123001182021-04-24 2:04:1059 days 17 hrs ago0x45312c391cca9236cfbe90b91875ceae625fbbe3 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.07022924550668.000001459
0x72272fd0bb03009ee566c7a3716e5333a346f4d9005a6792c7f6f9ce7dd383bdZap Out123000832021-04-24 1:55:5159 days 18 hrs ago0x2028ae38b8a76bf7aa4651f8796dcf43b7f7cb90 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.02053319585
0x1fa2f08ea327920d7ee86cebe6247c60e00be91ba4461ec11818d56af9d3792aZap Out122995052021-04-23 23:39:5459 days 20 hrs agoENS Name yaiba.eth IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.09415843272
0x819e60ea3fd3117774fece7d39293ff3124a7cb9f869c78e81e1369bdaa49d01Zap Out122993362021-04-23 23:01:5059 days 20 hrs ago0x7a9505aeec08c6172a600c54889a4ca489462995 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.087288249684.6
0x20114cd919447299ea93608741613a2dc50849a2d8a4d288efcdee121261c1e0Zap Out122987552021-04-23 20:53:2759 days 23 hrs ago0x935e9e5a9001c32fc2a71632e9ab661bd3246754 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.007590576
0xeb213c765d886d2a5c6530941c2d367eebc5c64b993feb78152f3f5c5f55d588Zap Out122981822021-04-23 18:44:2660 days 1 hr ago0xc4159da6d7b732f23e713cd2866e16bca774159c IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.0140259674
0xb2160dfb54b6474195404c052e2d7aeeed8c3e2d3e2e34bfab6b87467f0a3f1aZap Out122981502021-04-23 18:37:4060 days 1 hr ago0x7d272b3548c0c6c633697cd881589741e7f21ed6 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.02091953276
0x988846b642f807cbcf5ad0640466a30a1d06936da9d295b04bb32b9fe1b6d287Zap Out122980802021-04-23 18:21:3060 days 1 hr ago0x006d0f31a00e1f9c017ab039e9d0ba699433a28c IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.004424109286.8
0xc18994fbe90030e5fd9d907d6d411f7bbc638d270526dbbc510b57b61ea8c264Zap Out122980802021-04-23 18:21:3060 days 1 hr ago0x006d0f31a00e1f9c017ab039e9d0ba699433a28c IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.00884629977
0x9d715f19a9ff548d6e209d2fe67a2a2a26f46339136a08b38dc5e648f76af105Zap Out122972112021-04-23 15:16:3560 days 4 hrs ago0xc990bd138ff23075d2e10f0a092959af2a3e91e0 IN  0xb0880df8420974ef1b040111e5e0e95f05f8fee10 Ether0.0678932190
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xca973cd7776d391e697a89f62dff266f57b892f263e4b168ba3a44524738e728123012042021-04-24 6:01:2659 days 13 hrs ago 0xb0880df8420974ef1b040111e5e0e95f05f8fee10xe8b0314541ea52802fbdc34addcf6fac3854eee11.002243988732040938 Ether
0xca973cd7776d391e697a89f62dff266f57b892f263e4b168ba3a44524738e728123012042021-04-24 6:01:2659 days 13 hrs ago Wrapped Ether 0xb0880df8420974ef1b040111e5e0e95f05f8fee11.002243988732040938 Ether
0x20114cd919447299ea93608741613a2dc50849a2d8a4d288efcdee121261c1e0122987552021-04-23 20:53:2759 days 23 hrs ago 0xb0880df8420974ef1b040111e5e0e95f05f8fee10x935e9e5a9001c32fc2a71632e9ab661bd32467540.17410374214900705 Ether
0x20114cd919447299ea93608741613a2dc50849a2d8a4d288efcdee121261c1e0122987552021-04-23 20:53:2759 days 23 hrs ago Wrapped Ether 0xb0880df8420974ef1b040111e5e0e95f05f8fee10.17410374214900705 Ether
0xc18994fbe90030e5fd9d907d6d411f7bbc638d270526dbbc510b57b61ea8c264122980802021-04-23 18:21:3060 days 1 hr ago 0xb0880df8420974ef1b040111e5e0e95f05f8fee10x006d0f31a00e1f9c017ab039e9d0ba699433a28c48.523926906861465027 Ether
0xc18994fbe90030e5fd9d907d6d411f7bbc638d270526dbbc510b57b61ea8c264122980802021-04-23 18:21:3060 days 1 hr ago Wrapped Ether 0xb0880df8420974ef1b040111e5e0e95f05f8fee148.523926906861465027 Ether
0x7fa2e105c75c576d14f9c509787530381da505830afc7a904edfaeb67c847756122757132021-04-20 7:39:1463 days 12 hrs ago 0xb0880df8420974ef1b040111e5e0e95f05f8fee10x6b642d3026d887cfd174caa2ed912f859b19827312.052028811247958381 Ether
0x7fa2e105c75c576d14f9c509787530381da505830afc7a904edfaeb67c847756122757132021-04-20 7:39:1463 days 12 hrs ago Wrapped Ether 0xb0880df8420974ef1b040111e5e0e95f05f8fee112.052028811247958381 Ether
0x4e59d732c2cd2d8328992140d923a8bc0e756c45df2b3d510d8db83e93ae9a0e122739112021-04-20 1:04:5963 days 18 hrs ago 0xb0880df8420974ef1b040111e5e0e95f05f8fee1ENS Name kernal.eth9.999999999999999879 Ether
0x4e59d732c2cd2d8328992140d923a8bc0e756c45df2b3d510d8db83e93ae9a0e122739112021-04-20 1:04:5963 days 18 hrs ago Wrapped Ether 0xb0880df8420974ef1b040111e5e0e95f05f8fee19.999999999999999879 Ether
0xa935c11e1a789905ea482531a46f99a2223d50ca4054bee20cf52113968948da122648112021-04-18 15:12:0765 days 4 hrs ago 0xb0880df8420974ef1b040111e5e0e95f05f8fee10xeeaf86e05a95261290a871dd8cdb9470d5d3c9b73.005422387662703999 Ether
0xa935c11e1a789905ea482531a46f99a2223d50ca4054bee20cf52113968948da122648112021-04-18 15:12:0765 days 4 hrs ago Wrapped Ether 0xb0880df8420974ef1b040111e5e0e95f05f8fee13.005422387662703999 Ether
0xaba4886bca4846f4aca70b7103f07eed9a4d395779a62df46dd329d0ac84e9cf122481322021-04-16 1:12:4767 days 18 hrs ago 0xb0880df8420974ef1b040111e5e0e95f05f8fee10xcb4d9715d5fab69c4a50037e102471382e16753a0.93836516692494518 Ether
0xaba4886bca4846f4aca70b7103f07eed9a4d395779a62df46dd329d0ac84e9cf122481322021-04-16 1:12:4767 days 18 hrs ago Wrapped Ether 0xb0880df8420974ef1b040111e5e0e95f05f8fee10.93836516692494518 Ether
0x5d8e54748aff7ba58e0e345efe02c83ad5b1c0d535dc4c88dd1e13d7390086c8122476242021-04-15 23:17:5067 days 20 hrs ago 0xb0880df8420974ef1b040111e5e0e95f05f8fee10x26f9b1b62ab0088fff07d1a5a64d74e6ed1edf5f0.600168041055840109 Ether
0x5d8e54748aff7ba58e0e345efe02c83ad5b1c0d535dc4c88dd1e13d7390086c8122476242021-04-15 23:17:5067 days 20 hrs ago Wrapped Ether 0xb0880df8420974ef1b040111e5e0e95f05f8fee10.600168041055840109 Ether
0x4f794ee20ac373af48980caa83939217503d7e3e8d94b06e66dffdf6e71ec5a9122455412021-04-15 15:44:2568 days 4 hrs ago 0xb0880df8420974ef1b040111e5e0e95f05f8fee10xab12253171a0d73df64b115cd43fe0a32feb9daa1.000002627465546193 Ether
0x4f794ee20ac373af48980caa83939217503d7e3e8d94b06e66dffdf6e71ec5a9122455412021-04-15 15:44:2568 days 4 hrs ago Wrapped Ether 0xb0880df8420974ef1b040111e5e0e95f05f8fee11.000002627465546193 Ether
0x0b60cdf6025a774b2cd9a86cda93998c387cf00a637380eb9637d276e3374e63122450052021-04-15 13:47:1868 days 6 hrs ago 0xb0880df8420974ef1b040111e5e0e95f05f8fee10x0aecfbf2c6c4d746e49e25767d7297c36cdc290d12.00842952855444698 Ether
0x0b60cdf6025a774b2cd9a86cda93998c387cf00a637380eb9637d276e3374e63122450052021-04-15 13:47:1868 days 6 hrs ago Wrapped Ether 0xb0880df8420974ef1b040111e5e0e95f05f8fee112.00842952855444698 Ether
0x21d3fa759147e196f48cdaf0822de44a62657a1556f8a7eeb993dfa93eefd844122442412021-04-15 10:54:2468 days 9 hrs ago 0xb0880df8420974ef1b040111e5e0e95f05f8fee10x2bec82ce6d156b28989d25fccaaea1df5f3e0d160.060412845941745875 Ether
0x21d3fa759147e196f48cdaf0822de44a62657a1556f8a7eeb993dfa93eefd844122442412021-04-15 10:54:2468 days 9 hrs ago Wrapped Ether 0xb0880df8420974ef1b040111e5e0e95f05f8fee10.060412845941745875 Ether
0x070e7b2163755088861e4bcd504e0fee03c9b85a2834d1c2d942f1d3a616ee7d122390582021-04-14 15:38:0769 days 4 hrs ago 0xb0880df8420974ef1b040111e5e0e95f05f8fee10x1ecea124df95cca7cfa0e99b1a07eebce9a2cf4824.200919292253959711 Ether
0x070e7b2163755088861e4bcd504e0fee03c9b85a2834d1c2d942f1d3a616ee7d122390582021-04-14 15:38:0769 days 4 hrs ago Wrapped Ether 0xb0880df8420974ef1b040111e5e0e95f05f8fee124.200919292253959711 Ether
0x09a02f82f9cd345f3b3105e1983c23fcc39257e26f41db8bb57b93b9cf9db32e122362192021-04-14 5:03:4369 days 14 hrs ago 0xb0880df8420974ef1b040111e5e0e95f05f8fee1ENS Name yanmu.eth255.114093195436904994 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
yVault_ZapInOut_General_V1_5

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv2 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-17
*/

// ███████╗░█████╗░██████╗░██████╗░███████╗██████╗░░░░███████╗██╗
// ╚════██║██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔══██╗░░░██╔════╝██║
// ░░███╔═╝███████║██████╔╝██████╔╝█████╗░░██████╔╝░░░█████╗░░██║
// ██╔══╝░░██╔══██║██╔═══╝░██╔═══╝░██╔══╝░░██╔══██╗░░░██╔══╝░░██║
// ███████╗██║░░██║██║░░░░░██║░░░░░███████╗██║░░██║██╗██║░░░░░██║
// ╚══════╝╚═╝░░╚═╝╚═╝░░░░░╚═╝░░░░░╚══════╝╚═╝░░╚═╝╚═╝╚═╝░░░░░╚═╝
// Copyright (C) 2020 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.
//

///@author Zapper
///@notice This contract adds/removes liquidity to/from yEarn Vaults using ETH or ERC20 Tokens.
// SPDX-License-Identifier: GPLv2

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol

pragma solidity ^0.5.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
contract ReentrancyGuard {
    bool private _notEntered;

    constructor() internal {
        // Storing an initial non-zero value makes deployment a bit more
        // expensive, but in exchange the refund on every call to nonReentrant
        // will be lower in amount. Since refunds are capped to a percetange of
        // the total transaction's gas, it is best to keep them low in cases
        // like this one, to increase the likelihood of the full refund coming
        // into effect.
        _notEntered = true;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_notEntered, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _notEntered = false;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _notEntered = true;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.5.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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol

pragma solidity ^0.5.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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;


            bytes32 accountHash
         = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account)
        internal
        pure
        returns (address payable)
    {
        return address(uint160(account));
    }

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/GSN/Context.sol

pragma solidity ^0.5.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor() internal {}

    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol

pragma solidity ^0.5.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.
 */
contract Ownable is Context {
    address payable public _owner;

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

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

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

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

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address payable newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address payable newOwner) internal {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: yVault_ZapInOut_General_V1_2.sol

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

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

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

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

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

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(
            value,
            "SafeERC20: decreased allowance below zero"
        );
        callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

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

interface IUniswapRouter02 {
    //get estimated amountOut
    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    //token 2 token
    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    //eth 2 token
    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    //token 2 eth
    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);
}

interface yVault {
    function deposit(uint256) external;

    function withdraw(uint256) external;

    function getPricePerFullShare() external view returns (uint256);

    function token() external view returns (address);
}

interface ICurveZapInGeneral {
    function ZapIn(
        address toWhomToIssue,
        address fromToken,
        address swapAddress,
        uint256 incomingTokenQty,
        uint256 minPoolTokens
    ) external payable returns (uint256 crvTokensBought);
}

interface ICurveZapOutGeneral {
    function ZapOut(
        address payable toWhomToIssue,
        address swapAddress,
        uint256 incomingCrv,
        address toToken,
        uint256 minToTokens
    ) external returns (uint256 ToTokensBought);
}

interface IAaveLendingPoolAddressesProvider {
    function getLendingPool() external view returns (address);

    function getLendingPoolCore() external view returns (address payable);
}

interface IAaveLendingPool {
    function deposit(
        address _reserve,
        uint256 _amount,
        uint16 _referralCode
    ) external payable;
}

interface IAToken {
    function redeem(uint256 _amount) external;

    function underlyingAssetAddress() external returns (address);
}

interface IWETH {
    function deposit() external payable;

    function withdraw(uint256) external;
}

contract yVault_ZapInOut_General_V1_5 is ReentrancyGuard, Ownable {
    using SafeMath for uint256;
    using Address for address;
    using SafeERC20 for IERC20;
    bool public stopped = false;
    uint16 public goodwill;

    IUniswapV2Factory
        private constant UniSwapV2FactoryAddress = IUniswapV2Factory(
        0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
    );
    IUniswapRouter02 private constant uniswapRouter = IUniswapRouter02(
        0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
    );

    ICurveZapInGeneral public CurveZapInGeneral = ICurveZapInGeneral(
        0xf9A724c2607E5766a7Bbe530D6a7e173532F9f3a
    );
    ICurveZapOutGeneral public CurveZapOutGeneral = ICurveZapOutGeneral(
        0xA3061Cf6aC1423c6F40917AD49602cBA187181Dc
    );

    IAaveLendingPoolAddressesProvider
        private constant lendingPoolAddressProvider = IAaveLendingPoolAddressesProvider(
        0x24a42fD28C976A61Df5D00D0599C34c4f90748c8
    );

    address
        private constant yCurveExchangeAddress = 0xbBC81d23Ea2c3ec7e56D39296F0cbB648873a5d3;
    address
        private constant sBtcCurveExchangeAddress = 0x7fC77b5c7614E1533320Ea6DDc2Eb61fa00A9714;
    address
        private constant bUSDCurveExchangeAddress = 0xb6c057591E073249F2D9D88Ba59a46CFC9B59EdB;
    address
        private constant threeCurveExchangeAddress = 0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7;
    address
        private constant cUSDCurveExchangeAddress = 0xeB21209ae4C2c9FF2a86ACA31E123764A3B6Bc06;

    address
        private constant yCurvePoolTokenAddress = 0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8;
    address
        private constant sBtcCurvePoolTokenAddress = 0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3;
    address
        private constant bUSDCurvePoolTokenAddress = 0x3B3Ac5386837Dc563660FB6a0937DFAa5924333B;
    address
        private constant threeCurvePoolTokenAddress = 0x6c3F90f043a72FA612cbac8115EE7e52BDe6E490;
    address
        private constant cUSDCurvePoolTokenAddress = 0x845838DF265Dcd2c412A1Dc9e959c7d08537f8a2;

    mapping(address => address) public token2Exchange; //Curve token to Curve exchange

    address
        private constant ETHAddress = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    address
        private constant wethTokenAddress = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address
        private constant zgoodwillAddress = 0x3CE37278de6388532C3949ce4e886F365B14fB56;

    uint256
        private constant deadline = 0xf000000000000000000000000000000000000000000000000000000000000000;

    event Zapin(
        address _toWhomToIssue,
        address _toYVaultAddress,
        uint256 _Outgoing
    );

    event Zapout(
        address _toWhomToIssue,
        address _fromYVaultAddress,
        address _toTokenAddress,
        uint256 _tokensRecieved
    );

    constructor() public {
        token2Exchange[yCurvePoolTokenAddress] = yCurveExchangeAddress;
        token2Exchange[bUSDCurvePoolTokenAddress] = bUSDCurveExchangeAddress;
        token2Exchange[sBtcCurvePoolTokenAddress] = sBtcCurveExchangeAddress;
        token2Exchange[threeCurvePoolTokenAddress] = threeCurveExchangeAddress;
        token2Exchange[cUSDCurvePoolTokenAddress] = cUSDCurveExchangeAddress;
    }

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

    function updateCurveZapIn(address CurveZapInGeneralAddress)
        public
        onlyOwner
    {
        require(CurveZapInGeneralAddress != address(0), "Invalid Address");
        CurveZapInGeneral = ICurveZapInGeneral(CurveZapInGeneralAddress);
    }

    function updateCurveZapOut(address CurveZapOutGeneralAddress)
        public
        onlyOwner
    {
        require(CurveZapOutGeneralAddress != address(0), "Invalid Address");
        CurveZapOutGeneral = ICurveZapOutGeneral(CurveZapOutGeneralAddress);
    }

    function addNewCurveExchange(
        address curvePoolToken,
        address curveExchangeAddress
    ) public onlyOwner {
        require(
            curvePoolToken != address(0) && curveExchangeAddress != address(0),
            "Invalid Address"
        );
        token2Exchange[curvePoolToken] = curveExchangeAddress;
    }

    /**
    @notice This function is used to add liquidity to yVaults
    @param _toWhomToIssue recipient address
    @param _toYVaultAddress The address of vault to add liquidity to
    @param _vaultType Type of underlying token: 0 token; 1 aToken; 2 LP token
    @param _fromTokenAddress The token used for investment (address(0x00) if ether)
    @param _amount The amount of ERC to invest
    @param _minYTokens for slippage
    @return yTokensRec
     */
    function ZapIn(
        address _toWhomToIssue,
        address _toYVaultAddress,
        uint16 _vaultType,
        address _fromTokenAddress,
        uint256 _amount,
        uint256 _minYTokens
    ) public payable nonReentrant stopInEmergency returns (uint256) {
        yVault vaultToEnter = yVault(_toYVaultAddress);
        address underlyingVaultToken = vaultToEnter.token();

        if (_fromTokenAddress == address(0)) {
            require(msg.value > 0, "ERR: No ETH sent");
        } else {
            require(_amount > 0, "Err: No Tokens Sent");
            require(msg.value == 0, "ERR: ETH sent with Token");

            IERC20(_fromTokenAddress).safeTransferFrom(
                msg.sender,
                address(this),
                _amount
            );
        }

        uint256 iniYTokensBal = IERC20(address(vaultToEnter)).balanceOf(
            address(this)
        );

        if (underlyingVaultToken == _fromTokenAddress) {
            IERC20(underlyingVaultToken).safeApprove(
                address(vaultToEnter),
                _amount
            );
            vaultToEnter.deposit(_amount);
        } else {
            // Curve Vaults
            if (_vaultType == 2) {

                    address curveExchangeAddr
                 = token2Exchange[underlyingVaultToken];

                uint256 tokensBought;
                if (_fromTokenAddress == address(0)) {
                    tokensBought = CurveZapInGeneral.ZapIn.value(msg.value)(
                        address(this),
                        address(0),
                        curveExchangeAddr,
                        msg.value,
                        0
                    );
                } else {
                    IERC20(_fromTokenAddress).safeApprove(
                        address(CurveZapInGeneral),
                        _amount
                    );
                    tokensBought = CurveZapInGeneral.ZapIn(
                        address(this),
                        _fromTokenAddress,
                        curveExchangeAddr,
                        _amount,
                        0
                    );
                }

                IERC20(underlyingVaultToken).safeApprove(
                    address(vaultToEnter),
                    tokensBought
                );
                vaultToEnter.deposit(tokensBought);
            } else if (_vaultType == 1) {
                address underlyingAsset = IAToken(underlyingVaultToken)
                    .underlyingAssetAddress();

                uint256 tokensBought;
                if (_fromTokenAddress == address(0)) {
                    tokensBought = _eth2Token(underlyingAsset);
                } else {
                    tokensBought = _token2Token(
                        _fromTokenAddress,
                        underlyingAsset,
                        _amount
                    );
                }

                IERC20(underlyingAsset).safeApprove(
                    lendingPoolAddressProvider.getLendingPoolCore(),
                    tokensBought
                );

                IAaveLendingPool(lendingPoolAddressProvider.getLendingPool())
                    .deposit(underlyingAsset, tokensBought, 0);

                uint256 aTokensBought = IERC20(underlyingVaultToken).balanceOf(
                    address(this)
                );
                IERC20(underlyingVaultToken).safeApprove(
                    address(vaultToEnter),
                    aTokensBought
                );
                vaultToEnter.deposit(aTokensBought);
            } else {
                uint256 tokensBought;
                if (_fromTokenAddress == address(0)) {
                    tokensBought = _eth2Token(underlyingVaultToken);
                } else {
                    tokensBought = _token2Token(
                        _fromTokenAddress,
                        underlyingVaultToken,
                        _amount
                    );
                }

                IERC20(underlyingVaultToken).safeApprove(
                    address(vaultToEnter),
                    tokensBought
                );
                vaultToEnter.deposit(tokensBought);
            }
        }

        uint256 yTokensRec = IERC20(address(vaultToEnter))
            .balanceOf(address(this))
            .sub(iniYTokensBal);
        require(yTokensRec >= _minYTokens, "High Slippage");

        //transfer goodwill
        uint256 goodwillPortion = _transferGoodwill(
            address(vaultToEnter),
            yTokensRec
        );

        IERC20(address(vaultToEnter)).safeTransfer(
            _toWhomToIssue,
            yTokensRec.sub(goodwillPortion)
        );

        emit Zapin(
            _toWhomToIssue,
            address(vaultToEnter),
            yTokensRec.sub(goodwillPortion)
        );

        return (yTokensRec.sub(goodwillPortion));
    }

    /**
    @notice This function is used to remove liquidity from yVaults
    @param _toWhomToIssue recipient address
    @param _ToTokenContractAddress The address of the token to withdraw
    @param _fromYVaultAddress The address of the vault to exit
    @param _vaultType Type of underlying token: 0 token; 1 aToken; 2 LP token
    @param _IncomingAmt The amount of vault tokens removed
    @param _minTokensRec for slippage
    @return toTokensReceived
     */
    function ZapOut(
        address payable _toWhomToIssue,
        address _ToTokenContractAddress,
        address _fromYVaultAddress,
        uint16 _vaultType,
        uint256 _IncomingAmt,
        uint256 _minTokensRec
    ) public nonReentrant stopInEmergency returns (uint256) {
        yVault vaultToExit = yVault(_fromYVaultAddress);
        address underlyingVaultToken = vaultToExit.token();

        IERC20(address(vaultToExit)).safeTransferFrom(
            msg.sender,
            address(this),
            _IncomingAmt
        );

        uint256 goodwillPortion = _transferGoodwill(
            address(vaultToExit),
            _IncomingAmt
        );

        vaultToExit.withdraw(_IncomingAmt.sub(goodwillPortion));
        uint256 underlyingReceived = IERC20(underlyingVaultToken).balanceOf(
            address(this)
        );

        uint256 toTokensReceived;
        if (_ToTokenContractAddress == underlyingVaultToken) {
            IERC20(underlyingVaultToken).safeTransfer(
                _toWhomToIssue,
                underlyingReceived
            );
            toTokensReceived = underlyingReceived;
        } else {
            if (_vaultType == 2) {
                toTokensReceived = _withdrawFromCurve(
                    underlyingVaultToken,
                    underlyingReceived,
                    _toWhomToIssue,
                    _ToTokenContractAddress,
                    0
                );
            } else if (_vaultType == 1) {
                // unwrap atoken
                IAToken(underlyingVaultToken).redeem(underlyingReceived);
                address underlyingAsset = IAToken(underlyingVaultToken)
                    .underlyingAssetAddress();

                // swap
                if (_ToTokenContractAddress == address(0)) {
                    toTokensReceived = _token2Eth(
                        underlyingAsset,
                        underlyingReceived,
                        _toWhomToIssue
                    );
                } else {
                    toTokensReceived = _token2Token(
                        underlyingAsset,
                        _ToTokenContractAddress,
                        underlyingReceived
                    );
                    IERC20(_ToTokenContractAddress).safeTransfer(
                        _toWhomToIssue,
                        toTokensReceived
                    );
                }
            } else {
                if (_ToTokenContractAddress == address(0)) {
                    toTokensReceived = _token2Eth(
                        underlyingVaultToken,
                        underlyingReceived,
                        _toWhomToIssue
                    );
                } else {
                    toTokensReceived = _token2Token(
                        underlyingVaultToken,
                        _ToTokenContractAddress,
                        underlyingReceived
                    );

                    IERC20(_ToTokenContractAddress).safeTransfer(
                        _toWhomToIssue,
                        toTokensReceived
                    );
                }
            }
        }

        require(toTokensReceived >= _minTokensRec, "High Slippage");

        emit Zapout(
            _toWhomToIssue,
            _fromYVaultAddress,
            _ToTokenContractAddress,
            toTokensReceived
        );

        return toTokensReceived;
    }

    function _withdrawFromCurve(
        address _CurvePoolToken,
        uint256 _tokenAmt,
        address _toWhomToIssue,
        address _ToTokenContractAddress,
        uint256 _minTokensRec
    ) internal returns (uint256) {
        IERC20(_CurvePoolToken).safeApprove(
            address(CurveZapOutGeneral),
            _tokenAmt
        );

        address curveExchangeAddr = token2Exchange[_CurvePoolToken];

        return (
            CurveZapOutGeneral.ZapOut(
                Address.toPayable(_toWhomToIssue),
                curveExchangeAddr,
                _tokenAmt,
                _ToTokenContractAddress,
                _minTokensRec
            )
        );
    }

    /**
    @notice This function is used to swap eth for tokens
    @param _tokenContractAddress Token address which we want to buy
    @return tokensBought The quantity of token bought
     */
    function _eth2Token(address _tokenContractAddress)
        internal
        returns (uint256 tokensBought)
    {
        if (_tokenContractAddress == wethTokenAddress) {
            IWETH(wethTokenAddress).deposit.value(msg.value)();
            return msg.value;
        }

        address[] memory path = new address[](2);
        path[0] = wethTokenAddress;
        path[1] = _tokenContractAddress;
        tokensBought = uniswapRouter.swapExactETHForTokens.value(msg.value)(
            1,
            path,
            address(this),
            deadline
        )[path.length - 1];
    }

    /**
    @notice This function is used to swap tokens
    @param _FromTokenContractAddress The token address to swap from
    @param _ToTokenContractAddress The token address to swap to
    @param tokens2Trade The amount of tokens to swap
    @return tokenBought The quantity of tokens bought
    */
    function _token2Token(
        address _FromTokenContractAddress,
        address _ToTokenContractAddress,
        uint256 tokens2Trade
    ) internal returns (uint256 tokenBought) {
        if (_FromTokenContractAddress == _ToTokenContractAddress) {
            return tokens2Trade;
        }

        IERC20(_FromTokenContractAddress).safeApprove(
            address(uniswapRouter),
            tokens2Trade
        );

        if (_FromTokenContractAddress != wethTokenAddress) {
            if (_ToTokenContractAddress != wethTokenAddress) {
                address[] memory path = new address[](3);
                path[0] = _FromTokenContractAddress;
                path[1] = wethTokenAddress;
                path[2] = _ToTokenContractAddress;
                tokenBought = uniswapRouter.swapExactTokensForTokens(
                    tokens2Trade,
                    1,
                    path,
                    address(this),
                    deadline
                )[path.length - 1];
            } else {
                address[] memory path = new address[](2);
                path[0] = _FromTokenContractAddress;
                path[1] = wethTokenAddress;

                tokenBought = uniswapRouter.swapExactTokensForTokens(
                    tokens2Trade,
                    1,
                    path,
                    address(this),
                    deadline
                )[path.length - 1];
            }
        } else {
            address[] memory path = new address[](2);
            path[0] = wethTokenAddress;
            path[1] = _ToTokenContractAddress;
            tokenBought = uniswapRouter.swapExactTokensForTokens(
                tokens2Trade,
                1,
                path,
                address(this),
                deadline
            )[path.length - 1];
        }
    }

    function _token2Eth(
        address _FromTokenContractAddress,
        uint256 tokens2Trade,
        address payable _toWhomToIssue
    ) internal returns (uint256) {
        if (_FromTokenContractAddress == wethTokenAddress) {
            IWETH(wethTokenAddress).withdraw(tokens2Trade);
            _toWhomToIssue.transfer(tokens2Trade);
            return tokens2Trade;
        }

        IERC20(_FromTokenContractAddress).safeApprove(
            address(uniswapRouter),
            tokens2Trade
        );

        address[] memory path = new address[](2);
        path[0] = _FromTokenContractAddress;
        path[1] = wethTokenAddress;
        uint256 ethBought = uniswapRouter.swapExactTokensForETH(
            tokens2Trade,
            1,
            path,
            _toWhomToIssue,
            deadline
        )[path.length - 1];

        return ethBought;
    }

    /**
    @notice This function is used to calculate and transfer goodwill
    @param _tokenContractAddress Token in which goodwill is deducted
    @param tokens2Trade The total amount of tokens to be zapped in
    @return goodwillPortion The quantity of goodwill deducted
     */
    function _transferGoodwill(
        address _tokenContractAddress,
        uint256 tokens2Trade
    ) internal returns (uint256 goodwillPortion) {
        goodwillPortion = SafeMath.div(
            SafeMath.mul(tokens2Trade, goodwill),
            10000
        );

        if (goodwillPortion == 0) {
            return 0;
        }

        IERC20(_tokenContractAddress).safeTransfer(
            zgoodwillAddress,
            goodwillPortion
        );
    }

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

    function inCaseTokengetsStuck(IERC20 _TokenAddress) public onlyOwner {
        uint256 qty = _TokenAddress.balanceOf(address(this));
        IERC20(address(_TokenAddress)).safeTransfer(owner(), qty);
    }

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

    // - to withdraw any ETH balance sitting in the contract
    function withdraw() public onlyOwner {
        uint256 contractBalance = address(this).balance;
        address payable _to = Address.toPayable(owner());
        _to.transfer(contractBalance);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"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":"_toWhomToIssue","type":"address"},{"indexed":false,"internalType":"address","name":"_toYVaultAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_Outgoing","type":"uint256"}],"name":"Zapin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_toWhomToIssue","type":"address"},{"indexed":false,"internalType":"address","name":"_fromYVaultAddress","type":"address"},{"indexed":false,"internalType":"address","name":"_toTokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokensRecieved","type":"uint256"}],"name":"Zapout","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"CurveZapInGeneral","outputs":[{"internalType":"contract ICurveZapInGeneral","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CurveZapOutGeneral","outputs":[{"internalType":"contract ICurveZapOutGeneral","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_toWhomToIssue","type":"address"},{"internalType":"address","name":"_toYVaultAddress","type":"address"},{"internalType":"uint16","name":"_vaultType","type":"uint16"},{"internalType":"address","name":"_fromTokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minYTokens","type":"uint256"}],"name":"ZapIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_toWhomToIssue","type":"address"},{"internalType":"address","name":"_ToTokenContractAddress","type":"address"},{"internalType":"address","name":"_fromYVaultAddress","type":"address"},{"internalType":"uint16","name":"_vaultType","type":"uint16"},{"internalType":"uint256","name":"_IncomingAmt","type":"uint256"},{"internalType":"uint256","name":"_minTokensRec","type":"uint256"}],"name":"ZapOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"_owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"curvePoolToken","type":"address"},{"internalType":"address","name":"curveExchangeAddress","type":"address"}],"name":"addNewCurveExchange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"goodwill","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"_TokenAddress","type":"address"}],"name":"inCaseTokengetsStuck","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint16","name":"_new_goodwill","type":"uint16"}],"name":"set_new_goodwill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"toggleContractActive","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"token2Exchange","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"CurveZapInGeneralAddress","type":"address"}],"name":"updateCurveZapIn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"CurveZapOutGeneralAddress","type":"address"}],"name":"updateCurveZapOut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526000805460ff60a81b19169055600180546001600160a01b031990811673f9a724c2607e5766a7bbe530d6a7e173532f9f3a179091556002805490911673a3061cf6ac1423c6f40917ad49602cba187181dc17905534801561006557600080fd5b506000805460ff191660011781556100846001600160e01b0361023516565b60008054610100600160a81b0319166101006001600160a01b038416908102919091178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060036020527fb7fcaaf28987ec357d74b227f8e49166c48e3d2708bf04acc2e502f4dab8bda980546001600160a01b031990811673bbc81d23ea2c3ec7e56d39296f0cbb648873a5d3179091557f1d4dc5404c5246d10ff5d26ba6096000f3abe1efef6df233389c4c121018d3d68054821673b6c057591e073249f2d9d88ba59a46cfc9b59edb1790557ff67e9a05206ffeaf4796d1b3b418e5d6e5ab27bb7a56f66c6eb1f4e4dd65ee3f80548216737fc77b5c7614e1533320ea6ddc2eb61fa00a97141790557feac489d5fce2cac016ee12cfecd5eeb23412aa5d77cdb3e1d0fab0572adba7b28054821673bebc44782c7db0a1a60cb6fe97d0b483032ff1c717905573845838df265dcd2c412a1dc9e959c7d08537f8a26000527faf2c29d3481d3cd646e904743c2ddcf2656baff4208a71dea2f10c759d305b14805490911673eb21209ae4c2c9ff2a86aca31e123764a3b6bc06179055610239565b3390565b61306680620002496000396000f3fe6080604052600436106101145760003560e01c8063798ae4f5116100a0578063b10e1dbc11610064578063b10e1dbc146103cc578063b2bdfa7b146103fa578063d1bd82051461040f578063f2fde38b1461045d578063fbf0c6f11461049057610114565b8063798ae4f5146102ef57806381920133146103045780638da5cb5b1461036f5780638f32d59b146103845780638ff27fcc1461039957610114565b80635901ae54116100e75780635901ae54146101fb5780635de0398e14610236578063715018a61461026257806375f12b211461027757806377db4169146102a057610114565b80631385d24c1461016b578063399355d3146101805780633ccfd60b146101b3578063551196d5146101c8575b33321415610169576040805162461bcd60e51b815260206004820152601860248201527f446f206e6f742073656e6420455448206469726563746c790000000000000000604482015290519081900360640190fd5b005b34801561017757600080fd5b506101696104a5565b34801561018c57600080fd5b50610169600480360360208110156101a357600080fd5b50356001600160a01b031661050d565b3480156101bf57600080fd5b506101696105c3565b3480156101d457600080fd5b50610169600480360360208110156101eb57600080fd5b50356001600160a01b031661065b565b34801561020757600080fd5b506101696004803603604081101561021e57600080fd5b506001600160a01b0381358116916020013516610740565b34801561024257600080fd5b5061024b610818565b6040805161ffff9092168252519081900360200190f35b34801561026e57600080fd5b50610169610829565b34801561028357600080fd5b5061028c6108bf565b604080519115158252519081900360200190f35b3480156102ac57600080fd5b506102d3600480360360208110156102c357600080fd5b50356001600160a01b03166108cf565b604080516001600160a01b039092168252519081900360200190f35b3480156102fb57600080fd5b506102d36108ea565b34801561031057600080fd5b5061035d600480360360c081101561032757600080fd5b506001600160a01b03813581169160208101358216916040820135169061ffff6060820135169060808101359060a001356108f9565b60408051918252519081900360200190f35b34801561037b57600080fd5b506102d3610d9a565b34801561039057600080fd5b5061028c610dae565b3480156103a557600080fd5b50610169600480360360208110156103bc57600080fd5b50356001600160a01b0316610dd7565b3480156103d857600080fd5b50610169600480360360208110156103ef57600080fd5b503561ffff16610e8d565b34801561040657600080fd5b506102d3610f50565b61035d600480360360c081101561042557600080fd5b506001600160a01b038135811691602081013582169161ffff6040830135169160608101359091169060808101359060a00135610f64565b34801561046957600080fd5b506101696004803603602081101561048057600080fd5b50356001600160a01b0316611a12565b34801561049c57600080fd5b506102d3611a65565b6104ad610dae565b6104ec576040805162461bcd60e51b81526020600482018190526024820152600080516020612fb2833981519152604482015290519081900360640190fd5b6000805460ff60a81b198116600160a81b9182900460ff1615909102179055565b610515610dae565b610554576040805162461bcd60e51b81526020600482018190526024820152600080516020612fb2833981519152604482015290519081900360640190fd5b6001600160a01b0381166105a1576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6105cb610dae565b61060a576040805162461bcd60e51b81526020600482018190526024820152600080516020612fb2833981519152604482015290519081900360640190fd5b47600061061d610618610d9a565b611a74565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610656573d6000803e3d6000fd5b505050565b610663610dae565b6106a2576040805162461bcd60e51b81526020600482018190526024820152600080516020612fb2833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156106ec57600080fd5b505afa158015610700573d6000803e3d6000fd5b505050506040513d602081101561071657600080fd5b5051905061073c610725610d9a565b6001600160a01b038416908363ffffffff611a7b16565b5050565b610748610dae565b610787576040805162461bcd60e51b81526020600482018190526024820152600080516020612fb2833981519152604482015290519081900360640190fd5b6001600160a01b038216158015906107a757506001600160a01b03811615155b6107ea576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015290519081900360640190fd5b6001600160a01b03918216600090815260036020526040902080546001600160a01b03191691909216179055565b600054600160b01b900461ffff1681565b610831610dae565b610870576040805162461bcd60e51b81526020600482018190526024820152600080516020612fb2833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b600054600160a81b900460ff1681565b6003602052600090815260409020546001600160a01b031681565b6002546001600160a01b031681565b6000805460ff16610951576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff191690819055600160a81b900460ff16156109ae576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b60008590506000816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109ee57600080fd5b505afa158015610a02573d6000803e3d6000fd5b505050506040513d6020811015610a1857600080fd5b50519050610a376001600160a01b03831633308863ffffffff611acd16565b6000610a438387611b2d565b90506001600160a01b038316632e1a7d4d610a64888463ffffffff611b9616565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610a9a57600080fd5b505af1158015610aae573d6000803e3d6000fd5b5050604080516370a0823160e01b81523060048201529051600093506001600160a01b03861692506370a0823191602480820192602092909190829003018186803b158015610afc57600080fd5b505afa158015610b10573d6000803e3d6000fd5b505050506040513d6020811015610b2657600080fd5b5051905060006001600160a01b038b81169085161415610b6157610b5a6001600160a01b0385168d8463ffffffff611a7b16565b5080610ce6565b8861ffff1660021415610b8357610b7c84838e8e6000611bdf565b9050610ce6565b8861ffff1660011415610ca657836001600160a01b031663db006a75836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610bd657600080fd5b505af1158015610bea573d6000803e3d6000fd5b505050506000846001600160a01b03166389d1a0fc6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610c2b57600080fd5b505af1158015610c3f573d6000803e3d6000fd5b505050506040513d6020811015610c5557600080fd5b505190506001600160a01b038c16610c7957610c7281848f611cce565b9150610ca0565b610c84818d85612021565b9150610ca06001600160a01b038d168e8463ffffffff611a7b16565b50610ce6565b6001600160a01b038b16610cbf57610b7c84838e611cce565b610cca848c84612021565b9050610ce66001600160a01b038c168d8363ffffffff611a7b16565b86811015610d2b576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b604080516001600160a01b03808f168252808d1660208301528d16818301526060810183905290517fccd66be260e4d251757c46211a144a9df723fe5d98726e537a900b7115b0e74d9181900360800190a19450505050506000805460ff191660011790559695505050505050565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b0316610dc8612765565b6001600160a01b031614905090565b610ddf610dae565b610e1e576040805162461bcd60e51b81526020600482018190526024820152600080516020612fb2833981519152604482015290519081900360640190fd5b6001600160a01b038116610e6b576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610e95610dae565b610ed4576040805162461bcd60e51b81526020600482018190526024820152600080516020612fb2833981519152604482015290519081900360640190fd5b6127108161ffff1610610f2e576040805162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b6000805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b60005461010090046001600160a01b031681565b6000805460ff16610fbc576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff191690819055600160a81b900460ff1615611019576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b60008690506000816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561105957600080fd5b505afa15801561106d573d6000803e3d6000fd5b505050506040513d602081101561108357600080fd5b505190506001600160a01b0386166110e257600034116110dd576040805162461bcd60e51b815260206004820152601060248201526f1154948e88139bc8115512081cd95b9d60821b604482015290519081900360640190fd5b61119b565b6000851161112d576040805162461bcd60e51b8152602060048201526013602482015272115c9c8e88139bc8151bdad95b9cc814d95b9d606a1b604482015290519081900360640190fd5b3415611180576040805162461bcd60e51b815260206004820152601860248201527f4552523a204554482073656e74207769746820546f6b656e0000000000000000604482015290519081900360640190fd5b61119b6001600160a01b03871633308863ffffffff611acd16565b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b1580156111e557600080fd5b505afa1580156111f9573d6000803e3d6000fd5b505050506040513d602081101561120f57600080fd5b505190506001600160a01b0382811690881614156112a4576112416001600160a01b038316848863ffffffff61276916565b826001600160a01b031663b6b55f25876040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561128757600080fd5b505af115801561129b573d6000803e3d6000fd5b50505050611874565b8761ffff16600214156114b3576001600160a01b0380831660009081526003602052604081205482169189166113785760015460408051632d4242f760e21b81523060048201526000602482018190526001600160a01b038681166044840152346064840181905260848401929092529251929093169263b5090bdc92909160a48082019260209290919082900301818588803b15801561134457600080fd5b505af1158015611358573d6000803e3d6000fd5b50505050506040513d602081101561136f57600080fd5b50519050611434565b600154611398906001600160a01b038b811691168a63ffffffff61276916565b60015460408051632d4242f760e21b81523060048201526001600160a01b038c811660248301528581166044830152606482018c9052600060848301819052925193169263b5090bdc9260a480840193602093929083900390910190829087803b15801561140557600080fd5b505af1158015611419573d6000803e3d6000fd5b505050506040513d602081101561142f57600080fd5b505190505b61144e6001600160a01b038516868363ffffffff61276916565b846001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561149457600080fd5b505af11580156114a8573d6000803e3d6000fd5b505050505050611874565b8761ffff16600114156117cc576000826001600160a01b03166389d1a0fc6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114fd57600080fd5b505af1158015611511573d6000803e3d6000fd5b505050506040513d602081101561152757600080fd5b5051905060006001600160a01b03891661154b576115448261287c565b9050611559565b61155689838a612021565b90505b6115ec7324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b1580156115a957600080fd5b505afa1580156115bd573d6000803e3d6000fd5b505050506040513d60208110156115d357600080fd5b50516001600160a01b038416908363ffffffff61276916565b7324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561163957600080fd5b505afa15801561164d573d6000803e3d6000fd5b505050506040513d602081101561166357600080fd5b505160408051636968703360e11b81526001600160a01b03858116600483015260248201859052600060448301819052925193169263d2d0e0669260648084019391929182900301818387803b1580156116bc57600080fd5b505af11580156116d0573d6000803e3d6000fd5b5050604080516370a0823160e01b81523060048201529051600093506001600160a01b03881692506370a0823191602480820192602092909190829003018186803b15801561171e57600080fd5b505afa158015611732573d6000803e3d6000fd5b505050506040513d602081101561174857600080fd5b505190506117666001600160a01b038616878363ffffffff61276916565b856001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156117ac57600080fd5b505af11580156117c0573d6000803e3d6000fd5b50505050505050611874565b60006001600160a01b0388166117ec576117e58361287c565b90506117fa565b6117f7888489612021565b90505b6118146001600160a01b038416858363ffffffff61276916565b836001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561185a57600080fd5b505af115801561186e573d6000803e3d6000fd5b50505050505b600061190882856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118d057600080fd5b505afa1580156118e4573d6000803e3d6000fd5b505050506040513d60208110156118fa57600080fd5b50519063ffffffff611b9616565b90508581101561194f576040805162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b604482015290519081900360640190fd5b600061195b8583611b2d565b90506119888c611971848463ffffffff611b9616565b6001600160a01b038816919063ffffffff611a7b16565b7f7c58760c09b45377b9759b1584bfa97aaad8a040feb4ec965b2b76e20b4af07f8c866119bb858563ffffffff611b9616565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190a16119f4828263ffffffff611b9616565b955050505050506000805460ff191660011790559695505050505050565b611a1a610dae565b611a59576040805162461bcd60e51b81526020600482018190526024820152600080516020612fb2833981519152604482015290519081900360640190fd5b611a6281612b34565b50565b6001546001600160a01b031681565b805b919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610656908490612bdf565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611b27908590612bdf565b50505050565b60008054611b5390611b4b908490600160b01b900461ffff16612d97565b612710612df0565b905080611b6257506000611b90565b611b906001600160a01b038416733ce37278de6388532c3949ce4e886f365b14fb568363ffffffff611a7b16565b92915050565b6000611bd883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e32565b9392505050565b600254600090611c02906001600160a01b0388811691168763ffffffff61276916565b6001600160a01b0380871660009081526003602052604090205460025490821691166304a863d4611c3287611a74565b604080516001600160e01b031960e085901b1681526001600160a01b0392831660048201528286166024820152604481018b90529188166064830152608482018790525160a48083019260209291908290030181600087803b158015611c9757600080fd5b505af1158015611cab573d6000803e3d6000fd5b505050506040513d6020811015611cc157600080fd5b5051979650505050505050565b60006001600160a01b03841673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21415611da65773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611d4f57600080fd5b505af1158015611d63573d6000803e3d6000fd5b50506040516001600160a01b038516925085156108fc02915085906000818181858888f19350505050158015611d9d573d6000803e3d6000fd5b50829050611bd8565b611dd46001600160a01b038516737a250d5630b4cf539739df2c5dacb4c659f2488d8563ffffffff61276916565b60408051600280825260608083018452926020830190803883390190505090508481600081518110611e0257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611e4457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166318cbafe58660018588600f60fc1b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611f0c578181015183820152602001611ef4565b505050509050019650505050505050600060405180830381600087803b158015611f3557600080fd5b505af1158015611f49573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f7257600080fd5b8101908080516040519392919084600160201b821115611f9157600080fd5b908301906020820185811115611fa657600080fd5b82518660208202830111600160201b82111715611fc257600080fd5b82525081516020918201928201910280838360005b83811015611fef578181015183820152602001611fd7565b5050505090500160405250505060018351038151811061200b57fe5b6020026020010151905080925050509392505050565b6000826001600160a01b0316846001600160a01b03161415612044575080611bd8565b6120726001600160a01b038516737a250d5630b4cf539739df2c5dacb4c659f2488d8463ffffffff61276916565b6001600160a01b03841673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21461253b576001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214612312576040805160038082526080820190925260609160208201838038833901905050905084816000815181106120ea57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061212c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838160028151811061215a57fe5b6001600160a01b039092166020928302919091018201526040516338ed173960e01b8152600481018581526001602483018190523060648401819052600f60fc1b6084850181905260a060448601908152875160a48701528751737a250d5630b4cf539739df2c5dacb4c659f2488d976338ed1739978c978b9695949093909260c490920191878101910280838360005b838110156122035781810151838201526020016121eb565b505050509050019650505050505050600060405180830381600087803b15801561222c57600080fd5b505af1158015612240573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561226957600080fd5b8101908080516040519392919084600160201b82111561228857600080fd5b90830190602082018581111561229d57600080fd5b82518660208202830111600160201b821117156122b957600080fd5b82525081516020918201928201910280838360005b838110156122e65781810151838201526020016122ce565b5050505090500160405250505060018251038151811061230257fe5b6020026020010151915050612536565b6040805160028082526060808301845292602083019080388339019050509050848160008151811061234057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061238257fe5b6001600160a01b039092166020928302919091018201526040516338ed173960e01b8152600481018581526001602483018190523060648401819052600f60fc1b6084850181905260a060448601908152875160a48701528751737a250d5630b4cf539739df2c5dacb4c659f2488d976338ed1739978c978b9695949093909260c490920191878101910280838360005b8381101561242b578181015183820152602001612413565b505050509050019650505050505050600060405180830381600087803b15801561245457600080fd5b505af1158015612468573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561249157600080fd5b8101908080516040519392919084600160201b8211156124b057600080fd5b9083019060208201858111156124c557600080fd5b82518660208202830111600160201b821117156124e157600080fd5b82525081516020918201928201910280838360005b8381101561250e5781810151838201526020016124f6565b5050505090500160405250505060018251038151811061252a57fe5b60200260200101519150505b611bd8565b604080516002808252606080830184529260208301908038833901905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061257d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083816001815181106125ab57fe5b6001600160a01b039092166020928302919091018201526040516338ed173960e01b8152600481018581526001602483018190523060648401819052600f60fc1b6084850181905260a060448601908152875160a48701528751737a250d5630b4cf539739df2c5dacb4c659f2488d976338ed1739978c978b9695949093909260c490920191878101910280838360005b8381101561265457818101518382015260200161263c565b505050509050019650505050505050600060405180830381600087803b15801561267d57600080fd5b505af1158015612691573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156126ba57600080fd5b8101908080516040519392919084600160201b8211156126d957600080fd5b9083019060208201858111156126ee57600080fd5b82518660208202830111600160201b8211171561270a57600080fd5b82525081516020918201928201910280838360005b8381101561273757818101518382015260200161271f565b5050505090500160405250505060018251038151811061275357fe5b60200260200101519150509392505050565b3390565b8015806127ef575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156127c157600080fd5b505afa1580156127d5573d6000803e3d6000fd5b505050506040513d60208110156127eb57600080fd5b5051155b61282a5760405162461bcd60e51b8152600401808060200182810382526036815260200180612ffc6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610656908490612bdf565b60006001600160a01b03821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156129135773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156128f257600080fd5b505af1158015612906573d6000803e3d6000fd5b5050505050349050611a76565b604080516002808252606080830184529260208301908038833901905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061295557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061298357fe5b6001600160a01b03909216602092830291909101820152604051637ff36ab560e01b81526001600482018181523060448401819052600f60fc1b60648501819052608060248601908152875160848701528751737a250d5630b4cf539739df2c5dacb4c659f2488d97637ff36ab5973497968b9695949093909260a490920191878101910280838360005b83811015612a26578181015183820152602001612a0e565b50505050905001955050505050506000604051808303818588803b158015612a4d57600080fd5b505af1158015612a61573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526020811015612a8b57600080fd5b8101908080516040519392919084600160201b821115612aaa57600080fd5b908301906020820185811115612abf57600080fd5b82518660208202830111600160201b82111715612adb57600080fd5b82525081516020918201928201910280838360005b83811015612b08578181015183820152602001612af0565b50505050905001604052505050600182510381518110612b2457fe5b6020026020010151915050919050565b6001600160a01b038116612b795760405162461bcd60e51b8152600401808060200182810382526026815260200180612f6b6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b612bf1826001600160a01b0316612ec9565b612c42576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310612c805780518252601f199092019160209182019101612c61565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612ce2576040519150601f19603f3d011682016040523d82523d6000602084013e612ce7565b606091505b509150915081612d3e576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115611b2757808060200190516020811015612d5a57600080fd5b5051611b275760405162461bcd60e51b815260040180806020018281038252602a815260200180612fd2602a913960400191505060405180910390fd5b600082612da657506000611b90565b82820282848281612db357fe5b0414611bd85760405162461bcd60e51b8152600401808060200182810382526021815260200180612f916021913960400191505060405180910390fd5b6000611bd883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f05565b60008184841115612ec15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e86578181015183820152602001612e6e565b50505050905090810190601f168015612eb35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612efd57508115155b949350505050565b60008183612f545760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612e86578181015183820152602001612e6e565b506000838581612f6057fe5b049594505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820184a43a060b0273986d1b0e862f73f891f6ddb7b2fa3a0a845e623c3b0c50d0764736f6c63430005110032

Deployed ByteCode Sourcemap

27805:20339:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48081:10;48095:9;48081:23;;48073:60;;;;;-1:-1:-1;;;48073:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27805:20339;47668:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47668:86:0;;;:::i;31309:260::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31309:260:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31309:260:0;-1:-1:-1;;;;;31309:260:0;;:::i;47824:202::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47824:202:0;;;:::i;47420:208::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47420:208:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47420:208:0;-1:-1:-1;;;;;47420:208:0;;:::i;31851:339::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31851:339:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31851:339:0;;;;;;;;;;:::i;28010:22::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28010:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19301:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19301:140:0;;;:::i;27976:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27976:27:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;29893:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29893:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29893:49:0;-1:-1:-1;;;;;29893:49:0;;:::i;:::-;;;;-1:-1:-1;;;;;29893:49:0;;;;;;;;;;;;;;28461:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28461:127:0;;;:::i;38201:3522::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38201:3522:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;38201:3522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18490:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18490:79:0;;;:::i;18856:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18856:94:0;;;:::i;31577:266::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31577:266:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31577:266:0;-1:-1:-1;;;;;31577:266:0;;:::i;47174:238::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47174:238:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47174:238:0;;;;:::i;17985:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17985:29:0;;;:::i;32667:5050::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;32667:5050:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19596:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19596:117:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19596:117:0;-1:-1:-1;;;;;19596:117:0;;:::i;28330:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28330:124:0;;;:::i;47668:86::-;18702:9;:7;:9::i;:::-;18694:54;;;;;-1:-1:-1;;;18694:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18694:54:0;;;;;;;;;;;;;;;47739:7;;;-1:-1:-1;;;;47728:18:0;;-1:-1:-1;;;47739:7:0;;;;;;47738:8;47728:18;;;;;;47668:86::o;31309:260::-;18702:9;:7;:9::i;:::-;18694:54;;;;;-1:-1:-1;;;18694:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18694:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31428:38:0;;31420:66;;;;;-1:-1:-1;;;31420:66:0;;;;;;;;;;;;-1:-1:-1;;;31420:66:0;;;;;;;;;;;;;;;31497:17;:64;;-1:-1:-1;;;;;;31497:64:0;-1:-1:-1;;;;;31497:64:0;;;;;;;;;;31309:260::o;47824:202::-;18702:9;:7;:9::i;:::-;18694:54;;;;;-1:-1:-1;;;18694:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18694:54:0;;;;;;;;;;;;;;;47898:21;47872:23;47952:26;47970:7;:5;:7::i;:::-;47952:17;:26::i;:::-;47989:29;;47930:48;;-1:-1:-1;;;;;;47989:12:0;;;:29;;;;;48002:15;;47989:29;;;;48002:15;47989:12;:29;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47989:29:0;18759:1;;47824:202::o;47420:208::-;18702:9;:7;:9::i;:::-;18694:54;;;;;-1:-1:-1;;;18694:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18694:54:0;;;;;;;;;;;;;;;47514:38;;;-1:-1:-1;;;47514:38:0;;47546:4;47514:38;;;;;;47500:11;;-1:-1:-1;;;;;47514:23:0;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;47514:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47514:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47514:38:0;;-1:-1:-1;47563:57:0;47607:7;:5;:7::i;:::-;-1:-1:-1;;;;;47563:43:0;;;47616:3;47563:57;:43;:57;:::i;:::-;18759:1;47420:208;:::o;31851:339::-;18702:9;:7;:9::i;:::-;18694:54;;;;;-1:-1:-1;;;18694:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18694:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32009:28:0;;;;;;:66;;-1:-1:-1;;;;;;32041:34:0;;;;32009:66;31987:131;;;;;-1:-1:-1;;;31987:131:0;;;;;;;;;;;;-1:-1:-1;;;31987:131:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32129:30:0;;;;;;;:14;:30;;;;;:53;;-1:-1:-1;;;;;;32129:53:0;;;;;;;;31851:339::o;28010:22::-;;;-1:-1:-1;;;28010:22:0;;;;;:::o;19301:140::-;18702:9;:7;:9::i;:::-;18694:54;;;;;-1:-1:-1;;;18694:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18694:54:0;;;;;;;;;;;;;;;19400:1;19384:6;;19363:40;;19384:6;;;;-1:-1:-1;;;;;19384:6:0;;19363:40;;19400:1;;19363:40;19431:1;19414:19;;-1:-1:-1;;;;;;19414:19:0;;;19301:140::o;27976:27::-;;;-1:-1:-1;;;27976:27:0;;;;;:::o;29893:49::-;;;;;;;;;;;;-1:-1:-1;;;;;29893:49:0;;:::o;28461:127::-;;;-1:-1:-1;;;;;28461:127:0;;:::o;38201:3522::-;38480:7;9477:11;;;;9469:55;;;;;-1:-1:-1;;;9469:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9616:5;9602:19;;-1:-1:-1;;9602:19:0;;;;;-1:-1:-1;;;31196:7:0;;9602:19;31196:7;31192:102;;;31220:28;;;-1:-1:-1;;;31220:28:0;;;;;;;;;;;;-1:-1:-1;;;31220:28:0;;;;;;;;;;;;;;31192:102;38500:18;38528;38500:47;;38558:28;38589:11;-1:-1:-1;;;;;38589:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38589:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38589:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38589:19:0;;-1:-1:-1;38621:136:0;-1:-1:-1;;;;;38621:45:0;;38681:10;38714:4;38734:12;38621:136;:45;:136;:::i;:::-;38770:23;38796:90;38836:11;38863:12;38796:17;:90::i;:::-;38770:116;-1:-1:-1;;;;;;38899:20:0;;;38920:33;:12;38770:116;38920:33;:16;:33;:::i;:::-;38899:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38899:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;38994:77:0;;;-1:-1:-1;;;38994:77:0;;39055:4;38994:77;;;;;;38965:26;;-1:-1:-1;;;;;;38994:38:0;;;-1:-1:-1;38994:38:0;;:77;;;;;;;;;;;;;;;:38;:77;;;5:2:-1;;;;30:1;27;20:12;5:2;38994:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38994:77:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38994:77:0;;-1:-1:-1;39084:24:0;-1:-1:-1;;;;;39123:47:0;;;;;;;39119:2323;;;39187:126;-1:-1:-1;;;;;39187:41:0;;39247:14;39280:18;39187:126;:41;:126;:::i;:::-;-1:-1:-1;39347:18:0;39119:2323;;;39402:10;:15;;39416:1;39402:15;39398:2033;;;39457:228;39498:20;39541:18;39582:14;39619:23;39665:1;39457:18;:228::i;:::-;39438:247;;39398:2033;;;39711:10;:15;;39725:1;39711:15;39707:1724;;;39789:20;-1:-1:-1;;;;;39781:36:0;;39818:18;39781:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39781:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39781:56:0;;;;39856:23;39890:20;-1:-1:-1;;;;;39882:74:0;;:76;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39882:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39882:76:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39882:76:0;;-1:-1:-1;;;;;;40008:37:0;;40004:680;;40089:161;40126:15;40168:18;40213:14;40089:10;:161::i;:::-;40070:180;;40004:680;;;40318:172;40357:15;40399:23;40449:18;40318:12;:172::i;:::-;40299:191;-1:-1:-1;40513:151:0;-1:-1:-1;;;;;40513:44:0;;40584:14;40299:191;40513:151;:44;:151;:::i;:::-;39707:1724;;;;-1:-1:-1;;;;;40728:37:0;;40724:692;;40809:166;40846:20;40893:18;40938:14;40809:10;:166::i;40724:692::-;41043:177;41082:20;41129:23;41179:18;41043:12;:177::i;:::-;41024:196;-1:-1:-1;41245:151:0;-1:-1:-1;;;;;41245:44:0;;41316:14;41024:196;41245:151;:44;:151;:::i;:::-;41482:13;41462:16;:33;;41454:59;;;;;-1:-1:-1;;;41454:59:0;;;;;;;;;;;;-1:-1:-1;;;41454:59:0;;;;;;;;;;;;;;;41531:148;;;-1:-1:-1;;;;;41531:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41699:16;-1:-1:-1;;;;;9782:11:0;:18;;-1:-1:-1;;9782:18:0;9796:4;9782:18;;;38201:3522;;-1:-1:-1;;;;;;38201:3522:0:o;18490:79::-;18528:7;18555:6;;;;-1:-1:-1;;;;;18555:6:0;;18490:79::o;18856:94::-;18896:4;18936:6;;;;;-1:-1:-1;;;;;18936:6:0;18920:12;:10;:12::i;:::-;-1:-1:-1;;;;;18920:22:0;;18913:29;;18856:94;:::o;31577:266::-;18702:9;:7;:9::i;:::-;18694:54;;;;;-1:-1:-1;;;18694:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18694:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31698:39:0;;31690:67;;;;;-1:-1:-1;;;31690:67:0;;;;;;;;;;;;-1:-1:-1;;;31690:67:0;;;;;;;;;;;;;;;31768:18;:67;;-1:-1:-1;;;;;;31768:67:0;-1:-1:-1;;;;;31768:67:0;;;;;;;;;;31577:266::o;47174:238::-;18702:9;:7;:9::i;:::-;18694:54;;;;;-1:-1:-1;;;18694:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18694:54:0;;;;;;;;;;;;;;;47310:5;47294:13;:21;;;47250:119;;;;;-1:-1:-1;;;47250:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47380:8;:24;;;;;;-1:-1:-1;;;47380:24:0;-1:-1:-1;;;;47380:24:0;;;;;;;;;47174:238::o;17985:29::-;;;;;;-1:-1:-1;;;;;17985:29:0;;:::o;32667:5050::-;32930:7;9477:11;;;;9469:55;;;;;-1:-1:-1;;;9469:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9616:5;9602:19;;-1:-1:-1;;9602:19:0;;;;;-1:-1:-1;;;31196:7:0;;9602:19;31196:7;31192:102;;;31220:28;;;-1:-1:-1;;;31220:28:0;;;;;;;;;;;;-1:-1:-1;;;31220:28:0;;;;;;;;;;;;;;31192:102;32950:19;32979:16;32950:46;;33007:28;33038:12;-1:-1:-1;;;;;33038:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33038:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33038:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33038:20:0;;-1:-1:-1;;;;;;33075:31:0;;33071:409;;33143:1;33131:9;:13;33123:42;;;;;-1:-1:-1;;;33123:42:0;;;;;;;;;;;;-1:-1:-1;;;33123:42:0;;;;;;;;;;;;;;;33071:409;;;33216:1;33206:7;:11;33198:43;;;;;-1:-1:-1;;;33198:43:0;;;;;;;;;;;;-1:-1:-1;;;33198:43:0;;;;;;;;;;;;;;;33264:9;:14;33256:51;;;;;-1:-1:-1;;;33256:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33324:144;-1:-1:-1;;;;;33324:42:0;;33385:10;33422:4;33446:7;33324:144;:42;:144;:::i;:::-;33516:78;;;-1:-1:-1;;;33516:78:0;;33578:4;33516:78;;;;;;33492:21;;-1:-1:-1;;;;;33516:39:0;;;;;:78;;;;;;;;;;;;;;;:39;:78;;;5:2:-1;;;;30:1;27;20:12;5:2;33516:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33516:78:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33516:78:0;;-1:-1:-1;;;;;;33611:41:0;;;;;;;33607:3410;;;33669:121;-1:-1:-1;;;;;33669:40:0;;33736:12;33768:7;33669:121;:40;:121;:::i;:::-;33805:12;-1:-1:-1;;;;;33805:20:0;;33826:7;33805:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33805:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33805:29:0;;;;33607:3410;;;33900:10;:15;;33914:1;33900:15;33896:3110;;;-1:-1:-1;;;;;33988:36:0;;;33942:25;33988:36;;;:14;:36;;;;;;;;;34088:31;;34084:813;;34159:17;;:248;;;-1:-1:-1;;;34159:248:0;;34234:4;34159:248;;;;:17;:248;;;;;;-1:-1:-1;;;;;34159:248:0;;;;;;;34189:9;34159:248;;;;;;;;;;;;;;;:17;;;;;:23;;34189:9;;34159:248;;;;;;;;;;;;;;;34189:9;34159:17;:248;;;5:2:-1;;;;30:1;27;20:12;5:2;34159:248:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34159:248:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34159:248:0;;-1:-1:-1;34084:813:0;;;34528:17;;34456:147;;-1:-1:-1;;;;;34456:37:0;;;;34528:17;34573:7;34456:147;:37;:147;:::i;:::-;34641:17;;:236;;;-1:-1:-1;;;34641:236:0;;34699:4;34641:236;;;;-1:-1:-1;;;;;34641:236:0;;;;;;;;;;;;;;;;;;;;:17;:236;;;;;;;;:17;;;:23;;:236;;;;;;;;;;;;;;;;;;:17;:236;;;5:2:-1;;;;30:1;27;20:12;5:2;34641:236:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34641:236:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34641:236:0;;-1:-1:-1;34084:813:0;34917:138;-1:-1:-1;;;;;34917:40:0;;34988:12;35024;34917:138;:40;:138;:::i;:::-;35074:12;-1:-1:-1;;;;;35074:20:0;;35095:12;35074:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35074:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35074:34:0;;;;33896:3110;;;;;35134:10;:15;;35148:1;35134:15;35130:1876;;;35170:23;35204:20;-1:-1:-1;;;;;35196:74:0;;:76;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35196:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35196:76:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35196:76:0;;-1:-1:-1;35293:20:0;-1:-1:-1;;;;;35336:31:0;;35332:341;;35407:27;35418:15;35407:10;:27::i;:::-;35392:42;;35332:341;;;35498:155;35537:17;35581:15;35623:7;35498:12;:155::i;:::-;35483:170;;35332:341;35693:159;28730:42;-1:-1:-1;;;;;35751:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35751:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35751:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35751:47:0;-1:-1:-1;;;;;35693:35:0;;;35821:12;35693:159;:35;:159;:::i;:::-;28730:42;-1:-1:-1;;;;;35890:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35890:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35890:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35890:43:0;35873:125;;;-1:-1:-1;;;35873:125:0;;-1:-1:-1;;;;;35873:125:0;;;;;;;;;;;;;35996:1;35873:125;;;;;;;;:91;;;;;:125;;;;;35996:1;;35873:125;;;;;;35996:1;35873:91;:125;;;5:2:-1;;;;30:1;27;20:12;5:2;35873:125:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;36043:93:0;;;-1:-1:-1;;;36043:93:0;;36112:4;36043:93;;;;;;36019:21;;-1:-1:-1;;;;;;36043:38:0;;;-1:-1:-1;36043:38:0;;:93;;;;;;;;;;;;;;;:38;:93;;;5:2:-1;;;;30:1;27;20:12;5:2;36043:93:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36043:93:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36043:93:0;;-1:-1:-1;36155:139:0;-1:-1:-1;;;;;36155:40:0;;36226:12;36043:93;36155:139;:40;:139;:::i;:::-;36313:12;-1:-1:-1;;;;;36313:20:0;;36334:13;36313:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36313:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36313:35:0;;;;35130:1876;;;;;;36389:20;-1:-1:-1;;;;;36432:31:0;;36428:351;;36503:32;36514:20;36503:10;:32::i;:::-;36488:47;;36428:351;;;36599:160;36638:17;36682:20;36729:7;36599:12;:160::i;:::-;36584:175;;36428:351;36799:138;-1:-1:-1;;;;;36799:40:0;;36870:12;36906;36799:138;:40;:138;:::i;:::-;36956:12;-1:-1:-1;;;;;36956:20:0;;36977:12;36956:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36956:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36956:34:0;;;;35130:1876;;37029:18;37050:101;37137:13;37065:12;-1:-1:-1;;;;;37050:53:0;;37112:4;37050:68;;;;;;;;;;;;;-1:-1:-1;;;;;37050:68:0;-1:-1:-1;;;;;37050:68:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37050:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37050:68:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37050:68:0;;:101;:86;:101;:::i;:::-;37029:122;;37184:11;37170:10;:25;;37162:51;;;;;-1:-1:-1;;;37162:51:0;;;;;;;;;;;;-1:-1:-1;;;37162:51:0;;;;;;;;;;;;;;;37255:23;37281:89;37321:12;37349:10;37281:17;:89::i;:::-;37255:115;-1:-1:-1;37383:128:0;37440:14;37469:31;:10;37255:115;37469:31;:14;:31;:::i;:::-;-1:-1:-1;;;;;37383:42:0;;;:128;;:42;:128;:::i;:::-;37529:127;37549:14;37586:12;37614:31;:10;37629:15;37614:31;:14;:31;:::i;:::-;37529:127;;;-1:-1:-1;;;;;37529:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;37677:31;:10;37692:15;37677:31;:14;:31;:::i;:::-;37669:40;;;;;;;9782:11;:18;;-1:-1:-1;;9782:18:0;9796:4;9782:18;;;32667:5050;;-1:-1:-1;;;;;;32667:5050:0:o;19596:117::-;18702:9;:7;:9::i;:::-;18694:54;;;;;-1:-1:-1;;;18694:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18694:54:0;;;;;;;;;;;;;;;19677:28;19696:8;19677:18;:28::i;:::-;19596:117;:::o;28330:124::-;;;-1:-1:-1;;;;;28330:124:0;;:::o;14471:159::-;14613:7;14471:159;;;;:::o;20704:247::-;20874:58;;;-1:-1:-1;;;;;20874:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20874:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20821:122:0;;20854:5;;20821:18;:122::i;20959:284::-;21156:68;;;-1:-1:-1;;;;;21156:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;21156:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;21103:132:0;;21136:5;;21103:18;:132::i;:::-;20959:284;;;;:::o;46687:479::-;46810:23;46918:8;;46864:94;;46891:36;;46904:12;;-1:-1:-1;;;46918:8:0;;;;46891:12;:36::i;:::-;46942:5;46864:12;:94::i;:::-;46846:112;-1:-1:-1;46975:20:0;46971:61;;-1:-1:-1;47019:1:0;47012:8;;46971:61;47044:114;-1:-1:-1;;;;;47044:42:0;;30234;47132:15;47044:114;:42;:114;:::i;:::-;46687:479;;;;:::o;3283:136::-;3341:7;3368:43;3372:1;3375;3368:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;3361:50;3283:136;-1:-1:-1;;;3283:136:0:o;41731:710::-;42031:18;;41953:7;;41973:112;;-1:-1:-1;;;;;41973:35:0;;;;42031:18;42065:9;41973:112;:35;:112;:::i;:::-;-1:-1:-1;;;;;42126:31:0;;;42098:25;42126:31;;;:14;:31;;;;;;42192:18;;42126:31;;;;42192:18;:25;42236:33;42254:14;42236:17;:33::i;:::-;42192:230;;;-1:-1:-1;;;;;;42192:230:0;;;;;;;-1:-1:-1;;;;;42192:230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42192:230:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;42192:230:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42192:230:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42192:230:0;;41731:710;-1:-1:-1;;;;;;;41731:710:0:o;45486:904::-;45647:7;-1:-1:-1;;;;;45671:45:0;;30132:42;45671:45;45667:210;;;30132:42;-1:-1:-1;;;;;45733:32:0;;45766:12;45733:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45733:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;45794:37:0;;-1:-1:-1;;;;;45794:23:0;;;-1:-1:-1;45794:37:0;;;;;-1:-1:-1;45818:12:0;;45794:37;;;;45818:12;45794:23;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45794:37:0;45853:12;45846:19;;;;45667:210;45889:120;-1:-1:-1;;;;;45889:45:0;;28272:42;45986:12;45889:120;:45;:120;:::i;:::-;46046:16;;;46060:1;46046:16;;;46022:21;46046:16;;;;;46022:21;46046:16;;;;;105:10:-1;46046:16:0;88:34:-1;136:17;;-1:-1;46046:16:0;46022:40;;46083:25;46073:4;46078:1;46073:7;;;;;;;;;;;;;:35;-1:-1:-1;;;;;46073:35:0;;;-1:-1:-1;;;;;46073:35:0;;;;;30132:42;46119:4;46124:1;46119:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;46119:26:0;;;-1:-1:-1;;;;;46119:26:0;;;;;46156:17;28272:42;-1:-1:-1;;;;;46176:35:0;;46226:12;46253:1;46269:4;46288:14;-1:-1:-1;;;46176:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46176:160:0;-1:-1:-1;;;;;46176:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46176:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46176:160:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46176:160:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;46176:160:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;46176:160:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;46176:160:0;;421:4:-1;412:14;;;;46176:160:0;;;;;412:14:-1;46176:160:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46176:160:0;;;;;;;;;;;46351:1;46337:4;:11;:15;46176:177;;;;;;;;;;;;;;46156:197;;46373:9;46366:16;;;;45486:904;;;;;:::o;43578:1900::-;43742:19;43807:23;-1:-1:-1;;;;;43778:52:0;:25;-1:-1:-1;;;;;43778:52:0;;43774:104;;;-1:-1:-1;43854:12:0;43847:19;;43774:104;43890:120;-1:-1:-1;;;;;43890:45:0;;28272:42;43987:12;43890:120;:45;:120;:::i;:::-;-1:-1:-1;;;;;44027:45:0;;30132:42;44027:45;44023:1448;;-1:-1:-1;;;;;44093:43:0;;30132:42;44093:43;44089:977;;44181:16;;;44195:1;44181:16;;;;;;;;;44157:21;;44181:16;;;44157:21;;105:10:-1;44181:16:0;88:34:-1;136:17;;-1:-1;44181:16:0;44157:40;;44226:25;44216:4;44221:1;44216:7;;;;;;;;;;;;;:35;-1:-1:-1;;;;;44216:35:0;;;-1:-1:-1;;;;;44216:35:0;;;;;30132:42;44270:4;44275:1;44270:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;44270:26:0;;;-1:-1:-1;;;;;44270:26:0;;;;;44325:23;44315:4;44320:1;44315:7;;;;;;;;-1:-1:-1;;;;;44315:33:0;;;:7;;;;;;;;;;:33;44381:210;;-1:-1:-1;;;44381:210:0;;;;;;;;44477:1;44381:210;;;;;;44536:4;44381:210;;;;;;-1:-1:-1;;;44381:210:0;;;;;;;;;;;;;;;;;;;;;28272:42;;44381:38;;44442:12;;44501:4;;44536;30330:66;44381:210;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;44381:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44381:210:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44381:210:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;44381:210:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;44381:210:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;44381:210:0;;421:4:-1;412:14;;;;44381:210:0;;;;;412:14:-1;44381:210:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;44381:210:0;;;;;;;;;;;44606:1;44592:4;:11;:15;44381:227;;;;;;;;;;;;;;44367:241;;44089:977;;;;44673:16;;;44687:1;44673:16;;;44649:21;44673:16;;;;;44649:21;44673:16;;;;;105:10:-1;44673:16:0;88:34:-1;136:17;;-1:-1;44673:16:0;44649:40;;44718:25;44708:4;44713:1;44708:7;;;;;;;;;;;;;:35;-1:-1:-1;;;;;44708:35:0;;;-1:-1:-1;;;;;44708:35:0;;;;;30132:42;44762:4;44767:1;44762:7;;;;;;;;-1:-1:-1;;;;;44762:26:0;;;:7;;;;;;;;;;:26;44823:210;;-1:-1:-1;;;44823:210:0;;;;;;;;44919:1;44823:210;;;;;;44978:4;44823:210;;;;;;-1:-1:-1;;;44823:210:0;;;;;;;;;;;;;;;;;;;;;28272:42;;44823:38;;44884:12;;44943:4;;44978;30330:66;44823:210;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;44823:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44823:210:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44823:210:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;44823:210:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;44823:210:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;44823:210:0;;421:4:-1;412:14;;;;44823:210:0;;;;;412:14:-1;44823:210:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;44823:210:0;;;;;;;;;;;45048:1;45034:4;:11;:15;44823:227;;;;;;;;;;;;;;44809:241;;44089:977;;44023:1448;;;45122:16;;;45136:1;45122:16;;;45098:21;45122:16;;;;;45098:21;45122:16;;;;;105:10:-1;45122:16:0;88:34:-1;136:17;;-1:-1;45122:16:0;45098:40;;30132:42;45153:4;45158:1;45153:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;45153:26:0;;;-1:-1:-1;;;;;45153:26:0;;;;;45204:23;45194:4;45199:1;45194:7;;;;;;;;-1:-1:-1;;;;;45194:33:0;;;:7;;;;;;;;;;:33;45256:186;;-1:-1:-1;;;45256:186:0;;;;;;;;45344:1;45256:186;;;;;;45395:4;45256:186;;;;;;-1:-1:-1;;;45256:186:0;;;;;;;;;;;;;;;;;;;;;28272:42;;45256:38;;45313:12;;45364:4;;45395;30330:66;45256:186;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45256:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45256:186:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45256:186:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;45256:186:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;45256:186:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;45256:186:0;;421:4:-1;412:14;;;;45256:186:0;;;;;412:14:-1;45256:186:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45256:186:0;;;;;;;;;;;45457:1;45443:4;:11;:15;45256:203;;;;;;;;;;;;;;45242:217;;44023:1448;43578:1900;;;;;:::o;16970:98::-;17050:10;16970:98;:::o;21251:706::-;21669:10;;;21668:62;;-1:-1:-1;21685:39:0;;;-1:-1:-1;;;21685:39:0;;21709:4;21685:39;;;;-1:-1:-1;;;;;21685:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;21685:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21685:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21685:39:0;:44;21668:62;21646:166;;;;-1:-1:-1;;;21646:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21876:62;;;-1:-1:-1;;;;;21876:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;21876:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;21823:126:0;;21856:5;;21823:18;:126::i;42649:611::-;42736:20;-1:-1:-1;;;;;42778:41:0;;30132:42;42778:41;42774:155;;;30132:42;-1:-1:-1;;;;;42836:31:0;;42874:9;42836:50;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42836:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42836:50:0;;;;;42908:9;42901:16;;;;42774:155;42965:16;;;42979:1;42965:16;;;42941:21;42965:16;;;;;42941:21;42965:16;;;;;105:10:-1;42965:16:0;88:34:-1;136:17;;-1:-1;42965:16:0;42941:40;;30132:42;42992:4;42997:1;42992:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;42992:26:0;;;-1:-1:-1;;;;;42992:26:0;;;;;43039:21;43029:4;43034:1;43029:7;;;;;;;;-1:-1:-1;;;;;43029:31:0;;;:7;;;;;;;;;;:31;43086:149;;-1:-1:-1;;;43086:149:0;;43153:1;43086:149;;;;;;43196:4;43086:149;;;;;;-1:-1:-1;;;43086:149:0;;;;;;;;;;;;;;;;;;;;;28272:42;;43086:35;;43128:9;;43153:1;43169:4;;43196;30330:66;43086:149;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43086:149:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43086:149:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43086:149:0;;;;;;;39:16:-1;36:1;17:17;2:54;101:4;43086:149:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;43086:149:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;43086:149:0;;421:4:-1;412:14;;;;43086:149:0;;;;;412:14:-1;43086:149:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43086:149:0;;;;;;;;;;;43250:1;43236:4;:11;:15;43086:166;;;;;;;;;;;;;;43071:181;;42649:611;;;;:::o;19819:274::-;-1:-1:-1;;;;;19915:22:0;;19893:110;;;;-1:-1:-1;;;19893:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20040:6;;;20019:38;;-1:-1:-1;;;;;20019:38:0;;;;20040:6;;;;;;20019:38;;;20068:6;:17;;-1:-1:-1;;;;;20068:17:0;;;;;-1:-1:-1;;;;;;20068:17:0;;;;;;;;;19819:274::o;23314:1176::-;23918:27;23926:5;-1:-1:-1;;;;;23918:25:0;;:27::i;:::-;23910:71;;;;;-1:-1:-1;;;23910:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24055:12;24069:23;24104:5;-1:-1:-1;;;;;24096:19:0;24116:4;24096:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;24096:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;24054:67:0;;;;24140:7;24132:52;;;;;-1:-1:-1;;;24132:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24201:17;;:21;24197:286;;24374:10;24363:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24363:30:0;24337:134;;;;-1:-1:-1;;;24337:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4233:471;4291:7;4536:6;4532:47;;-1:-1:-1;4566:1:0;4559:8;;4532:47;4603:5;;;4607:1;4603;:5;:1;4627:5;;;;;:10;4619:56;;;;-1:-1:-1;;;4619:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5172:132;5230:7;5257:39;5261:1;5264;5257:39;;;;;;;;;;;;;;;;;:3;:39::i;3756:226::-;3876:7;3912:12;3904:6;;;;3896:29;;;;-1:-1:-1;;;3896:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3896:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3948:5:0;;;3756:226::o;13595:659::-;13655:4;14154:20;;13984:66;14203:23;;;;;;:42;;-1:-1:-1;14230:15:0;;;14203:42;14195:51;13595:659;-1:-1:-1;;;;13595:659:0:o;5834:379::-;5954:7;6056:12;6049:5;6041:28;;;;-1:-1:-1;;;6041:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;6041:28:0;;6080:9;6096:1;6092;:5;;;;;;;5834:379;-1:-1:-1;;;;;5834:379:0:o

Swarm Source

bzzr://184a43a060b0273986d1b0e862f73f891f6ddb7b2fa3a0a845e623c3b0c50d07
Block Transaction Difficulty Gas Used Reward
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.