POL Price: $0.124986 (-1.96%)
 

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Erc20Airdrop812272852026-01-05 0:43:4920 days ago1767573829IN
0xB8615aD7...93C56B4b7
0 POL1.078997642,575.8311735
Erc20Airdrop812034952026-01-04 11:30:4920 days ago1767526249IN
0xB8615aD7...93C56B4b7
7.1 POL0.43633787388.92586926
Erc20Airdrop806285762025-12-22 4:06:0433 days ago1766376364IN
0xB8615aD7...93C56B4b7
0 POL0.0094230729.11951789
Erc20Airdrop804044282025-12-16 21:14:4339 days ago1765919683IN
0xB8615aD7...93C56B4b7
13.4 POL0.0793717640.1486783
Erc20Airdrop803271682025-12-15 0:49:1941 days ago1765759759IN
0xB8615aD7...93C56B4b7
0 POL0.0124501225.00075001
Erc20Airdrop801179432025-12-10 4:29:5745 days ago1765340997IN
0xB8615aD7...93C56B4b7
11.5 POL0.0731723441.32730465
Erc20Airdrop797990952025-12-02 19:20:3153 days ago1764703231IN
0xB8615aD7...93C56B4b7
19.2 POL0.0753591125.11817241
Erc20Airdrop796831952025-11-30 2:57:0756 days ago1764471427IN
0xB8615aD7...93C56B4b7
0 POL0.80121919730.74538115
Airdrop Native C...793231092025-11-21 18:54:0964 days ago1763751249IN
0xB8615aD7...93C56B4b7
23.97 POL0.06570109112.30841404
Airdrop Native C...793228132025-11-21 18:44:1764 days ago1763750657IN
0xB8615aD7...93C56B4b7
18.87 POL0.0532885392.54502737
Airdrop Native C...793227232025-11-21 18:41:1764 days ago1763750477IN
0xB8615aD7...93C56B4b7
0.00459 POL0.1150780692.86173222
Erc20Airdrop792113782025-11-19 4:49:4766 days ago1763527787IN
0xB8615aD7...93C56B4b7
14.6 POL0.1396845464.71382862
Erc20Airdrop788975802025-11-11 22:27:2574 days ago1762900045IN
0xB8615aD7...93C56B4b7
15.1 POL0.1072595247.01808208
Erc20Airdrop785830852025-11-04 15:43:5381 days ago1762271033IN
0xB8615aD7...93C56B4b7
15.6 POL0.69027033289.20616676
Erc20Airdrop783973902025-10-31 8:33:4085 days ago1761899620IN
0xB8615aD7...93C56B4b7
0 POL0.22321953141.87567826
Erc20Airdrop782745102025-10-28 12:17:2988 days ago1761653849IN
0xB8615aD7...93C56B4b7
14.2 POL0.0663756131.129595
Erc20Airdrop765262632025-09-16 16:19:12130 days ago1758039552IN
0xB8615aD7...93C56B4b7
16.2 POL0.1149285749.27802512
Erc20Airdrop764554962025-09-14 22:15:24132 days ago1757888124IN
0xB8615aD7...93C56B4b7
0 POL0.0182901630.00000008
Erc20Airdrop762567192025-09-09 18:49:58137 days ago1757443798IN
0xB8615aD7...93C56B4b7
15.1 POL0.0561464627.27023417
Erc20Airdrop759640642025-09-02 13:52:48144 days ago1756821168IN
0xB8615aD7...93C56B4b7
17.1 POL0.0637446725.00031429
Erc20Airdrop758678072025-08-31 5:02:06146 days ago1756616526IN
0xB8615aD7...93C56B4b7
0 POL0.0188905326.00000013
Erc20Airdrop756787472025-08-26 12:58:09151 days ago1756213089IN
0xB8615aD7...93C56B4b7
14.7 POL0.0545666126.00000043
Erc20Airdrop753998142025-08-19 13:48:44158 days ago1755611324IN
0xB8615aD7...93C56B4b7
14.4 POL0.0546173427.81000191
Erc20Airdrop751215992025-08-12 17:12:33165 days ago1755018753IN
0xB8615aD7...93C56B4b7
18.8 POL0.0648845327.00000098
Erc20Airdrop750508302025-08-10 23:25:20167 days ago1754868320IN
0xB8615aD7...93C56B4b7
0 POL0.0163641626.00000009
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
812034952026-01-04 11:30:4920 days ago1767526249
0xB8615aD7...93C56B4b7
7.1 POL
804044282025-12-16 21:14:4339 days ago1765919683
0xB8615aD7...93C56B4b7
13.4 POL
801179432025-12-10 4:29:5745 days ago1765340997
0xB8615aD7...93C56B4b7
11.5 POL
797990952025-12-02 19:20:3153 days ago1764703231
0xB8615aD7...93C56B4b7
19.2 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
793231092025-11-21 18:54:0964 days ago1763751249
0xB8615aD7...93C56B4b7
0.37 POL
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoMultisender

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-05-18
*/

pragma solidity ^0.8.0;
 

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() {
        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;
    }
}



abstract contract DeprecatedMultisenderSC {
    function isPremiumMember(address _who) external virtual view returns(bool);
}

/**
 * Contract acts as an interface between the Crypto Multisender contract and all ERC20 compliant
 * tokens. 
 * */
abstract contract ERC20Interface {
    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);
    function gasOptimizedAirdrop(address[] calldata _addrs, uint256[] calldata _values) external virtual; 
}

/**
 * Contract acts as an interface between the NFT Crypto Multisender contract and all ERC721 compliant
 * tokens. 
 * */
abstract contract ERC721Interface {
    function transferFrom(address _from, address _to, uint256 _tokenId) public virtual;
    function balanceOf(address who)  public virtual returns (uint256);
    function isApprovedForAll(address _owner, address _operator) public view virtual returns(bool);
    function setApprovalForAll(address _operator, bool approved) public virtual;
    function gasOptimizedAirdrop(address _invoker, address[] calldata _addrs, uint256[] calldata _tokenIds) external virtual;
}


/**
 * Contract acts as an interface between the NFT Crypto Multisender contract and all ERC1155 compliant
 * tokens. 
 * */
abstract contract ERC1155Interface {
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount, bytes memory data) public virtual;
    function balanceOf(address _who, uint256 _id)  public virtual returns (uint256);
    function isApprovedForAll(address _owner, address _operator) public view virtual returns(bool);
    function setApprovalForAll(address _operator, bool approved) public virtual;
    function gasOptimizedAirdrop(address _invoker, address[] calldata _addrs, uint256[] calldata _tokenIds, uint256[] calldata _amounts) external virtual;
}



