Contract 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 2

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x4c5555a2c38502416a955cbee24fa29c4f10bee860d7a30abbf8d0eaec268ff1Multi Value Toke...377302712022-05-07 3:34:14153 days 18 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM0.722781735
0xb7828aad1b35c1c081da5301a964f6a289b440dabed64250f791ea96fd832248Multi Value Toke...377302382022-05-07 3:33:37153 days 18 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM0.75971062
0x9ad53050b37e131bdb4b0c693921c101428df6c252d039d48d1d8e80c0adcd33Multi Value Toke...377302242022-05-07 3:33:21153 days 18 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM0.726407604
0x2868c7d3a2645bb2620da9845218362ee1499708b514b61ccd72319c2ac0031aMulti Value Toke...377301742022-05-07 3:32:10153 days 18 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM0.75743492
0x351439469be3917b0bcd9bb289b62400fbd04322024b7255c9cfbfcfea091557Multi Value Toke...377103322022-05-06 21:25:58154 days 1 hr ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM2.128089582
0x241e25a31f14739fe67bb1c08bb531aa7c09728343d787f2a86479d9bc8ef2a9Multi Value Toke...377101032022-05-06 21:22:19154 days 1 hr ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM1.960611768
0x00a2631c2a0a0382f6dea3422253127aab03075be8098bfac84d2f362e7b2394Multi Value Toke...377086162022-05-06 20:55:17154 days 1 hr ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM1.174739196
0x77726c88db14599339d98b48bd919f9cc5148ec3ae3537cc3d572d28595cb118Multi Value Toke...376436772022-05-05 23:44:43154 days 22 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM0.677760242227
0xa25219605b55c7284d340977a54edc4d19a357dcf35cbb6515933b79678dd81eMulti Value Toke...376434632022-05-05 23:40:50154 days 22 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM0.853311711685
0x8d57b4abfe4772fbf01aa92850a391648744713da6c8b54e645127bec954c2e7Multi Value Toke...376434392022-05-05 23:40:20154 days 22 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM1.085205800601
0xcd1e73585e2c92e83fd3b89b0ebdae46a85c8646546697d482cd86b3be29d711Multi Value Toke...376433952022-05-05 23:39:22154 days 22 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM1.160257010442
0x6d7de35f148b041014d970361b7f657e0f144e5a14b7a72fddce8485016cc6dbMulti Value Toke...376433602022-05-05 23:38:46154 days 22 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM1.295337485582
0x708b600c8bd7e2c8b07db0e4c474e1c31ce3d54466e62f4bd8a88a5aee1b68eeMulti Value Toke...376432812022-05-05 23:37:20154 days 22 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM1.389453483844
0x19000136de8a6a1c39918daedc1445b14c4e9f9021cb85273f6572ba90af1a32Multi Value Toke...376429022022-05-05 23:31:07154 days 22 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM0.704715668541
0x6acb6c02069e4f8cb6af04c4f2345e23575d7dbc65463475453800659dcc3aa1Multi Value Toke...375203962022-05-04 8:49:30156 days 13 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM0.658697692
0xc051e1854af168a60ab99355c520799147eae5031fcecf76ef0adf37d34d4242Multi Value Toke...374942492022-05-04 0:41:07156 days 21 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM2.13727058286
0xcc7c4250f086f248ba0d9621831f53d2e106fcbad97d74c11ea05f989de3327aMulti Value Toke...374941382022-05-04 0:37:50156 days 21 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM0.373800303088
0x5528aab81cd5b8c46cd84ca2343e7178dd44cf441be1f1209f64f35ac235d0a7Multi Value Toke...374937762022-05-04 0:29:30156 days 22 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM1.903299070147
0x8ae2e04e9bb0eecbadcddfaf8473e2917aeb38719f32cc85942e3d9c64d7d6cbMulti Value Toke...374936422022-05-04 0:26:59156 days 22 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM0.606732074457
0x5836b26da687114c3bded304b1ce9ded79f19fe48897fe01f9d81a61edfc61b3Multi Value Toke...374934712022-05-04 0:23:58156 days 22 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM0.084765078538
0x4205cce2d89d9c5ca930838950a3292f03f096a1818e2f6f1f98b4059762a1bbBecome Premium M...374914032022-05-03 23:43:36156 days 22 hrs ago0x780eb947f69f83f91ea3166f4681c8924a22cf55 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8150 FTM0.032330530564
0x960e73448d230a8e18daea60ff296f43ea0cb5e95b54869cf9b945fe7eea7190Multi Value Eth ...372138612022-04-29 12:01:41161 days 10 hrs ago0x2746ad973f26438c9f9be1492546bc22750a7134 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae814.7 FTM0.235794892212
0x1aac3d727b6028b1633e8fd4d33f76bbb9ee59288478af38ced5179d45208055Multi Value Toke...372135892022-04-29 11:56:57161 days 10 hrs ago0x2746ad973f26438c9f9be1492546bc22750a7134 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM0.27700815244
0xc46c0798ec11f2fc977b0204a3eca3f865f732c37af908dc9369aaa5641d5561Multi Value Toke...372084842022-04-29 9:48:12161 days 12 hrs ago0x0471482a5a7c7e65b548d2be65e927966eb902d5 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 FTM0.190313276048
0x4dacfa552f666a78d5641770cea1d63a61112d91110c0df3b95e09f126b18277Multi Value Eth ...372062892022-04-29 8:47:12161 days 13 hrs ago0xf8ae8362f129b6b78db6665155466ad5bb2edbba IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8231 FTM0.055229353209
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x4205cce2d89d9c5ca930838950a3292f03f096a1818e2f6f1f98b4059762a1bb374914032022-05-03 23:43:36156 days 22 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x210efca155797119a5b0f1cfde64ca1fe55ec544150 FTM
0x960e73448d230a8e18daea60ff296f43ea0cb5e95b54869cf9b945fe7eea7190372138612022-04-29 12:01:41161 days 10 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80xb0d45268afb814a7f8086095d6181c7b694d91cc2 FTM
0x960e73448d230a8e18daea60ff296f43ea0cb5e95b54869cf9b945fe7eea7190372138612022-04-29 12:01:41161 days 10 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x5db1c0cbefef3207a5820f2934e4bb187f7919b82 FTM
0x960e73448d230a8e18daea60ff296f43ea0cb5e95b54869cf9b945fe7eea7190372138612022-04-29 12:01:41161 days 10 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x314a5efdd7927064ec9e42aa53db28a70b092b322 FTM
0x960e73448d230a8e18daea60ff296f43ea0cb5e95b54869cf9b945fe7eea7190372138612022-04-29 12:01:41161 days 10 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80xc703a5dad170d05f95b381793a8357f6b56b7a9e2 FTM
0x960e73448d230a8e18daea60ff296f43ea0cb5e95b54869cf9b945fe7eea7190372138612022-04-29 12:01:41161 days 10 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80xdfe14e6b51484bd92456f89973c1a1602a46fde42 FTM
0x960e73448d230a8e18daea60ff296f43ea0cb5e95b54869cf9b945fe7eea7190372138612022-04-29 12:01:41161 days 10 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x65c4268ab1c2fa2ae9e8b595f68be9117dee76622 FTM
0x960e73448d230a8e18daea60ff296f43ea0cb5e95b54869cf9b945fe7eea7190372138612022-04-29 12:01:41161 days 10 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x2908d82454324770bcc72324e1bb5bb9d87771ac2 FTM
0x960e73448d230a8e18daea60ff296f43ea0cb5e95b54869cf9b945fe7eea7190372138612022-04-29 12:01:41161 days 10 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x210efca155797119a5b0f1cfde64ca1fe55ec5440.7 FTM
0x4dacfa552f666a78d5641770cea1d63a61112d91110c0df3b95e09f126b18277372062892022-04-29 8:47:12161 days 13 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80xc05a90a469e29772ea73f57f90fb0108f4aca77523 FTM
0x4dacfa552f666a78d5641770cea1d63a61112d91110c0df3b95e09f126b18277372062892022-04-29 8:47:12161 days 13 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x99307e5f68b28b5d7c6e58228d87321b17f45f6123 FTM
0x4dacfa552f666a78d5641770cea1d63a61112d91110c0df3b95e09f126b18277372062892022-04-29 8:47:12161 days 13 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x1e3313fc72ba9e079cca4aa339d6069017689d1423 FTM
0x4dacfa552f666a78d5641770cea1d63a61112d91110c0df3b95e09f126b18277372062892022-04-29 8:47:12161 days 13 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80xb377bfd3fa729dce9f89a158113683210e14ef1e23 FTM
0x4dacfa552f666a78d5641770cea1d63a61112d91110c0df3b95e09f126b18277372062892022-04-29 8:47:12161 days 13 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x15ebdf3ed1c0415cdde0a013d30850d96d58158623 FTM
0x4dacfa552f666a78d5641770cea1d63a61112d91110c0df3b95e09f126b18277372062892022-04-29 8:47:12161 days 13 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80xcefd060fee8e60139925548fc735a57e067d029523 FTM
0x4dacfa552f666a78d5641770cea1d63a61112d91110c0df3b95e09f126b18277372062892022-04-29 8:47:12161 days 13 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x8029bdadf9774f9f3de5207d5cb29244ec4dc4dc23 FTM
0x4dacfa552f666a78d5641770cea1d63a61112d91110c0df3b95e09f126b18277372062892022-04-29 8:47:12161 days 13 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x5a3da72158677c3a6eda779fe91265bfa3ccc34523 FTM
0x4dacfa552f666a78d5641770cea1d63a61112d91110c0df3b95e09f126b18277372062892022-04-29 8:47:12161 days 13 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80xb65aa68942f31b7585fe9e1e15a1a74ddca0a48123 FTM
0x4dacfa552f666a78d5641770cea1d63a61112d91110c0df3b95e09f126b18277372062892022-04-29 8:47:12161 days 13 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x80a523b6ba9d83614387b7756df87a8ef636f51f23 FTM
0x4dacfa552f666a78d5641770cea1d63a61112d91110c0df3b95e09f126b18277372062892022-04-29 8:47:12161 days 13 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x210efca155797119a5b0f1cfde64ca1fe55ec5441 FTM
0x46f5026c4ebbca0007c3f020ef0ccf03d9748c3d47997c37cdf70478a509e303370517422022-04-27 6:18:13163 days 16 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x210efca155797119a5b0f1cfde64ca1fe55ec5449.7 FTM
0x99da2d40d83ee5a04c7ef405b6bc865c36164018fede894a2aedb795c1859a9b370515762022-04-27 6:15:22163 days 16 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x210efca155797119a5b0f1cfde64ca1fe55ec5449.8 FTM
0x2fcef20fb44b2fe439a1a65d81bd5cad7426ecd1465492590d77078ec92c33a7370294142022-04-26 22:58:49163 days 23 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x210efca155797119a5b0f1cfde64ca1fe55ec5443.4 FTM
0x73635264576f2135dee14d0245b5ec619a729686a10c5a404eb76998d2d9782c370293072022-04-26 22:56:56163 days 23 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x210efca155797119a5b0f1cfde64ca1fe55ec54410 FTM
0xb9936e1aa7406929b7e45a0f2c4908c19f05171283d6082ea7eaa8e4288dac6c370292112022-04-26 22:55:20163 days 23 hrs ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x210efca155797119a5b0f1cfde64ca1fe55ec5448.9 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoMultisender

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2022-02-18
*/

