ETH Price: $2,516.18 (-1.56%)
Gas: 2.46 Gwei

Contract

0x240447455CC8e173a8C52d8b173eB96E2ABfb518
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw USDT190614792024-01-22 9:46:59221 days ago1705916819IN
0x24044745...E2ABfb518
0 ETH0.0009213915.43836575
Set Presale Succ...190614522024-01-22 9:41:35221 days ago1705916495IN
0x24044745...E2ABfb518
0 ETH0.0007696914.98191038
Contribute With ...190614032024-01-22 9:31:47221 days ago1705915907IN
0x24044745...E2ABfb518
0 ETH0.0033500816.29007286
Set Presale Open...190613982024-01-22 9:30:47221 days ago1705915847IN
0x24044745...E2ABfb518
0 ETH0.0019665215.66317627
Add New Round190613962024-01-22 9:30:23221 days ago1705915823IN
0x24044745...E2ABfb518
0 ETH0.0015111116.18985583
0x60806040190613202024-01-22 9:15:11221 days ago1705914911IN
 Create: CrowdfundingWithReferral
0 ETH0.0721251216.64644643

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CrowdfundingWithReferral

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-01-22
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

interface Oracle {
    function latestAnswer() external view returns (uint256);
}

// Interface for ERC20 tokens, defining standard functions.
interface IERC20 {
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function transfer(address to, uint256 value) external returns (bool);

    function balanceOf(address account) external view returns (uint256);
}

interface IERC20USDT {
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external;

    function transfer(address to, uint256 value) external;
}

// Interface for Wrapped Ether (WETH).
interface IWETH {
    function deposit() external payable;

    function withdraw(uint wad) external;
}

// Ownable contract providing basic authorization control.
contract Ownable {
    address public owner;

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

    // set owner to deployer
    constructor() {
        owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    // modifier to check if caller is owner
    modifier onlyOwner() {
        require(msg.sender == owner, "Caller is not owner");
        _;
    }

    // transfer ownership to new address
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "New owner is the zero address");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }
}

// ReentrancyGuard contract to prevent reentrant calls.
contract ReentrancyGuard {
    bool private _notEntered;

    constructor() {
        _notEntered = true;
    }

    modifier nonReentrant() {
        require(_notEntered, "ReentrancyGuard: reentrant call");
        _notEntered = false;
        _;
        _notEntered = true;
    }
}