contract CryptoMultisender is Ownable {
 
    mapping (address => uint256) public tokenTrialDrops;
    mapping (address => uint256) public userTrialDrops;

    mapping (address => uint256) public premiumMembershipDiscount;
    mapping (address => uint256) public membershipExpiryTime;

    mapping (address => bool) public isGrantedPremiumMember;

    mapping (address => bool) public isListedToken;
    mapping (address => uint256) public tokenListingFeeDiscount;

    mapping (address => bool) public isGrantedListedToken;

    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;
    mapping (string => uint256) public commissionPercentage;

    uint256 public oneDayMembershipFee;
    uint256 public sevenDayMembershipFee;
    uint256 public oneMonthMembershipFee;
    uint256 public lifetimeMembershipFee;
    uint256 public tokenListingFee;
    uint256 public rate;
    uint256 public dropUnitPrice;
    address public deprecatedMultisenderAddress;

    event TokenAirdrop(address indexed by, address indexed tokenAddress, uint256 totalTransfers);
    event EthAirdrop(address indexed by, uint256 totalTransfers, uint256 ethValue);
    event NftAirdrop(address indexed by, address indexed nftAddress, uint256 totalTransfers);
    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);
    
    constructor() {
        rate = 3000;
        dropUnitPrice = 333333333333333; 
        oneDayMembershipFee = 9e17;
        sevenDayMembershipFee = 125e16;
        oneMonthMembershipFee = 2e18;
        lifetimeMembershipFee = 25e17;
        tokenListingFee = 5e18;
        deprecatedMultisenderAddress=address(0x8DcCba703e3CA40D3D50435A06637c577D36AAFb);
    }

    /**
     * Allows the owner of this contract to change the fees for users to become premium members.
     * 
     * @param _oneDayFee Fee for single day membership.
     * @param _sevenDayFee Fee for one week membership.
     * @param _oneMonthFee Fee for one month membership.
     * @param _lifetimeFee Fee for lifetime membership.
     * 
     * @return success True if the fee is changed successfully. False otherwise.
     * */
    function setMembershipFees(uint256 _oneDayFee, uint256 _sevenDayFee, uint256 _oneMonthFee, uint256 _lifetimeFee) public onlyOwner returns(bool success) {
        require(_oneDayFee>0 && _oneDayFee<_sevenDayFee && _sevenDayFee<_oneMonthFee && _oneMonthFee<_lifetimeFee);
        oneDayMembershipFee = _oneDayFee;
        sevenDayMembershipFee = _sevenDayFee;
        oneMonthMembershipFee = _oneMonthFee;
        lifetimeMembershipFee = _lifetimeFee;
        return true;
    }

    /**
     * Allows for the conversion of an unsigned integer to a string value. 
     * 
     * @param _i The value of the unsigned integer
     * 
     * @return _uintAsString The string value of the unsigned integer.
     * */
    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 - _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 code The correct affiliate code or void.
    **/
    function processAffiliateCode(string memory _afCode) internal returns(string memory code) {
        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 users to check if a user is a premium member or not. 
     * 
     * @param _addr The address of the user. 
     * 
     * @return isMember True if the user is a premium member, false otherwise.
     * */
    function checkIsPremiumMember(address _addr) public view returns(bool isMember) {
        return membershipExpiryTime[_addr] >= block.timestamp || isGrantedPremiumMember[_addr];
    }

    /**
    * 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 success True if premium membership is granted successfully. False otherwise. 
    **/
    function grantPremiumMembership(address _addr) public onlyOwner returns(bool success) {
        require(checkIsPremiumMember(_addr) != true, "Is already premiumMember member");
        isGrantedPremiumMember[_addr] = true;
        emit NewPremiumMembership(_addr);
        return true; 
    }

    /**
    * Allows the owner of this contract to revoke a granted membership.
    *
    * @param _addr The address of the user whos membership is being revoked.
    *
    * @return success True if membership is revoked successfully. False otherwise. 
    **/
    function revokeGrantedPremiumMembership(address _addr) public onlyOwner returns(bool success) {
        require(isGrantedPremiumMember[_addr], "Not a granted membership");
        isGrantedPremiumMember[_addr] = false;
        return true;
    }

    /**
     * Allows the owner of the contract to grant a premium membership discount for a specified user.
     * 
     * @param _addr The address of the user.
     * @param _discount The discount being granted.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function setPremiumMembershipDiscount(address _addr, uint256 _discount) public onlyOwner returns(bool success) {
        premiumMembershipDiscount[_addr] = _discount;
        return true;
    }

    /**
     * Allows users to check VIP membership fees for a specific address. This is useful for validating if a discount
     * has been granted for the specified user. 
     * 
     * @param _addr The address of the user.
     * @param _fee The default fee. 
     * 
     * @return fee The membership fee for the specified user. 
     * 
     * */
    function getPremiumMembershipFeeOfUser(address _addr, uint256 _fee) public view returns(uint256 fee) {
        if(premiumMembershipDiscount[_addr] > 0) {
            return _fee * premiumMembershipDiscount[_addr] / 100;
        }
        return _fee;
    }



    /**
     * Allows the owner of the contract to set the contract address of the old multisender SC.
     * 
     * @param _addr The updated address.
     * */
    function setDeprecatedMultisenderAddress(address _addr) public onlyOwner {
        deprecatedMultisenderAddress = _addr;
    }


    /**
     * This function checks if a user address has a membership on the old SC.
     * 
     * @param _who The address of the user.
     * 
     * @return True if the user is a member on the old SC, false otherwise.
     * */
    function isMemberOfOldMultisender(address _who) public view returns(bool) {
        DeprecatedMultisenderSC oldMultisender = DeprecatedMultisenderSC(deprecatedMultisenderAddress);
        return oldMultisender.isPremiumMember(_who);
    }


    /**
     * Allows users to transfer their membership from the old SC to this SC. 
     * 
     * @return True if there is a membership to be transferred, false otherwise. 
     * */
    function transferMembership() public returns(bool) {
        require(isMemberOfOldMultisender(msg.sender), "No membership to transfer");
        membershipExpiryTime[msg.sender] = block.timestamp + (36500 * 1 days);
        return true;
    }
    

    /**
     * This function is invoked internally the functions for purchasing memberships.
     * 
     * @param _days The number of days that the membership will be valid for. 
     * @param _fee The fee that is to be paid. 
     * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
     * an affiliate code so the partner gets commission.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function assignMembership(uint256 _days, uint256 _fee, string memory _afCode) internal returns(bool success) {
        require(checkIsPremiumMember(msg.sender) != true, "Is already premiumMember member");
        uint256 fee = getPremiumMembershipFeeOfUser(msg.sender, _fee);
        require(
            msg.value >= fee,
            string(abi.encodePacked(
                "premiumMember fee is: ", uint2str(fee), ". Not enough funds sent. ", uint2str(msg.value)
            ))
        );
        membershipExpiryTime[msg.sender] = block.timestamp + (_days * 1 days);
        _afCode = processAffiliateCode(_afCode);
        giveChange(fee);
        distributeCommission(fee, _afCode);
        emit NewPremiumMembership(msg.sender);
        return true; 
    }

    /**
    * Allows users to become lifetime 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 success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeLifetimeMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(36500, lifetimeMembershipFee, _afCode);
        return true;
    }


    /**
    * Allows users to become members for 1 day.
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeOneDayMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(1, oneDayMembershipFee, _afCode);
        return true;
    }


    /**
    * Allows users to become members for 7 days.
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeOneWeekMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(7, sevenDayMembershipFee, _afCode);
        return true;
    }


    /**
    * Allows users to become members for 1 month
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeOneMonthMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(31, oneMonthMembershipFee, _afCode);
        return true;
    }


    /**
     * Allows users to check whether or not a token is listed.
     * 
     * @param _tokenAddr The address of the token to query.
     * 
     * @return isListed True if the token is listed, false otherwise. 
     * */
    function checkIsListedToken(address _tokenAddr) public view returns(bool isListed) {
        return isListedToken[_tokenAddr] || isGrantedListedToken[_tokenAddr];
    }


    /**
     * Allows the owner of the contract to set a listing discount for a specified token.
     * 
     * @param _tokenAddr The address of the token that will receive the discount. 
     * @param _discount The discount that will be applied. 
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function setTokenListingFeeDiscount(address _tokenAddr, uint256 _discount) public onlyOwner returns(bool success) {
        tokenListingFeeDiscount[_tokenAddr] = _discount;
        return true;
    }

    /**
     * Allows users to query the listing fee for a token. This is useful to verify that a discount has been set. 
     * 
     * @param _tokenAddr The address of the token. 
     * 
     * @return fee The listing fee for the token. 
     * */
    function getListingFeeForToken(address _tokenAddr) public view returns(uint256 fee) {
        if(tokenListingFeeDiscount[_tokenAddr] > 0) {
            return tokenListingFee * tokenListingFeeDiscount[_tokenAddr] / 100;
        }
        return tokenListingFee;
    }

    /**
     * Allows users to list a token of their choosing. 
     * 
     * @param _tokenAddr The address of the token that will be listed. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function purchaseTokenListing(address _tokenAddr, string memory _afCode) public payable returns(bool success) {
        require(!checkIsListedToken(_tokenAddr), "Token is already listed");
        _afCode = processAffiliateCode(_afCode);
        uint256 fee = getListingFeeForToken(_tokenAddr);
        require(msg.value >= fee, "Not enough funds sent for listing");
        isListedToken[_tokenAddr] = true;
        giveChange(fee);
        distributeCommission(fee, _afCode);
        return true;
    }

    /**
     * Allows the owner of the contract to revoke a granted token listing. 
     * 
     * @param _tokenAddr The address of the token that is being delisted. 
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function revokeGrantedTokenListing(address _tokenAddr) public onlyOwner returns(bool success) {
        require(checkIsListedToken(_tokenAddr), "Is not listed token");
        isGrantedListedToken[_tokenAddr] = false;
        return  true;
    }


    /**
     * Allows the owner of the contract to grant a token a free listing. 
     * 
     * @param _tokenAddr The address of the token being listed.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function grantTokenListing(address _tokenAddr) public onlyOwner returns(bool success){
        require(!checkIsListedToken(_tokenAddr), "Token is already listed");
        isGrantedListedToken[_tokenAddr] = true;
        return true;
    }

    /**
     * Allows the owner of the contract to modify the token listing fee. 
     * 
     * @param _newFee The new fee for token listings. 
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function setTokenListingFee(uint256 _newFee) public onlyOwner returns(bool success){
        tokenListingFee = _newFee;
        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 success True if the affiliate has been added successfully. False otherwise. 
    **/
    function addAffiliate(address _addr, string memory _code, uint256 _percentage) public onlyOwner returns(bool success) {
        require(!isAffiliate[_addr], "Address is already an affiliate.");
        require(_addr != address(0), "0x00 address not allowed");
        require(!affiliateCodeExists[_code], "Affiliate code already exists!");
        require(_percentage <= 100 && _percentage > 0, "Percentage must be > 0 && <= 100");
        affiliateCodeExists[_code] = true;
        isAffiliate[_addr] = true;
        affiliateCodeToAddr[_code] = _addr;
        affiliateCodeOfAddr[_addr] = _code;
        commissionPercentage[_code] = _percentage;
        emit NewAffiliatePartnership(_addr,_code);
        return true;
    }


    /**
     * Allows the owner of the contract to set a customised commission percentage for a given affiliate partner.
     * 
     * @param _addressOfAffiliate The wallet address of the affiliate partner.
     * @param _percentage The commission percentage the affiliate will receive.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function changeAffiliatePercentage(address _addressOfAffiliate, uint256 _percentage) public onlyOwner returns(bool success) { 
        require(isAffiliate[_addressOfAffiliate]);
        string storage affCode = affiliateCodeOfAddr[_addressOfAffiliate];
        commissionPercentage[affCode] = _percentage;
        return true;
    }

    /**
    * Allows the owner of this contract to remove an affiliate partner. 
    *
    * @param _addr The address of the affiliate partner.
    *
    * @return success True if affiliate partner is removed successfully. False otherwise. 
    **/
    function removeAffiliate(address _addr) public onlyOwner returns(bool success) {
        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 hasFreeTrial 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 hasFreeTrial) {
        return tokenTrialDrops[_addressOfToken] < 100;
    }


    /**
     * Checks whether or not a user has a free trial. 
     * 
     * @param _addressOfUser The address of the user being queried.
     * 
     * @return hasFreeTrial true if the user address being queried has not used the first 100 free trial drops, false
     * otherwise.
     * */
    function userHasFreeTrial(address _addressOfUser) public view returns(bool hasFreeTrial) {
        return userTrialDrops[_addressOfUser] < 100;
    }
    
    /**
     * Checks how many remaining free trial drops a token has.
     * 
     * @param _addressOfToken the address of the token being queried.
     * 
     * @return remainingTrialDrops the total remaining free trial drops of a token.
     * */
    function getRemainingTokenTrialDrops(address _addressOfToken) public view returns(uint256 remainingTrialDrops) {
        if(tokenHasFreeTrial(_addressOfToken)) {
            uint256 maxTrialDrops =  100;
            return maxTrialDrops - tokenTrialDrops[_addressOfToken];
        } 
        return 0;
    }

    /**
     * Checks how many remaining free trial drops a user has.
     * 
     * @param _addressOfUser the address of the user being queried.
     * 
     * @return remainingTrialDrops the total remaining free trial drops of a user.
     * */
    function getRemainingUserTrialDrops(address _addressOfUser) public view returns(uint256 remainingTrialDrops) {
        if(userHasFreeTrial(_addressOfUser)) {
            uint256 maxTrialDrops =  100;
            return maxTrialDrops - userTrialDrops[_addressOfUser];
        }
        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 success true if function executes successfully, false otherwise.
     * */
    function setRate(uint256 _newRate) public onlyOwner returns(bool success) {
        require(
            _newRate != rate 
            && _newRate > 0
        );
        emit RateChanged(rate, _newRate);
        rate = _newRate;
        uint256 eth = 1 ether;
        dropUnitPrice = eth / 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 allowance The ERC20 token allowance from token owner to this contract. 
     * */
    function getTokenAllowance(address _addr, address _addressOfToken) public view returns(uint256 allowance) {
        ERC20Interface token = ERC20Interface(_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 areEqual True if both strings are the same. False otherwise. 
    **/
    function stringsAreEqual(string memory _a, string memory _b) internal pure returns(bool areEqual) {
        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. 
     * 
     * @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 success true if function executes successfully, false otherwise.
     * */
    function airdropNativeCurrency(address[] memory _recipients, uint256[] memory _values, uint256 _totalToSend, string memory _afCode) public payable returns(bool success) {
        require(_recipients.length == _values.length, "Total number of recipients and values are not equal");
        uint256 totalEthValue = _totalToSend;
        uint256 price = _recipients.length * dropUnitPrice;
        uint256 totalCost = totalEthValue + price;
        bool userHasTrial = userHasFreeTrial(msg.sender);
        bool isVIP = checkIsPremiumMember(msg.sender) == true;
        require(
            msg.value >= totalCost || isVIP || userHasTrial, 
            "Not enough funds sent with transaction!"
        );
        _afCode = processAffiliateCode(_afCode);
        if(!isVIP && !userHasTrial) {
            distributeCommission(price, _afCode);
        }
        if((isVIP || userHasTrial) && msg.value > _totalToSend) {
            payable(msg.sender).transfer((msg.value) - _totalToSend);
        } else {
            giveChange(totalCost);
        }
        for(uint i = 0; i < _recipients.length; i++) {
            payable(_recipients[i]).transfer(_values[i]);
        }
        if(userHasTrial) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        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 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 _optimized Should only be enabled for tokens with gas optimized distribution functions. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */    
    function erc20Airdrop(address _addressOfToken,  address[] memory _recipients, uint256[] memory _values, uint256 _totalToSend, bool _isDeflationary, bool _optimized, string memory _afCode) public payable returns(bool success) {
        string memory afCode = processAffiliateCode(_afCode);
        ERC20Interface token = ERC20Interface(_addressOfToken);
        require(_recipients.length == _values.length, "Total number of recipients and values are not equal");
        uint256 price = _recipients.length * dropUnitPrice;
        bool isPremiumOrListed = checkIsPremiumMember(msg.sender) || checkIsListedToken(_addressOfToken);
        bool eligibleForFreeTrial = tokenHasFreeTrial(_addressOfToken) && userHasFreeTrial(msg.sender);
        require(
            msg.value >= price || tokenHasFreeTrial(_addressOfToken) || userHasFreeTrial(msg.sender) || isPremiumOrListed,
            "Not enough funds sent with transaction!"
        );
        if((eligibleForFreeTrial || isPremiumOrListed) && msg.value > 0) {
            payable(msg.sender).transfer(msg.value);
        } else {
            giveChange(price);
        }

        if(_optimized) {
            token.transferFrom(msg.sender, address(this), _totalToSend);
            token.gasOptimizedAirdrop(_recipients,_values);
        } else {
            if(!_isDeflationary) {
                token.transferFrom(msg.sender, address(this), _totalToSend);
                for(uint i = 0; i < _recipients.length; i++) {
                    token.transfer(_recipients[i], _values[i]);
                }
                if(token.balanceOf(address(this)) > 0) {
                    token.transfer(msg.sender,token.balanceOf(address(this)));
                }
            } else {
                for(uint i=0; i < _recipients.length; i++) {
                    token.transferFrom(msg.sender, _recipients[i], _values[i]);
                }
            }
        }

        if(tokenHasFreeTrial(_addressOfToken)) {
            tokenTrialDrops[_addressOfToken] = tokenTrialDrops[_addressOfToken] + _recipients.length;
        }
        if(userHasFreeTrial(msg.sender)) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        if(!eligibleForFreeTrial && !isPremiumOrListed) {
            distributeCommission(_recipients.length * dropUnitPrice, afCode);
        }
        emit TokenAirdrop(msg.sender, _addressOfToken, _recipients.length);
        return true;
    }


    /**
     * Allows for the distribution of ERC721 tokens to be transferred to multiple recipients at 
     * a time. 
     * 
     * @param _addressOfNFT The contract address of an ERC721 token collection.
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _tokenIds The corresponding IDs of the NFT collection which each address will receive.
     * @param _optimized Should only be enabled for ERC721 token collections with gas optimized distribution functions. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */ 
    function erc721Airdrop(address _addressOfNFT, address[] memory _recipients, uint256[] memory _tokenIds, bool _optimized, string memory _afCode) public payable returns(bool success) {
        require(_recipients.length == _tokenIds.length, "Total number of recipients and total number of NFT IDs are not the same");
        string memory afCode = processAffiliateCode(_afCode);
        ERC721Interface erc721 = ERC721Interface(_addressOfNFT);
        uint256 price = _recipients.length * dropUnitPrice;
        bool isPremiumOrListed = checkIsPremiumMember(msg.sender) || checkIsListedToken(_addressOfNFT);
        bool eligibleForFreeTrial = tokenHasFreeTrial(_addressOfNFT) && userHasFreeTrial(msg.sender);
        require(
            msg.value >= price || eligibleForFreeTrial || isPremiumOrListed,
            "Not enough funds sent with transaction!"
        );
        if((eligibleForFreeTrial || isPremiumOrListed) && msg.value > 0) {
            payable(msg.sender).transfer(msg.value);
        } else {
            giveChange(price);
        }
        if(_optimized){
            erc721.gasOptimizedAirdrop(msg.sender,_recipients,_tokenIds);
        } else {
            for(uint i = 0; i < _recipients.length; i++) {
                erc721.transferFrom(msg.sender, _recipients[i], _tokenIds[i]);
            }
        }
        if(tokenHasFreeTrial(_addressOfNFT)) {
            tokenTrialDrops[_addressOfNFT] = tokenTrialDrops[_addressOfNFT] + _recipients.length;
        }
        if(userHasFreeTrial(msg.sender)) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        if(!eligibleForFreeTrial && !isPremiumOrListed) {
            distributeCommission(_recipients.length * dropUnitPrice, afCode);
        }
        emit NftAirdrop(msg.sender, _addressOfNFT, _recipients.length);
        return true;
    }

    /**
     * Allows for the distribution of ERC1155 tokens to be transferred to multiple recipients at 
     * a time. 
     * 
     * @param _addressOfNFT The contract address of an ERC1155 token contract.
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _ids The corresponding IDs of the token collection which each address will receive.
     * @param _amounts The amount of tokens to send from each token type.
     * @param _optimized Should only be enabled for ERC721 token collections with gas optimized distribution functions. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */ 
    function erc1155Airdrop(address _addressOfNFT, address[] memory _recipients, uint256[] memory _ids, uint256[] memory _amounts, bool _optimized, string memory _afCode) public payable returns(bool success) {
        require(_recipients.length == _ids.length, "Total number of recipients and total number of NFT IDs are not the same");
        require(_recipients.length == _amounts.length, "Total number of recipients and total number of amounts are not the same");
        string memory afCode = processAffiliateCode(_afCode);
        ERC1155Interface erc1155 = ERC1155Interface(_addressOfNFT);
        uint256 price = _recipients.length * dropUnitPrice;
        bool isPremiumOrListed = checkIsPremiumMember(msg.sender) || checkIsListedToken(_addressOfNFT);
        bool eligibleForFreeTrial = tokenHasFreeTrial(_addressOfNFT) && userHasFreeTrial(msg.sender);
        require(
            msg.value >= price || eligibleForFreeTrial || isPremiumOrListed,
            "Not enough funds sent with transaction!"
        );
        if((eligibleForFreeTrial || isPremiumOrListed) && msg.value > 0) {
            payable(msg.sender).transfer(msg.value);
        } else {
            giveChange(price);
        }
        if(_optimized){
            erc1155.gasOptimizedAirdrop(msg.sender,_recipients,_ids,_amounts);
        } else {
            for(uint i = 0; i < _recipients.length; i++) {
                erc1155.safeTransferFrom(msg.sender, _recipients[i], _ids[i], _amounts[i], "");
            }
        }
        if(tokenHasFreeTrial(_addressOfNFT)) {
            tokenTrialDrops[_addressOfNFT] = tokenTrialDrops[_addressOfNFT] + _recipients.length;
        }
        if(userHasFreeTrial(msg.sender)) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        if(!eligibleForFreeTrial && !isPremiumOrListed) {
            distributeCommission(_recipients.length * dropUnitPrice, afCode);
        }
        emit NftAirdrop(msg.sender, _addressOfNFT, _recipients.length);
        return true;
    }


    /**
    * Send the owner and affiliates commissions.
    **/
    function distributeCommission(uint256 _profits, string memory _afCode) internal {
        if(!stringsAreEqual(_afCode,"void") && isAffiliate[affiliateCodeToAddr[_afCode]]) {
            uint256 commission = _profits * commissionPercentage[_afCode] / 100;
            payable(owner).transfer(_profits - commission);
            payable(affiliateCodeToAddr[_afCode]).transfer(commission);
            emit CommissionPaid(affiliateCodeToAddr[_afCode], commission);
        } else {
            payable(owner).transfer(_profits);
        }
    }


    /**
     * Allows the owner of the contract to withdraw any funds that may reside on the contract address.
     * */
    function withdrawFunds() public onlyOwner returns(bool success) {
        payable(owner).transfer(address(this).balance);
        return true;
    }

    /**
     * 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 success true if function executes successfully, false otherwise.
     * */  
    function withdrawERC20Tokens(address _addressOfToken,  address _recipient, uint256 _value) public onlyOwner returns(bool success){
        ERC20Interface token = ERC20Interface(_addressOfToken);
        token.transfer(_recipient, _value);
        emit ERC20TokensWithdrawn(_addressOfToken, _recipient, _value);
        return true;
    }

}

Contract Security Audit

Contract ABI

API
[{"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":"by","type":"address"},{"indexed":true,"internalType":"address","name":"nftAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalTransfers","type":"uint256"}],"name":"NftAirdrop","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":"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"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"addAffiliate","outputs":[{"internalType":"bool","name":"success","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":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"uint256","name":"_totalToSend","type":"uint256"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"airdropNativeCurrency","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeLifetimeMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeOneDayMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeOneMonthMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeOneWeekMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfAffiliate","type":"address"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"changeAffiliatePercentage","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"checkIsListedToken","outputs":[{"internalType":"bool","name":"isListed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"checkIsPremiumMember","outputs":[{"internalType":"bool","name":"isMember","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"commissionPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deprecatedMultisenderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dropUnitPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfNFT","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bool","name":"_optimized","type":"bool"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"erc1155Airdrop","outputs":[{"internalType":"bool","name":"success","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":"uint256","name":"_totalToSend","type":"uint256"},{"internalType":"bool","name":"_isDeflationary","type":"bool"},{"internalType":"bool","name":"_optimized","type":"bool"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"erc20Airdrop","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfNFT","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"bool","name":"_optimized","type":"bool"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"erc721Airdrop","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getListingFeeForToken","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"getPremiumMembershipFeeOfUser","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"getRemainingTokenTrialDrops","outputs":[{"internalType":"uint256","name":"remainingTrialDrops","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfUser","type":"address"}],"name":"getRemainingUserTrialDrops","outputs":[{"internalType":"uint256","name":"remainingTrialDrops","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":"allowance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"grantPremiumMembership","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"grantTokenListing","outputs":[{"internalType":"bool","name":"success","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":"isGrantedListedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGrantedPremiumMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isListedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"isMemberOfOldMultisender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lifetimeMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"membershipExpiryTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneDayMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneMonthMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"premiumMembershipDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"purchaseTokenListing","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","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":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"revokeGrantedPremiumMembership","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"revokeGrantedTokenListing","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setDeprecatedMultisenderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oneDayFee","type":"uint256"},{"internalType":"uint256","name":"_sevenDayFee","type":"uint256"},{"internalType":"uint256","name":"_oneMonthFee","type":"uint256"},{"internalType":"uint256","name":"_lifetimeFee","type":"uint256"}],"name":"setMembershipFees","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_discount","type":"uint256"}],"name":"setPremiumMembershipDiscount","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRate","type":"uint256"}],"name":"setRate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setTokenListingFee","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"uint256","name":"_discount","type":"uint256"}],"name":"setTokenListingFeeDiscount","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sevenDayMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"tokenHasFreeTrial","outputs":[{"internalType":"bool","name":"hasFreeTrial","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenListingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenListingFeeDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenTrialDrops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferMembership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfUser","type":"address"}],"name":"userHasFreeTrial","outputs":[{"internalType":"bool","name":"hasFreeTrial","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTrialDrops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50600080546001600160a01b03199081163317909155610bb860145566012f2a36ecd555601555670c7d713b49da0000600f55671158e460913d0000601055671bc16d674ec800006011556722b1c8c1227a0000601255674563918244f4000060135560168054909116738dccba703e3ca40d3d50435a06637c577d36aafb179055614287806100a16000396000f3fe60806040526004361061039b5760003560e01c80636dd77649116101dc578063ac5b2bbc11610102578063df3b0ad1116100a0578063f2fde38b1161006f578063f2fde38b14610af6578063f519983514610b16578063f86af85114610b43578063fec5c0c614610b5657600080fd5b8063df3b0ad114610a8a578063e24f6a9714610aa0578063e5a8ec5b14610ac0578063ea7ee01014610ad657600080fd5b8063bcdd1e13116100dc578063bcdd1e13146109fa578063be6630c814610a1a578063ceb10f0b14610a4a578063d34937db14610a6a57600080fd5b8063ac5b2bbc146109a4578063b1867685146109c4578063bb12db5c146109e457600080fd5b80638ad95cf11161017a57806398adf5771161014957806398adf57714610939578063a39a2b761461095b578063a7296ee914610971578063a7ced8e21461098457600080fd5b80638ad95cf1146108b95780638da5cb5b146108d95780638faea9a7146108f95780638ffd58ad1461091957600080fd5b806386a9a599116101b657806386a9a5991461082e578063893d20e81461084e578063896bac231461086c5780638a53a1301461088c57600080fd5b80636dd77649146107e657806375f1a95a146107f957806385fc0de71461081957600080fd5b806339cb9ba8116102c15780634a4a2feb1161025f578063590925e21161022e578063590925e214610728578063593d98b114610769578063638c5da9146107895780636cca7d3c146107b957600080fd5b80634a4a2feb146106a55780634a4df559146106d25780634fa85186146106e5578063583a23901461071557600080fd5b80633d2375f91161029b5780633d2375f91461060a578063428b52f81461064557806343a92b41146106725780634930df8f1461069257600080fd5b806339cb9ba8146105c15780633aaff47f146105d45780633b9ff843146105ea57600080fd5b80631e93a9f2116103395780632c4e722e116103085780632c4e722e146105405780632f5f1a341461055657806334fcf4371461058e5780633671caa0146105ae57600080fd5b80631e93a9f2146104d557806323a0fb02146104eb57806324600fc31461050b5780632a769eb41461052057600080fd5b80630e160255116103755780630e1602551461042d57806317077fb71461046557806319acc3671461048557806319d30a40146104b557600080fd5b806306d7d80f146103aa578063088ea102146103d25780630ad92c311461040d57600080fd5b366103a557600080fd5b600080fd5b6103bd6103b83660046136f3565b610b76565b60405190151581526020015b60405180910390f35b3480156103de57600080fd5b506103ff6103ed36600461373f565b60076020526000908152604090205481565b6040519081526020016103c9565b34801561041957600080fd5b506103bd61042836600461373f565b610b8f565b34801561043957600080fd5b506103ff6104483660046136f3565b8051602081830181018051600e8252928201919093012091525481565b34801561047157600080fd5b506103ff61048036600461373f565b610c40565b34801561049157600080fd5b506103bd6104a036600461373f565b60056020526000908152604090205460ff1681565b3480156104c157600080fd5b506103bd6104d036600461373f565b610c9e565b3480156104e157600080fd5b506103ff60135481565b3480156104f757600080fd5b506103bd61050636600461373f565b610cdf565b34801561051757600080fd5b506103bd610cfd565b34801561052c57600080fd5b506103ff61053b36600461375a565b610d6a565b34801561054c57600080fd5b506103ff60145481565b34801561056257600080fd5b50601654610576906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b34801561059a57600080fd5b506103bd6105a9366004613784565b610dc5565b6103bd6105bc3660046138a7565b610e6b565b6103bd6105cf366004613974565b611272565b3480156105e057600080fd5b506103ff60125481565b3480156105f657600080fd5b506103bd61060536600461373f565b6115a2565b34801561061657600080fd5b506103bd6106253660046136f3565b8051602081830181018051600b8252928201919093012091525460ff1681565b34801561065157600080fd5b506103ff61066036600461373f565b60036020526000908152604090205481565b34801561067e57600080fd5b506103bd61068d36600461373f565b611703565b6103bd6106a03660046136f3565b61179e565b3480156106b157600080fd5b506106c56106c036600461373f565b6117ae565b6040516103c99190613a52565b6103bd6106e0366004613a85565b611848565b3480156106f157600080fd5b506103bd61070036600461373f565b60096020526000908152604090205460ff1681565b6103bd610723366004613b51565b611e8a565b34801561073457600080fd5b506105766107433660046136f3565b8051602081830181018051600a825292820191909301209152546001600160a01b031681565b34801561077557600080fd5b506103bd61078436600461373f565b6120b1565b34801561079557600080fd5b506103bd6107a436600461373f565b60066020526000908152604090205460ff1681565b3480156107c557600080fd5b506103ff6107d436600461373f565b60016020526000908152604090205481565b6103bd6107f43660046136f3565b6120cf565b34801561080557600080fd5b506103bd61081436600461375a565b6120df565b34801561082557600080fd5b506103bd612176565b34801561083a57600080fd5b506103bd61084936600461373f565b6121f1565b34801561085a57600080fd5b506000546001600160a01b0316610576565b34801561087857600080fd5b506103bd610887366004613be3565b612269565b34801561089857600080fd5b506103ff6108a736600461373f565b60026020526000908152604090205481565b3480156108c557600080fd5b506103bd6108d4366004613784565b6122da565b3480156108e557600080fd5b50600054610576906001600160a01b031681565b34801561090557600080fd5b506103bd61091436600461373f565b61230e565b34801561092557600080fd5b506103ff61093436600461373f565b61234f565b34801561094557600080fd5b5061095961095436600461373f565b61238d565b005b34801561096757600080fd5b506103ff60155481565b6103bd61097f3660046136f3565b6123d9565b34801561099057600080fd5b506103bd61099f36600461375a565b6123ea565b3480156109b057600080fd5b506103ff6109bf36600461373f565b612436565b3480156109d057600080fd5b506106c56109df36600461373f565b61246c565b3480156109f057600080fd5b506103ff60105481565b348015610a0657600080fd5b506103bd610a15366004613c15565b612485565b348015610a2657600080fd5b506103bd610a3536600461373f565b60086020526000908152604090205460ff1681565b348015610a5657600080fd5b506103bd610a6536600461375a565b61256c565b348015610a7657600080fd5b506103bd610a8536600461373f565b6125b8565b348015610a9657600080fd5b506103ff60115481565b348015610aac57600080fd5b506103bd610abb366004613c51565b612670565b348015610acc57600080fd5b506103ff600f5481565b348015610ae257600080fd5b506103ff610af1366004613ca8565b612947565b348015610b0257600080fd5b50610959610b1136600461373f565b6129c4565b348015610b2257600080fd5b506103ff610b3136600461373f565b60046020526000908152604090205481565b6103bd610b51366004613cdb565b612a78565b348015610b6257600080fd5b506103bd610b7136600461373f565b612b7c565b6000610b86601f60115484612c52565b50600192915050565b600080546001600160a01b03163314610bc35760405162461bcd60e51b8152600401610bba90613d29565b60405180910390fd5b610bcc8261230e565b15610c135760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b506001600160a01b0381166000908152600860205260409020805460ff191660019081179091555b919050565b6001600160a01b03811660009081526007602052604081205415610c96576001600160a01b038216600090815260076020526040902054601354606491610c8691613d87565b610c909190613da6565b92915050565b505060135490565b6001600160a01b03811660009081526004602052604081205442111580610c905750506001600160a01b031660009081526005602052604090205460ff1690565b6001600160a01b031660009081526001602052604090205460641190565b600080546001600160a01b03163314610d285760405162461bcd60e51b8152600401610bba90613d29565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610d62573d6000803e3d6000fd5b506001905090565b6001600160a01b03821660009081526003602052604081205415610dbf576001600160a01b038316600090815260036020526040902054606490610dae9084613d87565b610db89190613da6565b9050610c90565b50919050565b600080546001600160a01b03163314610df05760405162461bcd60e51b8152600401610bba90613d29565b6014548214158015610e025750600082115b610e0b57600080fd5b60145460408051918252602082018490527f4ac9052a820bf4f8c02d7588587cae835573b5b99ea7ad4ca002f17f319f7186910160405180910390a16014829055670de0b6b3a7640000610e5f8382613da6565b60155550600192915050565b60008451865114610e8e5760405162461bcd60e51b8152600401610bba90613dc8565b8351865114610f155760405162461bcd60e51b815260206004820152604760248201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460448201527f6f74616c206e756d626572206f6620616d6f756e747320617265206e6f74207460648201526668652073616d6560c81b608482015260a401610bba565b6000610f2083612d8c565b60155488519192508991600091610f3691613d87565b90506000610f4333610c9e565b80610f525750610f528b61230e565b90506000610f5f8c610cdf565b8015610f6f5750610f6f336120b1565b90508234101580610f7d5750805b80610f855750815b610fa15760405162461bcd60e51b8152600401610bba90613e35565b8080610faa5750815b8015610fb65750600034115b15610fed5760405133903480156108fc02916000818181858888f19350505050158015610fe7573d6000803e3d6000fd5b50610ff6565b610ff6836131f8565b8715611065576040516322e31d0560e11b81526001600160a01b038516906345c63a0a9061102e9033908f908f908f90600401613ef0565b600060405180830381600087803b15801561104857600080fd5b505af115801561105c573d6000803e3d6000fd5b50505050611161565b60005b8b5181101561115f57846001600160a01b031663f242432a338e848151811061109357611093613f45565b60200260200101518e85815181106110ad576110ad613f45565b60200260200101518e86815181106110c7576110c7613f45565b60209081029190910101516040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260a06084820152600060a482015260c401600060405180830381600087803b15801561113457600080fd5b505af1158015611148573d6000803e3d6000fd5b50505050808061115790613f5b565b915050611068565b505b61116a8c610cdf565b156111ae578a516001600160a01b038d166000908152600160205260409020546111949190613f74565b6001600160a01b038d166000908152600160205260409020555b6111b7336120b1565b156111e9578a51336000908152600260205260409020546111d89190613f74565b336000908152600260205260409020555b801580156111f5575081155b15611212576112126015548c5161120c9190613d87565b86613242565b8b6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768d5160405161125891815260200190565b60405180910390a35060019b9a5050505050505050505050565b600083518551146112955760405162461bcd60e51b8152600401610bba90613dc8565b60006112a083612d8c565b601554875191925088916000916112b691613d87565b905060006112c333610c9e565b806112d257506112d28a61230e565b905060006112df8b610cdf565b80156112ef57506112ef336120b1565b905082341015806112fd5750805b806113055750815b6113215760405162461bcd60e51b8152600401610bba90613e35565b808061132a5750815b80156113365750600034115b1561136d5760405133903480156108fc02916000818181858888f19350505050158015611367573d6000803e3d6000fd5b50611376565b611376836131f8565b87156113e3576040516304b1cddf60e31b81526001600160a01b0385169063258e6ef8906113ac9033908e908e90600401613f8c565b600060405180830381600087803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b50505050611498565b60005b8a5181101561149657846001600160a01b03166323b872dd338d848151811061141157611411613f45565b60200260200101518d858151811061142b5761142b613f45565b60200260200101516040518463ffffffff1660e01b815260040161145193929190613fcc565b600060405180830381600087803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b50505050808061148e90613f5b565b9150506113e6565b505b6114a18b610cdf565b156114e55789516001600160a01b038c166000908152600160205260409020546114cb9190613f74565b6001600160a01b038c166000908152600160205260409020555b6114ee336120b1565b156115205789513360009081526002602052604090205461150f9190613f74565b336000908152600260205260409020555b8015801561152c575081155b15611543576115436015548b5161120c9190613d87565b8a6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768c5160405161158991815260200190565b60405180910390a35060019a9950505050505050505050565b600080546001600160a01b031633146115cd5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526009602052604090205460ff166115f257600080fd5b6001600160a01b0382166000908152600960209081526040808320805460ff19169055600c9091528082209051600a9161162b916140bc565b908152604080516020928190038301812080546001600160a01b0319166001600160a01b039586161790559285166000908152600c909252902061166e916140bc565b604051908190038120906001600160a01b038416907f4ddc7b8659a2faf8698c810ab0219aa981bfccb47c036d3cc7ae8a32c15dc4ec90600090a3604080518082018252601e81527f4e6f206c6f6e67657220616e20616666696c6961746520706172746e6572000060208083019182526001600160a01b0386166000908152600c909152929092209051610b8692906135ac565b600080546001600160a01b0316331461172e5760405162461bcd60e51b8152600401610bba90613d29565b6117378261230e565b6117795760405162461bcd60e51b815260206004820152601360248201527224b9903737ba103634b9ba32b2103a37b5b2b760691b6044820152606401610bba565b506001600160a01b03166000908152600860205260409020805460ff19169055600190565b6000610b86600760105484612c52565b600c60205260009081526040902080546117c790613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546117f390613ff0565b80156118405780601f1061181557610100808354040283529160200191611840565b820191906000526020600020905b81548152906001019060200180831161182357829003601f168201915b505050505081565b60008061185483612d8c565b875189519192508a911461187a5760405162461bcd60e51b8152600401610bba906140c8565b60006015548a5161188b9190613d87565b9050600061189833610c9e565b806118a757506118a78c61230e565b905060006118b48d610cdf565b80156118c457506118c4336120b1565b905082341015806118d957506118d98d610cdf565b806118e857506118e8336120b1565b806118f05750815b61190c5760405162461bcd60e51b8152600401610bba90613e35565b80806119155750815b80156119215750600034115b156119585760405133903480156108fc02916000818181858888f19350505050158015611952573d6000803e3d6000fd5b50611961565b611961836131f8565b8715611a2e576040516323b872dd60e01b81526001600160a01b038516906323b872dd9061199790339030908f90600401613fcc565b600060405180830381600087803b1580156119b157600080fd5b505af11580156119c5573d6000803e3d6000fd5b5050604051633ae4b60360e21b81526001600160a01b038716925063eb92d80c91506119f7908f908f9060040161411b565b600060405180830381600087803b158015611a1157600080fd5b505af1158015611a25573d6000803e3d6000fd5b50505050611d7e565b88611cc9576040516323b872dd60e01b81526001600160a01b038516906323b872dd90611a6390339030908f90600401613fcc565b600060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b5050505060005b8c51811015611b6b57846001600160a01b031663a9059cbb8e8381518110611ac257611ac2613f45565b60200260200101518e8481518110611adc57611adc613f45565b60200260200101516040518363ffffffff1660e01b8152600401611b159291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b589190614149565b5080611b6381613f5b565b915050611a98565b506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a08231906024016020604051808303816000875af1158015611bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd99190614166565b1115611cc4576040516370a0823160e01b81523060048201526001600160a01b0385169063a9059cbb90339083906370a08231906024016020604051808303816000875af1158015611c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c539190614166565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc29190614149565b505b611d7e565b60005b8c51811015611d7c57846001600160a01b03166323b872dd338f8481518110611cf757611cf7613f45565b60200260200101518f8581518110611d1157611d11613f45565b60200260200101516040518463ffffffff1660e01b8152600401611d3793929190613fcc565b600060405180830381600087803b158015611d5157600080fd5b505af1158015611d65573d6000803e3d6000fd5b505050508080611d7490613f5b565b915050611ccc565b505b611d878d610cdf565b15611dcb578b516001600160a01b038e16600090815260016020526040902054611db19190613f74565b6001600160a01b038e166000908152600160205260409020555b611dd4336120b1565b15611e06578b5133600090815260026020526040902054611df59190613f74565b336000908152600260205260409020555b80158015611e12575081155b15611e2957611e296015548d5161120c9190613d87565b8c6001600160a01b0316336001600160a01b03167f39015fe519110ce3ccad418b153817407dc5312684839c8700af7436a80a07af8e51604051611e6f91815260200190565b60405180910390a35060019c9b505050505050505050505050565b60008351855114611ead5760405162461bcd60e51b8152600401610bba906140c8565b60155485518491600091611ec19190613d87565b90506000611ecf8284613f74565b90506000611edc336120b1565b90506000611ee933610c9e565b1515600115151490508234101580611efe5750805b80611f065750815b611f225760405162461bcd60e51b8152600401610bba90613e35565b611f2b87612d8c565b965080158015611f39575081155b15611f4857611f488488613242565b8080611f515750815b8015611f5c57508734115b15611f9d57336108fc611f6f8a3461417f565b6040518115909202916000818181858888f19350505050158015611f97573d6000803e3d6000fd5b50611fa6565b611fa6836131f8565b60005b8a51811015612030578a8181518110611fc457611fc4613f45565b60200260200101516001600160a01b03166108fc8b8381518110611fea57611fea613f45565b60200260200101519081150290604051600060405180830381858888f1935050505015801561201d573d6000803e3d6000fd5b508061202881613f5b565b915050611fa9565b508115612064578951336000908152600260205260409020546120539190613f74565b336000908152600260205260409020555b8951604080519182526020820187905233917f96280f1b9a54271a5ff3d2bc027d857d9386da43de7540d42b8b73180a15864a910160405180910390a25060019998505050505050505050565b6001600160a01b031660009081526002602052604090205460641190565b6000610b866001600f5484612c52565b600080546001600160a01b0316331461210a5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03831660009081526009602052604090205460ff1661212f57600080fd5b6001600160a01b0383166000908152600c60205260409081902090518390600e9061215b9084906140bc565b90815260405190819003602001902055506001905092915050565b6000612181336121f1565b6121cd5760405162461bcd60e51b815260206004820152601960248201527f4e6f206d656d6265727368697020746f207472616e73666572000000000000006044820152606401610bba565b6121db4263bbf81e00613f74565b3360009081526004602052604090205550600190565b601654604051633a28175360e21b81526001600160a01b0383811660048301526000921690819063e8a05d4c90602401602060405180830381865afa15801561223e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122629190614149565b9392505050565b600080546001600160a01b031633146122945760405162461bcd60e51b8152600401610bba90613d29565b6000851180156122a357508385105b80156122ae57508284105b80156122b957508183105b6122c257600080fd5b50600f93909355601091909155601155601255600190565b600080546001600160a01b031633146123055760405162461bcd60e51b8152600401610bba90613d29565b50601355600190565b6001600160a01b03811660009081526006602052604081205460ff1680610c905750506001600160a01b031660009081526008602052604090205460ff1690565b600061235a82610cdf565b15612385576001600160a01b038216600090815260016020526040902054606490612262908261417f565b506000919050565b6000546001600160a01b031633146123b75760405162461bcd60e51b8152600401610bba90613d29565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b86618e9460125484612c52565b600080546001600160a01b031633146124155760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260076020526040902055600190565b6000612441826120b1565b15612385576001600160a01b038216600090815260026020526040902054606490612262908261417f565b600d60205260009081526040902080546117c790613ff0565b600080546001600160a01b031633146124b05760405162461bcd60e51b8152600401610bba90613d29565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285919082169063a9059cbb906044016020604051808303816000875af1158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190614149565b507ee763f7778b8ceef7270c89b7d1df1008b0e482da39c43831417733af96fb0d85858560405161255993929190613fcc565b60405180910390a1506001949350505050565b600080546001600160a01b031633146125975760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260036020526040902055600190565b600080546001600160a01b031633146125e35760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526005602052604090205460ff1661264b5760405162461bcd60e51b815260206004820152601860248201527f4e6f742061206772616e746564206d656d6265727368697000000000000000006044820152606401610bba565b506001600160a01b03166000908152600560205260409020805460ff19169055600190565b600080546001600160a01b0316331461269b5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03841660009081526009602052604090205460ff16156127045760405162461bcd60e51b815260206004820181905260248201527f4164647265737320697320616c726561647920616e20616666696c696174652e6044820152606401610bba565b6001600160a01b03841661275a5760405162461bcd60e51b815260206004820152601860248201527f307830302061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610bba565b600b8360405161276a9190614196565b9081526040519081900360200190205460ff16156127ca5760405162461bcd60e51b815260206004820152601e60248201527f416666696c6961746520636f646520616c7265616479206578697374732100006044820152606401610bba565b606482111580156127db5750600082115b6128275760405162461bcd60e51b815260206004820181905260248201527f50657263656e74616765206d757374206265203e2030202626203c3d203130306044820152606401610bba565b6001600b846040516128399190614196565b908152604080519182900360209081018320805494151560ff199586161790556001600160a01b038816600090815260099091522080549092166001179091558490600a90612889908690614196565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039485161790559186166000908152600c82529190912084516128d2928601906135ac565b5081600e846040516128e49190614196565b90815260405190819003602001812091909155612902908490614196565b604051908190038120906001600160a01b038616907ff30f92c3d1eddb3772622c3b7d6a3985a8de818f7eebd5cef6650ee86d5ddbce90600090a35060019392505050565b604051636eb1769f60e11b81526001600160a01b038381166004830152306024830152600091839182169063dd62ed3e90604401602060405180830381865afa158015612998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bc9190614166565b949350505050565b6000546001600160a01b031633146129ee5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03811615801590612a1457506000546001600160a01b03828116911614155b612a1d57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612a838361230e565b15612aca5760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b612ad382612d8c565b91506000612ae084610c40565b905080341015612b3c5760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f7567682066756e64732073656e7420666f72206c697374696e6044820152606760f81b6064820152608401610bba565b6001600160a01b0384166000908152600660205260409020805460ff19166001179055612b68816131f8565b612b728184613242565b5060019392505050565b600080546001600160a01b03163314612ba75760405162461bcd60e51b8152600401610bba90613d29565b612bb082610c9e565b1515600103612c015760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6001600160a01b038216600081815260056020526040808220805460ff19166001179055517fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb0095159190a2506001919050565b6000612c5d33610c9e565b1515600103612cae5760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6000612cba3385610d6a565b905080341015612cc98261341d565b612cd23461341d565b604051602001612ce39291906141b2565b60405160208183030381529060405290612d105760405162461bcd60e51b8152600401610bba9190613a52565b50612d1e8562015180613d87565b612d289042613f74565b33600090815260046020526040902055612d4183612d8c565b9250612d4c816131f8565b612d568184613242565b60405133907fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb00951590600090a2506001949350505050565b336000908152600d602052604090208054606091612e4d91612dad90613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd990613ff0565b8015612e265780601f10612dfb57610100808354040283529160200191612e26565b820191906000526020600020905b815481529060010190602001808311612e0957829003601f168201915b5050505050604051806040016040528060048152602001631d9bda5960e21b815250613549565b80612e95575060096000600a84604051612e679190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff16155b15612ef45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d909152929092209051612ed292906135ac565b50506040805180820190915260048152631d9bda5960e21b6020820152919050565b612f0d8260405180602001604052806000815250613549565b158015612fc75750336000908152600d602052604090208054612fc79190612f3490613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612f6090613ff0565b8015612fad5780601f10612f8257610100808354040283529160200191612fad565b820191906000526020600020905b815481529060010190602001808311612f9057829003601f168201915b505050505060405180602001604052806000815250613549565b8015612ff25750600b82604051612fde9190614196565b9081526040519081900360200190205460ff165b1561307157336001600160a01b0316600a836040516130119190614196565b908152604051908190036020019020546001600160a01b03160361304f5750506040805180820190915260048152631d9bda5960e21b602082015290565b336000908152600d60209081526040909120835161306f928501906135ac565b505b61308a8260405180602001604052806000815250613549565b80156130b25750336000908152600d6020526040902080546130b09190612f3490613ff0565b155b1561315257336000908152600d6020526040902080546130d190613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546130fd90613ff0565b801561314a5780601f1061311f5761010080835404028352916020019161314a565b820191906000526020600020905b81548152906001019060200180831161312d57829003601f168201915b505050505091505b61316b8260405180602001604052806000815250613549565b806131965750600b826040516131819190614196565b9081526040519081900360200190205460ff16155b156131f45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d9091529290922090516131d392906135ac565b50604051806040016040528060048152602001631d9bda5960e21b81525091505b5090565b8034111561323f57600061320c823461417f565b604051909150339082156108fc029083906000818181858888f1935050505015801561323c573d6000803e3d6000fd5b50505b50565b61326881604051806040016040528060048152602001631d9bda5960e21b815250613549565b1580156132b1575060096000600a836040516132849190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff165b156133e45760006064600e836040516132ca9190614196565b908152602001604051809103902054846132e49190613d87565b6132ee9190613da6565b6000549091506001600160a01b03166108fc61330a838661417f565b6040518115909202916000818181858888f19350505050158015613332573d6000803e3d6000fd5b50600a826040516133439190614196565b908152604051908190036020018120546001600160a01b03169082156108fc029083906000818181858888f19350505050158015613385573d6000803e3d6000fd5b50600a826040516133969190614196565b90815260405160209181900382018120548382526001600160a01b0316917f885e6f6235626292940f78c947a331f4c7c1d7f50a48b38092cf546bc9c7907a910160405180910390a2505050565b600080546040516001600160a01b039091169184156108fc02918591818181858888f1935050505015801561323c573d6000803e3d6000fd5b6060816000036134445750506040805180820190915260018152600360fc1b602082015290565b8160005b811561346e578061345881613f5b565b91506134679050600a83613da6565b9150613448565b60008167ffffffffffffffff8111156134895761348961363c565b6040519080825280601f01601f1916602001820160405280156134b3576020820181803683370190505b509050815b8515613540576134c960018261417f565b905060006134d8600a88613da6565b6134e390600a613d87565b6134ed908861417f565b6134f890603061422c565b905060008160f81b90508084848151811061351557613515613f45565b60200101906001600160f81b031916908160001a905350613537600a89613da6565b975050506134b8565b50949350505050565b6000808360405160200161355d9190614196565b6040516020818303038152906040528051906020012090506000836040516020016135889190614196565b60408051601f19818403018152919052805160209091012091909114949350505050565b8280546135b890613ff0565b90600052602060002090601f0160209004810192826135da5760008555613620565b82601f106135f357805160ff1916838001178555613620565b82800160010185558215613620579182015b82811115613620578251825591602001919060010190613605565b506131f49291505b808211156131f45760008155600101613628565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561367b5761367b61363c565b604052919050565b600082601f83011261369457600080fd5b813567ffffffffffffffff8111156136ae576136ae61363c565b6136c1601f8201601f1916602001613652565b8181528460208386010111156136d657600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561370557600080fd5b813567ffffffffffffffff81111561371c57600080fd5b6129bc84828501613683565b80356001600160a01b0381168114610c3b57600080fd5b60006020828403121561375157600080fd5b61226282613728565b6000806040838503121561376d57600080fd5b61377683613728565b946020939093013593505050565b60006020828403121561379657600080fd5b5035919050565b600067ffffffffffffffff8211156137b7576137b761363c565b5060051b60200190565b600082601f8301126137d257600080fd5b813560206137e76137e28361379d565b613652565b82815260059290921b8401810191818101908684111561380657600080fd5b8286015b848110156138285761381b81613728565b835291830191830161380a565b509695505050505050565b600082601f83011261384457600080fd5b813560206138546137e28361379d565b82815260059290921b8401810191818101908684111561387357600080fd5b8286015b848110156138285780358352918301918301613877565b801515811461323f57600080fd5b8035610c3b8161388e565b60008060008060008060c087890312156138c057600080fd5b6138c987613728565b9550602087013567ffffffffffffffff808211156138e657600080fd5b6138f28a838b016137c1565b9650604089013591508082111561390857600080fd5b6139148a838b01613833565b9550606089013591508082111561392a57600080fd5b6139368a838b01613833565b945061394460808a0161389c565b935060a089013591508082111561395a57600080fd5b5061396789828a01613683565b9150509295509295509295565b600080600080600060a0868803121561398c57600080fd5b61399586613728565b9450602086013567ffffffffffffffff808211156139b257600080fd5b6139be89838a016137c1565b955060408801359150808211156139d457600080fd5b6139e089838a01613833565b9450606088013591506139f28261388e565b90925060808701359080821115613a0857600080fd5b50613a1588828901613683565b9150509295509295909350565b60005b83811015613a3d578181015183820152602001613a25565b83811115613a4c576000848401525b50505050565b6020815260008251806020840152613a71816040850160208701613a22565b601f01601f19169190910160400192915050565b600080600080600080600060e0888a031215613aa057600080fd5b613aa988613728565b9650602088013567ffffffffffffffff80821115613ac657600080fd5b613ad28b838c016137c1565b975060408a0135915080821115613ae857600080fd5b613af48b838c01613833565b965060608a0135955060808a01359150613b0d8261388e565b90935060a089013590613b1f8261388e565b90925060c08901359080821115613b3557600080fd5b50613b428a828b01613683565b91505092959891949750929550565b60008060008060808587031215613b6757600080fd5b843567ffffffffffffffff80821115613b7f57600080fd5b613b8b888389016137c1565b95506020870135915080821115613ba157600080fd5b613bad88838901613833565b9450604087013593506060870135915080821115613bca57600080fd5b50613bd787828801613683565b91505092959194509250565b60008060008060808587031215613bf957600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215613c2a57600080fd5b613c3384613728565b9250613c4160208501613728565b9150604084013590509250925092565b600080600060608486031215613c6657600080fd5b613c6f84613728565b9250602084013567ffffffffffffffff811115613c8b57600080fd5b613c9786828701613683565b925050604084013590509250925092565b60008060408385031215613cbb57600080fd5b613cc483613728565b9150613cd260208401613728565b90509250929050565b60008060408385031215613cee57600080fd5b613cf783613728565b9150602083013567ffffffffffffffff811115613d1357600080fd5b613d1f85828601613683565b9150509250929050565b60208082526028908201527f46756e6374696f6e207265737472696374656420746f206f776e6572206f662060408201526718dbdb9d1c9858dd60c21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613da157613da1613d71565b500290565b600082613dc357634e487b7160e01b600052601260045260246000fd5b500490565b60208082526047908201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460408201527f6f74616c206e756d626572206f66204e46542049447320617265206e6f74207460608201526668652073616d6560c81b608082015260a00190565b60208082526027908201527f4e6f7420656e6f7567682066756e64732073656e742077697468207472616e73604082015266616374696f6e2160c81b606082015260800190565b600081518084526020808501945080840160005b83811015613eb55781516001600160a01b031687529582019590820190600101613e90565b509495945050505050565b600081518084526020808501945080840160005b83811015613eb557815187529582019590820190600101613ed4565b6001600160a01b0385168152608060208201819052600090613f1490830186613e7c565b8281036040840152613f268186613ec0565b90508281036060840152613f3a8185613ec0565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201613f6d57613f6d613d71565b5060010190565b60008219821115613f8757613f87613d71565b500190565b6001600160a01b0384168152606060208201819052600090613fb090830185613e7c565b8281036040840152613fc28185613ec0565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600181811c9082168061400457607f821691505b602082108103610dbf57634e487b7160e01b600052602260045260246000fd5b8054600090600181811c908083168061403e57607f831692505b6020808410820361405f57634e487b7160e01b600052602260045260246000fd5b8180156140735760018114614084576140b0565b60ff198616895284890196506140b0565b876000528160002060005b868110156140a85781548b82015290850190830161408f565b505084890196505b50505050505092915050565b60006122628284614024565b60208082526033908201527f546f74616c206e756d626572206f6620726563697069656e747320616e642076604082015272185b1d595cc8185c99481b9bdd08195c5d585b606a1b606082015260800190565b60408152600061412e6040830185613e7c565b82810360208401526141408185613ec0565b95945050505050565b60006020828403121561415b57600080fd5b81516122628161388e565b60006020828403121561417857600080fd5b5051919050565b60008282101561419157614191613d71565b500390565b600082516141a8818460208701613a22565b9190910192915050565b750383932b6b4bab6a6b2b6b132b9103332b29034b99d160551b8152600083516141e3816016850160208801613a22565b7f2e204e6f7420656e6f7567682066756e64732073656e742e2000000000000000601691840191820152835161422081602f840160208801613a22565b01602f01949350505050565b600060ff821660ff84168060ff0382111561424957614249613d71565b01939250505056fea264697066735822122060411a68509cf85fa8948f9f7b1a66adc6c56160a38c8d3ac5a7c95cade1a48164736f6c634300080d0033

Deployed Bytecode

0x60806040526004361061039b5760003560e01c80636dd77649116101dc578063ac5b2bbc11610102578063df3b0ad1116100a0578063f2fde38b1161006f578063f2fde38b14610af6578063f519983514610b16578063f86af85114610b43578063fec5c0c614610b5657600080fd5b8063df3b0ad114610a8a578063e24f6a9714610aa0578063e5a8ec5b14610ac0578063ea7ee01014610ad657600080fd5b8063bcdd1e13116100dc578063bcdd1e13146109fa578063be6630c814610a1a578063ceb10f0b14610a4a578063d34937db14610a6a57600080fd5b8063ac5b2bbc146109a4578063b1867685146109c4578063bb12db5c146109e457600080fd5b80638ad95cf11161017a57806398adf5771161014957806398adf57714610939578063a39a2b761461095b578063a7296ee914610971578063a7ced8e21461098457600080fd5b80638ad95cf1146108b95780638da5cb5b146108d95780638faea9a7146108f95780638ffd58ad1461091957600080fd5b806386a9a599116101b657806386a9a5991461082e578063893d20e81461084e578063896bac231461086c5780638a53a1301461088c57600080fd5b80636dd77649146107e657806375f1a95a146107f957806385fc0de71461081957600080fd5b806339cb9ba8116102c15780634a4a2feb1161025f578063590925e21161022e578063590925e214610728578063593d98b114610769578063638c5da9146107895780636cca7d3c146107b957600080fd5b80634a4a2feb146106a55780634a4df559146106d25780634fa85186146106e5578063583a23901461071557600080fd5b80633d2375f91161029b5780633d2375f91461060a578063428b52f81461064557806343a92b41146106725780634930df8f1461069257600080fd5b806339cb9ba8146105c15780633aaff47f146105d45780633b9ff843146105ea57600080fd5b80631e93a9f2116103395780632c4e722e116103085780632c4e722e146105405780632f5f1a341461055657806334fcf4371461058e5780633671caa0146105ae57600080fd5b80631e93a9f2146104d557806323a0fb02146104eb57806324600fc31461050b5780632a769eb41461052057600080fd5b80630e160255116103755780630e1602551461042d57806317077fb71461046557806319acc3671461048557806319d30a40146104b557600080fd5b806306d7d80f146103aa578063088ea102146103d25780630ad92c311461040d57600080fd5b366103a557600080fd5b600080fd5b6103bd6103b83660046136f3565b610b76565b60405190151581526020015b60405180910390f35b3480156103de57600080fd5b506103ff6103ed36600461373f565b60076020526000908152604090205481565b6040519081526020016103c9565b34801561041957600080fd5b506103bd61042836600461373f565b610b8f565b34801561043957600080fd5b506103ff6104483660046136f3565b8051602081830181018051600e8252928201919093012091525481565b34801561047157600080fd5b506103ff61048036600461373f565b610c40565b34801561049157600080fd5b506103bd6104a036600461373f565b60056020526000908152604090205460ff1681565b3480156104c157600080fd5b506103bd6104d036600461373f565b610c9e565b3480156104e157600080fd5b506103ff60135481565b3480156104f757600080fd5b506103bd61050636600461373f565b610cdf565b34801561051757600080fd5b506103bd610cfd565b34801561052c57600080fd5b506103ff61053b36600461375a565b610d6a565b34801561054c57600080fd5b506103ff60145481565b34801561056257600080fd5b50601654610576906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b34801561059a57600080fd5b506103bd6105a9366004613784565b610dc5565b6103bd6105bc3660046138a7565b610e6b565b6103bd6105cf366004613974565b611272565b3480156105e057600080fd5b506103ff60125481565b3480156105f657600080fd5b506103bd61060536600461373f565b6115a2565b34801561061657600080fd5b506103bd6106253660046136f3565b8051602081830181018051600b8252928201919093012091525460ff1681565b34801561065157600080fd5b506103ff61066036600461373f565b60036020526000908152604090205481565b34801561067e57600080fd5b506103bd61068d36600461373f565b611703565b6103bd6106a03660046136f3565b61179e565b3480156106b157600080fd5b506106c56106c036600461373f565b6117ae565b6040516103c99190613a52565b6103bd6106e0366004613a85565b611848565b3480156106f157600080fd5b506103bd61070036600461373f565b60096020526000908152604090205460ff1681565b6103bd610723366004613b51565b611e8a565b34801561073457600080fd5b506105766107433660046136f3565b8051602081830181018051600a825292820191909301209152546001600160a01b031681565b34801561077557600080fd5b506103bd61078436600461373f565b6120b1565b34801561079557600080fd5b506103bd6107a436600461373f565b60066020526000908152604090205460ff1681565b3480156107c557600080fd5b506103ff6107d436600461373f565b60016020526000908152604090205481565b6103bd6107f43660046136f3565b6120cf565b34801561080557600080fd5b506103bd61081436600461375a565b6120df565b34801561082557600080fd5b506103bd612176565b34801561083a57600080fd5b506103bd61084936600461373f565b6121f1565b34801561085a57600080fd5b506000546001600160a01b0316610576565b34801561087857600080fd5b506103bd610887366004613be3565b612269565b34801561089857600080fd5b506103ff6108a736600461373f565b60026020526000908152604090205481565b3480156108c557600080fd5b506103bd6108d4366004613784565b6122da565b3480156108e557600080fd5b50600054610576906001600160a01b031681565b34801561090557600080fd5b506103bd61091436600461373f565b61230e565b34801561092557600080fd5b506103ff61093436600461373f565b61234f565b34801561094557600080fd5b5061095961095436600461373f565b61238d565b005b34801561096757600080fd5b506103ff60155481565b6103bd61097f3660046136f3565b6123d9565b34801561099057600080fd5b506103bd61099f36600461375a565b6123ea565b3480156109b057600080fd5b506103ff6109bf36600461373f565b612436565b3480156109d057600080fd5b506106c56109df36600461373f565b61246c565b3480156109f057600080fd5b506103ff60105481565b348015610a0657600080fd5b506103bd610a15366004613c15565b612485565b348015610a2657600080fd5b506103bd610a3536600461373f565b60086020526000908152604090205460ff1681565b348015610a5657600080fd5b506103bd610a6536600461375a565b61256c565b348015610a7657600080fd5b506103bd610a8536600461373f565b6125b8565b348015610a9657600080fd5b506103ff60115481565b348015610aac57600080fd5b506103bd610abb366004613c51565b612670565b348015610acc57600080fd5b506103ff600f5481565b348015610ae257600080fd5b506103ff610af1366004613ca8565b612947565b348015610b0257600080fd5b50610959610b1136600461373f565b6129c4565b348015610b2257600080fd5b506103ff610b3136600461373f565b60046020526000908152604090205481565b6103bd610b51366004613cdb565b612a78565b348015610b6257600080fd5b506103bd610b7136600461373f565b612b7c565b6000610b86601f60115484612c52565b50600192915050565b600080546001600160a01b03163314610bc35760405162461bcd60e51b8152600401610bba90613d29565b60405180910390fd5b610bcc8261230e565b15610c135760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b506001600160a01b0381166000908152600860205260409020805460ff191660019081179091555b919050565b6001600160a01b03811660009081526007602052604081205415610c96576001600160a01b038216600090815260076020526040902054601354606491610c8691613d87565b610c909190613da6565b92915050565b505060135490565b6001600160a01b03811660009081526004602052604081205442111580610c905750506001600160a01b031660009081526005602052604090205460ff1690565b6001600160a01b031660009081526001602052604090205460641190565b600080546001600160a01b03163314610d285760405162461bcd60e51b8152600401610bba90613d29565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610d62573d6000803e3d6000fd5b506001905090565b6001600160a01b03821660009081526003602052604081205415610dbf576001600160a01b038316600090815260036020526040902054606490610dae9084613d87565b610db89190613da6565b9050610c90565b50919050565b600080546001600160a01b03163314610df05760405162461bcd60e51b8152600401610bba90613d29565b6014548214158015610e025750600082115b610e0b57600080fd5b60145460408051918252602082018490527f4ac9052a820bf4f8c02d7588587cae835573b5b99ea7ad4ca002f17f319f7186910160405180910390a16014829055670de0b6b3a7640000610e5f8382613da6565b60155550600192915050565b60008451865114610e8e5760405162461bcd60e51b8152600401610bba90613dc8565b8351865114610f155760405162461bcd60e51b815260206004820152604760248201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460448201527f6f74616c206e756d626572206f6620616d6f756e747320617265206e6f74207460648201526668652073616d6560c81b608482015260a401610bba565b6000610f2083612d8c565b60155488519192508991600091610f3691613d87565b90506000610f4333610c9e565b80610f525750610f528b61230e565b90506000610f5f8c610cdf565b8015610f6f5750610f6f336120b1565b90508234101580610f7d5750805b80610f855750815b610fa15760405162461bcd60e51b8152600401610bba90613e35565b8080610faa5750815b8015610fb65750600034115b15610fed5760405133903480156108fc02916000818181858888f19350505050158015610fe7573d6000803e3d6000fd5b50610ff6565b610ff6836131f8565b8715611065576040516322e31d0560e11b81526001600160a01b038516906345c63a0a9061102e9033908f908f908f90600401613ef0565b600060405180830381600087803b15801561104857600080fd5b505af115801561105c573d6000803e3d6000fd5b50505050611161565b60005b8b5181101561115f57846001600160a01b031663f242432a338e848151811061109357611093613f45565b60200260200101518e85815181106110ad576110ad613f45565b60200260200101518e86815181106110c7576110c7613f45565b60209081029190910101516040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260a06084820152600060a482015260c401600060405180830381600087803b15801561113457600080fd5b505af1158015611148573d6000803e3d6000fd5b50505050808061115790613f5b565b915050611068565b505b61116a8c610cdf565b156111ae578a516001600160a01b038d166000908152600160205260409020546111949190613f74565b6001600160a01b038d166000908152600160205260409020555b6111b7336120b1565b156111e9578a51336000908152600260205260409020546111d89190613f74565b336000908152600260205260409020555b801580156111f5575081155b15611212576112126015548c5161120c9190613d87565b86613242565b8b6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768d5160405161125891815260200190565b60405180910390a35060019b9a5050505050505050505050565b600083518551146112955760405162461bcd60e51b8152600401610bba90613dc8565b60006112a083612d8c565b601554875191925088916000916112b691613d87565b905060006112c333610c9e565b806112d257506112d28a61230e565b905060006112df8b610cdf565b80156112ef57506112ef336120b1565b905082341015806112fd5750805b806113055750815b6113215760405162461bcd60e51b8152600401610bba90613e35565b808061132a5750815b80156113365750600034115b1561136d5760405133903480156108fc02916000818181858888f19350505050158015611367573d6000803e3d6000fd5b50611376565b611376836131f8565b87156113e3576040516304b1cddf60e31b81526001600160a01b0385169063258e6ef8906113ac9033908e908e90600401613f8c565b600060405180830381600087803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b50505050611498565b60005b8a5181101561149657846001600160a01b03166323b872dd338d848151811061141157611411613f45565b60200260200101518d858151811061142b5761142b613f45565b60200260200101516040518463ffffffff1660e01b815260040161145193929190613fcc565b600060405180830381600087803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b50505050808061148e90613f5b565b9150506113e6565b505b6114a18b610cdf565b156114e55789516001600160a01b038c166000908152600160205260409020546114cb9190613f74565b6001600160a01b038c166000908152600160205260409020555b6114ee336120b1565b156115205789513360009081526002602052604090205461150f9190613f74565b336000908152600260205260409020555b8015801561152c575081155b15611543576115436015548b5161120c9190613d87565b8a6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768c5160405161158991815260200190565b60405180910390a35060019a9950505050505050505050565b600080546001600160a01b031633146115cd5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526009602052604090205460ff166115f257600080fd5b6001600160a01b0382166000908152600960209081526040808320805460ff19169055600c9091528082209051600a9161162b916140bc565b908152604080516020928190038301812080546001600160a01b0319166001600160a01b039586161790559285166000908152600c909252902061166e916140bc565b604051908190038120906001600160a01b038416907f4ddc7b8659a2faf8698c810ab0219aa981bfccb47c036d3cc7ae8a32c15dc4ec90600090a3604080518082018252601e81527f4e6f206c6f6e67657220616e20616666696c6961746520706172746e6572000060208083019182526001600160a01b0386166000908152600c909152929092209051610b8692906135ac565b600080546001600160a01b0316331461172e5760405162461bcd60e51b8152600401610bba90613d29565b6117378261230e565b6117795760405162461bcd60e51b815260206004820152601360248201527224b9903737ba103634b9ba32b2103a37b5b2b760691b6044820152606401610bba565b506001600160a01b03166000908152600860205260409020805460ff19169055600190565b6000610b86600760105484612c52565b600c60205260009081526040902080546117c790613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546117f390613ff0565b80156118405780601f1061181557610100808354040283529160200191611840565b820191906000526020600020905b81548152906001019060200180831161182357829003601f168201915b505050505081565b60008061185483612d8c565b875189519192508a911461187a5760405162461bcd60e51b8152600401610bba906140c8565b60006015548a5161188b9190613d87565b9050600061189833610c9e565b806118a757506118a78c61230e565b905060006118b48d610cdf565b80156118c457506118c4336120b1565b905082341015806118d957506118d98d610cdf565b806118e857506118e8336120b1565b806118f05750815b61190c5760405162461bcd60e51b8152600401610bba90613e35565b80806119155750815b80156119215750600034115b156119585760405133903480156108fc02916000818181858888f19350505050158015611952573d6000803e3d6000fd5b50611961565b611961836131f8565b8715611a2e576040516323b872dd60e01b81526001600160a01b038516906323b872dd9061199790339030908f90600401613fcc565b600060405180830381600087803b1580156119b157600080fd5b505af11580156119c5573d6000803e3d6000fd5b5050604051633ae4b60360e21b81526001600160a01b038716925063eb92d80c91506119f7908f908f9060040161411b565b600060405180830381600087803b158015611a1157600080fd5b505af1158015611a25573d6000803e3d6000fd5b50505050611d7e565b88611cc9576040516323b872dd60e01b81526001600160a01b038516906323b872dd90611a6390339030908f90600401613fcc565b600060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b5050505060005b8c51811015611b6b57846001600160a01b031663a9059cbb8e8381518110611ac257611ac2613f45565b60200260200101518e8481518110611adc57611adc613f45565b60200260200101516040518363ffffffff1660e01b8152600401611b159291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b589190614149565b5080611b6381613f5b565b915050611a98565b506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a08231906024016020604051808303816000875af1158015611bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd99190614166565b1115611cc4576040516370a0823160e01b81523060048201526001600160a01b0385169063a9059cbb90339083906370a08231906024016020604051808303816000875af1158015611c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c539190614166565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc29190614149565b505b611d7e565b60005b8c51811015611d7c57846001600160a01b03166323b872dd338f8481518110611cf757611cf7613f45565b60200260200101518f8581518110611d1157611d11613f45565b60200260200101516040518463ffffffff1660e01b8152600401611d3793929190613fcc565b600060405180830381600087803b158015611d5157600080fd5b505af1158015611d65573d6000803e3d6000fd5b505050508080611d7490613f5b565b915050611ccc565b505b611d878d610cdf565b15611dcb578b516001600160a01b038e16600090815260016020526040902054611db19190613f74565b6001600160a01b038e166000908152600160205260409020555b611dd4336120b1565b15611e06578b5133600090815260026020526040902054611df59190613f74565b336000908152600260205260409020555b80158015611e12575081155b15611e2957611e296015548d5161120c9190613d87565b8c6001600160a01b0316336001600160a01b03167f39015fe519110ce3ccad418b153817407dc5312684839c8700af7436a80a07af8e51604051611e6f91815260200190565b60405180910390a35060019c9b505050505050505050505050565b60008351855114611ead5760405162461bcd60e51b8152600401610bba906140c8565b60155485518491600091611ec19190613d87565b90506000611ecf8284613f74565b90506000611edc336120b1565b90506000611ee933610c9e565b1515600115151490508234101580611efe5750805b80611f065750815b611f225760405162461bcd60e51b8152600401610bba90613e35565b611f2b87612d8c565b965080158015611f39575081155b15611f4857611f488488613242565b8080611f515750815b8015611f5c57508734115b15611f9d57336108fc611f6f8a3461417f565b6040518115909202916000818181858888f19350505050158015611f97573d6000803e3d6000fd5b50611fa6565b611fa6836131f8565b60005b8a51811015612030578a8181518110611fc457611fc4613f45565b60200260200101516001600160a01b03166108fc8b8381518110611fea57611fea613f45565b60200260200101519081150290604051600060405180830381858888f1935050505015801561201d573d6000803e3d6000fd5b508061202881613f5b565b915050611fa9565b508115612064578951336000908152600260205260409020546120539190613f74565b336000908152600260205260409020555b8951604080519182526020820187905233917f96280f1b9a54271a5ff3d2bc027d857d9386da43de7540d42b8b73180a15864a910160405180910390a25060019998505050505050505050565b6001600160a01b031660009081526002602052604090205460641190565b6000610b866001600f5484612c52565b600080546001600160a01b0316331461210a5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03831660009081526009602052604090205460ff1661212f57600080fd5b6001600160a01b0383166000908152600c60205260409081902090518390600e9061215b9084906140bc565b90815260405190819003602001902055506001905092915050565b6000612181336121f1565b6121cd5760405162461bcd60e51b815260206004820152601960248201527f4e6f206d656d6265727368697020746f207472616e73666572000000000000006044820152606401610bba565b6121db4263bbf81e00613f74565b3360009081526004602052604090205550600190565b601654604051633a28175360e21b81526001600160a01b0383811660048301526000921690819063e8a05d4c90602401602060405180830381865afa15801561223e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122629190614149565b9392505050565b600080546001600160a01b031633146122945760405162461bcd60e51b8152600401610bba90613d29565b6000851180156122a357508385105b80156122ae57508284105b80156122b957508183105b6122c257600080fd5b50600f93909355601091909155601155601255600190565b600080546001600160a01b031633146123055760405162461bcd60e51b8152600401610bba90613d29565b50601355600190565b6001600160a01b03811660009081526006602052604081205460ff1680610c905750506001600160a01b031660009081526008602052604090205460ff1690565b600061235a82610cdf565b15612385576001600160a01b038216600090815260016020526040902054606490612262908261417f565b506000919050565b6000546001600160a01b031633146123b75760405162461bcd60e51b8152600401610bba90613d29565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b86618e9460125484612c52565b600080546001600160a01b031633146124155760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260076020526040902055600190565b6000612441826120b1565b15612385576001600160a01b038216600090815260026020526040902054606490612262908261417f565b600d60205260009081526040902080546117c790613ff0565b600080546001600160a01b031633146124b05760405162461bcd60e51b8152600401610bba90613d29565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285919082169063a9059cbb906044016020604051808303816000875af1158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190614149565b507ee763f7778b8ceef7270c89b7d1df1008b0e482da39c43831417733af96fb0d85858560405161255993929190613fcc565b60405180910390a1506001949350505050565b600080546001600160a01b031633146125975760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260036020526040902055600190565b600080546001600160a01b031633146125e35760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526005602052604090205460ff1661264b5760405162461bcd60e51b815260206004820152601860248201527f4e6f742061206772616e746564206d656d6265727368697000000000000000006044820152606401610bba565b506001600160a01b03166000908152600560205260409020805460ff19169055600190565b600080546001600160a01b0316331461269b5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03841660009081526009602052604090205460ff16156127045760405162461bcd60e51b815260206004820181905260248201527f4164647265737320697320616c726561647920616e20616666696c696174652e6044820152606401610bba565b6001600160a01b03841661275a5760405162461bcd60e51b815260206004820152601860248201527f307830302061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610bba565b600b8360405161276a9190614196565b9081526040519081900360200190205460ff16156127ca5760405162461bcd60e51b815260206004820152601e60248201527f416666696c6961746520636f646520616c7265616479206578697374732100006044820152606401610bba565b606482111580156127db5750600082115b6128275760405162461bcd60e51b815260206004820181905260248201527f50657263656e74616765206d757374206265203e2030202626203c3d203130306044820152606401610bba565b6001600b846040516128399190614196565b908152604080519182900360209081018320805494151560ff199586161790556001600160a01b038816600090815260099091522080549092166001179091558490600a90612889908690614196565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039485161790559186166000908152600c82529190912084516128d2928601906135ac565b5081600e846040516128e49190614196565b90815260405190819003602001812091909155612902908490614196565b604051908190038120906001600160a01b038616907ff30f92c3d1eddb3772622c3b7d6a3985a8de818f7eebd5cef6650ee86d5ddbce90600090a35060019392505050565b604051636eb1769f60e11b81526001600160a01b038381166004830152306024830152600091839182169063dd62ed3e90604401602060405180830381865afa158015612998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bc9190614166565b949350505050565b6000546001600160a01b031633146129ee5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03811615801590612a1457506000546001600160a01b03828116911614155b612a1d57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612a838361230e565b15612aca5760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b612ad382612d8c565b91506000612ae084610c40565b905080341015612b3c5760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f7567682066756e64732073656e7420666f72206c697374696e6044820152606760f81b6064820152608401610bba565b6001600160a01b0384166000908152600660205260409020805460ff19166001179055612b68816131f8565b612b728184613242565b5060019392505050565b600080546001600160a01b03163314612ba75760405162461bcd60e51b8152600401610bba90613d29565b612bb082610c9e565b1515600103612c015760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6001600160a01b038216600081815260056020526040808220805460ff19166001179055517fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb0095159190a2506001919050565b6000612c5d33610c9e565b1515600103612cae5760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6000612cba3385610d6a565b905080341015612cc98261341d565b612cd23461341d565b604051602001612ce39291906141b2565b60405160208183030381529060405290612d105760405162461bcd60e51b8152600401610bba9190613a52565b50612d1e8562015180613d87565b612d289042613f74565b33600090815260046020526040902055612d4183612d8c565b9250612d4c816131f8565b612d568184613242565b60405133907fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb00951590600090a2506001949350505050565b336000908152600d602052604090208054606091612e4d91612dad90613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd990613ff0565b8015612e265780601f10612dfb57610100808354040283529160200191612e26565b820191906000526020600020905b815481529060010190602001808311612e0957829003601f168201915b5050505050604051806040016040528060048152602001631d9bda5960e21b815250613549565b80612e95575060096000600a84604051612e679190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff16155b15612ef45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d909152929092209051612ed292906135ac565b50506040805180820190915260048152631d9bda5960e21b6020820152919050565b612f0d8260405180602001604052806000815250613549565b158015612fc75750336000908152600d602052604090208054612fc79190612f3490613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612f6090613ff0565b8015612fad5780601f10612f8257610100808354040283529160200191612fad565b820191906000526020600020905b815481529060010190602001808311612f9057829003601f168201915b505050505060405180602001604052806000815250613549565b8015612ff25750600b82604051612fde9190614196565b9081526040519081900360200190205460ff165b1561307157336001600160a01b0316600a836040516130119190614196565b908152604051908190036020019020546001600160a01b03160361304f5750506040805180820190915260048152631d9bda5960e21b602082015290565b336000908152600d60209081526040909120835161306f928501906135ac565b505b61308a8260405180602001604052806000815250613549565b80156130b25750336000908152600d6020526040902080546130b09190612f3490613ff0565b155b1561315257336000908152600d6020526040902080546130d190613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546130fd90613ff0565b801561314a5780601f1061311f5761010080835404028352916020019161314a565b820191906000526020600020905b81548152906001019060200180831161312d57829003601f168201915b505050505091505b61316b8260405180602001604052806000815250613549565b806131965750600b826040516131819190614196565b9081526040519081900360200190205460ff16155b156131f45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d9091529290922090516131d392906135ac565b50604051806040016040528060048152602001631d9bda5960e21b81525091505b5090565b8034111561323f57600061320c823461417f565b604051909150339082156108fc029083906000818181858888f1935050505015801561323c573d6000803e3d6000fd5b50505b50565b61326881604051806040016040528060048152602001631d9bda5960e21b815250613549565b1580156132b1575060096000600a836040516132849190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff165b156133e45760006064600e836040516132ca9190614196565b908152602001604051809103902054846132e49190613d87565b6132ee9190613da6565b6000549091506001600160a01b03166108fc61330a838661417f565b6040518115909202916000818181858888f19350505050158015613332573d6000803e3d6000fd5b50600a826040516133439190614196565b908152604051908190036020018120546001600160a01b03169082156108fc029083906000818181858888f19350505050158015613385573d6000803e3d6000fd5b50600a826040516133969190614196565b90815260405160209181900382018120548382526001600160a01b0316917f885e6f6235626292940f78c947a331f4c7c1d7f50a48b38092cf546bc9c7907a910160405180910390a2505050565b600080546040516001600160a01b039091169184156108fc02918591818181858888f1935050505015801561323c573d6000803e3d6000fd5b6060816000036134445750506040805180820190915260018152600360fc1b602082015290565b8160005b811561346e578061345881613f5b565b91506134679050600a83613da6565b9150613448565b60008167ffffffffffffffff8111156134895761348961363c565b6040519080825280601f01601f1916602001820160405280156134b3576020820181803683370190505b509050815b8515613540576134c960018261417f565b905060006134d8600a88613da6565b6134e390600a613d87565b6134ed908861417f565b6134f890603061422c565b905060008160f81b90508084848151811061351557613515613f45565b60200101906001600160f81b031916908160001a905350613537600a89613da6565b975050506134b8565b50949350505050565b6000808360405160200161355d9190614196565b6040516020818303038152906040528051906020012090506000836040516020016135889190614196565b60408051601f19818403018152919052805160209091012091909114949350505050565b8280546135b890613ff0565b90600052602060002090601f0160209004810192826135da5760008555613620565b82601f106135f357805160ff1916838001178555613620565b82800160010185558215613620579182015b82811115613620578251825591602001919060010190613605565b506131f49291505b808211156131f45760008155600101613628565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561367b5761367b61363c565b604052919050565b600082601f83011261369457600080fd5b813567ffffffffffffffff8111156136ae576136ae61363c565b6136c1601f8201601f1916602001613652565b8181528460208386010111156136d657600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561370557600080fd5b813567ffffffffffffffff81111561371c57600080fd5b6129bc84828501613683565b80356001600160a01b0381168114610c3b57600080fd5b60006020828403121561375157600080fd5b61226282613728565b6000806040838503121561376d57600080fd5b61377683613728565b946020939093013593505050565b60006020828403121561379657600080fd5b5035919050565b600067ffffffffffffffff8211156137b7576137b761363c565b5060051b60200190565b600082601f8301126137d257600080fd5b813560206137e76137e28361379d565b613652565b82815260059290921b8401810191818101908684111561380657600080fd5b8286015b848110156138285761381b81613728565b835291830191830161380a565b509695505050505050565b600082601f83011261384457600080fd5b813560206138546137e28361379d565b82815260059290921b8401810191818101908684111561387357600080fd5b8286015b848110156138285780358352918301918301613877565b801515811461323f57600080fd5b8035610c3b8161388e565b60008060008060008060c087890312156138c057600080fd5b6138c987613728565b9550602087013567ffffffffffffffff808211156138e657600080fd5b6138f28a838b016137c1565b9650604089013591508082111561390857600080fd5b6139148a838b01613833565b9550606089013591508082111561392a57600080fd5b6139368a838b01613833565b945061394460808a0161389c565b935060a089013591508082111561395a57600080fd5b5061396789828a01613683565b9150509295509295509295565b600080600080600060a0868803121561398c57600080fd5b61399586613728565b9450602086013567ffffffffffffffff808211156139b257600080fd5b6139be89838a016137c1565b955060408801359150808211156139d457600080fd5b6139e089838a01613833565b9450606088013591506139f28261388e565b90925060808701359080821115613a0857600080fd5b50613a1588828901613683565b9150509295509295909350565b60005b83811015613a3d578181015183820152602001613a25565b83811115613a4c576000848401525b50505050565b6020815260008251806020840152613a71816040850160208701613a22565b601f01601f19169190910160400192915050565b600080600080600080600060e0888a031215613aa057600080fd5b613aa988613728565b9650602088013567ffffffffffffffff80821115613ac657600080fd5b613ad28b838c016137c1565b975060408a0135915080821115613ae857600080fd5b613af48b838c01613833565b965060608a0135955060808a01359150613b0d8261388e565b90935060a089013590613b1f8261388e565b90925060c08901359080821115613b3557600080fd5b50613b428a828b01613683565b91505092959891949750929550565b60008060008060808587031215613b6757600080fd5b843567ffffffffffffffff80821115613b7f57600080fd5b613b8b888389016137c1565b95506020870135915080821115613ba157600080fd5b613bad88838901613833565b9450604087013593506060870135915080821115613bca57600080fd5b50613bd787828801613683565b91505092959194509250565b60008060008060808587031215613bf957600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215613c2a57600080fd5b613c3384613728565b9250613c4160208501613728565b9150604084013590509250925092565b600080600060608486031215613c6657600080fd5b613c6f84613728565b9250602084013567ffffffffffffffff811115613c8b57600080fd5b613c9786828701613683565b925050604084013590509250925092565b60008060408385031215613cbb57600080fd5b613cc483613728565b9150613cd260208401613728565b90509250929050565b60008060408385031215613cee57600080fd5b613cf783613728565b9150602083013567ffffffffffffffff811115613d1357600080fd5b613d1f85828601613683565b9150509250929050565b60208082526028908201527f46756e6374696f6e207265737472696374656420746f206f776e6572206f662060408201526718dbdb9d1c9858dd60c21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613da157613da1613d71565b500290565b600082613dc357634e487b7160e01b600052601260045260246000fd5b500490565b60208082526047908201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460408201527f6f74616c206e756d626572206f66204e46542049447320617265206e6f74207460608201526668652073616d6560c81b608082015260a00190565b60208082526027908201527f4e6f7420656e6f7567682066756e64732073656e742077697468207472616e73604082015266616374696f6e2160c81b606082015260800190565b600081518084526020808501945080840160005b83811015613eb55781516001600160a01b031687529582019590820190600101613e90565b509495945050505050565b600081518084526020808501945080840160005b83811015613eb557815187529582019590820190600101613ed4565b6001600160a01b0385168152608060208201819052600090613f1490830186613e7c565b8281036040840152613f268186613ec0565b90508281036060840152613f3a8185613ec0565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201613f6d57613f6d613d71565b5060010190565b60008219821115613f8757613f87613d71565b500190565b6001600160a01b0384168152606060208201819052600090613fb090830185613e7c565b8281036040840152613fc28185613ec0565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600181811c9082168061400457607f821691505b602082108103610dbf57634e487b7160e01b600052602260045260246000fd5b8054600090600181811c908083168061403e57607f831692505b6020808410820361405f57634e487b7160e01b600052602260045260246000fd5b8180156140735760018114614084576140b0565b60ff198616895284890196506140b0565b876000528160002060005b868110156140a85781548b82015290850190830161408f565b505084890196505b50505050505092915050565b60006122628284614024565b60208082526033908201527f546f74616c206e756d626572206f6620726563697069656e747320616e642076604082015272185b1d595cc8185c99481b9bdd08195c5d585b606a1b606082015260800190565b60408152600061412e6040830185613e7c565b82810360208401526141408185613ec0565b95945050505050565b60006020828403121561415b57600080fd5b81516122628161388e565b60006020828403121561417857600080fd5b5051919050565b60008282101561419157614191613d71565b500390565b600082516141a8818460208701613a22565b9190910192915050565b750383932b6b4bab6a6b2b6b132b9103332b29034b99d160551b8152600083516141e3816016850160208801613a22565b7f2e204e6f7420656e6f7567682066756e64732073656e742e2000000000000000601691840191820152835161422081602f840160208801613a22565b01602f01949350505050565b600060ff821660ff84168060ff0382111561424957614249613d71565b01939250505056fea264697066735822122060411a68509cf85fa8948f9f7b1a66adc6c56160a38c8d3ac5a7c95cade1a48164736f6c634300080d0033

Deployed Bytecode Sourcemap

3411:37217:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;27326:8;;;3411:37217;27264:8;;;16446:183;;;;;;:::i;:::-;;:::i;:::-;;;1454:14:1;;1447:22;1429:41;;1417:2;1402:18;16446:183:0;;;;;;;;3826:59;;;;;;;;;;-1:-1:-1;3826:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1996:25:1;;;1984:2;1969:18;3826:59:0;1850:177:1;19857:243:0;;;;;;;;;;-1:-1:-1;19857:243:0;;;;;:::i;:::-;;:::i;4245:55::-;;;;;;;;;;-1:-1:-1;4245:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;17876:272;;;;;;;;;;-1:-1:-1;17876:272:0;;;;;:::i;:::-;;:::i;3709:55::-;;;;;;;;;;-1:-1:-1;3709:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9585:185;;;;;;;;;;-1:-1:-1;9585:185:0;;;;;:::i;:::-;;:::i;4479:30::-;;;;;;;;;;;;;;;;23463:155;;;;;;;;;;-1:-1:-1;23463:155:0;;;;;:::i;:::-;;:::i;39509:151::-;;;;;;;;;;;;;:::i;11786:261::-;;;;;;;;;;-1:-1:-1;11786:261:0;;;;;:::i;:::-;;:::i;4516:19::-;;;;;;;;;;;;;;;;4577:43;;;;;;;;;;-1:-1:-1;4577:43:0;;;;-1:-1:-1;;;;;4577:43:0;;;;;;-1:-1:-1;;;;;2455:32:1;;;2437:51;;2425:2;2410:18;4577:43:0;2291:203:1;25581:332:0;;;;;;;;;;-1:-1:-1;25581:332:0;;;;;:::i;:::-;;:::i;36666:2081::-;;;;;;:::i;:::-;;:::i;33922:1906::-;;;;;;:::i;:::-;;:::i;4436:36::-;;;;;;;;;;;;;;;;22559:405;;;;;;;;;;-1:-1:-1;22559:405:0;;;;;:::i;:::-;;:::i;4068:51::-;;;;;;;;;;-1:-1:-1;4068:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3576:61;;;;;;;;;;-1:-1:-1;3576:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;19339:249;;;;;;;;;;-1:-1:-1;19339:249:0;;;;;:::i;:::-;;:::i;15931:181::-;;;;;;:::i;:::-;;:::i;4126:54::-;;;;;;;;;;-1:-1:-1;4126:54:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30639:2515::-;;;;;;:::i;:::-;;:::i;3956:44::-;;;;;;;;;;-1:-1:-1;3956:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28351:1424;;;;;;:::i;:::-;;:::i;4007:54::-;;;;;;;;;;-1:-1:-1;4007:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4007:54:0;;;23929:151;;;;;;;;;;-1:-1:-1;23929:151:0;;;;;:::i;:::-;;:::i;3773:46::-;;;;;;;;;;-1:-1:-1;3773:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;3459:51;;;;;;;;;;-1:-1:-1;3459:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;15419:178;;;;;;:::i;:::-;;:::i;21958:337::-;;;;;;;;;;-1:-1:-1;21958:337:0;;;;;:::i;:::-;;:::i;13045:246::-;;;;;;;;;;;;;:::i;12603:241::-;;;;;;;;;;-1:-1:-1;12603:241:0;;;;;:::i;:::-;;:::i;335:80::-;;;;;;;;;;-1:-1:-1;375:7:0;402:5;-1:-1:-1;;;;;402:5:0;335:80;;6248:483;;;;;;;;;;-1:-1:-1;6248:483:0;;;;;:::i;:::-;;:::i;3517:50::-;;;;;;;;;;-1:-1:-1;3517:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;20358:149;;;;;;;;;;-1:-1:-1;20358:149:0;;;;;:::i;:::-;;:::i;60:20::-;;;;;;;;;;-1:-1:-1;60:20:0;;;;-1:-1:-1;;;;;60:20:0;;;16874:170;;;;;;;;;;-1:-1:-1;16874:170:0;;;;;:::i;:::-;;:::i;24350:313::-;;;;;;;;;;-1:-1:-1;24350:313:0;;;;;:::i;:::-;;:::i;12226:128::-;;;;;;;;;;-1:-1:-1;12226:128:0;;;;;:::i;:::-;;:::i;:::-;;4542:28;;;;;;;;;;;;;;;;14900:186;;;;;;:::i;:::-;;:::i;17408:202::-;;;;;;;;;;-1:-1:-1;17408:202:0;;;;;:::i;:::-;;:::i;24925:306::-;;;;;;;;;;-1:-1:-1;24925:306:0;;;;;:::i;:::-;;:::i;4187:51::-;;;;;;;;;;-1:-1:-1;4187:51:0;;;;;:::i;:::-;;:::i;4350:36::-;;;;;;;;;;;;;;;;40281:342;;;;;;;;;;-1:-1:-1;40281:342:0;;;;;:::i;:::-;;:::i;3894:53::-;;;;;;;;;;-1:-1:-1;3894:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;11219:196;;;;;;;;;;-1:-1:-1;11219:196:0;;;;;:::i;:::-;;:::i;10642:249::-;;;;;;;;;;-1:-1:-1;10642:249:0;;;;;:::i;:::-;;:::i;4393:36::-;;;;;;;;;;;;;;;;20816:738;;;;;;;;;;-1:-1:-1;20816:738:0;;;;;:::i;:::-;;:::i;4309:34::-;;;;;;;;;;;;;;;;26979:234;;;;;;;;;;-1:-1:-1;26979:234:0;;;;;:::i;:::-;;:::i;1033:256::-;;;;;;;;;;-1:-1:-1;1033:256:0;;;;;:::i;:::-;;:::i;3644:56::-;;;;;;;;;;-1:-1:-1;3644:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;18546:513;;;;;;:::i;:::-;;:::i;10069:297::-;;;;;;;;;;-1:-1:-1;10069:297:0;;;;;:::i;:::-;;:::i;16446:183::-;16522:12;16547:52;16564:2;16568:21;;16591:7;16547:16;:52::i;:::-;-1:-1:-1;16617:4:0;;16446:183;-1:-1:-1;;16446:183:0:o;19857:243::-;19929:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;;;;;;;;;19962:30:::1;19981:10;19962:18;:30::i;:::-;19961:31;19953:67;;;::::0;-1:-1:-1;;;19953:67:0;;11843:2:1;19953:67:0::1;::::0;::::1;11825:21:1::0;11882:2;11862:18;;;11855:30;-1:-1:-1;;;11901:18:1;;;11894:53;11964:18;;19953:67:0::1;11641:347:1::0;19953:67:0::1;-1:-1:-1::0;;;;;;20031:32:0;::::1;;::::0;;;:20:::1;:32;::::0;;;;:39;;-1:-1:-1;;20031:39:0::1;20066:4;20031:39:::0;;::::1;::::0;;;855:1:::1;19857:243:::0;;;:::o;17876:272::-;-1:-1:-1;;;;;17974:35:0;;17947:11;17974:35;;;:23;:35;;;;;;:39;17971:137;;-1:-1:-1;;;;;18055:35:0;;;;;;:23;:35;;;;;;18037:15;;18093:3;;18037:53;;;:::i;:::-;:59;;;;:::i;:::-;18030:66;17876:272;-1:-1:-1;;17876:272:0:o;17971:137::-;-1:-1:-1;;18125:15:0;;;17876:272::o;9585:185::-;-1:-1:-1;;;;;9683:27:0;;9650:13;9683:27;;;:20;:27;;;;;;9714:15;-1:-1:-1;9683:46:0;;:79;;-1:-1:-1;;;;;;;9733:29:0;;;;;:22;:29;;;;;;;;;9585:185::o;23463:155::-;-1:-1:-1;;;;;23572:32:0;23535:17;23572:32;;;:15;:32;;;;;;23607:3;-1:-1:-1;23572:38:0;23463:155::o;39509:151::-;39559:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;39592:5:::1;::::0;;39584:46:::1;::::0;-1:-1:-1;;;;;39592:5:0;;::::1;::::0;39608:21:::1;39584:46:::0;::::1;;;::::0;39608:21;;39584:46;39592:5;39584:46;39608:21;39592:5;39584:46;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;39648:4;39641:11;;39509:151:::0;:::o;11786:261::-;-1:-1:-1;;;;;11901:32:0;;11874:11;11901:32;;;:25;:32;;;;;;:36;11898:120;;-1:-1:-1;;;;;11968:32:0;;;;;;:25;:32;;;;;;12003:3;;11961:39;;:4;:39;:::i;:::-;:45;;;;:::i;:::-;11954:52;;;;11898:120;-1:-1:-1;12035:4:0;11786:261;-1:-1:-1;11786:261:0:o;25581:332::-;25641:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;25700:4:::1;;25688:8;:16;;:46;;;;;25733:1;25722:8;:12;25688:46;25666:79;;;::::0;::::1;;25773:4;::::0;25761:27:::1;::::0;;12694:25:1;;;12750:2;12735:18;;12728:34;;;25761:27:0::1;::::0;12667:18:1;25761:27:0::1;;;;;;;25799:4;:15:::0;;;25839:7:::1;25873:10;25806:8:::0;25839:7;25873:10:::1;:::i;:::-;25857:13;:26:::0;-1:-1:-1;25901:4:0::1;::::0;25581:332;-1:-1:-1;;25581:332:0:o;36666:2081::-;36856:12;36911:4;:11;36889;:18;:33;36881:117;;;;-1:-1:-1;;;36881:117:0;;;;;;;:::i;:::-;37039:8;:15;37017:11;:18;:37;37009:121;;;;-1:-1:-1;;;37009:121:0;;13455:2:1;37009:121:0;;;13437:21:1;13494:2;13474:18;;;13467:30;13533:34;13513:18;;;13506:62;13604:34;13584:18;;;13577:62;-1:-1:-1;;;13655:19:1;;;13648:38;13703:19;;37009:121:0;13253:475:1;37009:121:0;37141:20;37164:29;37185:7;37164:20;:29::i;:::-;37310:13;;37289:18;;37141:52;;-1:-1:-1;37248:13:0;;37204:24;;37289:34;;;:::i;:::-;37273:50;;37334:22;37359:32;37380:10;37359:20;:32::i;:::-;:69;;;;37395:33;37414:13;37395:18;:33::i;:::-;37334:94;;37439:25;37467:32;37485:13;37467:17;:32::i;:::-;:64;;;;;37503:28;37520:10;37503:16;:28::i;:::-;37439:92;;37577:5;37564:9;:18;;:42;;;;37586:20;37564:42;:63;;;;37610:17;37564:63;37542:152;;;;-1:-1:-1;;;37542:152:0;;;;;;;:::i;:::-;37709:20;:41;;;;37733:17;37709:41;37708:60;;;;;37767:1;37755:9;:13;37708:60;37705:181;;;37785:39;;37793:10;;37814:9;37785:39;;;;;;;;;37814:9;37793:10;37785:39;;;;;;;;;;;;;;;;;;;;;37705:181;;;37857:17;37868:5;37857:10;:17::i;:::-;37899:10;37896:296;;;37925:65;;-1:-1:-1;;;37925:65:0;;-1:-1:-1;;;;;37925:27:0;;;;;:65;;37953:10;;37964:11;;37976:4;;37981:8;;37925:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37896:296;;;38027:6;38023:158;38043:11;:18;38039:1;:22;38023:158;;;38087:7;-1:-1:-1;;;;;38087:24:0;;38112:10;38124:11;38136:1;38124:14;;;;;;;;:::i;:::-;;;;;;;38140:4;38145:1;38140:7;;;;;;;;:::i;:::-;;;;;;;38149:8;38158:1;38149:11;;;;;;;;:::i;:::-;;;;;;;;;;;38087:78;;-1:-1:-1;;;;;;38087:78:0;;;;;;;-1:-1:-1;;;;;16303:15:1;;;38087:78:0;;;16285:34:1;16355:15;;;;16335:18;;;16328:43;16387:18;;;16380:34;16430:18;;;16423:34;16265:3;16473:19;;;16466:32;-1:-1:-1;16514:19:1;;;16507:30;16554:19;;38087:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38063:3;;;;;:::i;:::-;;;;38023:158;;;;37896:296;38205:32;38223:13;38205:17;:32::i;:::-;38202:148;;;38320:18;;-1:-1:-1;;;;;38287:30:0;;;;;;:15;:30;;;;;;:51;;38320:18;38287:51;:::i;:::-;-1:-1:-1;;;;;38254:30:0;;;;;;:15;:30;;;;;:84;38202:148;38363:28;38380:10;38363:16;:28::i;:::-;38360:136;;;38466:18;;38452:10;38437:26;;;;:14;:26;;;;;;:47;;38466:18;38437:47;:::i;:::-;38423:10;38408:26;;;;:14;:26;;;;;:76;38360:136;38510:20;38509:21;:43;;;;;38535:17;38534:18;38509:43;38506:139;;;38569:64;38611:13;;38590:11;:18;:34;;;;:::i;:::-;38626:6;38569:20;:64::i;:::-;38683:13;-1:-1:-1;;;;;38660:57:0;38671:10;-1:-1:-1;;;;;38660:57:0;;38698:11;:18;38660:57;;;;1996:25:1;;1984:2;1969:18;;1850:177;38660:57:0;;;;;;;;-1:-1:-1;38735:4:0;;36666:2081;-1:-1:-1;;;;;;;;;;;36666:2081:0:o;33922:1906::-;34089:12;34144:9;:16;34122:11;:18;:38;34114:122;;;;-1:-1:-1;;;34114:122:0;;;;;;;:::i;:::-;34247:20;34270:29;34291:7;34270:20;:29::i;:::-;34413:13;;34392:18;;34247:52;;-1:-1:-1;34351:13:0;;34310:22;;34392:34;;;:::i;:::-;34376:50;;34437:22;34462:32;34483:10;34462:20;:32::i;:::-;:69;;;;34498:33;34517:13;34498:18;:33::i;:::-;34437:94;;34542:25;34570:32;34588:13;34570:17;:32::i;:::-;:64;;;;;34606:28;34623:10;34606:16;:28::i;:::-;34542:92;;34680:5;34667:9;:18;;:42;;;;34689:20;34667:42;:63;;;;34713:17;34667:63;34645:152;;;;-1:-1:-1;;;34645:152:0;;;;;;;:::i;:::-;34812:20;:41;;;;34836:17;34812:41;34811:60;;;;;34870:1;34858:9;:13;34811:60;34808:181;;;34888:39;;34896:10;;34917:9;34888:39;;;;;;;;;34917:9;34896:10;34888:39;;;;;;;;;;;;;;;;;;;;;34808:181;;;34960:17;34971:5;34960:10;:17::i;:::-;35002:10;34999:274;;;35028:60;;-1:-1:-1;;;35028:60:0;;-1:-1:-1;;;;;35028:26:0;;;;;:60;;35055:10;;35066:11;;35078:9;;35028:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34999:274;;;35125:6;35121:141;35141:11;:18;35137:1;:22;35121:141;;;35185:6;-1:-1:-1;;;;;35185:19:0;;35205:10;35217:11;35229:1;35217:14;;;;;;;;:::i;:::-;;;;;;;35233:9;35243:1;35233:12;;;;;;;;:::i;:::-;;;;;;;35185:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35161:3;;;;;:::i;:::-;;;;35121:141;;;;34999:274;35286:32;35304:13;35286:17;:32::i;:::-;35283:148;;;35401:18;;-1:-1:-1;;;;;35368:30:0;;;;;;:15;:30;;;;;;:51;;35401:18;35368:51;:::i;:::-;-1:-1:-1;;;;;35335:30:0;;;;;;:15;:30;;;;;:84;35283:148;35444:28;35461:10;35444:16;:28::i;:::-;35441:136;;;35547:18;;35533:10;35518:26;;;;:14;:26;;;;;;:47;;35547:18;35518:47;:::i;:::-;35504:10;35489:26;;;;:14;:26;;;;;:76;35441:136;35591:20;35590:21;:43;;;;;35616:17;35615:18;35590:43;35587:139;;;35650:64;35692:13;;35671:11;:18;:34;;;;:::i;35650:64::-;35764:13;-1:-1:-1;;;;;35741:57:0;35752:10;-1:-1:-1;;;;;35741:57:0;;35779:11;:18;35741:57;;;;1996:25:1;;1984:2;1969:18;;1850:177;35741:57:0;;;;;;;;-1:-1:-1;35816:4:0;;33922:1906;-1:-1:-1;;;;;;;;;;33922:1906:0:o;22559:405::-;22624:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22657:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;22649:27;;;::::0;::::1;;-1:-1:-1::0;;;;;22687:18:0;::::1;22708:5;22687:18:::0;;;:11:::1;:18;::::0;;;;;;;:26;;-1:-1:-1;;22687:26:0::1;::::0;;22744:19:::1;:26:::0;;;;;;22724:47;;:19:::1;::::0;:47:::1;::::0;::::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:60;;-1:-1:-1;;;;;;22724:60:0::1;-1:-1:-1::0;;;;;22724:60:0;;::::1;;::::0;;22835:26;;::::1;-1:-1:-1::0;22835:26:0;;;:19:::1;:26:::0;;;;;22800:62:::1;::::0;::::1;:::i;:::-;;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;22800:62:0;::::1;::::0;::::1;::::0;;;::::1;22873:61;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;;;;;22873:26:0;::::1;-1:-1:-1::0;22873:26:0;;;:19:::1;:26:::0;;;;;;;:61;;::::1;::::0;;::::1;:::i;19339:249::-:0;19419:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;19452:30:::1;19471:10;19452:18;:30::i;:::-;19444:62;;;::::0;-1:-1:-1;;;19444:62:0;;19580:2:1;19444:62:0::1;::::0;::::1;19562:21:1::0;19619:2;19599:18;;;19592:30;-1:-1:-1;;;19638:18:1;;;19631:49;19697:18;;19444:62:0::1;19378:343:1::0;19444:62:0::1;-1:-1:-1::0;;;;;;19517:32:0::1;19552:5;19517:32:::0;;;:20:::1;:32;::::0;;;;:40;;-1:-1:-1;;19517:40:0::1;::::0;;-1:-1:-1;;19339:249:0:o;15931:181::-;16006:12;16031:51;16048:1;16051:21;;16074:7;16031:16;:51::i;4126:54::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30639:2515::-;30850:12;30875:20;30898:29;30919:7;30898:20;:29::i;:::-;31033:14;;31011:18;;30875:52;;-1:-1:-1;30976:15:0;;31011:36;31003:100;;;;-1:-1:-1;;;31003:100:0;;;;;;;:::i;:::-;31114:13;31151;;31130:11;:18;:34;;;;:::i;:::-;31114:50;;31175:22;31200:32;31221:10;31200:20;:32::i;:::-;:71;;;;31236:35;31255:15;31236:18;:35::i;:::-;31175:96;;31282:25;31310:34;31328:15;31310:17;:34::i;:::-;:66;;;;;31348:28;31365:10;31348:16;:28::i;:::-;31282:94;;31422:5;31409:9;:18;;:56;;;;31431:34;31449:15;31431:17;:34::i;:::-;31409:88;;;;31469:28;31486:10;31469:16;:28::i;:::-;31409:109;;;;31501:17;31409:109;31387:198;;;;-1:-1:-1;;;31387:198:0;;;;;;;:::i;:::-;31600:20;:41;;;;31624:17;31600:41;31599:60;;;;;31658:1;31646:9;:13;31599:60;31596:181;;;31676:39;;31684:10;;31705:9;31676:39;;;;;;;;;31705:9;31684:10;31676:39;;;;;;;;;;;;;;;;;;;;;31596:181;;;31748:17;31759:5;31748:10;:17::i;:::-;31792:10;31789:798;;;31819:59;;-1:-1:-1;;;31819:59:0;;-1:-1:-1;;;;;31819:18:0;;;;;:59;;31838:10;;31858:4;;31865:12;;31819:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31893:46:0;;-1:-1:-1;;;31893:46:0;;-1:-1:-1;;;;;31893:25:0;;;-1:-1:-1;31893:25:0;;-1:-1:-1;31893:46:0;;31919:11;;31931:7;;31893:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31789:798;;;31976:15;31972:604;;32012:59;;-1:-1:-1;;;32012:59:0;;-1:-1:-1;;;;;32012:18:0;;;;;:59;;32031:10;;32051:4;;32058:12;;32012:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32094:6;32090:130;32110:11;:18;32106:1;:22;32090:130;;;32158:5;-1:-1:-1;;;;;32158:14:0;;32173:11;32185:1;32173:14;;;;;;;;:::i;:::-;;;;;;;32189:7;32197:1;32189:10;;;;;;;;:::i;:::-;;;;;;;32158:42;;;;;;;;;;;;;;;-1:-1:-1;;;;;20808:32:1;;;;20790:51;;20872:2;20857:18;;20850:34;20778:2;20763:18;;20616:274;32158:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32130:3:0;;;;:::i;:::-;;;;32090:130;;;-1:-1:-1;32241:30:0;;-1:-1:-1;;;32241:30:0;;32265:4;32241:30;;;2437:51:1;32274:1:0;;-1:-1:-1;;;;;32241:15:0;;;;;2410:18:1;;32241:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;32238:139;;;32326:30;;-1:-1:-1;;;32326:30:0;;32350:4;32326:30;;;2437:51:1;-1:-1:-1;;;;;32300:14:0;;;;;32315:10;;32300:14;;32326:15;;2410:18:1;;32326:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32300:57;;-1:-1:-1;;;;;;32300:57:0;;;;;;;-1:-1:-1;;;;;20808:32:1;;;32300:57:0;;;20790:51:1;20857:18;;;20850:34;20763:18;;32300:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32238:139;31972:604;;;32421:6;32417:144;32435:11;:18;32431:1;:22;32417:144;;;32483:5;-1:-1:-1;;;;;32483:18:0;;32502:10;32514:11;32526:1;32514:14;;;;;;;;:::i;:::-;;;;;;;32530:7;32538:1;32530:10;;;;;;;;:::i;:::-;;;;;;;32483:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32455:3;;;;;:::i;:::-;;;;32417:144;;;;31972:604;32602:34;32620:15;32602:17;:34::i;:::-;32599:154;;;32723:18;;-1:-1:-1;;;;;32688:32:0;;;;;;:15;:32;;;;;;:53;;32723:18;32688:53;:::i;:::-;-1:-1:-1;;;;;32653:32:0;;;;;;:15;:32;;;;;:88;32599:154;32766:28;32783:10;32766:16;:28::i;:::-;32763:136;;;32869:18;;32855:10;32840:26;;;;:14;:26;;;;;;:47;;32869:18;32840:47;:::i;:::-;32826:10;32811:26;;;;:14;:26;;;;;:76;32763:136;32913:20;32912:21;:43;;;;;32938:17;32937:18;32912:43;32909:139;;;32972:64;33014:13;;32993:11;:18;:34;;;;:::i;32972:64::-;33088:15;-1:-1:-1;;;;;33063:61:0;33076:10;-1:-1:-1;;;;;33063:61:0;;33105:11;:18;33063:61;;;;1996:25:1;;1984:2;1969:18;;1850:177;33063:61:0;;;;;;;;-1:-1:-1;33142:4:0;;30639:2515;-1:-1:-1;;;;;;;;;;;;30639:2515:0:o;28351:1424::-;28506:12;28561:7;:14;28539:11;:18;:36;28531:100;;;;-1:-1:-1;;;28531:100:0;;;;;;;:::i;:::-;28726:13;;28705:18;;28666:12;;28642:21;;28705:34;;28726:13;28705:34;:::i;:::-;28689:50;-1:-1:-1;28750:17:0;28770:21;28689:50;28770:13;:21;:::i;:::-;28750:41;;28802:17;28822:28;28839:10;28822:16;:28::i;:::-;28802:48;;28861:10;28874:32;28895:10;28874:20;:32::i;:::-;:40;;28910:4;28874:40;;;28861:53;;28960:9;28947;:22;;:31;;;;28973:5;28947:31;:47;;;;28982:12;28947:47;28925:137;;;;-1:-1:-1;;;28925:137:0;;;;;;;:::i;:::-;29083:29;29104:7;29083:20;:29::i;:::-;29073:39;;29127:5;29126:6;:23;;;;;29137:12;29136:13;29126:23;29123:91;;;29166:36;29187:5;29194:7;29166:20;:36::i;:::-;29228:5;:21;;;;29237:12;29228:21;29227:51;;;;;29266:12;29254:9;:24;29227:51;29224:193;;;29303:10;29295:56;29324:26;29338:12;29325:9;29324:26;:::i;:::-;29295:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29224:193;;;29384:21;29395:9;29384:10;:21::i;:::-;29431:6;29427:116;29447:11;:18;29443:1;:22;29427:116;;;29495:11;29507:1;29495:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;29487:32:0;:44;29520:7;29528:1;29520:10;;;;;;;;:::i;:::-;;;;;;;29487:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29467:3:0;;;;:::i;:::-;;;;29427:116;;;;29556:12;29553:120;;;29643:18;;29629:10;29614:26;;;;:14;:26;;;;;;:47;;29643:18;29614:47;:::i;:::-;29600:10;29585:26;;;;:14;:26;;;;;:76;29553:120;29711:18;;29688:57;;;12694:25:1;;;12750:2;12735:18;;12728:34;;;29699:10:0;;29688:57;;12667:18:1;29688:57:0;;;;;;;-1:-1:-1;29763:4:0;;28351:1424;-1:-1:-1;;;;;;;;;28351:1424:0:o;23929:151::-;-1:-1:-1;;;;;24036:30:0;23999:17;24036:30;;;:14;:30;;;;;;24069:3;-1:-1:-1;24036:36:0;23929:151::o;15419:178::-;15493:12;15518:49;15535:1;15538:19;;15559:7;15518:16;:49::i;21958:337::-;22068:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22102:32:0;::::1;;::::0;;;:11:::1;:32;::::0;;;;;::::1;;22094:41;;;::::0;::::1;;-1:-1:-1::0;;;;;22171:40:0;::::1;22146:22;22171:40:::0;;;:19:::1;:40;::::0;;;;;;22222:29;;22254:11;;22222:20:::1;::::0;:29:::1;::::0;22171:40;;22222:29:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:43;-1:-1:-1;22283:4:0::1;::::0;-1:-1:-1;21958:337:0;;;;:::o;13045:246::-;13090:4;13115:36;13140:10;13115:24;:36::i;:::-;13107:74;;;;-1:-1:-1;;;13107:74:0;;21872:2:1;13107:74:0;;;21854:21:1;21911:2;21891:18;;;21884:30;21950:27;21930:18;;;21923:55;21995:18;;13107:74:0;21670:349:1;13107:74:0;13227:34;:15;13246:14;13227:34;:::i;:::-;13213:10;13192:32;;;;:20;:32;;;;;:69;-1:-1:-1;13279:4:0;;13045:246::o;12603:241::-;12753:28;;12800:36;;-1:-1:-1;;;12800:36:0;;-1:-1:-1;;;;;2455:32:1;;;12800:36:0;;;2437:51:1;12671:4:0;;12753:28;;;;12800:30;;2410:18:1;;12800:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12793:43;12603:241;-1:-1:-1;;;12603:241:0:o;6248:483::-;6386:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;6430:1:::1;6419:10;:12;:39;;;;;6446:12;6435:10;:23;6419:39;:68;;;;;6475:12;6462;:25;6419:68;:97;;;;;6504:12;6491;:25;6419:97;6411:106;;;::::0;::::1;;-1:-1:-1::0;6528:19:0::1;:32:::0;;;;6571:21:::1;:36:::0;;;;6618:21:::1;:36:::0;6665:21:::1;:36:::0;6719:4:::1;::::0;6248:483::o;20358:149::-;20428:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;20452:15:0::1;:25:::0;20495:4:::1;::::0;20358:149::o;16874:170::-;-1:-1:-1;;;;;16975:25:0;;16942:13;16975:25;;;:13;:25;;;;;;;;;:61;;-1:-1:-1;;;;;;;17004:32:0;;;;;:20;:32;;;;;;;;;16874:170::o;24350:313::-;24432:27;24475:34;24493:15;24475:17;:34::i;:::-;24472:164;;;-1:-1:-1;;;;;24592:32:0;;24526:21;24592:32;;;:15;:32;;;;;;24551:3;;24576:48;;24551:3;24576:48;:::i;24472:164::-;-1:-1:-1;24654:1:0;;24350:313;-1:-1:-1;24350:313:0:o;12226:128::-;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;12310:28:::1;:36:::0;;-1:-1:-1;;;;;;12310:36:0::1;-1:-1:-1::0;;;;;12310:36:0;;;::::1;::::0;;;::::1;::::0;;12226:128::o;14900:186::-;14976:12;15001:55;15018:5;15025:21;;15048:7;15001:16;:55::i;17408:202::-;17508:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;17533:35:0;;;::::1;;::::0;;;:23:::1;:35;::::0;;;;:47;17598:4:::1;::::0;17408:202::o;24925:306::-;25005:27;25048:32;25065:14;25048:16;:32::i;:::-;25045:160;;;-1:-1:-1;;;;;25163:30:0;;25097:21;25163:30;;;:14;:30;;;;;;25122:3;;25147:46;;25122:3;25147:46;:::i;4187:51::-;;;;;;;;;;;;;;;;:::i;40281:342::-;40397:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;40486:34:::1;::::0;-1:-1:-1;;;40486:34:0;;-1:-1:-1;;;;;20808:32:1;;;40486:34:0::1;::::0;::::1;20790:51:1::0;20857:18;;;20850:34;;;40459:15:0;;40486:14;;::::1;::::0;::::1;::::0;20763:18:1;;40486:34:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40536:57;40557:15;40574:10;40586:6;40536:57;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;40611:4:0::1;::::0;40281:342;-1:-1:-1;;;;40281:342:0:o;11219:196::-;11316:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;11341:32:0;;;::::1;;::::0;;;:25:::1;:32;::::0;;;;:44;11403:4:::1;::::0;11219:196::o;10642:249::-;10722:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10755:29:0;::::1;;::::0;;;:22:::1;:29;::::0;;;;;::::1;;10747:66;;;::::0;-1:-1:-1;;;10747:66:0;;22226:2:1;10747:66:0::1;::::0;::::1;22208:21:1::0;22265:2;22245:18;;;22238:30;22304:26;22284:18;;;22277:54;22348:18;;10747:66:0::1;22024:348:1::0;10747:66:0::1;-1:-1:-1::0;;;;;;10824:29:0::1;10856:5;10824:29:::0;;;:22:::1;:29;::::0;;;;:37;;-1:-1:-1;;10824:37:0::1;::::0;;-1:-1:-1;;10642:249:0:o;20816:738::-;20920:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20954:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;20953:19;20945:64;;;::::0;-1:-1:-1;;;20945:64:0;;22579:2:1;20945:64:0::1;::::0;::::1;22561:21:1::0;;;22598:18;;;22591:30;22657:34;22637:18;;;22630:62;22709:18;;20945:64:0::1;22377:356:1::0;20945:64:0::1;-1:-1:-1::0;;;;;21028:19:0;::::1;21020:56;;;::::0;-1:-1:-1;;;21020:56:0;;22940:2:1;21020:56:0::1;::::0;::::1;22922:21:1::0;22979:2;22959:18;;;22952:30;23018:26;22998:18;;;22991:54;23062:18;;21020:56:0::1;22738:348:1::0;21020:56:0::1;21096:19;21116:5;21096:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;21095:27;21087:70;;;::::0;-1:-1:-1;;;21087:70:0;;23574:2:1;21087:70:0::1;::::0;::::1;23556:21:1::0;23613:2;23593:18;;;23586:30;23652:32;23632:18;;;23625:60;23702:18;;21087:70:0::1;23372:354:1::0;21087:70:0::1;21191:3;21176:11;:18;;:37;;;;;21212:1;21198:11;:15;21176:37;21168:82;;;::::0;-1:-1:-1;;;21168:82:0;;23933:2:1;21168:82:0::1;::::0;::::1;23915:21:1::0;;;23952:18;;;23945:30;24011:34;23991:18;;;23984:62;24063:18;;21168:82:0::1;23731:356:1::0;21168:82:0::1;21290:4;21261:19;21281:5;21261:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;:33;;;::::1;;-1:-1:-1::0;;21261:33:0;;::::1;;::::0;;-1:-1:-1;;;;;21305:18:0;::::1;21261:26;21305:18:::0;;;:11:::1;:18:::0;;;;:25;;;;::::1;21261:33:::0;21305:25:::1;::::0;;;21317:5;;21341:19:::1;::::0;:26:::1;::::0;21361:5;;21341:26:::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:34;;-1:-1:-1;;;;;;21341:34:0::1;-1:-1:-1::0;;;;;21341:34:0;;::::1;;::::0;;21386:26;;::::1;-1:-1:-1::0;21386:26:0;;;:19:::1;:26:::0;;;;;;:34;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;21461:11;21431:20;21452:5;21431:27;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:41;;;;21488:36:::1;::::0;21518:5;;21488:36:::1;:::i;:::-;;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;21488:36:0;::::1;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;21542:4:0::1;20816:738:::0;;;;;:::o;26979:234::-;27168:37;;-1:-1:-1;;;27168:37:0;;-1:-1:-1;;;;;24322:15:1;;;27168:37:0;;;24304:34:1;27199:4:0;24354:18:1;;;24347:43;27066:17:0;;27134:15;;27168;;;;;24239:18:1;;27168:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27161:44;26979:234;-1:-1:-1;;;;26979:234:0:o;1033:256::-;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1129:23:0;::::1;::::0;;::::1;::::0;:58:::1;;-1:-1:-1::0;1182:5:0::1;::::0;-1:-1:-1;;;;;1169:18:0;;::::1;1182:5:::0;::::1;1169:18;;1129:58;1107:92;;;::::0;::::1;;1236:5;::::0;;1215:38:::1;::::0;-1:-1:-1;;;;;1215:38:0;;::::1;::::0;1236:5;::::1;::::0;1215:38:::1;::::0;::::1;1264:5;:17:::0;;-1:-1:-1;;;;;;1264:17:0::1;-1:-1:-1::0;;;;;1264:17:0;;;::::1;::::0;;;::::1;::::0;;1033:256::o;18546:513::-;18642:12;18676:30;18695:10;18676:18;:30::i;:::-;18675:31;18667:67;;;;-1:-1:-1;;;18667:67:0;;11843:2:1;18667:67:0;;;11825:21:1;11882:2;11862:18;;;11855:30;-1:-1:-1;;;11901:18:1;;;11894:53;11964:18;;18667:67:0;11641:347:1;18667:67:0;18755:29;18776:7;18755:20;:29::i;:::-;18745:39;;18795:11;18809:33;18831:10;18809:21;:33::i;:::-;18795:47;;18874:3;18861:9;:16;;18853:62;;;;-1:-1:-1;;;18853:62:0;;24603:2:1;18853:62:0;;;24585:21:1;24642:2;24622:18;;;24615:30;24681:34;24661:18;;;24654:62;-1:-1:-1;;;24732:18:1;;;24725:31;24773:19;;18853:62:0;24401:397:1;18853:62:0;-1:-1:-1;;;;;18926:25:0;;;;;;:13;:25;;;;;:32;;-1:-1:-1;;18926:32:0;18954:4;18926:32;;;18969:15;18980:3;18969:10;:15::i;:::-;18995:34;19016:3;19021:7;18995:20;:34::i;:::-;-1:-1:-1;19047:4:0;;18546:513;-1:-1:-1;;;18546:513:0:o;10069:297::-;10141:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;10174:27:::1;10195:5;10174:20;:27::i;:::-;:35;;10205:4;10174:35:::0;10166:79:::1;;;::::0;-1:-1:-1;;;10166:79:0;;25005:2:1;10166:79:0::1;::::0;::::1;24987:21:1::0;25044:2;25024:18;;;25017:30;25083:33;25063:18;;;25056:61;25134:18;;10166:79:0::1;24803:355:1::0;10166:79:0::1;-1:-1:-1::0;;;;;10256:29:0;::::1;;::::0;;;:22:::1;:29;::::0;;;;;:36;;-1:-1:-1;;10256:36:0::1;10288:4;10256:36;::::0;;10308:27;::::1;::::0;10256:29;10308:27:::1;-1:-1:-1::0;10353:4:0::1;10069:297:::0;;;:::o;13792:778::-;13887:12;13920:32;13941:10;13920:20;:32::i;:::-;:40;;13956:4;13920:40;13912:84;;;;-1:-1:-1;;;13912:84:0;;25005:2:1;13912:84:0;;;24987:21:1;25044:2;25024:18;;;25017:30;25083:33;25063:18;;;25056:61;25134:18;;13912:84:0;24803:355:1;13912:84:0;14007:11;14021:47;14051:10;14063:4;14021:29;:47::i;:::-;14007:61;;14114:3;14101:9;:16;;14200:13;14209:3;14200:8;:13::i;:::-;14244:19;14253:9;14244:8;:19::i;:::-;14139:139;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14079:211;;;;;-1:-1:-1;;;14079:211:0;;;;;;;;:::i;:::-;-1:-1:-1;14355:14:0;:5;14363:6;14355:14;:::i;:::-;14336:34;;:15;:34;:::i;:::-;14322:10;14301:32;;;;:20;:32;;;;;:69;14391:29;14412:7;14391:20;:29::i;:::-;14381:39;;14431:15;14442:3;14431:10;:15::i;:::-;14457:34;14478:3;14483:7;14457:20;:34::i;:::-;14507:32;;14528:10;;14507:32;;;;;-1:-1:-1;14557:4:0;;13792:778;-1:-1:-1;;;;13792:778:0:o;8315:1028::-;8452:10;8435:28;;;;:16;:28;;;;;8419:53;;8385:18;;8419:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8419:53:0;;;:15;:53::i;:::-;:99;;;;8477:11;:41;8489:19;8509:7;8489:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8489:28:0;8477:41;;;;;;;;;;-1:-1:-1;8477:41:0;;;;8476:42;8419:99;8416:196;;;8535:37;;;;;;;;;;;-1:-1:-1;;;8535:37:0;;;;;;;8552:10;-1:-1:-1;8535:28:0;;;:16;:28;;;;;;;:37;;;;;;:::i;:::-;-1:-1:-1;;8587:13:0;;;;;;;;;;;;-1:-1:-1;;;8587:13:0;;;;;8315:1028;-1:-1:-1;8315:1028:0:o;8416:196::-;8626:28;8642:7;8626:28;;;;;;;;;;;;:15;:28::i;:::-;8625:29;:81;;;;-1:-1:-1;8691:10:0;8674:28;;;;:16;:28;;;;;8658:48;;;;8674:28;8658:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:48::i;:::-;8625:179;;;;;8776:19;8796:7;8776:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;8625:179;8622:358;;;8856:10;-1:-1:-1;;;;;8824:42:0;:19;8844:7;8824:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;8824:28:0;:42;8821:95;;-1:-1:-1;;8887:13:0;;;;;;;;;;;;-1:-1:-1;;;8887:13:0;;;;;8315:1028::o;8821:95::-;8947:10;8930:28;;;;:16;:28;;;;;;;;:38;;;;;;;;:::i;:::-;;8622:358;8993:27;9009:7;8993:27;;;;;;;;;;;;:15;:27::i;:::-;:80;;;;-1:-1:-1;9058:10:0;9041:28;;;;:16;:28;;;;;9025:48;;;;9041:28;9025:48;;;:::i;:::-;9024:49;8993:80;8990:150;;;9117:10;9100:28;;;;:16;:28;;;;;9090:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8990:150;9154:27;9170:7;9154:27;;;;;;;;;;;;:15;:27::i;:::-;:60;;;;9186:19;9206:7;9186:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;9185:29;9154:60;9151:160;;;9231:37;;;;;;;;;;;-1:-1:-1;;;9231:37:0;;;;;;;9248:10;-1:-1:-1;9231:28:0;;;:16;:28;;;;;;;:37;;;;;;:::i;:::-;;9283:16;;;;;;;;;;;;;-1:-1:-1;;;9283:16:0;;;;;9151:160;-1:-1:-1;9328:7:0;8315:1028::o;7760:199::-;7831:6;7819:9;:18;7816:136;;;7854:14;7871:18;7883:6;7871:9;:18;:::i;:::-;7904:36;;7854:35;;-1:-1:-1;7912:10:0;;7904:36;;;;;7854:35;;7904:36;;;;7854:35;7912:10;7904:36;;;;;;;;;;;;;;;;;;;;;7839:113;7816:136;7760:199;:::o;38825:550::-;38920:31;38936:7;38920:31;;;;;;;;;;;;;-1:-1:-1;;;38920:31:0;;;:15;:31::i;:::-;38919:32;:77;;;;;38955:11;:41;38967:19;38987:7;38967:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38967:28:0;38955:41;;;;;;;;;;-1:-1:-1;38955:41:0;;;;38919:77;38916:452;;;39013:18;39077:3;39045:20;39066:7;39045:29;;;;;;:::i;:::-;;;;;;;;;;;;;;39034:8;:40;;;;:::i;:::-;:46;;;;:::i;:::-;39103:5;;39013:67;;-1:-1:-1;;;;;;39103:5:0;39095:46;39119:21;39013:67;39119:8;:21;:::i;:::-;39095:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39164:19;39184:7;39164:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;39164:28:0;;39156:58;;;;;39203:10;;39164:28;;;;39203:10;39164:28;39156:58;;;;;;;;;;;;;;;;;;;;;39249:19;39269:7;39249:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1996:25:1;;;-1:-1:-1;;;;;39249:28:0;;39234:56;;1969:18:1;39234:56:0;;;;;;;38998:304;38825:550;;:::o;38916:452::-;39331:5;;;39323:33;;-1:-1:-1;;;;;39331:5:0;;;;39323:33;;;;;39347:8;;39323:33;39331:5;39323:33;39347:8;39331:5;39323:33;;;;;;;;;;;;;;;;;;;6978:573;7028:27;7072:2;7078:1;7072:7;7068:50;;-1:-1:-1;;7096:10:0;;;;;;;;;;;;-1:-1:-1;;;7096:10:0;;;;;6978:573::o;7068:50::-;7137:2;7128:6;7169:69;7176:6;;7169:69;;7199:5;;;;:::i;:::-;;-1:-1:-1;7219:7:0;;-1:-1:-1;7224:2:0;7219:7;;:::i;:::-;;;7169:69;;;7248:17;7278:3;7268:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7268:14:0;-1:-1:-1;7248:34:0;-1:-1:-1;7302:3:0;7316:198;7323:7;;7316:198;;7351:3;7353:1;7351;:3;:::i;:::-;7347:7;-1:-1:-1;7369:10:0;7399:7;7404:2;7399;:7;:::i;:::-;:12;;7409:2;7399:12;:::i;:::-;7394:17;;:2;:17;:::i;:::-;7383:29;;:2;:29;:::i;:::-;7369:44;;7428:9;7447:4;7440:12;;7428:24;;7477:2;7467:4;7472:1;7467:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;7467:12:0;;;;;;;;-1:-1:-1;7494:8:0;7500:2;7494:8;;:::i;:::-;;;7332:182;;7316:198;;;-1:-1:-1;7538:4:0;6978:573;-1:-1:-1;;;;6978:573:0:o;27558:254::-;27641:13;27667;27710:2;27693:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;27683:31;;;;;;27667:47;;27725:13;27768:2;27751:20;;;;;;;;:::i;:::-;;;;-1:-1:-1;;27751:20:0;;;;;;;;;27741:31;;27751:20;27741:31;;;;27790:14;;;;;27558:254;-1:-1:-1;;;;27558:254:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:127:1;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:275;217:2;211:9;282:2;263:13;;-1:-1:-1;;259:27:1;247:40;;317:18;302:34;;338:22;;;299:62;296:88;;;364:18;;:::i;:::-;400:2;393:22;146:275;;-1:-1:-1;146:275:1:o;426:531::-;469:5;522:3;515:4;507:6;503:17;499:27;489:55;;540:1;537;530:12;489:55;576:6;563:20;602:18;598:2;595:26;592:52;;;624:18;;:::i;:::-;668:55;711:2;692:13;;-1:-1:-1;;688:27:1;717:4;684:38;668:55;:::i;:::-;748:2;739:7;732:19;794:3;787:4;782:2;774:6;770:15;766:26;763:35;760:55;;;811:1;808;801:12;760:55;876:2;869:4;861:6;857:17;850:4;841:7;837:18;824:55;924:1;899:16;;;917:4;895:27;888:38;;;;903:7;426:531;-1:-1:-1;;;426:531:1:o;962:322::-;1031:6;1084:2;1072:9;1063:7;1059:23;1055:32;1052:52;;;1100:1;1097;1090:12;1052:52;1140:9;1127:23;1173:18;1165:6;1162:30;1159:50;;;1205:1;1202;1195:12;1159:50;1228;1270:7;1261:6;1250:9;1246:22;1228:50;:::i;1481:173::-;1549:20;;-1:-1:-1;;;;;1598:31:1;;1588:42;;1578:70;;1644:1;1641;1634:12;1659:186;1718:6;1771:2;1759:9;1750:7;1746:23;1742:32;1739:52;;;1787:1;1784;1777:12;1739:52;1810:29;1829:9;1810:29;:::i;2032:254::-;2100:6;2108;2161:2;2149:9;2140:7;2136:23;2132:32;2129:52;;;2177:1;2174;2167:12;2129:52;2200:29;2219:9;2200:29;:::i;:::-;2190:39;2276:2;2261:18;;;;2248:32;;-1:-1:-1;;;2032:254:1:o;2499:180::-;2558:6;2611:2;2599:9;2590:7;2586:23;2582:32;2579:52;;;2627:1;2624;2617:12;2579:52;-1:-1:-1;2650:23:1;;2499:180;-1:-1:-1;2499:180:1:o;2684:183::-;2744:4;2777:18;2769:6;2766:30;2763:56;;;2799:18;;:::i;:::-;-1:-1:-1;2844:1:1;2840:14;2856:4;2836:25;;2684:183::o;2872:668::-;2926:5;2979:3;2972:4;2964:6;2960:17;2956:27;2946:55;;2997:1;2994;2987:12;2946:55;3033:6;3020:20;3059:4;3083:60;3099:43;3139:2;3099:43;:::i;:::-;3083:60;:::i;:::-;3177:15;;;3263:1;3259:10;;;;3247:23;;3243:32;;;3208:12;;;;3287:15;;;3284:35;;;3315:1;3312;3305:12;3284:35;3351:2;3343:6;3339:15;3363:148;3379:6;3374:3;3371:15;3363:148;;;3445:23;3464:3;3445:23;:::i;:::-;3433:36;;3489:12;;;;3396;;3363:148;;;-1:-1:-1;3529:5:1;2872:668;-1:-1:-1;;;;;;2872:668:1:o;3545:662::-;3599:5;3652:3;3645:4;3637:6;3633:17;3629:27;3619:55;;3670:1;3667;3660:12;3619:55;3706:6;3693:20;3732:4;3756:60;3772:43;3812:2;3772:43;:::i;3756:60::-;3850:15;;;3936:1;3932:10;;;;3920:23;;3916:32;;;3881:12;;;;3960:15;;;3957:35;;;3988:1;3985;3978:12;3957:35;4024:2;4016:6;4012:15;4036:142;4052:6;4047:3;4044:15;4036:142;;;4118:17;;4106:30;;4156:12;;;;4069;;4036:142;;4212:118;4298:5;4291:13;4284:21;4277:5;4274:32;4264:60;;4320:1;4317;4310:12;4335:128;4400:20;;4429:28;4400:20;4429:28;:::i;4468:1166::-;4654:6;4662;4670;4678;4686;4694;4747:3;4735:9;4726:7;4722:23;4718:33;4715:53;;;4764:1;4761;4754:12;4715:53;4787:29;4806:9;4787:29;:::i;:::-;4777:39;;4867:2;4856:9;4852:18;4839:32;4890:18;4931:2;4923:6;4920:14;4917:34;;;4947:1;4944;4937:12;4917:34;4970:61;5023:7;5014:6;5003:9;4999:22;4970:61;:::i;:::-;4960:71;;5084:2;5073:9;5069:18;5056:32;5040:48;;5113:2;5103:8;5100:16;5097:36;;;5129:1;5126;5119:12;5097:36;5152:63;5207:7;5196:8;5185:9;5181:24;5152:63;:::i;:::-;5142:73;;5268:2;5257:9;5253:18;5240:32;5224:48;;5297:2;5287:8;5284:16;5281:36;;;5313:1;5310;5303:12;5281:36;5336:63;5391:7;5380:8;5369:9;5365:24;5336:63;:::i;:::-;5326:73;;5418:36;5449:3;5438:9;5434:19;5418:36;:::i;:::-;5408:46;;5507:3;5496:9;5492:19;5479:33;5463:49;;5537:2;5527:8;5524:16;5521:36;;;5553:1;5550;5543:12;5521:36;;5576:52;5620:7;5609:8;5598:9;5594:24;5576:52;:::i;:::-;5566:62;;;4468:1166;;;;;;;;:::o;5639:1000::-;5791:6;5799;5807;5815;5823;5876:3;5864:9;5855:7;5851:23;5847:33;5844:53;;;5893:1;5890;5883:12;5844:53;5916:29;5935:9;5916:29;:::i;:::-;5906:39;;5996:2;5985:9;5981:18;5968:32;6019:18;6060:2;6052:6;6049:14;6046:34;;;6076:1;6073;6066:12;6046:34;6099:61;6152:7;6143:6;6132:9;6128:22;6099:61;:::i;:::-;6089:71;;6213:2;6202:9;6198:18;6185:32;6169:48;;6242:2;6232:8;6229:16;6226:36;;;6258:1;6255;6248:12;6226:36;6281:63;6336:7;6325:8;6314:9;6310:24;6281:63;:::i;:::-;6271:73;;6394:2;6383:9;6379:18;6366:32;6353:45;;6407:28;6429:5;6407:28;:::i;:::-;6454:5;;-1:-1:-1;6512:3:1;6497:19;;6484:33;;6529:16;;;6526:36;;;6558:1;6555;6548:12;6526:36;;6581:52;6625:7;6614:8;6603:9;6599:24;6581:52;:::i;:::-;6571:62;;;5639:1000;;;;;;;;:::o;6644:258::-;6716:1;6726:113;6740:6;6737:1;6734:13;6726:113;;;6816:11;;;6810:18;6797:11;;;6790:39;6762:2;6755:10;6726:113;;;6857:6;6854:1;6851:13;6848:48;;;6892:1;6883:6;6878:3;6874:16;6867:27;6848:48;;6644:258;;;:::o;6907:383::-;7056:2;7045:9;7038:21;7019:4;7088:6;7082:13;7131:6;7126:2;7115:9;7111:18;7104:34;7147:66;7206:6;7201:2;7190:9;7186:18;7181:2;7173:6;7169:15;7147:66;:::i;:::-;7274:2;7253:15;-1:-1:-1;;7249:29:1;7234:45;;;;7281:2;7230:54;;6907:383;-1:-1:-1;;6907:383:1:o;7295:1205::-;7462:6;7470;7478;7486;7494;7502;7510;7563:3;7551:9;7542:7;7538:23;7534:33;7531:53;;;7580:1;7577;7570:12;7531:53;7603:29;7622:9;7603:29;:::i;:::-;7593:39;;7683:2;7672:9;7668:18;7655:32;7706:18;7747:2;7739:6;7736:14;7733:34;;;7763:1;7760;7753:12;7733:34;7786:61;7839:7;7830:6;7819:9;7815:22;7786:61;:::i;:::-;7776:71;;7900:2;7889:9;7885:18;7872:32;7856:48;;7929:2;7919:8;7916:16;7913:36;;;7945:1;7942;7935:12;7913:36;7968:63;8023:7;8012:8;8001:9;7997:24;7968:63;:::i;:::-;7958:73;;8078:2;8067:9;8063:18;8050:32;8040:42;;8132:3;8121:9;8117:19;8104:33;8091:46;;8146:28;8168:5;8146:28;:::i;:::-;8193:5;;-1:-1:-1;8250:3:1;8235:19;;8222:33;;8264:30;8222:33;8264:30;:::i;:::-;8313:7;;-1:-1:-1;8373:3:1;8358:19;;8345:33;;8390:16;;;8387:36;;;8419:1;8416;8409:12;8387:36;;8442:52;8486:7;8475:8;8464:9;8460:24;8442:52;:::i;:::-;8432:62;;;7295:1205;;;;;;;;;;:::o;8505:864::-;8651:6;8659;8667;8675;8728:3;8716:9;8707:7;8703:23;8699:33;8696:53;;;8745:1;8742;8735:12;8696:53;8785:9;8772:23;8814:18;8855:2;8847:6;8844:14;8841:34;;;8871:1;8868;8861:12;8841:34;8894:61;8947:7;8938:6;8927:9;8923:22;8894:61;:::i;:::-;8884:71;;9008:2;8997:9;8993:18;8980:32;8964:48;;9037:2;9027:8;9024:16;9021:36;;;9053:1;9050;9043:12;9021:36;9076:63;9131:7;9120:8;9109:9;9105:24;9076:63;:::i;:::-;9066:73;;9186:2;9175:9;9171:18;9158:32;9148:42;;9243:2;9232:9;9228:18;9215:32;9199:48;;9272:2;9262:8;9259:16;9256:36;;;9288:1;9285;9278:12;9256:36;;9311:52;9355:7;9344:8;9333:9;9329:24;9311:52;:::i;:::-;9301:62;;;8505:864;;;;;;;:::o;9374:385::-;9460:6;9468;9476;9484;9537:3;9525:9;9516:7;9512:23;9508:33;9505:53;;;9554:1;9551;9544:12;9505:53;-1:-1:-1;;9577:23:1;;;9647:2;9632:18;;9619:32;;-1:-1:-1;9698:2:1;9683:18;;9670:32;;9749:2;9734:18;9721:32;;-1:-1:-1;9374:385:1;-1:-1:-1;9374:385:1:o;9764:328::-;9841:6;9849;9857;9910:2;9898:9;9889:7;9885:23;9881:32;9878:52;;;9926:1;9923;9916:12;9878:52;9949:29;9968:9;9949:29;:::i;:::-;9939:39;;9997:38;10031:2;10020:9;10016:18;9997:38;:::i;:::-;9987:48;;10082:2;10071:9;10067:18;10054:32;10044:42;;9764:328;;;;;:::o;10097:464::-;10184:6;10192;10200;10253:2;10241:9;10232:7;10228:23;10224:32;10221:52;;;10269:1;10266;10259:12;10221:52;10292:29;10311:9;10292:29;:::i;:::-;10282:39;;10372:2;10361:9;10357:18;10344:32;10399:18;10391:6;10388:30;10385:50;;;10431:1;10428;10421:12;10385:50;10454;10496:7;10487:6;10476:9;10472:22;10454:50;:::i;:::-;10444:60;;;10551:2;10540:9;10536:18;10523:32;10513:42;;10097:464;;;;;:::o;10566:260::-;10634:6;10642;10695:2;10683:9;10674:7;10670:23;10666:32;10663:52;;;10711:1;10708;10701:12;10663:52;10734:29;10753:9;10734:29;:::i;:::-;10724:39;;10782:38;10816:2;10805:9;10801:18;10782:38;:::i;:::-;10772:48;;10566:260;;;;;:::o;10831:396::-;10909:6;10917;10970:2;10958:9;10949:7;10945:23;10941:32;10938:52;;;10986:1;10983;10976:12;10938:52;11009:29;11028:9;11009:29;:::i;:::-;10999:39;;11089:2;11078:9;11074:18;11061:32;11116:18;11108:6;11105:30;11102:50;;;11148:1;11145;11138:12;11102:50;11171;11213:7;11204:6;11193:9;11189:22;11171:50;:::i;:::-;11161:60;;;10831:396;;;;;:::o;11232:404::-;11434:2;11416:21;;;11473:2;11453:18;;;11446:30;11512:34;11507:2;11492:18;;11485:62;-1:-1:-1;;;11578:2:1;11563:18;;11556:38;11626:3;11611:19;;11232:404::o;11993:127::-;12054:10;12049:3;12045:20;12042:1;12035:31;12085:4;12082:1;12075:15;12109:4;12106:1;12099:15;12125:168;12165:7;12231:1;12227;12223:6;12219:14;12216:1;12213:21;12208:1;12201:9;12194:17;12190:45;12187:71;;;12238:18;;:::i;:::-;-1:-1:-1;12278:9:1;;12125:168::o;12298:217::-;12338:1;12364;12354:132;;12408:10;12403:3;12399:20;12396:1;12389:31;12443:4;12440:1;12433:15;12471:4;12468:1;12461:15;12354:132;-1:-1:-1;12500:9:1;;12298:217::o;12773:475::-;12975:2;12957:21;;;13014:2;12994:18;;;12987:30;13053:34;13048:2;13033:18;;13026:62;13124:34;13119:2;13104:18;;13097:62;-1:-1:-1;;;13190:3:1;13175:19;;13168:38;13238:3;13223:19;;12773:475::o;13733:403::-;13935:2;13917:21;;;13974:2;13954:18;;;13947:30;14013:34;14008:2;13993:18;;13986:62;-1:-1:-1;;;14079:2:1;14064:18;;14057:37;14126:3;14111:19;;13733:403::o;14141:461::-;14194:3;14232:5;14226:12;14259:6;14254:3;14247:19;14285:4;14314:2;14309:3;14305:12;14298:19;;14351:2;14344:5;14340:14;14372:1;14382:195;14396:6;14393:1;14390:13;14382:195;;;14461:13;;-1:-1:-1;;;;;14457:39:1;14445:52;;14517:12;;;;14552:15;;;;14493:1;14411:9;14382:195;;;-1:-1:-1;14593:3:1;;14141:461;-1:-1:-1;;;;;14141:461:1:o;14607:435::-;14660:3;14698:5;14692:12;14725:6;14720:3;14713:19;14751:4;14780:2;14775:3;14771:12;14764:19;;14817:2;14810:5;14806:14;14838:1;14848:169;14862:6;14859:1;14856:13;14848:169;;;14923:13;;14911:26;;14957:12;;;;14992:15;;;;14884:1;14877:9;14848:169;;15047:768;-1:-1:-1;;;;;15410:32:1;;15392:51;;15479:3;15474:2;15459:18;;15452:31;;;-1:-1:-1;;15506:57:1;;15543:19;;15535:6;15506:57;:::i;:::-;15611:9;15603:6;15599:22;15594:2;15583:9;15579:18;15572:50;15645:44;15682:6;15674;15645:44;:::i;:::-;15631:58;;15737:9;15729:6;15725:22;15720:2;15709:9;15705:18;15698:50;15765:44;15802:6;15794;15765:44;:::i;:::-;15757:52;15047:768;-1:-1:-1;;;;;;;15047:768:1:o;15820:127::-;15881:10;15876:3;15872:20;15869:1;15862:31;15912:4;15909:1;15902:15;15936:4;15933:1;15926:15;16584:135;16623:3;16644:17;;;16641:43;;16664:18;;:::i;:::-;-1:-1:-1;16711:1:1;16700:13;;16584:135::o;16724:128::-;16764:3;16795:1;16791:6;16788:1;16785:13;16782:39;;;16801:18;;:::i;:::-;-1:-1:-1;16837:9:1;;16724:128::o;16857:562::-;-1:-1:-1;;;;;17142:32:1;;17124:51;;17211:2;17206;17191:18;;17184:30;;;-1:-1:-1;;17237:56:1;;17274:18;;17266:6;17237:56;:::i;:::-;17341:9;17333:6;17329:22;17324:2;17313:9;17309:18;17302:50;17369:44;17406:6;17398;17369:44;:::i;:::-;17361:52;16857:562;-1:-1:-1;;;;;;16857:562:1:o;17424:375::-;-1:-1:-1;;;;;17682:15:1;;;17664:34;;17734:15;;;;17729:2;17714:18;;17707:43;17781:2;17766:18;;17759:34;;;;17614:2;17599:18;;17424:375::o;17804:380::-;17883:1;17879:12;;;;17926;;;17947:61;;18001:4;17993:6;17989:17;17979:27;;17947:61;18054:2;18046:6;18043:14;18023:18;18020:38;18017:161;;18100:10;18095:3;18091:20;18088:1;18081:31;18135:4;18132:1;18125:15;18163:4;18160:1;18153:15;18189:982;18274:12;;18239:3;;18329:1;18349:18;;;;18402;;;;18429:61;;18483:4;18475:6;18471:17;18461:27;;18429:61;18509:2;18557;18549:6;18546:14;18526:18;18523:38;18520:161;;18603:10;18598:3;18594:20;18591:1;18584:31;18638:4;18635:1;18628:15;18666:4;18663:1;18656:15;18520:161;18697:18;18724:104;;;;18842:1;18837:328;;;;18690:475;;18724:104;-1:-1:-1;;18757:24:1;;18745:37;;18802:16;;;;-1:-1:-1;18724:104:1;;18837:328;18868:5;18865:1;18858:16;18915:2;18912:1;18902:16;18940:1;18954:165;18968:6;18965:1;18962:13;18954:165;;;19046:14;;19033:11;;;19026:35;19089:16;;;;18983:10;;18954:165;;;18958:3;;19148:6;19143:3;19139:16;19132:23;;18690:475;;;;;;;18189:982;;;;:::o;19176:197::-;19304:3;19329:38;19363:3;19355:6;19329:38;:::i;19726:415::-;19928:2;19910:21;;;19967:2;19947:18;;;19940:30;20006:34;20001:2;19986:18;;19979:62;-1:-1:-1;;;20072:2:1;20057:18;;20050:49;20131:3;20116:19;;19726:415::o;20146:465::-;20403:2;20392:9;20385:21;20366:4;20429:56;20481:2;20470:9;20466:18;20458:6;20429:56;:::i;:::-;20533:9;20525:6;20521:22;20516:2;20505:9;20501:18;20494:50;20561:44;20598:6;20590;20561:44;:::i;:::-;20553:52;20146:465;-1:-1:-1;;;;;20146:465:1:o;20895:245::-;20962:6;21015:2;21003:9;20994:7;20990:23;20986:32;20983:52;;;21031:1;21028;21021:12;20983:52;21063:9;21057:16;21082:28;21104:5;21082:28;:::i;21145:184::-;21215:6;21268:2;21256:9;21247:7;21243:23;21239:32;21236:52;;;21284:1;21281;21274:12;21236:52;-1:-1:-1;21307:16:1;;21145:184;-1:-1:-1;21145:184:1:o;21334:125::-;21374:4;21402:1;21399;21396:8;21393:34;;;21407:18;;:::i;:::-;-1:-1:-1;21444:9:1;;21334:125::o;23091:276::-;23222:3;23260:6;23254:13;23276:53;23322:6;23317:3;23310:4;23302:6;23298:17;23276:53;:::i;:::-;23345:16;;;;;23091:276;-1:-1:-1;;23091:276:1:o;25163:793::-;-1:-1:-1;;;25569:3:1;25562:37;25544:3;25628:6;25622:13;25644:62;25699:6;25694:2;25689:3;25685:12;25678:4;25670:6;25666:17;25644:62;:::i;:::-;25770:27;25765:2;25725:16;;;25757:11;;;25750:48;25823:13;;25845:63;25823:13;25894:2;25886:11;;25879:4;25867:17;;25845:63;:::i;:::-;25928:17;25947:2;25924:26;;25163:793;-1:-1:-1;;;;25163:793:1:o;25961:204::-;25999:3;26035:4;26032:1;26028:12;26067:4;26064:1;26060:12;26102:3;26096:4;26092:14;26087:3;26084:23;26081:49;;;26110:18;;:::i;:::-;26146:13;;25961:204;-1:-1:-1;;;25961:204:1:o

Swarm Source

ipfs://60411a68509cf85fa8948f9f7b1a66adc6c56160a38c8d3ac5a7c95cade1a481

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.