/***
 *   _____                  _          __  __       _ _   _                    _           
 *  / ____|                | |        |  \/  |     | | | (_)                  | |          
 * | |     _ __ _   _ _ __ | |_ ___   | \  / |_   _| | |_ _ ___  ___ _ __   __| | ___ _ __ 
 * | |    | '__| | | | '_ \| __/ _ \  | |\/| | | | | | __| / __|/ _ \ '_ \ / _` |/ _ \ '__|
 * | |____| |  | |_| | |_) | || (_) | | |  | | |_| | | |_| \__ \  __/ | | | (_| |  __/ |   
 *  \_____|_|   \__, | .__/ \__\___/  |_|  |_|\__,_|_|\__|_|___/\___|_| |_|\__,_|\___|_|   
 *               __/ | |                                                                   
 *             |___/|_|                                                                   
 *        
 * 
 * @author Zenos Pavlakou
 */
 
 
pragma solidity ^0.6.0;

library SafeMath {
    
    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }
        
        c = a * b;
        assert(c / a == b);
        return c;
    }
    

    /**
    * @dev Integer division of two numbers, truncating the quotient.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        // uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return a / b;
    }


    /**
    * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }


    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}



contract Ownable {
    
    address public owner;
    
    event OwnershipTransferred(address indexed from, address indexed to);
    
    
    /**
     * Constructor assigns ownership to the address used to deploy the contract.
     * */
    constructor() public {
        owner = msg.sender;
    }


    function getOwner() public view returns(address) {
        return owner;
    }


    /**
     * Any function with this modifier in its method signature can only be executed by
     * the owner of the contract. Any attempt made by any other account to invoke the 
     * functions with this modifier will result in a loss of gas and the contract's state
     * will remain untampered.
     * */
    modifier onlyOwner {
        require(msg.sender == owner, "Function restricted to owner of contract");
        _;
    }

    /**
     * Allows for the transfer of ownership to another address;
     * 
     * @param _newOwner The address to be assigned new ownership.
     * */
    function transferOwnership(address _newOwner) public onlyOwner {
        require(
            _newOwner != address(0)
            && _newOwner != owner 
        );
        emit OwnershipTransferred(owner, _newOwner);
        owner = _newOwner;
    }
}



/**
 * Contract acts as an interface between the DappleAirdrops contract and all ERC20 compliant
 * tokens. 
 * */
abstract contract ERCInterface {
    function transferFrom(address _from, address _to, uint256 _value) public virtual;
    function balanceOf(address who)  public virtual returns (uint256);
    function allowance(address owner, address spender)  public view virtual returns (uint256);
    function transfer(address to, uint256 value) public virtual returns(bool);
}