// Crowdfunding contract with referral and airdrop features.
contract CrowdfundingWithReferral is Ownable, ReentrancyGuard {
    // Structure to store user information.
    struct User {
        address referrer;
        uint256 totalAirdrop;
        uint256 lastAirdropPhase;
        uint256 totalPurchasedTokens;
        uint256 totalContributionUSDT;
        uint256 totalContributionETH;
        uint256 totalCommissionUSDT;
        uint256 totalCommissionETH;
        uint256 totalCommissionDBTT;
    }

    struct Presale {
        uint256 priceUSDTRate;
        uint256 saleCapDBTT;
    }

    mapping(address => User) public users;
    mapping(uint256 => Presale) public contributionRound;

    // Addresses for USDT, WETH, and DBTT tokens.
    address public constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
    address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address public constant DBTT = 0xe97CAbCBa4C9bdf35b3321c98440F7a88C745aCf;
    address public serviceFeeReceiver;
    IWETH private constant weth = IWETH(WETH);
    Oracle public constant priceFeed =
        Oracle(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419);

    // Commission rates for the referral program.
    uint256[] public commissionRates;

    // Various configuration parameters.
    uint256 public referralDepth;
    uint256 public priceUSDTRate;
    uint256 public launchPriceUSDTRate = 1960;
    uint256 public nextPriceUSDTRate;
    uint256 public minUSDTContribution;
    uint256 public minETHContribution;
    uint256 public maxDBTTAllocation;
    uint256 public saleCapDBTT;
    uint256 public vestingInterval;

    // Presale status tracking variables.
    uint256 public successTimestamp;
    bool public isPresaleOpened;
    bool public isPresaleSuccess;
    bool public isPresaleCancelled;
    bool public isCommissionDBTT;

    // Counters
    uint256 public globalCommissionETH;
    uint256 public globalCommissionUSDT;
    uint256 public globalCommissionDBTT;
    uint256 public globalTotalAirdrop;
    uint256 public globalCommissionETHPaid;
    uint256 public globalCommissionUSDTPaid;
    uint256 public globalCommissionDBTTPaid;
    uint256 public globalTotalAirdropClaimed;
    uint256 public totalPurchasedDBTT;
    uint256 public totalRaisedUSDT;
    uint256 public totalRaisedETH;
    uint256 public totalPurchasedDBTTClaimed;
    uint256 public totalContributionRounds;
    uint256 public currentRound;
    uint256 public purchasedDBTTRound;
    uint256 public serviceFee;

    // Event for new contribution
    event NewContribution(
        address indexed contributor,
        uint256 amount,
        address indexed referrer
    );

    /////////////////////////////// GETTERS ///////////////////////////////

    // Retrieves the current price of ETH in USD
    function getETHPrice() public view returns (uint256) {
        return priceFeed.latestAnswer();
    }

    // retrieve global USDT value raised
    function getGlobalRaisedUSDT() public view returns (uint256) {
        //convert ETH to USDT for totalRaisedETH has 18 decimals, USDT 6 decimals and ETH price has 8 decimals
        uint256 ethToUSDT = ((totalRaisedETH * getETHPrice()) / 10 ** 20);
        return totalRaisedUSDT + ethToUSDT;
    }

    // Calculates the total commission based on commission rates.
    function getTotalCommission() public view returns (uint256) {
        uint256 totalCommission = 0;
        for (uint256 i = 0; i < commissionRates.length; i++) {
            totalCommission += commissionRates[i];
        }
        return totalCommission;
    }

    // Retrieves user details for a given address.
    function getUserDetails(
        address userAddress
    ) public view returns (User memory) {
        return users[userAddress];
    }

    // Determines the current vesting phase based on the timestamp.
    function getVestingPhase() public view returns (uint256) {
        if (vestingInterval > 0 && successTimestamp > 0) {
            uint256 vestingPhase = 0;
            if (block.timestamp >= successTimestamp + 4 * vestingInterval) {
                vestingPhase = 4;
            } else if (
                block.timestamp >= successTimestamp + 3 * vestingInterval
            ) {
                vestingPhase = 3;
            } else if (
                block.timestamp >= successTimestamp + 2 * vestingInterval
            ) {
                vestingPhase = 2;
            } else if (
                block.timestamp >= successTimestamp + 1 * vestingInterval
            ) {
                vestingPhase = 1;
            }
            return vestingPhase;
        } else return 0;
    }

    /////////////////////////////// SETTERS ///////////////////////////////

    // Sets the referrer for a specific contributor.
    function setReferrer(address contributor, address referrer) internal {
        require(referrer != contributor, "Cannot refer self");
        users[contributor].referrer = referrer;
    }

    // Sets airdrop amounts for a list of addresses.
    function setAirdropList(
        address[] calldata airdropList,
        uint256 airdropAmount
    ) external onlyOwner {
        require(!isPresaleSuccess && !isPresaleCancelled, "Presale is ended");
        require(
            airdropList.length < 251,
            "GAS Error: max airdrop limit is 251 addresses"
        );

        for (uint256 i = 0; i < airdropList.length; i++) {
            users[airdropList[i]].totalAirdrop += airdropAmount;
        }

        globalTotalAirdrop += airdropList.length * airdropAmount;
    }

    // Sets airdrop amount for an individual address.
    function setUserAirdrop(
        address userAddress,
        uint256 airdropAmount
    ) external onlyOwner {
        require(!isPresaleSuccess && !isPresaleCancelled, "Presale is ended");
        globalTotalAirdrop -= users[userAddress].totalAirdrop;
        users[userAddress].totalAirdrop = airdropAmount;
        globalTotalAirdrop += airdropAmount;
    }

    // Sets the referral depth and corresponding commission rates.
    function setReferral(
        uint256 _referralDepth,
        uint256[] calldata _commissionRates
    ) external onlyOwner {
        require(!isPresaleSuccess && !isPresaleCancelled, "Presale is ended");
        require(
            _commissionRates.length == _referralDepth,
            "Rates must have same depth"
        );
        referralDepth = _referralDepth;
        commissionRates = _commissionRates;
    }

    // Function to set vesting interval
    function setVestingInterval(uint256 _vestingInterval) external onlyOwner {
        require(!isPresaleSuccess && !isPresaleCancelled, "Presale is ended");
        vestingInterval = _vestingInterval;
    }

    // Function to set presale success
    function setPresaleSuccess(bool _isPresaleSuccess) external onlyOwner {
        require(!isPresaleSuccess && !isPresaleCancelled, "Presale is ended");
        if (_isPresaleSuccess) {
            isPresaleSuccess = true;
            successTimestamp = block.timestamp;
        } else {
            isPresaleCancelled = true;
        }
        isPresaleOpened = false;
    }

    // Function to set presale opened
    function setPresaleOpened() external onlyOwner {
        require(!isPresaleSuccess && !isPresaleCancelled, "Presale is ended");
        require(!isPresaleOpened, "Presale is already opened");
        isPresaleOpened = true;
        _startNewRound();
    }

    // Function to set commission DBTT
    function setCommissionDBTT(bool _isCommissionDBTT) external onlyOwner {
        require(!isPresaleSuccess && !isPresaleCancelled, "Presale is ended");
        isCommissionDBTT = _isCommissionDBTT;
    }

    function setPrice(uint256 _priceUSDTRate) external onlyOwner {
        require(!isPresaleSuccess && !isPresaleCancelled, "Presale is ended");
        priceUSDTRate = _priceUSDTRate;
    }

    // Function to set min USDT contribution
    function setMinUSDTContribution(
        uint256 _minUSDTContribution
    ) external onlyOwner {
        require(!isPresaleSuccess && !isPresaleCancelled, "Presale is ended");
        minUSDTContribution = _minUSDTContribution;
    }

    // Function to set min ETH contribution
    function setMinETHContribution(
        uint256 _minETHContribution
    ) external onlyOwner {
        require(!isPresaleSuccess && !isPresaleCancelled, "Presale is ended");
        minETHContribution = _minETHContribution;
    }

    // Function to set max DBTT allocation
    function setMaxAllocationDBTT(uint256 _maxAllocationDBTT) public onlyOwner {
        require(!isPresaleSuccess && !isPresaleCancelled, "Presale is ended");
        maxDBTTAllocation = _maxAllocationDBTT;
    }

    // Remove contribution limits
    function setRemoveContributionLimits() external onlyOwner {
        require(!isPresaleSuccess && !isPresaleCancelled, "Presale is ended");
        minUSDTContribution = 0;
        minETHContribution = 0;
        maxDBTTAllocation = 0;
    }

    function setRoundSaleCapDBTT(
        uint256 _round,
        uint256 _saleCapDBTT
    ) external onlyOwner {
        require(
            !isPresaleOpened && !isPresaleSuccess && !isPresaleCancelled,
            "Presale is already started"
        );
        require(_round > 0, "Round must be greater than 0");
        contributionRound[_round - 1].saleCapDBTT = _saleCapDBTT * 10 ** 18;
    }

    function setRoundPriceUSDTRate(
        uint256 _round,
        uint256 _priceUSDTRate
    ) external onlyOwner {
        require(
            !isPresaleOpened && !isPresaleSuccess && !isPresaleCancelled,
            "Presale is already started"
        );
        require(_round > 0, "Round must be greater than 0");
        contributionRound[_round - 1].priceUSDTRate = _priceUSDTRate;
    }

    function setServiceFee(
        uint256 _serviceFee,
        address _serviceFeeReceiver
    ) external onlyOwner {
        require(
            !isPresaleSuccess && !isPresaleCancelled,
            "Presale is already started"
        );
        serviceFee = _serviceFee;
        serviceFeeReceiver = _serviceFeeReceiver;
    }

    function setLaunchPrice(uint256 _launchPriceUSDTRate) external onlyOwner {
        require(_launchPriceUSDTRate > 0, "Price must be greater than 0");
        launchPriceUSDTRate = _launchPriceUSDTRate;
    }

    function _startNewRound() internal {
        require(totalContributionRounds > 0, "No round exists yet!");

        if (purchasedDBTTRound > 0) {
            purchasedDBTTRound = 0;
        }

        priceUSDTRate = contributionRound[currentRound].priceUSDTRate;
        saleCapDBTT = contributionRound[currentRound].saleCapDBTT;
        if (contributionRound[currentRound + 1].priceUSDTRate > 0) {
            nextPriceUSDTRate = contributionRound[currentRound + 1]
                .priceUSDTRate;
        } else {
            nextPriceUSDTRate = 0;
        }

        currentRound++;
    }

    function addNewRound(
        uint256 _saleCapDBTT,
        uint256 _priceUSDTRate
    ) external onlyOwner {
        require(
            !isPresaleOpened && !isPresaleSuccess && !isPresaleCancelled,
            "Presale is already started"
        );
        require(
            _saleCapDBTT > 0 && _priceUSDTRate > 0,
            "Sale cap and price must be greater than 0"
        );

        totalContributionRounds++;
        contributionRound[totalContributionRounds - 1].saleCapDBTT =
            _saleCapDBTT *
            10 ** 18;
        contributionRound[totalContributionRounds - 1]
            .priceUSDTRate = _priceUSDTRate;
    }

    /////////////////////////////// MAIN ///////////////////////////////

    function contributeWithETH(address referrer) external payable nonReentrant {
        require(!isPresaleSuccess && !isPresaleCancelled, "Presale is ended");
        require(isPresaleOpened, "Presale is closed");

        if (minETHContribution > 0) {
            require(
                msg.value >= minETHContribution,
                "Amount must be greater than min contribution"
            );
        } else {
            require(msg.value > 1000, "Amount must be greater than 1000 wei");
        }

        require(msg.value > 0, "Amount must be greater than 0");
        weth.deposit{value: msg.value}();

        users[msg.sender].totalContributionETH += msg.value;

        if (purchasedDBTTRound == saleCapDBTT) {
            if (currentRound < totalContributionRounds) {
                _startNewRound();
            } else {
                revert("Sale cap reached");
            }
        }

        uint256 allocation = ((msg.value * getETHPrice()) / priceUSDTRate) /
            10 ** 2;

        // maybe not here
        if (maxDBTTAllocation > 0) {
            require(
                users[msg.sender].totalPurchasedTokens + allocation <=
                    maxDBTTAllocation,
                "Amount must be less than max allocation"
            );
        }

        if (purchasedDBTTRound + allocation > saleCapDBTT) {
            if (currentRound < totalContributionRounds) {
                uint256 currentRoundDBTT = saleCapDBTT - purchasedDBTTRound;
                uint256 getSpent = (currentRoundDBTT * priceUSDTRate) /
                    10 ** 18;
                uint256 getUSDTInitial = (msg.value * getETHPrice()) / 10 ** 20;
                _startNewRound();
                uint256 remainingDBTT = ((getUSDTInitial - getSpent) *
                    10 ** 18) / priceUSDTRate;
                allocation = currentRoundDBTT + remainingDBTT;
                purchasedDBTTRound += remainingDBTT;
                require(purchasedDBTTRound <= saleCapDBTT, "Sale cap reached");
            } else {
                revert("Sale cap reached");
            }
        } else if (purchasedDBTTRound + allocation == saleCapDBTT) {
            if (currentRound < totalContributionRounds) {
                _startNewRound();
            } else {
                purchasedDBTTRound += allocation;
            }
        } else {
            purchasedDBTTRound += allocation;
        }

        users[msg.sender].totalPurchasedTokens += allocation;
        totalPurchasedDBTT += allocation;
        totalRaisedETH += msg.value;

        if (referrer != address(0)) {
            setReferrer(msg.sender, referrer);
        }

        // Distribute commissions (if applicable)
        if (referralDepth > 0) {
            distributeCommissions(msg.sender, WETH, msg.value);
        }

        emit NewContribution(msg.sender, msg.value, referrer);
    }

    // Function to contribute with ERC20 tokens
    function contributeWithToken(
        address token,
        uint256 amount,
        address referrer
    ) external nonReentrant {
        require(!isPresaleSuccess && !isPresaleCancelled, "Presale is ended");
        require(isPresaleOpened, "Presale is closed");

        if (minUSDTContribution > 0 && token == USDT) {
            require(
                amount >= minUSDTContribution,
                "Amount must be greater than min contribution"
            );
        } else if (token == USDT) {
            require(amount > 1000, "Amount must be greater than 1000 wei");
        }
        if (minETHContribution > 0 && token == WETH) {
            require(
                amount >= minETHContribution,
                "Amount must be greater than min contribution"
            );
        } else if (token == WETH) {
            require(amount > 1000, "Amount must be greater than 1000 wei");
        }
        require(amount > 0, "Amount must be greater than 0");
        require(
            IERC20(token).allowance(msg.sender, address(this)) >= amount,
            "Token allowance too low"
        );
        require(token == USDT || token == WETH, "ERC20 token not valid");

        if (token == USDT) {
            // Transfer tokens to this contract
            IERC20USDT(token).transferFrom(
                msg.sender,
                address(this),
                amount
            );
        } else {
            // Transfer tokens to this contract
            bool sent = IERC20(token).transferFrom(
                msg.sender,
                address(this),
                amount
            );
            require(sent, "Token transfer failed");
        }

        if (purchasedDBTTRound == saleCapDBTT) {
            if (currentRound < totalContributionRounds) {
                _startNewRound();
            } else {
                revert("Sale cap reached");
            }
        }

        uint256 allocation;
        if (token == USDT) {
            users[msg.sender].totalContributionUSDT += amount;
            allocation = (amount * 10 ** (18)) / priceUSDTRate;
            totalRaisedUSDT += amount;
        } else {
            users[msg.sender].totalContributionETH += amount;
            allocation = ((amount * getETHPrice()) / priceUSDTRate) / 10 ** 2;
            totalRaisedETH += amount;
        }

        if (maxDBTTAllocation > 0) {
            require(
                users[msg.sender].totalPurchasedTokens + allocation <=
                    maxDBTTAllocation,
                "Amount must be less than max allocation"
            );
        }

        if (purchasedDBTTRound + allocation > saleCapDBTT) {
            if (currentRound < totalContributionRounds) {
                uint256 currentRoundDBTT = saleCapDBTT - purchasedDBTTRound;
                uint256 getSpent = (currentRoundDBTT * priceUSDTRate) /
                    10 ** 18;
                uint256 getUSDTInitial;
                if (token == USDT) {
                    getUSDTInitial = amount;
                } else {
                    getUSDTInitial = (amount * getETHPrice()) / 10 ** 20;
                }
                _startNewRound();
                uint256 remainingDBTT = ((getUSDTInitial - getSpent) *
                    10 ** 18) / priceUSDTRate;
                allocation = currentRoundDBTT + remainingDBTT;
                purchasedDBTTRound += remainingDBTT;
                require(purchasedDBTTRound <= saleCapDBTT, "Sale cap reached");
            } else {
                revert("Sale cap reached");
            }
        } else if (purchasedDBTTRound + allocation == saleCapDBTT) {
            if (currentRound < totalContributionRounds) {
                _startNewRound();
            } else {
                purchasedDBTTRound += allocation;
            }
        } else {
            purchasedDBTTRound += allocation;
        }

        users[msg.sender].totalPurchasedTokens += allocation;
        totalPurchasedDBTT += allocation;

        if (referrer != address(0)) {
            setReferrer(msg.sender, referrer);
        }

        // Distribute commissions (if applicable)
        if (referralDepth > 0) {
            distributeCommissions(msg.sender, token, amount);
        }

        emit NewContribution(msg.sender, amount, referrer);
    }

    // Internal function to handle commission distribution
    function distributeCommissions(
        address contributor,
        address token,
        uint256 amount
    ) internal {
        address currentReferrer = users[contributor].referrer;

        for (uint256 i = 0; i < referralDepth; i++) {
            if (currentReferrer == address(0)) {
                break;
            }

            if (currentReferrer == contributor) {
                break;
            }

            uint256 commission = (amount * commissionRates[i]) / 1000;

            if (isCommissionDBTT && token == USDT) {
                uint256 commissionDBTT = (commission * 10 ** 18) /
                    priceUSDTRate;
                users[currentReferrer].totalCommissionDBTT += commissionDBTT;
                globalCommissionDBTT += commissionDBTT;
            } else if (isCommissionDBTT) {
                uint256 commissionDBTT = (commission * getETHPrice()) /
                    priceUSDTRate /
                    10 ** 2;
                users[currentReferrer].totalCommissionDBTT += commissionDBTT;
                globalCommissionDBTT += commissionDBTT;
            } else if (token == USDT) {
                users[currentReferrer].totalCommissionUSDT += commission;
                globalCommissionUSDT += commission;
            } else {
                users[currentReferrer].totalCommissionETH += commission;
                globalCommissionETH += commission;
            }

            // Move to the next referrer
            currentReferrer = users[currentReferrer].referrer;
        }
    }

    // Function to withdraw commissions
    function withdrawCommissions() external nonReentrant {
        require(isPresaleSuccess, "Claim not active");
        require(
            users[msg.sender].totalCommissionUSDT > 0 ||
                users[msg.sender].totalCommissionETH > 0 ||
                users[msg.sender].totalCommissionDBTT > 0,
            "No commissions to claim"
        );

        _withdrawCommissions();
    }

    // Function to withdraw commissions
    function _withdrawCommissions() internal {
        uint256 amountUSDT = users[msg.sender].totalCommissionUSDT;
        if (amountUSDT > 0) {
            users[msg.sender].totalCommissionUSDT = 0;
            IERC20USDT(USDT).transfer(msg.sender, amountUSDT);
            globalCommissionUSDTPaid += amountUSDT;
        }
        uint256 amountETH = users[msg.sender].totalCommissionETH;
        if (amountETH > 0) {
            users[msg.sender].totalCommissionETH = 0;
            bool sent = IERC20(WETH).transfer(msg.sender, amountETH);
            require(sent, "Token transfer failed");
            globalCommissionETHPaid += amountETH;
        }
        uint256 amountDBTT = users[msg.sender].totalCommissionDBTT;
        if (amountDBTT > 0) {
            users[msg.sender].totalCommissionDBTT = 0;
            bool sent = IERC20(DBTT).transfer(msg.sender, amountDBTT);
            require(sent, "Token transfer failed");
            globalCommissionDBTTPaid += amountDBTT;
        }
    }

    // Function to withdraw purchased tokens
    function claimTokens() external nonReentrant {
        require(isPresaleSuccess, "Claim not active");
        require(users[msg.sender].totalPurchasedTokens > 0, "Nothing to claim");
        _claimTokens();
    }

    function _claimTokens() internal {
        uint256 amount = users[msg.sender].totalPurchasedTokens;
        users[msg.sender].totalPurchasedTokens = 0;

        bool sent = IERC20(DBTT).transfer(msg.sender, amount);
        require(sent, "Token transfer failed");
        totalPurchasedDBTTClaimed += amount;
    }

    // Function to withdraw ETH
    function withdrawETH(uint256 _amount) external onlyOwner nonReentrant {
        uint256 amount = IERC20(WETH).balanceOf(address(this));
        require(amount >= _amount, "Not enough ETH to withdraw");
        require(
            amount - _amount > globalCommissionETH - globalCommissionETHPaid,
            "Not enough ETH to withdraw"
        );

        if (serviceFeeReceiver != address(0) && serviceFee > 0) {
            uint256 serviceFeeAmount = (_amount * serviceFee) / 1000;
            bool sentFees = IERC20(WETH).transfer(
                serviceFeeReceiver,
                serviceFeeAmount
            );
            require(sentFees, "ETH Token transfer failed");
            _amount -= serviceFeeAmount;
        }

        bool sent = IERC20(WETH).transfer(msg.sender, _amount);
        require(sent, "ETH Token transfer failed");
    }

    // Function to withdraw USDT
    function withdrawUSDT(uint256 _amount) external onlyOwner nonReentrant {
        uint256 amount = IERC20(USDT).balanceOf(address(this));
        require(amount >= _amount, "Not enough USDT to withdraw");
        require(
            amount - _amount > globalCommissionUSDT - globalCommissionUSDTPaid,
            "Not enough USDT to withdraw"
        );

        if (serviceFeeReceiver != address(0) && serviceFee > 0) {
            uint256 serviceFeeAmount = (_amount * serviceFee) / 1000;
            IERC20USDT(USDT).transfer(
                serviceFeeReceiver,
                serviceFeeAmount
            );
            _amount -= serviceFeeAmount;
        }

        IERC20USDT(USDT).transfer(msg.sender, _amount);
    }

    // Function to withdraw all USDT and all WETH
    function withdrawAll() external onlyOwner nonReentrant {
        require(isPresaleSuccess, "Presale is not completed");
        uint256 amountUSDT = IERC20(USDT).balanceOf(address(this));
        uint256 amountETH = IERC20(WETH).balanceOf(address(this));
        require(
            amountUSDT > globalCommissionUSDT - globalCommissionUSDTPaid,
            "Not enough USDT to withdraw"
        );
        require(
            amountETH > globalCommissionETH - globalCommissionETHPaid,
            "Not enough ETH to withdraw"
        );

        amountUSDT -= globalCommissionUSDT - globalCommissionUSDTPaid;
        amountETH -= globalCommissionETH - globalCommissionETHPaid;

        if (serviceFeeReceiver != address(0) && serviceFee > 0) {
            uint256 serviceFeeAmountUSDT = (amountUSDT * serviceFee) / 1000;
            uint256 serviceFeeAmountETH = (amountETH * serviceFee) / 1000;
            IERC20USDT(USDT).transfer(
                serviceFeeReceiver,
                serviceFeeAmountUSDT
            );
            bool sentFeesETH = IERC20(WETH).transfer(
                serviceFeeReceiver,
                serviceFeeAmountETH
            );
            require(sentFeesETH, "ETH Token transfer failed");
            amountUSDT -= serviceFeeAmountUSDT;
            amountETH -= serviceFeeAmountETH;
        }

        IERC20USDT(USDT).transfer(msg.sender, amountUSDT);
        bool sentETH = IERC20(WETH).transfer(msg.sender, amountETH);
        require(sentETH, "ETH Token transfer failed");
    }

    // Function to withdraw DBTT
    function withdrawDBTT() external onlyOwner nonReentrant {
        uint256 amount = IERC20(DBTT).balanceOf(address(this));
        if (isPresaleSuccess) {
            require(
                amount >
                    globalCommissionDBTT +
                        totalPurchasedDBTT +
                        globalTotalAirdrop -
                        globalCommissionDBTTPaid -
                        totalPurchasedDBTTClaimed -
                        globalTotalAirdropClaimed,
                "Not enough DBTT to withdraw"
            );
            amount -=
                globalCommissionDBTT +
                totalPurchasedDBTT +
                globalTotalAirdrop -
                globalCommissionDBTTPaid -
                totalPurchasedDBTTClaimed -
                globalTotalAirdropClaimed;
            bool sent = IERC20(DBTT).transfer(msg.sender, amount);
            require(sent, "DBTT Token transfer failed");
        } else if (isPresaleCancelled && amount > 0) {
            bool sent = IERC20(DBTT).transfer(msg.sender, amount);
            require(sent, "DBTT Token transfer failed");
        } else revert("No DBTT to withdraw");
    }

    // refund USDT or WETH to user
    function refund() external nonReentrant {
        require(isPresaleCancelled, "Presale has not been cancelled");
        uint256 amountUSDT = users[msg.sender].totalContributionUSDT;
        uint256 amountETH = users[msg.sender].totalContributionETH;
        require(
            amountUSDT > 0 || amountETH > 0,
            "Amount must be greater than 0"
        );
        users[msg.sender].totalContributionUSDT = 0;
        users[msg.sender].totalContributionETH = 0;
        if (amountUSDT > 0) {
            IERC20USDT(USDT).transfer(msg.sender, amountUSDT);
        }
        if (amountETH > 0) {
            bool sent = IERC20(WETH).transfer(msg.sender, amountETH);
            require(sent, "ETH Token transfer failed");
        }
    }

    // claim airdrop with vesting
    function claimAirdrop() external nonReentrant {
        require(isPresaleSuccess, "Claim not active");
        require(
            users[msg.sender].lastAirdropPhase <= 4,
            "Airdrop already claimed"
        );
        if (vestingInterval > 0) {
            require(
                getVestingPhase() > users[msg.sender].lastAirdropPhase,
                "Nothing to claim yet"
            );
            require(users[msg.sender].totalAirdrop > 0, "No airdrop for user");
        }

        _claimAirdrop();
    }

    function _claimAirdrop() internal {
        uint256 amount = users[msg.sender].totalAirdrop;
        if (vestingInterval > 0) {
            uint256 vestingPhase = getVestingPhase();
            uint256 vestingAmount = (amount *
                (vestingPhase - users[msg.sender].lastAirdropPhase)) / 4;
            users[msg.sender].lastAirdropPhase = vestingPhase;
            bool sent = IERC20(DBTT).transfer(msg.sender, vestingAmount);
            require(sent, "Token transfer failed");
            globalTotalAirdropClaimed += vestingAmount;
        } else {
            bool sent = IERC20(DBTT).transfer(msg.sender, amount);
            require(sent, "Token transfer failed");
            users[msg.sender].lastAirdropPhase = 4;
            globalTotalAirdropClaimed += amount;
        }
    }

    function claim() external nonReentrant {
        require(isPresaleSuccess, "Claim not active");
        require(
            users[msg.sender].totalCommissionUSDT > 0 ||
                users[msg.sender].totalCommissionETH > 0 ||
                users[msg.sender].totalCommissionDBTT > 0 ||
                users[msg.sender].totalPurchasedTokens > 0 ||
                (users[msg.sender].lastAirdropPhase <= 4 &&
                    getVestingPhase() > users[msg.sender].lastAirdropPhase &&
                    users[msg.sender].totalAirdrop > 0),
            "No commissions to claim"
        );
        if (
            users[msg.sender].totalCommissionUSDT > 0 ||
            users[msg.sender].totalCommissionETH > 0 ||
            users[msg.sender].totalCommissionDBTT > 0
        ) {
            _withdrawCommissions();
        }
        if (users[msg.sender].totalPurchasedTokens > 0) {
            _claimTokens();
        }
        if (
            users[msg.sender].lastAirdropPhase <= 4 &&
            getVestingPhase() > users[msg.sender].lastAirdropPhase &&
            users[msg.sender].totalAirdrop > 0
        ) {
            _claimAirdrop();
        }
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contributor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"referrer","type":"address"}],"name":"NewContribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"DBTT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleCapDBTT","type":"uint256"},{"internalType":"uint256","name":"_priceUSDTRate","type":"uint256"}],"name":"addNewRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commissionRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"}],"name":"contributeWithETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"name":"contributeWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"contributionRound","outputs":[{"internalType":"uint256","name":"priceUSDTRate","type":"uint256"},{"internalType":"uint256","name":"saleCapDBTT","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getETHPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGlobalRaisedUSDT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCommission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getUserDetails","outputs":[{"components":[{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"totalAirdrop","type":"uint256"},{"internalType":"uint256","name":"lastAirdropPhase","type":"uint256"},{"internalType":"uint256","name":"totalPurchasedTokens","type":"uint256"},{"internalType":"uint256","name":"totalContributionUSDT","type":"uint256"},{"internalType":"uint256","name":"totalContributionETH","type":"uint256"},{"internalType":"uint256","name":"totalCommissionUSDT","type":"uint256"},{"internalType":"uint256","name":"totalCommissionETH","type":"uint256"},{"internalType":"uint256","name":"totalCommissionDBTT","type":"uint256"}],"internalType":"struct CrowdfundingWithReferral.User","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVestingPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalCommissionDBTT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalCommissionDBTTPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalCommissionETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalCommissionETHPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalCommissionUSDT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalCommissionUSDTPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalTotalAirdrop","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalTotalAirdropClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCommissionDBTT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleCancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleSuccess","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchPriceUSDTRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDBTTAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minETHContribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minUSDTContribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextPriceUSDTRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceFeed","outputs":[{"internalType":"contract Oracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceUSDTRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"purchasedDBTTRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralDepth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleCapDBTT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"serviceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"serviceFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropList","type":"address[]"},{"internalType":"uint256","name":"airdropAmount","type":"uint256"}],"name":"setAirdropList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isCommissionDBTT","type":"bool"}],"name":"setCommissionDBTT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_launchPriceUSDTRate","type":"uint256"}],"name":"setLaunchPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxAllocationDBTT","type":"uint256"}],"name":"setMaxAllocationDBTT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minETHContribution","type":"uint256"}],"name":"setMinETHContribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minUSDTContribution","type":"uint256"}],"name":"setMinUSDTContribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPresaleOpened","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPresaleSuccess","type":"bool"}],"name":"setPresaleSuccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceUSDTRate","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_referralDepth","type":"uint256"},{"internalType":"uint256[]","name":"_commissionRates","type":"uint256[]"}],"name":"setReferral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRemoveContributionLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"uint256","name":"_priceUSDTRate","type":"uint256"}],"name":"setRoundPriceUSDTRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_round","type":"uint256"},{"internalType":"uint256","name":"_saleCapDBTT","type":"uint256"}],"name":"setRoundSaleCapDBTT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_serviceFee","type":"uint256"},{"internalType":"address","name":"_serviceFeeReceiver","type":"address"}],"name":"setServiceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"airdropAmount","type":"uint256"}],"name":"setUserAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vestingInterval","type":"uint256"}],"name":"setVestingInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"successTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalContributionRounds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPurchasedDBTT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPurchasedDBTTClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRaisedETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRaisedUSDT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"totalAirdrop","type":"uint256"},{"internalType":"uint256","name":"lastAirdropPhase","type":"uint256"},{"internalType":"uint256","name":"totalPurchasedTokens","type":"uint256"},{"internalType":"uint256","name":"totalContributionUSDT","type":"uint256"},{"internalType":"uint256","name":"totalContributionETH","type":"uint256"},{"internalType":"uint256","name":"totalCommissionUSDT","type":"uint256"},{"internalType":"uint256","name":"totalCommissionETH","type":"uint256"},{"internalType":"uint256","name":"totalCommissionDBTT","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawCommissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDBTT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawUSDT","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526107a8600755348015610015575f80fd5b505f80546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35f805460ff60a01b1916600160a01b179055614c7b806100735f395ff3fe608060405260043610610416575f3560e01c80638da5cb5b11610220578063c54e44eb11610129578063e63b2f9f116100b3578063f16fbb9a11610078578063f16fbb9a14610c3e578063f1acfd9714610c65578063f2fde38b14610c84578063f71e4bef14610ca3578063ff5a40d514610cb8575f80fd5b8063e63b2f9f14610bae578063e9d8bddd14610bcd578063ea260c0e14610be1578063f0f75bc214610c00578063f14210a614610c1f575f80fd5b8063cf90dbbc116100f9578063cf90dbbc14610b31578063d476f33414610b46578063e02482e814610b65578063e34d1e6914610b85578063e47888bf14610b99575f80fd5b8063c54e44eb14610a47578063c7b8f8ee14610a6e578063cc3d967b14610a83578063cf607eaa14610b12575f80fd5b8063ab59778e116101aa578063b8e50cab1161017a578063b8e50cab146109cb578063ba0c6291146109e0578063ba65c058146109ff578063bd61cb3314610a14578063bf764a0b14610a28575f80fd5b8063ab59778e1461096e578063ad5c464814610982578063ade7d887146109a2578063aedcc93e146109b6575f80fd5b8063a0c0d95c116101f0578063a0c0d95c1461085e578063a106bd8714610873578063a23c50d214610888578063a607a8d91461089d578063a87430ba146108b1575f80fd5b80638da5cb5b146107ed57806391b7f5ed1461080b578063928085d81461082a5780639e12a4a31461083f575f80fd5b80634bd0f2a2116103225780636fba10b9116102ac578063853828b61161027c578063853828b61461077b5780638a19c8bc1461078f5780638abdf5aa146107a45780638beb7de8146107b95780638d13be92146107ce575f80fd5b80636fba10b914610715578063723931771461072a578063741bef1a1461073f5780637620c4ec14610766575f80fd5b8063590e1ae3116102f2578063590e1ae3146106695780635b88349d1461067d5780635e109b391461069157806366eb505d146106b05780636d37678c146106ce575f80fd5b80634bd0f2a21461060e5780634d43c747146106215780634e71d92d1461064057806351b4efb214610654575f80fd5b80632675249b116103a357806333339c8f1161037357806333339c8f146105925780633e1c765d146105a75780633ea521ef146105c65780634228ff04146105e557806348c54b9d146105fa575f80fd5b80632675249b1461051d5780632b9d6d23146105325780632e06ca061461054757806331e5901b1461057e575f80fd5b8063179857ce116103e9578063179857ce1461049a57806318e52bcc146104bb5780631b23146d146104da5780631c05e363146104ef578063244b9de314610508575f80fd5b806304a44fe01461041a5780630cbdfc6a1461044e57806316dd5d5f146104705780631724e54314610485575b5f80fd5b348015610425575f80fd5b50600f546104399062010000900460ff1681565b60405190151581526020015b60405180910390f35b348015610459575f80fd5b50610462610cd7565b604051908152602001610445565b34801561047b575f80fd5b5061046260125481565b348015610490575f80fd5b5061046260105481565b3480156104a5575f80fd5b506104b96104b436600461465b565b610d18565b005b3480156104c6575f80fd5b506104b96104d5366004614694565b61155e565b3480156104e5575f80fd5b5061046260075481565b3480156104fa575f80fd5b50600f546104399060ff1681565b348015610513575f80fd5b5061046260165481565b348015610528575f80fd5b5061046260195481565b34801561053d575f80fd5b50610462600b5481565b348015610552575f80fd5b50600354610566906001600160a01b031681565b6040516001600160a01b039091168152602001610445565b348015610589575f80fd5b506104626115c9565b34801561059d575f80fd5b5061046260135481565b3480156105b2575f80fd5b506104b96105c13660046146ab565b611618565b3480156105d1575f80fd5b506104b96105e0366004614694565b6116e9565b3480156105f0575f80fd5b50610462600e5481565b348015610605575f80fd5b506104b961194e565b6104b961061c3660046146d3565b611a16565b34801561062c575f80fd5b506104b961063b366004614700565b611ea4565b34801561064b575f80fd5b506104b9611f28565b34801561065f575f80fd5b5061046260115481565b348015610674575f80fd5b506104b9612163565b348015610688575f80fd5b506104b9612368565b34801561069c575f80fd5b506104b96106ab366004614763565b6124e8565b3480156106bb575f80fd5b50600f5461043990610100900460ff1681565b3480156106d9575f80fd5b506107006106e8366004614694565b60026020525f90815260409020805460019091015482565b60408051928352602083019190915201610445565b348015610720575f80fd5b50610462600a5481565b348015610735575f80fd5b5061046260065481565b34801561074a575f80fd5b50610566735f4ec3df9cbd43714fe2740f5e3616155c5b841981565b348015610771575f80fd5b50610462600c5481565b348015610786575f80fd5b506104b9612656565b34801561079a575f80fd5b50610462601d5481565b3480156107af575f80fd5b50610462601f5481565b3480156107c4575f80fd5b5061046260155481565b3480156107d9575f80fd5b506104b96107e83660046147ab565b612aa9565b3480156107f8575f80fd5b505f54610566906001600160a01b031681565b348015610816575f80fd5b506104b9610825366004614694565b612b36565b348015610835575f80fd5b50610462601e5481565b34801561084a575f80fd5b506104b96108593660046147d5565b612ba1565b348015610869575f80fd5b50610462601c5481565b34801561087e575f80fd5b5061046260085481565b348015610893575f80fd5b5061046260145481565b3480156108a8575f80fd5b50610462612c6d565b3480156108bc575f80fd5b506109206108cb3660046146d3565b600160208190525f91825260409091208054918101546002820154600383015460048401546005850154600686015460078701546008909701546001600160a01b039098169795969495939492939192909189565b604080516001600160a01b03909a168a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610445565b348015610979575f80fd5b506104b9612ce7565b34801561098d575f80fd5b506105665f80516020614c2683398151915281565b3480156109ad575f80fd5b506104b9613025565b3480156109c1575f80fd5b5061046260175481565b3480156109d6575f80fd5b50610462600d5481565b3480156109eb575f80fd5b506104b96109fa36600461481d565b61309b565b348015610a0a575f80fd5b5061046260095481565b348015610a1f575f80fd5b506104b9613182565b348015610a33575f80fd5b506104b9610a42366004614694565b613252565b348015610a52575f80fd5b5061056673dac17f958d2ee523a2206206994597c13d831ec781565b348015610a79575f80fd5b5061046260055481565b348015610a8e575f80fd5b50610aa2610a9d3660046146d3565b6132bd565b604051610445919081516001600160a01b031681526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0828101519082015260c0808301519082015260e0808301519082015261010091820151918101919091526101200190565b348015610b1d575f80fd5b506104b9610b2c366004614694565b61338c565b348015610b3c575f80fd5b5061046260185481565b348015610b51575f80fd5b506104b9610b6036600461481d565b613409565b348015610b70575f80fd5b50600f54610439906301000000900460ff1681565b348015610b90575f80fd5b506104b961354a565b348015610ba4575f80fd5b50610462601b5481565b348015610bb9575f80fd5b506104b9610bc8366004614694565b61363d565b348015610bd8575f80fd5b506104626136a8565b348015610bec575f80fd5b506104b9610bfb36600461481d565b61376c565b348015610c0b575f80fd5b506104b9610c1a366004614694565b613867565b348015610c2a575f80fd5b506104b9610c39366004614694565b6138d2565b348015610c49575f80fd5b5061056673e97cabcba4c9bdf35b3321c98440f7a88c745acf81565b348015610c70575f80fd5b506104b9610c7f366004614700565b613b88565b348015610c8f575f80fd5b506104b9610c9e3660046146d3565b613c2b565b348015610cae575f80fd5b50610462601a5481565b348015610cc3575f80fd5b50610462610cd2366004614694565b613d03565b5f8068056bc75e2d63100000610ceb612c6d565b601a54610cf89190614851565b610d02919061486e565b905080601954610d12919061488d565b91505090565b5f54600160a01b900460ff16610d495760405162461bcd60e51b8152600401610d40906148a0565b60405180910390fd5b5f805460ff60a01b19169055600f54610100900460ff16158015610d765750600f5462010000900460ff16155b610d925760405162461bcd60e51b8152600401610d40906148d7565b600f5460ff16610dd85760405162461bcd60e51b8152602060048201526011602482015270141c995cd85b19481a5cc818db1bdcd959607a1b6044820152606401610d40565b5f600954118015610e0557506001600160a01b03831673dac17f958d2ee523a2206206994597c13d831ec7145b15610e3157600954821015610e2c5760405162461bcd60e51b8152600401610d4090614901565b610e77565b73dac17f958d2ee523a2206206994597c13d831ec6196001600160a01b03841601610e77576103e88211610e775760405162461bcd60e51b8152600401610d409061494d565b5f600a54118015610e9d57506001600160a01b0383165f80516020614c26833981519152145b15610ec957600a54821015610ec45760405162461bcd60e51b8152600401610d4090614901565b610f0f565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc1196001600160a01b03841601610f0f576103e88211610f0f5760405162461bcd60e51b8152600401610d409061494d565b5f8211610f2e5760405162461bcd60e51b8152600401610d4090614991565b604051636eb1769f60e11b815233600482015230602482015282906001600160a01b0385169063dd62ed3e90604401602060405180830381865afa158015610f78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f9c91906149c8565b1015610fea5760405162461bcd60e51b815260206004820152601760248201527f546f6b656e20616c6c6f77616e636520746f6f206c6f770000000000000000006044820152606401610d40565b6001600160a01b03831673dac17f958d2ee523a2206206994597c13d831ec7148061102a57506001600160a01b0383165f80516020614c26833981519152145b61106e5760405162461bcd60e51b8152602060048201526015602482015274115490cc8c081d1bdad95b881b9bdd081d985b1a59605a1b6044820152606401610d40565b73dac17f958d2ee523a2206206994597c13d831ec6196001600160a01b038416016110f9576040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038416906323b872dd906064015f604051808303815f87803b1580156110de575f80fd5b505af11580156110f0573d5f803e3d5ffd5b50505050611190565b6040516323b872dd60e01b8152336004820152306024820152604481018390525f906001600160a01b038516906323b872dd906064016020604051808303815f875af115801561114b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116f91906149df565b90508061118e5760405162461bcd60e51b8152600401610d40906149fa565b505b600c54601e54036111cc57601c54601d5410156111b4576111af613d22565b6111cc565b60405162461bcd60e51b8152600401610d4090614a29565b5f73dac17f958d2ee523a2206206994597c13d831ec6196001600160a01b0385160161125557335f908152600160205260408120600401805485929061121390849061488d565b909155505060065461122d84670de0b6b3a7640000614851565b611237919061486e565b90508260195f82825461124a919061488d565b909155506112c09050565b335f908152600160205260408120600501805485929061127690849061488d565b9091555050600654606490611289612c6d565b6112939086614851565b61129d919061486e565b6112a7919061486e565b905082601a5f8282546112ba919061488d565b90915550505b600b541561130657600b54335f908152600160205260409020600301546112e890839061488d565b11156113065760405162461bcd60e51b8152600401610d4090614a53565b600c5481601e54611317919061488d565b111561143a57601c54601d5410156111b4575f601e54600c5461133a9190614a9a565b90505f670de0b6b3a7640000600654836113549190614851565b61135e919061486e565b90505f73dac17f958d2ee523a2206206994597c13d831ec6196001600160a01b0388160161138d5750846113b6565b68056bc75e2d6310000061139f612c6d565b6113a99088614851565b6113b3919061486e565b90505b6113be613d22565b6006545f906113cd8484614a9a565b6113df90670de0b6b3a7640000614851565b6113e9919061486e565b90506113f5818561488d565b945080601e5f828254611408919061488d565b9091555050600c54601e5411156114315760405162461bcd60e51b8152600401610d4090614a29565b5050505061149c565b600c5481601e5461144b919061488d565b0361148557601c54601d54101561146957611464613d22565b61149c565b80601e5f82825461147a919061488d565b9091555061149c9050565b80601e5f828254611496919061488d565b90915550505b335f90815260016020526040812060030180548392906114bd90849061488d565b925050819055508060185f8282546114d5919061488d565b90915550506001600160a01b038216156114f3576114f33383613e01565b6005541561150657611506338585613e83565b6040518381526001600160a01b0383169033907f63b0da8d3b6d4f2d3d607e4bf412a85e661e29faa765dc3ff5617c00959828059060200160405180910390a350505f805460ff60a01b1916600160a01b1790555050565b5f546001600160a01b031633146115875760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff161580156115a85750600f5462010000900460ff16155b6115c45760405162461bcd60e51b8152600401610d40906148d7565b600b55565b5f80805b60045481101561161257600481815481106115ea576115ea614ada565b905f5260205f200154826115fe919061488d565b91508061160a81614aee565b9150506115cd565b50919050565b5f546001600160a01b031633146116415760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff161580156116625750600f5462010000900460ff16155b61167e5760405162461bcd60e51b8152600401610d40906148d7565b6001600160a01b0382165f9081526001602081905260408220015460138054919290916116ac908490614a9a565b90915550506001600160a01b0382165f908152600160208190526040822001829055601380548392906116e090849061488d565b90915550505050565b5f546001600160a01b031633146117125760405162461bcd60e51b8152600401610d4090614aad565b5f54600160a01b900460ff1661173a5760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b191681556040516370a0823160e01b815230600482015273dac17f958d2ee523a2206206994597c13d831ec7906370a0823190602401602060405180830381865afa158015611793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117b791906149c8565b9050818110156117d95760405162461bcd60e51b8152600401610d4090614b06565b6015546011546117e99190614a9a565b6117f38383614a9a565b116118105760405162461bcd60e51b8152600401610d4090614b06565b6003546001600160a01b03161580159061182b57505f601f54115b156118d2575f6103e8601f54846118429190614851565b61184c919061486e565b60035460405163a9059cbb60e01b815291925073dac17f958d2ee523a2206206994597c13d831ec79163a9059cbb91611895916001600160a01b03909116908590600401614b3d565b5f604051808303815f87803b1580156118ac575f80fd5b505af11580156118be573d5f803e3d5ffd5b5050505080836118ce9190614a9a565b9250505b60405163a9059cbb60e01b815273dac17f958d2ee523a2206206994597c13d831ec79063a9059cbb9061190b9033908690600401614b3d565b5f604051808303815f87803b158015611922575f80fd5b505af1158015611934573d5f803e3d5ffd5b50505f805460ff60a01b1916600160a01b17905550505050565b5f54600160a01b900460ff166119765760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b19169055600f54610100900460ff166119a95760405162461bcd60e51b8152600401610d4090614b56565b335f908152600160205260409020600301546119fa5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610d40565b611a026140df565b5f805460ff60a01b1916600160a01b179055565b5f54600160a01b900460ff16611a3e5760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b19169055600f54610100900460ff16158015611a6b5750600f5462010000900460ff16155b611a875760405162461bcd60e51b8152600401610d40906148d7565b600f5460ff16611acd5760405162461bcd60e51b8152602060048201526011602482015270141c995cd85b19481a5cc818db1bdcd959607a1b6044820152606401610d40565b600a5415611afc57600a54341015611af75760405162461bcd60e51b8152600401610d4090614901565b611b1d565b6103e83411611b1d5760405162461bcd60e51b8152600401610d409061494d565b5f3411611b3c5760405162461bcd60e51b8152600401610d4090614991565b5f80516020614c268339815191526001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611b82575f80fd5b505af1158015611b94573d5f803e3d5ffd5b5050335f9081526001602052604081206005018054349550909350909150611bbd90849061488d565b9091555050600c54601e5403611be157601c54601d5410156111b457611be1613d22565b5f6064600654611bef612c6d565b611bf99034614851565b611c03919061486e565b611c0d919061486e565b600b5490915015611c5657600b54335f90815260016020526040902060030154611c3890839061488d565b1115611c565760405162461bcd60e51b8152600401610d4090614a53565b600c5481601e54611c67919061488d565b1115611d5d57601c54601d5410156111b4575f601e54600c54611c8a9190614a9a565b90505f670de0b6b3a764000060065483611ca49190614851565b611cae919061486e565b90505f68056bc75e2d63100000611cc3612c6d565b611ccd9034614851565b611cd7919061486e565b9050611ce1613d22565b6006545f90611cf08484614a9a565b611d0290670de0b6b3a7640000614851565b611d0c919061486e565b9050611d18818561488d565b945080601e5f828254611d2b919061488d565b9091555050600c54601e541115611d545760405162461bcd60e51b8152600401610d4090614a29565b50505050611dbf565b600c5481601e54611d6e919061488d565b03611da857601c54601d541015611d8c57611d87613d22565b611dbf565b80601e5f828254611d9d919061488d565b90915550611dbf9050565b80601e5f828254611db9919061488d565b90915550505b335f9081526001602052604081206003018054839290611de090849061488d565b925050819055508060185f828254611df8919061488d565b9250508190555034601a5f828254611e10919061488d565b90915550506001600160a01b03821615611e2e57611e2e3383613e01565b60055415611e4e57611e4e335f80516020614c2683398151915234613e83565b6040513481526001600160a01b0383169033907f63b0da8d3b6d4f2d3d607e4bf412a85e661e29faa765dc3ff5617c00959828059060200160405180910390a350505f805460ff60a01b1916600160a01b179055565b5f546001600160a01b03163314611ecd5760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff16158015611eee5750600f5462010000900460ff16155b611f0a5760405162461bcd60e51b8152600401610d40906148d7565b600f805491151563010000000263ff00000019909216919091179055565b5f54600160a01b900460ff16611f505760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b19169055600f54610100900460ff16611f835760405162461bcd60e51b8152600401610d4090614b56565b335f90815260016020526040902060060154151580611fb25750335f9081526001602052604090206007015415155b80611fcd5750335f9081526001602052604090206008015415155b80611fe85750335f9081526001602052604090206003015415155b806120445750335f908152600160205260409020600201546004108015906120275750335f908152600160205260409020600201546120256136a8565b115b80156120445750335f908152600160208190526040909120015415155b61208a5760405162461bcd60e51b81526020600482015260176024820152764e6f20636f6d6d697373696f6e7320746f20636c61696d60481b6044820152606401610d40565b335f908152600160205260409020600601541515806120b95750335f9081526001602052604090206007015415155b806120d45750335f9081526001602052604090206008015415155b156120e1576120e161419f565b335f9081526001602052604090206003015415612100576121006140df565b335f908152600160205260409020600201546004108015906121395750335f908152600160205260409020600201546121376136a8565b115b80156121565750335f908152600160208190526040909120015415155b15611a0257611a026143fb565b5f54600160a01b900460ff1661218b5760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b19169055600f5462010000900460ff166121ef5760405162461bcd60e51b815260206004820152601e60248201527f50726573616c6520686173206e6f74206265656e2063616e63656c6c656400006044820152606401610d40565b335f90815260016020526040902060048101546005909101548115158061221557505f81115b6122315760405162461bcd60e51b8152600401610d4090614991565b335f908152600160205260408120600481018290556005015581156122b75760405163a9059cbb60e01b815273dac17f958d2ee523a2206206994597c13d831ec79063a9059cbb906122899033908690600401614b3d565b5f604051808303815f87803b1580156122a0575f80fd5b505af11580156122b2573d5f803e3d5ffd5b505050505b80156123525760405163a9059cbb60e01b81525f905f80516020614c268339815191529063a9059cbb906122f19033908690600401614b3d565b6020604051808303815f875af115801561230d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061233191906149df565b9050806123505760405162461bcd60e51b8152600401610d4090614b80565b505b50505f805460ff60a01b1916600160a01b179055565b5f54600160a01b900460ff166123905760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b19169055600f54610100900460ff166123c35760405162461bcd60e51b8152600401610d4090614b56565b335f90815260016020526040902060020154600410156124255760405162461bcd60e51b815260206004820152601760248201527f41697264726f7020616c726561647920636c61696d65640000000000000000006044820152606401610d40565b600d54156124e057335f908152600160205260409020600201546124476136a8565b1161248b5760405162461bcd60e51b8152602060048201526014602482015273139bdd1a1a5b99c81d1bc818db185a5b481e595d60621b6044820152606401610d40565b335f90815260016020819052604090912001546124e05760405162461bcd60e51b815260206004820152601360248201527227379030b4b9323937b8103337b9103ab9b2b960691b6044820152606401610d40565b611a026143fb565b5f546001600160a01b031633146125115760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff161580156125325750600f5462010000900460ff16155b61254e5760405162461bcd60e51b8152600401610d40906148d7565b60fb82106125b45760405162461bcd60e51b815260206004820152602d60248201527f474153204572726f723a206d61782061697264726f70206c696d69742069732060448201526c3235312061646472657373657360981b6064820152608401610d40565b5f5b82811015612631578160015f8686858181106125d4576125d4614ada565b90506020020160208101906125e991906146d3565b6001600160a01b03166001600160a01b031681526020019081526020015f206001015f828254612619919061488d565b9091555081905061262981614aee565b9150506125b6565b5061263c8183614851565b60135f82825461264c919061488d565b9091555050505050565b5f546001600160a01b0316331461267f5760405162461bcd60e51b8152600401610d4090614aad565b5f54600160a01b900460ff166126a75760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b19169055600f54610100900460ff1661270a5760405162461bcd60e51b815260206004820152601860248201527f50726573616c65206973206e6f7420636f6d706c6574656400000000000000006044820152606401610d40565b6040516370a0823160e01b81523060048201525f9073dac17f958d2ee523a2206206994597c13d831ec7906370a0823190602401602060405180830381865afa158015612759573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061277d91906149c8565b6040516370a0823160e01b81523060048201529091505f905f80516020614c26833981519152906370a0823190602401602060405180830381865afa1580156127c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127ec91906149c8565b90506015546011546127fe9190614a9a565b821161281c5760405162461bcd60e51b8152600401610d4090614b06565b60145460105461282c9190614a9a565b811161284a5760405162461bcd60e51b8152600401610d4090614bb7565b60155460115461285a9190614a9a565b6128649083614a9a565b91506014546010546128769190614a9a565b6128809082614a9a565b6003549091506001600160a01b03161580159061289e57505f601f54115b15612a0f575f6103e8601f54846128b59190614851565b6128bf919061486e565b90505f6103e8601f54846128d39190614851565b6128dd919061486e565b60035460405163a9059cbb60e01b815291925073dac17f958d2ee523a2206206994597c13d831ec79163a9059cbb91612926916001600160a01b03909116908690600401614b3d565b5f604051808303815f87803b15801561293d575f80fd5b505af115801561294f573d5f803e3d5ffd5b505060035460405163a9059cbb60e01b81525f93505f80516020614c26833981519152925063a9059cbb91612994916001600160a01b03909116908690600401614b3d565b6020604051808303815f875af11580156129b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129d491906149df565b9050806129f35760405162461bcd60e51b8152600401610d4090614b80565b6129fd8386614a9a565b9450612a098285614a9a565b93505050505b60405163a9059cbb60e01b815273dac17f958d2ee523a2206206994597c13d831ec79063a9059cbb90612a489033908690600401614b3d565b5f604051808303815f87803b158015612a5f575f80fd5b505af1158015612a71573d5f803e3d5ffd5b505060405163a9059cbb60e01b81525f92505f80516020614c26833981519152915063a9059cbb906122f19033908690600401614b3d565b5f546001600160a01b03163314612ad25760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff16158015612af35750600f5462010000900460ff16155b612b0f5760405162461bcd60e51b8152600401610d4090614bee565b601f91909155600380546001600160a01b0319166001600160a01b03909216919091179055565b5f546001600160a01b03163314612b5f5760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff16158015612b805750600f5462010000900460ff16155b612b9c5760405162461bcd60e51b8152600401610d40906148d7565b600655565b5f546001600160a01b03163314612bca5760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff16158015612beb5750600f5462010000900460ff16155b612c075760405162461bcd60e51b8152600401610d40906148d7565b808314612c565760405162461bcd60e51b815260206004820152601a60248201527f5261746573206d75737420686176652073616d652064657074680000000000006044820152606401610d40565b6005839055612c67600483836145e8565b50505050565b5f735f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cbe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ce291906149c8565b905090565b5f546001600160a01b03163314612d105760405162461bcd60e51b8152600401610d4090614aad565b5f54600160a01b900460ff16612d385760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b191681556040516370a0823160e01b815230600482015273e97cabcba4c9bdf35b3321c98440f7a88c745acf906370a0823190602401602060405180830381865afa158015612d91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612db591906149c8565b600f54909150610100900460ff1615612f7b57601754601b54601654601354601854601254612de4919061488d565b612dee919061488d565b612df89190614a9a565b612e029190614a9a565b612e0c9190614a9a565b8111612e5a5760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f756768204442545420746f20776974686472617700000000006044820152606401610d40565b601754601b54601654601354601854601254612e76919061488d565b612e80919061488d565b612e8a9190614a9a565b612e949190614a9a565b612e9e9190614a9a565b612ea89082614a9a565b60405163a9059cbb60e01b81529091505f9073e97cabcba4c9bdf35b3321c98440f7a88c745acf9063a9059cbb90612ee69033908690600401614b3d565b6020604051808303815f875af1158015612f02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2691906149df565b905080612f755760405162461bcd60e51b815260206004820152601a60248201527f4442545420546f6b656e207472616e73666572206661696c65640000000000006044820152606401610d40565b50613010565b600f5462010000900460ff168015612f9257505f81115b15612fd25760405163a9059cbb60e01b81525f9073e97cabcba4c9bdf35b3321c98440f7a88c745acf9063a9059cbb90612ee69033908690600401614b3d565b60405162461bcd60e51b81526020600482015260136024820152724e6f204442545420746f20776974686472617760681b6044820152606401610d40565b505f805460ff60a01b1916600160a01b179055565b5f546001600160a01b0316331461304e5760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff1615801561306f5750600f5462010000900460ff16155b61308b5760405162461bcd60e51b8152600401610d40906148d7565b5f6009819055600a819055600b55565b5f546001600160a01b031633146130c45760405162461bcd60e51b8152600401610d4090614aad565b600f5460ff161580156130df5750600f54610100900460ff16155b80156130f45750600f5462010000900460ff16155b6131105760405162461bcd60e51b8152600401610d4090614bee565b5f821161315f5760405162461bcd60e51b815260206004820152601c60248201527f526f756e64206d7573742062652067726561746572207468616e2030000000006044820152606401610d40565b8060025f61316e600186614a9a565b815260208101919091526040015f20555050565b5f546001600160a01b031633146131ab5760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff161580156131cc5750600f5462010000900460ff16155b6131e85760405162461bcd60e51b8152600401610d40906148d7565b600f5460ff161561323b5760405162461bcd60e51b815260206004820152601960248201527f50726573616c6520697320616c7265616479206f70656e6564000000000000006044820152606401610d40565b600f805460ff19166001179055613250613d22565b565b5f546001600160a01b0316331461327b5760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff1615801561329c5750600f5462010000900460ff16155b6132b85760405162461bcd60e51b8152600401610d40906148d7565b600a55565b61330c6040518061012001604052805f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b506001600160a01b039081165f908152600160208181526040928390208351610120810185528154909516855291820154908401526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015461010082015290565b5f546001600160a01b031633146133b55760405162461bcd60e51b8152600401610d4090614aad565b5f81116134045760405162461bcd60e51b815260206004820152601c60248201527f5072696365206d7573742062652067726561746572207468616e2030000000006044820152606401610d40565b600755565b5f546001600160a01b031633146134325760405162461bcd60e51b8152600401610d4090614aad565b600f5460ff1615801561344d5750600f54610100900460ff16155b80156134625750600f5462010000900460ff16155b61347e5760405162461bcd60e51b8152600401610d4090614bee565b5f8211801561348c57505f81115b6134ea5760405162461bcd60e51b815260206004820152602960248201527f53616c652063617020616e64207072696365206d75737420626520677265617460448201526806572207468616e20360bc1b6064820152608401610d40565b601c8054905f6134f983614aee565b90915550613511905082670de0b6b3a7640000614851565b60025f6001601c546135239190614a9a565b81526020019081526020015f20600101819055508060025f6001601c5461316e9190614a9a565b5f54600160a01b900460ff166135725760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b19169055600f54610100900460ff166135a55760405162461bcd60e51b8152600401610d4090614b56565b335f908152600160205260409020600601541515806135d45750335f9081526001602052604090206007015415155b806135ef5750335f9081526001602052604090206008015415155b6136355760405162461bcd60e51b81526020600482015260176024820152764e6f20636f6d6d697373696f6e7320746f20636c61696d60481b6044820152606401610d40565b611a0261419f565b5f546001600160a01b031633146136665760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff161580156136875750600f5462010000900460ff16155b6136a35760405162461bcd60e51b8152600401610d40906148d7565b600955565b5f80600d541180156136bb57505f600e54115b15613767575f600d5460046136d09190614851565b600e546136dd919061488d565b42106136eb57506004919050565b600d546136f9906003614851565b600e54613706919061488d565b421061371457506003919050565b600d54613722906002614851565b600e5461372f919061488d565b421061373d57506002919050565b600d5461374b906001614851565b600e54613758919061488d565b4210613762575060015b919050565b505f90565b5f546001600160a01b031633146137955760405162461bcd60e51b8152600401610d4090614aad565b600f5460ff161580156137b05750600f54610100900460ff16155b80156137c55750600f5462010000900460ff16155b6137e15760405162461bcd60e51b8152600401610d4090614bee565b5f82116138305760405162461bcd60e51b815260206004820152601c60248201527f526f756e64206d7573742062652067726561746572207468616e2030000000006044820152606401610d40565b61384281670de0b6b3a7640000614851565b60025f613850600186614a9a565b815260208101919091526040015f20600101555050565b5f546001600160a01b031633146138905760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff161580156138b15750600f5462010000900460ff16155b6138cd5760405162461bcd60e51b8152600401610d40906148d7565b600d55565b5f546001600160a01b031633146138fb5760405162461bcd60e51b8152600401610d4090614aad565b5f54600160a01b900460ff166139235760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b191681556040516370a0823160e01b81523060048201525f80516020614c26833981519152906370a0823190602401602060405180830381865afa158015613975573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061399991906149c8565b9050818110156139bb5760405162461bcd60e51b8152600401610d4090614bb7565b6014546010546139cb9190614a9a565b6139d58383614a9a565b116139f25760405162461bcd60e51b8152600401610d4090614bb7565b6003546001600160a01b031615801590613a0d57505f601f54115b15613ade575f6103e8601f5484613a249190614851565b613a2e919061486e565b60035460405163a9059cbb60e01b81529192505f915f80516020614c268339815191529163a9059cbb91613a70916001600160a01b0316908690600401614b3d565b6020604051808303815f875af1158015613a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ab091906149df565b905080613acf5760405162461bcd60e51b8152600401610d4090614b80565b613ad98285614a9a565b935050505b60405163a9059cbb60e01b81525f905f80516020614c268339815191529063a9059cbb90613b129033908790600401614b3d565b6020604051808303815f875af1158015613b2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b5291906149df565b905080613b715760405162461bcd60e51b8152600401610d4090614b80565b50505f805460ff60a01b1916600160a01b17905550565b5f546001600160a01b03163314613bb15760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff16158015613bd25750600f5462010000900460ff16155b613bee5760405162461bcd60e51b8152600401610d40906148d7565b8015613c0c57600f805461ff00191661010017905542600e55613c1e565b600f805462ff00001916620100001790555b50600f805460ff19169055565b5f546001600160a01b03163314613c545760405162461bcd60e51b8152600401610d4090614aad565b6001600160a01b038116613caa5760405162461bcd60e51b815260206004820152601d60248201527f4e6577206f776e657220697320746865207a65726f20616464726573730000006044820152606401610d40565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b60048181548110613d12575f80fd5b5f91825260209091200154905081565b5f601c5411613d6a5760405162461bcd60e51b81526020600482015260146024820152734e6f20726f756e6420657869737473207965742160601b6044820152606401610d40565b601e5415613d77575f601e555b601d545f81815260026020819052604082208054600655600190810154600c55919290918391613da69161488d565b81526020019081526020015f205f01541115613de65760025f601d546001613dce919061488d565b815260208101919091526040015f2054600855613deb565b5f6008555b601d8054905f613dfa83614aee565b9190505550565b816001600160a01b0316816001600160a01b031603613e565760405162461bcd60e51b815260206004820152601160248201527021b0b73737ba103932b332b91039b2b63360791b6044820152606401610d40565b6001600160a01b039182165f90815260016020526040902080546001600160a01b03191691909216179055565b6001600160a01b038084165f90815260016020526040812054909116905b6005548110156140d8576001600160a01b038216156140d857846001600160a01b0316826001600160a01b031603156140d8575f6103e860048381548110613eeb57613eeb614ada565b905f5260205f20015485613eff9190614851565b613f09919061486e565b600f549091506301000000900460ff168015613f4157506001600160a01b03851673dac17f958d2ee523a2206206994597c13d831ec7145b15613fba576006545f90613f5d83670de0b6b3a7640000614851565b613f67919061486e565b6001600160a01b0385165f90815260016020526040812060080180549293508392909190613f9690849061488d565b925050819055508060125f828254613fae919061488d565b909155506140a8915050565b600f546301000000900460ff1615613fee575f6064600654613fda612c6d565b613fe49085614851565b613f5d919061486e565b73dac17f958d2ee523a2206206994597c13d831ec6196001600160a01b03861601614060576001600160a01b0383165f908152600160205260408120600601805483929061403d90849061488d565b925050819055508060115f828254614055919061488d565b909155506140a89050565b6001600160a01b0383165f908152600160205260408120600701805483929061408a90849061488d565b925050819055508060105f8282546140a2919061488d565b90915550505b506001600160a01b039182165f9081526001602052604090205490911690806140d081614aee565b915050613ea1565b5050505050565b335f81815260016020526040808220600301805490839055905163a9059cbb60e01b8152909273e97cabcba4c9bdf35b3321c98440f7a88c745acf9163a9059cbb9161412f918690600401614b3d565b6020604051808303815f875af115801561414b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061416f91906149df565b90508061418e5760405162461bcd60e51b8152600401610d40906149fa565b81601b5f8282546116e0919061488d565b335f90815260016020526040902060060154801561424757335f81815260016020526040808220600601919091555163a9059cbb60e01b815273dac17f958d2ee523a2206206994597c13d831ec79163a9059cbb9161420391908590600401614b3d565b5f604051808303815f87803b15801561421a575f80fd5b505af115801561422c573d5f803e3d5ffd5b505050508060155f828254614241919061488d565b90915550505b335f90815260016020526040902060070154801561431b57335f818152600160205260408082206007018290555163a9059cbb60e01b815290915f80516020614c268339815191529163a9059cbb916142a4918690600401614b3d565b6020604051808303815f875af11580156142c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142e491906149df565b9050806143035760405162461bcd60e51b8152600401610d40906149fa565b8160145f828254614314919061488d565b9091555050505b335f9081526001602052604090206008015480156143f657335f818152600160205260408082206008018290555163a9059cbb60e01b8152909173e97cabcba4c9bdf35b3321c98440f7a88c745acf9163a9059cbb9161437f918690600401614b3d565b6020604051808303815f875af115801561439b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143bf91906149df565b9050806143de5760405162461bcd60e51b8152600401610d40906149fa565b8160165f8282546143ef919061488d565b9091555050505b505050565b335f9081526001602081905260409091200154600d5415614523575f61441f6136a8565b335f90815260016020526040812060020154919250906004906144429084614a9a565b61444c9085614851565b614456919061486e565b335f818152600160205260408082206002018690555163a9059cbb60e01b81529293509173e97cabcba4c9bdf35b3321c98440f7a88c745acf9163a9059cbb916144a591908690600401614b3d565b6020604051808303815f875af11580156144c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144e591906149df565b9050806145045760405162461bcd60e51b8152600401610d40906149fa565b8160175f828254614515919061488d565b909155506145e59350505050565b60405163a9059cbb60e01b81525f9073e97cabcba4c9bdf35b3321c98440f7a88c745acf9063a9059cbb9061455e9033908690600401614b3d565b6020604051808303815f875af115801561457a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061459e91906149df565b9050806145bd5760405162461bcd60e51b8152600401610d40906149fa565b335f9081526001602052604081206004600290910155601780548492906116e090849061488d565b50565b828054828255905f5260205f20908101928215614621579160200282015b82811115614621578235825591602001919060010190614606565b5061462d929150614631565b5090565b5b8082111561462d575f8155600101614632565b80356001600160a01b0381168114613762575f80fd5b5f805f6060848603121561466d575f80fd5b61467684614645565b92506020840135915061468b60408501614645565b90509250925092565b5f602082840312156146a4575f80fd5b5035919050565b5f80604083850312156146bc575f80fd5b6146c583614645565b946020939093013593505050565b5f602082840312156146e3575f80fd5b6146ec82614645565b9392505050565b80151581146145e5575f80fd5b5f60208284031215614710575f80fd5b81356146ec816146f3565b5f8083601f84011261472b575f80fd5b50813567ffffffffffffffff811115614742575f80fd5b6020830191508360208260051b850101111561475c575f80fd5b9250929050565b5f805f60408486031215614775575f80fd5b833567ffffffffffffffff81111561478b575f80fd5b6147978682870161471b565b909790965060209590950135949350505050565b5f80604083850312156147bc575f80fd5b823591506147cc60208401614645565b90509250929050565b5f805f604084860312156147e7575f80fd5b83359250602084013567ffffffffffffffff811115614804575f80fd5b6148108682870161471b565b9497909650939450505050565b5f806040838503121561482e575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176148685761486861483d565b92915050565b5f8261488857634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156148685761486861483d565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526010908201526f141c995cd85b19481a5cc8195b99195960821b604082015260600190565b6020808252602c908201527f416d6f756e74206d7573742062652067726561746572207468616e206d696e2060408201526b31b7b73a3934b13aba34b7b760a11b606082015260800190565b60208082526024908201527f416d6f756e74206d7573742062652067726561746572207468616e20313030306040820152632077656960e01b606082015260800190565b6020808252601d908201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604082015260600190565b5f602082840312156149d8575f80fd5b5051919050565b5f602082840312156149ef575f80fd5b81516146ec816146f3565b602080825260159082015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604082015260600190565b60208082526010908201526f14d85b194818d85c081c995858da195960821b604082015260600190565b60208082526027908201527f416d6f756e74206d757374206265206c657373207468616e206d617820616c6c60408201526637b1b0ba34b7b760c91b606082015260800190565b818103818111156148685761486861483d565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60018201614aff57614aff61483d565b5060010190565b6020808252601b908201527f4e6f7420656e6f756768205553445420746f2077697468647261770000000000604082015260600190565b6001600160a01b03929092168252602082015260400190565b60208082526010908201526f436c61696d206e6f742061637469766560801b604082015260600190565b60208082526019908201527f45544820546f6b656e207472616e73666572206661696c656400000000000000604082015260600190565b6020808252601a908201527f4e6f7420656e6f7567682045544820746f207769746864726177000000000000604082015260600190565b6020808252601a908201527f50726573616c6520697320616c7265616479207374617274656400000000000060408201526060019056fe000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a26469706673582212205de5962c3bf5760dd85de89964cee42bdd219a4b88ba48d06b16294b2b3c618664736f6c63430008140033

Deployed Bytecode

0x608060405260043610610416575f3560e01c80638da5cb5b11610220578063c54e44eb11610129578063e63b2f9f116100b3578063f16fbb9a11610078578063f16fbb9a14610c3e578063f1acfd9714610c65578063f2fde38b14610c84578063f71e4bef14610ca3578063ff5a40d514610cb8575f80fd5b8063e63b2f9f14610bae578063e9d8bddd14610bcd578063ea260c0e14610be1578063f0f75bc214610c00578063f14210a614610c1f575f80fd5b8063cf90dbbc116100f9578063cf90dbbc14610b31578063d476f33414610b46578063e02482e814610b65578063e34d1e6914610b85578063e47888bf14610b99575f80fd5b8063c54e44eb14610a47578063c7b8f8ee14610a6e578063cc3d967b14610a83578063cf607eaa14610b12575f80fd5b8063ab59778e116101aa578063b8e50cab1161017a578063b8e50cab146109cb578063ba0c6291146109e0578063ba65c058146109ff578063bd61cb3314610a14578063bf764a0b14610a28575f80fd5b8063ab59778e1461096e578063ad5c464814610982578063ade7d887146109a2578063aedcc93e146109b6575f80fd5b8063a0c0d95c116101f0578063a0c0d95c1461085e578063a106bd8714610873578063a23c50d214610888578063a607a8d91461089d578063a87430ba146108b1575f80fd5b80638da5cb5b146107ed57806391b7f5ed1461080b578063928085d81461082a5780639e12a4a31461083f575f80fd5b80634bd0f2a2116103225780636fba10b9116102ac578063853828b61161027c578063853828b61461077b5780638a19c8bc1461078f5780638abdf5aa146107a45780638beb7de8146107b95780638d13be92146107ce575f80fd5b80636fba10b914610715578063723931771461072a578063741bef1a1461073f5780637620c4ec14610766575f80fd5b8063590e1ae3116102f2578063590e1ae3146106695780635b88349d1461067d5780635e109b391461069157806366eb505d146106b05780636d37678c146106ce575f80fd5b80634bd0f2a21461060e5780634d43c747146106215780634e71d92d1461064057806351b4efb214610654575f80fd5b80632675249b116103a357806333339c8f1161037357806333339c8f146105925780633e1c765d146105a75780633ea521ef146105c65780634228ff04146105e557806348c54b9d146105fa575f80fd5b80632675249b1461051d5780632b9d6d23146105325780632e06ca061461054757806331e5901b1461057e575f80fd5b8063179857ce116103e9578063179857ce1461049a57806318e52bcc146104bb5780631b23146d146104da5780631c05e363146104ef578063244b9de314610508575f80fd5b806304a44fe01461041a5780630cbdfc6a1461044e57806316dd5d5f146104705780631724e54314610485575b5f80fd5b348015610425575f80fd5b50600f546104399062010000900460ff1681565b60405190151581526020015b60405180910390f35b348015610459575f80fd5b50610462610cd7565b604051908152602001610445565b34801561047b575f80fd5b5061046260125481565b348015610490575f80fd5b5061046260105481565b3480156104a5575f80fd5b506104b96104b436600461465b565b610d18565b005b3480156104c6575f80fd5b506104b96104d5366004614694565b61155e565b3480156104e5575f80fd5b5061046260075481565b3480156104fa575f80fd5b50600f546104399060ff1681565b348015610513575f80fd5b5061046260165481565b348015610528575f80fd5b5061046260195481565b34801561053d575f80fd5b50610462600b5481565b348015610552575f80fd5b50600354610566906001600160a01b031681565b6040516001600160a01b039091168152602001610445565b348015610589575f80fd5b506104626115c9565b34801561059d575f80fd5b5061046260135481565b3480156105b2575f80fd5b506104b96105c13660046146ab565b611618565b3480156105d1575f80fd5b506104b96105e0366004614694565b6116e9565b3480156105f0575f80fd5b50610462600e5481565b348015610605575f80fd5b506104b961194e565b6104b961061c3660046146d3565b611a16565b34801561062c575f80fd5b506104b961063b366004614700565b611ea4565b34801561064b575f80fd5b506104b9611f28565b34801561065f575f80fd5b5061046260115481565b348015610674575f80fd5b506104b9612163565b348015610688575f80fd5b506104b9612368565b34801561069c575f80fd5b506104b96106ab366004614763565b6124e8565b3480156106bb575f80fd5b50600f5461043990610100900460ff1681565b3480156106d9575f80fd5b506107006106e8366004614694565b60026020525f90815260409020805460019091015482565b60408051928352602083019190915201610445565b348015610720575f80fd5b50610462600a5481565b348015610735575f80fd5b5061046260065481565b34801561074a575f80fd5b50610566735f4ec3df9cbd43714fe2740f5e3616155c5b841981565b348015610771575f80fd5b50610462600c5481565b348015610786575f80fd5b506104b9612656565b34801561079a575f80fd5b50610462601d5481565b3480156107af575f80fd5b50610462601f5481565b3480156107c4575f80fd5b5061046260155481565b3480156107d9575f80fd5b506104b96107e83660046147ab565b612aa9565b3480156107f8575f80fd5b505f54610566906001600160a01b031681565b348015610816575f80fd5b506104b9610825366004614694565b612b36565b348015610835575f80fd5b50610462601e5481565b34801561084a575f80fd5b506104b96108593660046147d5565b612ba1565b348015610869575f80fd5b50610462601c5481565b34801561087e575f80fd5b5061046260085481565b348015610893575f80fd5b5061046260145481565b3480156108a8575f80fd5b50610462612c6d565b3480156108bc575f80fd5b506109206108cb3660046146d3565b600160208190525f91825260409091208054918101546002820154600383015460048401546005850154600686015460078701546008909701546001600160a01b039098169795969495939492939192909189565b604080516001600160a01b03909a168a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610445565b348015610979575f80fd5b506104b9612ce7565b34801561098d575f80fd5b506105665f80516020614c2683398151915281565b3480156109ad575f80fd5b506104b9613025565b3480156109c1575f80fd5b5061046260175481565b3480156109d6575f80fd5b50610462600d5481565b3480156109eb575f80fd5b506104b96109fa36600461481d565b61309b565b348015610a0a575f80fd5b5061046260095481565b348015610a1f575f80fd5b506104b9613182565b348015610a33575f80fd5b506104b9610a42366004614694565b613252565b348015610a52575f80fd5b5061056673dac17f958d2ee523a2206206994597c13d831ec781565b348015610a79575f80fd5b5061046260055481565b348015610a8e575f80fd5b50610aa2610a9d3660046146d3565b6132bd565b604051610445919081516001600160a01b031681526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0828101519082015260c0808301519082015260e0808301519082015261010091820151918101919091526101200190565b348015610b1d575f80fd5b506104b9610b2c366004614694565b61338c565b348015610b3c575f80fd5b5061046260185481565b348015610b51575f80fd5b506104b9610b6036600461481d565b613409565b348015610b70575f80fd5b50600f54610439906301000000900460ff1681565b348015610b90575f80fd5b506104b961354a565b348015610ba4575f80fd5b50610462601b5481565b348015610bb9575f80fd5b506104b9610bc8366004614694565b61363d565b348015610bd8575f80fd5b506104626136a8565b348015610bec575f80fd5b506104b9610bfb36600461481d565b61376c565b348015610c0b575f80fd5b506104b9610c1a366004614694565b613867565b348015610c2a575f80fd5b506104b9610c39366004614694565b6138d2565b348015610c49575f80fd5b5061056673e97cabcba4c9bdf35b3321c98440f7a88c745acf81565b348015610c70575f80fd5b506104b9610c7f366004614700565b613b88565b348015610c8f575f80fd5b506104b9610c9e3660046146d3565b613c2b565b348015610cae575f80fd5b50610462601a5481565b348015610cc3575f80fd5b50610462610cd2366004614694565b613d03565b5f8068056bc75e2d63100000610ceb612c6d565b601a54610cf89190614851565b610d02919061486e565b905080601954610d12919061488d565b91505090565b5f54600160a01b900460ff16610d495760405162461bcd60e51b8152600401610d40906148a0565b60405180910390fd5b5f805460ff60a01b19169055600f54610100900460ff16158015610d765750600f5462010000900460ff16155b610d925760405162461bcd60e51b8152600401610d40906148d7565b600f5460ff16610dd85760405162461bcd60e51b8152602060048201526011602482015270141c995cd85b19481a5cc818db1bdcd959607a1b6044820152606401610d40565b5f600954118015610e0557506001600160a01b03831673dac17f958d2ee523a2206206994597c13d831ec7145b15610e3157600954821015610e2c5760405162461bcd60e51b8152600401610d4090614901565b610e77565b73dac17f958d2ee523a2206206994597c13d831ec6196001600160a01b03841601610e77576103e88211610e775760405162461bcd60e51b8152600401610d409061494d565b5f600a54118015610e9d57506001600160a01b0383165f80516020614c26833981519152145b15610ec957600a54821015610ec45760405162461bcd60e51b8152600401610d4090614901565b610f0f565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc1196001600160a01b03841601610f0f576103e88211610f0f5760405162461bcd60e51b8152600401610d409061494d565b5f8211610f2e5760405162461bcd60e51b8152600401610d4090614991565b604051636eb1769f60e11b815233600482015230602482015282906001600160a01b0385169063dd62ed3e90604401602060405180830381865afa158015610f78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f9c91906149c8565b1015610fea5760405162461bcd60e51b815260206004820152601760248201527f546f6b656e20616c6c6f77616e636520746f6f206c6f770000000000000000006044820152606401610d40565b6001600160a01b03831673dac17f958d2ee523a2206206994597c13d831ec7148061102a57506001600160a01b0383165f80516020614c26833981519152145b61106e5760405162461bcd60e51b8152602060048201526015602482015274115490cc8c081d1bdad95b881b9bdd081d985b1a59605a1b6044820152606401610d40565b73dac17f958d2ee523a2206206994597c13d831ec6196001600160a01b038416016110f9576040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038416906323b872dd906064015f604051808303815f87803b1580156110de575f80fd5b505af11580156110f0573d5f803e3d5ffd5b50505050611190565b6040516323b872dd60e01b8152336004820152306024820152604481018390525f906001600160a01b038516906323b872dd906064016020604051808303815f875af115801561114b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116f91906149df565b90508061118e5760405162461bcd60e51b8152600401610d40906149fa565b505b600c54601e54036111cc57601c54601d5410156111b4576111af613d22565b6111cc565b60405162461bcd60e51b8152600401610d4090614a29565b5f73dac17f958d2ee523a2206206994597c13d831ec6196001600160a01b0385160161125557335f908152600160205260408120600401805485929061121390849061488d565b909155505060065461122d84670de0b6b3a7640000614851565b611237919061486e565b90508260195f82825461124a919061488d565b909155506112c09050565b335f908152600160205260408120600501805485929061127690849061488d565b9091555050600654606490611289612c6d565b6112939086614851565b61129d919061486e565b6112a7919061486e565b905082601a5f8282546112ba919061488d565b90915550505b600b541561130657600b54335f908152600160205260409020600301546112e890839061488d565b11156113065760405162461bcd60e51b8152600401610d4090614a53565b600c5481601e54611317919061488d565b111561143a57601c54601d5410156111b4575f601e54600c5461133a9190614a9a565b90505f670de0b6b3a7640000600654836113549190614851565b61135e919061486e565b90505f73dac17f958d2ee523a2206206994597c13d831ec6196001600160a01b0388160161138d5750846113b6565b68056bc75e2d6310000061139f612c6d565b6113a99088614851565b6113b3919061486e565b90505b6113be613d22565b6006545f906113cd8484614a9a565b6113df90670de0b6b3a7640000614851565b6113e9919061486e565b90506113f5818561488d565b945080601e5f828254611408919061488d565b9091555050600c54601e5411156114315760405162461bcd60e51b8152600401610d4090614a29565b5050505061149c565b600c5481601e5461144b919061488d565b0361148557601c54601d54101561146957611464613d22565b61149c565b80601e5f82825461147a919061488d565b9091555061149c9050565b80601e5f828254611496919061488d565b90915550505b335f90815260016020526040812060030180548392906114bd90849061488d565b925050819055508060185f8282546114d5919061488d565b90915550506001600160a01b038216156114f3576114f33383613e01565b6005541561150657611506338585613e83565b6040518381526001600160a01b0383169033907f63b0da8d3b6d4f2d3d607e4bf412a85e661e29faa765dc3ff5617c00959828059060200160405180910390a350505f805460ff60a01b1916600160a01b1790555050565b5f546001600160a01b031633146115875760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff161580156115a85750600f5462010000900460ff16155b6115c45760405162461bcd60e51b8152600401610d40906148d7565b600b55565b5f80805b60045481101561161257600481815481106115ea576115ea614ada565b905f5260205f200154826115fe919061488d565b91508061160a81614aee565b9150506115cd565b50919050565b5f546001600160a01b031633146116415760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff161580156116625750600f5462010000900460ff16155b61167e5760405162461bcd60e51b8152600401610d40906148d7565b6001600160a01b0382165f9081526001602081905260408220015460138054919290916116ac908490614a9a565b90915550506001600160a01b0382165f908152600160208190526040822001829055601380548392906116e090849061488d565b90915550505050565b5f546001600160a01b031633146117125760405162461bcd60e51b8152600401610d4090614aad565b5f54600160a01b900460ff1661173a5760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b191681556040516370a0823160e01b815230600482015273dac17f958d2ee523a2206206994597c13d831ec7906370a0823190602401602060405180830381865afa158015611793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117b791906149c8565b9050818110156117d95760405162461bcd60e51b8152600401610d4090614b06565b6015546011546117e99190614a9a565b6117f38383614a9a565b116118105760405162461bcd60e51b8152600401610d4090614b06565b6003546001600160a01b03161580159061182b57505f601f54115b156118d2575f6103e8601f54846118429190614851565b61184c919061486e565b60035460405163a9059cbb60e01b815291925073dac17f958d2ee523a2206206994597c13d831ec79163a9059cbb91611895916001600160a01b03909116908590600401614b3d565b5f604051808303815f87803b1580156118ac575f80fd5b505af11580156118be573d5f803e3d5ffd5b5050505080836118ce9190614a9a565b9250505b60405163a9059cbb60e01b815273dac17f958d2ee523a2206206994597c13d831ec79063a9059cbb9061190b9033908690600401614b3d565b5f604051808303815f87803b158015611922575f80fd5b505af1158015611934573d5f803e3d5ffd5b50505f805460ff60a01b1916600160a01b17905550505050565b5f54600160a01b900460ff166119765760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b19169055600f54610100900460ff166119a95760405162461bcd60e51b8152600401610d4090614b56565b335f908152600160205260409020600301546119fa5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610d40565b611a026140df565b5f805460ff60a01b1916600160a01b179055565b5f54600160a01b900460ff16611a3e5760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b19169055600f54610100900460ff16158015611a6b5750600f5462010000900460ff16155b611a875760405162461bcd60e51b8152600401610d40906148d7565b600f5460ff16611acd5760405162461bcd60e51b8152602060048201526011602482015270141c995cd85b19481a5cc818db1bdcd959607a1b6044820152606401610d40565b600a5415611afc57600a54341015611af75760405162461bcd60e51b8152600401610d4090614901565b611b1d565b6103e83411611b1d5760405162461bcd60e51b8152600401610d409061494d565b5f3411611b3c5760405162461bcd60e51b8152600401610d4090614991565b5f80516020614c268339815191526001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611b82575f80fd5b505af1158015611b94573d5f803e3d5ffd5b5050335f9081526001602052604081206005018054349550909350909150611bbd90849061488d565b9091555050600c54601e5403611be157601c54601d5410156111b457611be1613d22565b5f6064600654611bef612c6d565b611bf99034614851565b611c03919061486e565b611c0d919061486e565b600b5490915015611c5657600b54335f90815260016020526040902060030154611c3890839061488d565b1115611c565760405162461bcd60e51b8152600401610d4090614a53565b600c5481601e54611c67919061488d565b1115611d5d57601c54601d5410156111b4575f601e54600c54611c8a9190614a9a565b90505f670de0b6b3a764000060065483611ca49190614851565b611cae919061486e565b90505f68056bc75e2d63100000611cc3612c6d565b611ccd9034614851565b611cd7919061486e565b9050611ce1613d22565b6006545f90611cf08484614a9a565b611d0290670de0b6b3a7640000614851565b611d0c919061486e565b9050611d18818561488d565b945080601e5f828254611d2b919061488d565b9091555050600c54601e541115611d545760405162461bcd60e51b8152600401610d4090614a29565b50505050611dbf565b600c5481601e54611d6e919061488d565b03611da857601c54601d541015611d8c57611d87613d22565b611dbf565b80601e5f828254611d9d919061488d565b90915550611dbf9050565b80601e5f828254611db9919061488d565b90915550505b335f9081526001602052604081206003018054839290611de090849061488d565b925050819055508060185f828254611df8919061488d565b9250508190555034601a5f828254611e10919061488d565b90915550506001600160a01b03821615611e2e57611e2e3383613e01565b60055415611e4e57611e4e335f80516020614c2683398151915234613e83565b6040513481526001600160a01b0383169033907f63b0da8d3b6d4f2d3d607e4bf412a85e661e29faa765dc3ff5617c00959828059060200160405180910390a350505f805460ff60a01b1916600160a01b179055565b5f546001600160a01b03163314611ecd5760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff16158015611eee5750600f5462010000900460ff16155b611f0a5760405162461bcd60e51b8152600401610d40906148d7565b600f805491151563010000000263ff00000019909216919091179055565b5f54600160a01b900460ff16611f505760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b19169055600f54610100900460ff16611f835760405162461bcd60e51b8152600401610d4090614b56565b335f90815260016020526040902060060154151580611fb25750335f9081526001602052604090206007015415155b80611fcd5750335f9081526001602052604090206008015415155b80611fe85750335f9081526001602052604090206003015415155b806120445750335f908152600160205260409020600201546004108015906120275750335f908152600160205260409020600201546120256136a8565b115b80156120445750335f908152600160208190526040909120015415155b61208a5760405162461bcd60e51b81526020600482015260176024820152764e6f20636f6d6d697373696f6e7320746f20636c61696d60481b6044820152606401610d40565b335f908152600160205260409020600601541515806120b95750335f9081526001602052604090206007015415155b806120d45750335f9081526001602052604090206008015415155b156120e1576120e161419f565b335f9081526001602052604090206003015415612100576121006140df565b335f908152600160205260409020600201546004108015906121395750335f908152600160205260409020600201546121376136a8565b115b80156121565750335f908152600160208190526040909120015415155b15611a0257611a026143fb565b5f54600160a01b900460ff1661218b5760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b19169055600f5462010000900460ff166121ef5760405162461bcd60e51b815260206004820152601e60248201527f50726573616c6520686173206e6f74206265656e2063616e63656c6c656400006044820152606401610d40565b335f90815260016020526040902060048101546005909101548115158061221557505f81115b6122315760405162461bcd60e51b8152600401610d4090614991565b335f908152600160205260408120600481018290556005015581156122b75760405163a9059cbb60e01b815273dac17f958d2ee523a2206206994597c13d831ec79063a9059cbb906122899033908690600401614b3d565b5f604051808303815f87803b1580156122a0575f80fd5b505af11580156122b2573d5f803e3d5ffd5b505050505b80156123525760405163a9059cbb60e01b81525f905f80516020614c268339815191529063a9059cbb906122f19033908690600401614b3d565b6020604051808303815f875af115801561230d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061233191906149df565b9050806123505760405162461bcd60e51b8152600401610d4090614b80565b505b50505f805460ff60a01b1916600160a01b179055565b5f54600160a01b900460ff166123905760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b19169055600f54610100900460ff166123c35760405162461bcd60e51b8152600401610d4090614b56565b335f90815260016020526040902060020154600410156124255760405162461bcd60e51b815260206004820152601760248201527f41697264726f7020616c726561647920636c61696d65640000000000000000006044820152606401610d40565b600d54156124e057335f908152600160205260409020600201546124476136a8565b1161248b5760405162461bcd60e51b8152602060048201526014602482015273139bdd1a1a5b99c81d1bc818db185a5b481e595d60621b6044820152606401610d40565b335f90815260016020819052604090912001546124e05760405162461bcd60e51b815260206004820152601360248201527227379030b4b9323937b8103337b9103ab9b2b960691b6044820152606401610d40565b611a026143fb565b5f546001600160a01b031633146125115760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff161580156125325750600f5462010000900460ff16155b61254e5760405162461bcd60e51b8152600401610d40906148d7565b60fb82106125b45760405162461bcd60e51b815260206004820152602d60248201527f474153204572726f723a206d61782061697264726f70206c696d69742069732060448201526c3235312061646472657373657360981b6064820152608401610d40565b5f5b82811015612631578160015f8686858181106125d4576125d4614ada565b90506020020160208101906125e991906146d3565b6001600160a01b03166001600160a01b031681526020019081526020015f206001015f828254612619919061488d565b9091555081905061262981614aee565b9150506125b6565b5061263c8183614851565b60135f82825461264c919061488d565b9091555050505050565b5f546001600160a01b0316331461267f5760405162461bcd60e51b8152600401610d4090614aad565b5f54600160a01b900460ff166126a75760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b19169055600f54610100900460ff1661270a5760405162461bcd60e51b815260206004820152601860248201527f50726573616c65206973206e6f7420636f6d706c6574656400000000000000006044820152606401610d40565b6040516370a0823160e01b81523060048201525f9073dac17f958d2ee523a2206206994597c13d831ec7906370a0823190602401602060405180830381865afa158015612759573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061277d91906149c8565b6040516370a0823160e01b81523060048201529091505f905f80516020614c26833981519152906370a0823190602401602060405180830381865afa1580156127c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127ec91906149c8565b90506015546011546127fe9190614a9a565b821161281c5760405162461bcd60e51b8152600401610d4090614b06565b60145460105461282c9190614a9a565b811161284a5760405162461bcd60e51b8152600401610d4090614bb7565b60155460115461285a9190614a9a565b6128649083614a9a565b91506014546010546128769190614a9a565b6128809082614a9a565b6003549091506001600160a01b03161580159061289e57505f601f54115b15612a0f575f6103e8601f54846128b59190614851565b6128bf919061486e565b90505f6103e8601f54846128d39190614851565b6128dd919061486e565b60035460405163a9059cbb60e01b815291925073dac17f958d2ee523a2206206994597c13d831ec79163a9059cbb91612926916001600160a01b03909116908690600401614b3d565b5f604051808303815f87803b15801561293d575f80fd5b505af115801561294f573d5f803e3d5ffd5b505060035460405163a9059cbb60e01b81525f93505f80516020614c26833981519152925063a9059cbb91612994916001600160a01b03909116908690600401614b3d565b6020604051808303815f875af11580156129b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129d491906149df565b9050806129f35760405162461bcd60e51b8152600401610d4090614b80565b6129fd8386614a9a565b9450612a098285614a9a565b93505050505b60405163a9059cbb60e01b815273dac17f958d2ee523a2206206994597c13d831ec79063a9059cbb90612a489033908690600401614b3d565b5f604051808303815f87803b158015612a5f575f80fd5b505af1158015612a71573d5f803e3d5ffd5b505060405163a9059cbb60e01b81525f92505f80516020614c26833981519152915063a9059cbb906122f19033908690600401614b3d565b5f546001600160a01b03163314612ad25760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff16158015612af35750600f5462010000900460ff16155b612b0f5760405162461bcd60e51b8152600401610d4090614bee565b601f91909155600380546001600160a01b0319166001600160a01b03909216919091179055565b5f546001600160a01b03163314612b5f5760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff16158015612b805750600f5462010000900460ff16155b612b9c5760405162461bcd60e51b8152600401610d40906148d7565b600655565b5f546001600160a01b03163314612bca5760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff16158015612beb5750600f5462010000900460ff16155b612c075760405162461bcd60e51b8152600401610d40906148d7565b808314612c565760405162461bcd60e51b815260206004820152601a60248201527f5261746573206d75737420686176652073616d652064657074680000000000006044820152606401610d40565b6005839055612c67600483836145e8565b50505050565b5f735f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cbe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ce291906149c8565b905090565b5f546001600160a01b03163314612d105760405162461bcd60e51b8152600401610d4090614aad565b5f54600160a01b900460ff16612d385760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b191681556040516370a0823160e01b815230600482015273e97cabcba4c9bdf35b3321c98440f7a88c745acf906370a0823190602401602060405180830381865afa158015612d91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612db591906149c8565b600f54909150610100900460ff1615612f7b57601754601b54601654601354601854601254612de4919061488d565b612dee919061488d565b612df89190614a9a565b612e029190614a9a565b612e0c9190614a9a565b8111612e5a5760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f756768204442545420746f20776974686472617700000000006044820152606401610d40565b601754601b54601654601354601854601254612e76919061488d565b612e80919061488d565b612e8a9190614a9a565b612e949190614a9a565b612e9e9190614a9a565b612ea89082614a9a565b60405163a9059cbb60e01b81529091505f9073e97cabcba4c9bdf35b3321c98440f7a88c745acf9063a9059cbb90612ee69033908690600401614b3d565b6020604051808303815f875af1158015612f02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2691906149df565b905080612f755760405162461bcd60e51b815260206004820152601a60248201527f4442545420546f6b656e207472616e73666572206661696c65640000000000006044820152606401610d40565b50613010565b600f5462010000900460ff168015612f9257505f81115b15612fd25760405163a9059cbb60e01b81525f9073e97cabcba4c9bdf35b3321c98440f7a88c745acf9063a9059cbb90612ee69033908690600401614b3d565b60405162461bcd60e51b81526020600482015260136024820152724e6f204442545420746f20776974686472617760681b6044820152606401610d40565b505f805460ff60a01b1916600160a01b179055565b5f546001600160a01b0316331461304e5760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff1615801561306f5750600f5462010000900460ff16155b61308b5760405162461bcd60e51b8152600401610d40906148d7565b5f6009819055600a819055600b55565b5f546001600160a01b031633146130c45760405162461bcd60e51b8152600401610d4090614aad565b600f5460ff161580156130df5750600f54610100900460ff16155b80156130f45750600f5462010000900460ff16155b6131105760405162461bcd60e51b8152600401610d4090614bee565b5f821161315f5760405162461bcd60e51b815260206004820152601c60248201527f526f756e64206d7573742062652067726561746572207468616e2030000000006044820152606401610d40565b8060025f61316e600186614a9a565b815260208101919091526040015f20555050565b5f546001600160a01b031633146131ab5760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff161580156131cc5750600f5462010000900460ff16155b6131e85760405162461bcd60e51b8152600401610d40906148d7565b600f5460ff161561323b5760405162461bcd60e51b815260206004820152601960248201527f50726573616c6520697320616c7265616479206f70656e6564000000000000006044820152606401610d40565b600f805460ff19166001179055613250613d22565b565b5f546001600160a01b0316331461327b5760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff1615801561329c5750600f5462010000900460ff16155b6132b85760405162461bcd60e51b8152600401610d40906148d7565b600a55565b61330c6040518061012001604052805f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b506001600160a01b039081165f908152600160208181526040928390208351610120810185528154909516855291820154908401526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015461010082015290565b5f546001600160a01b031633146133b55760405162461bcd60e51b8152600401610d4090614aad565b5f81116134045760405162461bcd60e51b815260206004820152601c60248201527f5072696365206d7573742062652067726561746572207468616e2030000000006044820152606401610d40565b600755565b5f546001600160a01b031633146134325760405162461bcd60e51b8152600401610d4090614aad565b600f5460ff1615801561344d5750600f54610100900460ff16155b80156134625750600f5462010000900460ff16155b61347e5760405162461bcd60e51b8152600401610d4090614bee565b5f8211801561348c57505f81115b6134ea5760405162461bcd60e51b815260206004820152602960248201527f53616c652063617020616e64207072696365206d75737420626520677265617460448201526806572207468616e20360bc1b6064820152608401610d40565b601c8054905f6134f983614aee565b90915550613511905082670de0b6b3a7640000614851565b60025f6001601c546135239190614a9a565b81526020019081526020015f20600101819055508060025f6001601c5461316e9190614a9a565b5f54600160a01b900460ff166135725760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b19169055600f54610100900460ff166135a55760405162461bcd60e51b8152600401610d4090614b56565b335f908152600160205260409020600601541515806135d45750335f9081526001602052604090206007015415155b806135ef5750335f9081526001602052604090206008015415155b6136355760405162461bcd60e51b81526020600482015260176024820152764e6f20636f6d6d697373696f6e7320746f20636c61696d60481b6044820152606401610d40565b611a0261419f565b5f546001600160a01b031633146136665760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff161580156136875750600f5462010000900460ff16155b6136a35760405162461bcd60e51b8152600401610d40906148d7565b600955565b5f80600d541180156136bb57505f600e54115b15613767575f600d5460046136d09190614851565b600e546136dd919061488d565b42106136eb57506004919050565b600d546136f9906003614851565b600e54613706919061488d565b421061371457506003919050565b600d54613722906002614851565b600e5461372f919061488d565b421061373d57506002919050565b600d5461374b906001614851565b600e54613758919061488d565b4210613762575060015b919050565b505f90565b5f546001600160a01b031633146137955760405162461bcd60e51b8152600401610d4090614aad565b600f5460ff161580156137b05750600f54610100900460ff16155b80156137c55750600f5462010000900460ff16155b6137e15760405162461bcd60e51b8152600401610d4090614bee565b5f82116138305760405162461bcd60e51b815260206004820152601c60248201527f526f756e64206d7573742062652067726561746572207468616e2030000000006044820152606401610d40565b61384281670de0b6b3a7640000614851565b60025f613850600186614a9a565b815260208101919091526040015f20600101555050565b5f546001600160a01b031633146138905760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff161580156138b15750600f5462010000900460ff16155b6138cd5760405162461bcd60e51b8152600401610d40906148d7565b600d55565b5f546001600160a01b031633146138fb5760405162461bcd60e51b8152600401610d4090614aad565b5f54600160a01b900460ff166139235760405162461bcd60e51b8152600401610d40906148a0565b5f805460ff60a01b191681556040516370a0823160e01b81523060048201525f80516020614c26833981519152906370a0823190602401602060405180830381865afa158015613975573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061399991906149c8565b9050818110156139bb5760405162461bcd60e51b8152600401610d4090614bb7565b6014546010546139cb9190614a9a565b6139d58383614a9a565b116139f25760405162461bcd60e51b8152600401610d4090614bb7565b6003546001600160a01b031615801590613a0d57505f601f54115b15613ade575f6103e8601f5484613a249190614851565b613a2e919061486e565b60035460405163a9059cbb60e01b81529192505f915f80516020614c268339815191529163a9059cbb91613a70916001600160a01b0316908690600401614b3d565b6020604051808303815f875af1158015613a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ab091906149df565b905080613acf5760405162461bcd60e51b8152600401610d4090614b80565b613ad98285614a9a565b935050505b60405163a9059cbb60e01b81525f905f80516020614c268339815191529063a9059cbb90613b129033908790600401614b3d565b6020604051808303815f875af1158015613b2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b5291906149df565b905080613b715760405162461bcd60e51b8152600401610d4090614b80565b50505f805460ff60a01b1916600160a01b17905550565b5f546001600160a01b03163314613bb15760405162461bcd60e51b8152600401610d4090614aad565b600f54610100900460ff16158015613bd25750600f5462010000900460ff16155b613bee5760405162461bcd60e51b8152600401610d40906148d7565b8015613c0c57600f805461ff00191661010017905542600e55613c1e565b600f805462ff00001916620100001790555b50600f805460ff19169055565b5f546001600160a01b03163314613c545760405162461bcd60e51b8152600401610d4090614aad565b6001600160a01b038116613caa5760405162461bcd60e51b815260206004820152601d60248201527f4e6577206f776e657220697320746865207a65726f20616464726573730000006044820152606401610d40565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b60048181548110613d12575f80fd5b5f91825260209091200154905081565b5f601c5411613d6a5760405162461bcd60e51b81526020600482015260146024820152734e6f20726f756e6420657869737473207965742160601b6044820152606401610d40565b601e5415613d77575f601e555b601d545f81815260026020819052604082208054600655600190810154600c55919290918391613da69161488d565b81526020019081526020015f205f01541115613de65760025f601d546001613dce919061488d565b815260208101919091526040015f2054600855613deb565b5f6008555b601d8054905f613dfa83614aee565b9190505550565b816001600160a01b0316816001600160a01b031603613e565760405162461bcd60e51b815260206004820152601160248201527021b0b73737ba103932b332b91039b2b63360791b6044820152606401610d40565b6001600160a01b039182165f90815260016020526040902080546001600160a01b03191691909216179055565b6001600160a01b038084165f90815260016020526040812054909116905b6005548110156140d8576001600160a01b038216156140d857846001600160a01b0316826001600160a01b031603156140d8575f6103e860048381548110613eeb57613eeb614ada565b905f5260205f20015485613eff9190614851565b613f09919061486e565b600f549091506301000000900460ff168015613f4157506001600160a01b03851673dac17f958d2ee523a2206206994597c13d831ec7145b15613fba576006545f90613f5d83670de0b6b3a7640000614851565b613f67919061486e565b6001600160a01b0385165f90815260016020526040812060080180549293508392909190613f9690849061488d565b925050819055508060125f828254613fae919061488d565b909155506140a8915050565b600f546301000000900460ff1615613fee575f6064600654613fda612c6d565b613fe49085614851565b613f5d919061486e565b73dac17f958d2ee523a2206206994597c13d831ec6196001600160a01b03861601614060576001600160a01b0383165f908152600160205260408120600601805483929061403d90849061488d565b925050819055508060115f828254614055919061488d565b909155506140a89050565b6001600160a01b0383165f908152600160205260408120600701805483929061408a90849061488d565b925050819055508060105f8282546140a2919061488d565b90915550505b506001600160a01b039182165f9081526001602052604090205490911690806140d081614aee565b915050613ea1565b5050505050565b335f81815260016020526040808220600301805490839055905163a9059cbb60e01b8152909273e97cabcba4c9bdf35b3321c98440f7a88c745acf9163a9059cbb9161412f918690600401614b3d565b6020604051808303815f875af115801561414b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061416f91906149df565b90508061418e5760405162461bcd60e51b8152600401610d40906149fa565b81601b5f8282546116e0919061488d565b335f90815260016020526040902060060154801561424757335f81815260016020526040808220600601919091555163a9059cbb60e01b815273dac17f958d2ee523a2206206994597c13d831ec79163a9059cbb9161420391908590600401614b3d565b5f604051808303815f87803b15801561421a575f80fd5b505af115801561422c573d5f803e3d5ffd5b505050508060155f828254614241919061488d565b90915550505b335f90815260016020526040902060070154801561431b57335f818152600160205260408082206007018290555163a9059cbb60e01b815290915f80516020614c268339815191529163a9059cbb916142a4918690600401614b3d565b6020604051808303815f875af11580156142c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142e491906149df565b9050806143035760405162461bcd60e51b8152600401610d40906149fa565b8160145f828254614314919061488d565b9091555050505b335f9081526001602052604090206008015480156143f657335f818152600160205260408082206008018290555163a9059cbb60e01b8152909173e97cabcba4c9bdf35b3321c98440f7a88c745acf9163a9059cbb9161437f918690600401614b3d565b6020604051808303815f875af115801561439b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143bf91906149df565b9050806143de5760405162461bcd60e51b8152600401610d40906149fa565b8160165f8282546143ef919061488d565b9091555050505b505050565b335f9081526001602081905260409091200154600d5415614523575f61441f6136a8565b335f90815260016020526040812060020154919250906004906144429084614a9a565b61444c9085614851565b614456919061486e565b335f818152600160205260408082206002018690555163a9059cbb60e01b81529293509173e97cabcba4c9bdf35b3321c98440f7a88c745acf9163a9059cbb916144a591908690600401614b3d565b6020604051808303815f875af11580156144c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144e591906149df565b9050806145045760405162461bcd60e51b8152600401610d40906149fa565b8160175f828254614515919061488d565b909155506145e59350505050565b60405163a9059cbb60e01b81525f9073e97cabcba4c9bdf35b3321c98440f7a88c745acf9063a9059cbb9061455e9033908690600401614b3d565b6020604051808303815f875af115801561457a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061459e91906149df565b9050806145bd5760405162461bcd60e51b8152600401610d40906149fa565b335f9081526001602052604081206004600290910155601780548492906116e090849061488d565b50565b828054828255905f5260205f20908101928215614621579160200282015b82811115614621578235825591602001919060010190614606565b5061462d929150614631565b5090565b5b8082111561462d575f8155600101614632565b80356001600160a01b0381168114613762575f80fd5b5f805f6060848603121561466d575f80fd5b61467684614645565b92506020840135915061468b60408501614645565b90509250925092565b5f602082840312156146a4575f80fd5b5035919050565b5f80604083850312156146bc575f80fd5b6146c583614645565b946020939093013593505050565b5f602082840312156146e3575f80fd5b6146ec82614645565b9392505050565b80151581146145e5575f80fd5b5f60208284031215614710575f80fd5b81356146ec816146f3565b5f8083601f84011261472b575f80fd5b50813567ffffffffffffffff811115614742575f80fd5b6020830191508360208260051b850101111561475c575f80fd5b9250929050565b5f805f60408486031215614775575f80fd5b833567ffffffffffffffff81111561478b575f80fd5b6147978682870161471b565b909790965060209590950135949350505050565b5f80604083850312156147bc575f80fd5b823591506147cc60208401614645565b90509250929050565b5f805f604084860312156147e7575f80fd5b83359250602084013567ffffffffffffffff811115614804575f80fd5b6148108682870161471b565b9497909650939450505050565b5f806040838503121561482e575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176148685761486861483d565b92915050565b5f8261488857634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156148685761486861483d565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526010908201526f141c995cd85b19481a5cc8195b99195960821b604082015260600190565b6020808252602c908201527f416d6f756e74206d7573742062652067726561746572207468616e206d696e2060408201526b31b7b73a3934b13aba34b7b760a11b606082015260800190565b60208082526024908201527f416d6f756e74206d7573742062652067726561746572207468616e20313030306040820152632077656960e01b606082015260800190565b6020808252601d908201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604082015260600190565b5f602082840312156149d8575f80fd5b5051919050565b5f602082840312156149ef575f80fd5b81516146ec816146f3565b602080825260159082015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604082015260600190565b60208082526010908201526f14d85b194818d85c081c995858da195960821b604082015260600190565b60208082526027908201527f416d6f756e74206d757374206265206c657373207468616e206d617820616c6c60408201526637b1b0ba34b7b760c91b606082015260800190565b818103818111156148685761486861483d565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60018201614aff57614aff61483d565b5060010190565b6020808252601b908201527f4e6f7420656e6f756768205553445420746f2077697468647261770000000000604082015260600190565b6001600160a01b03929092168252602082015260400190565b60208082526010908201526f436c61696d206e6f742061637469766560801b604082015260600190565b60208082526019908201527f45544820546f6b656e207472616e73666572206661696c656400000000000000604082015260600190565b6020808252601a908201527f4e6f7420656e6f7567682045544820746f207769746864726177000000000000604082015260600190565b6020808252601a908201527f50726573616c6520697320616c7265616479207374617274656400000000000060408201526060019056fe000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a26469706673582212205de5962c3bf5760dd85de89964cee42bdd219a4b88ba48d06b16294b2b3c618664736f6c63430008140033

Deployed Bytecode Sourcemap

2231:31092:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4010:30;;;;;;;;;;-1:-1:-1;4010:30:0;;;;;;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;4010:30:0;;;;;;;;5215:302;;;;;;;;;;;;;:::i;:::-;;;352:25:1;;;340:2;325:18;5215:302:0;206:177:1;4184:35:0;;;;;;;;;;;;;;;;4101:34;;;;;;;;;;;;;;;;17165:4422;;;;;;;;;;-1:-1:-1;17165:4422:0;;;;;:::i;:::-;;:::i;:::-;;10893:212;;;;;;;;;;-1:-1:-1;10893:212:0;;;;;:::i;:::-;;:::i;3581:41::-;;;;;;;;;;;;;;;;3941:27;;;;;;;;;;-1:-1:-1;3941:27:0;;;;;;;;4357:39;;;;;;;;;;;;;;;;4490:30;;;;;;;;;;;;;;;;3749:32;;;;;;;;;;;;;;;;3186:33;;;;;;;;;;-1:-1:-1;3186:33:0;;;;-1:-1:-1;;;;;3186:33:0;;;;;;-1:-1:-1;;;;;1248:32:1;;;1230:51;;1218:2;1203:18;3186:33:0;1084:203:1;5592:266:0;;;;;;;;;;;;;:::i;4226:33::-;;;;;;;;;;;;;;;;7947:368;;;;;;;;;;-1:-1:-1;7947:368:0;;;;;:::i;:::-;;:::i;26302:745::-;;;;;;;;;;-1:-1:-1;26302:745:0;;;;;:::i;:::-;;:::i;3903:31::-;;;;;;;;;;;;;;;;24800:216;;;;;;;;;;;;;:::i;14158:2950::-;;;;;;:::i;:::-;;:::i;9859:205::-;;;;;;;;;;-1:-1:-1;9859:205:0;;;;;:::i;:::-;;:::i;32119:1201::-;;;;;;;;;;;;;:::i;4142:35::-;;;;;;;;;;;;;;;;29942:763;;;;;;;;;;;;;:::i;30748:540::-;;;;;;;;;;;;;:::i;7335:549::-;;;;;;;;;;-1:-1:-1;7335:549:0;;;;;:::i;:::-;;:::i;3975:28::-;;;;;;;;;;-1:-1:-1;3975:28:0;;;;;;;;;;;2834:52;;;;;;;;;;-1:-1:-1;2834:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;3167:25:1;;;3223:2;3208:18;;3201:34;;;;3140:18;2834:52:0;2993:248:1;3709:33:0;;;;;;;;;;;;;;;;3546:28;;;;;;;;;;;;;;;;3274:94;;;;;;;;;;;;3325:42;3274:94;;3788:26;;;;;;;;;;;;;;;;27106:1557;;;;;;;;;;;;;:::i;4655:27::-;;;;;;;;;;;;;;;;4729:25;;;;;;;;;;;;;;;;4311:39;;;;;;;;;;;;;;;;12226:338;;;;;;;;;;-1:-1:-1;12226:338:0;;;;;:::i;:::-;;:::i;1087:20::-;;;;;;;;;;-1:-1:-1;1087:20:0;;;;-1:-1:-1;;;;;1087:20:0;;;10072:190;;;;;;;;;;-1:-1:-1;10072:190:0;;;;;:::i;:::-;;:::i;4689:33::-;;;;;;;;;;;;;;;;8391:428;;;;;;;;;;-1:-1:-1;8391:428:0;;;;;:::i;:::-;;:::i;4610:38::-;;;;;;;;;;;;;;;;3629:32;;;;;;;;;;;;;;;;4266:38;;;;;;;;;;;;;;;;5062:103;;;;;;;;;;;;;:::i;2790:37::-;;;;;;;;;;-1:-1:-1;2790:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2790:37:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4624:32:1;;;4606:51;;4688:2;4673:18;;4666:34;;;;4716:18;;;4709:34;;;;4774:2;4759:18;;4752:34;;;;4817:3;4802:19;;4795:35;;;;4644:3;4846:19;;4839:35;4905:3;4890:19;;4883:35;4949:3;4934:19;;4927:35;4993:3;4978:19;;4971:35;4593:3;4578:19;2790:37:0;4235:777:1;28705:1193:0;;;;;;;;;;;;;:::i;3026:73::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3026:73:0;;11148:245;;;;;;;;;;;;;:::i;4403:40::-;;;;;;;;;;;;;;;;3821:30;;;;;;;;;;;;;;;;11815:403;;;;;;;;;;-1:-1:-1;11815:403:0;;;;;:::i;:::-;;:::i;3668:34::-;;;;;;;;;;;;;;;;9551:260;;;;;;;;;;;;;:::i;10607:234::-;;;;;;;;;;-1:-1:-1;10607:234:0;;;;;:::i;:::-;;:::i;2946:73::-;;;;;;;;;;;;2977:42;2946:73;;3511:28;;;;;;;;;;;;;;;;5918:139;;;;;;;;;;-1:-1:-1;5918:139:0;;;;;:::i;:::-;;:::i;:::-;;;;;;5481:13:1;;-1:-1:-1;;;;;5477:39:1;5459:58;;5573:4;5561:17;;;5555:24;5533:20;;;5526:54;5636:4;5624:17;;;5618:24;5596:20;;;5589:54;5699:4;5687:17;;;5681:24;5659:20;;;5652:54;5762:4;5750:17;;;5744:24;5722:20;;;5715:54;5504:3;5813:17;;;5807:24;5785:20;;;5778:54;5888:4;5876:17;;;5870:24;5848:20;;;5841:54;5951:4;5939:17;;;5933:24;5911:20;;;5904:54;5977:6;6025:15;;;6019:22;5999:18;;;5992:50;;;;5446:3;5431:19;;5270:778;12572:210:0;;;;;;;;;;-1:-1:-1;12572:210:0;;;;;:::i;:::-;;:::i;4450:33::-;;;;;;;;;;;;;;;;13407:667;;;;;;;;;;-1:-1:-1;13407:667:0;;;;;:::i;:::-;;:::i;4047:28::-;;;;;;;;;;-1:-1:-1;4047:28:0;;;;;;;;;;;23281:400;;;;;;;;;;;;;:::i;4563:40::-;;;;;;;;;;;;;;;;10316:238;;;;;;;;;;-1:-1:-1;10316:238:0;;;;;:::i;:::-;;:::i;6134:808::-;;;;;;;;;;;;;:::i;11401:406::-;;;;;;;;;;-1:-1:-1;11401:406:0;;;;;:::i;:::-;;:::i;8868:206::-;;;;;;;;;;-1:-1:-1;8868:206:0;;;;;:::i;:::-;;:::i;25386:874::-;;;;;;;;;;-1:-1:-1;25386:874:0;;;;;:::i;:::-;;:::i;3106:73::-;;;;;;;;;;;;3137:42;3106:73;;9122:382;;;;;;;;;;-1:-1:-1;9122:382:0;;;;;:::i;:::-;;:::i;1580:225::-;;;;;;;;;;-1:-1:-1;1580:225:0;;;;;:::i;:::-;;:::i;4527:29::-;;;;;;;;;;;;;;;;3428:32;;;;;;;;;;-1:-1:-1;3428:32:0;;;;;:::i;:::-;;:::i;5215:302::-;5267:7;5399:17;5455:8;5438:13;:11;:13::i;:::-;5421:14;;:30;;;;:::i;:::-;5420:43;;;;:::i;:::-;5399:65;;5500:9;5482:15;;:27;;;;:::i;:::-;5475:34;;;5215:302;:::o;17165:4422::-;2036:11;;-1:-1:-1;;;2036:11:0;;;;2028:55;;;;-1:-1:-1;;;2028:55:0;;;;;;;:::i;:::-;;;;;;;;;2108:5;2094:19;;-1:-1:-1;;;;2094:19:0;;;17319:16:::1;::::0;2094:19;17319:16;::::1;2094:19:::0;17319:16:::1;17318:17;:40:::0;::::1;;;-1:-1:-1::0;17340:18:0::1;::::0;;;::::1;;;17339:19;17318:40;17310:69;;;;-1:-1:-1::0;;;17310:69:0::1;;;;;;;:::i;:::-;17398:15;::::0;::::1;;17390:45;;;::::0;-1:-1:-1;;;17390:45:0;;7617:2:1;17390:45:0::1;::::0;::::1;7599:21:1::0;7656:2;7636:18;;;7629:30;-1:-1:-1;;;7675:18:1;;;7668:47;7732:18;;17390:45:0::1;7415:341:1::0;17390:45:0::1;17474:1;17452:19;;:23;:40;;;;-1:-1:-1::0;;;;;;17479:13:0;::::1;2977:42;17479:13;17452:40;17448:322;;;17545:19;;17535:6;:29;;17509:135;;;;-1:-1:-1::0;;;17509:135:0::1;;;;;;;:::i;:::-;17448:322;;;-1:-1:-1::0;;;;;;;17666:13:0;::::1;::::0;17662:108:::1;;17713:4;17704:6;:13;17696:62;;;;-1:-1:-1::0;;;17696:62:0::1;;;;;;;:::i;:::-;17805:1;17784:18;;:22;:39;;;;-1:-1:-1::0;;;;;;17810:13:0;::::1;-1:-1:-1::0;;;;;;;;;;;17810:13:0::1;17784:39;17780:320;;;17876:18;;17866:6;:28;;17840:134;;;;-1:-1:-1::0;;;17840:134:0::1;;;;;;;:::i;:::-;17780:320;;;-1:-1:-1::0;;;;;;;17996:13:0;::::1;::::0;17992:108:::1;;18043:4;18034:6;:13;18026:62;;;;-1:-1:-1::0;;;18026:62:0::1;;;;;;;:::i;:::-;18127:1;18118:6;:10;18110:52;;;;-1:-1:-1::0;;;18110:52:0::1;;;;;;;:::i;:::-;18195:50;::::0;-1:-1:-1;;;18195:50:0;;18219:10:::1;18195:50;::::0;::::1;9149:34:1::0;18239:4:0::1;9199:18:1::0;;;9192:43;18249:6:0;;-1:-1:-1;;;;;18195:23:0;::::1;::::0;::::1;::::0;9084:18:1;;18195:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;18173:133;;;::::0;-1:-1:-1;;;18173:133:0;;9637:2:1;18173:133:0::1;::::0;::::1;9619:21:1::0;9676:2;9656:18;;;9649:30;9715:25;9695:18;;;9688:53;9758:18;;18173:133:0::1;9435:347:1::0;18173:133:0::1;-1:-1:-1::0;;;;;18325:13:0;::::1;2977:42;18325:13;::::0;:30:::1;;-1:-1:-1::0;;;;;;18342:13:0;::::1;-1:-1:-1::0;;;;;;;;;;;18342:13:0::1;18325:30;18317:64;;;::::0;-1:-1:-1;;;18317:64:0;;9989:2:1;18317:64:0::1;::::0;::::1;9971:21:1::0;10028:2;10008:18;;;10001:30;-1:-1:-1;;;10047:18:1;;;10040:51;10108:18;;18317:64:0::1;9787:345:1::0;18317:64:0::1;-1:-1:-1::0;;;;;;;18398:13:0;::::1;::::0;18394:500:::1;;18477:131;::::0;-1:-1:-1;;;18477:131:0;;18526:10:::1;18477:131;::::0;::::1;10377:34:1::0;18563:4:0::1;10427:18:1::0;;;10420:43;10479:18;;;10472:34;;;-1:-1:-1;;;;;18477:30:0;::::1;::::0;::::1;::::0;10312:18:1;;18477:131:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;18394:500;;;18702:127;::::0;-1:-1:-1;;;18702:127:0;;18747:10:::1;18702:127;::::0;::::1;10377:34:1::0;18784:4:0::1;10427:18:1::0;;;10420:43;10479:18;;;10472:34;;;18690:9:0::1;::::0;-1:-1:-1;;;;;18702:26:0;::::1;::::0;::::1;::::0;10312:18:1;;18702:127:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18690:139;;18852:4;18844:38;;;;-1:-1:-1::0;;;18844:38:0::1;;;;;;;:::i;:::-;18626:268;18394:500;18932:11;;18910:18;;:33:::0;18906:227:::1;;18979:23;;18964:12;;:38;18960:162;;;19023:16;:14;:16::i;:::-;18960:162;;;19080:26;;-1:-1:-1::0;;;19080:26:0::1;;;;;;;:::i;18960:162::-;19145:18;-1:-1:-1::0;;;;;;;19178:13:0;::::1;::::0;19174:400:::1;;19214:10;19208:17;::::0;;;:5:::1;:17;::::0;;;;:39:::1;;:49:::0;;19251:6;;19208:17;:49:::1;::::0;19251:6;;19208:49:::1;:::i;:::-;::::0;;;-1:-1:-1;;19309:13:0::1;::::0;19286:19:::1;:6:::0;19295:10:::1;19286:19;:::i;:::-;19285:37;;;;:::i;:::-;19272:50;;19356:6;19337:15;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;19174:400:0::1;::::0;-1:-1:-1;19174:400:0::1;;19401:10;19395:17;::::0;;;:5:::1;:17;::::0;;;;:38:::1;;:48:::0;;19437:6;;19395:17;:48:::1;::::0;19437:6;;19395:48:::1;:::i;:::-;::::0;;;-1:-1:-1;;19499:13:0::1;::::0;19516:7:::1;::::0;19482:13:::1;:11;:13::i;:::-;19473:22;::::0;:6;:22:::1;:::i;:::-;19472:40;;;;:::i;:::-;19471:52;;;;:::i;:::-;19458:65;;19556:6;19538:14;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;19174:400:0::1;19590:17;::::0;:21;19586:248:::1;;19730:17;::::0;19660:10:::1;19654:17;::::0;;;:5:::1;:17;::::0;;;;:38:::1;;::::0;:51:::1;::::0;19695:10;;19654:51:::1;:::i;:::-;:93;;19628:194;;;;-1:-1:-1::0;;;19628:194:0::1;;;;;;;:::i;:::-;19884:11;;19871:10;19850:18;;:31;;;;:::i;:::-;:45;19846:1302;;;19931:23;;19916:12;;:38;19912:908;;;19975:24;20016:18;;20002:11;;:32;;;;:::i;:::-;19975:59;;20053:16;20130:8;20092:13;;20073:16;:32;;;;:::i;:::-;20072:66;;;;:::i;:::-;20053:85:::0;-1:-1:-1;20157:22:0::1;-1:-1:-1::0;;;;;;;20202:13:0;::::1;::::0;20198:186:::1;;-1:-1:-1::0;20257:6:0;20198:186:::1;;;20356:8;20339:13;:11;:13::i;:::-;20330:22;::::0;:6;:22:::1;:::i;:::-;20329:35;;;;:::i;:::-;20312:52;;20198:186;20402:16;:14;:16::i;:::-;20525:13;::::0;20437:21:::1;::::0;20463:25:::1;20480:8:::0;20463:14;:25:::1;:::i;:::-;20462:59;::::0;20513:8:::1;20462:59;:::i;:::-;20461:77;;;;:::i;:::-;20437:101:::0;-1:-1:-1;20570:32:0::1;20437:101:::0;20570:16;:32:::1;:::i;:::-;20557:45;;20643:13;20621:18;;:35;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;20705:11:0::1;::::0;20683:18:::1;::::0;:33:::1;;20675:62;;;;-1:-1:-1::0;;;20675:62:0::1;;;;;;;:::i;:::-;19956:797;;;;19846:1302;;;20876:11;;20862:10;20841:18;;:31;;;;:::i;:::-;:46:::0;20837:311:::1;;20923:23;;20908:12;;:38;20904:168;;;20967:16;:14;:16::i;:::-;20837:311;;20904:168;21046:10;21024:18;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;20837:311:0::1;::::0;-1:-1:-1;20837:311:0::1;;21126:10;21104:18;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;20837:311:0::1;21166:10;21160:17;::::0;;;:5:::1;:17;::::0;;;;:38:::1;;:52:::0;;21202:10;;21160:17;:52:::1;::::0;21202:10;;21160:52:::1;:::i;:::-;;;;;;;;21245:10;21223:18;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;21272:22:0;::::1;::::0;21268:88:::1;;21311:33;21323:10;21335:8;21311:11;:33::i;:::-;21423:13;::::0;:17;21419:98:::1;;21457:48;21479:10;21491:5;21498:6;21457:21;:48::i;:::-;21534:45;::::0;352:25:1;;;-1:-1:-1;;;;;21534:45:0;::::1;::::0;21550:10:::1;::::0;21534:45:::1;::::0;340:2:1;325:18;21534:45:0::1;;;;;;;-1:-1:-1::0;;2136:11:0;:18;;-1:-1:-1;;;;2136:18:0;-1:-1:-1;;;2136:18:0;;;-1:-1:-1;;17165:4422:0:o;10893:212::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;10988:16:::1;::::0;::::1;::::0;::::1;;;10987:17;:40:::0;::::1;;;-1:-1:-1::0;11009:18:0::1;::::0;;;::::1;;;11008:19;10987:40;10979:69;;;;-1:-1:-1::0;;;10979:69:0::1;;;;;;;:::i;:::-;11059:17;:38:::0;10893:212::o;5592:266::-;5643:7;;;5701:117;5725:15;:22;5721:26;;5701:117;;;5788:15;5804:1;5788:18;;;;;;;;:::i;:::-;;;;;;;;;5769:37;;;;;:::i;:::-;;-1:-1:-1;5749:3:0;;;;:::i;:::-;;;;5701:117;;;-1:-1:-1;5835:15:0;5592:266;-1:-1:-1;5592:266:0:o;7947:368::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;8079:16:::1;::::0;::::1;::::0;::::1;;;8078:17;:40:::0;::::1;;;-1:-1:-1::0;8100:18:0::1;::::0;;;::::1;;;8099:19;8078:40;8070:69;;;;-1:-1:-1::0;;;8070:69:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8172:18:0;::::1;;::::0;;;:5:::1;:18;::::0;;;;;;:31:::1;::::0;8150:18:::1;:53:::0;;8172:31;;8150:18;;:53:::1;::::0;8172:31;;8150:53:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;8214:18:0;::::1;;::::0;;;:5:::1;:18;::::0;;;;;;:31:::1;:47:::0;;;8272:18:::1;:35:::0;;8248:13;;8214:18;8272:35:::1;::::0;8248:13;;8272:35:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;7947:368:0:o;26302:745::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;2036:11:::1;::::0;-1:-1:-1;;;2036:11:0;::::1;;;2028:55;;;;-1:-1:-1::0;;;2028:55:0::1;;;;;;;:::i;:::-;2108:5;2094:19:::0;;-1:-1:-1;;;;2094:19:0::1;::::0;;26401:37:::2;::::0;-1:-1:-1;;;26401:37:0;;26432:4:::2;26401:37;::::0;::::2;1230:51:1::0;2977:42:0::2;::::0;26401:22:::2;::::0;1203:18:1;;26401:37:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26384:54;;26467:7;26457:6;:17;;26449:57;;;;-1:-1:-1::0;;;26449:57:0::2;;;;;;;:::i;:::-;26581:24;;26558:20;;:47;;;;:::i;:::-;26539:16;26548:7:::0;26539:6;:16:::2;:::i;:::-;:66;26517:143;;;;-1:-1:-1::0;;;26517:143:0::2;;;;;;;:::i;:::-;26677:18;::::0;-1:-1:-1;;;;;26677:18:0::2;:32:::0;;::::2;::::0;:50:::2;;;26726:1;26713:10;;:14;26677:50;26673:308;;;26744:24;26796:4;26782:10;;26772:7;:20;;;;:::i;:::-;26771:29;;;;:::i;:::-;26859:18;::::0;26815:112:::2;::::0;-1:-1:-1;;;26815:112:0;;26744:56;;-1:-1:-1;2977:42:0::2;::::0;26815:25:::2;::::0;:112:::2;::::0;-1:-1:-1;;;;;26859:18:0;;::::2;::::0;26744:56;;26815:112:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;26953:16;26942:27;;;;;:::i;:::-;;;26729:252;26673:308;26993:46;::::0;-1:-1:-1;;;26993:46:0;;2977:42:::2;::::0;26993:25:::2;::::0;:46:::2;::::0;27019:10:::2;::::0;27031:7;;26993:46:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;2136:11:0::1;:18:::0;;-1:-1:-1;;;;2136:18:0::1;-1:-1:-1::0;;;2136:18:0::1;::::0;;-1:-1:-1;;;;26302:745:0:o;24800:216::-;2036:11;;-1:-1:-1;;;2036:11:0;;;;2028:55;;;;-1:-1:-1;;;2028:55:0;;;;;;;:::i;:::-;2108:5;2094:19;;-1:-1:-1;;;;2094:19:0;;;24864:16:::1;::::0;2094:19;24864:16;::::1;2094:19:::0;24864:16:::1;24856:45;;;;-1:-1:-1::0;;;24856:45:0::1;;;;;;;:::i;:::-;24926:10;24961:1;24920:17:::0;;;:5:::1;:17;::::0;;;;:38:::1;;::::0;24912:71:::1;;;::::0;-1:-1:-1;;;24912:71:0;;13805:2:1;24912:71:0::1;::::0;::::1;13787:21:1::0;13844:2;13824:18;;;13817:30;-1:-1:-1;;;13863:18:1;;;13856:46;13919:18;;24912:71:0::1;13603:340:1::0;24912:71:0::1;24994:14;:12;:14::i;:::-;2136:11:::0;:18;;-1:-1:-1;;;;2136:18:0;-1:-1:-1;;;2136:18:0;;;24800:216::o;14158:2950::-;2036:11;;-1:-1:-1;;;2036:11:0;;;;2028:55;;;;-1:-1:-1;;;2028:55:0;;;;;;;:::i;:::-;2108:5;2094:19;;-1:-1:-1;;;;2094:19:0;;;14253:16:::1;::::0;2094:19;14253:16;::::1;2094:19:::0;14253:16:::1;14252:17;:40:::0;::::1;;;-1:-1:-1::0;14274:18:0::1;::::0;;;::::1;;;14273:19;14252:40;14244:69;;;;-1:-1:-1::0;;;14244:69:0::1;;;;;;;:::i;:::-;14332:15;::::0;::::1;;14324:45;;;::::0;-1:-1:-1;;;14324:45:0;;7617:2:1;14324:45:0::1;::::0;::::1;7599:21:1::0;7656:2;7636:18;;;7629:30;-1:-1:-1;;;7675:18:1;;;7668:47;7732:18;;14324:45:0::1;7415:341:1::0;14324:45:0::1;14386:18;::::0;:22;14382:290:::1;;14464:18;;14451:9;:31;;14425:137;;;;-1:-1:-1::0;;;14425:137:0::1;;;;;;;:::i;:::-;14382:290;;;14615:4;14603:9;:16;14595:65;;;;-1:-1:-1::0;;;14595:65:0::1;;;;;;;:::i;:::-;14704:1;14692:9;:13;14684:55;;;;-1:-1:-1::0;;;14684:55:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;;;;;;;;;;;14750:12:0::1;;14770:9;14750:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;14801:10:0::1;14795:17;::::0;;;:5:::1;:17;::::0;;;;:38:::1;;:51:::0;;14837:9:::1;::::0;-1:-1:-1;14795:38:0;;-1:-1:-1;14795:17:0;;-1:-1:-1;14795:51:0::1;::::0;14837:9;;14795:51:::1;:::i;:::-;::::0;;;-1:-1:-1;;14885:11:0::1;::::0;14863:18:::1;::::0;:33;14859:227:::1;;14932:23;;14917:12;;:38;14913:162;;;14976:16;:14;:16::i;:::-;15098:18;15180:7;15150:13;;15133;:11;:13::i;:::-;15121:25;::::0;:9:::1;:25;:::i;:::-;15120:43;;;;:::i;:::-;15119:68;;;;:::i;:::-;15231:17;::::0;15098:89;;-1:-1:-1;15231:21:0;15227:248:::1;;15371:17;::::0;15301:10:::1;15295:17;::::0;;;:5:::1;:17;::::0;;;;:38:::1;;::::0;:51:::1;::::0;15336:10;;15295:51:::1;:::i;:::-;:93;;15269:194;;;;-1:-1:-1::0;;;15269:194:0::1;;;;;;;:::i;:::-;15525:11;;15512:10;15491:18;;:31;;;;:::i;:::-;:45;15487:1139;;;15572:23;;15557:12;;:38;15553:745;;;15616:24;15657:18;;15643:11;;:32;;;;:::i;:::-;15616:59;;15694:16;15771:8;15733:13;;15714:16;:32;;;;:::i;:::-;15713:66;;;;:::i;:::-;15694:85;;15798:22;15853:8;15836:13;:11;:13::i;:::-;15824:25;::::0;:9:::1;:25;:::i;:::-;15823:38;;;;:::i;:::-;15798:63;;15880:16;:14;:16::i;:::-;16003:13;::::0;15915:21:::1;::::0;15941:25:::1;15958:8:::0;15941:14;:25:::1;:::i;:::-;15940:59;::::0;15991:8:::1;15940:59;:::i;:::-;15939:77;;;;:::i;:::-;15915:101:::0;-1:-1:-1;16048:32:0::1;15915:101:::0;16048:16;:32:::1;:::i;:::-;16035:45;;16121:13;16099:18;;:35;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;16183:11:0::1;::::0;16161:18:::1;::::0;:33:::1;;16153:62;;;;-1:-1:-1::0;;;16153:62:0::1;;;;;;;:::i;:::-;15597:634;;;;15487:1139;;;16354:11;;16340:10;16319:18;;:31;;;;:::i;:::-;:46:::0;16315:311:::1;;16401:23;;16386:12;;:38;16382:168;;;16445:16;:14;:16::i;:::-;16315:311;;16382:168;16524:10;16502:18;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;16315:311:0::1;::::0;-1:-1:-1;16315:311:0::1;;16604:10;16582:18;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;16315:311:0::1;16644:10;16638:17;::::0;;;:5:::1;:17;::::0;;;;:38:::1;;:52:::0;;16680:10;;16638:17;:52:::1;::::0;16680:10;;16638:52:::1;:::i;:::-;;;;;;;;16723:10;16701:18;;:32;;;;;;;:::i;:::-;;;;;;;;16762:9;16744:14;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;16788:22:0;::::1;::::0;16784:88:::1;;16827:33;16839:10;16851:8;16827:11;:33::i;:::-;16939:13;::::0;:17;16935:100:::1;;16973:50;16995:10;-1:-1:-1::0;;;;;;;;;;;17013:9:0::1;16973:21;:50::i;:::-;17052:48;::::0;17080:9:::1;352:25:1::0;;-1:-1:-1;;;;;17052:48:0;::::1;::::0;17068:10:::1;::::0;17052:48:::1;::::0;340:2:1;325:18;17052:48:0::1;;;;;;;-1:-1:-1::0;;2136:11:0;:18;;-1:-1:-1;;;;2136:18:0;-1:-1:-1;;;2136:18:0;;;14158:2950::o;9859:205::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;9949:16:::1;::::0;::::1;::::0;::::1;;;9948:17;:40:::0;::::1;;;-1:-1:-1::0;9970:18:0::1;::::0;;;::::1;;;9969:19;9948:40;9940:69;;;;-1:-1:-1::0;;;9940:69:0::1;;;;;;;:::i;:::-;10020:16;:36:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;10020:36:0;;::::1;::::0;;;::::1;::::0;;9859:205::o;32119:1201::-;2036:11;;-1:-1:-1;;;2036:11:0;;;;2028:55;;;;-1:-1:-1;;;2028:55:0;;;;;;;:::i;:::-;2108:5;2094:19;;-1:-1:-1;;;;2094:19:0;;;32177:16:::1;::::0;2094:19;32177:16;::::1;2094:19:::0;32177:16:::1;32169:45;;;;-1:-1:-1::0;;;32169:45:0::1;;;;;;;:::i;:::-;32253:10;32287:1;32247:17:::0;;;:5:::1;:17;::::0;;;;:37:::1;;::::0;:41;;;:102:::1;;-1:-1:-1::0;32315:10:0::1;32348:1;32309:17:::0;;;:5:::1;:17;::::0;;;;:36:::1;;::::0;:40;;32247:102:::1;:164;;;-1:-1:-1::0;32376:10:0::1;32410:1;32370:17:::0;;;:5:::1;:17;::::0;;;;:37:::1;;::::0;:41;;32247:164:::1;:227;;;-1:-1:-1::0;32438:10:0::1;32473:1;32432:17:::0;;;:5:::1;:17;::::0;;;;:38:::1;;::::0;:42;;32247:227:::1;:427;;;-1:-1:-1::0;32502:10:0::1;32496:17;::::0;;;:5:::1;:17;::::0;;;;:34:::1;;::::0;32534:1:::1;-1:-1:-1::0;32496:39:0;::::1;::::0;:118:::1;;-1:-1:-1::0;32586:10:0::1;32580:17;::::0;;;:5:::1;:17;::::0;;;;:34:::1;;::::0;32560:17:::1;:15;:17::i;:::-;:54;32496:118;:177;;;;-1:-1:-1::0;32645:10:0::1;32672:1;32639:17:::0;;;:5:::1;:17;::::0;;;;;;;:30:::1;::::0;:34;;32496:177:::1;32225:500;;;::::0;-1:-1:-1;;;32225:500:0;;14150:2:1;32225:500:0::1;::::0;::::1;14132:21:1::0;14189:2;14169:18;;;14162:30;-1:-1:-1;;;14208:18:1;;;14201:53;14271:18;;32225:500:0::1;13948:347:1::0;32225:500:0::1;32760:10;32794:1;32754:17:::0;;;:5:::1;:17;::::0;;;;:37:::1;;::::0;:41;;;:98:::1;;-1:-1:-1::0;32818:10:0::1;32851:1;32812:17:::0;;;:5:::1;:17;::::0;;;;:36:::1;;::::0;:40;;32754:98:::1;:156;;;-1:-1:-1::0;32875:10:0::1;32909:1;32869:17:::0;;;:5:::1;:17;::::0;;;;:37:::1;;::::0;:41;;32754:156:::1;32736:235;;;32937:22;:20;:22::i;:::-;32991:10;33026:1;32985:17:::0;;;:5:::1;:17;::::0;;;;:38:::1;;::::0;:42;32981:89:::1;;33044:14;:12;:14::i;:::-;33104:10;33098:17;::::0;;;:5:::1;:17;::::0;;;;:34:::1;;::::0;33136:1:::1;-1:-1:-1::0;33098:39:0;::::1;::::0;:110:::1;;-1:-1:-1::0;33180:10:0::1;33174:17;::::0;;;:5:::1;:17;::::0;;;;:34:::1;;::::0;33154:17:::1;:15;:17::i;:::-;:54;33098:110;:161;;;;-1:-1:-1::0;33231:10:0::1;33258:1;33225:17:::0;;;:5:::1;:17;::::0;;;;;;;:30:::1;::::0;:34;;33098:161:::1;33080:233;;;33286:15;:13;:15::i;29942:763::-:0;2036:11;;-1:-1:-1;;;2036:11:0;;;;2028:55;;;;-1:-1:-1;;;2028:55:0;;;;;;;:::i;:::-;2108:5;2094:19;;-1:-1:-1;;;;2094:19:0;;;30001:18:::1;::::0;;;::::1;2094:19:::0;30001:18:::1;29993:61;;;::::0;-1:-1:-1;;;29993:61:0;;14502:2:1;29993:61:0::1;::::0;::::1;14484:21:1::0;14541:2;14521:18;;;14514:30;14580:32;14560:18;;;14553:60;14630:18;;29993:61:0::1;14300:354:1::0;29993:61:0::1;30092:10;30065:18;30086:17:::0;;;:5:::1;:17;::::0;;;;:39:::1;::::0;::::1;::::0;30156:38:::1;::::0;;::::1;::::0;30227:14;;;;:31:::1;;;30257:1;30245:9;:13;30227:31;30205:110;;;;-1:-1:-1::0;;;30205:110:0::1;;;;;;;:::i;:::-;30332:10;30368:1;30326:17:::0;;;:5:::1;:17;::::0;;;;:39:::1;::::0;::::1;:43:::0;;;30380:38:::1;;:42:::0;30437:14;;30433:96:::1;;30468:49;::::0;-1:-1:-1;;;30468:49:0;;2977:42:::1;::::0;30468:25:::1;::::0;:49:::1;::::0;30494:10:::1;::::0;30506;;30468:49:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30433:96;30543:13:::0;;30539:159:::1;;30585:44;::::0;-1:-1:-1;;;30585:44:0;;30573:9:::1;::::0;-1:-1:-1;;;;;;;;;;;3057:42:0;30585:21:::1;::::0;:44:::1;::::0;30607:10:::1;::::0;30619:9;;30585:44:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30573:56;;30652:4;30644:42;;;;-1:-1:-1::0;;;30644:42:0::1;;;;;;;:::i;:::-;30558:140;30539:159;-1:-1:-1::0;;2136:11:0;:18;;-1:-1:-1;;;;2136:18:0;-1:-1:-1;;;2136:18:0;;;29942:763::o;30748:540::-;2036:11;;-1:-1:-1;;;2036:11:0;;;;2028:55;;;;-1:-1:-1;;;2028:55:0;;;;;;;:::i;:::-;2108:5;2094:19;;-1:-1:-1;;;;2094:19:0;;;30813:16:::1;::::0;2094:19;30813:16;::::1;2094:19:::0;30813:16:::1;30805:45;;;;-1:-1:-1::0;;;30805:45:0::1;;;;;;;:::i;:::-;30889:10;30883:17;::::0;;;:5:::1;:17;::::0;;;;:34:::1;;::::0;30921:1:::1;-1:-1:-1::0;30883:39:0::1;30861:112;;;::::0;-1:-1:-1;;;30861:112:0;;15215:2:1;30861:112:0::1;::::0;::::1;15197:21:1::0;15254:2;15234:18;;;15227:30;15293:25;15273:18;;;15266:53;15336:18;;30861:112:0::1;15013:347:1::0;30861:112:0::1;30988:15;::::0;:19;30984:269:::1;;31076:10;31070:17;::::0;;;:5:::1;:17;::::0;;;;:34:::1;;::::0;31050:17:::1;:15;:17::i;:::-;:54;31024:136;;;::::0;-1:-1:-1;;;31024:136:0;;15567:2:1;31024:136:0::1;::::0;::::1;15549:21:1::0;15606:2;15586:18;;;15579:30;-1:-1:-1;;;15625:18:1;;;15618:50;15685:18;;31024:136:0::1;15365:344:1::0;31024:136:0::1;31189:10;31216:1;31183:17:::0;;;:5:::1;:17;::::0;;;;;;;:30:::1;::::0;31175:66:::1;;;::::0;-1:-1:-1;;;31175:66:0;;15916:2:1;31175:66:0::1;::::0;::::1;15898:21:1::0;15955:2;15935:18;;;15928:30;-1:-1:-1;;;15974:18:1;;;15967:49;16033:18;;31175:66:0::1;15714:343:1::0;31175:66:0::1;31265:15;:13;:15::i;7335:549::-:0;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;7478:16:::1;::::0;::::1;::::0;::::1;;;7477:17;:40:::0;::::1;;;-1:-1:-1::0;7499:18:0::1;::::0;;;::::1;;;7498:19;7477:40;7469:69;;;;-1:-1:-1::0;;;7469:69:0::1;;;;;;;:::i;:::-;7592:3;7571:24:::0;::::1;7549:119;;;::::0;-1:-1:-1;;;7549:119:0;;16264:2:1;7549:119:0::1;::::0;::::1;16246:21:1::0;16303:2;16283:18;;;16276:30;16342:34;16322:18;;;16315:62;-1:-1:-1;;;16393:18:1;;;16386:43;16446:19;;7549:119:0::1;16062:409:1::0;7549:119:0::1;7686:9;7681:127;7701:22:::0;;::::1;7681:127;;;7783:13;7745:5;:21;7751:11;;7763:1;7751:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7745:21:0::1;-1:-1:-1::0;;;;;7745:21:0::1;;;;;;;;;;;;:34;;;:51;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;7725:3:0;;-1:-1:-1;7725:3:0::1;::::0;::::1;:::i;:::-;;;;7681:127;;;-1:-1:-1::0;7842:34:0::1;7863:13:::0;7842:11;:34:::1;:::i;:::-;7820:18;;:56;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;7335:549:0:o;27106:1557::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;2036:11:::1;::::0;-1:-1:-1;;;2036:11:0;::::1;;;2028:55;;;;-1:-1:-1::0;;;2028:55:0::1;;;;;;;:::i;:::-;2108:5;2094:19:::0;;-1:-1:-1;;;;2094:19:0::1;::::0;;27180:16:::2;::::0;2094:19:::1;27180:16:::0;::::2;2094:19:::1;27180:16:::2;27172:53;;;::::0;-1:-1:-1;;;27172:53:0;;16678:2:1;27172:53:0::2;::::0;::::2;16660:21:1::0;16717:2;16697:18;;;16690:30;16756:26;16736:18;;;16729:54;16800:18;;27172:53:0::2;16476:348:1::0;27172:53:0::2;27257:37;::::0;-1:-1:-1;;;27257:37:0;;27288:4:::2;27257:37;::::0;::::2;1230:51:1::0;27236:18:0::2;::::0;2977:42:::2;::::0;27257:22:::2;::::0;1203:18:1;;27257:37:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27325;::::0;-1:-1:-1;;;27325:37:0;;27356:4:::2;27325:37;::::0;::::2;1230:51:1::0;27236:58:0;;-1:-1:-1;27305:17:0::2;::::0;-1:-1:-1;;;;;;;;;;;3057:42:0;27325:22:::2;::::0;1203:18:1;;27325:37:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27305:57;;27431:24;;27408:20;;:47;;;;:::i;:::-;27395:10;:60;27373:137;;;;-1:-1:-1::0;;;27373:137:0::2;;;;;;;:::i;:::-;27577:23;;27555:19;;:45;;;;:::i;:::-;27543:9;:57;27521:133;;;;-1:-1:-1::0;;;27521:133:0::2;;;;;;;:::i;:::-;27704:24;;27681:20;;:47;;;;:::i;:::-;27667:61;::::0;;::::2;:::i;:::-;;;27774:23;;27752:19;;:45;;;;:::i;:::-;27739:58;::::0;;::::2;:::i;:::-;27814:18;::::0;27739:58;;-1:-1:-1;;;;;;27814:18:0::2;:32:::0;;::::2;::::0;:50:::2;;;27863:1;27850:10;;:14;27814:50;27810:658;;;27881:28;27940:4;27926:10;;27913;:23;;;;:::i;:::-;27912:32;;;;:::i;:::-;27881:63;;27959:27;28016:4;28002:10;;27990:9;:22;;;;:::i;:::-;27989:31;;;;:::i;:::-;28079:18;::::0;28035:116:::2;::::0;-1:-1:-1;;;28035:116:0;;27959:61;;-1:-1:-1;2977:42:0::2;::::0;28035:25:::2;::::0;:116:::2;::::0;-1:-1:-1;;;;;28079:18:0;;::::2;::::0;28116:20;;28035:116:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;28225:18:0::2;::::0;28185:111:::2;::::0;-1:-1:-1;;;28185:111:0;;28166:16:::2;::::0;-1:-1:-1;;;;;;;;;;;;3057:42:0;-1:-1:-1;28185:21:0::2;::::0;:111:::2;::::0;-1:-1:-1;;;;;28225:18:0;;::::2;::::0;28262:19;;28185:111:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28166:130;;28319:11;28311:49;;;;-1:-1:-1::0;;;28311:49:0::2;;;;;;;:::i;:::-;28375:34;28389:20:::0;28375:34;::::2;:::i;:::-;::::0;-1:-1:-1;28424:32:0::2;28437:19:::0;28424:32;::::2;:::i;:::-;;;27866:602;;;27810:658;28480:49;::::0;-1:-1:-1;;;28480:49:0;;2977:42:::2;::::0;28480:25:::2;::::0;:49:::2;::::0;28506:10:::2;::::0;28518;;28480:49:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;28555:44:0::2;::::0;-1:-1:-1;;;28555:44:0;;28540:12:::2;::::0;-1:-1:-1;;;;;;;;;;;;3057:42:0;-1:-1:-1;28555:21:0::2;::::0;:44:::2;::::0;28577:10:::2;::::0;28589:9;;28555:44:::2;;;:::i;12226:338::-:0;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;12377:16:::1;::::0;::::1;::::0;::::1;;;12376:17;:40:::0;::::1;;;-1:-1:-1::0;12398:18:0::1;::::0;;;::::1;;;12397:19;12376:40;12354:116;;;;-1:-1:-1::0;;;12354:116:0::1;;;;;;;:::i;:::-;12481:10;:24:::0;;;;12516:18:::1;:40:::0;;-1:-1:-1;;;;;;12516:40:0::1;-1:-1:-1::0;;;;;12516:40:0;;::::1;::::0;;;::::1;::::0;;12226:338::o;10072:190::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;10153:16:::1;::::0;::::1;::::0;::::1;;;10152:17;:40:::0;::::1;;;-1:-1:-1::0;10174:18:0::1;::::0;;;::::1;;;10173:19;10152:40;10144:69;;;;-1:-1:-1::0;;;10144:69:0::1;;;;;;;:::i;:::-;10224:13;:30:::0;10072:190::o;8391:428::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;8537:16:::1;::::0;::::1;::::0;::::1;;;8536:17;:40:::0;::::1;;;-1:-1:-1::0;8558:18:0::1;::::0;;;::::1;;;8557:19;8536:40;8528:69;;;;-1:-1:-1::0;;;8528:69:0::1;;;;;;;:::i;:::-;8630:41:::0;;::::1;8608:117;;;::::0;-1:-1:-1;;;8608:117:0;;17741:2:1;8608:117:0::1;::::0;::::1;17723:21:1::0;17780:2;17760:18;;;17753:30;17819:28;17799:18;;;17792:56;17865:18;;8608:117:0::1;17539:350:1::0;8608:117:0::1;8736:13;:30:::0;;;8777:34:::1;:15;8795:16:::0;;8777:34:::1;:::i;:::-;;8391:428:::0;;;:::o;5062:103::-;5106:7;3325:42;-1:-1:-1;;;;;5133:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5126:31;;5062:103;:::o;28705:1193::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;2036:11:::1;::::0;-1:-1:-1;;;2036:11:0;::::1;;;2028:55;;;;-1:-1:-1::0;;;2028:55:0::1;;;;;;;:::i;:::-;2108:5;2094:19:::0;;-1:-1:-1;;;;2094:19:0::1;::::0;;28789:37:::2;::::0;-1:-1:-1;;;28789:37:0;;28820:4:::2;28789:37;::::0;::::2;1230:51:1::0;3137:42:0::2;::::0;28789:22:::2;::::0;1203:18:1;;28789:37:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28841:16;::::0;28772:54;;-1:-1:-1;28841:16:0::2;::::0;::::2;;;28837:1053;;;29175:25;;29122;;29070:24;;29024:18;;28978;;28930:20;;:66;;;;:::i;:::-;:112;;;;:::i;:::-;:164;;;;:::i;:::-;:217;;;;:::i;:::-;:270;;;;:::i;:::-;28900:6;:300;28874:389;;;::::0;-1:-1:-1;;;28874:389:0;;18096:2:1;28874:389:0::2;::::0;::::2;18078:21:1::0;18135:2;18115:18;;;18108:30;18174:29;18154:18;;;18147:57;18221:18;;28874:389:0::2;17894:351:1::0;28874:389:0::2;29510:25;;29465;;29421:24;;29383:18;;29345;;29305:20;;:58;;;;:::i;:::-;:96;;;;:::i;:::-;:140;;;;:::i;:::-;:185;;;;:::i;:::-;:230;;;;:::i;:::-;29278:257;::::0;;::::2;:::i;:::-;29562:41;::::0;-1:-1:-1;;;29562:41:0;;29278:257;;-1:-1:-1;29550:9:0::2;::::0;3137:42:::2;::::0;29562:21:::2;::::0;:41:::2;::::0;29584:10:::2;::::0;29278:257;;29562:41:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29550:53;;29626:4;29618:43;;;::::0;-1:-1:-1;;;29618:43:0;;18452:2:1;29618:43:0::2;::::0;::::2;18434:21:1::0;18491:2;18471:18;;;18464:30;18530:28;18510:18;;;18503:56;18576:18;;29618:43:0::2;18250:350:1::0;29618:43:0::2;28859:814;28837:1053;;;29683:18;::::0;;;::::2;;;:32:::0;::::2;;;;29714:1;29705:6;:10;29683:32;29679:211;;;29744:41;::::0;-1:-1:-1;;;29744:41:0;;29732:9:::2;::::0;3137:42:::2;::::0;29744:21:::2;::::0;:41:::2;::::0;29766:10:::2;::::0;29778:6;;29744:41:::2;;;:::i;29679:211::-;29861:29;::::0;-1:-1:-1;;;29861:29:0;;18807:2:1;29861:29:0::2;::::0;::::2;18789:21:1::0;18846:2;18826:18;;;18819:30;-1:-1:-1;;;18865:18:1;;;18858:49;18924:18;;29861:29:0::2;18605:343:1::0;29679:211:0::2;-1:-1:-1::0;2136:11:0::1;:18:::0;;-1:-1:-1;;;;2136:18:0::1;-1:-1:-1::0;;;2136:18:0::1;::::0;;28705:1193::o;11148:245::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;11226:16:::1;::::0;::::1;::::0;::::1;;;11225:17;:40:::0;::::1;;;-1:-1:-1::0;11247:18:0::1;::::0;;;::::1;;;11246:19;11225:40;11217:69;;;;-1:-1:-1::0;;;11217:69:0::1;;;;;;;:::i;:::-;11319:1;11297:19;:23:::0;;;11331:18:::1;:22:::0;;;11364:17:::1;:21:::0;11148:245::o;11815:403::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;11964:15:::1;::::0;::::1;;11963:16;:37:::0;::::1;;;-1:-1:-1::0;11984:16:0::1;::::0;::::1;::::0;::::1;;;11983:17;11963:37;:60;;;;-1:-1:-1::0;12005:18:0::1;::::0;;;::::1;;;12004:19;11963:60;11941:136;;;;-1:-1:-1::0;;;11941:136:0::1;;;;;;;:::i;:::-;12105:1;12096:6;:10;12088:51;;;::::0;-1:-1:-1;;;12088:51:0;;19155:2:1;12088:51:0::1;::::0;::::1;19137:21:1::0;19194:2;19174:18;;;19167:30;19233;19213:18;;;19206:58;19281:18;;12088:51:0::1;18953:352:1::0;12088:51:0::1;12196:14:::0;12150:17:::1;:29;12168:10;12177:1;12168:6:::0;:10:::1;:::i;:::-;12150:29:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;12150:29:0;:60;-1:-1:-1;;11815:403:0:o;9551:260::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;9618:16:::1;::::0;::::1;::::0;::::1;;;9617:17;:40:::0;::::1;;;-1:-1:-1::0;9639:18:0::1;::::0;;;::::1;;;9638:19;9617:40;9609:69;;;;-1:-1:-1::0;;;9609:69:0::1;;;;;;;:::i;:::-;9698:15;::::0;::::1;;9697:16;9689:54;;;::::0;-1:-1:-1;;;9689:54:0;;19512:2:1;9689:54:0::1;::::0;::::1;19494:21:1::0;19551:2;19531:18;;;19524:30;19590:27;19570:18;;;19563:55;19635:18;;9689:54:0::1;19310:349:1::0;9689:54:0::1;9754:15;:22:::0;;-1:-1:-1;;9754:22:0::1;9772:4;9754:22;::::0;;9787:16:::1;:14;:16::i;:::-;9551:260::o:0;10607:234::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;10722:16:::1;::::0;::::1;::::0;::::1;;;10721:17;:40:::0;::::1;;;-1:-1:-1::0;10743:18:0::1;::::0;;;::::1;;;10742:19;10721:40;10713:69;;;;-1:-1:-1::0;;;10713:69:0::1;;;;;;;:::i;:::-;10793:18;:40:::0;10607:234::o;5918:139::-;6000:11;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6000:11:0;-1:-1:-1;;;;;;6031:18:0;;;;;;;:5;:18;;;;;;;;;6024:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5918:139::o;12572:210::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;12687:1:::1;12664:20;:24;12656:65;;;::::0;-1:-1:-1;;;12656:65:0;;19866:2:1;12656:65:0::1;::::0;::::1;19848:21:1::0;19905:2;19885:18;;;19878:30;19944;19924:18;;;19917:58;19992:18;;12656:65:0::1;19664:352:1::0;12656:65:0::1;12732:19;:42:::0;12572:210::o;13407:667::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;13552:15:::1;::::0;::::1;;13551:16;:37:::0;::::1;;;-1:-1:-1::0;13572:16:0::1;::::0;::::1;::::0;::::1;;;13571:17;13551:37;:60;;;;-1:-1:-1::0;13593:18:0::1;::::0;;;::::1;;;13592:19;13551:60;13529:136;;;;-1:-1:-1::0;;;13529:136:0::1;;;;;;;:::i;:::-;13713:1;13698:12;:16;:38;;;;;13735:1;13718:14;:18;13698:38;13676:129;;;::::0;-1:-1:-1;;;13676:129:0;;20223:2:1;13676:129:0::1;::::0;::::1;20205:21:1::0;20262:2;20242:18;;;20235:30;20301:34;20281:18;;;20274:62;-1:-1:-1;;;20352:18:1;;;20345:39;20401:19;;13676:129:0::1;20021:405:1::0;13676:129:0::1;13818:23;:25:::0;;;:23:::1;:25;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;13928:36:0::1;::::0;-1:-1:-1;13928:12:0;13956:8:::1;13928:36;:::i;:::-;13854:17;:46;13898:1;13872:23;;:27;;;;:::i;:::-;13854:46;;;;;;;;;;;:58;;:110;;;;14052:14;13975:17;:46;14019:1;13993:23;;:27;;;;:::i;23281:400::-:0;2036:11;;-1:-1:-1;;;2036:11:0;;;;2028:55;;;;-1:-1:-1;;;2028:55:0;;;;;;;:::i;:::-;2108:5;2094:19;;-1:-1:-1;;;;2094:19:0;;;23353:16:::1;::::0;2094:19;23353:16;::::1;2094:19:::0;23353:16:::1;23345:45;;;;-1:-1:-1::0;;;23345:45:0::1;;;;;;;:::i;:::-;23429:10;23463:1;23423:17:::0;;;:5:::1;:17;::::0;;;;:37:::1;;::::0;:41;;;:102:::1;;-1:-1:-1::0;23491:10:0::1;23524:1;23485:17:::0;;;:5:::1;:17;::::0;;;;:36:::1;;::::0;:40;;23423:102:::1;:164;;;-1:-1:-1::0;23552:10:0::1;23586:1;23546:17:::0;;;:5:::1;:17;::::0;;;;:37:::1;;::::0;:41;;23423:164:::1;23401:237;;;::::0;-1:-1:-1;;;23401:237:0;;14150:2:1;23401:237:0::1;::::0;::::1;14132:21:1::0;14189:2;14169:18;;;14162:30;-1:-1:-1;;;14208:18:1;;;14201:53;14271:18;;23401:237:0::1;13948:347:1::0;23401:237:0::1;23651:22;:20;:22::i;10316:238::-:0;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;10433:16:::1;::::0;::::1;::::0;::::1;;;10432:17;:40:::0;::::1;;;-1:-1:-1::0;10454:18:0::1;::::0;;;::::1;;;10453:19;10432:40;10424:69;;;;-1:-1:-1::0;;;10424:69:0::1;;;;;;;:::i;:::-;10504:19;:42:::0;10316:238::o;6134:808::-;6182:7;6224:1;6206:15;;:19;:43;;;;;6248:1;6229:16;;:20;6206:43;6202:732;;;6266:20;6351:15;;6347:1;:19;;;;:::i;:::-;6328:16;;:38;;;;:::i;:::-;6309:15;:57;6305:570;;-1:-1:-1;6402:1:0;6896:12;6134:808;-1:-1:-1;6134:808:0:o;6305:570::-;6489:15;;6485:19;;:1;:19;:::i;:::-;6466:16;;:38;;;;:::i;:::-;6447:15;:57;6425:450;;-1:-1:-1;6554:1:0;6896:12;6134:808;-1:-1:-1;6134:808:0:o;6425:450::-;6641:15;;6637:19;;:1;:19;:::i;:::-;6618:16;;:38;;;;:::i;:::-;6599:15;:57;6577:298;;-1:-1:-1;6706:1:0;6896:12;6134:808;-1:-1:-1;6134:808:0:o;6577:298::-;6793:15;;6789:19;;:1;:19;:::i;:::-;6770:16;;:38;;;;:::i;:::-;6751:15;:57;6729:146;;-1:-1:-1;6858:1:0;6729:146;6896:12;6134:808;-1:-1:-1;6134:808:0:o;6202:732::-;-1:-1:-1;6933:1:0;;6134:808::o;11401:406::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;11546:15:::1;::::0;::::1;;11545:16;:37:::0;::::1;;;-1:-1:-1::0;11566:16:0::1;::::0;::::1;::::0;::::1;;;11565:17;11545:37;:60;;;;-1:-1:-1::0;11587:18:0::1;::::0;;;::::1;;;11586:19;11545:60;11523:136;;;;-1:-1:-1::0;;;11523:136:0::1;;;;;;;:::i;:::-;11687:1;11678:6;:10;11670:51;;;::::0;-1:-1:-1;;;11670:51:0;;19155:2:1;11670:51:0::1;::::0;::::1;19137:21:1::0;19194:2;19174:18;;;19167:30;19233;19213:18;;;19206:58;19281:18;;11670:51:0::1;18953:352:1::0;11670:51:0::1;11776:23;:12:::0;11791:8:::1;11776:23;:::i;:::-;11732:17;:29;11750:10;11759:1;11750:6:::0;:10:::1;:::i;:::-;11732:29:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;11732:29:0;:41:::1;;:67:::0;-1:-1:-1;;11401:406:0:o;8868:206::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;8961:16:::1;::::0;::::1;::::0;::::1;;;8960:17;:40:::0;::::1;;;-1:-1:-1::0;8982:18:0::1;::::0;;;::::1;;;8981:19;8960:40;8952:69;;;;-1:-1:-1::0;;;8952:69:0::1;;;;;;;:::i;:::-;9032:15;:34:::0;8868:206::o;25386:874::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;2036:11:::1;::::0;-1:-1:-1;;;2036:11:0;::::1;;;2028:55;;;;-1:-1:-1::0;;;2028:55:0::1;;;;;;;:::i;:::-;2108:5;2094:19:::0;;-1:-1:-1;;;;2094:19:0::1;::::0;;25484:37:::2;::::0;-1:-1:-1;;;25484:37:0;;25515:4:::2;25484:37;::::0;::::2;1230:51:1::0;-1:-1:-1;;;;;;;;;;;3057:42:0;25484:22:::2;::::0;1203:18:1;;25484:37:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25467:54;;25550:7;25540:6;:17;;25532:56;;;;-1:-1:-1::0;;;25532:56:0::2;;;;;;;:::i;:::-;25662:23;;25640:19;;:45;;;;:::i;:::-;25621:16;25630:7:::0;25621:6;:16:::2;:::i;:::-;:64;25599:140;;;;-1:-1:-1::0;;;25599:140:0::2;;;;;;;:::i;:::-;25756:18;::::0;-1:-1:-1;;;;;25756:18:0::2;:32:::0;;::::2;::::0;:50:::2;;;25805:1;25792:10;;:14;25756:50;25752:381;;;25823:24;25875:4;25861:10;;25851:7;:20;;;;:::i;:::-;25850:29;;;;:::i;:::-;25950:18;::::0;25910:108:::2;::::0;-1:-1:-1;;;25910:108:0;;25823:56;;-1:-1:-1;25894:13:0::2;::::0;-1:-1:-1;;;;;;;;;;;3057:42:0;25910:21:::2;::::0;:108:::2;::::0;-1:-1:-1;;;;;25950:18:0::2;::::0;25823:56;;25910:108:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25894:124;;26041:8;26033:46;;;;-1:-1:-1::0;;;26033:46:0::2;;;;;;;:::i;:::-;26094:27;26105:16:::0;26094:27;::::2;:::i;:::-;;;25808:325;;25752:381;26157:42;::::0;-1:-1:-1;;;26157:42:0;;26145:9:::2;::::0;-1:-1:-1;;;;;;;;;;;3057:42:0;26157:21:::2;::::0;:42:::2;::::0;26179:10:::2;::::0;26191:7;;26157:42:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26145:54;;26218:4;26210:42;;;;-1:-1:-1::0;;;26210:42:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;2136:11:0::1;:18:::0;;-1:-1:-1;;;;2136:18:0::1;-1:-1:-1::0;;;2136:18:0::1;::::0;;-1:-1:-1;25386:874:0:o;9122:382::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;9212:16:::1;::::0;::::1;::::0;::::1;;;9211:17;:40:::0;::::1;;;-1:-1:-1::0;9233:18:0::1;::::0;;;::::1;;;9232:19;9211:40;9203:69;;;;-1:-1:-1::0;;;9203:69:0::1;;;;;;;:::i;:::-;9287:17;9283:180;;;9321:16;:23:::0;;-1:-1:-1;;9321:23:0::1;;;::::0;;9378:15:::1;9359:16;:34:::0;9283:180:::1;;;9426:18;:25:::0;;-1:-1:-1;;9426:25:0::1;::::0;::::1;::::0;;9283:180:::1;-1:-1:-1::0;9473:15:0::1;:23:::0;;-1:-1:-1;;9473:23:0::1;::::0;;9122:382::o;1580:225::-;1481:5;;-1:-1:-1;;;;;1481:5:0;1467:10;:19;1459:51;;;;-1:-1:-1;;;1459:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1661:22:0;::::1;1653:64;;;::::0;-1:-1:-1;;;1653:64:0;;20633:2:1;1653:64:0::1;::::0;::::1;20615:21:1::0;20672:2;20652:18;;;20645:30;20711:31;20691:18;;;20684:59;20760:18;;1653:64:0::1;20431:353:1::0;1653:64:0::1;1754:5;::::0;;1733:37:::1;::::0;-1:-1:-1;;;;;1733:37:0;;::::1;::::0;1754:5;::::1;::::0;1733:37:::1;::::0;::::1;1781:5;:16:::0;;-1:-1:-1;;;;;;1781:16:0::1;-1:-1:-1::0;;;;;1781:16:0;;;::::1;::::0;;;::::1;::::0;;1580:225::o;3428:32::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3428:32:0;:::o;12790:609::-;12870:1;12844:23;;:27;12836:60;;;;-1:-1:-1;;;12836:60:0;;20991:2:1;12836:60:0;;;20973:21:1;21030:2;21010:18;;;21003:30;-1:-1:-1;;;21049:18:1;;;21042:50;21109:18;;12836:60:0;20789:344:1;12836:60:0;12913:18;;:22;12909:77;;12973:1;12952:18;:22;12909:77;13032:12;;13014:31;;;;:17;:31;;;;;;;:45;;12998:13;:61;13084:43;;;;;13070:11;:57;13014:31;;:17;;:31;;13160:16;;;:::i;:::-;13142:35;;;;;;;;;;;:49;;;:53;13138:227;;;13232:17;:35;13250:12;;13265:1;13250:16;;;;:::i;:::-;13232:35;;;;;;;;;;;-1:-1:-1;13232:35:0;:67;13212:17;:87;13138:227;;;13352:1;13332:17;:21;13138:227;13377:12;:14;;;:12;:14;;;:::i;:::-;;;;;;12790:609::o;7083:190::-;7183:11;-1:-1:-1;;;;;7171:23:0;:8;-1:-1:-1;;;;;7171:23:0;;7163:53;;;;-1:-1:-1;;;7163:53:0;;21340:2:1;7163:53:0;;;21322:21:1;21379:2;21359:18;;;21352:30;-1:-1:-1;;;21398:18:1;;;21391:47;21455:18;;7163:53:0;21138:341:1;7163:53:0;-1:-1:-1;;;;;7227:18:0;;;;;;;:5;:18;;;;;:38;;-1:-1:-1;;;;;;7227:38:0;;;;;;;;7083:190::o;21655:1577::-;-1:-1:-1;;;;;21818:18:0;;;21792:23;21818:18;;;:5;:18;;;;;:27;;;;;21858:1367;21882:13;;21878:1;:17;21858:1367;;;-1:-1:-1;;;;;21921:29:0;;21917:75;21971:5;21917:75;22031:11;-1:-1:-1;;;;;22012:30:0;:15;-1:-1:-1;;;;;22012:30:0;;22008:76;22063:5;22008:76;22100:18;22153:4;22131:15;22147:1;22131:18;;;;;;;;:::i;:::-;;;;;;;;;22122:6;:27;;;;:::i;:::-;22121:36;;;;:::i;:::-;22178:16;;22100:57;;-1:-1:-1;22178:16:0;;;;;:33;;;;-1:-1:-1;;;;;;22198:13:0;;2977:42;22198:13;22178:33;22174:932;;;22304:13;;22232:22;;22258:21;:10;22271:8;22258:21;:::i;:::-;22257:60;;;;:::i;:::-;-1:-1:-1;;;;;22336:22:0;;;;;;:5;:22;;;;;:42;;:60;;22232:85;;-1:-1:-1;22232:85:0;;22336:42;;:22;:60;;22232:85;;22336:60;:::i;:::-;;;;;;;;22439:14;22415:20;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;22174:932:0;;-1:-1:-1;;22174:932:0;;22479:16;;;;;;;22475:631;;;22516:22;22630:7;22593:13;;22555;:11;:13::i;:::-;22542:26;;:10;:26;:::i;:::-;22541:65;;;;:::i;22475:631::-;-1:-1:-1;;;;;;;22799:13:0;;;22795:311;;-1:-1:-1;;;;;22833:22:0;;;;;;:5;:22;;;;;:42;;:56;;22879:10;;22833:22;:56;;22879:10;;22833:56;:::i;:::-;;;;;;;;22932:10;22908:20;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;22795:311:0;;-1:-1:-1;22795:311:0;;-1:-1:-1;;;;;22983:22:0;;;;;;:5;:22;;;;;:41;;:55;;23028:10;;22983:22;:55;;23028:10;;22983:55;:::i;:::-;;;;;;;;23080:10;23057:19;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;22795:311:0;-1:-1:-1;;;;;;23182:22:0;;;;;;;:5;:22;;;;;:31;;;;;21897:3;;;;:::i;:::-;;;;21858:1367;;;;21781:1451;21655:1577;;;:::o;25024:321::-;25091:10;25068:14;25085:17;;;:5;:17;;;;;;:38;;;;25134:42;;;;25201:41;;-1:-1:-1;;;25201:41:0;;25085:38;;3137:42;;25201:21;;:41;;25085:38;;25201:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25189:53;;25261:4;25253:38;;;;-1:-1:-1;;;25253:38:0;;;;;;;:::i;:::-;25331:6;25302:25;;:35;;;;;;;:::i;23730:1016::-;23809:10;23782:18;23803:17;;;:5;:17;;;;;:37;;;23855:14;;23851:205;;23892:10;23926:1;23886:17;;;:5;:17;;;;;;:37;;:41;;;;23942:49;-1:-1:-1;;;23942:49:0;;2977:42;;23942:25;;:49;;23892:10;23980;;23942:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24034:10;24006:24;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;23851:205:0;24092:10;24066:17;24086;;;:5;:17;;;;;:36;;;24137:13;;24133:261;;24173:10;24206:1;24167:17;;;:5;:17;;;;;;:36;;:40;;;24234:44;-1:-1:-1;;;24234:44:0;;24206:1;;-1:-1:-1;;;;;;;;;;;3057:42:0;24234:21;;:44;;24268:9;;24234:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24222:56;;24301:4;24293:38;;;;-1:-1:-1;;;24293:38:0;;;;;;;:::i;:::-;24373:9;24346:23;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;;24133:261:0;24431:10;24404:18;24425:17;;;:5;:17;;;;;:37;;;24477:14;;24473:266;;24514:10;24548:1;24508:17;;;:5;:17;;;;;;:37;;:41;;;24576:45;-1:-1:-1;;;24576:45:0;;24548:1;;3137:42;;24576:21;;:45;;24610:10;;24576:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24564:57;;24644:4;24636:38;;;;-1:-1:-1;;;24636:38:0;;;;;;;:::i;:::-;24717:10;24689:24;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;;24473:266:0;23771:975;;;23730:1016::o;31296:815::-;31364:10;31341:14;31358:17;;;:5;:17;;;;;;;;:30;;31403:15;;:19;31399:705;;31439:20;31462:17;:15;:17::i;:::-;31567:10;31494:21;31561:17;;;:5;:17;;;;;:34;;;31439:40;;-1:-1:-1;31494:21:0;31600:1;;31546:49;;31439:40;31546:49;:::i;:::-;31519:77;;:6;:77;:::i;:::-;31518:83;;;;:::i;:::-;31622:10;31616:17;;;;:5;:17;;;;;;:34;;:49;;;31692:48;-1:-1:-1;;;31692:48:0;;31494:107;;-1:-1:-1;31616:17:0;3137:42;;31692:21;;:48;;31622:10;31494:107;;31692:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31680:60;;31763:4;31755:38;;;;-1:-1:-1;;;31755:38:0;;;;;;;:::i;:::-;31837:13;31808:25;;:42;;;;;;;:::i;:::-;;;;-1:-1:-1;31399:705:0;;-1:-1:-1;;;;31399:705:0;;31895:41;;-1:-1:-1;;;31895:41:0;;31883:9;;3137:42;;31895:21;;:41;;31917:10;;31929:6;;31895:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31883:53;;31959:4;31951:38;;;;-1:-1:-1;;;31951:38:0;;;;;;;:::i;:::-;32010:10;32004:17;;;;:5;:17;;;;;32041:1;32004:34;;;;:38;32057:25;:35;;32086:6;;32004:17;32057:35;;32086:6;;32057:35;:::i;31399:705::-;31330:781;31296:815::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;388:173:1;456:20;;-1:-1:-1;;;;;505:31:1;;495:42;;485:70;;551:1;548;541:12;566:328;643:6;651;659;712:2;700:9;691:7;687:23;683:32;680:52;;;728:1;725;718:12;680:52;751:29;770:9;751:29;:::i;:::-;741:39;;827:2;816:9;812:18;799:32;789:42;;850:38;884:2;873:9;869:18;850:38;:::i;:::-;840:48;;566:328;;;;;:::o;899:180::-;958:6;1011:2;999:9;990:7;986:23;982:32;979:52;;;1027:1;1024;1017:12;979:52;-1:-1:-1;1050:23:1;;899:180;-1:-1:-1;899:180:1:o;1292:254::-;1360:6;1368;1421:2;1409:9;1400:7;1396:23;1392:32;1389:52;;;1437:1;1434;1427:12;1389:52;1460:29;1479:9;1460:29;:::i;:::-;1450:39;1536:2;1521:18;;;;1508:32;;-1:-1:-1;;;1292:254:1:o;1551:186::-;1610:6;1663:2;1651:9;1642:7;1638:23;1634:32;1631:52;;;1679:1;1676;1669:12;1631:52;1702:29;1721:9;1702:29;:::i;:::-;1692:39;1551:186;-1:-1:-1;;;1551:186:1:o;1742:118::-;1828:5;1821:13;1814:21;1807:5;1804:32;1794:60;;1850:1;1847;1840:12;1865:241;1921:6;1974:2;1962:9;1953:7;1949:23;1945:32;1942:52;;;1990:1;1987;1980:12;1942:52;2029:9;2016:23;2048:28;2070:5;2048:28;:::i;2111:367::-;2174:8;2184:6;2238:3;2231:4;2223:6;2219:17;2215:27;2205:55;;2256:1;2253;2246:12;2205:55;-1:-1:-1;2279:20:1;;2322:18;2311:30;;2308:50;;;2354:1;2351;2344:12;2308:50;2391:4;2383:6;2379:17;2367:29;;2451:3;2444:4;2434:6;2431:1;2427:14;2419:6;2415:27;2411:38;2408:47;2405:67;;;2468:1;2465;2458:12;2405:67;2111:367;;;;;:::o;2483:505::-;2578:6;2586;2594;2647:2;2635:9;2626:7;2622:23;2618:32;2615:52;;;2663:1;2660;2653:12;2615:52;2703:9;2690:23;2736:18;2728:6;2725:30;2722:50;;;2768:1;2765;2758:12;2722:50;2807:70;2869:7;2860:6;2849:9;2845:22;2807:70;:::i;:::-;2896:8;;2781:96;;-1:-1:-1;2978:2:1;2963:18;;;;2950:32;;2483:505;-1:-1:-1;;;;2483:505:1:o;3466:254::-;3534:6;3542;3595:2;3583:9;3574:7;3570:23;3566:32;3563:52;;;3611:1;3608;3601:12;3563:52;3647:9;3634:23;3624:33;;3676:38;3710:2;3699:9;3695:18;3676:38;:::i;:::-;3666:48;;3466:254;;;;;:::o;3725:505::-;3820:6;3828;3836;3889:2;3877:9;3868:7;3864:23;3860:32;3857:52;;;3905:1;3902;3895:12;3857:52;3941:9;3928:23;3918:33;;4002:2;3991:9;3987:18;3974:32;4029:18;4021:6;4018:30;4015:50;;;4061:1;4058;4051:12;4015:50;4100:70;4162:7;4153:6;4142:9;4138:22;4100:70;:::i;:::-;3725:505;;4189:8;;-1:-1:-1;4074:96:1;;-1:-1:-1;;;;3725:505:1:o;5017:248::-;5085:6;5093;5146:2;5134:9;5125:7;5121:23;5117:32;5114:52;;;5162:1;5159;5152:12;5114:52;-1:-1:-1;;5185:23:1;;;5255:2;5240:18;;;5227:32;;-1:-1:-1;5017:248:1:o;6053:127::-;6114:10;6109:3;6105:20;6102:1;6095:31;6145:4;6142:1;6135:15;6169:4;6166:1;6159:15;6185:168;6258:9;;;6289;;6306:15;;;6300:22;;6286:37;6276:71;;6327:18;;:::i;:::-;6185:168;;;;:::o;6358:217::-;6398:1;6424;6414:132;;6468:10;6463:3;6459:20;6456:1;6449:31;6503:4;6500:1;6493:15;6531:4;6528:1;6521:15;6414:132;-1:-1:-1;6560:9:1;;6358:217::o;6580:125::-;6645:9;;;6666:10;;;6663:36;;;6679:18;;:::i;6710:355::-;6912:2;6894:21;;;6951:2;6931:18;;;6924:30;6990:33;6985:2;6970:18;;6963:61;7056:2;7041:18;;6710:355::o;7070:340::-;7272:2;7254:21;;;7311:2;7291:18;;;7284:30;-1:-1:-1;;;7345:2:1;7330:18;;7323:46;7401:2;7386:18;;7070:340::o;7761:408::-;7963:2;7945:21;;;8002:2;7982:18;;;7975:30;8041:34;8036:2;8021:18;;8014:62;-1:-1:-1;;;8107:2:1;8092:18;;8085:42;8159:3;8144:19;;7761:408::o;8174:400::-;8376:2;8358:21;;;8415:2;8395:18;;;8388:30;8454:34;8449:2;8434:18;;8427:62;-1:-1:-1;;;8520:2:1;8505:18;;8498:34;8564:3;8549:19;;8174:400::o;8579:353::-;8781:2;8763:21;;;8820:2;8800:18;;;8793:30;8859:31;8854:2;8839:18;;8832:59;8923:2;8908:18;;8579:353::o;9246:184::-;9316:6;9369:2;9357:9;9348:7;9344:23;9340:32;9337:52;;;9385:1;9382;9375:12;9337:52;-1:-1:-1;9408:16:1;;9246:184;-1:-1:-1;9246:184:1:o;10517:245::-;10584:6;10637:2;10625:9;10616:7;10612:23;10608:32;10605:52;;;10653:1;10650;10643:12;10605:52;10685:9;10679:16;10704:28;10726:5;10704:28;:::i;10767:345::-;10969:2;10951:21;;;11008:2;10988:18;;;10981:30;-1:-1:-1;;;11042:2:1;11027:18;;11020:51;11103:2;11088:18;;10767:345::o;11117:340::-;11319:2;11301:21;;;11358:2;11338:18;;;11331:30;-1:-1:-1;;;11392:2:1;11377:18;;11370:46;11448:2;11433:18;;11117:340::o;11462:403::-;11664:2;11646:21;;;11703:2;11683:18;;;11676:30;11742:34;11737:2;11722:18;;11715:62;-1:-1:-1;;;11808:2:1;11793:18;;11786:37;11855:3;11840:19;;11462:403::o;11870:128::-;11937:9;;;11958:11;;;11955:37;;;11972:18;;:::i;12003:343::-;12205:2;12187:21;;;12244:2;12224:18;;;12217:30;-1:-1:-1;;;12278:2:1;12263:18;;12256:49;12337:2;12322:18;;12003:343::o;12351:127::-;12412:10;12407:3;12403:20;12400:1;12393:31;12443:4;12440:1;12433:15;12467:4;12464:1;12457:15;12483:135;12522:3;12543:17;;;12540:43;;12563:18;;:::i;:::-;-1:-1:-1;12610:1:1;12599:13;;12483:135::o;12623:351::-;12825:2;12807:21;;;12864:2;12844:18;;;12837:30;12903:29;12898:2;12883:18;;12876:57;12965:2;12950:18;;12623:351::o;12979:274::-;-1:-1:-1;;;;;13171:32:1;;;;13153:51;;13235:2;13220:18;;13213:34;13141:2;13126:18;;12979:274::o;13258:340::-;13460:2;13442:21;;;13499:2;13479:18;;;13472:30;-1:-1:-1;;;13533:2:1;13518:18;;13511:46;13589:2;13574:18;;13258:340::o;14659:349::-;14861:2;14843:21;;;14900:2;14880:18;;;14873:30;14939:27;14934:2;14919:18;;14912:55;14999:2;14984:18;;14659:349::o;16829:350::-;17031:2;17013:21;;;17070:2;17050:18;;;17043:30;17109:28;17104:2;17089:18;;17082:56;17170:2;17155:18;;16829:350::o;17184:::-;17386:2;17368:21;;;17425:2;17405:18;;;17398:30;17464:28;17459:2;17444:18;;17437:56;17525:2;17510:18;;17184:350::o

Swarm Source

ipfs://5de5962c3bf5760dd85de89964cee42bdd219a4b88ba48d06b16294b2b3c6186

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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  ]

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.