contract CryptoMultisender is Ownable {
    
    using SafeMath for uint256;
 
    mapping (address => uint256) public tokenTrialDrops;

    mapping (address => bool) public isPremiumMember;
    mapping (address => bool) public isAffiliate;
    mapping (string => address) public affiliateCodeToAddr;
    mapping (string => bool) public affiliateCodeExists;
    mapping (address => string) public affiliateCodeOfAddr;
    mapping (address => string) public isAffiliatedWith;
        
    uint256 public premiumMemberFee;
    uint256 public rate;
    uint256 public dropUnitPrice;


    event TokenAirdrop(address indexed by, address indexed tokenAddress, uint256 totalTransfers);
    event EthAirdrop(address indexed by, uint256 totalTransfers, uint256 ethValue);


   
    event RateChanged(uint256 from, uint256 to);
    event RefundIssued(address indexed to, uint256 totalWei);
    event ERC20TokensWithdrawn(address token, address sentTo, uint256 value);
    event CommissionPaid(address indexed to, uint256 value);
    event NewPremiumMembership(address indexed premiumMember);
    event NewAffiliatePartnership(address indexed newAffiliate, string indexed affiliateCode);
    event AffiliatePartnershipRevoked(address indexed affiliate, string indexed affiliateCode);
    event PremiumMemberFeeUpdated(uint256 newFee);

    
    constructor() public {
        rate = 10000;
        dropUnitPrice = 1e14; 
        premiumMemberFee = 25e16;
    }
    

    /**
     * Allows the owner of this contract to change the fee for users to become premium members.
     * 
     * @param _fee The new fee.
     * 
     * @return True if the fee is changed successfully. False otherwise.
     * */
    function setPremiumMemberFee(uint256 _fee) public onlyOwner returns(bool) {
        require(_fee > 0 && _fee != premiumMemberFee);
        premiumMemberFee = _fee;
        emit PremiumMemberFeeUpdated(_fee);
        return true;
    }
    

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }


    /**
    * Used to give change to users who accidentally send too much ETH to payable functions. 
    *
    * @param _price The service fee the user has to pay for function execution. 
    **/
    function giveChange(uint256 _price) internal {
        if(msg.value > _price) {
            uint256 change = msg.value.sub(_price);
            payable(msg.sender).transfer(change);
        }
    }

    
    /**
    * Ensures that the correct affiliate code is used and also ensures that affiliate partners
    * are not able to 'jack' commissions from existing users who they are not affiliated with. 
    *
    * @param _afCode The affiliate code provided by the user.
    *
    * @return The correct affiliate code or void.
    **/
    function processAffiliateCode(string memory _afCode) internal returns(string memory) {
        
        if(stringsAreEqual(isAffiliatedWith[msg.sender], "void") || !isAffiliate[affiliateCodeToAddr[_afCode]]) {
            isAffiliatedWith[msg.sender] = "void";
            return "void";
        }
        
        if(!stringsAreEqual(_afCode, "") && stringsAreEqual(isAffiliatedWith[msg.sender],"") 
                                                                && affiliateCodeExists[_afCode]) {
            if(affiliateCodeToAddr[_afCode] == msg.sender) {
                return "void";
            }
            isAffiliatedWith[msg.sender] = _afCode;
        }

        if(stringsAreEqual(_afCode,"") && !stringsAreEqual(isAffiliatedWith[msg.sender],"")) {
            _afCode = isAffiliatedWith[msg.sender];
        } 
        
        if(stringsAreEqual(_afCode,"") || !affiliateCodeExists[_afCode]) {
            isAffiliatedWith[msg.sender] = "void";
            _afCode = "void";
        }
        
        return _afCode;
    }


    /**
    * Allows the owner of this contract to grant users with premium membership.
    *
    * @param _addr The address of the user who is being granted premium membership.
    *
    * @return True if premium membership is granted successfully. False otherwise. 
    **/
    function grantPremiumMembership(address _addr) public onlyOwner returns(bool) {
        require(!isPremiumMember[_addr], "Is already premiumMember member");
        isPremiumMember[_addr] = true;
        emit NewPremiumMembership(_addr);
        return true; 
    }


    /**
    * Allows users to become premium members.
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return True if user successfully becomes premium member. False otherwise. 
    **/
    function becomePremiumMember(string memory _afCode) public payable returns(bool) {
        require(!isPremiumMember[msg.sender], "Is already premiumMember member");
        require(
            msg.value >= premiumMemberFee,
            string(abi.encodePacked(
                "premiumMember fee is: ", uint2str(premiumMemberFee), ". Not enough ETH sent. ", uint2str(msg.value)
            ))
        );
        
        isPremiumMember[msg.sender] = true;
        
        _afCode = processAffiliateCode(_afCode);

        giveChange(premiumMemberFee);
        
        if(!stringsAreEqual(_afCode,"void") && isAffiliate[affiliateCodeToAddr[_afCode]]) {
            payable(owner).transfer(premiumMemberFee.mul(80).div(100));
            uint256 commission = premiumMemberFee.mul(20).div(100);
            payable(affiliateCodeToAddr[_afCode]).transfer(commission);
            emit CommissionPaid(affiliateCodeToAddr[_afCode], commission);
        } else {
            payable(owner).transfer(premiumMemberFee);
        }
        emit NewPremiumMembership(msg.sender);
        return true; 
    }
    
    
    /**
    * Allows the owner of this contract to add an affiliate partner.
    *
    * @param _addr The address of the new affiliate partner.
    * @param _code The affiliate code.
    * 
    * @return True if the affiliate has been added successfully. False otherwise. 
    **/
    function addAffiliate(address _addr, string memory _code) public onlyOwner returns(bool) {
        require(!isAffiliate[_addr], "Address is already an affiliate.");
        require(_addr != address(0));
        require(!affiliateCodeExists[_code]);
        affiliateCodeExists[_code] = true;
        isAffiliate[_addr] = true;
        affiliateCodeToAddr[_code] = _addr;
        affiliateCodeOfAddr[_addr] = _code;
        emit NewAffiliatePartnership(_addr,_code);
        return true;
    }
    

    /**
    * Allows the owner of this contract to remove an affiliate partner. 
    *
    * @param _addr The address of the affiliate partner.
    *
    * @return True if affiliate partner is removed successfully. False otherwise. 
    **/
    function removeAffiliate(address _addr) public onlyOwner returns(bool) {
        require(isAffiliate[_addr]);
        isAffiliate[_addr] = false;
        affiliateCodeToAddr[affiliateCodeOfAddr[_addr]] = address(0);
        emit AffiliatePartnershipRevoked(_addr, affiliateCodeOfAddr[_addr]);
        affiliateCodeOfAddr[_addr] = "No longer an affiliate partner";
        return true;
    }
    

    
    /**
     * Checks whether or not an ERC20 token has used its free trial of 100 drops. This is a constant 
     * function which does not alter the state of the contract and therefore does not require any gas 
     * or a signature to be executed. 
     * 
     * @param _addressOfToken The address of the token being queried.
     * 
     * @return true if the token being queried has not used its 100 first free trial drops, false
     * otherwise.
     * */
    function tokenHasFreeTrial(address _addressOfToken) public view returns(bool) {
        return tokenTrialDrops[_addressOfToken] < 100;
    }
    
    
    /**
     * Checks how many remaining free trial drops a token has.
     * 
     * @param _addressOfToken the address of the token being queried.
     * 
     * @return the total remaining free trial drops of a token.
     * */
    function getRemainingTrialDrops(address _addressOfToken) public view returns(uint256) {
        if(tokenHasFreeTrial(_addressOfToken)) {
            uint256 maxTrialDrops =  100;
            return maxTrialDrops.sub(tokenTrialDrops[_addressOfToken]);
        } 
        return 0;
    }
    
    
    /**
     * Allows for the price of drops to be changed by the owner of the contract. Any attempt made by 
     * any other account to invoke the function will result in a loss of gas and the price will remain 
     * untampered.
     * 
     * @return true if function executes successfully, false otherwise.
     * */
    function setRate(uint256 _newRate) public onlyOwner returns(bool) {
        require(
            _newRate != rate 
            && _newRate > 0
        );
        emit RateChanged(rate, _newRate);
        rate = _newRate;
        uint256 eth = 1 ether;
        dropUnitPrice = eth.div(rate);
        return true;
    }
    
    

    /**
     * Allows for the allowance of a token from its owner to this contract to be queried. 
     * 
     * As part of the ERC20 standard all tokens which fall under this category have an allowance 
     * function which enables owners of tokens to allow (or give permission) to another address 
     * to spend tokens on behalf of the owner. This contract uses this as part of its protocol.
     * Users must first give permission to the contract to transfer tokens on their behalf, however,
     * this does not mean that the tokens will ever be transferrable without the permission of the 
     * owner. This is a security feature which was implemented on this contract. It is not possible
     * for the owner of this contract or anyone else to transfer the tokens which belong to others. 
     * 
     * @param _addr The address of the token's owner.
     * @param _addressOfToken The contract address of the ERC20 token.
     * 
     * @return The ERC20 token allowance from token owner to this contract. 
     * */
    function getTokenAllowance(address _addr, address _addressOfToken) public view returns(uint256) {
        ERCInterface token = ERCInterface(_addressOfToken);
        return token.allowance(_addr, address(this));
    }
    
    
    fallback() external payable {
        revert();
    }


    receive() external payable {
        revert();
    }
    
    
    /**
    * Checks if two strings are the same.
    *
    * @param _a String 1
    * @param _b String 2
    *
    * @return True if both strings are the same. False otherwise. 
    **/
    function stringsAreEqual(string memory _a, string memory _b) internal pure returns(bool) {
        bytes32 hashA = keccak256(abi.encodePacked(_a));
        bytes32 hashB = keccak256(abi.encodePacked(_b));
        return hashA == hashB;
    }
 
    
    /**
     * Allows for the distribution of Ether to be transferred to multiple recipients at 
     * a time. This function only facilitates batch transfers of constant values (i.e., all recipients
     * will receive the same amount of tokens).
     * 
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _value The amount of tokens all addresses will receive. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return true if function executes successfully, false otherwise.
     * */
    function singleValueEthAirrop(address[] memory _recipients, uint256 _value, string memory _afCode) public payable returns(bool) {
        
        uint256 price = _recipients.length.mul(dropUnitPrice);
        uint256 totalCost = _value.mul(_recipients.length).add(price);

        require(
            msg.value >= totalCost|| isPremiumMember[msg.sender],
            "Not enough ETH sent with transaction!"
        );

        
        _afCode = processAffiliateCode(_afCode);
        
        
        if(!isPremiumMember[msg.sender]) {
            distributeCommission(_recipients.length, _afCode);
        }

        giveChange(totalCost);
        
        for(uint i=0; i<_recipients.length; i++) {
            if(_recipients[i] != address(0)) {
                payable(_recipients[i]).transfer(_value);
            }
        }

        emit EthAirdrop(msg.sender, _recipients.length, _value.mul(_recipients.length));
        
        return true;
    }
    

    
    function _getTotalEthValue(uint256[] memory _values) internal pure returns(uint256) {
        uint256 totalVal = 0;
        for(uint i = 0; i < _values.length; i++) {
            totalVal = totalVal.add(_values[i]);
        }
        return totalVal;
    }
    
    
    /**
     * Allows for the distribution of Ether to be transferred to multiple recipients at 
     * a time. 
     * 
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _values The corresponding amounts that the recipients will receive 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return true if function executes successfully, false otherwise.
     * */
    function multiValueEthAirdrop(address[] memory _recipients, uint256[] memory _values, string memory _afCode) public payable returns(bool) {
        require(_recipients.length == _values.length, "Total number of recipients and values are not equal");

        uint256 totalEthValue = _getTotalEthValue(_values);
        uint256 price = _recipients.length.mul(dropUnitPrice);
        uint256 totalCost = totalEthValue.add(price);

        require(
            msg.value >= totalCost || isPremiumMember[msg.sender], 
            "Not enough ETH sent with transaction!"
        );
        
        
        _afCode = processAffiliateCode(_afCode);
        
        if(!isPremiumMember[msg.sender]) {
            distributeCommission(_recipients.length, _afCode);
        }

        giveChange(totalCost);
        
        for(uint i = 0; i < _recipients.length; i++) {
            if(_recipients[i] != address(0) && _values[i] > 0) {
                payable(_recipients[i]).transfer(_values[i]);
            }
        }
        
        emit EthAirdrop(msg.sender, _recipients.length, totalEthValue);
        return true;
    }
    
    
    /**
     * Allows for the distribution of an ERC20 token to be transferred to multiple recipients at 
     * a time. This function only facilitates batch transfers of constant values (i.e., all recipients
     * will receive the same amount of tokens).
     * 
     * @param _addressOfToken The contract address of an ERC20 token.
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _value The amount of tokens all addresses will receive. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return true if function executes successfully, false otherwise.
     * */
    function singleValueTokenAirdrop(address _addressOfToken,  address[] memory _recipients, uint256 _value, string memory _afCode) public payable returns(bool) {
        ERCInterface token = ERCInterface(_addressOfToken);

        uint256 price = _recipients.length.mul(dropUnitPrice);

        require(
            msg.value >= price || tokenHasFreeTrial(_addressOfToken) || isPremiumMember[msg.sender],
            "Not enough ETH sent with transaction!"
        );

        giveChange(price);

        _afCode = processAffiliateCode(_afCode);
        
        for(uint i = 0; i < _recipients.length; i++) {
            if(_recipients[i] != address(0)) {
                token.transferFrom(msg.sender, _recipients[i], _value);
            }
        }
        if(tokenHasFreeTrial(_addressOfToken)) {
            tokenTrialDrops[_addressOfToken] = tokenTrialDrops[_addressOfToken].add(_recipients.length);
        } else {
            if(!isPremiumMember[msg.sender]) {
                distributeCommission(_recipients.length, _afCode);
            }
            
        }

        emit TokenAirdrop(msg.sender, _addressOfToken, _recipients.length);
        return true;
    }
    
    
    /**
     * Allows for the distribution of an ERC20 token to be transferred to multiple recipients at 
     * a time. This function facilitates batch transfers of differing values (i.e., all recipients
     * can receive different amounts of tokens).
     * 
     * @param _addressOfToken The contract address of an ERC20 token.
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _values The corresponding values of tokens which each address will receive.
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return true if function executes successfully, false otherwise.
     * */    
    function multiValueTokenAirdrop(address _addressOfToken,  address[] memory _recipients, uint256[] memory _values, string memory _afCode) public payable returns(bool) {
        ERCInterface token = ERCInterface(_addressOfToken);
        require(_recipients.length == _values.length, "Total number of recipients and values are not equal");

        uint256 price = _recipients.length.mul(dropUnitPrice);

        require(
            msg.value >= price || tokenHasFreeTrial(_addressOfToken) || isPremiumMember[msg.sender],
            "Not enough ETH sent with transaction!"
        );

        giveChange(price);
        
        _afCode = processAffiliateCode(_afCode);
        
        for(uint i = 0; i < _recipients.length; i++) {
            if(_recipients[i] != address(0) && _values[i] > 0) {
                token.transferFrom(msg.sender, _recipients[i], _values[i]);
            }
        }
        if(tokenHasFreeTrial(_addressOfToken)) {
            tokenTrialDrops[_addressOfToken] = tokenTrialDrops[_addressOfToken].add(_recipients.length);
        } else {
            if(!isPremiumMember[msg.sender]) {
                distributeCommission(_recipients.length, _afCode);
            }
        }
        emit TokenAirdrop(msg.sender, _addressOfToken, _recipients.length);
        return true;
    }
        

    /**
    * Send the owner and affiliates commissions.
    **/
    function distributeCommission(uint256 _drops, string memory _afCode) internal {
        if(!stringsAreEqual(_afCode,"void") && isAffiliate[affiliateCodeToAddr[_afCode]]) {
            uint256 profitSplit = _drops.mul(dropUnitPrice).div(2);
            payable(owner).transfer(profitSplit);
            payable(affiliateCodeToAddr[_afCode]).transfer(profitSplit);
            emit CommissionPaid(affiliateCodeToAddr[_afCode], profitSplit);
        } else {
            payable(owner).transfer(_drops.mul(dropUnitPrice));
        }
    }
    
    
    

    /**
     * Allows for any ERC20 tokens which have been mistakenly  sent to this contract to be returned 
     * to the original sender by the owner of the contract. Any attempt made by any other account 
     * to invoke the function will result in a loss of gas and no tokens will be transferred out.
     * 
     * @param _addressOfToken The contract address of an ERC20 token.
     * @param _recipient The address which will receive tokens. 
     * @param _value The amount of tokens to refund.
     * 
     * @return true if function executes successfully, false otherwise.
     * */  
    function withdrawERC20Tokens(address _addressOfToken,  address _recipient, uint256 _value) public onlyOwner returns(bool){
        require(
            _addressOfToken != address(0)
            && _recipient != address(0)
            && _value > 0
        );
        ERCInterface token = ERCInterface(_addressOfToken);
        token.transfer(_recipient, _value);
        emit ERC20TokensWithdrawn(_addressOfToken, _recipient, _value);
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"affiliate","type":"address"},{"indexed":true,"internalType":"string","name":"affiliateCode","type":"string"}],"name":"AffiliatePartnershipRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"CommissionPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"sentTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalTransfers","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethValue","type":"uint256"}],"name":"EthAirdrop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAffiliate","type":"address"},{"indexed":true,"internalType":"string","name":"affiliateCode","type":"string"}],"name":"NewAffiliatePartnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"premiumMember","type":"address"}],"name":"NewPremiumMembership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"PremiumMemberFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"from","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"to","type":"uint256"}],"name":"RateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalWei","type":"uint256"}],"name":"RefundIssued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalTransfers","type":"uint256"}],"name":"TokenAirdrop","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_code","type":"string"}],"name":"addAffiliate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"affiliateCodeExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"affiliateCodeOfAddr","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"affiliateCodeToAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomePremiumMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"dropUnitPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"getRemainingTrialDrops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"getTokenAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"grantPremiumMembership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAffiliate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAffiliatedWith","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPremiumMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"multiValueEthAirdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"multiValueTokenAirdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"premiumMemberFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"removeAffiliate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setPremiumMemberFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRate","type":"uint256"}],"name":"setRate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"singleValueEthAirrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"singleValueTokenAirdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"tokenHasFreeTrial","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenTrialDrops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdrawERC20Tokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50600080546001600160a01b03191633179055612710600955655af3107a4000600a556703782dace9d900006008556133d78061004e6000396000f3fe6080604052600436106101a05760003560e01c80638da5cb5b116100ec578063e8a05d4c1161008a578063f53289ca11610064578063f53289ca14610ae1578063f8fa4d1714610c1f578063f9727e1d14610dd7578063fec5c0c614610e01576101aa565b8063e8a05d4c14610a3e578063ea7ee01014610a71578063f2fde38b14610aac576101aa565b8063adc76126116100c6578063adc76126146108f1578063b186768514610924578063bcdd1e1314610957578063cfab2bb31461099a576101aa565b80638da5cb5b146108b257806390d419d1146108c7578063a39a2b76146108dc576101aa565b80634a4a2feb11610159578063590925e211610133578063590925e2146105f557806362920c85146106c25780636cca7d3c1461086a578063893d20e81461089d576101aa565b80634a4a2feb146104595780634fa8518614610501578063503ad00e14610534576101aa565b806318f20763146101af57806323a0fb02146102f15780632c4e722e1461032457806334fcf4371461034b5780633b9ff843146103755780633d2375f9146103a8576101aa565b366101aa57600080fd5b600080fd5b6102dd600480360360608110156101c557600080fd5b810190602081018135600160201b8111156101df57600080fd5b8201836020820111156101f157600080fd5b803590602001918460208302840111600160201b8311171561021257600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092958435959094909350604081019250602001359050600160201b81111561026957600080fd5b82018360208201111561027b57600080fd5b803590602001918460018302840111600160201b8311171561029c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e34945050505050565b604080519115158252519081900360200190f35b3480156102fd57600080fd5b506102dd6004803603602081101561031457600080fd5b50356001600160a01b0316610fe5565b34801561033057600080fd5b50610339611007565b60408051918252519081900360200190f35b34801561035757600080fd5b506102dd6004803603602081101561036e57600080fd5b503561100d565b34801561038157600080fd5b506102dd6004803603602081101561039857600080fd5b50356001600160a01b03166110d3565b3480156103b457600080fd5b506102dd600480360360208110156103cb57600080fd5b810190602081018135600160201b8111156103e557600080fd5b8201836020820111156103f757600080fd5b803590602001918460018302840111600160201b8311171561041857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061130f945050505050565b34801561046557600080fd5b5061048c6004803603602081101561047c57600080fd5b50356001600160a01b031661132f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104c65781810151838201526020016104ae565b50505050905090810190601f1680156104f35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561050d57600080fd5b506102dd6004803603602081101561052457600080fd5b50356001600160a01b03166113ca565b34801561054057600080fd5b506102dd6004803603604081101561055757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561058157600080fd5b82018360208201111561059357600080fd5b803590602001918460018302840111600160201b831117156105b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506113df945050505050565b34801561060157600080fd5b506106a66004803603602081101561061857600080fd5b810190602081018135600160201b81111561063257600080fd5b82018360208201111561064457600080fd5b803590602001918460018302840111600160201b8311171561066557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506116e0945050505050565b604080516001600160a01b039092168252519081900360200190f35b6102dd600480360360608110156106d857600080fd5b810190602081018135600160201b8111156106f257600080fd5b82018360208201111561070457600080fd5b803590602001918460208302840111600160201b8311171561072557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561077457600080fd5b82018360208201111561078657600080fd5b803590602001918460208302840111600160201b831117156107a757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156107f657600080fd5b82018360208201111561080857600080fd5b803590602001918460018302840111600160201b8311171561082957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611706945050505050565b34801561087657600080fd5b506103396004803603602081101561088d57600080fd5b50356001600160a01b031661191b565b3480156108a957600080fd5b506106a661192d565b3480156108be57600080fd5b506106a661193c565b3480156108d357600080fd5b5061033961194b565b3480156108e857600080fd5b50610339611951565b3480156108fd57600080fd5b506103396004803603602081101561091457600080fd5b50356001600160a01b0316611957565b34801561093057600080fd5b5061048c6004803603602081101561094757600080fd5b50356001600160a01b031661199e565b34801561096357600080fd5b506102dd6004803603606081101561097a57600080fd5b506001600160a01b03813581169160208101359091169060400135611a06565b6102dd600480360360208110156109b057600080fd5b810190602081018135600160201b8111156109ca57600080fd5b8201836020820111156109dc57600080fd5b803590602001918460018302840111600160201b831117156109fd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b58945050505050565b348015610a4a57600080fd5b506102dd60048036036020811015610a6157600080fd5b50356001600160a01b0316612058565b348015610a7d57600080fd5b5061033960048036036040811015610a9457600080fd5b506001600160a01b038135811691602001351661206d565b348015610ab857600080fd5b50610adf60048036036020811015610acf57600080fd5b50356001600160a01b03166120f6565b005b6102dd60048036036080811015610af757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610b2157600080fd5b820183602082011115610b3357600080fd5b803590602001918460208302840111600160201b83111715610b5457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092958435959094909350604081019250602001359050600160201b811115610bab57600080fd5b820183602082011115610bbd57600080fd5b803590602001918460018302840111600160201b83111715610bde57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506121c9945050505050565b6102dd60048036036080811015610c3557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610c5f57600080fd5b820183602082011115610c7157600080fd5b803590602001918460208302840111600160201b83111715610c9257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610ce157600080fd5b820183602082011115610cf357600080fd5b803590602001918460208302840111600160201b83111715610d1457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610d6357600080fd5b820183602082011115610d7557600080fd5b803590602001918460018302840111600160201b83111715610d9657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506123f3945050505050565b348015610de357600080fd5b506102dd60048036036020811015610dfa57600080fd5b50356125d7565b348015610e0d57600080fd5b506102dd60048036036020811015610e2457600080fd5b50356001600160a01b031661267c565b600080610e4d600a54865161278590919063ffffffff16565b90506000610e6f82610e6988518861278590919063ffffffff16565b906127aa565b90508034101580610e8f57503360009081526002602052604090205460ff165b610eca5760405162461bcd60e51b81526004018080602001828103825260258152602001806133226025913960400191505060405180910390fd5b610ed3846127c0565b3360009081526002602052604090205490945060ff16610ef857610ef8865185612d83565b610f0181613012565b60005b8651811015610f905760006001600160a01b0316878281518110610f2457fe5b60200260200101516001600160a01b031614610f8857868181518110610f4657fe5b60200260200101516001600160a01b03166108fc879081150290604051600060405180830381858888f19350505050158015610f86573d6000803e3d6000fd5b505b600101610f04565b50855133907f96280f1b9a54271a5ff3d2bc027d857d9386da43de7540d42b8b73180a15864a90610fc18882612785565b6040805192835260208301919091528051918290030190a250600195945050505050565b6001600160a01b0381166000908152600160205260409020546064115b919050565b60095481565b600080546001600160a01b031633146110575760405162461bcd60e51b815260040180806020018281038252602881526020018061337a6028913960400191505060405180910390fd5b60095482141580156110695750600082115b61107257600080fd5b600954604080519182526020820184905280517f4ac9052a820bf4f8c02d7588587cae835573b5b99ea7ad4ca002f17f319f71869281900390910190a16009829055670de0b6b3a76400006110c78184613059565b600a5550600192915050565b600080546001600160a01b0316331461111d5760405162461bcd60e51b815260040180806020018281038252602881526020018061337a6028913960400191505060405180910390fd5b6001600160a01b03821660009081526003602052604090205460ff1661114257600080fd5b6001600160a01b0382166000908152600360209081526040808320805460ff191690556006909152808220905181546004929190819083906002600019600183161561010002019091160480156111d05780601f106111ae5761010080835404028352918201916111d0565b820191906000526020600020905b8154815290600101906020018083116111bc575b50509283525050604080516020928190038301812080546001600160a01b0319166001600160a01b0395861617905592851660009081526006909252902080549091908190839060026101006001831615026000190190911604801561126d5780601f1061124b57610100808354040283529182019161126d565b820191906000526020600020905b815481529060010190602001808311611259575b505060405190819003812092506001600160a01b03851691507f4ddc7b8659a2faf8698c810ab0219aa981bfccb47c036d3cc7ae8a32c15dc4ec90600090a3604080518082018252601e81527f4e6f206c6f6e67657220616e20616666696c6961746520706172746e6572000060208083019182526001600160a01b038616600090815260069091529290922090516113069290613297565b50600192915050565b805160208183018101805160058252928201919093012091525460ff1681565b60066020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156113c25780601f10611397576101008083540402835291602001916113c2565b820191906000526020600020905b8154815290600101906020018083116113a557829003601f168201915b505050505081565b60036020526000908152604090205460ff1681565b600080546001600160a01b031633146114295760405162461bcd60e51b815260040180806020018281038252602881526020018061337a6028913960400191505060405180910390fd5b6001600160a01b03831660009081526003602052604090205460ff1615611497576040805162461bcd60e51b815260206004820181905260248201527f4164647265737320697320616c726561647920616e20616666696c696174652e604482015290519081900360640190fd5b6001600160a01b0383166114aa57600080fd5b6005826040518082805190602001908083835b602083106114dc5780518252601f1990920191602091820191016114bd565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205460ff16159150611519905057600080fd5b60016005836040518082805190602001908083835b6020831061154d5780518252601f19909201916020918201910161152e565b51815160001960209485036101000a01908116901991909116179052920194855250604080519485900382018520805496151560ff199788161790556001600160a01b038916600090815260038352208054909516600117909455505083518592600492869290918291908401908083835b602083106115de5780518252601f1990920191602091820191016115bf565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820190942080546001600160a01b0319166001600160a01b03968716179055938716600090815260068552929092208551611648949193509086019150613297565b50816040518082805190602001908083835b602083106116795780518252601f19909201916020918201910161165a565b5181516020939093036101000a6000190180199091169216919091179052604051920182900382209350506001600160a01b03861691507ff30f92c3d1eddb3772622c3b7d6a3985a8de818f7eebd5cef6650ee86d5ddbce90600090a35060015b92915050565b80516020818301810180516004825292820191909301209152546001600160a01b031681565b600082518451146117485760405162461bcd60e51b81526004018080602001828103825260338152602001806133476033913960400191505060405180910390fd5b60006117538461306c565b9050600061176d600a54875161278590919063ffffffff16565b9050600061177b83836127aa565b9050803410158061179b57503360009081526002602052604090205460ff165b6117d65760405162461bcd60e51b81526004018080602001828103825260258152602001806133226025913960400191505060405180910390fd5b6117df856127c0565b3360009081526002602052604090205490955060ff1661180457611804875186612d83565b61180d81613012565b60005b87518110156118d05760006001600160a01b031688828151811061183057fe5b60200260200101516001600160a01b0316141580156118625750600087828151811061185857fe5b6020026020010151115b156118c85787818151811061187357fe5b60200260200101516001600160a01b03166108fc88838151811061189357fe5b60200260200101519081150290604051600060405180830381858888f193505050501580156118c6573d6000803e3d6000fd5b505b600101611810565b5086516040805191825260208201859052805133927f96280f1b9a54271a5ff3d2bc027d857d9386da43de7540d42b8b73180a15864a92908290030190a25060019695505050505050565b60016020526000908152604090205481565b6000546001600160a01b031690565b6000546001600160a01b031681565b60085481565b600a5481565b600061196282610fe5565b15611996576001600160a01b03821660009081526001602052604090205460649061198e9082906130b1565b915050611002565b506000919050565b60076020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156113c25780601f10611397576101008083540402835291602001916113c2565b600080546001600160a01b03163314611a505760405162461bcd60e51b815260040180806020018281038252602881526020018061337a6028913960400191505060405180910390fd5b6001600160a01b03841615801590611a7057506001600160a01b03831615155b8015611a7c5750600082115b611a8557600080fd5b6040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151869283169163a9059cbb9160448083019260209291908290030181600087803b158015611ad857600080fd5b505af1158015611aec573d6000803e3d6000fd5b505050506040513d6020811015611b0257600080fd5b5050604080516001600160a01b0380881682528616602082015280820185905290517ee763f7778b8ceef7270c89b7d1df1008b0e482da39c43831417733af96fb0d9181900360600190a1506001949350505050565b3360009081526002602052604081205460ff1615611bbd576040805162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d62657200604482015290519081900360640190fd5b600854341015611bce6008546130c3565b611bd7346130c3565b6040516020018080750383932b6b4bab6a6b2b6b132b9103332b29034b99d160551b81525060160183805190602001908083835b60208310611c2a5780518252601f199092019160209182019101611c0b565b51815160209384036101000a60001901801990921691161790527f2e204e6f7420656e6f756768204554482073656e742e20000000000000000000919093019081528451601790910192850191508083835b60208310611c9b5780518252601f199092019160209182019101611c7c565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290611d595760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d1e578181015183820152602001611d06565b50505050905090810190601f168015611d4b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50336000908152600260205260409020805460ff19166001179055611d7d826127c0565b9150611d8a600854613012565b611db082604051806040016040528060048152602001631d9bda5960e21b8152506131a5565b158015611e395750600360006004846040518082805190602001908083835b60208310611dee5780518252601f199092019160209182019101611dcf565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201909420546001600160a01b0316855284019490945250016000205460ff1690505b15611fe8576000546008546001600160a01b03909116906108fc90611e6c90606490611e66906050612785565b90613059565b6040518115909202916000818181858888f19350505050158015611e94573d6000803e3d6000fd5b506000611eb26064611e66601460085461278590919063ffffffff16565b90506004836040518082805190602001908083835b60208310611ee65780518252601f199092019160209182019101611ec7565b51815160209384036101000a600019018019909216911617905292019485525060405193849003018320546001600160a01b0316926108fc85150292508491506000818181858888f19350505050158015611f45573d6000803e3d6000fd5b506004836040518082805190602001908083835b60208310611f785780518252601f199092019160209182019101611f59565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185205486865290516001600160a01b03909116947f885e6f6235626292940f78c947a331f4c7c1d7f50a48b38092cf546bc9c7907a94508190039091019150a250612025565b600080546008546040516001600160a01b039092169281156108fc029290818181858888f19350505050158015612023573d6000803e3d6000fd5b505b60405133907fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb00951590600090a2506001919050565b60026020526000908152604090205460ff1681565b60408051636eb1769f60e11b81526001600160a01b038481166004830152306024830152915160009284929083169163dd62ed3e91604480820192602092909190829003018186803b1580156120c257600080fd5b505afa1580156120d6573d6000803e3d6000fd5b505050506040513d60208110156120ec57600080fd5b5051949350505050565b6000546001600160a01b0316331461213f5760405162461bcd60e51b815260040180806020018281038252602881526020018061337a6028913960400191505060405180910390fd5b6001600160a01b0381161580159061216557506000546001600160a01b03828116911614155b61216e57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600a548351600091869183916121df9190612785565b905080341015806121f457506121f487610fe5565b8061220e57503360009081526002602052604090205460ff165b6122495760405162461bcd60e51b81526004018080602001828103825260258152602001806133226025913960400191505060405180910390fd5b61225281613012565b61225b846127c0565b935060005b86518110156123325760006001600160a01b031687828151811061228057fe5b60200260200101516001600160a01b03161461232a57826001600160a01b03166323b872dd338984815181106122b257fe5b6020026020010151896040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561231157600080fd5b505af1158015612325573d6000803e3d6000fd5b505050505b600101612260565b5061233c87610fe5565b156123835785516001600160a01b038816600090815260016020526040902054612365916127aa565b6001600160a01b0388166000908152600160205260409020556123a5565b3360009081526002602052604090205460ff166123a5576123a5865185612d83565b855160408051918252516001600160a01b0389169133917f39015fe519110ce3ccad418b153817407dc5312684839c8700af7436a80a07af9181900360200190a35060019695505050505050565b815183516000918691146124385760405162461bcd60e51b81526004018080602001828103825260338152602001806133476033913960400191505060405180910390fd5b6000612450600a54875161278590919063ffffffff16565b90508034101580612465575061246587610fe5565b8061247f57503360009081526002602052604090205460ff165b6124ba5760405162461bcd60e51b81526004018080602001828103825260258152602001806133226025913960400191505060405180910390fd5b6124c381613012565b6124cc846127c0565b935060005b86518110156123325760006001600160a01b03168782815181106124f157fe5b60200260200101516001600160a01b0316141580156125235750600086828151811061251957fe5b6020026020010151115b156125cf57826001600160a01b03166323b872dd3389848151811061254457fe5b602002602001015189858151811061255857fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156125b657600080fd5b505af11580156125ca573d6000803e3d6000fd5b505050505b6001016124d1565b600080546001600160a01b031633146126215760405162461bcd60e51b815260040180806020018281038252602881526020018061337a6028913960400191505060405180910390fd5b60008211801561263357506008548214155b61263c57600080fd5b60088290556040805183815290517fa77eb4a199fa90085e9d7437273dd3bc924372a4bd0569aa21acc65a07b2c11c9181900360200190a1506001919050565b600080546001600160a01b031633146126c65760405162461bcd60e51b815260040180806020018281038252602881526020018061337a6028913960400191505060405180910390fd5b6001600160a01b03821660009081526002602052604090205460ff1615612734576040805162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d62657200604482015290519081900360640190fd5b6001600160a01b038216600081815260026020526040808220805460ff19166001179055517fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb0095159190a2506001919050565b600082612794575060006116da565b50818102818382816127a257fe5b04146116da57fe5b6000828201838110156127b957fe5b9392505050565b336000908152600760209081526040918290208054835160026001831615610100026000190190921691909104601f81018490048402820184019094528381526060936128829391929183018282801561285b5780601f106128305761010080835404028352916020019161285b565b820191906000526020600020905b81548152906001019060200180831161283e57829003601f168201915b5050505050604051806040016040528060048152602001631d9bda5960e21b8152506131a5565b8061290a5750600360006004846040518082805190602001908083835b602083106128be5780518252601f19909201916020918201910161289f565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201909420546001600160a01b0316855284019490945250016000205460ff161590505b156129695760408051808201825260048152631d9bda5960e21b602080830191825233600090815260079091529290922090516129479290613297565b50506040805180820190915260048152631d9bda5960e21b6020820152611002565b61298282604051806020016040528060008152506131a5565b158015612a3b57503360009081526007602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452612a3b9392830182828015612a215780601f106129f657610100808354040283529160200191612a21565b820191906000526020600020905b815481529060010190602001808311612a0457829003601f168201915b5050505050604051806020016040528060008152506131a5565b8015612aa757506005826040518082805190602001908083835b60208310612a745780518252601f199092019160209182019101612a55565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205460ff169150505b15612b6d57336001600160a01b03166004836040518082805190602001908083835b60208310612ae85780518252601f199092019160209182019101612ac9565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220546001600160a01b031692909214159150612b4b905057506040805180820190915260048152631d9bda5960e21b6020820152611002565b3360009081526007602090815260409091208351612b6b92850190613297565b505b612b8682604051806020016040528060008152506131a5565b8015612bfb57503360009081526007602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452612bf99392830182828015612a215780601f106129f657610100808354040283529160200191612a21565b155b15612c9c573360009081526007602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015612c945780601f10612c6957610100808354040283529160200191612c94565b820191906000526020600020905b815481529060010190602001808311612c7757829003601f168201915b505050505091505b612cb582604051806020016040528060008152506131a5565b80612d2157506005826040518082805190602001908083835b60208310612ced5780518252601f199092019160209182019101612cce565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205460ff16159150505b15612d7f5760408051808201825260048152631d9bda5960e21b60208083019182523360009081526007909152929092209051612d5e9290613297565b50604051806040016040528060048152602001631d9bda5960e21b81525091505b5090565b612da981604051806040016040528060048152602001631d9bda5960e21b8152506131a5565b158015612e325750600360006004836040518082805190602001908083835b60208310612de75780518252601f199092019160209182019101612dc8565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201909420546001600160a01b0316855284019490945250016000205460ff1690505b15612fc3576000612e536002611e66600a548661278590919063ffffffff16565b600080546040519293506001600160a01b03169183156108fc0291849190818181858888f19350505050158015612e8e573d6000803e3d6000fd5b506004826040518082805190602001908083835b60208310612ec15780518252601f199092019160209182019101612ea2565b51815160209384036101000a600019018019909216911617905292019485525060405193849003018320546001600160a01b0316926108fc85150292508491506000818181858888f19350505050158015612f20573d6000803e3d6000fd5b506004826040518082805190602001908083835b60208310612f535780518252601f199092019160209182019101612f34565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185205486865290516001600160a01b03909116947f885e6f6235626292940f78c947a331f4c7c1d7f50a48b38092cf546bc9c7907a94508190039091019150a25061300e565b600054600a546001600160a01b03909116906108fc90612fe4908590612785565b6040518115909202916000818181858888f1935050505015801561300c573d6000803e3d6000fd5b505b5050565b8034111561305657600061302634836130b1565b604051909150339082156108fc029083906000818181858888f1935050505015801561300c573d6000803e3d6000fd5b50565b600081838161306457fe5b049392505050565b600080805b83518110156130aa576130a084828151811061308957fe5b6020026020010151836127aa90919063ffffffff16565b9150600101613071565b5092915050565b6000828211156130bd57fe5b50900390565b6060816130e857506040805180820190915260018152600360fc1b6020820152611002565b8160005b811561310057600101600a820491506130ec565b60608167ffffffffffffffff8111801561311957600080fd5b506040519080825280601f01601f191660200182016040528015613144576020820181803683370190505b509050815b851561319c57600019016000600a8704600a028703603001905060008160f81b90508084848151811061317857fe5b60200101906001600160f81b031916908160001a905350600a880497505050613149565b50949350505050565b600080836040516020018082805190602001908083835b602083106131db5780518252601f1990920191602091820191016131bc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012090506000836040516020018082805190602001908083835b6020831061324d5780518252601f19909201916020918201910161322e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012090508082149250505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106132d857805160ff1916838001178555613305565b82800160010185558215613305579182015b828111156133055782518255916020019190600101906132ea565b50612d7f9291505b80821115612d7f576000815560010161330d56fe4e6f7420656e6f756768204554482073656e742077697468207472616e73616374696f6e21546f74616c206e756d626572206f6620726563697069656e747320616e642076616c75657320617265206e6f7420657175616c46756e6374696f6e207265737472696374656420746f206f776e6572206f6620636f6e7472616374a2646970667358221220fd28e7d808bef58708fdfb08f39a79c439ccbe4da9fb2fd43961f0035426a75a64736f6c634300060c0033

Deployed ByteCode Sourcemap

4031:21016:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15172:8;;;4031:21016;15108:8;;;16305:988;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16305:988:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16305:988:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16305:988:0;;;;;;;;;-1:-1:-1;16305:988:0;;;;-1:-1:-1;16305:988:0;;;;-1:-1:-1;;;;16305:988:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16305:988:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16305:988:0;;-1:-1:-1;16305:988:0;;-1:-1:-1;;;;;16305:988:0:i;:::-;;;;;;;;;;;;;;;;;;12403:142;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12403:142:0;-1:-1:-1;;;;;12403:142:0;;:::i;4570:19::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;13440:327;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13440:327:0;;:::i;11512:397::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11512:397:0;-1:-1:-1;;;;;11512:397:0;;:::i;4345:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4345:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4345:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4345:51:0;;-1:-1:-1;4345:51:0;;-1:-1:-1;;;;;4345:51:0:i;4403:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4403:54:0;-1:-1:-1;;;;;4403:54:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4233:44;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4233:44:0;-1:-1:-1;;;;;4233:44:0;;:::i;10748:502::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10748:502:0;;;;;;;;;;;;;;;-1:-1:-1;;;10748:502:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10748:502:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10748:502:0;;-1:-1:-1;10748:502:0;;-1:-1:-1;;;;;10748:502:0:i;4284:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4284:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4284:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4284:54:0;;-1:-1:-1;4284:54:0;;-1:-1:-1;;;;;4284:54:0:i;:::-;;;;-1:-1:-1;;;;;4284:54:0;;;;;;;;;;;;;;18112:1152;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18112:1152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18112:1152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18112:1152:0;;;;;;;;-1:-1:-1;18112:1152:0;;-1:-1:-1;;;;;18112:1152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18112:1152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18112:1152:0;;;;;;;;-1:-1:-1;18112:1152:0;;-1:-1:-1;;;;;18112:1152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18112:1152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18112:1152:0;;-1:-1:-1;18112:1152:0;;-1:-1:-1;;;;;18112:1152:0:i;4118:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4118:51:0;-1:-1:-1;;;;;4118:51:0;;:::i;2567:80::-;;;;;;;;;;;;;:::i;2277:20::-;;;;;;;;;;;;;:::i;4532:31::-;;;;;;;;;;;;;:::i;4596:28::-;;;;;;;;;;;;;:::i;12801:291::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12801:291:0;-1:-1:-1;;;;;12801:291:0;;:::i;4464:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4464:51:0;-1:-1:-1;;;;;4464:51:0;;:::i;24573:471::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24573:471:0;;;;;;;;;;;;;;;;;:::i;9317:1124::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9317:1124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9317:1124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9317:1124:0;;-1:-1:-1;9317:1124:0;;-1:-1:-1;;;;;9317:1124:0:i;4178:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4178:48:0;-1:-1:-1;;;;;4178:48:0;;:::i;14831:220::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14831:220:0;;;;;;;;;;:::i;3267:256::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3267:256:0;-1:-1:-1;;;;;3267:256:0;;:::i;:::-;;20006:1205;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20006:1205:0;;;;;;;;;;;;;;;-1:-1:-1;;;20006:1205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20006:1205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20006:1205:0;;;;;;;;;-1:-1:-1;20006:1205:0;;;;-1:-1:-1;20006:1205:0;;;;-1:-1:-1;;;;20006:1205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20006:1205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20006:1205:0;;-1:-1:-1;20006:1205:0;;-1:-1:-1;;;;;20006:1205:0:i;21973:1339::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21973:1339:0;;;;;;;;;;;;;;;-1:-1:-1;;;21973:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21973:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21973:1339:0;;;;;;;;-1:-1:-1;21973:1339:0;;-1:-1:-1;;;;;21973:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21973:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21973:1339:0;;;;;;;;-1:-1:-1;21973:1339:0;;-1:-1:-1;;;;;21973:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21973:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21973:1339:0;;-1:-1:-1;21973:1339:0;;-1:-1:-1;;;;;21973:1339:0:i;5774:239::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5774:239:0;;:::i;8724:270::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8724:270:0;-1:-1:-1;;;;;8724:270:0;;:::i;16305:988::-;16427:4;16454:13;16470:37;16493:13;;16470:11;:18;:22;;:37;;;;:::i;:::-;16454:53;;16518:17;16538:41;16573:5;16538:30;16549:11;:18;16538:6;:10;;:30;;;;:::i;:::-;:34;;:41::i;:::-;16518:61;;16627:9;16614;:22;;:52;;;-1:-1:-1;16655:10:0;16639:27;;;;:15;:27;;;;;;;;16614:52;16592:139;;;;-1:-1:-1;;;16592:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16764:29;16785:7;16764:20;:29::i;:::-;16844:10;16828:27;;;;:15;:27;;;;;;16754:39;;-1:-1:-1;16828:27:0;;16824:109;;16872:49;16893:11;:18;16913:7;16872:20;:49::i;:::-;16945:21;16956:9;16945:10;:21::i;:::-;16991:6;16987:175;17003:11;:18;17001:1;:20;16987:175;;;17072:1;-1:-1:-1;;;;;17046:28:0;:11;17058:1;17046:14;;;;;;;;;;;;;;-1:-1:-1;;;;;17046:28:0;;17043:108;;17103:11;17115:1;17103:14;;;;;;;;;;;;;;-1:-1:-1;;;;;17095:32:0;:40;17128:6;17095:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17043:108;17023:3;;16987:175;;;-1:-1:-1;17202:18:0;;17190:10;;17179:74;;17222:30;:6;17202:18;17222:10;:30::i;:::-;17179:74;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17281:4:0;;16305:988;-1:-1:-1;;;;;16305:988:0:o;12403:142::-;-1:-1:-1;;;;;12499:32:0;;12475:4;12499:32;;;:15;:32;;;;;;12534:3;-1:-1:-1;12403:142:0;;;;:::o;4570:19::-;;;;:::o;13440:327::-;13500:4;3028:5;;-1:-1:-1;;;;;3028:5:0;3014:10;:19;3006:72;;;;-1:-1:-1;;;3006:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13551:4:::1;;13539:8;:16;;:46;;;;;13584:1;13573:8;:12;13539:46;13517:79;;;::::0;::::1;;13624:4;::::0;13612:27:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;13650:4;:15:::0;;;13690:7:::1;13724:13;13690:7:::0;13657:8;13724:7:::1;:13::i;:::-;13708;:29:::0;-1:-1:-1;13755:4:0::1;::::0;13440:327;-1:-1:-1;;13440:327:0:o;11512:397::-;11577:4;3028:5;;-1:-1:-1;;;;;3028:5:0;3014:10;:19;3006:72;;;;-1:-1:-1;;;3006:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11602:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;11594:27;;;::::0;::::1;;-1:-1:-1::0;;;;;11632:18:0;::::1;11653:5;11632:18:::0;;;:11:::1;:18;::::0;;;;;;;:26;;-1:-1:-1;;11632:26:0::1;::::0;;11689:19:::1;:26:::0;;;;;;11669:47;;;;:19:::1;::::0;11689:26;11669:47;;;11689:26;;11669:47:::1;-1:-1:-1::0;;11632:26:0;11669:47;::::1;;11632:26;11669:47;::::0;;;::::1;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;11669:47:0;;;-1:-1:-1;;11669:47:0::1;::::0;;::::1;::::0;;;;;;;;:60;;-1:-1:-1;;;;;;11669:60:0::1;-1:-1:-1::0;;;;;11669:60:0;;::::1;;::::0;;11780:26;;::::1;-1:-1:-1::0;11780:26:0;;;:19:::1;:26:::0;;;;;11745:62;;11780:26;;11669:47;;;11780:26;;11745:62:::1;11669:60;-1:-1:-1::0;11745:62:0;::::1;;;-1:-1:-1::0;;11745:62:0;;;::::1;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;11745:62:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;11745:62:0;::::1;::::0;-1:-1:-1;11745:62:0::1;::::0;;;::::1;11818:61;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;;;;;11818:26:0;::::1;-1:-1:-1::0;11818:26:0;;;:19:::1;:26:::0;;;;;;;:61;;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;11897:4:0::1;::::0;11512:397;-1:-1:-1;;11512:397:0:o;4345:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4403:54::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4403:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4233:44::-;;;;;;;;;;;;;;;:::o;10748:502::-;10831:4;3028:5;;-1:-1:-1;;;;;3028:5:0;3014:10;:19;3006:72;;;;-1:-1:-1;;;3006:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10857:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;10856:19;10848:64;;;::::0;;-1:-1:-1;;;10848:64:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;10931:19:0;::::1;10923:28;;;::::0;::::1;;10971:19;10991:5;10971:26;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;10971:26:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;10971:26:0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;10971:26:0::1;::::0;;;;;;;;;;::::1;;10970:27;::::0;-1:-1:-1;10962:36:0::1;::::0;-1:-1:-1;10962:36:0::1;;::::0;::::1;;11038:4;11009:19;11029:5;11009:26;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;11009:26:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;-1:-1:-1;;11009:26:0::1;::::0;;::::1;;;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;11009:26:0::1;::::0;;;;;;;;;;:33;;;::::1;;-1:-1:-1::0;;11009:33:0;;::::1;;::::0;;-1:-1:-1;;;;;11053:18:0;::::1;-1:-1:-1::0;11053:18:0;;;:11:::1;:18:::0;;;:25;;;;::::1;11009:26;11053:25;::::0;;;-1:-1:-1;;11089:26:0;;11065:5;;11089:19:::1;::::0;11109:5;;11009:26;;;;11089;;::::1;::::0;;11009;11089;::::1;;;;;;::::0;;;;-1:-1:-1;;11089:26:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;11089:26:0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;11089:26:0::1;::::0;;;;;;;;;;;:34;;-1:-1:-1;;;;;;11089:34:0::1;-1:-1:-1::0;;;;;11089:34:0;;::::1;;::::0;;11134:26;;::::1;-1:-1:-1::0;11134:26:0;;;:19:::1;:26:::0;;;;;;:34;;::::1;::::0;:26;;-1:-1:-1;11134:34:0;;::::1;::::0;-1:-1:-1;11134:34:0::1;:::i;:::-;;11214:5;11184:36;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;11184:36:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;;::::1;;;-1:-1:-1::0;;11184:36:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;;;11184:36:0;::::1;::::0;-1:-1:-1;11184:36:0::1;::::0;-1:-1:-1;;11184:36:0::1;-1:-1:-1::0;11238:4:0::1;3089:1;10748:502:::0;;;;:::o;4284:54::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4284:54:0;;:::o;18112:1152::-;18244:4;18291:7;:14;18269:11;:18;:36;18261:100;;;;-1:-1:-1;;;18261:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18374:21;18398:26;18416:7;18398:17;:26::i;:::-;18374:50;;18435:13;18451:37;18474:13;;18451:11;:18;:22;;:37;;;;:::i;:::-;18435:53;-1:-1:-1;18499:17:0;18519:24;:13;18435:53;18519:17;:24::i;:::-;18499:44;;18591:9;18578;:22;;:53;;;-1:-1:-1;18620:10:0;18604:27;;;;:15;:27;;;;;;;;18578:53;18556:141;;;;-1:-1:-1;;;18556:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18738:29;18759:7;18738:20;:29::i;:::-;18808:10;18792:27;;;;:15;:27;;;;;;18728:39;;-1:-1:-1;18792:27:0;;18788:109;;18836:49;18857:11;:18;18877:7;18836:20;:49::i;:::-;18909:21;18920:9;18909:10;:21::i;:::-;18955:6;18951:201;18971:11;:18;18967:1;:22;18951:201;;;19040:1;-1:-1:-1;;;;;19014:28:0;:11;19026:1;19014:14;;;;;;;;;;;;;;-1:-1:-1;;;;;19014:28:0;;;:46;;;;;19059:1;19046:7;19054:1;19046:10;;;;;;;;;;;;;;:14;19014:46;19011:130;;;19089:11;19101:1;19089:14;;;;;;;;;;;;;;-1:-1:-1;;;;;19081:32:0;:44;19114:7;19122:1;19114:10;;;;;;;;;;;;;;19081:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19011:130;18991:3;;18951:201;;;-1:-1:-1;19200:18:0;;19177:57;;;;;;;;;;;;;;19188:10;;19177:57;;;;;;;;;-1:-1:-1;19252:4:0;;18112:1152;-1:-1:-1;;;;;;18112:1152:0:o;4118:51::-;;;;;;;;;;;;;:::o;2567:80::-;2607:7;2634:5;-1:-1:-1;;;;;2634:5:0;2567:80;:::o;2277:20::-;;;-1:-1:-1;;;;;2277:20:0;;:::o;4532:31::-;;;;:::o;4596:28::-;;;;:::o;12801:291::-;12878:7;12901:34;12919:15;12901:17;:34::i;:::-;12898:167;;;-1:-1:-1;;;;;13020:32:0;;12952:21;13020:32;;;:15;:32;;;;;;12977:3;;13002:51;;12977:3;;13002:17;:51::i;:::-;12995:58;;;;;12898:167;-1:-1:-1;13083:1:0;12801:291;;;:::o;4464:51::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4464:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24573:471;24689:4;3028:5;;-1:-1:-1;;;;;3028:5:0;3014:10;:19;3006:72;;;;-1:-1:-1;;;3006:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24727:29:0;::::1;::::0;;::::1;::::0;:70:::1;;-1:-1:-1::0;;;;;;24773:24:0;::::1;::::0;::::1;24727:70;:97;;;;;24823:1;24814:6;:10;24727:97;24705:130;;;::::0;::::1;;24907:34;::::0;;-1:-1:-1;;;24907:34:0;;-1:-1:-1;;;;;24907:34:0;;::::1;;::::0;::::1;::::0;;;;;;;;;24880:15;;24907:14;::::1;::::0;::::1;::::0;:34;;;;;::::1;::::0;;;;;;;;24846:18:::1;24907:14:::0;:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;24957:57:0::1;::::0;;-1:-1:-1;;;;;24957:57:0;;::::1;::::0;;;::::1;24907:34;24957:57:::0;::::1;::::0;;;;;;;;;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;25032:4:0::1;::::0;24573:471;-1:-1:-1;;;;24573:471:0:o;9317:1124::-;9434:10;9392:4;9418:27;;;:15;:27;;;;;;;;9417:28;9409:72;;;;;-1:-1:-1;;;9409:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9527:16;;9514:9;:29;;9626:26;9635:16;;9626:8;:26::i;:::-;9681:19;9690:9;9681:8;:19::i;:::-;9565:150;;;;;;-1:-1:-1;;;9565:150:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9565:150:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9565:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9565:150:0;;;;;;;;;;;;;-1:-1:-1;;9565:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9492:235;;;;;-1:-1:-1;;;9492:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9764:10:0;9748:27;;;;:15;:27;;;;;:34;;-1:-1:-1;;9748:34:0;9778:4;9748:34;;;9813:29;9834:7;9813:20;:29::i;:::-;9803:39;;9855:28;9866:16;;9855:10;:28::i;:::-;9908:31;9924:7;9908:31;;;;;;;;;;;;;-1:-1:-1;;;9908:31:0;;;:15;:31::i;:::-;9907:32;:77;;;;;9943:11;:41;9955:19;9975:7;9955:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9955:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9955:28:0;;;;;;;;;;;;;;;;-1:-1:-1;9955:28:0;;;;;;;;;;;;;-1:-1:-1;;;;;9955:28:0;9943:41;;;;;;;;-1:-1:-1;9943:41:0;-1:-1:-1;9943:41:0;;;;;-1:-1:-1;9907:77:0;9904:459;;;10009:5;;10025:16;;-1:-1:-1;;;;;10009:5:0;;;;10001:58;;10025:33;;10054:3;;10025:24;;10046:2;10025:20;:24::i;:::-;:28;;:33::i;:::-;10001:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10074:18;10095:33;10124:3;10095:24;10116:2;10095:16;;:20;;:24;;;;:::i;:33::-;10074:54;;10151:19;10171:7;10151:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10151:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10151:28:0;;;;;;;;;;;;;;;;-1:-1:-1;10151:28:0;;;;;;;;;;-1:-1:-1;;;;;10151:28:0;;10143:58;;;;;-1:-1:-1;10143:58:0;;-1:-1:-1;;10151:28:0;-1:-1:-1;10151:28:0;10143:58;10151:28;10143:58;;;;;;;;;;;;;;;;;;;;;10236:19;10256:7;10236:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10236:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10236:28:0;;;;;;;;;;;;;;;;-1:-1:-1;10236:28:0;;;;;;;;;;;;10221:56;;;;;-1:-1:-1;;;;;10236:28:0;;;;10221:56;;-1:-1:-1;10221:56:0;;;;;;;-1:-1:-1;10221:56:0;9904:459;;;;10318:5;;;10334:16;;10310:41;;-1:-1:-1;;;;;10318:5:0;;;;10310:41;;;;;;;10318:5;10310:41;10334:16;10318:5;10310:41;;;;;;;;;;;;;;;;;;;;;9904:459;10378:32;;10399:10;;10378:32;;;;;-1:-1:-1;10428:4:0;9317:1124;;;:::o;4178:48::-;;;;;;;;;;;;;;;:::o;14831:220::-;15006:37;;;-1:-1:-1;;;15006:37:0;;-1:-1:-1;;;;;15006:37:0;;;;;;;15037:4;15006:37;;;;;;14918:7;;14972:15;;15006;;;;;;:37;;;;;;;;;;;;;;;:15;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15006:37:0;;14831:220;-1:-1:-1;;;;14831:220:0:o;3267:256::-;3028:5;;-1:-1:-1;;;;;3028:5:0;3014:10;:19;3006:72;;;;-1:-1:-1;;;3006:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3363:23:0;::::1;::::0;;::::1;::::0;:58:::1;;-1:-1:-1::0;3416:5:0::1;::::0;-1:-1:-1;;;;;3403:18:0;;::::1;3416:5:::0;::::1;3403:18;;3363:58;3341:92;;;::::0;::::1;;3470:5;::::0;;3449:38:::1;::::0;-1:-1:-1;;;;;3449:38:0;;::::1;::::0;3470:5;::::1;::::0;3449:38:::1;::::0;::::1;3498:5;:17:::0;;-1:-1:-1;;;;;;3498:17:0::1;-1:-1:-1::0;;;;;3498:17:0;;;::::1;::::0;;;::::1;::::0;;3267:256::o;20006:1205::-;20276:13;;20253:18;;20157:4;;20208:15;;20157:4;;20253:37;;:18;:22;:37::i;:::-;20237:53;;20338:5;20325:9;:18;;:56;;;;20347:34;20365:15;20347:17;:34::i;:::-;20325:87;;;-1:-1:-1;20401:10:0;20385:27;;;;:15;:27;;;;;;;;20325:87;20303:174;;;;-1:-1:-1;;;20303:174:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20490:17;20501:5;20490:10;:17::i;:::-;20530:29;20551:7;20530:20;:29::i;:::-;20520:39;;20584:6;20580:193;20600:11;:18;20596:1;:22;20580:193;;;20669:1;-1:-1:-1;;;;;20643:28:0;:11;20655:1;20643:14;;;;;;;;;;;;;;-1:-1:-1;;;;;20643:28:0;;20640:122;;20692:5;-1:-1:-1;;;;;20692:18:0;;20711:10;20723:11;20735:1;20723:14;;;;;;;;;;;;;;20739:6;20692:54;;;;;;;;;;;;;-1:-1:-1;;;;;20692:54:0;;;;;;-1:-1:-1;;;;;20692:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20640:122;20620:3;;20580:193;;;;20786:34;20804:15;20786:17;:34::i;:::-;20783:320;;;20909:18;;-1:-1:-1;;;;;20872:32:0;;;;;;:15;:32;;;;;;:56;;:36;:56::i;:::-;-1:-1:-1;;;;;20837:32:0;;;;;;:15;:32;;;;;:91;20783:320;;;20981:10;20965:27;;;;:15;:27;;;;;;;;20961:117;;21013:49;21034:11;:18;21054:7;21013:20;:49::i;:::-;21162:18;;21120:61;;;;;;;-1:-1:-1;;;;;21120:61:0;;;21133:10;;21120:61;;;;;;;;;-1:-1:-1;21199:4:0;;20006:1205;-1:-1:-1;;;;;;20006:1205:0:o;21973:1339::-;22241:14;;22219:18;;22133:4;;22184:15;;22219:36;22211:100;;;;-1:-1:-1;;;22211:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22324:13;22340:37;22363:13;;22340:11;:18;:22;;:37;;;;:::i;:::-;22324:53;;22425:5;22412:9;:18;;:56;;;;22434:34;22452:15;22434:17;:34::i;:::-;22412:87;;;-1:-1:-1;22488:10:0;22472:27;;;;:15;:27;;;;;;;;22412:87;22390:174;;;;-1:-1:-1;;;22390:174:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22577:17;22588:5;22577:10;:17::i;:::-;22625:29;22646:7;22625:20;:29::i;:::-;22615:39;;22679:6;22675:215;22695:11;:18;22691:1;:22;22675:215;;;22764:1;-1:-1:-1;;;;;22738:28:0;:11;22750:1;22738:14;;;;;;;;;;;;;;-1:-1:-1;;;;;22738:28:0;;;:46;;;;;22783:1;22770:7;22778:1;22770:10;;;;;;;;;;;;;;:14;22738:46;22735:144;;;22805:5;-1:-1:-1;;;;;22805:18:0;;22824:10;22836:11;22848:1;22836:14;;;;;;;;;;;;;;22852:7;22860:1;22852:10;;;;;;;;;;;;;;22805:58;;;;;;;;;;;;;-1:-1:-1;;;;;22805:58:0;;;;;;-1:-1:-1;;;;;22805:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22735:144;22715:3;;22675:215;;5774:239;5842:4;3028:5;;-1:-1:-1;;;;;3028:5:0;3014:10;:19;3006:72;;;;-1:-1:-1;;;3006:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5874:1:::1;5867:4;:8;:36;;;;;5887:16;;5879:4;:24;;5867:36;5859:45;;;::::0;::::1;;5915:16;:23:::0;;;5954:29:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;6001:4:0::1;5774:239:::0;;;:::o;8724:270::-;8796:4;3028:5;;-1:-1:-1;;;;;3028:5:0;3014:10;:19;3006:72;;;;-1:-1:-1;;;3006:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8822:22:0;::::1;;::::0;;;:15:::1;:22;::::0;;;;;::::1;;8821:23;8813:67;;;::::0;;-1:-1:-1;;;8813:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;8891:22:0;::::1;;::::0;;;:15:::1;:22;::::0;;;;;:29;;-1:-1:-1;;8891:29:0::1;8916:4;8891:29;::::0;;8936:27;::::1;::::0;8891:22;8936:27:::1;-1:-1:-1::0;8981:4:0::1;8724:270:::0;;;:::o;934:432::-;992:9;1238:6;1234:47;;-1:-1:-1;1268:1:0;1261:8;;1234:47;-1:-1:-1;1305:5:0;;;1309:1;1305;:5;:1;1328:5;;;;;:10;1321:18;;;2089:147;2147:7;2179:5;;;2202:6;;;;2195:14;;;;2227:1;2089:147;-1:-1:-1;;;2089:147:0:o;7366:1065::-;7508:10;7491:28;;;;:16;:28;;;;;;;;;7475:53;;;;;;;;;;;-1:-1:-1;;7475:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;7436:13;;7475:53;;;;7491:28;7475:53;;7491:28;7475:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7475:53:0;;;:15;:53::i;:::-;:99;;;;7533:11;:41;7545:19;7565:7;7545:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7545:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7545:28:0;;;;;;;;;;;;;;;;-1:-1:-1;7545:28:0;;;;;;;;;;;;;-1:-1:-1;;;;;7545:28:0;7533:41;;;;;;;;-1:-1:-1;7533:41:0;-1:-1:-1;7533:41:0;;;;7532:42;;-1:-1:-1;7475:99:0;7472:196;;;7591:37;;;;;;;;;;;-1:-1:-1;;;7591:37:0;;;;;;;7608:10;-1:-1:-1;7591:28:0;;;:16;:28;;;;;;;:37;;;;;;:::i;:::-;-1:-1:-1;;7643:13:0;;;;;;;;;;;;-1:-1:-1;;;7643:13:0;;;;;;7472:196;7692:28;7708:7;7692:28;;;;;;;;;;;;:15;:28::i;:::-;7691:29;:81;;;;-1:-1:-1;7757:10:0;7740:28;;;;:16;:28;;;;;;;;;7724:48;;;;;;-1:-1:-1;;7724:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7740:28;7724:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:48::i;:::-;7691:179;;;;;7842:19;7862:7;7842:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7842:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7842:28:0;;;;;;;;;;;;;;;;-1:-1:-1;7842:28:0;;;;;;;;;;;;;;-1:-1:-1;;7691:179:0;7688:358;;;7922:10;-1:-1:-1;;;;;7890:42:0;:19;7910:7;7890:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7890:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7890:28:0;;;;;;;;;;;;;;;;-1:-1:-1;7890:28:0;;;;;;;;;;;-1:-1:-1;;;;;7890:28:0;:42;;;;7887:95;;-1:-1:-1;7887:95:0;;-1:-1:-1;7887:95:0;-1:-1:-1;7953:13:0;;;;;;;;;;;;-1:-1:-1;;;7953:13:0;;;;;;7887:95;8013:10;7996:28;;;;:16;:28;;;;;;;;:38;;;;;;;;:::i;:::-;;7688:358;8061:27;8077:7;8061:27;;;;;;;;;;;;:15;:27::i;:::-;:80;;;;-1:-1:-1;8126:10:0;8109:28;;;;:16;:28;;;;;;;;;8093:48;;;;;;-1:-1:-1;;8093:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8109:28;8093:48;;;;;;;;;;;;;;;;;;;;;;;;;8092:49;8061:80;8058:150;;;8185:10;8168:28;;;;:16;:28;;;;;;;;;8158:38;;;;;;-1:-1:-1;;8158:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8168:28;;8158:38;;8168:28;8158:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8058:150;8232:27;8248:7;8232:27;;;;;;;;;;;;:15;:27::i;:::-;:60;;;;8264:19;8284:7;8264:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8264:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8264:28:0;;;;;;;;;;;;;;;;-1:-1:-1;8264:28:0;;;;;;;;;;;;;8263:29;;-1:-1:-1;;8232:60:0;8229:160;;;8309:37;;;;;;;;;;;-1:-1:-1;;;8309:37:0;;;;;;;8326:10;-1:-1:-1;8309:28:0;;;:16;:28;;;;;;;:37;;;;;;:::i;:::-;;8361:16;;;;;;;;;;;;;-1:-1:-1;;;8361:16:0;;;;;8229:160;-1:-1:-1;8416:7:0;7366:1065::o;23398:544::-;23491:31;23507:7;23491:31;;;;;;;;;;;;;-1:-1:-1;;;23491:31:0;;;:15;:31::i;:::-;23490:32;:77;;;;;23526:11;:41;23538:19;23558:7;23538:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23538:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23538:28:0;;;;;;;;;;;;;;;;-1:-1:-1;23538:28:0;;;;;;;;;;;;;-1:-1:-1;;;;;23538:28:0;23526:41;;;;;;;;-1:-1:-1;23526:41:0;-1:-1:-1;23526:41:0;;;;;-1:-1:-1;23490:77:0;23487:448;;;23584:19;23606:32;23636:1;23606:25;23617:13;;23606:6;:10;;:25;;;;:::i;:32::-;23661:5;;;23653:36;;23584:54;;-1:-1:-1;;;;;;23661:5:0;;23653:36;;;;;23584:54;;23653:36;;23661:5;23653:36;23584:54;23661:5;23653:36;;;;;;;;;;;;;;;;;;;;;23712:19;23732:7;23712:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23712:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23712:28:0;;;;;;;;;;;;;;;;-1:-1:-1;23712:28:0;;;;;;;;;;-1:-1:-1;;;;;23712:28:0;;23704:59;;;;;-1:-1:-1;23704:59:0;;-1:-1:-1;;23712:28:0;-1:-1:-1;23712:28:0;23704:59;23712:28;23704:59;;;;;;;;;;;;;;;;;;;;;23798:19;23818:7;23798:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23798:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23798:28:0;;;;;;;;;;;;;;;;-1:-1:-1;23798:28:0;;;;;;;;;;;;23783:57;;;;;-1:-1:-1;;;;;23798:28:0;;;;23783:57;;-1:-1:-1;23783:57:0;;;;;;;-1:-1:-1;23783:57:0;23487:448;;;;23881:5;;23908:13;;-1:-1:-1;;;;;23881:5:0;;;;23873:50;;23897:25;;:6;;:10;:25::i;:::-;23873:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23487:448;23398:544;;:::o;6811:202::-;6882:6;6870:9;:18;6867:139;;;6905:14;6922:21;:9;6936:6;6922:13;:21::i;:::-;6958:36;;6905:38;;-1:-1:-1;6966:10:0;;6958:36;;;;;6905:38;;6958:36;;;;6905:38;6966:10;6958:36;;;;;;;;;;;;;;;;;;;6867:139;6811:202;:::o;1467:295::-;1525:7;1753:1;1749;:5;;;;;;;1467:295;-1:-1:-1;;;1467:295:0:o;17313:262::-;17388:7;;;17439:103;17459:7;:14;17455:1;:18;17439:103;;;17506:24;17519:7;17527:1;17519:10;;;;;;;;;;;;;;17506:8;:12;;:24;;;;:::i;:::-;17495:35;-1:-1:-1;17475:3:0;;17439:103;;;-1:-1:-1;17559:8:0;17313:262;-1:-1:-1;;17313:262:0:o;1889:123::-;1947:7;1979:1;1974;:6;;1967:14;;;;-1:-1:-1;1999:5:0;;;1889:123::o;6027:573::-;6077:27;6121:7;6117:50;;-1:-1:-1;6145:10:0;;;;;;;;;;;;-1:-1:-1;;;6145:10:0;;;;;;6117:50;6186:2;6177:6;6218:69;6225:6;;6218:69;;6248:5;;6273:2;6268:7;;;;6218:69;;;6297:17;6327:3;6317:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6317:14:0;-1:-1:-1;6297:34:0;-1:-1:-1;6351:3:0;6365:198;6372:7;;6365:198;;-1:-1:-1;;6400:3:0;6418:10;6453:2;6448;:7;6458:2;6448:12;6443:2;:17;6432:2;:29;6418:44;;6477:9;6496:4;6489:12;;6477:24;;6526:2;6516:4;6521:1;6516:7;;;;;;;;;;;:12;-1:-1:-1;;;;;6516:12:0;;;;;;;;-1:-1:-1;6549:2:0;6543:8;;;;6365:198;;;;;-1:-1:-1;6587:4:0;6027:573;-1:-1:-1;;;;6027:573:0:o;15401:245::-;15484:4;15501:13;15544:2;15527:20;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15527:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15517:31;;;;;;15501:47;;15559:13;15602:2;15585:20;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15585:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15575:31;;;;;;15559:47;;15633:5;15624;:14;15617:21;;;;15401:245;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://fd28e7d808bef58708fdfb08f39a79c439ccbe4da9fb2fd43961f0035426a75a
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
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.