ETH Price: $2,279.33 (+0.30%)

Contract

0xc0DE9E35833Ab6089a2657149cEF8CAc08daB95F
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Reward For L...167946152023-03-10 1:53:11548 days ago1678413191IN
0xc0DE9E35...c08daB95F
0 ETH0.0021972125.46701677
Set Estimated Re...156842502022-10-05 20:20:47703 days ago1665001247IN
0xc0DE9E35...c08daB95F
0 ETH0.0028652926.54771776
Set Reward For L...156842502022-10-05 20:20:47703 days ago1665001247IN
0xc0DE9E35...c08daB95F
0 ETH0.0022904526.54771776
Set Bonus For La...156842472022-10-05 20:20:11703 days ago1665001211IN
0xc0DE9E35...c08daB95F
0 ETH0.0008122724.93406549
Set Estimated Re...146327022022-04-22 5:04:59870 days ago1650603899IN
0xc0DE9E35...c08daB95F
0 ETH0.0030212634.32082839
Allow Staking146324562022-04-22 4:07:12870 days ago1650600432IN
0xc0DE9E35...c08daB95F
0 ETH0.0287220844.9302761
Set Staking Pool...146324282022-04-22 4:00:22870 days ago1650600022IN
0xc0DE9E35...c08daB95F
0 ETH0.0014858334.49097845
0x60196005146323102022-04-22 3:34:13870 days ago1650598453IN
 Create: NFTStaking
0 ETH0.2739864140.15027093

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NFTStaking

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-22
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

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

interface IERC721Custom {
    function balanceOf(address owner) external view returns (uint256 balance);
    function getApproved(uint256 tokenId) external view returns (address operator);
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC20Custom {
    function mint(address to, uint256 amount) external;
    function hasRole(bytes32 role, address account) external view returns (bool);
}

interface IVesting {
    function addLock(address to, uint256 amount) external;
}

/**
 * @dev {ERC20} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - a pauser role that allows to stop all token transfers
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 *
 * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._
 */
contract NFTStaking is Context, Ownable, IERC721Receiver, ERC165, ReentrancyGuard {
    IERC721Custom public nftForStaking;
    IERC20Custom public rewardToken;
    IVesting public vestingContract;
    
    uint256 public firstStakingPoolRewardPercent  = 25;
    uint256 public secondStakingPoolRewardPercent = 35;
    uint256 public thirdStakingPoolRewardPercent  = 40;

    uint256 public defaultStakingPool = 3;

    uint256[25] public allPeriods;    
    uint256[24] public tokenMultipliers = [10,10,13,13,15,15,15,15,20,20,20,20,25,25,25,25,30,30,30,30,40,40,40,40];
    uint256[24] public periodRewards = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
    uint256[24] public periodBonuses = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
    uint256[24] public periodEstimatedRewards = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
    uint256[24][3] public periodPoolsRewards;
    uint256[24][3] public periodPoolsBonuses;
    uint256[24][3] public periodPoolsEstimatedRewards;

    mapping(address => uint256[]) public stakedNfts;
    address[] public firstDayStakersAddresses;
    
    bool private stakingAllowance = false;
    uint256[3] private _isPoolEnabled = [1,1,1];
    mapping(address => bool) private _isFirstDayStaker;
    mapping(uint256 => address) private _nftsOwners;
    mapping(uint256 => uint256[11]) private _stakes;
    mapping(address => uint256[11][]) private _stakeSnapshots;
    uint256[24][3] private _allSharesPowerPerStakingPool;
    uint256 private _lastPeriodEstimatedRewards;

    uint256 quarter = 90;
    uint256 recalculation = 1;
    uint256 quantity = 1 days;
  
    
    // constructor
    constructor(address nft, address token) {
        _setNft(nft);
        _setToken(token);
        periodPoolsRewards[0] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
        periodPoolsRewards[1] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
        periodPoolsRewards[2] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
        periodPoolsBonuses[0] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
        periodPoolsBonuses[1] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
        periodPoolsBonuses[2] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
        periodPoolsEstimatedRewards[0] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
        periodPoolsEstimatedRewards[1] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
        periodPoolsEstimatedRewards[2] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
        quarter = quarter * quantity;
        recalculation = recalculation * quantity;
    }


    // external functions
    function onERC721Received(
        address,
        address from,
        uint256 tokenId,
        bytes calldata
    ) external override returns (bytes4) {
        require (_msgSender() == address(nftForStaking), "NFTStaking: transfer not allowed");
        require(isStakingAllowed(), "NFTStaking: staking is not allowed");
        
        _addStake(from, tokenId, defaultStakingPool);

        return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"));
    }


    // ownable public functions
    function setNft(address nft) public onlyOwner {
        require(nftForStaking.balanceOf(address(this)) == uint256(0), "NFTStaking: not empty balance");
        _setNft(nft);
    }

    function setToken(address erc20) public onlyOwner {
        IERC20Custom token = IERC20Custom(erc20);
        require(token.hasRole(keccak256("MINTER_ROLE"), address(this)), "NFTStaking: must have minter role to mint");
        _setToken(erc20);
    }   

    function setVesting(address vesting) public onlyOwner {
        _setVesting(vesting);
    }

    function allowStaking(address vesting) public onlyOwner {
        require(!stakingAllowance, "NFTStaking: staking is already allowed");
        require(rewardToken.hasRole(keccak256("MINTER_ROLE"), address(this)), "NFTStaking: must have minter role to mint");
        _setVesting(vesting);
        uint256 timestamp = block.timestamp;
        allPeriods[0] = timestamp;
        
        for (uint256 i = 1; i < 25; i++) {
            timestamp = timestamp + quarter;
            allPeriods[i] = timestamp;            
        }       
        stakingAllowance = true;
    }   

    function setStakingPoolsRewardPercentages(uint256 first, uint256 second, uint256 third) public onlyOwner {
        require((first + second + third) == 100, "NFTStaking: wrong percentages");
        firstStakingPoolRewardPercent = first;
        secondStakingPoolRewardPercent = second;
        thirdStakingPoolRewardPercent = third;
        
        _isPoolEnabled[0] = first > 0 ? 1 : 0;
        _isPoolEnabled[1] = second > 0 ? 1 : 0;
        _isPoolEnabled[2] = third > 0 ? 1 : 0;
        
        if (_isPoolEnabled[defaultStakingPool - 1] == 0) {
            for (uint256 pool = 0; pool < 3; pool++) {
                if (_isPoolEnabled[pool] == 1) {
                    defaultStakingPool = pool + 1;
                    break;
                }
            }
        }
    }

    function setDefaultStakingPool(uint256 pool) public onlyOwner {
        require(pool != 0 && pool < 4, "NFTStaking: wrong pool");
        require(_isPoolEnabled[pool - 1] != 0, "NFTStaking: pool is disabled");
        defaultStakingPool = pool;
    }

    function setRewardForLastPeriod(uint256 amount) public onlyOwner {
        require(stakingAllowance, "NFTStaking: staking is not allowed");
        require(amount > 0, "NFTStaking: empty reward");
        uint256 currentPeriod = (block.timestamp - allPeriods[0]) / quarter;
        if (currentPeriod > 0 && currentPeriod < 25) {
            if (periodRewards[currentPeriod - 1] == 0) {
                periodRewards[currentPeriod - 1] = amount;
                periodPoolsRewards[0][currentPeriod - 1] = amount * firstStakingPoolRewardPercent / 100;
                periodPoolsRewards[1][currentPeriod - 1] = amount * secondStakingPoolRewardPercent / 100;
                periodPoolsRewards[2][currentPeriod - 1] = amount * thirdStakingPoolRewardPercent / 100;
            }
        }
        
        if (currentPeriod > 24) {
            stakingAllowance = false;
        }
    }
    
    function setBonusForLastPeriod(uint256 amount) public onlyOwner {
        require(stakingAllowance, "NFTStaking: staking is not allowed");
        require(amount > 0, "NFTStaking: empty bonus");
        uint256 currentPeriod = (block.timestamp - allPeriods[0]) / quarter;
        if (currentPeriod > 0 && currentPeriod < 25) {
            if (periodRewards[currentPeriod - 1] != 0 && periodBonuses[currentPeriod - 1] == 0) {
                periodBonuses[currentPeriod - 1] = amount;
                periodPoolsBonuses[0][currentPeriod - 1] = amount * firstStakingPoolRewardPercent / 100;
                periodPoolsBonuses[1][currentPeriod - 1] = amount * secondStakingPoolRewardPercent / 100;
                periodPoolsBonuses[2][currentPeriod - 1] = amount * thirdStakingPoolRewardPercent / 100;
            }
        }
        
        if (currentPeriod > 24) {
            stakingAllowance = false;
        }
    }

    function setEstimatedReward(uint256 amount) public onlyOwner {
        require(stakingAllowance, "NFTStaking: staking is not allowed");
        require(amount > 0, "NFTStaking: empty reward");
        uint256 currentPeriod = (block.timestamp - allPeriods[0]) / quarter;
        if (currentPeriod < 24) {
            periodEstimatedRewards[currentPeriod] = amount;
            periodPoolsEstimatedRewards[0][currentPeriod] = amount * firstStakingPoolRewardPercent / 100;
            periodPoolsEstimatedRewards[1][currentPeriod] = amount * secondStakingPoolRewardPercent / 100;
            periodPoolsEstimatedRewards[2][currentPeriod] = amount * thirdStakingPoolRewardPercent / 100;
            _lastPeriodEstimatedRewards = currentPeriod;
        }

        if (currentPeriod > 24) {
            stakingAllowance = false;
        }
    }

    // public functions
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165) returns (bool) {
        return
            interfaceId == type(IERC721Receiver).interfaceId ||
            super.supportsInterface(interfaceId);
    }    

    function isStakingAllowed() public view returns (bool) {
        if (stakingAllowance && ((block.timestamp - allPeriods[0]) / quarter) < 23) {
            return true;
        }
        return false;
    }

    function getOwnerByTokenId(uint256 tokenId) public view returns (address) {
        return _nftsOwners[tokenId];
    }
    
    function getCurrentQuarterFromStart() public view returns (uint256) {
        uint256 count = ((block.timestamp - allPeriods[0]) / quarter) + 1;
        return count;
    }
    
    function getCurrentDayOfQuarter() public view returns (uint256) {
        uint256 currentQuarter = (block.timestamp - allPeriods[0]) / quarter;
        uint256 day = ((block.timestamp - allPeriods[currentQuarter]) / recalculation) + 1;
        return day;
    }
    
    function getCurrentMultiplierForToken(uint256 tokenId) public view returns (uint256) {
        uint256 startTime = _stakes[tokenId][2];
        uint256 duration = (block.timestamp - startTime) / quarter;
        uint256 multiplier = tokenMultipliers[duration];
        return multiplier;
    }

    function getStakingPoolsOfToken(uint256 tokenId) public view returns (uint256 pools) {
        uint256 pool1 = _stakes[tokenId][8];
        uint256 pool2 = _stakes[tokenId][9];
        uint256 pool3 = _stakes[tokenId][10];
        if (pool1 == 1 && pool2 == 0 && pool3 == 0) {
            return 1;
        }
        if (pool1 == 0 && pool2 == 1 && pool3 == 0) {
            return 2;
        }
        if (pool1 == 0 && pool2 == 0 && pool3 == 1) {
            return 3;
        }
        if (pool1 == 1 && pool2 == 1 && pool3 == 0) {
            return 12;
        }
        if (pool1 == 1 && pool2 == 0 && pool3 == 1) {
            return 13;
        }
        if (pool1 == 0 && pool2 == 1 && pool3 == 1) {
            return 23;
        }
        if (pool1 == 1 && pool2 == 1 && pool3 == 1) {
            return 123;
        }                
    }

    function getNftsCount() public view returns (uint256) {
        uint256 len = stakedNfts[_msgSender()].length;
        return len;
    }
    
     function getNfts() public view returns (uint256[] memory) {
        uint256 len = stakedNfts[_msgSender()].length;
        uint256[] memory nfts = new uint256[](len);
        for (uint256 i = 0; i < len; i++) {
            nfts[i] = stakedNfts[_msgSender()][i];
        }
        return nfts;
    }

    function getNftsByAddress(address user) public view returns (uint256[] memory) {
        uint256 len = stakedNfts[user].length;
        uint256[] memory nfts = new uint256[](len);
        for (uint256 i = 0; i < len; i++) {
            nfts[i] = stakedNfts[user][i];
        }
        return nfts;
    }

    function getCurrentMultipliers() public view returns (uint256[] memory) {
        uint256 len = stakedNfts[_msgSender()].length;
        uint256[] memory multipliers = new uint256[](len);
        for (uint256 i = 0; i < len; i++) {
            uint256 tokenId = stakedNfts[_msgSender()][i];
            uint256 startTime = _stakes[tokenId][2];
            uint256 duration = (block.timestamp - startTime) / quarter;
            uint256 multiplier = tokenMultipliers[duration];
            multipliers[i] = multiplier;
        }
        return multipliers;               
    }

    function claimableRewards(address user) public view returns (uint256) {
        return _calcAccruedRewards(user);
    }

    function estimatedRewards(address user) public view returns (uint256) {
        return _calcEstimatedRewards(user);
    }

    function firstDayStakersCount() public view returns (uint256) {
        return firstDayStakersAddresses.length;
    }
    
    function stake(uint256 tokenId, uint256 pool) public nonReentrant {
        require(isStakingAllowed(), "NFTStaking: staking is not allowed");     
        require((nftForStaking.getApproved(tokenId) == address(this)) || (nftForStaking.isApprovedForAll(_msgSender(),address(this))), "NFTStaking: transfer not allowed");
        require(pool != 0 && pool < 4, "NFTStaking: wrong pool");
        require(_isPoolEnabled[pool - 1] != 0, "NFTStaking: pool is disabled");
        nftForStaking.transferFrom(_msgSender(), address(this), tokenId);
        _addStake(_msgSender(), tokenId, pool);
    }

    function chooseAdditionalStakingPool(uint256 tokenId, uint256 pool) public nonReentrant {
        require(isStakingAllowed(), "NFTStaking: staking is not allowed");
        require(tokenId > 250 && tokenId < 1501, "NFTStaking: not allowing additional staking");
        require(_msgSender() == _nftsOwners[tokenId], "NFTStaking: not a token owner");
        require(pool != 0 && pool < 4, "NFTStaking: wrong pool");
        require(_isPoolEnabled[pool - 1] != 0, "NFTStaking: pool is disabled");
        require((_stakes[tokenId][8] + _stakes[tokenId][9] + _stakes[tokenId][10]) == 1, "NFTStaking: additional pool already chosen");
        if (pool == 1) {
            require(_stakes[tokenId][8] == 0, "NFTStaking: pool already chosen");
            _stakes[tokenId][8] = 1;
        }
        else if (pool == 2) {
            require(_stakes[tokenId][9] == 0, "NFTStaking: pool already chosen");
            _stakes[tokenId][9] = 1;
        }        
        else if (pool == 3) {
            require(_stakes[tokenId][10] == 0, "NFTStaking: pool already chosen");
            _stakes[tokenId][10] = 1;
        }          

        uint256 tokenPower = _stakes[tokenId][5];        
        uint256 currentPeriod = _stakes[tokenId][3];
        uint256 startDay = _stakes[tokenId][4];      
        _addShare(tokenPower, currentPeriod, startDay, pool);
    }

    function unstake(uint256 tokenId) public {
        require(_msgSender() == _nftsOwners[tokenId], "NFTStaking: not a token owner");
        uint256 accruedInterest = _calcAccruedRewards(_msgSender());
        if (accruedInterest > 0) {
            claim();
        }
        _unstake(_msgSender(), tokenId);
        uint256 len = stakedNfts[_msgSender()].length;       
        for (uint256 i = 0; i < len; i++) {
            if (stakedNfts[_msgSender()][i] == tokenId) {
                stakedNfts[_msgSender()][i] = stakedNfts[_msgSender()][len - 1];
            }
        }     
        stakedNfts[_msgSender()].pop();      
    }

    function unstakeAll() public {
        uint256 len = stakedNfts[_msgSender()].length;
        uint256 accruedInterest = _calcAccruedRewards(_msgSender());
        if (accruedInterest > 0) {
            claim();
        }
        for (uint256 i = 0; i < len; i++) {
            uint256 tokenId = stakedNfts[_msgSender()][i];
            _unstake(_msgSender(), tokenId);
        }
        for (uint256 i = 0; i < len; i++) {
            stakedNfts[_msgSender()].pop();
        }
    }

    function claim() public nonReentrant {
        uint256 accruedInterest = _calcAccruedRewards(_msgSender());      
        require(accruedInterest > 0, "NFTStaking: nothing to claim");
        uint256 currentPeriod = (block.timestamp - allPeriods[0]) / quarter;
        uint256 i;
        
        if (currentPeriod > 23) {
            currentPeriod = 24;
        }

        for (i = 0; i < stakedNfts[_msgSender()].length; i++) {
            uint256 tokenId = stakedNfts[_msgSender()][i];        
            
            if (periodRewards[currentPeriod - 1] > 0 ) {
                _stakes[tokenId][0] = currentPeriod + 1;
            }
            else {
                _stakes[tokenId][0] = currentPeriod;
            }

            if (periodBonuses[currentPeriod - 1] > 0 ) {
                _stakes[tokenId][1] = currentPeriod + 1;
            }
            else {
                _stakes[tokenId][1] = currentPeriod;
            }
        }
    
        uint256 count = 0;
        for (i = 0; i < _stakeSnapshots[_msgSender()].length; i++) {
            uint256[11] memory snapshot = _stakeSnapshots[_msgSender()][i];
            uint256 check = 0;     
          
            if (periodRewards[snapshot[6]] > 0) {
                _stakeSnapshots[_msgSender()][i][0] = 99;
                check++;
            }
            else if (periodRewards[snapshot[6]] == 0 && periodRewards[snapshot[6] - 1] > 0) {
                _stakeSnapshots[_msgSender()][i][0] = snapshot[6] + 1;
            }
            else if (periodRewards[snapshot[6]] == 0 && periodRewards[snapshot[6] - 1] == 0) {
                _stakeSnapshots[_msgSender()][i][0] = snapshot[6];
            }

            if (periodBonuses[snapshot[6]] > 0 || periodRewards[snapshot[6] + 1] > 0) {
                _stakeSnapshots[_msgSender()][i][1] = 99;
                check++;
            }
            else if (periodBonuses[snapshot[6] - 1] > 0 || periodRewards[snapshot[6]] > 0) {
                _stakeSnapshots[_msgSender()][i][1] = snapshot[6] + 1;
            }            
            else if (periodBonuses[snapshot[6] - 1] == 0 && periodRewards[snapshot[6]] == 0) {
                _stakeSnapshots[_msgSender()][i][1] = snapshot[6];
            }
         
            if (check == 2) {
                count++;
            }
        }
        
        while (count != 0) {
            _stakeSnapshots[_msgSender()].pop();
            count--;
        }
        
        uint256 amountToWallet = (accruedInterest / 100) * 33;
        uint256 amountToVesting = (accruedInterest / 100) * 67;
        rewardToken.mint(_msgSender(), amountToWallet);
        rewardToken.mint(address(vestingContract), amountToVesting);
        vestingContract.addLock(_msgSender(), amountToVesting);        
    }

    // private functions 
    function _setNft(address erc721) private {
        require(erc721 != address(0), "not valid address");
        IERC721Custom nft = IERC721Custom(erc721);       
        require(nft.supportsInterface(bytes4(0x80ac58cd)), "not ERC721");       
        nftForStaking = nft;
    }
    
    function _setToken(address erc20) private {
        require(erc20 != address(0), "NFTStaking: not valid address");
        IERC20Custom token = IERC20Custom(erc20);
        rewardToken = token;
    }

    function _setVesting(address vesting_) private {
        require(vesting_ != address(0), "NFTStaking: not valid address");
        IVesting vesting = IVesting(vesting_);
        vestingContract = vesting;
    }

    function _addStake(address staker, uint256 tokenId, uint256 pool) private {
        stakedNfts[staker].push(tokenId);
        _nftsOwners[tokenId] = staker;

        uint256 currentPeriod = (block.timestamp - allPeriods[0]) / quarter;
        uint256 nextPeriod = currentPeriod + 1;
        uint256 startDay = ((block.timestamp - allPeriods[currentPeriod]) / recalculation) + 1;
        uint256 tokenPower = _getTokenPower(tokenId);
        
        if (tokenId < 251) {
            _stakes[tokenId] = [nextPeriod,nextPeriod,block.timestamp,currentPeriod,startDay,tokenPower,0,0,1,1,1];
            _addShare(tokenPower, currentPeriod, startDay, 1);
            _addShare(tokenPower, currentPeriod, startDay, 2);
            _addShare(tokenPower, currentPeriod, startDay, 3);
        }
        else {
            if (pool == 1) {
                _stakes[tokenId] = [nextPeriod,nextPeriod,block.timestamp,currentPeriod,startDay,tokenPower,0,0,1,0,0];
                _addShare(tokenPower, currentPeriod, startDay, 1);
            }
            else if (pool == 2) {
                _stakes[tokenId] = [nextPeriod,nextPeriod,block.timestamp,currentPeriod,startDay,tokenPower,0,0,0,1,0];
                _addShare(tokenPower, currentPeriod, startDay, 2);
            }
            else if (pool == 3) {
                _stakes[tokenId] = [nextPeriod,nextPeriod,block.timestamp,currentPeriod,startDay,tokenPower,0,0,0,0,1];
                _addShare(tokenPower, currentPeriod, startDay, 3);
            }        
        }
        
        if (currentPeriod == 0 && startDay == 1) {
            if (!_isFirstDayStaker[staker]) {
                _isFirstDayStaker[staker] = true;
                firstDayStakersAddresses.push(staker);
            }
        }
    }

    function _addShare(uint256 tokenPower, uint256 currentPeriod, uint256 startDay, uint256 pool) private {
        for (uint256 i = currentPeriod; i < 24; i++) {
            if (i == currentPeriod) {
                _allSharesPowerPerStakingPool[pool - 1][i] = _allSharesPowerPerStakingPool[pool - 1][i] + (tokenPower * tokenMultipliers[0] * (quarter + recalculation - startDay));
            }
            else {
                _allSharesPowerPerStakingPool[pool - 1][i] = _allSharesPowerPerStakingPool[pool - 1][i] + (tokenPower * ((tokenMultipliers[i - currentPeriod - 1] * startDay) + (tokenMultipliers[i - currentPeriod] * (quarter + recalculation - startDay))));
            }
        }
    }

    function _unstake(address staker, uint256 tokenId) private {    
        _removeStake(staker, tokenId);        
        nftForStaking.transferFrom(address(this), staker, tokenId);       
    }

    function _removeStake(address staker, uint256 tokenId) private {       
        delete _nftsOwners[tokenId];
        uint256 currentPeriod = (block.timestamp - allPeriods[0]) / quarter;
        
        if (currentPeriod < 24) {        
            uint256 duration = (block.timestamp - _stakes[tokenId][2]) / quarter;
            uint256 startPeriod = _stakes[tokenId][3];
            uint256 startDay = _stakes[tokenId][4];
            uint256 tokenPower = _stakes[tokenId][5];
            uint256 endDay = ((block.timestamp - allPeriods[currentPeriod]) / recalculation) + 1;
            uint256 i;

            if (duration >= 1) {      
                _stakes[tokenId][6] = currentPeriod;
                _stakes[tokenId][7] = endDay;
                _createSnapshot(staker, tokenId);
            }
        
            for (uint256 p = 8; p < 11; p++) {
                uint256 pool = 0;
                if (p == 8 && _stakes[tokenId][8] == 1) {
                    pool = 1;
                }
                else if (p == 9 && _stakes[tokenId][9] == 1) {
                    pool = 2;
                }
                else if (p == 10 && _stakes[tokenId][10] == 1) {
                    pool = 3;
                }

                if (pool > 0) {
                    if (duration >= 1) {      
                        for (i = currentPeriod; i < 24; i++) {
                            _allSharesPowerPerStakingPool[pool - 1][i] = _allSharesPowerPerStakingPool[pool - 1][i] - (tokenPower * ((tokenMultipliers[i - startPeriod - 1] * startDay) + (tokenMultipliers[i - startPeriod] * (quarter + recalculation - startDay))));
                            if (i == currentPeriod) {
                                if (endDay < startDay) {
                                    _allSharesPowerPerStakingPool[pool - 1][i] = _allSharesPowerPerStakingPool[pool - 1][i] + (tokenPower * tokenMultipliers[i - startPeriod - 1] * endDay);
                                } 
                                else {
                                    _allSharesPowerPerStakingPool[pool - 1][i] = _allSharesPowerPerStakingPool[pool - 1][i] + (tokenPower * ((tokenMultipliers[i - startPeriod - 1] * startDay) + (tokenMultipliers[i - startPeriod] * (endDay - startDay))));
                                }
                            }
                        }
                    }
                    else {        
                        for (i = startPeriod; i < 24; i++) {
                            if (i == startPeriod) {
                                _allSharesPowerPerStakingPool[pool - 1][i] = _allSharesPowerPerStakingPool[pool - 1][i] - (tokenPower * tokenMultipliers[0] * (quarter + recalculation - startDay)); 
                            }
                            else {
                                _allSharesPowerPerStakingPool[pool - 1][i] = _allSharesPowerPerStakingPool[pool - 1][i] - (tokenPower * ((tokenMultipliers[i - startPeriod - 1] * startDay) + (tokenMultipliers[i - startPeriod] * (quarter + recalculation - startDay))));
                            }
                        }   
                    }
                }
            }
        }
        delete _stakes[tokenId];
    }

    function _createSnapshot(address staker, uint256 tokenId) private {
        uint256[11] memory snapshot = _stakes[tokenId];    
        uint256 len = _stakeSnapshots[staker].length + 1;
        uint256[11][] memory newStakeSnapshots = new uint256[11][](len);
        newStakeSnapshots[0] = snapshot;

        for (uint256 i = 0; i < _stakeSnapshots[staker].length; i++) {
            newStakeSnapshots[i + 1] = _stakeSnapshots[staker][i];
        }
        _stakeSnapshots[staker] = newStakeSnapshots;
    }

    function _calcAccruedRewards(address staker) private view returns (uint256) {
        uint256 currentPeriod = (block.timestamp - allPeriods[0]) / quarter;        
        if (currentPeriod > 24) {
            currentPeriod = 24;
        }
        uint256 sum = 0;
        uint256 i;        
        for (i = 0; i < stakedNfts[staker].length; i++) {
            uint256 tokenId = stakedNfts[staker][i];
            uint256 nextClaim = _stakes[tokenId][0];
            uint256 nextBonus = _stakes[tokenId][1];
            uint256 startTime = _stakes[tokenId][2];
            uint256 duration = (block.timestamp - startTime) / quarter;
            uint256 startPeriod = _stakes[tokenId][3];
            uint256 startDay = _stakes[tokenId][4];
            uint256 tokenPower = _stakes[tokenId][5];
            uint256 delta;
            uint256 j;

            for (uint256 p = 8; p < 11; p++) {
                uint256 pool = 0;
                if (p == 8 && _stakes[tokenId][8] == 1) {
                    pool = 1;
                }
                else if (p == 9 && _stakes[tokenId][9] == 1) {
                    pool = 2;
                }
                else if (p == 10 && _stakes[tokenId][10] == 1) {
                    pool = 3;
                }
            
                if (pool > 0) { 
                    if (currentPeriod >= nextClaim && duration >= 1) {
                        for (j = nextClaim - 1; j < currentPeriod; j++) {               
                            delta = (allPeriods[j + 1] - startTime) / quarter;                    
                            if (j == startPeriod) {
                                sum = sum + ((tokenPower * tokenMultipliers[0] * (quarter + recalculation - startDay) * periodPoolsRewards[pool - 1][j]) / _allSharesPowerPerStakingPool[pool - 1][j]);
                            }
                            else {
                                sum = sum + (((tokenPower * ((tokenMultipliers[delta - 1] * startDay) + (tokenMultipliers[delta] * (quarter + recalculation - startDay)))) * periodPoolsRewards[pool - 1][j]) / _allSharesPowerPerStakingPool[pool - 1][j]);
                            }
                        }
                    }            
                    if (currentPeriod >= nextBonus && duration >= 1) {
                        for (j = nextBonus - 1; j < currentPeriod; j++) {               
                            delta = (allPeriods[j + 1] - startTime) / quarter;                    
                            if (j == startPeriod) {
                                sum = sum + ((tokenPower * tokenMultipliers[0] * (quarter + recalculation - startDay) * periodPoolsBonuses[pool - 1][j]) / _allSharesPowerPerStakingPool[pool - 1][j]);
                            }
                            else {
                                sum = sum + (((tokenPower * ((tokenMultipliers[delta - 1] * startDay) + (tokenMultipliers[delta] * (quarter + recalculation - startDay)))) * periodPoolsBonuses[pool - 1][j]) / _allSharesPowerPerStakingPool[pool - 1][j]);
                            }
                        }
                    } 
                }
            }
        }
        sum = sum + _calcAccruedSnapshots(staker);
        return sum;
    }

    function _calcAccruedSnapshots(address staker) private view returns (uint256) { 
        uint256 sum = 0;
        uint256 i;
        for (i = 0; i < _stakeSnapshots[staker].length; i++) {
            uint256[11] memory snapshot = _stakeSnapshots[staker][i];        
            uint256 nextClaim = snapshot[0];
            uint256 nextBonus = snapshot[1];
            uint256 startTime = snapshot[2];
            uint256 startPeriod = snapshot[3];
            uint256 startDay = snapshot[4];
            uint256 tokenPower = snapshot[5];          
            uint256 endPeriod = snapshot[6];
            uint256 endDay = snapshot[7];     

            for (uint256 p = 8; p < 11; p++) {
                uint256 pool = 0;
                if (p == 8 && snapshot[8] == 1) {
                    pool = 1;
                }
                else if (p == 9 && snapshot[9] == 1) {
                    pool = 2;
                }
                else if (p == 10 && snapshot[10] == 1) {
                    pool = 3;
                }
            
                if (pool > 0) {
                    uint256 j;
                    uint256 delta;
                    if (((block.timestamp - allPeriods[0]) / quarter) >= nextClaim) {
                        for (j = nextClaim - 1; j < endPeriod + 1; j++) {
                            delta = (allPeriods[j + 1] - startTime) / quarter;
                            if (j == startPeriod) {
                                sum = sum + ((tokenPower * tokenMultipliers[0] * (quarter + recalculation - startDay) * periodPoolsRewards[pool - 1][j]) / _allSharesPowerPerStakingPool[pool - 1][j]);
                            }
                            else if (j == endPeriod) {
                                if (endDay >= startDay) {
                                    sum = sum + ((tokenPower * ((tokenMultipliers[delta - 1] * startDay) + (tokenMultipliers[delta] * (endDay - startDay)))) * periodPoolsRewards[pool - 1][j] / _allSharesPowerPerStakingPool[pool - 1][j]);
                                } 
                                else {
                                    sum = sum + (tokenPower * tokenMultipliers[delta - 1] * endDay * periodPoolsRewards[pool - 1][j] / _allSharesPowerPerStakingPool[pool - 1][j]);
                                }
                            }
                            else {
                                sum = sum + (((tokenPower * ((tokenMultipliers[delta - 1] * startDay) + (tokenMultipliers[delta] * (quarter + recalculation - startDay)))) * periodPoolsRewards[pool - 1][j]) / _allSharesPowerPerStakingPool[pool - 1][j]);
                            }
                        }
                        for (j = nextBonus - 1; j < endPeriod + 1; j++) {
                            delta = (allPeriods[j + 1] - startTime) / quarter;
                            if (j == startPeriod) {
                                sum = sum + ((tokenPower * tokenMultipliers[0] * (quarter + recalculation - startDay) * periodPoolsBonuses[pool - 1][j]) / _allSharesPowerPerStakingPool[pool - 1][j]);
                            }
                            else if (j == endPeriod) {
                                if (endDay >= startDay) {
                                    sum = sum + ((tokenPower * ((tokenMultipliers[delta - 1] * startDay) + (tokenMultipliers[delta] * (endDay - startDay)))) * periodPoolsBonuses[pool - 1][j] / _allSharesPowerPerStakingPool[pool - 1][j]);
                                } 
                                else {
                                    sum = sum + (tokenPower * tokenMultipliers[delta - 1] * endDay * periodPoolsBonuses[pool - 1][j] / _allSharesPowerPerStakingPool[pool - 1][j]);
                                }
                            }
                            else {
                                sum = sum + (((tokenPower * ((tokenMultipliers[delta - 1] * startDay) + (tokenMultipliers[delta] * (quarter + recalculation - startDay)))) * periodPoolsBonuses[pool - 1][j]) / _allSharesPowerPerStakingPool[pool - 1][j]);
                            }
                        }
                    }
                    if (nextClaim == 99) {                        
                        for (j = nextBonus - 1; j < endPeriod + 1; j++) {
                            delta = (allPeriods[j + 1] - startTime) / quarter;
                            if (j == startPeriod) {
                                sum = sum + ((tokenPower * tokenMultipliers[0] * (quarter + recalculation - startDay) * periodPoolsBonuses[pool - 1][j]) / _allSharesPowerPerStakingPool[pool - 1][j]);
                            }
                            else if (j == endPeriod) {
                                if (endDay >= startDay) {
                                    sum = sum + ((tokenPower * ((tokenMultipliers[delta - 1] * startDay) + (tokenMultipliers[delta] * (endDay - startDay)))) * periodPoolsBonuses[pool - 1][j] / _allSharesPowerPerStakingPool[pool - 1][j]);
                                } 
                                else {
                                    sum = sum + (tokenPower * tokenMultipliers[delta - 1] * endDay * periodPoolsBonuses[pool - 1][j] / _allSharesPowerPerStakingPool[pool - 1][j]);
                                }
                            }
                            else {
                                sum = sum + (((tokenPower * ((tokenMultipliers[delta - 1] * startDay) + (tokenMultipliers[delta] * (quarter + recalculation - startDay)))) * periodPoolsBonuses[pool - 1][j]) / _allSharesPowerPerStakingPool[pool - 1][j]);
                            }
                        }                      
                    }
                }
            }
        }
        return sum;
    }

    function _calcEstimatedRewards(address staker) private view returns (uint256) {
        uint256 currentPeriod = (block.timestamp - allPeriods[0]) / quarter;
        if (currentPeriod > 23) {
            return 0;
        }
        uint256 sum = 0;
        uint256 i;        
        for (i = 0; i < stakedNfts[staker].length; i++) {
            uint256 tokenId = stakedNfts[staker][i];
            uint256 startPeriod = _stakes[tokenId][3];
            uint256 startDay = _stakes[tokenId][4];
            uint256 tokenPower = _stakes[tokenId][5];
            uint256 delta = currentPeriod - startPeriod;

            for (uint256 p = 8; p < 11; p++) {
                uint256 pool = 0;
                if (p == 8 && _stakes[tokenId][8] == 1) {
                    pool = 1;
                }
                else if (p == 9 && _stakes[tokenId][9] == 1) {
                    pool = 2;
                }
                else if (p == 10 && _stakes[tokenId][10] == 1) {
                    pool = 3;
                }
            
                if (pool > 0) {
                    if (periodPoolsEstimatedRewards[pool - 1][currentPeriod] > 0) {
                        if (currentPeriod == startPeriod) {
                            sum = sum + ((tokenPower * tokenMultipliers[0] * (quarter + recalculation - startDay) * periodPoolsEstimatedRewards[pool - 1][currentPeriod]) / _allSharesPowerPerStakingPool[pool - 1][currentPeriod]);
                        }
                        else {
                            sum = sum + (((tokenPower * ((tokenMultipliers[delta - 1] * startDay) + (tokenMultipliers[delta] * (quarter + recalculation - startDay)))) * periodPoolsEstimatedRewards[pool - 1][currentPeriod]) / _allSharesPowerPerStakingPool[pool - 1][currentPeriod]);
                        }
                    }
                    else {
                        if (currentPeriod > 0) {
                            if (currentPeriod == startPeriod) {
                                sum = sum + ((tokenPower * tokenMultipliers[0] * (quarter + recalculation - startDay) * periodPoolsEstimatedRewards[pool - 1][_lastPeriodEstimatedRewards]) / _allSharesPowerPerStakingPool[pool - 1][currentPeriod]);
                            }
                            else {
                                sum = sum + (((tokenPower * ((tokenMultipliers[delta - 1] * startDay) + (tokenMultipliers[delta] * (quarter + recalculation - startDay)))) * periodPoolsEstimatedRewards[pool - 1][_lastPeriodEstimatedRewards]) / _allSharesPowerPerStakingPool[pool - 1][currentPeriod]);

                            }
                        }
                    }
                }
             }
        }
        sum = sum + _calcEstimatedSnapshots(staker);
        return sum;
    }

    function _calcEstimatedSnapshots(address staker) private view returns (uint256) { 
        uint256 currentPeriod = (block.timestamp - allPeriods[0]) / quarter;  
        uint256 sum = 0;
        uint256 i;
        
        for (i = 0; i < _stakeSnapshots[staker].length; i++) {
            uint256[11] memory snapshot = _stakeSnapshots[staker][i];        
            uint256 startPeriod = snapshot[3];
            uint256 startDay = snapshot[4];
            uint256 tokenPower = snapshot[5];
            uint256 endPeriod = snapshot[6]; 
            uint256 endDay = snapshot[7];     
            uint256 delta = currentPeriod - startPeriod;
            if (currentPeriod == endPeriod) {
                for (uint256 p = 8; p < 11; p++) {
                    uint256 pool = 0;
                    if (p == 8 && snapshot[8] == 1) {
                        pool = 1;
                    }
                    else if (p == 9 && snapshot[9] == 1) {
                        pool = 2;
                    }
                    else if (p == 10 && snapshot[10] == 1) {
                        pool = 3;
                    }
            
                    if (pool > 0) {
                        if (periodPoolsEstimatedRewards[pool - 1][currentPeriod] > 0) {
                            if (endDay >= startDay) {
                                sum = sum + (((tokenPower * ((tokenMultipliers[delta - 1] * startDay) + (tokenMultipliers[delta] * (endDay - startDay)))) * periodPoolsEstimatedRewards[pool - 1][currentPeriod]) / _allSharesPowerPerStakingPool[pool - 1][currentPeriod]);
                            }
                            else {
                                sum = sum + (tokenPower * tokenMultipliers[delta - 1] * endDay * periodPoolsEstimatedRewards[pool - 1][currentPeriod] / _allSharesPowerPerStakingPool[pool - 1][currentPeriod]);
                            }
                        }
                        else {
                            if (endDay >= startDay) {
                                sum = sum + (((tokenPower * ((tokenMultipliers[delta - 1] * startDay) + (tokenMultipliers[delta] * (endDay - startDay)))) * periodPoolsEstimatedRewards[pool - 1][_lastPeriodEstimatedRewards]) / _allSharesPowerPerStakingPool[pool - 1][currentPeriod]);
                            }
                            else {
                                sum = sum + (tokenPower * tokenMultipliers[delta - 1] * endDay * periodPoolsEstimatedRewards[pool - 1][_lastPeriodEstimatedRewards] / _allSharesPowerPerStakingPool[pool - 1][currentPeriod]);
                            }
                        } 
                    }
                }
            }
        }
        return sum;
    }

    function _getTokenPower(uint256 tokenId) private pure returns (uint256 rate) {
        if (tokenId >= 1501) {
            return 100;
        }
        else if (tokenId >= 751) {
            return 130;
        }
        else if (tokenId >= 251) {
            return 150;
        }
        else if (tokenId >= 26) {
            return 175;
        }
        else if (tokenId >= 4) {
            return 200;
        }        
        else if (tokenId == 3) {
            return 250;
        }
        else if (tokenId == 2) {
            return 300;
        }
        else if (tokenId == 1) {
            return 400;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPeriods","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vesting","type":"address"}],"name":"allowStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"pool","type":"uint256"}],"name":"chooseAdditionalStakingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"claimableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultStakingPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"estimatedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"firstDayStakersAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstDayStakersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstStakingPoolRewardPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentDayOfQuarter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCurrentMultiplierForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentMultipliers","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentQuarterFromStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNfts","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNftsByAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNftsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnerByTokenId","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStakingPoolsOfToken","outputs":[{"internalType":"uint256","name":"pools","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStakingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftForStaking","outputs":[{"internalType":"contract IERC721Custom","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"periodBonuses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"periodEstimatedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"periodPoolsBonuses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"periodPoolsEstimatedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"periodPoolsRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"periodRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20Custom","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondStakingPoolRewardPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setBonusForLastPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pool","type":"uint256"}],"name":"setDefaultStakingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setEstimatedReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nft","type":"address"}],"name":"setNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRewardForLastPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"first","type":"uint256"},{"internalType":"uint256","name":"second","type":"uint256"},{"internalType":"uint256","name":"third","type":"uint256"}],"name":"setStakingPoolsRewardPercentages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vesting","type":"address"}],"name":"setVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"pool","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakedNfts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thirdStakingPoolRewardPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenMultipliers","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":"uint256","name":"tokenId","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vestingContract","outputs":[{"internalType":"contract IVesting","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

601960058190556023600655602860078190556003600855610380604052600a608081815260a091909152600d60c081905260e052600f6101008190526101208190526101408190526101605260146101808190526101a08190526101c08190526101e05261020083905261022083905261024083905261026092909252601e6102808190526102a08190526102c08190526102e05261030081905261032081905261034081905261036052620000bb90602290601862000d6f565b506040805161030081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e08101919091526200018d90603a90601862000d6f565b506040805161030081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e08101919091526200025f90605290601862000d6f565b506040805161030081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e08101919091526200033190606a90601862000d6f565b5061015c805460ff1916905560408051606081018252600180825260208201819052918101919091526200036b9061015d90600362000db7565b50605a6101ad5560016101ae55620151806101af553480156200038d57600080fd5b5060405162006cb038038062006cb0833981016040819052620003b09162000e20565b620003bb3362000b73565b60018055620003ca8262000bc3565b620003d58162000cf5565b6040805161030081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e0810191909152620004a690608290601862000d6f565b506040805161030081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e08101919091526200057890609a90601862000d6f565b506040805161030081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e08101919091526200064a9060b290601862000d6f565b506040805161030081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e08101919091526200071c9060ca90601862000d6f565b506040805161030081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e0810191909152620007ee9060e290601862000d6f565b506040805161030081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e0810191909152620008c09060fa90601862000d6f565b506040805161030081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e0810191909152620009939061011290601862000d6f565b506040805161030081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e081019190915262000a669061012a90601862000d6f565b506040805161030081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e081019190915262000b399061014290601862000d6f565b506101af546101ad5462000b4e919062000e83565b6101ad556101af546101ae5462000b66919062000e83565b6101ae555062000eb19050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811662000c135760405162461bcd60e51b81526020600482015260116024820152706e6f742076616c6964206164647265737360781b60448201526064015b60405180910390fd5b6040516301ffc9a760e01b81526380ac58cd60e01b600482015281906001600160a01b038216906301ffc9a79060240160206040518083038186803b15801562000c5c57600080fd5b505afa15801562000c71573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c97919062000e58565b62000cd25760405162461bcd60e51b815260206004820152600a6024820152696e6f742045524337323160b01b604482015260640162000c0a565b600280546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b03811662000d4d5760405162461bcd60e51b815260206004820152601d60248201527f4e46545374616b696e673a206e6f742076616c69642061646472657373000000604482015260640162000c0a565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b826018810192821562000da5579160200282015b8281111562000da5578251829060ff1690559160200191906001019062000d83565b5062000db392915062000dec565b5090565b826003810192821562000da5579160200282018281111562000da5578251829060ff1690559160200191906001019062000d83565b5b8082111562000db3576000815560010162000ded565b80516001600160a01b038116811462000e1b57600080fd5b919050565b6000806040838503121562000e3457600080fd5b62000e3f8362000e03565b915062000e4f6020840162000e03565b90509250929050565b60006020828403121562000e6b57600080fd5b8151801515811462000e7c57600080fd5b9392505050565b600081600019048311821515161562000eac57634e487b7160e01b600052601160045260246000fd5b500290565b615def8062000ec16000396000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c8063804f5b7f11610182578063b3a0ebc9116100e9578063dc01f60d116100a2578063f2fde38b1161007c578063f2fde38b14610604578063f3c1338714610617578063f7c618c11461062a578063f93894fe1461063d57600080fd5b8063dc01f60d146105d5578063ecb66881146105e8578063f1189d4a146105f157600080fd5b8063b3a0ebc914610579578063b7e07f8f1461058c578063c145825f14610594578063d8cb55e3146105a7578063daae16e1146105af578063dbeb8888146105c257600080fd5b806398827b441161013b57806398827b441461050457806398e7f04c1461050d5780639d30739814610537578063a7ee2d231461054a578063ad75208c1461055d578063affe7cfc1461056657600080fd5b8063804f5b7f146104a857806386847559146104bb578063881cc465146104c45780638c564a97146104d75780638da5cb5b146104e057806394b6e751146104f157600080fd5b80633e747e07116102265780635e6f6045116101df5780635e6f60451461044c57806361dbe4321461045f5780636f6ff3bc14610467578063715018a61461047a5780637b0472f0146104825780638036d8551461049557600080fd5b80633e747e07146103d85780633fceda29146103eb57806340d9e9d914610416578063453f2ee31461041e5780634e71d92d146104315780635db7e4981461043957600080fd5b806315e872341161027857806315e872341461037157806316d8c5ef14610384578063171959ac146103975780632e17de78146103aa57806335322f37146103bd5780633a66dd36146103c557600080fd5b806301ffc9a7146102c057806305ed9a67146102e8578063065156561461030857806308f9fad21461031d578063144fa6d714610332578063150b7a0214610345575b600080fd5b6102d36102ce366004615a27565b610650565b60405190151581526020015b60405180910390f35b33600090815261015a60205260409020545b6040519081526020016102df565b61031b610316366004615900565b610687565b005b610325610840565b6040516102df9190615ad1565b61031b610340366004615900565b61095b565b61035861035336600461593a565b610a4d565b6040516001600160e01b031990911681526020016102df565b6102fa61037f366004615a51565b610b0f565b6102fa610392366004615a51565b610b5e565b6102fa6103a5366004615a51565b610b75565b61031b6103b8366004615a51565b610b85565b61031b610d38565b6103256103d3366004615900565b610e19565b6102fa6103e6366004615a83565b610ef3565b6002546103fe906001600160a01b031681565b6040516001600160a01b0390911681526020016102df565b6102fa610f1e565b61031b61042c366004615a51565b610f49565b61031b610fdf565b61031b610447366004615aa5565b6117d9565b6004546103fe906001600160a01b031681565b6102d3611936565b61031b610475366004615900565b611979565b61031b6119af565b61031b610490366004615a83565b6119e5565b61031b6104a3366004615a51565b611c90565b6102fa6104b6366004615a83565b611e6c565b6102fa60055481565b6102fa6104d2366004615a51565b611e7c565b6102fa60085481565b6000546001600160a01b03166103fe565b6102fa6104ff3660046159d9565b611e8c565b6102fa60065481565b6103fe61051b366004615a51565b600090815261016160205260409020546001600160a01b031690565b61031b610545366004615a83565b611ebe565b61031b610558366004615a51565b612218565b6102fa60075481565b6102fa610574366004615a51565b6123ee565b6102fa610587366004615a51565b61253a565b6102fa61254a565b6102fa6105a2366004615a83565b6125ad565b6103256125be565b6102fa6105bd366004615900565b61267e565b6102fa6105d0366004615a51565b612689565b6102fa6105e3366004615900565b612699565b61015b546102fa565b61031b6105ff366004615a51565b6126a4565b61031b610612366004615900565b61282a565b61031b610625366004615900565b6128c2565b6003546103fe906001600160a01b031681565b6103fe61064b366004615a51565b6129be565b60006001600160e01b03198216630a85bd0160e11b148061068157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146106ba5760405162461bcd60e51b81526004016106b190615b5e565b60405180910390fd5b61015c5460ff161561071d5760405162461bcd60e51b815260206004820152602660248201527f4e46545374616b696e673a207374616b696e6720697320616c726561647920616044820152651b1b1bddd95960d21b60648201526084016106b1565b600354604051632474521560e21b81527f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660048201523060248201526001600160a01b03909116906391d148549060440160206040518083038186803b15801561078657600080fd5b505afa15801561079a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107be9190615a05565b6107da5760405162461bcd60e51b81526004016106b190615b15565b6107e3816129e9565b42600981905560015b601981101561082d576101ad546108039083615caa565b9150816009826019811061081957610819615d78565b01558061082581615d31565b9150506107ec565b505061015c805460ff1916600117905550565b33600090815261015a60205260408120546060918167ffffffffffffffff81111561086d5761086d615d8e565b604051908082528060200260200182016040528015610896578160200160208202803683370190505b50905060005b828110156109545733600090815261015a602052604081208054839081106108c6576108c6615d78565b60009182526020808320919091015480835261016290915260408220600201546101ad5491935091906108f98342615d03565b6109039190615cc2565b905060006022826018811061091a5761091a615d78565b015490508086868151811061093157610931615d78565b60200260200101818152505050505050808061094c90615d31565b91505061089c565b5092915050565b6000546001600160a01b031633146109855760405162461bcd60e51b81526004016106b190615b5e565b604051632474521560e21b81527f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6600482015230602482015281906001600160a01b038216906391d148549060440160206040518083038186803b1580156109ec57600080fd5b505afa158015610a00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a249190615a05565b610a405760405162461bcd60e51b81526004016106b190615b15565b610a4982612a61565b5050565b6002546000906001600160a01b0316336001600160a01b031614610ab35760405162461bcd60e51b815260206004820181905260248201527f4e46545374616b696e673a207472616e73666572206e6f7420616c6c6f77656460448201526064016106b1565b610abb611936565b610ad75760405162461bcd60e51b81526004016106b190615b93565b610ae48585600854612ad9565b507f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b600081815261016260205260408120600201546101ad548290610b328342615d03565b610b3c9190615cc2565b9050600060228260188110610b5357610b53615d78565b015495945050505050565b60228160188110610b6e57600080fd5b0154905081565b606a8160188110610b6e57600080fd5b600081815261016160205260409020546001600160a01b0316336001600160a01b031614610bf55760405162461bcd60e51b815260206004820152601d60248201527f4e46545374616b696e673a206e6f74206120746f6b656e206f776e657200000060448201526064016106b1565b6000610c0033612e85565b90508015610c1057610c10610fdf565b610c1a33836134eb565b33600090815261015a6020526040812054905b81811015610cfd5733600090815261015a60205260409020805485919083908110610c5a57610c5a615d78565b90600052602060002001541415610ceb5733600090815261015a60205260409020610c86600184615d03565b81548110610c9657610c96615d78565b906000526020600020015461015a6000610cad3390565b6001600160a01b03166001600160a01b031681526020019081526020016000208281548110610cde57610cde615d78565b6000918252602090912001555b80610cf581615d31565b915050610c2d565b5033600090815261015a60205260409020805480610d1d57610d1d615d62565b60019003818190600052602060002001600090559055505050565b33600081815261015a602052604081205491610d5390612e85565b90508015610d6357610d63610fdf565b60005b82811015610dc05733600090815261015a60205260408120805483908110610d9057610d90615d78565b90600052602060002001549050610dad610da73390565b826134eb565b5080610db881615d31565b915050610d66565b5060005b82811015610e145733600090815261015a60205260409020805480610deb57610deb615d62565b600190038181906000526020600020016000905590558080610e0c90615d31565b915050610dc4565b505050565b6001600160a01b038116600090815261015a60205260408120546060918167ffffffffffffffff811115610e4f57610e4f615d8e565b604051908082528060200260200182016040528015610e78578160200160208202803683370190505b50905060005b82811015610eeb576001600160a01b038516600090815261015a60205260409020805482908110610eb157610eb1615d78565b9060005260206000200154828281518110610ece57610ece615d78565b602090810291909101015280610ee381615d31565b915050610e7e565b509392505050565b60ca8260038110610f0357600080fd5b601802018160188110610f1557600080fd5b01549150829050565b6101ad546009546000918291610f349042615d03565b610f3e9190615cc2565b610681906001615caa565b6000546001600160a01b03163314610f735760405162461bcd60e51b81526004016106b190615b5e565b8015801590610f825750600481105b610f9e5760405162461bcd60e51b81526004016106b190615c0c565b61015d610fac600183615d03565b60038110610fbc57610fbc615d78565b0154610fda5760405162461bcd60e51b81526004016106b190615bd5565b600855565b600260015414156110025760405162461bcd60e51b81526004016106b190615c73565b6002600155600061101233612e85565b9050600081116110645760405162461bcd60e51b815260206004820152601c60248201527f4e46545374616b696e673a206e6f7468696e6720746f20636c61696d0000000060448201526064016106b1565b6101ad54600954600091906110799042615d03565b6110839190615cc2565b90506000601782111561109557601891505b5060005b33600090815261015a60205260409020548110156111ab5733600090815261015a602052604081208054839081106110d3576110d3615d78565b60009182526020822001549150603a6110ed600186615d03565b601881106110fd576110fd615d78565b0154111561112557611110836001615caa565b60008281526101626020526040902055611138565b6000818152610162602052604090208390555b60006052611147600186615d03565b6018811061115757611157615d78565b015411156111825761116a836001615caa565b60008281526101626020526040902060010155611198565b6000818152610162602052604090208390600101555b50806111a381615d31565b915050611099565b506000805b33600090815261016360205260409020548210156115ed57336000908152610163602052604081208054849081106111ea576111ea615d78565b600091825260209091206040805161016081019182905292600b908102909201919082845b81548152602001906001019080831161120f5750505050509050600080603a836006600b811061124157611241615d78565b60200201516018811061125657611256615d78565b015411156112a757336000908152610163602052604090208054606391908690811061128457611284615d78565b600091825260208220600b9091020101558061129f81615d31565b9150506113ca565b60c0820151603a90601881106112bf576112bf615d78565b01541580156112f557506000603a600184600660200201516112e19190615d03565b601881106112f1576112f1615d78565b0154115b156113425760c082015161130a906001615caa565b3360009081526101636020526040902080548690811061132c5761132c615d78565b600091825260208220600b9091020101556113ca565b60c0820151603a906018811061135a5761135a615d78565b015415801561138c575060c0820151603a9061137890600190615d03565b6018811061138857611388615d78565b0154155b156113ca5760c0820151336000908152610163602052604090208054869081106113b8576113b8615d78565b600091825260208220600b9091020101555b600060528360066020020151601881106113e6576113e6615d78565b0154118061141a57506000603a8360066020020151611406906001615caa565b6018811061141657611416615d78565b0154115b1561147957336000908152610163602052604090208054606391908690811061144557611445615d78565b90600052602060002090600b02016001600b811061146557611465615d78565b01558061147181615d31565b9150506115c1565b60006052600184600660200201516114919190615d03565b601881106114a1576114a1615d78565b015411806114ca57506000603a8360066020020151601881106114c6576114c6615d78565b0154115b156115285760c08201516114df906001615caa565b3360009081526101636020526040902080548690811061150157611501615d78565b90600052602060002090600b02016001600b811061152157611521615d78565b01556115c1565b60c082015160529061153c90600190615d03565b6018811061154c5761154c615d78565b0154158015611572575060c0820151603a906018811061156e5761156e615d78565b0154155b156115c15760c08201513360009081526101636020526040902080548690811061159e5761159e615d78565b90600052602060002090600b02016001600b81106115be576115be615d78565b01555b80600214156115d857826115d481615d31565b9350505b505081806115e590615d31565b9250506111b0565b8015611646573360009081526101636020526040902080548061161257611612615d62565b60019003818190600052602060002090600b02016000611632919061580c565b90558061163e81615d1a565b9150506115ed565b6000611653606486615cc2565b61165e906021615ce4565b9050600061166d606487615cc2565b611678906043615ce4565b6003549091506001600160a01b03166340c10f19336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401600060405180830381600087803b1580156116d557600080fd5b505af11580156116e9573d6000803e3d6000fd5b5050600354600480546040516340c10f1960e01b81526001600160a01b03918216928101929092526024820186905290911692506340c10f199150604401600060405180830381600087803b15801561174157600080fd5b505af1158015611755573d6000803e3d6000fd5b50506004546001600160a01b0316915063c83da6359050336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b1580156117b557600080fd5b505af11580156117c9573d6000803e3d6000fd5b5050600180555050505050505050565b6000546001600160a01b031633146118035760405162461bcd60e51b81526004016106b190615b5e565b8061180e8385615caa565b6118189190615caa565b6064146118675760405162461bcd60e51b815260206004820152601d60248201527f4e46545374616b696e673a2077726f6e672070657263656e746167657300000060448201526064016106b1565b60058390556006829055600781905582611882576000611885565b60015b60ff1661015d558161189857600061189b565b60015b60ff1661015e55806118ae5760006118b1565b60015b60ff1661015f5560085461015d906118cb90600190615d03565b600381106118db576118db615d78565b0154610e145760005b60038110156119305761015d816003811061190157611901615d78565b01546001141561191e57611916816001615caa565b600855611930565b8061192881615d31565b9150506118e4565b50505050565b61015c5460009060ff16801561196857506101ad546009546017919061195c9042615d03565b6119669190615cc2565b105b156119735750600190565b50600090565b6000546001600160a01b031633146119a35760405162461bcd60e51b81526004016106b190615b5e565b6119ac816129e9565b50565b6000546001600160a01b031633146119d95760405162461bcd60e51b81526004016106b190615b5e565b6119e36000613565565b565b60026001541415611a085760405162461bcd60e51b81526004016106b190615c73565b6002600155611a15611936565b611a315760405162461bcd60e51b81526004016106b190615b93565b60025460405163020604bf60e21b81526004810184905230916001600160a01b03169063081812fc9060240160206040518083038186803b158015611a7557600080fd5b505afa158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad919061591d565b6001600160a01b03161480611b4c57506002546001600160a01b031663e985e9c5336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b158015611b1457600080fd5b505afa158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c9190615a05565b611b985760405162461bcd60e51b815260206004820181905260248201527f4e46545374616b696e673a207472616e73666572206e6f7420616c6c6f77656460448201526064016106b1565b8015801590611ba75750600481105b611bc35760405162461bcd60e51b81526004016106b190615c0c565b61015d611bd1600183615d03565b60038110611be157611be1615d78565b0154611bff5760405162461bcd60e51b81526004016106b190615bd5565b6002546001600160a01b03166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101859052606401600060405180830381600087803b158015611c5f57600080fd5b505af1158015611c73573d6000803e3d6000fd5b50505050611c88611c813390565b8383612ad9565b505060018055565b6000546001600160a01b03163314611cba5760405162461bcd60e51b81526004016106b190615b5e565b61015c5460ff16611cdd5760405162461bcd60e51b81526004016106b190615b93565b60008111611d285760405162461bcd60e51b815260206004820152601860248201527713919514dd185ada5b99ce88195b5c1d1e481c995dd85c9960421b60448201526064016106b1565b6101ad5460095460009190611d3d9042615d03565b611d479190615cc2565b9050600081118015611d595750601981105b15611e5457603a611d6b600183615d03565b60188110611d7b57611d7b615d78565b0154611e545781603a611d8f600184615d03565b60188110611d9f57611d9f615d78565b0155600554606490611db19084615ce4565b611dbb9190615cc2565b6082611dc8600184615d03565b60188110611dd857611dd8615d78565b0155600654606490611dea9084615ce4565b611df49190615cc2565b609a611e01600184615d03565b60188110611e1157611e11615d78565b0155600754606490611e239084615ce4565b611e2d9190615cc2565b608260025b60180201611e41600184615d03565b60188110611e5157611e51615d78565b01555b6018811115610a495761015c805460ff191690555050565b60828260038110610f0357600080fd5b60528160188110610b6e57600080fd5b61015a6020528160005260406000208181548110611ea957600080fd5b90600052602060002001600091509150505481565b60026001541415611ee15760405162461bcd60e51b81526004016106b190615c73565b6002600155611eee611936565b611f0a5760405162461bcd60e51b81526004016106b190615b93565b60fa82118015611f1b57506105dd82105b611f7b5760405162461bcd60e51b815260206004820152602b60248201527f4e46545374616b696e673a206e6f7420616c6c6f77696e67206164646974696f60448201526a6e616c207374616b696e6760a81b60648201526084016106b1565b600082815261016160205260409020546001600160a01b0316336001600160a01b031614611feb5760405162461bcd60e51b815260206004820152601d60248201527f4e46545374616b696e673a206e6f74206120746f6b656e206f776e657200000060448201526064016106b1565b8015801590611ffa5750600481105b6120165760405162461bcd60e51b81526004016106b190615c0c565b61015d612024600183615d03565b6003811061203457612034615d78565b01546120525760405162461bcd60e51b81526004016106b190615bd5565b600082815261016260205260409020600a8101546009820154600890920154909161207c91615caa565b6120869190615caa565b6001146120e85760405162461bcd60e51b815260206004820152602a60248201527f4e46545374616b696e673a206164646974696f6e616c20706f6f6c20616c726560448201526930b23c9031b437b9b2b760b11b60648201526084016106b1565b806001141561213d5760008281526101626020526040902060080154156121215760405162461bcd60e51b81526004016106b190615c3c565b60008281526101626020526040902060019060085b01556121df565b806002141561218f5760008281526101626020526040902060090154156121765760405162461bcd60e51b81526004016106b190615c3c565b6000828152610162602052604090206001906009612136565b80600314156121df57600082815261016260205260409020600a0154156121c85760405162461bcd60e51b81526004016106b190615c3c565b600082815261016260205260409020600190600a01555b6000828152610162602052604090206005810154600382015460049092015490919061220d838383876135b5565b505060018055505050565b6000546001600160a01b031633146122425760405162461bcd60e51b81526004016106b190615b5e565b61015c5460ff166122655760405162461bcd60e51b81526004016106b190615b93565b600081116122b55760405162461bcd60e51b815260206004820152601760248201527f4e46545374616b696e673a20656d70747920626f6e757300000000000000000060448201526064016106b1565b6101ad54600954600091906122ca9042615d03565b6122d49190615cc2565b90506000811180156122e65750601981105b15611e5457603a6122f8600183615d03565b6018811061230857612308615d78565b01541580159061233457506052612320600183615d03565b6018811061233057612330615d78565b0154155b15611e5457816052612347600184615d03565b6018811061235757612357615d78565b01556005546064906123699084615ce4565b6123739190615cc2565b60ca612380600184615d03565b6018811061239057612390615d78565b01556006546064906123a29084615ce4565b6123ac9190615cc2565b60e26123b9600184615d03565b601881106123c9576123c9615d78565b01556007546064906123db9084615ce4565b6123e59190615cc2565b60ca6002611e32565b60008181526101626020526040812060088101546009820154600a9092015490919060018314801561241e575081155b8015612428575080155b1561243857506001949350505050565b821580156124465750816001145b8015612450575080155b1561246057506002949350505050565b8215801561246c575081155b80156124785750806001145b1561248857506003949350505050565b8260011480156124985750816001145b80156124a2575080155b156124b25750600c949350505050565b8260011480156124c0575081155b80156124cc5750806001145b156124dc5750600d949350505050565b821580156124ea5750816001145b80156124f65750806001145b1561250657506017949350505050565b8260011480156125165750816001145b80156125225750806001145b156125325750607b949350505050565b505050919050565b60098160198110610b6e57600080fd5b6101ad5460095460009182916125609042615d03565b61256a9190615cc2565b905060006101ae546009836019811061258557612585615d78565b01546125919042615d03565b61259b9190615cc2565b6125a6906001615caa565b9392505050565b6101128260038110610f0357600080fd5b33600090815261015a60205260408120546060918167ffffffffffffffff8111156125eb576125eb615d8e565b604051908082528060200260200182016040528015612614578160200160208202803683370190505b50905060005b828110156109545733600090815261015a6020526040902080548290811061264457612644615d78565b906000526020600020015482828151811061266157612661615d78565b60209081029190910101528061267681615d31565b91505061261a565b600061068182613791565b603a8160188110610b6e57600080fd5b600061068182612e85565b6000546001600160a01b031633146126ce5760405162461bcd60e51b81526004016106b190615b5e565b61015c5460ff166126f15760405162461bcd60e51b81526004016106b190615b93565b6000811161273c5760405162461bcd60e51b815260206004820152601860248201527713919514dd185ada5b99ce88195b5c1d1e481c995dd85c9960421b60448201526064016106b1565b6101ad54600954600091906127519042615d03565b61275b9190615cc2565b90506018811015611e545781606a826018811061277a5761277a615d78565b015560055460649061278c9084615ce4565b6127969190615cc2565b61011282601881106127aa576127aa615d78565b01556006546064906127bc9084615ce4565b6127c69190615cc2565b61012a82601881106127da576127da615d78565b01556007546064906127ec9084615ce4565b6127f69190615cc2565b610142826018811061280a5761280a615d78565b01556101ac8190556018811115610a495761015c805460ff191690555050565b6000546001600160a01b031633146128545760405162461bcd60e51b81526004016106b190615b5e565b6001600160a01b0381166128b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b1565b6119ac81613565565b6000546001600160a01b031633146128ec5760405162461bcd60e51b81526004016106b190615b5e565b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561293057600080fd5b505afa158015612944573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129689190615a6a565b146129b55760405162461bcd60e51b815260206004820152601d60248201527f4e46545374616b696e673a206e6f7420656d7074792062616c616e636500000060448201526064016106b1565b6119ac81613c93565b61015b81815481106129cf57600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b038116612a3f5760405162461bcd60e51b815260206004820152601d60248201527f4e46545374616b696e673a206e6f742076616c6964206164647265737300000060448201526064016106b1565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116612ab75760405162461bcd60e51b815260206004820152601d60248201527f4e46545374616b696e673a206e6f742076616c6964206164647265737300000060448201526064016106b1565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316600081815261015a60209081526040808320805460018101825590845282842001869055858352610161909152812080546001600160a01b0319169092179091556101ad54600954612b359042615d03565b612b3f9190615cc2565b90506000612b4e826001615caa565b905060006101ae5460098460198110612b6957612b69615d78565b0154612b759042615d03565b612b7f9190615cc2565b612b8a906001615caa565b90506000612b9786613db9565b905060fb861015612c4257604051806101600160405280848152602001848152602001428152602001858152602001838152602001828152602001600081526020016000815260200160018152602001600181526020016001815250610162600088815260200190815260200160002090600b612c1592919061581b565b50612c2381858460016135b5565b612c3081858460026135b5565b612c3d81858460036135b5565b612de0565b8460011415612ccc57604051806101600160405280848152602001848152602001428152602001858152602001838152602001828152602001600081526020016000815260200160018152602001600081526020016000815250610162600088815260200190815260200160002090600b612cbe92919061581b565b50612c3d81858460016135b5565b8460021415612d5657604051806101600160405280848152602001848152602001428152602001858152602001838152602001828152602001600081526020016000815260200160008152602001600181526020016000815250610162600088815260200190815260200160002090600b612d4892919061581b565b50612c3d81858460026135b5565b8460031415612de057604051806101600160405280848152602001848152602001428152602001858152602001838152602001828152602001600081526020016000815260200160008152602001600081526020016001815250610162600088815260200190815260200160002090600b612dd292919061581b565b50612de081858460036135b5565b83158015612dee5750816001145b15612e7c576001600160a01b0387166000908152610160602052604090205460ff16612e7c576001600160a01b038716600081815261016060205260408120805460ff1916600190811790915561015b805491820181559091527f2cc6449d4b241b19b97c045aef3155eef2b936c6218cb936e60fb2acbb3e29ce0180546001600160a01b03191690911790555b50505050505050565b6101ad546009546000918291612e9b9042615d03565b612ea59190615cc2565b90506018811115612eb4575060185b6000805b6001600160a01b038516600090815261015a60205260409020548110156134cf576001600160a01b038516600090815261015a60205260408120805483908110612f0457612f04615d78565b60009182526020808320919091015480835261016290915260408220805460018201546002909201546101ad5493955090939192909190612f458342615d03565b612f4f9190615cc2565b600086815261016260205260408120600381015460048201546005909201549394509290918060085b600b8110156134b1576000816008148015612fa5575060008c815261016260205260409020600801546001145b15612fb25750600161300c565b816009148015612fd4575060008c815261016260205260409020600901546001145b15612fe15750600261300c565b81600a148015613003575060008c815261016260205260409020600a01546001145b1561300c575060035b801561349e578a8f10158015613023575060018810155b156132585761303360018c615d03565b92505b8e831015613258576101ad54896009613050866001615caa565b6019811061306057613060615d78565b015461306c9190615d03565b6130769190615cc2565b9350868314156131425761016461308e600183615d03565b6003811061309e5761309e615d78565b6018020183601881106130b3576130b3615d78565b015460826130c2600184615d03565b600381106130d2576130d2615d78565b6018020184601881106130e7576130e7615d78565b0154876101ae546101ad546130fc9190615caa565b6131069190615d03565b6022546131139089615ce4565b61311d9190615ce4565b6131279190615ce4565b6131319190615cc2565b61313b908f615caa565b9d50613246565b610164613150600183615d03565b6003811061316057613160615d78565b60180201836018811061317557613175615d78565b01546082613184600184615d03565b6003811061319457613194615d78565b6018020184601881106131a9576131a9615d78565b0154876101ae546101ad546131be9190615caa565b6131c89190615d03565b602287601881106131db576131db615d78565b01546131e79190615ce4565b8860226131f560018a615d03565b6018811061320557613205615d78565b01546132119190615ce4565b61321b9190615caa565b6132259088615ce4565b61322f9190615ce4565b6132399190615cc2565b613243908f615caa565b9d505b8261325081615d31565b935050613036565b898f10158015613269575060018810155b1561349e5761327960018b615d03565b92505b8e83101561349e576101ad54896009613296866001615caa565b601981106132a6576132a6615d78565b01546132b29190615d03565b6132bc9190615cc2565b935086831415613388576101646132d4600183615d03565b600381106132e4576132e4615d78565b6018020183601881106132f9576132f9615d78565b015460ca613308600184615d03565b6003811061331857613318615d78565b60180201846018811061332d5761332d615d78565b0154876101ae546101ad546133429190615caa565b61334c9190615d03565b6022546133599089615ce4565b6133639190615ce4565b61336d9190615ce4565b6133779190615cc2565b613381908f615caa565b9d5061348c565b610164613396600183615d03565b600381106133a6576133a6615d78565b6018020183601881106133bb576133bb615d78565b015460ca6133ca600184615d03565b600381106133da576133da615d78565b6018020184601881106133ef576133ef615d78565b0154876101ae546101ad546134049190615caa565b61340e9190615d03565b6022876018811061342157613421615d78565b015461342d9190615ce4565b88602261343b60018a615d03565b6018811061344b5761344b615d78565b01546134579190615ce4565b6134619190615caa565b61346b9088615ce4565b6134759190615ce4565b61347f9190615cc2565b613489908f615caa565b9d505b8261349681615d31565b93505061327c565b50806134a981615d31565b915050612f78565b505050505050505050505080806134c790615d31565b915050612eb8565b6134d885613e47565b6134e29083615caa565b95945050505050565b6134f58282614b00565b6002546040516323b872dd60e01b81523060048201526001600160a01b03848116602483015260448201849052909116906323b872dd90606401600060405180830381600087803b15801561354957600080fd5b505af115801561355d573d6000803e3d6000fd5b505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b825b601881101561378a578381141561367557826101ae546101ad546135db9190615caa565b6135e59190615d03565b6022546135f29087615ce4565b6135fc9190615ce4565b61016461360a600185615d03565b6003811061361a5761361a615d78565b60180201826018811061362f5761362f615d78565b015461363b9190615caa565b610164613649600185615d03565b6003811061365957613659615d78565b60180201826018811061366e5761366e615d78565b0155613778565b826101ae546101ad546136889190615caa565b6136929190615d03565b602261369e8684615d03565b601881106136ae576136ae615d78565b01546136ba9190615ce4565b83602260016136c98886615d03565b6136d39190615d03565b601881106136e3576136e3615d78565b01546136ef9190615ce4565b6136f99190615caa565b6137039086615ce4565b610164613711600185615d03565b6003811061372157613721615d78565b60180201826018811061373657613736615d78565b01546137429190615caa565b610164613750600185615d03565b6003811061376057613760615d78565b60180201826018811061377557613775615d78565b01555b8061378281615d31565b9150506135b7565b5050505050565b6101ad5460095460009182916137a79042615d03565b6137b19190615cc2565b905060178111156137c55750600092915050565b6000805b6001600160a01b038516600090815261015a6020526040902054811015613c8a576001600160a01b038516600090815261015a6020526040812080548390811061381557613815615d78565b6000918252602080832091909101548083526101629091526040822060038101546004820154600590920154929450929091906138528489615d03565b905060085b600b811015613c715760008160081480156138845750600087815261016260205260409020600801546001145b15613891575060016138eb565b8160091480156138b35750600087815261016260205260409020600901546001145b156138c0575060026138eb565b81600a1480156138e25750600087815261016260205260409020600a01546001145b156138eb575060035b8015613c5e576000610112613901600184615d03565b6003811061391157613911615d78565b601802018b6018811061392657613926615d78565b01541115613add57858a14156139f957610164613944600183615d03565b6003811061395457613954615d78565b601802018a6018811061396957613969615d78565b0154610112613979600184615d03565b6003811061398957613989615d78565b601802018b6018811061399e5761399e615d78565b0154866101ae546101ad546139b39190615caa565b6139bd9190615d03565b6022546139ca9088615ce4565b6139d49190615ce4565b6139de9190615ce4565b6139e89190615cc2565b6139f2908a615caa565b9850613c5e565b610164613a07600183615d03565b60038110613a1757613a17615d78565b601802018a60188110613a2c57613a2c615d78565b0154610112613a3c600184615d03565b60038110613a4c57613a4c615d78565b601802018b60188110613a6157613a61615d78565b0154866101ae546101ad54613a769190615caa565b613a809190615d03565b60228660188110613a9357613a93615d78565b0154613a9f9190615ce4565b876022613aad600189615d03565b60188110613abd57613abd615d78565b0154613ac99190615ce4565b613ad39190615caa565b6139d49087615ce4565b8915613c5e57858a1415613b5657610164613af9600183615d03565b60038110613b0957613b09615d78565b601802018a60188110613b1e57613b1e615d78565b0154610112613b2e600184615d03565b60038110613b3e57613b3e615d78565b601802016101ac546018811061399e5761399e615d78565b610164613b64600183615d03565b60038110613b7457613b74615d78565b601802018a60188110613b8957613b89615d78565b0154610112613b99600184615d03565b60038110613ba957613ba9615d78565b601802016101ac5460188110613bc157613bc1615d78565b0154866101ae546101ad54613bd69190615caa565b613be09190615d03565b60228660188110613bf357613bf3615d78565b0154613bff9190615ce4565b876022613c0d600189615d03565b60188110613c1d57613c1d615d78565b0154613c299190615ce4565b613c339190615caa565b613c3d9087615ce4565b613c479190615ce4565b613c519190615cc2565b613c5b908a615caa565b98505b5080613c6981615d31565b915050613857565b5050505050508080613c8290615d31565b9150506137c9565b6134d885615190565b6001600160a01b038116613cdd5760405162461bcd60e51b81526020600482015260116024820152706e6f742076616c6964206164647265737360781b60448201526064016106b1565b6040516301ffc9a760e01b81526380ac58cd60e01b600482015281906001600160a01b038216906301ffc9a79060240160206040518083038186803b158015613d2557600080fd5b505afa158015613d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d5d9190615a05565b613d965760405162461bcd60e51b815260206004820152600a6024820152696e6f742045524337323160b01b60448201526064016106b1565b600280546001600160a01b0319166001600160a01b039290921691909117905550565b60006105dd8210613dcc57506064919050565b6102ef8210613ddd57506082919050565b60fb8210613ded57506096919050565b601a8210613dfd575060af919050565b60048210613e0d575060c8919050565b8160031415613e1e575060fa919050565b8160021415613e30575061012c919050565b8160011415613e425750610190919050565b919050565b600080805b6001600160a01b03841660009081526101636020526040902054811015610954576001600160a01b038416600090815261016360205260408120805483908110613e9857613e98615d78565b600091825260209091206040805161016081019182905292600b908102909201919082845b815481526020019060010190808311613ebd57505050505090506000816000600b8110613eec57613eec615d78565b602090810291909101519083015160408401516060850151608086015160a087015160c088015160e08901519697509495939492939192909160085b600b811015614ae3576000816008148015613f4857506101008b01516001145b15613f5557506001613f95565b816009148015613f6a57506101208b01516001145b15613f7757506002613f95565b81600a148015613f8c57506101408b01516001145b15613f95575060035b8015614ad0576000808b6101ad546009600060198110613fb757613fb7615d78565b0154613fc39042615d03565b613fcd9190615cc2565b1061471e57613fdd60018d615d03565b91505b613feb866001615caa565b821015614378576101ad548a6009614004856001615caa565b6019811061401457614014615d78565b01546140209190615d03565b61402a9190615cc2565b9050888214156140fb57610164614042600185615d03565b6003811061405257614052615d78565b60180201826018811061406757614067615d78565b01546082614076600186615d03565b6003811061408657614086615d78565b60180201836018811061409b5761409b615d78565b0154896101ae546101ad546140b09190615caa565b6140ba9190615d03565b602260005b01546140cb908b615ce4565b6140d59190615ce4565b6140df9190615ce4565b6140e99190615cc2565b8f6140f49190615caa565b9e50614366565b85821415614261578785106141da57610164614118600185615d03565b6003811061412857614128615d78565b60180201826018811061413d5761413d615d78565b0154608261414c600186615d03565b6003811061415c5761415c615d78565b60180201836018811061417157614171615d78565b015461417d8a88615d03565b6022846018811061419057614190615d78565b015461419c9190615ce4565b8a60226141aa600187615d03565b601881106141ba576141ba615d78565b01546141c69190615ce4565b6141d09190615caa565b6140d5908a615ce4565b6101646141e8600185615d03565b600381106141f8576141f8615d78565b60180201826018811061420d5761420d615d78565b0154608261421c600186615d03565b6003811061422c5761422c615d78565b60180201836018811061424157614241615d78565b0154866022614251600186615d03565b601881106140bf576140bf615d78565b61016461426f600185615d03565b6003811061427f5761427f615d78565b60180201826018811061429457614294615d78565b015460826142a3600186615d03565b600381106142b3576142b3615d78565b6018020183601881106142c8576142c8615d78565b0154896101ae546101ad546142dd9190615caa565b6142e79190615d03565b602284601881106142fa576142fa615d78565b01546143069190615ce4565b8a6022614314600187615d03565b6018811061432457614324615d78565b01546143309190615ce4565b61433a9190615caa565b614344908a615ce4565b61434e9190615ce4565b6143589190615cc2565b8f6143639190615caa565b9e505b8161437081615d31565b925050613fe0565b61438360018c615d03565b91505b614391866001615caa565b82101561471e576101ad548a60096143aa856001615caa565b601981106143ba576143ba615d78565b01546143c69190615d03565b6143d09190615cc2565b9050888214156144a1576101646143e8600185615d03565b600381106143f8576143f8615d78565b60180201826018811061440d5761440d615d78565b015460ca61441c600186615d03565b6003811061442c5761442c615d78565b60180201836018811061444157614441615d78565b0154896101ae546101ad546144569190615caa565b6144609190615d03565b602260005b0154614471908b615ce4565b61447b9190615ce4565b6144859190615ce4565b61448f9190615cc2565b8f61449a9190615caa565b9e5061470c565b8582141561460757878510614580576101646144be600185615d03565b600381106144ce576144ce615d78565b6018020182601881106144e3576144e3615d78565b015460ca6144f2600186615d03565b6003811061450257614502615d78565b60180201836018811061451757614517615d78565b01546145238a88615d03565b6022846018811061453657614536615d78565b01546145429190615ce4565b8a6022614550600187615d03565b6018811061456057614560615d78565b015461456c9190615ce4565b6145769190615caa565b61447b908a615ce4565b61016461458e600185615d03565b6003811061459e5761459e615d78565b6018020182601881106145b3576145b3615d78565b015460ca6145c2600186615d03565b600381106145d2576145d2615d78565b6018020183601881106145e7576145e7615d78565b01548660226145f7600186615d03565b6018811061446557614465615d78565b610164614615600185615d03565b6003811061462557614625615d78565b60180201826018811061463a5761463a615d78565b015460ca614649600186615d03565b6003811061465957614659615d78565b60180201836018811061466e5761466e615d78565b0154896101ae546101ad546146839190615caa565b61468d9190615d03565b602284601881106146a0576146a0615d78565b01546146ac9190615ce4565b8a60226146ba600187615d03565b601881106146ca576146ca615d78565b01546146d69190615ce4565b6146e09190615caa565b6146ea908a615ce4565b6146f49190615ce4565b6146fe9190615cc2565b8f6147099190615caa565b9e505b8161471681615d31565b925050614386565b8b60631415614acd5761473260018c615d03565b91505b614740866001615caa565b821015614acd576101ad548a6009614759856001615caa565b6019811061476957614769615d78565b01546147759190615d03565b61477f9190615cc2565b90508882141561485057610164614797600185615d03565b600381106147a7576147a7615d78565b6018020182601881106147bc576147bc615d78565b015460ca6147cb600186615d03565b600381106147db576147db615d78565b6018020183601881106147f0576147f0615d78565b0154896101ae546101ad546148059190615caa565b61480f9190615d03565b602260005b0154614820908b615ce4565b61482a9190615ce4565b6148349190615ce4565b61483e9190615cc2565b8f6148499190615caa565b9e50614abb565b858214156149b65787851061492f5761016461486d600185615d03565b6003811061487d5761487d615d78565b60180201826018811061489257614892615d78565b015460ca6148a1600186615d03565b600381106148b1576148b1615d78565b6018020183601881106148c6576148c6615d78565b01546148d28a88615d03565b602284601881106148e5576148e5615d78565b01546148f19190615ce4565b8a60226148ff600187615d03565b6018811061490f5761490f615d78565b015461491b9190615ce4565b6149259190615caa565b61482a908a615ce4565b61016461493d600185615d03565b6003811061494d5761494d615d78565b60180201826018811061496257614962615d78565b015460ca614971600186615d03565b6003811061498157614981615d78565b60180201836018811061499657614996615d78565b01548660226149a6600186615d03565b6018811061481457614814615d78565b6101646149c4600185615d03565b600381106149d4576149d4615d78565b6018020182601881106149e9576149e9615d78565b015460ca6149f8600186615d03565b60038110614a0857614a08615d78565b601802018360188110614a1d57614a1d615d78565b0154896101ae546101ad54614a329190615caa565b614a3c9190615d03565b60228460188110614a4f57614a4f615d78565b0154614a5b9190615ce4565b8a6022614a69600187615d03565b60188110614a7957614a79615d78565b0154614a859190615ce4565b614a8f9190615caa565b614a99908a615ce4565b614aa39190615ce4565b614aad9190615cc2565b8f614ab89190615caa565b9e505b81614ac581615d31565b925050614735565b50505b5080614adb81615d31565b915050613f28565b505050505050505050508080614af890615d31565b915050613e4c565b60008181526101616020526040812080546001600160a01b03191690556101ad54600954614b2e9042615d03565b614b389190615cc2565b90506018811015615178576101ad5460008381526101626020526040812090919060020154614b679042615d03565b614b719190615cc2565b600084815261016260205260408120600381015460048201546005909201546101ae5494955090939192909160098760198110614bb057614bb0615d78565b0154614bbc9042615d03565b614bc69190615cc2565b614bd1906001615caa565b9050600060018610614c035760008881526101626020526040902060068101889055600701829055614c03898961563e565b60085b600b811015615170576000816008148015614c33575060008a815261016260205260409020600801546001145b15614c4057506001614c9a565b816009148015614c62575060008a815261016260205260409020600901546001145b15614c6f57506002614c9a565b81600a148015614c91575060008a815261016260205260409020600a01546001145b15614c9a575060035b801561515d5760018810614f86578892505b6018831015614f8157856101ae546101ad54614cc89190615caa565b614cd29190615d03565b6022614cde8986615d03565b60188110614cee57614cee615d78565b0154614cfa9190615ce4565b8660226001614d098b88615d03565b614d139190615d03565b60188110614d2357614d23615d78565b0154614d2f9190615ce4565b614d399190615caa565b614d439086615ce4565b610164614d51600184615d03565b60038110614d6157614d61615d78565b601802018460188110614d7657614d76615d78565b0154614d829190615d03565b610164614d90600184615d03565b60038110614da057614da0615d78565b601802018460188110614db557614db5615d78565b015582891415614f6f5785841015614e7f578360226001614dd68a87615d03565b614de09190615d03565b60188110614df057614df0615d78565b0154614dfc9087615ce4565b614e069190615ce4565b610164614e14600184615d03565b60038110614e2457614e24615d78565b601802018460188110614e3957614e39615d78565b0154614e459190615caa565b610164614e53600184615d03565b60038110614e6357614e63615d78565b601802018460188110614e7857614e78615d78565b0155614f6f565b614e898685615d03565b6022614e958986615d03565b60188110614ea557614ea5615d78565b0154614eb19190615ce4565b8660226001614ec08b88615d03565b614eca9190615d03565b60188110614eda57614eda615d78565b0154614ee69190615ce4565b614ef09190615caa565b614efa9086615ce4565b610164614f08600184615d03565b60038110614f1857614f18615d78565b601802018460188110614f2d57614f2d615d78565b0154614f399190615caa565b610164614f47600184615d03565b60038110614f5757614f57615d78565b601802018460188110614f6c57614f6c615d78565b01555b82614f7981615d31565b935050614cac565b61515d565b8692505b601883101561515d578683141561504857856101ae546101ad54614fae9190615caa565b614fb89190615d03565b602254614fc59087615ce4565b614fcf9190615ce4565b610164614fdd600184615d03565b60038110614fed57614fed615d78565b60180201846018811061500257615002615d78565b015461500e9190615d03565b61016461501c600184615d03565b6003811061502c5761502c615d78565b60180201846018811061504157615041615d78565b015561514b565b856101ae546101ad5461505b9190615caa565b6150659190615d03565b60226150718986615d03565b6018811061508157615081615d78565b015461508d9190615ce4565b866022600161509c8b88615d03565b6150a69190615d03565b601881106150b6576150b6615d78565b01546150c29190615ce4565b6150cc9190615caa565b6150d69086615ce4565b6101646150e4600184615d03565b600381106150f4576150f4615d78565b60180201846018811061510957615109615d78565b01546151159190615d03565b610164615123600184615d03565b6003811061513357615133615d78565b60180201846018811061514857615148615d78565b01555b8261515581615d31565b935050614f8a565b508061516881615d31565b915050614c06565b505050505050505b600082815261016260205260408120610e149161580c565b6101ad5460095460009182916151a69042615d03565b6151b09190615cc2565b90506000805b6001600160a01b03851660009081526101636020526040902054811015610eeb576001600160a01b03851660009081526101636020526040812080548390811061520257615202615d78565b600091825260209091206040805161016081019182905292600b908102909201919082845b81548152602001906001019080831161522757505050505090506000816003600b811061525657615256615d78565b6020020151608083015160a084015160c085015160e086015193945091929091906000615283868b615d03565b9050828a14156156245760085b600b8110156156225760008160081480156152b057506101008901516001145b156152bd575060016152fd565b8160091480156152d257506101208901516001145b156152df575060026152fd565b81600a1480156152f457506101408901516001145b156152fd575060035b801561560f576000610112615313600184615d03565b6003811061532357615323615d78565b601802018d6018811061533857615338615d78565b015411156154db5786841061543d57610164615355600183615d03565b6003811061536557615365615d78565b601802018c6018811061537a5761537a615d78565b015461011261538a600184615d03565b6003811061539a5761539a615d78565b601802018d601881106153af576153af615d78565b01546153bb8987615d03565b602286601881106153ce576153ce615d78565b01546153da9190615ce4565b8960226153e8600189615d03565b601881106153f8576153f8615d78565b01546154049190615ce4565b61540e9190615caa565b6154189089615ce4565b6154229190615ce4565b61542c9190615cc2565b615436908c615caa565b9a5061560f565b61016461544b600183615d03565b6003811061545b5761545b615d78565b601802018c6018811061547057615470615d78565b0154610112615480600184615d03565b6003811061549057615490615d78565b601802018d601881106154a5576154a5615d78565b01548560226154b5600188615d03565b601881106154c5576154c5615d78565b01546154d1908a615ce4565b6154189190615ce4565b86841061554d576101646154f0600183615d03565b6003811061550057615500615d78565b601802018c6018811061551557615515615d78565b0154610112615525600184615d03565b6003811061553557615535615d78565b601802016101ac54601881106153af576153af615d78565b61016461555b600183615d03565b6003811061556b5761556b615d78565b601802018c6018811061558057615580615d78565b0154610112615590600184615d03565b600381106155a0576155a0615d78565b601802016101ac54601881106155b8576155b8615d78565b01548560226155c8600188615d03565b601881106155d8576155d8615d78565b01546155e4908a615ce4565b6155ee9190615ce4565b6155f89190615ce4565b6156029190615cc2565b61560c908c615caa565b9a505b508061561a81615d31565b915050615290565b505b50505050505050808061563690615d31565b9150506151b6565b60008181526101626020526040808220815161016081019283905291600b9082845b81548152602001906001019080831161566057505050506001600160a01b03851660009081526101636020526040812054929350916156a191506001615caa565b905060008167ffffffffffffffff8111156156be576156be615d8e565b6040519080825280602002602001820160405280156156f757816020015b6156e4615859565b8152602001906001900390816156dc5790505b509050828160008151811061570e5761570e615d78565b602002602001018190525060005b6001600160a01b038616600090815261016360205260409020548110156157e1576001600160a01b03861660009081526101636020526040902080548290811061576857615768615d78565b600091825260209091206040805161016081019182905292600b908102909201919082845b81548152602001906001019080831161578d575050505050828260016157b39190615caa565b815181106157c3576157c3615d78565b602002602001018190525080806157d990615d31565b91505061571c565b506001600160a01b038516600090815261016360209081526040909120825161355d92840190615878565b506119ac90600b8101906158ce565b82600b8101928215615849579160200282015b8281111561584957825182559160200191906001019061582e565b506158559291506158ce565b5090565b604051806101600160405280600b906020820280368337509192915050565b82805482825590600052602060002090600b0281019282156158c2579160200282015b828111156158c25782516158b2908390600b61581b565b50916020019190600b019061589b565b506158559291506158e3565b5b8082111561585557600081556001016158cf565b808211156158555760006158f7828261580c565b50600b016158e3565b60006020828403121561591257600080fd5b81356125a681615da4565b60006020828403121561592f57600080fd5b81516125a681615da4565b60008060008060006080868803121561595257600080fd5b853561595d81615da4565b9450602086013561596d81615da4565b935060408601359250606086013567ffffffffffffffff8082111561599157600080fd5b818801915088601f8301126159a557600080fd5b8135818111156159b457600080fd5b8960208285010111156159c657600080fd5b9699959850939650602001949392505050565b600080604083850312156159ec57600080fd5b82356159f781615da4565b946020939093013593505050565b600060208284031215615a1757600080fd5b815180151581146125a657600080fd5b600060208284031215615a3957600080fd5b81356001600160e01b0319811681146125a657600080fd5b600060208284031215615a6357600080fd5b5035919050565b600060208284031215615a7c57600080fd5b5051919050565b60008060408385031215615a9657600080fd5b50508035926020909101359150565b600080600060608486031215615aba57600080fd5b505081359360208301359350604090920135919050565b6020808252825182820181905260009190848201906040850190845b81811015615b0957835183529284019291840191600101615aed565b50909695505050505050565b60208082526029908201527f4e46545374616b696e673a206d7573742068617665206d696e74657220726f6c60408201526819481d1bc81b5a5b9d60ba1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f4e46545374616b696e673a207374616b696e67206973206e6f7420616c6c6f77604082015261195960f21b606082015260800190565b6020808252601c908201527f4e46545374616b696e673a20706f6f6c2069732064697361626c656400000000604082015260600190565b60208082526016908201527513919514dd185ada5b99ce881ddc9bdb99c81c1bdbdb60521b604082015260600190565b6020808252601f908201527f4e46545374616b696e673a20706f6f6c20616c72656164792063686f73656e00604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115615cbd57615cbd615d4c565b500190565b600082615cdf57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615615cfe57615cfe615d4c565b500290565b600082821015615d1557615d15615d4c565b500390565b600081615d2957615d29615d4c565b506000190190565b6000600019821415615d4557615d45615d4c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146119ac57600080fdfea2646970667358221220b2585f2a64efa3f4c6fa27ec5a05068f53a143816231cdcfbc66f757fd63b9c064736f6c63430008060033000000000000000000000000df686b3eae2c1b576f0570f1f2c516fee03987a8000000000000000000000000b0915aa56d49785926c62b862115cb979a0f6443

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102bb5760003560e01c8063804f5b7f11610182578063b3a0ebc9116100e9578063dc01f60d116100a2578063f2fde38b1161007c578063f2fde38b14610604578063f3c1338714610617578063f7c618c11461062a578063f93894fe1461063d57600080fd5b8063dc01f60d146105d5578063ecb66881146105e8578063f1189d4a146105f157600080fd5b8063b3a0ebc914610579578063b7e07f8f1461058c578063c145825f14610594578063d8cb55e3146105a7578063daae16e1146105af578063dbeb8888146105c257600080fd5b806398827b441161013b57806398827b441461050457806398e7f04c1461050d5780639d30739814610537578063a7ee2d231461054a578063ad75208c1461055d578063affe7cfc1461056657600080fd5b8063804f5b7f146104a857806386847559146104bb578063881cc465146104c45780638c564a97146104d75780638da5cb5b146104e057806394b6e751146104f157600080fd5b80633e747e07116102265780635e6f6045116101df5780635e6f60451461044c57806361dbe4321461045f5780636f6ff3bc14610467578063715018a61461047a5780637b0472f0146104825780638036d8551461049557600080fd5b80633e747e07146103d85780633fceda29146103eb57806340d9e9d914610416578063453f2ee31461041e5780634e71d92d146104315780635db7e4981461043957600080fd5b806315e872341161027857806315e872341461037157806316d8c5ef14610384578063171959ac146103975780632e17de78146103aa57806335322f37146103bd5780633a66dd36146103c557600080fd5b806301ffc9a7146102c057806305ed9a67146102e8578063065156561461030857806308f9fad21461031d578063144fa6d714610332578063150b7a0214610345575b600080fd5b6102d36102ce366004615a27565b610650565b60405190151581526020015b60405180910390f35b33600090815261015a60205260409020545b6040519081526020016102df565b61031b610316366004615900565b610687565b005b610325610840565b6040516102df9190615ad1565b61031b610340366004615900565b61095b565b61035861035336600461593a565b610a4d565b6040516001600160e01b031990911681526020016102df565b6102fa61037f366004615a51565b610b0f565b6102fa610392366004615a51565b610b5e565b6102fa6103a5366004615a51565b610b75565b61031b6103b8366004615a51565b610b85565b61031b610d38565b6103256103d3366004615900565b610e19565b6102fa6103e6366004615a83565b610ef3565b6002546103fe906001600160a01b031681565b6040516001600160a01b0390911681526020016102df565b6102fa610f1e565b61031b61042c366004615a51565b610f49565b61031b610fdf565b61031b610447366004615aa5565b6117d9565b6004546103fe906001600160a01b031681565b6102d3611936565b61031b610475366004615900565b611979565b61031b6119af565b61031b610490366004615a83565b6119e5565b61031b6104a3366004615a51565b611c90565b6102fa6104b6366004615a83565b611e6c565b6102fa60055481565b6102fa6104d2366004615a51565b611e7c565b6102fa60085481565b6000546001600160a01b03166103fe565b6102fa6104ff3660046159d9565b611e8c565b6102fa60065481565b6103fe61051b366004615a51565b600090815261016160205260409020546001600160a01b031690565b61031b610545366004615a83565b611ebe565b61031b610558366004615a51565b612218565b6102fa60075481565b6102fa610574366004615a51565b6123ee565b6102fa610587366004615a51565b61253a565b6102fa61254a565b6102fa6105a2366004615a83565b6125ad565b6103256125be565b6102fa6105bd366004615900565b61267e565b6102fa6105d0366004615a51565b612689565b6102fa6105e3366004615900565b612699565b61015b546102fa565b61031b6105ff366004615a51565b6126a4565b61031b610612366004615900565b61282a565b61031b610625366004615900565b6128c2565b6003546103fe906001600160a01b031681565b6103fe61064b366004615a51565b6129be565b60006001600160e01b03198216630a85bd0160e11b148061068157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146106ba5760405162461bcd60e51b81526004016106b190615b5e565b60405180910390fd5b61015c5460ff161561071d5760405162461bcd60e51b815260206004820152602660248201527f4e46545374616b696e673a207374616b696e6720697320616c726561647920616044820152651b1b1bddd95960d21b60648201526084016106b1565b600354604051632474521560e21b81527f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660048201523060248201526001600160a01b03909116906391d148549060440160206040518083038186803b15801561078657600080fd5b505afa15801561079a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107be9190615a05565b6107da5760405162461bcd60e51b81526004016106b190615b15565b6107e3816129e9565b42600981905560015b601981101561082d576101ad546108039083615caa565b9150816009826019811061081957610819615d78565b01558061082581615d31565b9150506107ec565b505061015c805460ff1916600117905550565b33600090815261015a60205260408120546060918167ffffffffffffffff81111561086d5761086d615d8e565b604051908082528060200260200182016040528015610896578160200160208202803683370190505b50905060005b828110156109545733600090815261015a602052604081208054839081106108c6576108c6615d78565b60009182526020808320919091015480835261016290915260408220600201546101ad5491935091906108f98342615d03565b6109039190615cc2565b905060006022826018811061091a5761091a615d78565b015490508086868151811061093157610931615d78565b60200260200101818152505050505050808061094c90615d31565b91505061089c565b5092915050565b6000546001600160a01b031633146109855760405162461bcd60e51b81526004016106b190615b5e565b604051632474521560e21b81527f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6600482015230602482015281906001600160a01b038216906391d148549060440160206040518083038186803b1580156109ec57600080fd5b505afa158015610a00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a249190615a05565b610a405760405162461bcd60e51b81526004016106b190615b15565b610a4982612a61565b5050565b6002546000906001600160a01b0316336001600160a01b031614610ab35760405162461bcd60e51b815260206004820181905260248201527f4e46545374616b696e673a207472616e73666572206e6f7420616c6c6f77656460448201526064016106b1565b610abb611936565b610ad75760405162461bcd60e51b81526004016106b190615b93565b610ae48585600854612ad9565b507f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b600081815261016260205260408120600201546101ad548290610b328342615d03565b610b3c9190615cc2565b9050600060228260188110610b5357610b53615d78565b015495945050505050565b60228160188110610b6e57600080fd5b0154905081565b606a8160188110610b6e57600080fd5b600081815261016160205260409020546001600160a01b0316336001600160a01b031614610bf55760405162461bcd60e51b815260206004820152601d60248201527f4e46545374616b696e673a206e6f74206120746f6b656e206f776e657200000060448201526064016106b1565b6000610c0033612e85565b90508015610c1057610c10610fdf565b610c1a33836134eb565b33600090815261015a6020526040812054905b81811015610cfd5733600090815261015a60205260409020805485919083908110610c5a57610c5a615d78565b90600052602060002001541415610ceb5733600090815261015a60205260409020610c86600184615d03565b81548110610c9657610c96615d78565b906000526020600020015461015a6000610cad3390565b6001600160a01b03166001600160a01b031681526020019081526020016000208281548110610cde57610cde615d78565b6000918252602090912001555b80610cf581615d31565b915050610c2d565b5033600090815261015a60205260409020805480610d1d57610d1d615d62565b60019003818190600052602060002001600090559055505050565b33600081815261015a602052604081205491610d5390612e85565b90508015610d6357610d63610fdf565b60005b82811015610dc05733600090815261015a60205260408120805483908110610d9057610d90615d78565b90600052602060002001549050610dad610da73390565b826134eb565b5080610db881615d31565b915050610d66565b5060005b82811015610e145733600090815261015a60205260409020805480610deb57610deb615d62565b600190038181906000526020600020016000905590558080610e0c90615d31565b915050610dc4565b505050565b6001600160a01b038116600090815261015a60205260408120546060918167ffffffffffffffff811115610e4f57610e4f615d8e565b604051908082528060200260200182016040528015610e78578160200160208202803683370190505b50905060005b82811015610eeb576001600160a01b038516600090815261015a60205260409020805482908110610eb157610eb1615d78565b9060005260206000200154828281518110610ece57610ece615d78565b602090810291909101015280610ee381615d31565b915050610e7e565b509392505050565b60ca8260038110610f0357600080fd5b601802018160188110610f1557600080fd5b01549150829050565b6101ad546009546000918291610f349042615d03565b610f3e9190615cc2565b610681906001615caa565b6000546001600160a01b03163314610f735760405162461bcd60e51b81526004016106b190615b5e565b8015801590610f825750600481105b610f9e5760405162461bcd60e51b81526004016106b190615c0c565b61015d610fac600183615d03565b60038110610fbc57610fbc615d78565b0154610fda5760405162461bcd60e51b81526004016106b190615bd5565b600855565b600260015414156110025760405162461bcd60e51b81526004016106b190615c73565b6002600155600061101233612e85565b9050600081116110645760405162461bcd60e51b815260206004820152601c60248201527f4e46545374616b696e673a206e6f7468696e6720746f20636c61696d0000000060448201526064016106b1565b6101ad54600954600091906110799042615d03565b6110839190615cc2565b90506000601782111561109557601891505b5060005b33600090815261015a60205260409020548110156111ab5733600090815261015a602052604081208054839081106110d3576110d3615d78565b60009182526020822001549150603a6110ed600186615d03565b601881106110fd576110fd615d78565b0154111561112557611110836001615caa565b60008281526101626020526040902055611138565b6000818152610162602052604090208390555b60006052611147600186615d03565b6018811061115757611157615d78565b015411156111825761116a836001615caa565b60008281526101626020526040902060010155611198565b6000818152610162602052604090208390600101555b50806111a381615d31565b915050611099565b506000805b33600090815261016360205260409020548210156115ed57336000908152610163602052604081208054849081106111ea576111ea615d78565b600091825260209091206040805161016081019182905292600b908102909201919082845b81548152602001906001019080831161120f5750505050509050600080603a836006600b811061124157611241615d78565b60200201516018811061125657611256615d78565b015411156112a757336000908152610163602052604090208054606391908690811061128457611284615d78565b600091825260208220600b9091020101558061129f81615d31565b9150506113ca565b60c0820151603a90601881106112bf576112bf615d78565b01541580156112f557506000603a600184600660200201516112e19190615d03565b601881106112f1576112f1615d78565b0154115b156113425760c082015161130a906001615caa565b3360009081526101636020526040902080548690811061132c5761132c615d78565b600091825260208220600b9091020101556113ca565b60c0820151603a906018811061135a5761135a615d78565b015415801561138c575060c0820151603a9061137890600190615d03565b6018811061138857611388615d78565b0154155b156113ca5760c0820151336000908152610163602052604090208054869081106113b8576113b8615d78565b600091825260208220600b9091020101555b600060528360066020020151601881106113e6576113e6615d78565b0154118061141a57506000603a8360066020020151611406906001615caa565b6018811061141657611416615d78565b0154115b1561147957336000908152610163602052604090208054606391908690811061144557611445615d78565b90600052602060002090600b02016001600b811061146557611465615d78565b01558061147181615d31565b9150506115c1565b60006052600184600660200201516114919190615d03565b601881106114a1576114a1615d78565b015411806114ca57506000603a8360066020020151601881106114c6576114c6615d78565b0154115b156115285760c08201516114df906001615caa565b3360009081526101636020526040902080548690811061150157611501615d78565b90600052602060002090600b02016001600b811061152157611521615d78565b01556115c1565b60c082015160529061153c90600190615d03565b6018811061154c5761154c615d78565b0154158015611572575060c0820151603a906018811061156e5761156e615d78565b0154155b156115c15760c08201513360009081526101636020526040902080548690811061159e5761159e615d78565b90600052602060002090600b02016001600b81106115be576115be615d78565b01555b80600214156115d857826115d481615d31565b9350505b505081806115e590615d31565b9250506111b0565b8015611646573360009081526101636020526040902080548061161257611612615d62565b60019003818190600052602060002090600b02016000611632919061580c565b90558061163e81615d1a565b9150506115ed565b6000611653606486615cc2565b61165e906021615ce4565b9050600061166d606487615cc2565b611678906043615ce4565b6003549091506001600160a01b03166340c10f19336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401600060405180830381600087803b1580156116d557600080fd5b505af11580156116e9573d6000803e3d6000fd5b5050600354600480546040516340c10f1960e01b81526001600160a01b03918216928101929092526024820186905290911692506340c10f199150604401600060405180830381600087803b15801561174157600080fd5b505af1158015611755573d6000803e3d6000fd5b50506004546001600160a01b0316915063c83da6359050336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b1580156117b557600080fd5b505af11580156117c9573d6000803e3d6000fd5b5050600180555050505050505050565b6000546001600160a01b031633146118035760405162461bcd60e51b81526004016106b190615b5e565b8061180e8385615caa565b6118189190615caa565b6064146118675760405162461bcd60e51b815260206004820152601d60248201527f4e46545374616b696e673a2077726f6e672070657263656e746167657300000060448201526064016106b1565b60058390556006829055600781905582611882576000611885565b60015b60ff1661015d558161189857600061189b565b60015b60ff1661015e55806118ae5760006118b1565b60015b60ff1661015f5560085461015d906118cb90600190615d03565b600381106118db576118db615d78565b0154610e145760005b60038110156119305761015d816003811061190157611901615d78565b01546001141561191e57611916816001615caa565b600855611930565b8061192881615d31565b9150506118e4565b50505050565b61015c5460009060ff16801561196857506101ad546009546017919061195c9042615d03565b6119669190615cc2565b105b156119735750600190565b50600090565b6000546001600160a01b031633146119a35760405162461bcd60e51b81526004016106b190615b5e565b6119ac816129e9565b50565b6000546001600160a01b031633146119d95760405162461bcd60e51b81526004016106b190615b5e565b6119e36000613565565b565b60026001541415611a085760405162461bcd60e51b81526004016106b190615c73565b6002600155611a15611936565b611a315760405162461bcd60e51b81526004016106b190615b93565b60025460405163020604bf60e21b81526004810184905230916001600160a01b03169063081812fc9060240160206040518083038186803b158015611a7557600080fd5b505afa158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad919061591d565b6001600160a01b03161480611b4c57506002546001600160a01b031663e985e9c5336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b158015611b1457600080fd5b505afa158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c9190615a05565b611b985760405162461bcd60e51b815260206004820181905260248201527f4e46545374616b696e673a207472616e73666572206e6f7420616c6c6f77656460448201526064016106b1565b8015801590611ba75750600481105b611bc35760405162461bcd60e51b81526004016106b190615c0c565b61015d611bd1600183615d03565b60038110611be157611be1615d78565b0154611bff5760405162461bcd60e51b81526004016106b190615bd5565b6002546001600160a01b03166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101859052606401600060405180830381600087803b158015611c5f57600080fd5b505af1158015611c73573d6000803e3d6000fd5b50505050611c88611c813390565b8383612ad9565b505060018055565b6000546001600160a01b03163314611cba5760405162461bcd60e51b81526004016106b190615b5e565b61015c5460ff16611cdd5760405162461bcd60e51b81526004016106b190615b93565b60008111611d285760405162461bcd60e51b815260206004820152601860248201527713919514dd185ada5b99ce88195b5c1d1e481c995dd85c9960421b60448201526064016106b1565b6101ad5460095460009190611d3d9042615d03565b611d479190615cc2565b9050600081118015611d595750601981105b15611e5457603a611d6b600183615d03565b60188110611d7b57611d7b615d78565b0154611e545781603a611d8f600184615d03565b60188110611d9f57611d9f615d78565b0155600554606490611db19084615ce4565b611dbb9190615cc2565b6082611dc8600184615d03565b60188110611dd857611dd8615d78565b0155600654606490611dea9084615ce4565b611df49190615cc2565b609a611e01600184615d03565b60188110611e1157611e11615d78565b0155600754606490611e239084615ce4565b611e2d9190615cc2565b608260025b60180201611e41600184615d03565b60188110611e5157611e51615d78565b01555b6018811115610a495761015c805460ff191690555050565b60828260038110610f0357600080fd5b60528160188110610b6e57600080fd5b61015a6020528160005260406000208181548110611ea957600080fd5b90600052602060002001600091509150505481565b60026001541415611ee15760405162461bcd60e51b81526004016106b190615c73565b6002600155611eee611936565b611f0a5760405162461bcd60e51b81526004016106b190615b93565b60fa82118015611f1b57506105dd82105b611f7b5760405162461bcd60e51b815260206004820152602b60248201527f4e46545374616b696e673a206e6f7420616c6c6f77696e67206164646974696f60448201526a6e616c207374616b696e6760a81b60648201526084016106b1565b600082815261016160205260409020546001600160a01b0316336001600160a01b031614611feb5760405162461bcd60e51b815260206004820152601d60248201527f4e46545374616b696e673a206e6f74206120746f6b656e206f776e657200000060448201526064016106b1565b8015801590611ffa5750600481105b6120165760405162461bcd60e51b81526004016106b190615c0c565b61015d612024600183615d03565b6003811061203457612034615d78565b01546120525760405162461bcd60e51b81526004016106b190615bd5565b600082815261016260205260409020600a8101546009820154600890920154909161207c91615caa565b6120869190615caa565b6001146120e85760405162461bcd60e51b815260206004820152602a60248201527f4e46545374616b696e673a206164646974696f6e616c20706f6f6c20616c726560448201526930b23c9031b437b9b2b760b11b60648201526084016106b1565b806001141561213d5760008281526101626020526040902060080154156121215760405162461bcd60e51b81526004016106b190615c3c565b60008281526101626020526040902060019060085b01556121df565b806002141561218f5760008281526101626020526040902060090154156121765760405162461bcd60e51b81526004016106b190615c3c565b6000828152610162602052604090206001906009612136565b80600314156121df57600082815261016260205260409020600a0154156121c85760405162461bcd60e51b81526004016106b190615c3c565b600082815261016260205260409020600190600a01555b6000828152610162602052604090206005810154600382015460049092015490919061220d838383876135b5565b505060018055505050565b6000546001600160a01b031633146122425760405162461bcd60e51b81526004016106b190615b5e565b61015c5460ff166122655760405162461bcd60e51b81526004016106b190615b93565b600081116122b55760405162461bcd60e51b815260206004820152601760248201527f4e46545374616b696e673a20656d70747920626f6e757300000000000000000060448201526064016106b1565b6101ad54600954600091906122ca9042615d03565b6122d49190615cc2565b90506000811180156122e65750601981105b15611e5457603a6122f8600183615d03565b6018811061230857612308615d78565b01541580159061233457506052612320600183615d03565b6018811061233057612330615d78565b0154155b15611e5457816052612347600184615d03565b6018811061235757612357615d78565b01556005546064906123699084615ce4565b6123739190615cc2565b60ca612380600184615d03565b6018811061239057612390615d78565b01556006546064906123a29084615ce4565b6123ac9190615cc2565b60e26123b9600184615d03565b601881106123c9576123c9615d78565b01556007546064906123db9084615ce4565b6123e59190615cc2565b60ca6002611e32565b60008181526101626020526040812060088101546009820154600a9092015490919060018314801561241e575081155b8015612428575080155b1561243857506001949350505050565b821580156124465750816001145b8015612450575080155b1561246057506002949350505050565b8215801561246c575081155b80156124785750806001145b1561248857506003949350505050565b8260011480156124985750816001145b80156124a2575080155b156124b25750600c949350505050565b8260011480156124c0575081155b80156124cc5750806001145b156124dc5750600d949350505050565b821580156124ea5750816001145b80156124f65750806001145b1561250657506017949350505050565b8260011480156125165750816001145b80156125225750806001145b156125325750607b949350505050565b505050919050565b60098160198110610b6e57600080fd5b6101ad5460095460009182916125609042615d03565b61256a9190615cc2565b905060006101ae546009836019811061258557612585615d78565b01546125919042615d03565b61259b9190615cc2565b6125a6906001615caa565b9392505050565b6101128260038110610f0357600080fd5b33600090815261015a60205260408120546060918167ffffffffffffffff8111156125eb576125eb615d8e565b604051908082528060200260200182016040528015612614578160200160208202803683370190505b50905060005b828110156109545733600090815261015a6020526040902080548290811061264457612644615d78565b906000526020600020015482828151811061266157612661615d78565b60209081029190910101528061267681615d31565b91505061261a565b600061068182613791565b603a8160188110610b6e57600080fd5b600061068182612e85565b6000546001600160a01b031633146126ce5760405162461bcd60e51b81526004016106b190615b5e565b61015c5460ff166126f15760405162461bcd60e51b81526004016106b190615b93565b6000811161273c5760405162461bcd60e51b815260206004820152601860248201527713919514dd185ada5b99ce88195b5c1d1e481c995dd85c9960421b60448201526064016106b1565b6101ad54600954600091906127519042615d03565b61275b9190615cc2565b90506018811015611e545781606a826018811061277a5761277a615d78565b015560055460649061278c9084615ce4565b6127969190615cc2565b61011282601881106127aa576127aa615d78565b01556006546064906127bc9084615ce4565b6127c69190615cc2565b61012a82601881106127da576127da615d78565b01556007546064906127ec9084615ce4565b6127f69190615cc2565b610142826018811061280a5761280a615d78565b01556101ac8190556018811115610a495761015c805460ff191690555050565b6000546001600160a01b031633146128545760405162461bcd60e51b81526004016106b190615b5e565b6001600160a01b0381166128b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b1565b6119ac81613565565b6000546001600160a01b031633146128ec5760405162461bcd60e51b81526004016106b190615b5e565b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561293057600080fd5b505afa158015612944573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129689190615a6a565b146129b55760405162461bcd60e51b815260206004820152601d60248201527f4e46545374616b696e673a206e6f7420656d7074792062616c616e636500000060448201526064016106b1565b6119ac81613c93565b61015b81815481106129cf57600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b038116612a3f5760405162461bcd60e51b815260206004820152601d60248201527f4e46545374616b696e673a206e6f742076616c6964206164647265737300000060448201526064016106b1565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116612ab75760405162461bcd60e51b815260206004820152601d60248201527f4e46545374616b696e673a206e6f742076616c6964206164647265737300000060448201526064016106b1565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316600081815261015a60209081526040808320805460018101825590845282842001869055858352610161909152812080546001600160a01b0319169092179091556101ad54600954612b359042615d03565b612b3f9190615cc2565b90506000612b4e826001615caa565b905060006101ae5460098460198110612b6957612b69615d78565b0154612b759042615d03565b612b7f9190615cc2565b612b8a906001615caa565b90506000612b9786613db9565b905060fb861015612c4257604051806101600160405280848152602001848152602001428152602001858152602001838152602001828152602001600081526020016000815260200160018152602001600181526020016001815250610162600088815260200190815260200160002090600b612c1592919061581b565b50612c2381858460016135b5565b612c3081858460026135b5565b612c3d81858460036135b5565b612de0565b8460011415612ccc57604051806101600160405280848152602001848152602001428152602001858152602001838152602001828152602001600081526020016000815260200160018152602001600081526020016000815250610162600088815260200190815260200160002090600b612cbe92919061581b565b50612c3d81858460016135b5565b8460021415612d5657604051806101600160405280848152602001848152602001428152602001858152602001838152602001828152602001600081526020016000815260200160008152602001600181526020016000815250610162600088815260200190815260200160002090600b612d4892919061581b565b50612c3d81858460026135b5565b8460031415612de057604051806101600160405280848152602001848152602001428152602001858152602001838152602001828152602001600081526020016000815260200160008152602001600081526020016001815250610162600088815260200190815260200160002090600b612dd292919061581b565b50612de081858460036135b5565b83158015612dee5750816001145b15612e7c576001600160a01b0387166000908152610160602052604090205460ff16612e7c576001600160a01b038716600081815261016060205260408120805460ff1916600190811790915561015b805491820181559091527f2cc6449d4b241b19b97c045aef3155eef2b936c6218cb936e60fb2acbb3e29ce0180546001600160a01b03191690911790555b50505050505050565b6101ad546009546000918291612e9b9042615d03565b612ea59190615cc2565b90506018811115612eb4575060185b6000805b6001600160a01b038516600090815261015a60205260409020548110156134cf576001600160a01b038516600090815261015a60205260408120805483908110612f0457612f04615d78565b60009182526020808320919091015480835261016290915260408220805460018201546002909201546101ad5493955090939192909190612f458342615d03565b612f4f9190615cc2565b600086815261016260205260408120600381015460048201546005909201549394509290918060085b600b8110156134b1576000816008148015612fa5575060008c815261016260205260409020600801546001145b15612fb25750600161300c565b816009148015612fd4575060008c815261016260205260409020600901546001145b15612fe15750600261300c565b81600a148015613003575060008c815261016260205260409020600a01546001145b1561300c575060035b801561349e578a8f10158015613023575060018810155b156132585761303360018c615d03565b92505b8e831015613258576101ad54896009613050866001615caa565b6019811061306057613060615d78565b015461306c9190615d03565b6130769190615cc2565b9350868314156131425761016461308e600183615d03565b6003811061309e5761309e615d78565b6018020183601881106130b3576130b3615d78565b015460826130c2600184615d03565b600381106130d2576130d2615d78565b6018020184601881106130e7576130e7615d78565b0154876101ae546101ad546130fc9190615caa565b6131069190615d03565b6022546131139089615ce4565b61311d9190615ce4565b6131279190615ce4565b6131319190615cc2565b61313b908f615caa565b9d50613246565b610164613150600183615d03565b6003811061316057613160615d78565b60180201836018811061317557613175615d78565b01546082613184600184615d03565b6003811061319457613194615d78565b6018020184601881106131a9576131a9615d78565b0154876101ae546101ad546131be9190615caa565b6131c89190615d03565b602287601881106131db576131db615d78565b01546131e79190615ce4565b8860226131f560018a615d03565b6018811061320557613205615d78565b01546132119190615ce4565b61321b9190615caa565b6132259088615ce4565b61322f9190615ce4565b6132399190615cc2565b613243908f615caa565b9d505b8261325081615d31565b935050613036565b898f10158015613269575060018810155b1561349e5761327960018b615d03565b92505b8e83101561349e576101ad54896009613296866001615caa565b601981106132a6576132a6615d78565b01546132b29190615d03565b6132bc9190615cc2565b935086831415613388576101646132d4600183615d03565b600381106132e4576132e4615d78565b6018020183601881106132f9576132f9615d78565b015460ca613308600184615d03565b6003811061331857613318615d78565b60180201846018811061332d5761332d615d78565b0154876101ae546101ad546133429190615caa565b61334c9190615d03565b6022546133599089615ce4565b6133639190615ce4565b61336d9190615ce4565b6133779190615cc2565b613381908f615caa565b9d5061348c565b610164613396600183615d03565b600381106133a6576133a6615d78565b6018020183601881106133bb576133bb615d78565b015460ca6133ca600184615d03565b600381106133da576133da615d78565b6018020184601881106133ef576133ef615d78565b0154876101ae546101ad546134049190615caa565b61340e9190615d03565b6022876018811061342157613421615d78565b015461342d9190615ce4565b88602261343b60018a615d03565b6018811061344b5761344b615d78565b01546134579190615ce4565b6134619190615caa565b61346b9088615ce4565b6134759190615ce4565b61347f9190615cc2565b613489908f615caa565b9d505b8261349681615d31565b93505061327c565b50806134a981615d31565b915050612f78565b505050505050505050505080806134c790615d31565b915050612eb8565b6134d885613e47565b6134e29083615caa565b95945050505050565b6134f58282614b00565b6002546040516323b872dd60e01b81523060048201526001600160a01b03848116602483015260448201849052909116906323b872dd90606401600060405180830381600087803b15801561354957600080fd5b505af115801561355d573d6000803e3d6000fd5b505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b825b601881101561378a578381141561367557826101ae546101ad546135db9190615caa565b6135e59190615d03565b6022546135f29087615ce4565b6135fc9190615ce4565b61016461360a600185615d03565b6003811061361a5761361a615d78565b60180201826018811061362f5761362f615d78565b015461363b9190615caa565b610164613649600185615d03565b6003811061365957613659615d78565b60180201826018811061366e5761366e615d78565b0155613778565b826101ae546101ad546136889190615caa565b6136929190615d03565b602261369e8684615d03565b601881106136ae576136ae615d78565b01546136ba9190615ce4565b83602260016136c98886615d03565b6136d39190615d03565b601881106136e3576136e3615d78565b01546136ef9190615ce4565b6136f99190615caa565b6137039086615ce4565b610164613711600185615d03565b6003811061372157613721615d78565b60180201826018811061373657613736615d78565b01546137429190615caa565b610164613750600185615d03565b6003811061376057613760615d78565b60180201826018811061377557613775615d78565b01555b8061378281615d31565b9150506135b7565b5050505050565b6101ad5460095460009182916137a79042615d03565b6137b19190615cc2565b905060178111156137c55750600092915050565b6000805b6001600160a01b038516600090815261015a6020526040902054811015613c8a576001600160a01b038516600090815261015a6020526040812080548390811061381557613815615d78565b6000918252602080832091909101548083526101629091526040822060038101546004820154600590920154929450929091906138528489615d03565b905060085b600b811015613c715760008160081480156138845750600087815261016260205260409020600801546001145b15613891575060016138eb565b8160091480156138b35750600087815261016260205260409020600901546001145b156138c0575060026138eb565b81600a1480156138e25750600087815261016260205260409020600a01546001145b156138eb575060035b8015613c5e576000610112613901600184615d03565b6003811061391157613911615d78565b601802018b6018811061392657613926615d78565b01541115613add57858a14156139f957610164613944600183615d03565b6003811061395457613954615d78565b601802018a6018811061396957613969615d78565b0154610112613979600184615d03565b6003811061398957613989615d78565b601802018b6018811061399e5761399e615d78565b0154866101ae546101ad546139b39190615caa565b6139bd9190615d03565b6022546139ca9088615ce4565b6139d49190615ce4565b6139de9190615ce4565b6139e89190615cc2565b6139f2908a615caa565b9850613c5e565b610164613a07600183615d03565b60038110613a1757613a17615d78565b601802018a60188110613a2c57613a2c615d78565b0154610112613a3c600184615d03565b60038110613a4c57613a4c615d78565b601802018b60188110613a6157613a61615d78565b0154866101ae546101ad54613a769190615caa565b613a809190615d03565b60228660188110613a9357613a93615d78565b0154613a9f9190615ce4565b876022613aad600189615d03565b60188110613abd57613abd615d78565b0154613ac99190615ce4565b613ad39190615caa565b6139d49087615ce4565b8915613c5e57858a1415613b5657610164613af9600183615d03565b60038110613b0957613b09615d78565b601802018a60188110613b1e57613b1e615d78565b0154610112613b2e600184615d03565b60038110613b3e57613b3e615d78565b601802016101ac546018811061399e5761399e615d78565b610164613b64600183615d03565b60038110613b7457613b74615d78565b601802018a60188110613b8957613b89615d78565b0154610112613b99600184615d03565b60038110613ba957613ba9615d78565b601802016101ac5460188110613bc157613bc1615d78565b0154866101ae546101ad54613bd69190615caa565b613be09190615d03565b60228660188110613bf357613bf3615d78565b0154613bff9190615ce4565b876022613c0d600189615d03565b60188110613c1d57613c1d615d78565b0154613c299190615ce4565b613c339190615caa565b613c3d9087615ce4565b613c479190615ce4565b613c519190615cc2565b613c5b908a615caa565b98505b5080613c6981615d31565b915050613857565b5050505050508080613c8290615d31565b9150506137c9565b6134d885615190565b6001600160a01b038116613cdd5760405162461bcd60e51b81526020600482015260116024820152706e6f742076616c6964206164647265737360781b60448201526064016106b1565b6040516301ffc9a760e01b81526380ac58cd60e01b600482015281906001600160a01b038216906301ffc9a79060240160206040518083038186803b158015613d2557600080fd5b505afa158015613d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d5d9190615a05565b613d965760405162461bcd60e51b815260206004820152600a6024820152696e6f742045524337323160b01b60448201526064016106b1565b600280546001600160a01b0319166001600160a01b039290921691909117905550565b60006105dd8210613dcc57506064919050565b6102ef8210613ddd57506082919050565b60fb8210613ded57506096919050565b601a8210613dfd575060af919050565b60048210613e0d575060c8919050565b8160031415613e1e575060fa919050565b8160021415613e30575061012c919050565b8160011415613e425750610190919050565b919050565b600080805b6001600160a01b03841660009081526101636020526040902054811015610954576001600160a01b038416600090815261016360205260408120805483908110613e9857613e98615d78565b600091825260209091206040805161016081019182905292600b908102909201919082845b815481526020019060010190808311613ebd57505050505090506000816000600b8110613eec57613eec615d78565b602090810291909101519083015160408401516060850151608086015160a087015160c088015160e08901519697509495939492939192909160085b600b811015614ae3576000816008148015613f4857506101008b01516001145b15613f5557506001613f95565b816009148015613f6a57506101208b01516001145b15613f7757506002613f95565b81600a148015613f8c57506101408b01516001145b15613f95575060035b8015614ad0576000808b6101ad546009600060198110613fb757613fb7615d78565b0154613fc39042615d03565b613fcd9190615cc2565b1061471e57613fdd60018d615d03565b91505b613feb866001615caa565b821015614378576101ad548a6009614004856001615caa565b6019811061401457614014615d78565b01546140209190615d03565b61402a9190615cc2565b9050888214156140fb57610164614042600185615d03565b6003811061405257614052615d78565b60180201826018811061406757614067615d78565b01546082614076600186615d03565b6003811061408657614086615d78565b60180201836018811061409b5761409b615d78565b0154896101ae546101ad546140b09190615caa565b6140ba9190615d03565b602260005b01546140cb908b615ce4565b6140d59190615ce4565b6140df9190615ce4565b6140e99190615cc2565b8f6140f49190615caa565b9e50614366565b85821415614261578785106141da57610164614118600185615d03565b6003811061412857614128615d78565b60180201826018811061413d5761413d615d78565b0154608261414c600186615d03565b6003811061415c5761415c615d78565b60180201836018811061417157614171615d78565b015461417d8a88615d03565b6022846018811061419057614190615d78565b015461419c9190615ce4565b8a60226141aa600187615d03565b601881106141ba576141ba615d78565b01546141c69190615ce4565b6141d09190615caa565b6140d5908a615ce4565b6101646141e8600185615d03565b600381106141f8576141f8615d78565b60180201826018811061420d5761420d615d78565b0154608261421c600186615d03565b6003811061422c5761422c615d78565b60180201836018811061424157614241615d78565b0154866022614251600186615d03565b601881106140bf576140bf615d78565b61016461426f600185615d03565b6003811061427f5761427f615d78565b60180201826018811061429457614294615d78565b015460826142a3600186615d03565b600381106142b3576142b3615d78565b6018020183601881106142c8576142c8615d78565b0154896101ae546101ad546142dd9190615caa565b6142e79190615d03565b602284601881106142fa576142fa615d78565b01546143069190615ce4565b8a6022614314600187615d03565b6018811061432457614324615d78565b01546143309190615ce4565b61433a9190615caa565b614344908a615ce4565b61434e9190615ce4565b6143589190615cc2565b8f6143639190615caa565b9e505b8161437081615d31565b925050613fe0565b61438360018c615d03565b91505b614391866001615caa565b82101561471e576101ad548a60096143aa856001615caa565b601981106143ba576143ba615d78565b01546143c69190615d03565b6143d09190615cc2565b9050888214156144a1576101646143e8600185615d03565b600381106143f8576143f8615d78565b60180201826018811061440d5761440d615d78565b015460ca61441c600186615d03565b6003811061442c5761442c615d78565b60180201836018811061444157614441615d78565b0154896101ae546101ad546144569190615caa565b6144609190615d03565b602260005b0154614471908b615ce4565b61447b9190615ce4565b6144859190615ce4565b61448f9190615cc2565b8f61449a9190615caa565b9e5061470c565b8582141561460757878510614580576101646144be600185615d03565b600381106144ce576144ce615d78565b6018020182601881106144e3576144e3615d78565b015460ca6144f2600186615d03565b6003811061450257614502615d78565b60180201836018811061451757614517615d78565b01546145238a88615d03565b6022846018811061453657614536615d78565b01546145429190615ce4565b8a6022614550600187615d03565b6018811061456057614560615d78565b015461456c9190615ce4565b6145769190615caa565b61447b908a615ce4565b61016461458e600185615d03565b6003811061459e5761459e615d78565b6018020182601881106145b3576145b3615d78565b015460ca6145c2600186615d03565b600381106145d2576145d2615d78565b6018020183601881106145e7576145e7615d78565b01548660226145f7600186615d03565b6018811061446557614465615d78565b610164614615600185615d03565b6003811061462557614625615d78565b60180201826018811061463a5761463a615d78565b015460ca614649600186615d03565b6003811061465957614659615d78565b60180201836018811061466e5761466e615d78565b0154896101ae546101ad546146839190615caa565b61468d9190615d03565b602284601881106146a0576146a0615d78565b01546146ac9190615ce4565b8a60226146ba600187615d03565b601881106146ca576146ca615d78565b01546146d69190615ce4565b6146e09190615caa565b6146ea908a615ce4565b6146f49190615ce4565b6146fe9190615cc2565b8f6147099190615caa565b9e505b8161471681615d31565b925050614386565b8b60631415614acd5761473260018c615d03565b91505b614740866001615caa565b821015614acd576101ad548a6009614759856001615caa565b6019811061476957614769615d78565b01546147759190615d03565b61477f9190615cc2565b90508882141561485057610164614797600185615d03565b600381106147a7576147a7615d78565b6018020182601881106147bc576147bc615d78565b015460ca6147cb600186615d03565b600381106147db576147db615d78565b6018020183601881106147f0576147f0615d78565b0154896101ae546101ad546148059190615caa565b61480f9190615d03565b602260005b0154614820908b615ce4565b61482a9190615ce4565b6148349190615ce4565b61483e9190615cc2565b8f6148499190615caa565b9e50614abb565b858214156149b65787851061492f5761016461486d600185615d03565b6003811061487d5761487d615d78565b60180201826018811061489257614892615d78565b015460ca6148a1600186615d03565b600381106148b1576148b1615d78565b6018020183601881106148c6576148c6615d78565b01546148d28a88615d03565b602284601881106148e5576148e5615d78565b01546148f19190615ce4565b8a60226148ff600187615d03565b6018811061490f5761490f615d78565b015461491b9190615ce4565b6149259190615caa565b61482a908a615ce4565b61016461493d600185615d03565b6003811061494d5761494d615d78565b60180201826018811061496257614962615d78565b015460ca614971600186615d03565b6003811061498157614981615d78565b60180201836018811061499657614996615d78565b01548660226149a6600186615d03565b6018811061481457614814615d78565b6101646149c4600185615d03565b600381106149d4576149d4615d78565b6018020182601881106149e9576149e9615d78565b015460ca6149f8600186615d03565b60038110614a0857614a08615d78565b601802018360188110614a1d57614a1d615d78565b0154896101ae546101ad54614a329190615caa565b614a3c9190615d03565b60228460188110614a4f57614a4f615d78565b0154614a5b9190615ce4565b8a6022614a69600187615d03565b60188110614a7957614a79615d78565b0154614a859190615ce4565b614a8f9190615caa565b614a99908a615ce4565b614aa39190615ce4565b614aad9190615cc2565b8f614ab89190615caa565b9e505b81614ac581615d31565b925050614735565b50505b5080614adb81615d31565b915050613f28565b505050505050505050508080614af890615d31565b915050613e4c565b60008181526101616020526040812080546001600160a01b03191690556101ad54600954614b2e9042615d03565b614b389190615cc2565b90506018811015615178576101ad5460008381526101626020526040812090919060020154614b679042615d03565b614b719190615cc2565b600084815261016260205260408120600381015460048201546005909201546101ae5494955090939192909160098760198110614bb057614bb0615d78565b0154614bbc9042615d03565b614bc69190615cc2565b614bd1906001615caa565b9050600060018610614c035760008881526101626020526040902060068101889055600701829055614c03898961563e565b60085b600b811015615170576000816008148015614c33575060008a815261016260205260409020600801546001145b15614c4057506001614c9a565b816009148015614c62575060008a815261016260205260409020600901546001145b15614c6f57506002614c9a565b81600a148015614c91575060008a815261016260205260409020600a01546001145b15614c9a575060035b801561515d5760018810614f86578892505b6018831015614f8157856101ae546101ad54614cc89190615caa565b614cd29190615d03565b6022614cde8986615d03565b60188110614cee57614cee615d78565b0154614cfa9190615ce4565b8660226001614d098b88615d03565b614d139190615d03565b60188110614d2357614d23615d78565b0154614d2f9190615ce4565b614d399190615caa565b614d439086615ce4565b610164614d51600184615d03565b60038110614d6157614d61615d78565b601802018460188110614d7657614d76615d78565b0154614d829190615d03565b610164614d90600184615d03565b60038110614da057614da0615d78565b601802018460188110614db557614db5615d78565b015582891415614f6f5785841015614e7f578360226001614dd68a87615d03565b614de09190615d03565b60188110614df057614df0615d78565b0154614dfc9087615ce4565b614e069190615ce4565b610164614e14600184615d03565b60038110614e2457614e24615d78565b601802018460188110614e3957614e39615d78565b0154614e459190615caa565b610164614e53600184615d03565b60038110614e6357614e63615d78565b601802018460188110614e7857614e78615d78565b0155614f6f565b614e898685615d03565b6022614e958986615d03565b60188110614ea557614ea5615d78565b0154614eb19190615ce4565b8660226001614ec08b88615d03565b614eca9190615d03565b60188110614eda57614eda615d78565b0154614ee69190615ce4565b614ef09190615caa565b614efa9086615ce4565b610164614f08600184615d03565b60038110614f1857614f18615d78565b601802018460188110614f2d57614f2d615d78565b0154614f399190615caa565b610164614f47600184615d03565b60038110614f5757614f57615d78565b601802018460188110614f6c57614f6c615d78565b01555b82614f7981615d31565b935050614cac565b61515d565b8692505b601883101561515d578683141561504857856101ae546101ad54614fae9190615caa565b614fb89190615d03565b602254614fc59087615ce4565b614fcf9190615ce4565b610164614fdd600184615d03565b60038110614fed57614fed615d78565b60180201846018811061500257615002615d78565b015461500e9190615d03565b61016461501c600184615d03565b6003811061502c5761502c615d78565b60180201846018811061504157615041615d78565b015561514b565b856101ae546101ad5461505b9190615caa565b6150659190615d03565b60226150718986615d03565b6018811061508157615081615d78565b015461508d9190615ce4565b866022600161509c8b88615d03565b6150a69190615d03565b601881106150b6576150b6615d78565b01546150c29190615ce4565b6150cc9190615caa565b6150d69086615ce4565b6101646150e4600184615d03565b600381106150f4576150f4615d78565b60180201846018811061510957615109615d78565b01546151159190615d03565b610164615123600184615d03565b6003811061513357615133615d78565b60180201846018811061514857615148615d78565b01555b8261515581615d31565b935050614f8a565b508061516881615d31565b915050614c06565b505050505050505b600082815261016260205260408120610e149161580c565b6101ad5460095460009182916151a69042615d03565b6151b09190615cc2565b90506000805b6001600160a01b03851660009081526101636020526040902054811015610eeb576001600160a01b03851660009081526101636020526040812080548390811061520257615202615d78565b600091825260209091206040805161016081019182905292600b908102909201919082845b81548152602001906001019080831161522757505050505090506000816003600b811061525657615256615d78565b6020020151608083015160a084015160c085015160e086015193945091929091906000615283868b615d03565b9050828a14156156245760085b600b8110156156225760008160081480156152b057506101008901516001145b156152bd575060016152fd565b8160091480156152d257506101208901516001145b156152df575060026152fd565b81600a1480156152f457506101408901516001145b156152fd575060035b801561560f576000610112615313600184615d03565b6003811061532357615323615d78565b601802018d6018811061533857615338615d78565b015411156154db5786841061543d57610164615355600183615d03565b6003811061536557615365615d78565b601802018c6018811061537a5761537a615d78565b015461011261538a600184615d03565b6003811061539a5761539a615d78565b601802018d601881106153af576153af615d78565b01546153bb8987615d03565b602286601881106153ce576153ce615d78565b01546153da9190615ce4565b8960226153e8600189615d03565b601881106153f8576153f8615d78565b01546154049190615ce4565b61540e9190615caa565b6154189089615ce4565b6154229190615ce4565b61542c9190615cc2565b615436908c615caa565b9a5061560f565b61016461544b600183615d03565b6003811061545b5761545b615d78565b601802018c6018811061547057615470615d78565b0154610112615480600184615d03565b6003811061549057615490615d78565b601802018d601881106154a5576154a5615d78565b01548560226154b5600188615d03565b601881106154c5576154c5615d78565b01546154d1908a615ce4565b6154189190615ce4565b86841061554d576101646154f0600183615d03565b6003811061550057615500615d78565b601802018c6018811061551557615515615d78565b0154610112615525600184615d03565b6003811061553557615535615d78565b601802016101ac54601881106153af576153af615d78565b61016461555b600183615d03565b6003811061556b5761556b615d78565b601802018c6018811061558057615580615d78565b0154610112615590600184615d03565b600381106155a0576155a0615d78565b601802016101ac54601881106155b8576155b8615d78565b01548560226155c8600188615d03565b601881106155d8576155d8615d78565b01546155e4908a615ce4565b6155ee9190615ce4565b6155f89190615ce4565b6156029190615cc2565b61560c908c615caa565b9a505b508061561a81615d31565b915050615290565b505b50505050505050808061563690615d31565b9150506151b6565b60008181526101626020526040808220815161016081019283905291600b9082845b81548152602001906001019080831161566057505050506001600160a01b03851660009081526101636020526040812054929350916156a191506001615caa565b905060008167ffffffffffffffff8111156156be576156be615d8e565b6040519080825280602002602001820160405280156156f757816020015b6156e4615859565b8152602001906001900390816156dc5790505b509050828160008151811061570e5761570e615d78565b602002602001018190525060005b6001600160a01b038616600090815261016360205260409020548110156157e1576001600160a01b03861660009081526101636020526040902080548290811061576857615768615d78565b600091825260209091206040805161016081019182905292600b908102909201919082845b81548152602001906001019080831161578d575050505050828260016157b39190615caa565b815181106157c3576157c3615d78565b602002602001018190525080806157d990615d31565b91505061571c565b506001600160a01b038516600090815261016360209081526040909120825161355d92840190615878565b506119ac90600b8101906158ce565b82600b8101928215615849579160200282015b8281111561584957825182559160200191906001019061582e565b506158559291506158ce565b5090565b604051806101600160405280600b906020820280368337509192915050565b82805482825590600052602060002090600b0281019282156158c2579160200282015b828111156158c25782516158b2908390600b61581b565b50916020019190600b019061589b565b506158559291506158e3565b5b8082111561585557600081556001016158cf565b808211156158555760006158f7828261580c565b50600b016158e3565b60006020828403121561591257600080fd5b81356125a681615da4565b60006020828403121561592f57600080fd5b81516125a681615da4565b60008060008060006080868803121561595257600080fd5b853561595d81615da4565b9450602086013561596d81615da4565b935060408601359250606086013567ffffffffffffffff8082111561599157600080fd5b818801915088601f8301126159a557600080fd5b8135818111156159b457600080fd5b8960208285010111156159c657600080fd5b9699959850939650602001949392505050565b600080604083850312156159ec57600080fd5b82356159f781615da4565b946020939093013593505050565b600060208284031215615a1757600080fd5b815180151581146125a657600080fd5b600060208284031215615a3957600080fd5b81356001600160e01b0319811681146125a657600080fd5b600060208284031215615a6357600080fd5b5035919050565b600060208284031215615a7c57600080fd5b5051919050565b60008060408385031215615a9657600080fd5b50508035926020909101359150565b600080600060608486031215615aba57600080fd5b505081359360208301359350604090920135919050565b6020808252825182820181905260009190848201906040850190845b81811015615b0957835183529284019291840191600101615aed565b50909695505050505050565b60208082526029908201527f4e46545374616b696e673a206d7573742068617665206d696e74657220726f6c60408201526819481d1bc81b5a5b9d60ba1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f4e46545374616b696e673a207374616b696e67206973206e6f7420616c6c6f77604082015261195960f21b606082015260800190565b6020808252601c908201527f4e46545374616b696e673a20706f6f6c2069732064697361626c656400000000604082015260600190565b60208082526016908201527513919514dd185ada5b99ce881ddc9bdb99c81c1bdbdb60521b604082015260600190565b6020808252601f908201527f4e46545374616b696e673a20706f6f6c20616c72656164792063686f73656e00604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115615cbd57615cbd615d4c565b500190565b600082615cdf57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615615cfe57615cfe615d4c565b500290565b600082821015615d1557615d15615d4c565b500390565b600081615d2957615d29615d4c565b506000190190565b6000600019821415615d4557615d45615d4c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146119ac57600080fdfea2646970667358221220b2585f2a64efa3f4c6fa27ec5a05068f53a143816231cdcfbc66f757fd63b9c064736f6c63430008060033

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

000000000000000000000000df686b3eae2c1b576f0570f1f2c516fee03987a8000000000000000000000000b0915aa56d49785926c62b862115cb979a0f6443

-----Decoded View---------------
Arg [0] : nft (address): 0xDf686b3eAE2C1B576F0570F1F2c516fEe03987a8
Arg [1] : token (address): 0xB0915Aa56d49785926c62b862115cb979A0f6443

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000df686b3eae2c1b576f0570f1f2c516fee03987a8
Arg [1] : 000000000000000000000000b0915aa56d49785926c62b862115cb979a0f6443


Deployed Bytecode Sourcemap

9099:40931:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17289:239;;;;;;:::i;:::-;;:::i;:::-;;;5282:14:1;;5275:22;5257:41;;5245:2;5230:18;17289:239:0;;;;;;;;19544:139;682:10;19589:7;19623:24;;;:10;:24;;;;;:31;19544:139;;;14401:25:1;;;14389:2;14374:18;19544:139:0;14356:76:1;12885:585:0;;;;;;:::i;:::-;;:::i;:::-;;20327:587;;;:::i;:::-;;;;;;;:::i;12518:255::-;;;;;;:::i;:::-;;:::i;11793:492::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;5750:33:1;;;5732:52;;5720:2;5705:18;11793:492:0;5687:103:1;18354:298:0;;;;;;:::i;:::-;;:::i;9570:111::-;;;;;;:::i;:::-;;:::i;9870:93::-;;;;;;:::i;:::-;;:::i;23310:646::-;;;;;;:::i;:::-;;:::i;23964:495::-;;;:::i;20009:310::-;;;;;;:::i;:::-;;:::i;10017:40::-;;;;;;:::i;:::-;;:::i;9188:34::-;;;;;-1:-1:-1;;;;;9188:34:0;;;;;;-1:-1:-1;;;;;3468:32:1;;;3450:51;;3438:2;3423:18;9188:34:0;3405:102:1;17890:175:0;;;:::i;14288:254::-;;;;;;:::i;:::-;;:::i;24467:2842::-;;;:::i;13481:799::-;;;;;;:::i;:::-;;:::i;9267:31::-;;;;;-1:-1:-1;;;;;9267:31:0;;;17540:210;;;:::i;12784:93::-;;;;;;:::i;:::-;;:::i;2386:103::-;;;:::i;21313:600::-;;;;;;:::i;:::-;;:::i;14550:897::-;;;;;;:::i;:::-;;:::i;9970:40::-;;;;;;:::i;:::-;;:::i;9311:50::-;;;;;;9779:84;;;;;;:::i;:::-;;:::i;9484:37::-;;;;;;1735:87;1781:7;1808:6;-1:-1:-1;;;;;1808:6:0;1735:87;;10122:47;;;;;;:::i;:::-;;:::i;9368:50::-;;;;;;17758:120;;;;;;:::i;:::-;17823:7;17850:20;;;:11;:20;;;;;;-1:-1:-1;;;;;17850:20:0;;17758:120;21921:1381;;;;;;:::i;:::-;;:::i;15459:936::-;;;;;;:::i;:::-;;:::i;9425:50::-;;;;;;18660:876;;;;;;:::i;:::-;;:::i;9530:29::-;;;;;;:::i;:::-;;:::i;18077:265::-;;;:::i;10064:49::-;;;;;;:::i;:::-;;:::i;19696:305::-;;;:::i;21051:123::-;;;;;;:::i;:::-;;:::i;9688:84::-;;;;;;:::i;:::-;;:::i;20922:121::-;;;;;;:::i;:::-;;:::i;21182:119::-;21262:24;:31;21182:119;;16403:853;;;;;;:::i;:::-;;:::i;2644:201::-;;;;;;:::i;:::-;;:::i;12328:182::-;;;;;;:::i;:::-;;:::i;9229:31::-;;;;;-1:-1:-1;;;;;9229:31:0;;;10176:41;;;;;;:::i;:::-;;:::i;17289:239::-;17382:4;-1:-1:-1;;;;;;17419:48:0;;-1:-1:-1;;;17419:48:0;;:101;;-1:-1:-1;;;;;;;;;;5031:40:0;;;17484:36;17399:121;17289:239;-1:-1:-1;;17289:239:0:o;12885:585::-;1781:7;1808:6;-1:-1:-1;;;;;1808:6:0;682:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;;;;;;:::i;:::-;;;;;;;;;12961:16:::1;::::0;::::1;;12960:17;12952:68;;;::::0;-1:-1:-1;;;12952:68:0;;11500:2:1;12952:68:0::1;::::0;::::1;11482:21:1::0;11539:2;11519:18;;;11512:30;11578:34;11558:18;;;11551:62;-1:-1:-1;;;11629:18:1;;;11622:36;11675:19;;12952:68:0::1;11472:228:1::0;12952:68:0::1;13039:11;::::0;:60:::1;::::0;-1:-1:-1;;;13039:60:0;;13059:24:::1;13039:60;::::0;::::1;5483:25:1::0;13093:4:0::1;5524:18:1::0;;;5517:60;-1:-1:-1;;;;;13039:11:0;;::::1;::::0;:19:::1;::::0;5456:18:1;;13039:60:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13031:114;;;;-1:-1:-1::0;;;13031:114:0::1;;;;;;;:::i;:::-;13156:20;13168:7;13156:11;:20::i;:::-;13207:15;13233:10;:25:::0;;;13296:1:::1;13279:143;13303:2;13299:1;:6;13279:143;;;13351:7;::::0;13339:19:::1;::::0;:9;:19:::1;:::i;:::-;13327:31;;13389:9;13373:10;13384:1;13373:13;;;;;;;:::i;:::-;;:25:::0;13307:3;::::1;::::0;::::1;:::i;:::-;;;;13279:143;;;-1:-1:-1::0;;13439:16:0::1;:23:::0;;-1:-1:-1;;13439:23:0::1;13458:4;13439:23;::::0;;-1:-1:-1;12885:585:0:o;20327:587::-;682:10;20410:11;20424:24;;;:10;:24;;;;;:31;20381:16;;20424:31;20497:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20497:18:0;;20466:49;;20531:9;20526:337;20550:3;20546:1;:7;20526:337;;;682:10;20575:15;20593:24;;;:10;:24;;;;;:27;;20618:1;;20593:27;;;;;;:::i;:::-;;;;;;;;;;;;;;20655:16;;;:7;:16;;;;;;20672:1;20655:19;;20740:7;;20593:27;;-1:-1:-1;20655:19:0;20593:27;20709;20655:19;20709:15;:27;:::i;:::-;20708:39;;;;:::i;:::-;20689:58;;20762:18;20783:16;20800:8;20783:26;;;;;;;:::i;:::-;;;20762:47;;20841:10;20824:11;20836:1;20824:14;;;;;;;;:::i;:::-;;;;;;:27;;;;;20560:303;;;;20555:3;;;;;:::i;:::-;;;;20526:337;;;-1:-1:-1;20880:11:0;20327:587;-1:-1:-1;;20327:587:0:o;12518:255::-;1781:7;1808:6;-1:-1:-1;;;;;1808:6:0;682:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;;;;;;:::i;:::-;12638:54:::1;::::0;-1:-1:-1;;;12638:54:0;;12652:24:::1;12638:54;::::0;::::1;5483:25:1::0;12686:4:0::1;5524:18:1::0;;;5517:60;12613:5:0;;-1:-1:-1;;;;;12638:13:0;::::1;::::0;::::1;::::0;5456:18:1;;12638:54:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12630:108;;;;-1:-1:-1::0;;;12630:108:0::1;;;;;;;:::i;:::-;12749:16;12759:5;12749:9;:16::i;:::-;12568:205;12518:255:::0;:::o;11793:492::-;11997:13;;11945:6;;-1:-1:-1;;;;;11997:13:0;682:10;-1:-1:-1;;;;;11973:38:0;;11964:84;;;;-1:-1:-1;;;11964:84:0;;10793:2:1;11964:84:0;;;10775:21:1;;;10812:18;;;10805:30;10871:34;10851:18;;;10844:62;10923:18;;11964:84:0;10765:182:1;11964:84:0;12067:18;:16;:18::i;:::-;12059:65;;;;-1:-1:-1;;;12059:65:0;;;;;;;:::i;:::-;12145:44;12155:4;12161:7;12170:18;;12145:9;:44::i;:::-;-1:-1:-1;12216:60:0;11793:492;;;;;;;:::o;18354:298::-;18430:7;18470:16;;;:7;:16;;;;;18487:1;18470:19;;18551:7;;18430;;18520:27;18470:19;18520:15;:27;:::i;:::-;18519:39;;;;:::i;:::-;18500:58;;18569:18;18590:16;18607:8;18590:26;;;;;;;:::i;:::-;;;;18354:298;-1:-1:-1;;;;;18354:298:0:o;9570:111::-;;;;;;;;;;;;;;;-1:-1:-1;9570:111:0;:::o;9870:93::-;;;;;;;;;;;23310:646;23386:20;;;;:11;:20;;;;;;-1:-1:-1;;;;;23386:20:0;682:10;-1:-1:-1;;;;;23370:36:0;;23362:78;;;;-1:-1:-1;;;23362:78:0;;7393:2:1;23362:78:0;;;7375:21:1;7432:2;7412:18;;;7405:30;7471:31;7451:18;;;7444:59;7520:18;;23362:78:0;7365:179:1;23362:78:0;23451:23;23477:33;682:10;23477:19;:33::i;:::-;23451:59;-1:-1:-1;23525:19:0;;23521:59;;23561:7;:5;:7::i;:::-;23590:31;682:10;23613:7;23590:8;:31::i;:::-;682:10;23632:11;23646:24;;;:10;:24;;;;;:31;;23695:202;23719:3;23715:1;:7;23695:202;;;682:10;23748:24;;;;:10;:24;;;;;:27;;23779:7;;23748:24;23773:1;;23748:27;;;;;;:::i;:::-;;;;;;;;;:38;23744:142;;;682:10;23837:24;;;;:10;:24;;;;;23862:7;23868:1;23862:3;:7;:::i;:::-;23837:33;;;;;;;;:::i;:::-;;;;;;;;;23807:10;:24;23818:12;682:10;;602:98;23818:12;-1:-1:-1;;;;;23807:24:0;-1:-1:-1;;;;;23807:24:0;;;;;;;;;;;;23832:1;23807:27;;;;;;;;:::i;:::-;;;;;;;;;;:63;23744:142;23724:3;;;;:::i;:::-;;;;23695:202;;;-1:-1:-1;682:10:0;23912:24;;;;:10;:24;;;;;:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;23351:605;;23310:646;:::o;23964:495::-;682:10;24004:11;24018:24;;;:10;:24;;;;;:31;;24086:33;;23477:19;:33::i;24086:::-;24060:59;-1:-1:-1;24134:19:0;;24130:59;;24170:7;:5;:7::i;:::-;24204:9;24199:152;24223:3;24219:1;:7;24199:152;;;682:10;24248:15;24266:24;;;:10;:24;;;;;:27;;24291:1;;24266:27;;;;;;:::i;:::-;;;;;;;;;24248:45;;24308:31;24317:12;682:10;;602:98;24317:12;24331:7;24308:8;:31::i;:::-;-1:-1:-1;24228:3:0;;;;:::i;:::-;;;;24199:152;;;;24366:9;24361:91;24385:3;24381:1;:7;24361:91;;;682:10;24410:24;;;;:10;:24;;;;;:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;24390:3;;;;;:::i;:::-;;;;24361:91;;;;23993:466;;23964:495::o;20009:310::-;-1:-1:-1;;;;;20113:16:0;;20099:11;20113:16;;;:10;:16;;;;;:23;20070:16;;20113:23;20171:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20171:18:0;;20147:42;;20205:9;20200:90;20224:3;20220:1;:7;20200:90;;;-1:-1:-1;;;;;20259:16:0;;;;;;:10;:16;;;;;:19;;20276:1;;20259:19;;;;;;:::i;:::-;;;;;;;;;20249:4;20254:1;20249:7;;;;;;;;:::i;:::-;;;;;;;;;;:29;20229:3;;;;:::i;:::-;;;;20200:90;;;-1:-1:-1;20307:4:0;20009:310;-1:-1:-1;;;20009:310:0:o;10017:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10017:40:0;;-1:-1:-1;10017:40:0:o;17890:175::-;18022:7;;18005:10;:13;17949:7;;;;17987:31;;:15;:31;:::i;:::-;17986:43;;;;:::i;:::-;17985:49;;18033:1;17985:49;:::i;14288:254::-;1781:7;1808:6;-1:-1:-1;;;;;1808:6:0;682:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;;;;;;:::i;:::-;14369:9;;;::::1;::::0;:21:::1;;;14389:1;14382:4;:8;14369:21;14361:56;;;;-1:-1:-1::0;;;14361:56:0::1;;;;;;;:::i;:::-;14436:14;14451:8;14458:1;14451:4:::0;:8:::1;:::i;:::-;14436:24;;;;;;;:::i;:::-;;::::0;14428:70:::1;;;;-1:-1:-1::0;;;14428:70:0::1;;;;;;;:::i;:::-;14509:18;:25:::0;14288:254::o;24467:2842::-;6737:1;7333:7;;:19;;7325:63;;;;-1:-1:-1;;;7325:63:0;;;;;;;:::i;:::-;6737:1;7466:7;:18;24515:23:::1;24541:33;682:10:::0;23477:19;:33::i;24541:::-:1;24515:59;;24617:1;24599:15;:19;24591:60;;;::::0;-1:-1:-1;;;24591:60:0;;6678:2:1;24591:60:0::1;::::0;::::1;6660:21:1::0;6717:2;6697:18;;;6690:30;6756;6736:18;;;6729:58;6804:18;;24591:60:0::1;6650:178:1::0;24591:60:0::1;24722:7;::::0;24705:10:::1;:13:::0;24662:21:::1;::::0;24722:7;24687:31:::1;::::0;:15:::1;:31;:::i;:::-;24686:43;;;;:::i;:::-;24662:67;;24740:9;24790:2;24774:13;:18;24770:69;;;24825:2;24809:18;;24770:69;-1:-1:-1::0;24860:1:0::1;24851:590;682:10:::0;24867:24:::1;::::0;;;:10:::1;:24;::::0;;;;:31;24863:35;::::1;24851:590;;;682:10:::0;24920:15:::1;24938:24:::0;;;:10:::1;:24;::::0;;;;:27;;24963:1;;24938:27;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;25006:13:0::1;25020:17;25036:1;25020:13:::0;:17:::1;:::i;:::-;25006:32;;;;;;;:::i;:::-;;;:36;25002:206;;;25086:17;:13:::0;25102:1:::1;25086:17;:::i;:::-;25064:16;::::0;;;:7:::1;:16;::::0;;;;:39;25002:206:::1;;;25157:16;::::0;;;:7:::1;:16;::::0;;;;:35;;;25002:206:::1;25263:1;25228:13;25242:17;25258:1;25242:13:::0;:17:::1;:::i;:::-;25228:32;;;;;;;:::i;:::-;;;:36;25224:206;;;25308:17;:13:::0;25324:1:::1;25308:17;:::i;:::-;25286:16;::::0;;;:7:::1;:16;::::0;;;;25303:1:::1;25286:19;:39:::0;25224:206:::1;;;25379:16;::::0;;;:7:::1;:16;::::0;;;;25401:13;;25396:1:::1;25379:19;:35:::0;25224:206:::1;-1:-1:-1::0;24900:3:0;::::1;::::0;::::1;:::i;:::-;;;;24851:590;;;-1:-1:-1::0;25457:13:0::1;::::0;25485:1355:::1;682:10:::0;25501:29:::1;::::0;;;:15:::1;:29;::::0;;;;:36;25497:40;::::1;25485:1355;;;682:10:::0;25559:27:::1;25589:29:::0;;;:15:::1;:29;::::0;;;;:32;;25619:1;;25589:32;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;25559:62:::1;::::0;;;;::::1;::::0;;;;;25589:32:::1;::::0;;::::1;::::0;;::::1;::::0;;;25559:62;::::1;;;;;;;;;;;;;;;;;;;;;;;25636:13;25718:1:::0;25689:13:::1;25703:8;25712:1;25703:11;;;;;;;:::i;:::-;;;;;25689:26;;;;;;;:::i;:::-;;;:30;25685:498;;;682:10:::0;25740:29:::1;::::0;;;:15:::1;:29;::::0;;;;:32;;25778:2:::1;::::0;25740:29;25770:1;;25740:32;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;:35;:40:::0;25799:7;::::1;::::0;::::1;:::i;:::-;;;;25685:498;;;25859:11:::0;;::::1;::::0;25845:13:::1;::::0;:26:::1;::::0;::::1;;;;;:::i;:::-;;::::0;:31;:69;::::1;;;-1:-1:-1::0;25913:1:0::1;25880:13;25908:1;25894:8:::0;25903:1:::1;25894:11;;;;:15;;;;:::i;:::-;25880:30;;;;;;;:::i;:::-;;;:34;25845:69;25841:342;;;25973:11:::0;;::::1;::::0;:15:::1;::::0;25987:1:::1;25973:15;:::i;:::-;682:10:::0;25935:29:::1;::::0;;;:15:::1;:29;::::0;;;;:32;;25965:1;;25935:32;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;:35;:53:::0;25841:342:::1;;;26041:11:::0;;::::1;::::0;26027:13:::1;::::0;:26:::1;::::0;::::1;;;;;:::i;:::-;;::::0;:31;:70;::::1;;;-1:-1:-1::0;26076:11:0;;::::1;::::0;26062:13:::1;::::0;26076:15:::1;::::0;26090:1:::1;::::0;26076:15:::1;:::i;:::-;26062:30;;;;;;;:::i;:::-;;::::0;:35;26027:70:::1;26023:160;;;26156:11:::0;;::::1;::::0;682:10;26118:29:::1;::::0;;;:15:::1;:29;::::0;;;;:32;;26148:1;;26118:32;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;:35;:49:::0;26023:160:::1;26232:1;26203:13;26217:8:::0;26226:1:::1;26217:11;;;;26203:26;;;;;;;:::i;:::-;;;:30;:68;;;-1:-1:-1::0;26270:1:0::1;26237:13;26251:8:::0;26260:1:::1;26251:11;;;::::0;:15:::1;::::0;26265:1:::1;26251:15;:::i;:::-;26237:30;;;;;;;:::i;:::-;;;:34;26203:68;26199:547;;;682:10:::0;26292:29:::1;::::0;;;:15:::1;:29;::::0;;;;:32;;26330:2:::1;::::0;26292:29;26322:1;;26292:32;::::1;;;;;:::i;:::-;;;;;;;;;;;26325:1;26292:35;;;;;;;:::i;:::-;;:40:::0;26351:7;::::1;::::0;::::1;:::i;:::-;;;;26199:547;;;26430:1;26397:13;26425:1;26411:8:::0;26420:1:::1;26411:11;;;;:15;;;;:::i;:::-;26397:30;;;;;;;:::i;:::-;;;:34;:68;;;-1:-1:-1::0;26464:1:0::1;26435:13;26449:8:::0;26458:1:::1;26449:11;;;;26435:26;;;;;;;:::i;:::-;;;:30;26397:68;26393:353;;;26524:11:::0;;::::1;::::0;:15:::1;::::0;26538:1:::1;26524:15;:::i;:::-;682:10:::0;26486:29:::1;::::0;;;:15:::1;:29;::::0;;;;:32;;26516:1;;26486:32;::::1;;;;;:::i;:::-;;;;;;;;;;;26519:1;26486:35;;;;;;;:::i;:::-;;:53:::0;26393:353:::1;;;26604:11:::0;;::::1;::::0;26590:13:::1;::::0;26604:15:::1;::::0;26618:1:::1;::::0;26604:15:::1;:::i;:::-;26590:30;;;;;;;:::i;:::-;;::::0;:35;:70;::::1;;;-1:-1:-1::0;26643:11:0;;::::1;::::0;26629:13:::1;::::0;:26:::1;::::0;::::1;;;;;:::i;:::-;;::::0;:31;26590:70:::1;26586:160;;;26719:11:::0;;::::1;::::0;682:10;26681:29:::1;::::0;;;:15:::1;:29;::::0;;;;:32;;26711:1;;26681:32;::::1;;;;;:::i;:::-;;;;;;;;;;;26714:1;26681:35;;;;;;;:::i;:::-;;:49:::0;26586:160:::1;26775:5;26784:1;26775:10;26771:58;;;26806:7:::0;::::1;::::0;::::1;:::i;:::-;;;;26771:58;25544:1296;;25539:3;;;;;:::i;:::-;;;;25485:1355;;;26867:10:::0;;26860:103:::1;;682:10:::0;26894:29:::1;::::0;;;:15:::1;:29;::::0;;;;:35;;;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;::::0;;26944:7;::::1;::::0;::::1;:::i;:::-;;;;26860:103;;;26983:22;27009:21;27027:3;27009:15:::0;:21:::1;:::i;:::-;27008:28;::::0;27034:2:::1;27008:28;:::i;:::-;26983:53:::0;-1:-1:-1;27047:23:0::1;27074:21;27092:3;27074:15:::0;:21:::1;:::i;:::-;27073:28;::::0;27099:2:::1;27073:28;:::i;:::-;27112:11;::::0;27047:54;;-1:-1:-1;;;;;;27112:11:0::1;:16;682:10:::0;27112:46:::1;::::0;-1:-1:-1;;;;;;27112:46:0::1;::::0;;;;;;-1:-1:-1;;;;;4393:32:1;;;27112:46:0::1;::::0;::::1;4375:51:1::0;4442:18;;;4435:34;;;4348:18;;27112:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;27169:11:0::1;::::0;27194:15:::1;::::0;;27169:59:::1;::::0;-1:-1:-1;;;27169:59:0;;-1:-1:-1;;;;;27194:15:0;;::::1;27169:59:::0;;::::1;4375:51:1::0;;;;4442:18;;;4435:34;;;27169:11:0;;::::1;::::0;-1:-1:-1;27169:16:0::1;::::0;-1:-1:-1;4348:18:1;;27169:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;27239:15:0::1;::::0;-1:-1:-1;;;;;27239:15:0::1;::::0;-1:-1:-1;27239:23:0::1;::::0;-1:-1:-1;682:10:0;27239:54:::1;::::0;-1:-1:-1;;;;;;27239:54:0::1;::::0;;;;;;-1:-1:-1;;;;;4393:32:1;;;27239:54:0::1;::::0;::::1;4375:51:1::0;4442:18;;;4435:34;;;4348:18;;27239:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;6693:1:0;7645:22;;-1:-1:-1;;;;;;;;24467:2842:0:o;13481:799::-;1781:7;1808:6;-1:-1:-1;;;;;1808:6:0;682:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;;;;;;:::i;:::-;13623:5;13606:14:::1;13614:6:::0;13606:5;:14:::1;:::i;:::-;:22;;;;:::i;:::-;13633:3;13605:31;13597:73;;;::::0;-1:-1:-1;;;13597:73:0;;10025:2:1;13597:73:0::1;::::0;::::1;10007:21:1::0;10064:2;10044:18;;;10037:30;10103:31;10083:18;;;10076:59;10152:18;;13597:73:0::1;9997:179:1::0;13597:73:0::1;13681:29;:37:::0;;;13729:30:::1;:39:::0;;;13779:29:::1;:37:::0;;;13857:9;:17:::1;;13873:1;13857:17;;;13869:1;13857:17;13837:37;;:14;:37:::0;13905:10;:18:::1;;13922:1;13905:18;;;13918:1;13905:18;13885:38;;:17:::0;:38;13954:9;:17:::1;;13970:1;13954:17;;;13966:1;13954:17;13934:37;;:17:::0;:37;14011:18:::1;::::0;13934:14:::1;::::0;14011:22:::1;::::0;14032:1:::1;::::0;14011:22:::1;:::i;:::-;13996:38;;;;;;;:::i;:::-;;::::0;13992:281:::1;;14061:12;14056:206;14086:1;14079:4;:8;14056:206;;;14120:14;14135:4;14120:20;;;;;;;:::i;:::-;;;14144:1;14120:25;14116:131;;;14191:8;:4:::0;14198:1:::1;14191:8;:::i;:::-;14170:18;:29:::0;14222:5:::1;;14116:131;14089:6:::0;::::1;::::0;::::1;:::i;:::-;;;;14056:206;;;;13481:799:::0;;;:::o;17540:210::-;17610:16;;17589:4;;17610:16;;:70;;;;-1:-1:-1;17667:7:0;;17650:10;:13;17678:2;;17667:7;17632:31;;:15;:31;:::i;:::-;17631:43;;;;:::i;:::-;17630:50;17610:70;17606:114;;;-1:-1:-1;17704:4:0;;17540:210::o;17606:114::-;-1:-1:-1;17737:5:0;;17540:210::o;12784:93::-;1781:7;1808:6;-1:-1:-1;;;;;1808:6:0;682:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;;;;;;:::i;:::-;12849:20:::1;12861:7;12849:11;:20::i;:::-;12784:93:::0;:::o;2386:103::-;1781:7;1808:6;-1:-1:-1;;;;;1808:6:0;682:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;;;;;;:::i;:::-;2451:30:::1;2478:1;2451:18;:30::i;:::-;2386:103::o:0;21313:600::-;6737:1;7333:7;;:19;;7325:63;;;;-1:-1:-1;;;7325:63:0;;;;;;;:::i;:::-;6737:1;7466:7;:18;21398::::1;:16;:18::i;:::-;21390:65;;;;-1:-1:-1::0;;;21390:65:0::1;;;;;;;:::i;:::-;21480:13;::::0;:34:::1;::::0;-1:-1:-1;;;21480:34:0;;::::1;::::0;::::1;14401:25:1::0;;;21526:4:0::1;::::0;-1:-1:-1;;;;;21480:13:0::1;::::0;:25:::1;::::0;14374:18:1;;21480:34:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21480:51:0::1;;21479:117;;;-1:-1:-1::0;21537:13:0::1;::::0;-1:-1:-1;;;;;21537:13:0::1;:30;682:10:::0;21537:58:::1;::::0;-1:-1:-1;;;;;;21537:58:0::1;::::0;;;;;;-1:-1:-1;;;;;3742:15:1;;;21537:58:0::1;::::0;::::1;3724:34:1::0;21589:4:0::1;3774:18:1::0;;;3767:43;3659:18;;21537:58:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21471:162;;;::::0;-1:-1:-1;;;21471:162:0;;10793:2:1;21471:162:0::1;::::0;::::1;10775:21:1::0;;;10812:18;;;10805:30;10871:34;10851:18;;;10844:62;10923:18;;21471:162:0::1;10765:182:1::0;21471:162:0::1;21652:9:::0;;;::::1;::::0;:21:::1;;;21672:1;21665:4;:8;21652:21;21644:56;;;;-1:-1:-1::0;;;21644:56:0::1;;;;;;;:::i;:::-;21719:14;21734:8;21741:1;21734:4:::0;:8:::1;:::i;:::-;21719:24;;;;;;;:::i;:::-;;::::0;21711:70:::1;;;;-1:-1:-1::0;;;21711:70:0::1;;;;;;;:::i;:::-;21792:13;::::0;-1:-1:-1;;;;;21792:13:0::1;:26;682:10:::0;21792:64:::1;::::0;-1:-1:-1;;;;;;21792:64:0::1;::::0;;;;;;-1:-1:-1;;;;;4079:15:1;;;21792:64:0::1;::::0;::::1;4061:34:1::0;21841:4:0::1;4111:18:1::0;;;4104:43;4163:18;;;4156:34;;;3996:18;;21792:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21867:38;21877:12;682:10:::0;;602:98;21877:12:::1;21891:7;21900:4;21867:9;:38::i;:::-;-1:-1:-1::0;;6693:1:0;7645:22;;21313:600::o;14550:897::-;1781:7;1808:6;-1:-1:-1;;;;;1808:6:0;682:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;;;;;;:::i;:::-;14634:16:::1;::::0;::::1;;14626:63;;;;-1:-1:-1::0;;;14626:63:0::1;;;;;;;:::i;:::-;14717:1;14708:6;:10;14700:47;;;::::0;-1:-1:-1;;;14700:47:0;;8922:2:1;14700:47:0::1;::::0;::::1;8904:21:1::0;8961:2;8941:18;;;8934:30;-1:-1:-1;;;8980:18:1;;;8973:54;9044:18;;14700:47:0::1;8894:174:1::0;14700:47:0::1;14818:7;::::0;14801:10:::1;:13:::0;14758:21:::1;::::0;14818:7;14783:31:::1;::::0;:15:::1;:31;:::i;:::-;14782:43;;;;:::i;:::-;14758:67;;14856:1;14840:13;:17;:39;;;;;14877:2;14861:13;:18;14840:39;14836:509;;;14900:13;14914:17;14930:1;14914:13:::0;:17:::1;:::i;:::-;14900:32;;;;;;;:::i;:::-;;::::0;14896:438:::1;;14993:6:::0;14958:13:::1;14972:17;14988:1;14972:13:::0;:17:::1;:::i;:::-;14958:32;;;;;;;:::i;:::-;;:41:::0;15070:29:::1;::::0;15102:3:::1;::::0;15061:38:::1;::::0;:6;:38:::1;:::i;:::-;:44;;;;:::i;:::-;15018:18;15040:17;15056:1;15040:13:::0;:17:::1;:::i;:::-;15018:40;;;;;;;:::i;:::-;;:87:::0;15176:30:::1;::::0;15209:3:::1;::::0;15167:39:::1;::::0;:6;:39:::1;:::i;:::-;:45;;;;:::i;:::-;15124:21:::0;15146:17:::1;15143:1;15146:13:::0;:17:::1;:::i;:::-;15124:40;;;;;;;:::i;:::-;;:88:::0;15283:29:::1;::::0;15315:3:::1;::::0;15274:38:::1;::::0;:6;:38:::1;:::i;:::-;:44;;;;:::i;:::-;15231:18;15250:1;15231:21;;;;15253:17;15269:1;15253:13:::0;:17:::1;:::i;:::-;15231:40;;;;;;;:::i;:::-;;:87:::0;14896:438:::1;15385:2;15369:13;:18;15365:75;;;15404:16;:24:::0;;-1:-1:-1;;15404:24:0::1;::::0;;14615:832:::1;14550:897:::0;:::o;9970:40::-;;;;;;;;;;;9779:84;;;;;;;;;;;10122:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21921:1381::-;6737:1;7333:7;;:19;;7325:63;;;;-1:-1:-1;;;7325:63:0;;;;;;;:::i;:::-;6737:1;7466:7;:18;22028::::1;:16;:18::i;:::-;22020:65;;;;-1:-1:-1::0;;;22020:65:0::1;;;;;;;:::i;:::-;22114:3;22104:7;:13;:31;;;;;22131:4;22121:7;:14;22104:31;22096:87;;;::::0;-1:-1:-1;;;22096:87:0;;8158:2:1;22096:87:0::1;::::0;::::1;8140:21:1::0;8197:2;8177:18;;;8170:30;8236:34;8216:18;;;8209:62;-1:-1:-1;;;8287:18:1;;;8280:41;8338:19;;22096:87:0::1;8130:233:1::0;22096:87:0::1;22218:20;::::0;;;:11:::1;:20;::::0;;;;;-1:-1:-1;;;;;22218:20:0::1;682:10:::0;-1:-1:-1;;;;;22202:36:0::1;;22194:78;;;::::0;-1:-1:-1;;;22194:78:0;;7393:2:1;22194:78:0::1;::::0;::::1;7375:21:1::0;7432:2;7412:18;;;7405:30;7471:31;7451:18;;;7444:59;7520:18;;22194:78:0::1;7365:179:1::0;22194:78:0::1;22291:9:::0;;;::::1;::::0;:21:::1;;;22311:1;22304:4;:8;22291:21;22283:56;;;;-1:-1:-1::0;;;22283:56:0::1;;;;;;;:::i;:::-;22358:14;22373:8;22380:1;22373:4:::0;:8:::1;:::i;:::-;22358:24;;;;;;;:::i;:::-;;::::0;22350:70:::1;;;;-1:-1:-1::0;;;22350:70:0::1;;;;;;;:::i;:::-;22484:16;::::0;;;:7:::1;:16;::::0;;;;22501:2:::1;22484:20:::0;::::1;::::0;22479:1:::1;22462:19:::0;::::1;::::0;22457:1:::1;22440:19:::0;;::::1;::::0;22484:20;;22440:41:::1;::::0;::::1;:::i;:::-;:64;;;;:::i;:::-;22509:1;22439:71;22431:126;;;::::0;-1:-1:-1;;;22431:126:0;;9275:2:1;22431:126:0::1;::::0;::::1;9257:21:1::0;9314:2;9294:18;;;9287:30;9353:34;9333:18;;;9326:62;-1:-1:-1;;;9404:18:1;;;9397:40;9454:19;;22431:126:0::1;9247:232:1::0;22431:126:0::1;22572:4;22580:1;22572:9;22568:484;;;22606:16;::::0;;;:7:::1;:16;::::0;;;;22623:1:::1;22606:19;::::0;:24;22598:68:::1;;;;-1:-1:-1::0;;;22598:68:0::1;;;;;;;:::i;:::-;22681:16;::::0;;;:7:::1;:16;::::0;;;;22703:1:::1;::::0;22698::::1;22681:19;;:23:::0;22568:484:::1;;;22735:4;22743:1;22735:9;22731:321;;;22769:16;::::0;;;:7:::1;:16;::::0;;;;22786:1:::1;22769:19;::::0;:24;22761:68:::1;;;;-1:-1:-1::0;;;22761:68:0::1;;;;;;;:::i;:::-;22844:16;::::0;;;:7:::1;:16;::::0;;;;22866:1:::1;::::0;22861::::1;22844:19;::::0;22731:321:::1;22906:4;22914:1;22906:9;22902:150;;;22940:16;::::0;;;:7:::1;:16;::::0;;;;22957:2:::1;22940:20;::::0;:25;22932:69:::1;;;;-1:-1:-1::0;;;22932:69:0::1;;;;;;;:::i;:::-;23016:16;::::0;;;:7:::1;:16;::::0;;;;23039:1:::1;::::0;23033:2:::1;23016:20;:24:::0;22902:150:::1;23074:18;23095:16:::0;;;:7:::1;:16;::::0;;;;23112:1:::1;23095:19:::0;::::1;::::0;23174:1:::1;23157:19:::0;::::1;::::0;23223:1:::1;23206:19:::0;;::::1;::::0;23095;;23157;23242:52:::1;23095:19:::0;23157;23206;23289:4;23242:9:::1;:52::i;:::-;-1:-1:-1::0;;6693:1:0;7645:22;;-1:-1:-1;;;21921:1381:0:o;15459:936::-;1781:7;1808:6;-1:-1:-1;;;;;1808:6:0;682:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;;;;;;:::i;:::-;15542:16:::1;::::0;::::1;;15534:63;;;;-1:-1:-1::0;;;15534:63:0::1;;;;;;;:::i;:::-;15625:1;15616:6;:10;15608:46;;;::::0;-1:-1:-1;;;15608:46:0;;8570:2:1;15608:46:0::1;::::0;::::1;8552:21:1::0;8609:2;8589:18;;;8582:30;8648:25;8628:18;;;8621:53;8691:18;;15608:46:0::1;8542:173:1::0;15608:46:0::1;15725:7;::::0;15708:10:::1;:13:::0;15665:21:::1;::::0;15725:7;15690:31:::1;::::0;:15:::1;:31;:::i;:::-;15689:43;;;;:::i;:::-;15665:67;;15763:1;15747:13;:17;:39;;;;;15784:2;15768:13;:18;15747:39;15743:550;;;15807:13;15821:17;15837:1;15821:13:::0;:17:::1;:::i;:::-;15807:32;;;;;;;:::i;:::-;;::::0;:37;;::::1;::::0;:78:::1;;-1:-1:-1::0;15848:13:0::1;15862:17;15878:1;15862:13:::0;:17:::1;:::i;:::-;15848:32;;;;;;;:::i;:::-;;::::0;:37;15807:78:::1;15803:479;;;15941:6:::0;15906:13:::1;15920:17;15936:1;15920:13:::0;:17:::1;:::i;:::-;15906:32;;;;;;;:::i;:::-;;:41:::0;16018:29:::1;::::0;16050:3:::1;::::0;16009:38:::1;::::0;:6;:38:::1;:::i;:::-;:44;;;;:::i;:::-;15966:18;15988:17;16004:1;15988:13:::0;:17:::1;:::i;:::-;15966:40;;;;;;;:::i;:::-;;:87:::0;16124:30:::1;::::0;16157:3:::1;::::0;16115:39:::1;::::0;:6;:39:::1;:::i;:::-;:45;;;;:::i;:::-;16072:21:::0;16094:17:::1;16091:1;16094:13:::0;:17:::1;:::i;:::-;16072:40;;;;;;;:::i;:::-;;:88:::0;16231:29:::1;::::0;16263:3:::1;::::0;16222:38:::1;::::0;:6;:38:::1;:::i;:::-;:44;;;;:::i;:::-;16179:18;16198:1;16179:21;::::0;18660:876;18730:13;18772:16;;;:7;:16;;;;;18789:1;18772:19;;;18835:1;18818:19;;;18881:2;18864:20;;;;18772:19;;18818;18908:1;18899:10;;:24;;;;-1:-1:-1;18913:10:0;;18899:24;:38;;;;-1:-1:-1;18927:10:0;;18899:38;18895:79;;;-1:-1:-1;18961:1:0;;18660:876;-1:-1:-1;;;;18660:876:0:o;18895:79::-;18988:10;;:24;;;;;19002:5;19011:1;19002:10;18988:24;:38;;;;-1:-1:-1;19016:10:0;;18988:38;18984:79;;;-1:-1:-1;19050:1:0;;18660:876;-1:-1:-1;;;;18660:876:0:o;18984:79::-;19077:10;;:24;;;;-1:-1:-1;19091:10:0;;19077:24;:38;;;;;19105:5;19114:1;19105:10;19077:38;19073:79;;;-1:-1:-1;19139:1:0;;18660:876;-1:-1:-1;;;;18660:876:0:o;19073:79::-;19166:5;19175:1;19166:10;:24;;;;;19180:5;19189:1;19180:10;19166:24;:38;;;;-1:-1:-1;19194:10:0;;19166:38;19162:80;;;-1:-1:-1;19228:2:0;;18660:876;-1:-1:-1;;;;18660:876:0:o;19162:80::-;19256:5;19265:1;19256:10;:24;;;;-1:-1:-1;19270:10:0;;19256:24;:38;;;;;19284:5;19293:1;19284:10;19256:38;19252:80;;;-1:-1:-1;19318:2:0;;18660:876;-1:-1:-1;;;;18660:876:0:o;19252:80::-;19346:10;;:24;;;;;19360:5;19369:1;19360:10;19346:24;:38;;;;;19374:5;19383:1;19374:10;19346:38;19342:80;;;-1:-1:-1;19408:2:0;;18660:876;-1:-1:-1;;;;18660:876:0:o;19342:80::-;19436:5;19445:1;19436:10;:24;;;;;19450:5;19459:1;19450:10;19436:24;:38;;;;;19464:5;19473:1;19464:10;19436:38;19432:81;;;-1:-1:-1;19498:3:0;;18660:876;-1:-1:-1;;;;18660:876:0:o;19432:81::-;18745:791;;;18660:876;;;:::o;9530:29::-;;;;;;;;;;;18077:265;18213:7;;18196:10;:13;18132:7;;;;18178:31;;:15;:31;:::i;:::-;18177:43;;;;:::i;:::-;18152:68;;18231:11;18295:13;;18265:10;18276:14;18265:26;;;;;;;:::i;:::-;;;18247:44;;:15;:44;:::i;:::-;18246:62;;;;:::i;:::-;18245:68;;18312:1;18245:68;:::i;:::-;18231:82;18077:265;-1:-1:-1;;;18077:265:0:o;10064:49::-;;;;;;;;;;;19696:305;682:10;19765:11;19779:24;;;:10;:24;;;;;:31;19736:16;;19779:31;19845:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19845:18:0;;19821:42;;19879:9;19874:98;19898:3;19894:1;:7;19874:98;;;682:10;19933:24;;;;:10;:24;;;;;:27;;19958:1;;19933:27;;;;;;:::i;:::-;;;;;;;;;19923:4;19928:1;19923:7;;;;;;;;:::i;:::-;;;;;;;;;;:37;19903:3;;;;:::i;:::-;;;;19874:98;;21051:123;21112:7;21139:27;21161:4;21139:21;:27::i;9688:84::-;;;;;;;;;;;20922:121;20983:7;21010:25;21030:4;21010:19;:25::i;16403:853::-;1781:7;1808:6;-1:-1:-1;;;;;1808:6:0;682:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;;;;;;:::i;:::-;16483:16:::1;::::0;::::1;;16475:63;;;;-1:-1:-1::0;;;16475:63:0::1;;;;;;;:::i;:::-;16566:1;16557:6;:10;16549:47;;;::::0;-1:-1:-1;;;16549:47:0;;8922:2:1;16549:47:0::1;::::0;::::1;8904:21:1::0;8961:2;8941:18;;;8934:30;-1:-1:-1;;;8980:18:1;;;8973:54;9044:18;;16549:47:0::1;8894:174:1::0;16549:47:0::1;16667:7;::::0;16650:10:::1;:13:::0;16607:21:::1;::::0;16667:7;16632:31:::1;::::0;:15:::1;:31;:::i;:::-;16631:43;;;;:::i;:::-;16607:67;;16705:2;16689:13;:18;16685:477;;;16764:6;16724:22;16747:13;16724:37;;;;;;;:::i;:::-;;:46:::0;16842:29:::1;::::0;16874:3:::1;::::0;16833:38:::1;::::0;:6;:38:::1;:::i;:::-;:44;;;;:::i;:::-;16785:27;16816:13:::0;16785:30:::1;:45:::0;::::1;;;;;:::i;:::-;;:92:::0;16949:30:::1;::::0;16982:3:::1;::::0;16940:39:::1;::::0;:6;:39:::1;:::i;:::-;:45;;;;:::i;:::-;16892:30:::0;16923:13;16892:30:::1;:45:::0;::::1;;;;;:::i;:::-;;:93:::0;17057:29:::1;::::0;17089:3:::1;::::0;17048:38:::1;::::0;:6;:38:::1;:::i;:::-;:44;;;;:::i;:::-;17000:30:::0;17031:13;17000:30:::1;:45:::0;::::1;;;;;:::i;:::-;;:92:::0;17107:27:::1;:43:::0;;;17194:2:::1;17178:13;:18;17174:75;;;17213:16;:24:::0;;-1:-1:-1;;17213:24:0::1;::::0;;16464:792:::1;16403:853:::0;:::o;2644:201::-;1781:7;1808:6;-1:-1:-1;;;;;1808:6:0;682:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2733:22:0;::::1;2725:73;;;::::0;-1:-1:-1;;;2725:73:0;;7751:2:1;2725:73:0::1;::::0;::::1;7733:21:1::0;7790:2;7770:18;;;7763:30;7829:34;7809:18;;;7802:62;-1:-1:-1;;;7880:18:1;;;7873:36;7926:19;;2725:73:0::1;7723:228:1::0;2725:73:0::1;2809:28;2828:8;2809:18;:28::i;12328:182::-:0;1781:7;1808:6;-1:-1:-1;;;;;1808:6:0;682:10;1955:23;1947:68;;;;-1:-1:-1;;;1947:68:0;;;;;;;:::i;:::-;12393:13:::1;::::0;:38:::1;::::0;-1:-1:-1;;;12393:38:0;;12425:4:::1;12393:38;::::0;::::1;3450:51:1::0;12443:1:0::1;::::0;-1:-1:-1;;;;;12393:13:0::1;::::0;:23:::1;::::0;3423:18:1;;12393:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;12385:94;;;::::0;-1:-1:-1;;;12385:94:0;;7035:2:1;12385:94:0::1;::::0;::::1;7017:21:1::0;7074:2;7054:18;;;7047:30;7113:31;7093:18;;;7086:59;7162:18;;12385:94:0::1;7007:179:1::0;12385:94:0::1;12490:12;12498:3;12490:7;:12::i;10176:41::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10176:41:0;;-1:-1:-1;10176:41:0;:::o;27848:214::-;-1:-1:-1;;;;;27914:22:0;;27906:64;;;;-1:-1:-1;;;27906:64:0;;13028:2:1;27906:64:0;;;13010:21:1;13067:2;13047:18;;;13040:30;13106:31;13086:18;;;13079:59;13155:18;;27906:64:0;13000:179:1;27906:64:0;28029:15;:25;;-1:-1:-1;;;;;;28029:25:0;-1:-1:-1;;;;;28029:25:0;;;;;;;;;;27848:214::o;27637:203::-;-1:-1:-1;;;;;27698:19:0;;27690:61;;;;-1:-1:-1;;;27690:61:0;;13028:2:1;27690:61:0;;;13010:21:1;13067:2;13047:18;;;13040:30;13106:31;13086:18;;;13079:59;13155:18;;27690:61:0;13000:179:1;27690:61:0;27813:11;:19;;-1:-1:-1;;;;;;27813:19:0;-1:-1:-1;;;;;27813:19:0;;;;;;;;;;27637:203::o;28070:1795::-;-1:-1:-1;;;;;28155:18:0;;;;;;:10;:18;;;;;;;;:32;;;;;;;;;;;;;;;;;28198:20;;;:11;:20;;;;;:29;;-1:-1:-1;;;;;;28198:29:0;;;;;;;28300:7;;28283:10;:13;28265:31;;:15;:31;:::i;:::-;28264:43;;;;:::i;:::-;28240:67;-1:-1:-1;28318:18:0;28339:17;28240:67;28355:1;28339:17;:::i;:::-;28318:38;;28367:16;28435:13;;28406:10;28417:13;28406:25;;;;;;;:::i;:::-;;;28388:43;;:15;:43;:::i;:::-;28387:61;;;;:::i;:::-;28386:67;;28452:1;28386:67;:::i;:::-;28367:86;;28464:18;28485:23;28500:7;28485:14;:23::i;:::-;28464:44;;28543:3;28533:7;:13;28529:1087;;;28563:102;;;;;;;;28583:10;28563:102;;;;28594:10;28563:102;;;;28605:15;28563:102;;;;28621:13;28563:102;;;;28635:8;28563:102;;;;28644:10;28563:102;;;;28655:1;28563:102;;;;28657:1;28563:102;;;;28659:1;28563:102;;;;28661:1;28563:102;;;;28663:1;28563:102;;;:7;:16;28571:7;28563:16;;;;;;;;;;;:102;;;;;;;:::i;:::-;;28680:49;28690:10;28702:13;28717:8;28727:1;28680:9;:49::i;:::-;28744;28754:10;28766:13;28781:8;28791:1;28744:9;:49::i;:::-;28808;28818:10;28830:13;28845:8;28855:1;28808:9;:49::i;:::-;28529:1087;;;28903:4;28911:1;28903:9;28899:698;;;28933:102;;;;;;;;28953:10;28933:102;;;;28964:10;28933:102;;;;28975:15;28933:102;;;;28991:13;28933:102;;;;29005:8;28933:102;;;;29014:10;28933:102;;;;29025:1;28933:102;;;;29027:1;28933:102;;;;29029:1;28933:102;;;;29031:1;28933:102;;;;29033:1;28933:102;;;:7;:16;28941:7;28933:16;;;;;;;;;;;:102;;;;;;;:::i;:::-;;29054:49;29064:10;29076:13;29091:8;29101:1;29054:9;:49::i;28899:698::-;29142:4;29150:1;29142:9;29138:459;;;29172:102;;;;;;;;29192:10;29172:102;;;;29203:10;29172:102;;;;29214:15;29172:102;;;;29230:13;29172:102;;;;29244:8;29172:102;;;;29253:10;29172:102;;;;29264:1;29172:102;;;;29266:1;29172:102;;;;29268:1;29172:102;;;;29270:1;29172:102;;;;29272:1;29172:102;;;:7;:16;29180:7;29172:16;;;;;;;;;;;:102;;;;;;;:::i;:::-;;29293:49;29303:10;29315:13;29330:8;29340:1;29293:9;:49::i;29138:459::-;29381:4;29389:1;29381:9;29377:220;;;29411:102;;;;;;;;29431:10;29411:102;;;;29442:10;29411:102;;;;29453:15;29411:102;;;;29469:13;29411:102;;;;29483:8;29411:102;;;;29492:10;29411:102;;;;29503:1;29411:102;;;;29505:1;29411:102;;;;29507:1;29411:102;;;;29509:1;29411:102;;;;29511:1;29411:102;;;:7;:16;29419:7;29411:16;;;;;;;;;;;:102;;;;;;;:::i;:::-;;29532:49;29542:10;29554:13;29569:8;29579:1;29532:9;:49::i;:::-;29640:18;;:35;;;;;29662:8;29674:1;29662:13;29640:35;29636:222;;;-1:-1:-1;;;;;29697:25:0;;;;;;:17;:25;;;;;;;;29692:155;;-1:-1:-1;;;;;29743:25:0;;;;;;:17;:25;;;;;:32;;-1:-1:-1;;29743:32:0;29771:4;29743:32;;;;;;29794:24;:37;;;;;;;;;;;;;;-1:-1:-1;;;;;;29794:37:0;;;;;;29692:155;28144:1721;;;;28070:1795;;;:::o;34592:3306::-;34739:7;;34722:10;:13;34659:7;;;;34704:31;;:15;:31;:::i;:::-;34703:43;;;;:::i;:::-;34679:67;;34785:2;34769:13;:18;34765:69;;;-1:-1:-1;34820:2:0;34765:69;34844:11;34870:9;34898:2920;-1:-1:-1;;;;;34914:18:0;;;;;;:10;:18;;;;;:25;34910:29;;34898:2920;;;-1:-1:-1;;;;;34979:18:0;;34961:15;34979:18;;;:10;:18;;;;;:21;;34998:1;;34979:21;;;;;;:::i;:::-;;;;;;;;;;;;;;35035:16;;;:7;:16;;;;;;:19;;35106:1;35089:19;;;35160:1;35143:19;;;;35228:7;;34979:21;;-1:-1:-1;35035:19:0;;35089;;35143;;34979:21;35197:27;35143:19;35197:15;:27;:::i;:::-;35196:39;;;;:::i;:::-;35250:19;35272:16;;;:7;:16;;;;;35289:1;35272:19;;;35342:1;35325:19;;;35397:1;35380:19;;;;35177:58;;-1:-1:-1;35272:19:0;35325;;35250;35485:1;35468:2339;35492:2;35488:1;:6;35468:2339;;;35520:12;35559:1;35564;35559:6;:34;;;;-1:-1:-1;35569:16:0;;;;:7;:16;;;;;35586:1;35569:19;;35592:1;35569:24;35559:34;35555:321;;;-1:-1:-1;35625:1:0;35555:321;;;35673:1;35678;35673:6;:34;;;;-1:-1:-1;35683:16:0;;;;:7;:16;;;;;35700:1;35683:19;;35706:1;35683:24;35673:34;35669:207;;;-1:-1:-1;35739:1:0;35669:207;;;35787:1;35792:2;35787:7;:36;;;;-1:-1:-1;35798:16:0;;;;:7;:16;;;;;35815:2;35798:20;;35822:1;35798:25;35787:36;35783:93;;;-1:-1:-1;35855:1:0;35783:93;35912:8;;35908:1884;;35967:9;35950:13;:26;;:43;;;;;35992:1;35980:8;:13;;35950:43;35946:896;;;36031:13;36043:1;36031:9;:13;:::i;:::-;36027:17;;36022:797;36050:13;36046:1;:17;36022:797;;;36158:7;;36145:9;36125:10;36136:5;:1;36140;36136:5;:::i;:::-;36125:17;;;;;;;:::i;:::-;;;:29;;;;:::i;:::-;36124:41;;;;:::i;:::-;36116:49;;36225:11;36220:1;:16;36216:576;;;36396:29;36426:8;36433:1;36426:4;:8;:::i;:::-;36396:39;;;;;;;:::i;:::-;;;;36436:1;36396:42;;;;;;;:::i;:::-;;;36361:18;36380:8;36387:1;36380:4;:8;:::i;:::-;36361:28;;;;;;;:::i;:::-;;;;36390:1;36361:31;;;;;;;:::i;:::-;;;36349:8;36333:13;;36323:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;36300:16;:19;36287:32;;:10;:32;:::i;:::-;:71;;;;:::i;:::-;:105;;;;:::i;:::-;36286:152;;;;:::i;:::-;36279:160;;:3;:160;:::i;:::-;36273:166;;36216:576;;;36717:29;36747:8;36754:1;36747:4;:8;:::i;:::-;36717:39;;;;;;;:::i;:::-;;;;36757:1;36717:42;;;;;;;:::i;:::-;;;36682:18;36701:8;36708:1;36701:4;:8;:::i;:::-;36682:28;;;;;;;:::i;:::-;;;;36711:1;36682:31;;;;;;;:::i;:::-;;;36667:8;36651:13;;36641:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;36614:16;36631:5;36614:23;;;;;;;:::i;:::-;;;:62;;;;:::i;:::-;36601:8;36571:16;36588:9;36596:1;36588:5;:9;:::i;:::-;36571:27;;;;;;;:::i;:::-;;;:38;;;;:::i;:::-;36570:107;;;;:::i;:::-;36556:122;;:10;:122;:::i;:::-;36555:158;;;;:::i;:::-;36554:205;;;;:::i;:::-;36547:213;;:3;:213;:::i;:::-;36541:219;;36216:576;36065:3;;;;:::i;:::-;;;;36022:797;;;36897:9;36880:13;:26;;:43;;;;;36922:1;36910:8;:13;;36880:43;36876:896;;;36961:13;36973:1;36961:9;:13;:::i;:::-;36957:17;;36952:797;36980:13;36976:1;:17;36952:797;;;37088:7;;37075:9;37055:10;37066:5;:1;37070;37066:5;:::i;:::-;37055:17;;;;;;;:::i;:::-;;;:29;;;;:::i;:::-;37054:41;;;;:::i;:::-;37046:49;;37155:11;37150:1;:16;37146:576;;;37326:29;37356:8;37363:1;37356:4;:8;:::i;:::-;37326:39;;;;;;;:::i;:::-;;;;37366:1;37326:42;;;;;;;:::i;:::-;;;37291:18;37310:8;37317:1;37310:4;:8;:::i;:::-;37291:28;;;;;;;:::i;:::-;;;;37320:1;37291:31;;;;;;;:::i;:::-;;;37279:8;37263:13;;37253:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;37230:16;:19;37217:32;;:10;:32;:::i;:::-;:71;;;;:::i;:::-;:105;;;;:::i;:::-;37216:152;;;;:::i;:::-;37209:160;;:3;:160;:::i;:::-;37203:166;;37146:576;;;37647:29;37677:8;37684:1;37677:4;:8;:::i;:::-;37647:39;;;;;;;:::i;:::-;;;;37687:1;37647:42;;;;;;;:::i;:::-;;;37612:18;37631:8;37638:1;37631:4;:8;:::i;:::-;37612:28;;;;;;;:::i;:::-;;;;37641:1;37612:31;;;;;;;:::i;:::-;;;37597:8;37581:13;;37571:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;37544:16;37561:5;37544:23;;;;;;;:::i;:::-;;;:62;;;;:::i;:::-;37531:8;37501:16;37518:9;37526:1;37518:5;:9;:::i;:::-;37501:27;;;;;;;:::i;:::-;;;:38;;;;:::i;:::-;37500:107;;;;:::i;:::-;37486:122;;:10;:122;:::i;:::-;37485:158;;;;:::i;:::-;37484:205;;;;:::i;:::-;37477:213;;:3;:213;:::i;:::-;37471:219;;37146:576;36995:3;;;;:::i;:::-;;;;36952:797;;;-1:-1:-1;35496:3:0;;;;:::i;:::-;;;;35468:2339;;;;34946:2872;;;;;;;;;;34941:3;;;;;:::i;:::-;;;;34898:2920;;;37840:29;37862:6;37840:21;:29::i;:::-;37834:35;;:3;:35;:::i;:::-;37828:41;34592:3306;-1:-1:-1;;;;;34592:3306:0:o;30586:195::-;30660:29;30673:6;30681:7;30660:12;:29::i;:::-;30708:13;;:58;;-1:-1:-1;;;30708:58:0;;30743:4;30708:58;;;4061:34:1;-1:-1:-1;;;;;4131:15:1;;;4111:18;;;4104:43;4163:18;;;4156:34;;;30708:13:0;;;;:26;;3996:18:1;;30708:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30586:195;;:::o;3005:191::-;3079:16;3098:6;;-1:-1:-1;;;;;3115:17:0;;;-1:-1:-1;;;;;;3115:17:0;;;;;;3148:40;;3098:6;;;;;;;3148:40;;3079:16;3148:40;3068:128;3005:191;:::o;29873:705::-;30003:13;29986:585;30022:2;30018:1;:6;29986:585;;;30055:13;30050:1;:18;30046:514;;;30242:8;30226:13;;30216:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;30193:16;:19;30180:32;;:10;:32;:::i;:::-;:71;;;;:::i;:::-;30134:29;30164:8;30171:1;30164:4;:8;:::i;:::-;30134:39;;;;;;;:::i;:::-;;;;30174:1;30134:42;;;;;;;:::i;:::-;;;:118;;;;:::i;:::-;30089:29;30119:8;30126:1;30119:4;:8;:::i;:::-;30089:39;;;;;;;:::i;:::-;;;;30129:1;30089:42;;;;;;;:::i;:::-;;:163;30046:514;;;30532:8;30516:13;;30506:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;30467:16;30484:17;30488:13;30484:1;:17;:::i;:::-;30467:35;;;;;;;:::i;:::-;;;:74;;;;:::i;:::-;30454:8;30412:16;30449:1;30429:17;30433:13;30429:1;:17;:::i;:::-;:21;;;;:::i;:::-;30412:39;;;;;;;:::i;:::-;;;:50;;;;:::i;:::-;30411:131;;;;:::i;:::-;30397:146;;:10;:146;:::i;:::-;30351:29;30381:8;30388:1;30381:4;:8;:::i;:::-;30351:39;;;;;;;:::i;:::-;;;;30391:1;30351:42;;;;;;;:::i;:::-;;;:193;;;;:::i;:::-;30306:29;30336:8;30343:1;30336:4;:8;:::i;:::-;30306:39;;;;;;;:::i;:::-;;;;30346:1;30306:42;;;;;;;:::i;:::-;;:238;30046:514;30026:3;;;;:::i;:::-;;;;29986:585;;;;29873:705;;;;:::o;43771:2824::-;43920:7;;43903:10;:13;43840:7;;;;43885:31;;:15;:31;:::i;:::-;43884:43;;;;:::i;:::-;43860:67;;43958:2;43942:13;:18;43938:59;;;-1:-1:-1;43984:1:0;;43771:2824;-1:-1:-1;;43771:2824:0:o;43938:59::-;44007:11;44033:9;44061:2452;-1:-1:-1;;;;;44077:18:0;;;;;;:10;:18;;;;;:25;44073:29;;44061:2452;;;-1:-1:-1;;;;;44142:18:0;;44124:15;44142:18;;;:10;:18;;;;;:21;;44161:1;;44142:21;;;;;;:::i;:::-;;;;;;;;;;;;;;44200:16;;;:7;:16;;;;;;44217:1;44200:19;;;44270:1;44253:19;;;44325:1;44308:19;;;;44142:21;;-1:-1:-1;44200:19:0;44253;;44308;44358:27;44200:19;44358:13;:27;:::i;:::-;44342:43;-1:-1:-1;44419:1:0;44402:2100;44426:2;44422:1;:6;44402:2100;;;44454:12;44493:1;44498;44493:6;:34;;;;-1:-1:-1;44503:16:0;;;;:7;:16;;;;;44520:1;44503:19;;44526:1;44503:24;44493:34;44489:321;;;-1:-1:-1;44559:1:0;44489:321;;;44607:1;44612;44607:6;:34;;;;-1:-1:-1;44617:16:0;;;;:7;:16;;;;;44634:1;44617:19;;44640:1;44617:24;44607:34;44603:207;;;-1:-1:-1;44673:1:0;44603:207;;;44721:1;44726:2;44721:7;:36;;;;-1:-1:-1;44732:16:0;;;;:7;:16;;;;;44749:2;44732:20;;44756:1;44732:25;44721:36;44717:93;;;-1:-1:-1;44789:1:0;44717:93;44846:8;;44842:1644;;44938:1;44883:27;44911:8;44918:1;44911:4;:8;:::i;:::-;44883:37;;;;;;;:::i;:::-;;;;44921:13;44883:52;;;;;;;:::i;:::-;;;:56;44879:1588;;;44989:11;44972:13;:28;44968:634;;;45177:29;45207:8;45214:1;45207:4;:8;:::i;:::-;45177:39;;;;;;;:::i;:::-;;;;45217:13;45177:54;;;;;;;:::i;:::-;;;45121:27;45149:8;45156:1;45149:4;:8;:::i;:::-;45121:37;;;;;;;:::i;:::-;;;;45159:13;45121:52;;;;;;;:::i;:::-;;;45109:8;45093:13;;45083:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;45060:16;:19;45047:32;;:10;:32;:::i;:::-;:71;;;;:::i;:::-;:126;;;;:::i;:::-;45046:185;;;;:::i;:::-;45039:193;;:3;:193;:::i;:::-;45033:199;;44879:1588;;44968:634;45519:29;45549:8;45556:1;45549:4;:8;:::i;:::-;45519:39;;;;;;;:::i;:::-;;;;45559:13;45519:54;;;;;;;:::i;:::-;;;45463:27;45491:8;45498:1;45491:4;:8;:::i;:::-;45463:37;;;;;;;:::i;:::-;;;;45501:13;45463:52;;;;;;;:::i;:::-;;;45448:8;45432:13;;45422:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;45395:16;45412:5;45395:23;;;;;;;:::i;:::-;;;:62;;;;:::i;:::-;45382:8;45352:16;45369:9;45377:1;45369:5;:9;:::i;:::-;45352:27;;;;;;;:::i;:::-;;;:38;;;;:::i;:::-;45351:107;;;;:::i;:::-;45337:122;;:10;:122;:::i;44879:1588::-;45683:17;;45679:765;;45754:11;45737:13;:28;45733:684;;;45960:29;45990:8;45997:1;45990:4;:8;:::i;:::-;45960:39;;;;;;;:::i;:::-;;;;46000:13;45960:54;;;;;;;:::i;:::-;;;45890:27;45918:8;45925:1;45918:4;:8;:::i;:::-;45890:37;;;;;;;:::i;:::-;;;;45928:27;;45890:66;;;;;;;:::i;45733:684::-;46328:29;46358:8;46365:1;46358:4;:8;:::i;:::-;46328:39;;;;;;;:::i;:::-;;;;46368:13;46328:54;;;;;;;:::i;:::-;;;46258:27;46286:8;46293:1;46286:4;:8;:::i;:::-;46258:37;;;;;;;:::i;:::-;;;;46296:27;;46258:66;;;;;;;:::i;:::-;;;46243:8;46227:13;;46217:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;46190:16;46207:5;46190:23;;;;;;;:::i;:::-;;;:62;;;;:::i;:::-;46177:8;46147:16;46164:9;46172:1;46164:5;:9;:::i;:::-;46147:27;;;;;;;:::i;:::-;;;:38;;;;:::i;:::-;46146:107;;;;:::i;:::-;46132:122;;:10;:122;:::i;:::-;46131:193;;;;:::i;:::-;46130:252;;;;:::i;:::-;46123:260;;:3;:260;:::i;:::-;46117:266;;45733:684;-1:-1:-1;44430:3:0;;;;:::i;:::-;;;;44402:2100;;;;44109:2404;;;;;44104:3;;;;;:::i;:::-;;;;44061:2452;;;46535:31;46559:6;46535:23;:31::i;27344:281::-;-1:-1:-1;;;;;27404:20:0;;27396:50;;;;-1:-1:-1;;;27396:50:0;;11154:2:1;27396:50:0;;;11136:21:1;11193:2;11173:18;;;11166:30;-1:-1:-1;;;11212:18:1;;;11205:47;11269:18;;27396:50:0;11126:167:1;27396:50:0;27524:41;;-1:-1:-1;;;27524:41:0;;-1:-1:-1;;;27524:41:0;;;5732:52:1;27491:6:0;;-1:-1:-1;;;;;27524:21:0;;;;;5705:18:1;;27524:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27516:64;;;;-1:-1:-1;;;27516:64:0;;9686:2:1;27516:64:0;;;9668:21:1;9725:2;9705:18;;;9698:30;-1:-1:-1;;;9744:18:1;;;9737:40;9794:18;;27516:64:0;9658:160:1;27516:64:0;27598:13;:19;;-1:-1:-1;;;;;;27598:19:0;-1:-1:-1;;;;;27598:19:0;;;;;;;;;;-1:-1:-1;27344:281:0:o;49371:656::-;49434:12;49474:4;49463:7;:15;49459:561;;-1:-1:-1;49502:3:0;;49371:656;-1:-1:-1;49371:656:0:o;49459:561::-;49547:3;49536:7;:14;49532:488;;-1:-1:-1;49574:3:0;;49371:656;-1:-1:-1;49371:656:0:o;49532:488::-;49619:3;49608:7;:14;49604:416;;-1:-1:-1;49646:3:0;;49371:656;-1:-1:-1;49371:656:0:o;49604:416::-;49691:2;49680:7;:13;49676:344;;-1:-1:-1;49717:3:0;;49371:656;-1:-1:-1;49371:656:0:o;49676:344::-;49762:1;49751:7;:12;49747:273;;-1:-1:-1;49787:3:0;;49371:656;-1:-1:-1;49371:656:0:o;49747:273::-;49829:7;49840:1;49829:12;49825:195;;;-1:-1:-1;49865:3:0;;49371:656;-1:-1:-1;49371:656:0:o;49825:195::-;49899:7;49910:1;49899:12;49895:125;;;-1:-1:-1;49935:3:0;;49371:656;-1:-1:-1;49371:656:0:o;49895:125::-;49969:7;49980:1;49969:12;49965:55;;;-1:-1:-1;50005:3:0;;49371:656;-1:-1:-1;49371:656:0:o;49965:55::-;49371:656;;;:::o;37906:5857::-;37975:7;;;38042:5693;-1:-1:-1;;;;;38058:23:0;;;;;;:15;:23;;;;;:30;38054:34;;38042:5693;;;-1:-1:-1;;;;;38140:23:0;;38110:27;38140:23;;;:15;:23;;;;;:26;;38164:1;;38140:26;;;;;;:::i;:::-;;;;;;;;;38110:56;;;;;;;;;;;38140:26;;;;;;;;;;38110:56;;;;;;;;;;;;;;;;;;;;;;;;38189:17;38209:8;38218:1;38209:11;;;;;;;:::i;:::-;;;;;;;;;;38255;;;;38301;;;;38349;;;;38394;;;;38441;;;;38497;;;;38540;;;;38209;;-1:-1:-1;38255:11:0;;38301;;38349;;38394;;38441;;38590:1;38573:5151;38597:2;38593:1;:6;38573:5151;;;38625:12;38664:1;38669;38664:6;:26;;;;-1:-1:-1;38674:11:0;;;;38689:1;38674:16;38664:26;38660:297;;;-1:-1:-1;38722:1:0;38660:297;;;38770:1;38775;38770:6;:26;;;;-1:-1:-1;38780:11:0;;;;38795:1;38780:16;38770:26;38766:191;;;-1:-1:-1;38828:1:0;38766:191;;;38876:1;38881:2;38876:7;:28;;;;-1:-1:-1;38887:12:0;;;;38903:1;38887:17;38876:28;38872:85;;;-1:-1:-1;38936:1:0;38872:85;38993:8;;38989:4720;;39026:9;39058:13;39147:9;39135:7;;39118:10;39129:1;39118:13;;;;;;;:::i;:::-;;;39100:31;;:15;:31;:::i;:::-;39099:43;;;;:::i;:::-;39098:58;39094:3018;;39194:13;39206:1;39194:9;:13;:::i;:::-;39190:17;;39185:1439;39213:13;:9;39225:1;39213:13;:::i;:::-;39209:1;:17;39185:1439;;;39306:7;;39293:9;39273:10;39284:5;:1;39288;39284:5;:::i;:::-;39273:17;;;;;;;:::i;:::-;;;:29;;;;:::i;:::-;39272:41;;;;:::i;:::-;39264:49;;39353:11;39348:1;:16;39344:1253;;;39524:29;39554:8;39561:1;39554:4;:8;:::i;:::-;39524:39;;;;;;;:::i;:::-;;;;39564:1;39524:42;;;;;;;:::i;:::-;;;39489:18;39508:8;39515:1;39508:4;:8;:::i;:::-;39489:28;;;;;;;:::i;:::-;;;;39518:1;39489:31;;;;;;;:::i;:::-;;;39477:8;39461:13;;39451:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;39428:16;39445:1;39428:19;;;39415:32;;:10;:32;:::i;:::-;:71;;;;:::i;:::-;:105;;;;:::i;:::-;39414:152;;;;:::i;:::-;39407:3;:160;;;;:::i;:::-;39401:166;;39344:1253;;;39643:9;39638:1;:14;39634:963;;;39703:8;39693:6;:18;39689:556;;39909:29;39939:8;39946:1;39939:4;:8;:::i;:::-;39909:39;;;;;;;:::i;:::-;;;;39949:1;39909:42;;;;;;;:::i;:::-;;;39875:18;39894:8;39901:1;39894:4;:8;:::i;:::-;39875:28;;;;;;;:::i;:::-;;;;39904:1;39875:31;;;;;;;:::i;:::-;;;39851:17;39860:8;39851:6;:17;:::i;:::-;39824:16;39841:5;39824:23;;;;;;;:::i;:::-;;;:45;;;;:::i;:::-;39811:8;39781:16;39798:9;39806:1;39798:5;:9;:::i;:::-;39781:27;;;;;;;:::i;:::-;;;:38;;;;:::i;:::-;39780:90;;;;:::i;:::-;39766:105;;:10;:105;:::i;39689:556::-;40166:29;40196:8;40203:1;40196:4;:8;:::i;:::-;40166:39;;;;;;;:::i;:::-;;;;40206:1;40166:42;;;;;;;:::i;:::-;;;40132:18;40151:8;40158:1;40151:4;:8;:::i;:::-;40132:28;;;;;;;:::i;:::-;;;;40161:1;40132:31;;;;;;;:::i;:::-;;;40123:6;40093:16;40110:9;40118:1;40110:5;:9;:::i;:::-;40093:27;;;;;;;:::i;39634:963::-;40522:29;40552:8;40559:1;40552:4;:8;:::i;:::-;40522:39;;;;;;;:::i;:::-;;;;40562:1;40522:42;;;;;;;:::i;:::-;;;40487:18;40506:8;40513:1;40506:4;:8;:::i;:::-;40487:28;;;;;;;:::i;:::-;;;;40516:1;40487:31;;;;;;;:::i;:::-;;;40472:8;40456:13;;40446:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;40419:16;40436:5;40419:23;;;;;;;:::i;:::-;;;:62;;;;:::i;:::-;40406:8;40376:16;40393:9;40401:1;40393:5;:9;:::i;:::-;40376:27;;;;;;;:::i;:::-;;;:38;;;;:::i;:::-;40375:107;;;;:::i;:::-;40361:122;;:10;:122;:::i;:::-;40360:158;;;;:::i;:::-;40359:205;;;;:::i;:::-;40352:3;:213;;;;:::i;:::-;40346:219;;39634:963;39228:3;;;;:::i;:::-;;;;39185:1439;;;40659:13;40671:1;40659:9;:13;:::i;:::-;40655:17;;40650:1439;40678:13;:9;40690:1;40678:13;:::i;:::-;40674:1;:17;40650:1439;;;40771:7;;40758:9;40738:10;40749:5;:1;40753;40749:5;:::i;:::-;40738:17;;;;;;;:::i;:::-;;;:29;;;;:::i;:::-;40737:41;;;;:::i;:::-;40729:49;;40818:11;40813:1;:16;40809:1253;;;40989:29;41019:8;41026:1;41019:4;:8;:::i;:::-;40989:39;;;;;;;:::i;:::-;;;;41029:1;40989:42;;;;;;;:::i;:::-;;;40954:18;40973:8;40980:1;40973:4;:8;:::i;:::-;40954:28;;;;;;;:::i;:::-;;;;40983:1;40954:31;;;;;;;:::i;:::-;;;40942:8;40926:13;;40916:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;40893:16;40910:1;40893:19;;;40880:32;;:10;:32;:::i;:::-;:71;;;;:::i;:::-;:105;;;;:::i;:::-;40879:152;;;;:::i;:::-;40872:3;:160;;;;:::i;:::-;40866:166;;40809:1253;;;41108:9;41103:1;:14;41099:963;;;41168:8;41158:6;:18;41154:556;;41374:29;41404:8;41411:1;41404:4;:8;:::i;:::-;41374:39;;;;;;;:::i;:::-;;;;41414:1;41374:42;;;;;;;:::i;:::-;;;41340:18;41359:8;41366:1;41359:4;:8;:::i;:::-;41340:28;;;;;;;:::i;:::-;;;;41369:1;41340:31;;;;;;;:::i;:::-;;;41316:17;41325:8;41316:6;:17;:::i;:::-;41289:16;41306:5;41289:23;;;;;;;:::i;:::-;;;:45;;;;:::i;:::-;41276:8;41246:16;41263:9;41271:1;41263:5;:9;:::i;:::-;41246:27;;;;;;;:::i;:::-;;;:38;;;;:::i;:::-;41245:90;;;;:::i;:::-;41231:105;;:10;:105;:::i;41154:556::-;41631:29;41661:8;41668:1;41661:4;:8;:::i;:::-;41631:39;;;;;;;:::i;:::-;;;;41671:1;41631:42;;;;;;;:::i;:::-;;;41597:18;41616:8;41623:1;41616:4;:8;:::i;:::-;41597:28;;;;;;;:::i;:::-;;;;41626:1;41597:31;;;;;;;:::i;:::-;;;41588:6;41558:16;41575:9;41583:1;41575:5;:9;:::i;:::-;41558:27;;;;;;;:::i;41099:963::-;41987:29;42017:8;42024:1;42017:4;:8;:::i;:::-;41987:39;;;;;;;:::i;:::-;;;;42027:1;41987:42;;;;;;;:::i;:::-;;;41952:18;41971:8;41978:1;41971:4;:8;:::i;:::-;41952:28;;;;;;;:::i;:::-;;;;41981:1;41952:31;;;;;;;:::i;:::-;;;41937:8;41921:13;;41911:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;41884:16;41901:5;41884:23;;;;;;;:::i;:::-;;;:62;;;;:::i;:::-;41871:8;41841:16;41858:9;41866:1;41858:5;:9;:::i;:::-;41841:27;;;;;;;:::i;:::-;;;:38;;;;:::i;:::-;41840:107;;;;:::i;:::-;41826:122;;:10;:122;:::i;:::-;41825:158;;;;:::i;:::-;41824:205;;;;:::i;:::-;41817:3;:213;;;;:::i;:::-;41811:219;;41099:963;40693:3;;;;:::i;:::-;;;;40650:1439;;;42138:9;42151:2;42138:15;42134:1556;;;42215:13;42227:1;42215:9;:13;:::i;:::-;42211:17;;42206:1439;42234:13;:9;42246:1;42234:13;:::i;:::-;42230:1;:17;42206:1439;;;42327:7;;42314:9;42294:10;42305:5;:1;42309;42305:5;:::i;:::-;42294:17;;;;;;;:::i;:::-;;;:29;;;;:::i;:::-;42293:41;;;;:::i;:::-;42285:49;;42374:11;42369:1;:16;42365:1253;;;42545:29;42575:8;42582:1;42575:4;:8;:::i;:::-;42545:39;;;;;;;:::i;:::-;;;;42585:1;42545:42;;;;;;;:::i;:::-;;;42510:18;42529:8;42536:1;42529:4;:8;:::i;:::-;42510:28;;;;;;;:::i;:::-;;;;42539:1;42510:31;;;;;;;:::i;:::-;;;42498:8;42482:13;;42472:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;42449:16;42466:1;42449:19;;;42436:32;;:10;:32;:::i;:::-;:71;;;;:::i;:::-;:105;;;;:::i;:::-;42435:152;;;;:::i;:::-;42428:3;:160;;;;:::i;:::-;42422:166;;42365:1253;;;42664:9;42659:1;:14;42655:963;;;42724:8;42714:6;:18;42710:556;;42930:29;42960:8;42967:1;42960:4;:8;:::i;:::-;42930:39;;;;;;;:::i;:::-;;;;42970:1;42930:42;;;;;;;:::i;:::-;;;42896:18;42915:8;42922:1;42915:4;:8;:::i;:::-;42896:28;;;;;;;:::i;:::-;;;;42925:1;42896:31;;;;;;;:::i;:::-;;;42872:17;42881:8;42872:6;:17;:::i;:::-;42845:16;42862:5;42845:23;;;;;;;:::i;:::-;;;:45;;;;:::i;:::-;42832:8;42802:16;42819:9;42827:1;42819:5;:9;:::i;:::-;42802:27;;;;;;;:::i;:::-;;;:38;;;;:::i;:::-;42801:90;;;;:::i;:::-;42787:105;;:10;:105;:::i;42710:556::-;43187:29;43217:8;43224:1;43217:4;:8;:::i;:::-;43187:39;;;;;;;:::i;:::-;;;;43227:1;43187:42;;;;;;;:::i;:::-;;;43153:18;43172:8;43179:1;43172:4;:8;:::i;:::-;43153:28;;;;;;;:::i;:::-;;;;43182:1;43153:31;;;;;;;:::i;:::-;;;43144:6;43114:16;43131:9;43139:1;43131:5;:9;:::i;:::-;43114:27;;;;;;;:::i;42655:963::-;43543:29;43573:8;43580:1;43573:4;:8;:::i;:::-;43543:39;;;;;;;:::i;:::-;;;;43583:1;43543:42;;;;;;;:::i;:::-;;;43508:18;43527:8;43534:1;43527:4;:8;:::i;:::-;43508:28;;;;;;;:::i;:::-;;;;43537:1;43508:31;;;;;;;:::i;:::-;;;43493:8;43477:13;;43467:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;43440:16;43457:5;43440:23;;;;;;;:::i;:::-;;;:62;;;;:::i;:::-;43427:8;43397:16;43414:9;43422:1;43414:5;:9;:::i;:::-;43397:27;;;;;;;:::i;:::-;;;:38;;;;:::i;:::-;43396:107;;;;:::i;:::-;43382:122;;:10;:122;:::i;:::-;43381:158;;;;:::i;:::-;43380:205;;;;:::i;:::-;43373:3;:213;;;;:::i;:::-;43367:219;;42655:963;42249:3;;;;:::i;:::-;;;;42206:1439;;;39003:4706;;38989:4720;-1:-1:-1;38601:3:0;;;;:::i;:::-;;;;38573:5151;;;;38095:5640;;;;;;;;;38090:3;;;;;:::i;:::-;;;;38042:5693;;30789:3270;30877:20;;;;:11;:20;;;;;30870:27;;-1:-1:-1;;;;;;30870:27:0;;;30968:7;;30951:10;:13;30933:31;;:15;:31;:::i;:::-;30932:43;;;;:::i;:::-;30908:67;;31016:2;31000:13;:18;30996:3022;;;31104:7;;31043:16;31081;;;:7;:16;;;;;31043;;31104:7;31098:1;31081:19;;31063:37;;:15;:37;:::i;:::-;31062:49;;;;:::i;:::-;31126:19;31148:16;;;:7;:16;;;;;31165:1;31148:19;;;31218:1;31201:19;;;31273:1;31256:19;;;;31356:13;;31043:68;;-1:-1:-1;31148:19:0;;31201;;31256;;31327:10;31338:13;31327:25;;;;;;;:::i;:::-;;;31309:43;;:15;:43;:::i;:::-;31308:61;;;;:::i;:::-;31307:67;;31373:1;31307:67;:::i;:::-;31290:84;;31389:9;31431:1;31419:8;:13;31415:193;;31459:16;;;;:7;:16;;;;;31476:1;31459:19;;:35;;;31530:1;31513:19;:28;;;31560:32;31576:6;31459:16;31560:15;:32::i;:::-;31649:1;31632:2375;31656:2;31652:1;:6;31632:2375;;;31684:12;31723:1;31728;31723:6;:34;;;;-1:-1:-1;31733:16:0;;;;:7;:16;;;;;31750:1;31733:19;;31756:1;31733:24;31723:34;31719:321;;;-1:-1:-1;31789:1:0;31719:321;;;31837:1;31842;31837:6;:34;;;;-1:-1:-1;31847:16:0;;;;:7;:16;;;;;31864:1;31847:19;;31870:1;31847:24;31837:34;31833:207;;;-1:-1:-1;31903:1:0;31833:207;;;31951:1;31956:2;31951:7;:36;;;;-1:-1:-1;31962:16:0;;;;:7;:16;;;;;31979:2;31962:20;;31986:1;31962:25;31951:36;31947:93;;;-1:-1:-1;32019:1:0;31947:93;32064:8;;32060:1932;;32113:1;32101:8;:13;32097:1876;;32158:13;32154:17;;32149:1031;32177:2;32173:1;:6;32149:1031;;;32439:8;32423:13;;32413:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;32376:16;32393:15;32397:11;32393:1;:15;:::i;:::-;32376:33;;;;;;;:::i;:::-;;;:72;;;;:::i;:::-;32363:8;32323:16;32358:1;32340:15;32344:11;32340:1;:15;:::i;:::-;:19;;;;:::i;:::-;32323:37;;;;;;;:::i;:::-;;;:48;;;;:::i;:::-;32322:127;;;;:::i;:::-;32308:142;;:10;:142;:::i;:::-;32262:29;32292:8;32299:1;32292:4;:8;:::i;:::-;32262:39;;;;;;;:::i;:::-;;;;32302:1;32262:42;;;;;;;:::i;:::-;;;:189;;;;:::i;:::-;32217:29;32247:8;32254:1;32247:4;:8;:::i;:::-;32217:39;;;;;;;:::i;:::-;;;;32257:1;32217:42;;;;;;;:::i;:::-;;:234;32486:18;;;32482:671;;;32554:8;32545:6;:17;32541:581;;;32747:6;32707:16;32742:1;32724:15;32728:11;32724:1;:15;:::i;:::-;:19;;;;:::i;:::-;32707:37;;;;;;;:::i;:::-;;;32694:50;;:10;:50;:::i;:::-;:59;;;;:::i;:::-;32648:29;32678:8;32685:1;32678:4;:8;:::i;:::-;32648:39;;;;;;;:::i;:::-;;;;32688:1;32648:42;;;;;;;:::i;:::-;;;:106;;;;:::i;:::-;32603:29;32633:8;32640:1;32633:4;:8;:::i;:::-;32603:39;;;;;;;:::i;:::-;;;;32643:1;32603:42;;;;;;;:::i;:::-;;:151;32541:581;;;33065:17;33074:8;33065:6;:17;:::i;:::-;33028:16;33045:15;33049:11;33045:1;:15;:::i;:::-;33028:33;;;;;;;:::i;:::-;;;:55;;;;:::i;:::-;33015:8;32975:16;33010:1;32992:15;32996:11;32992:1;:15;:::i;:::-;:19;;;;:::i;:::-;32975:37;;;;;;;:::i;:::-;;;:48;;;;:::i;:::-;32974:110;;;;:::i;:::-;32960:125;;:10;:125;:::i;:::-;32914:29;32944:8;32951:1;32944:4;:8;:::i;:::-;32914:39;;;;;;;:::i;:::-;;;;32954:1;32914:42;;;;;;;:::i;:::-;;;:172;;;;:::i;:::-;32869:29;32899:8;32906:1;32899:4;:8;:::i;:::-;32869:39;;;;;;;:::i;:::-;;;;32909:1;32869:42;;;;;;;:::i;:::-;;:217;32541:581;32181:3;;;;:::i;:::-;;;;32149:1031;;;32097:1876;;;33274:11;33270:15;;33265:682;33291:2;33287:1;:6;33265:682;;;33340:11;33335:1;:16;33331:589;;;33541:8;33525:13;;33515:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;33492:16;:19;33479:32;;:10;:32;:::i;:::-;:71;;;;:::i;:::-;33433:29;33463:8;33470:1;33463:4;:8;:::i;:::-;33433:39;;;;;;;:::i;:::-;;;;33473:1;33433:42;;;;;;;:::i;:::-;;;:118;;;;:::i;:::-;33388:29;33418:8;33425:1;33418:4;:8;:::i;:::-;33388:39;;;;;;;:::i;:::-;;;;33428:1;33388:42;;;;;;;:::i;:::-;;:163;33331:589;;;33876:8;33860:13;;33850:7;;:23;;;;:::i;:::-;:34;;;;:::i;:::-;33813:16;33830:15;33834:11;33830:1;:15;:::i;:::-;33813:33;;;;;;;:::i;:::-;;;:72;;;;:::i;:::-;33800:8;33760:16;33795:1;33777:15;33781:11;33777:1;:15;:::i;:::-;:19;;;;:::i;:::-;33760:37;;;;;;;:::i;:::-;;;:48;;;;:::i;:::-;33759:127;;;;:::i;:::-;33745:142;;:10;:142;:::i;:::-;33699:29;33729:8;33736:1;33729:4;:8;:::i;:::-;33699:39;;;;;;;:::i;:::-;;;;33739:1;33699:42;;;;;;;:::i;:::-;;;:189;;;;:::i;:::-;33654:29;33684:8;33691:1;33684:4;:8;:::i;:::-;33654:39;;;;;;;:::i;:::-;;;;33694:1;33654:42;;;;;;;:::i;:::-;;:234;33331:589;33295:3;;;;:::i;:::-;;;;33265:682;;;-1:-1:-1;31660:3:0;;;;:::i;:::-;;;;31632:2375;;;;31020:2998;;;;;;30996:3022;34035:16;;;;:7;:16;;;;;34028:23;;;:::i;46603:2760::-;46755:7;;46738:10;:13;46674:7;;;;46720:31;;:15;:31;:::i;:::-;46719:43;;;;:::i;:::-;46695:67;;46775:11;46801:9;46831:2504;-1:-1:-1;;;;;46847:23:0;;;;;;:15;:23;;;;;:30;46843:34;;46831:2504;;;-1:-1:-1;;;;;46929:23:0;;46899:27;46929:23;;;:15;:23;;;;;:26;;46953:1;;46929:26;;;;;;:::i;:::-;;;;;;;;;46899:56;;;;;;;;;;;46929:26;;;;;;;;;;46899:56;;;;;;;;;;;;;;;;;;;;;;;;46978:19;47000:8;47009:1;47000:11;;;;;;;:::i;:::-;;;;;47045;;;;47092;;;;47138;;;;47182;;;;47000;;-1:-1:-1;47045:11:0;;47092;;47138;47026:16;47229:27;47000:11;47229:13;:27;:::i;:::-;47213:43;;47292:9;47275:13;:26;47271:2053;;;47339:1;47322:1987;47346:2;47342:1;:6;47322:1987;;;47378:12;47421:1;47426;47421:6;:26;;;;-1:-1:-1;47431:11:0;;;;47446:1;47431:16;47421:26;47417:329;;;-1:-1:-1;47483:1:0;47417:329;;;47539:1;47544;47539:6;:26;;;;-1:-1:-1;47549:11:0;;;;47564:1;47549:16;47539:26;47535:211;;;-1:-1:-1;47601:1:0;47535:211;;;47657:1;47662:2;47657:7;:28;;;;-1:-1:-1;47668:12:0;;;;47684:1;47668:17;47657:28;47653:93;;;-1:-1:-1;47721:1:0;47653:93;47786:8;;47782:1508;;47882:1;47827:27;47855:8;47862:1;47855:4;:8;:::i;:::-;47827:37;;;;;;;:::i;:::-;;;;47865:13;47827:52;;;;;;;:::i;:::-;;;:56;47823:1443;;;47930:8;47920:6;:18;47916:603;;48155:29;48185:8;48192:1;48185:4;:8;:::i;:::-;48155:39;;;;;;;:::i;:::-;;;;48195:13;48155:54;;;;;;;:::i;:::-;;;48099:27;48127:8;48134:1;48127:4;:8;:::i;:::-;48099:37;;;;;;;:::i;:::-;;;;48137:13;48099:52;;;;;;;:::i;:::-;;;48075:17;48084:8;48075:6;:17;:::i;:::-;48048:16;48065:5;48048:23;;;;;;;:::i;:::-;;;:45;;;;:::i;:::-;48035:8;48005:16;48022:9;48030:1;48022:5;:9;:::i;:::-;48005:27;;;;;;;:::i;:::-;;;:38;;;;:::i;:::-;48004:90;;;;:::i;:::-;47990:105;;:10;:105;:::i;:::-;47989:162;;;;:::i;:::-;47988:221;;;;:::i;:::-;47981:229;;:3;:229;:::i;:::-;47975:235;;47823:1443;;47916:603;48432:29;48462:8;48469:1;48462:4;:8;:::i;:::-;48432:39;;;;;;;:::i;:::-;;;;48472:13;48432:54;;;;;;;:::i;:::-;;;48377:27;48405:8;48412:1;48405:4;:8;:::i;:::-;48377:37;;;;;;;:::i;:::-;;;;48415:13;48377:52;;;;;;;:::i;:::-;;;48368:6;48338:16;48355:9;48363:1;48355:5;:9;:::i;:::-;48338:27;;;;;;;:::i;:::-;;;48325:40;;:10;:40;:::i;:::-;:49;;;;:::i;47823:1443::-;48622:8;48612:6;:18;48608:631;;48861:29;48891:8;48898:1;48891:4;:8;:::i;:::-;48861:39;;;;;;;:::i;:::-;;;;48901:13;48861:54;;;;;;;:::i;:::-;;;48791:27;48819:8;48826:1;48819:4;:8;:::i;:::-;48791:37;;;;;;;:::i;:::-;;;;48829:27;;48791:66;;;;;;;:::i;48608:631::-;49152:29;49182:8;49189:1;49182:4;:8;:::i;:::-;49152:39;;;;;;;:::i;:::-;;;;49192:13;49152:54;;;;;;;:::i;:::-;;;49083:27;49111:8;49118:1;49111:4;:8;:::i;:::-;49083:37;;;;;;;:::i;:::-;;;;49121:27;;49083:66;;;;;;;:::i;:::-;;;49074:6;49044:16;49061:9;49069:1;49061:5;:9;:::i;:::-;49044:27;;;;;;;:::i;:::-;;;49031:40;;:10;:40;:::i;:::-;:49;;;;:::i;:::-;:118;;;;:::i;:::-;:175;;;;:::i;:::-;49024:183;;:3;:183;:::i;:::-;49018:189;;48608:631;-1:-1:-1;47350:3:0;;;;:::i;:::-;;;;47322:1987;;;;47271:2053;46884:2451;;;;;;;46879:3;;;;;:::i;:::-;;;;46831:2504;;34067:517;34144:27;34174:16;;;:7;:16;;;;;;34144:46;;;;;;;;;;;;34174:16;34144:46;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;34219:23:0;;34205:11;34219:23;;;:15;:23;;;;;:30;34144:46;;-1:-1:-1;34205:11:0;34219:34;;-1:-1:-1;34252:1:0;34219:34;:::i;:::-;34205:48;;34264:38;34323:3;34305:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;34264:63;;34361:8;34338:17;34356:1;34338:20;;;;;;;;:::i;:::-;;;;;;:31;;;;34387:9;34382:141;-1:-1:-1;;;;;34406:23:0;;;;;;:15;:23;;;;;:30;34402:34;;34382:141;;;-1:-1:-1;;;;;34485:23:0;;;;;;:15;:23;;;;;:26;;34509:1;;34485:26;;;;;;:::i;:::-;;;;;;;;;34458:53;;;;;;;;;;;34485:26;;;;;;;;;;34458:53;;;;;;;;;;;;;;;;;;;;;;:17;34476:1;34480;34476:5;;;;:::i;:::-;34458:24;;;;;;;;:::i;:::-;;;;;;:53;;;;34438:3;;;;;:::i;:::-;;;;34382:141;;;-1:-1:-1;;;;;;34533:23:0;;;;;;:15;:23;;;;;;;;:43;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;14:247:1;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;142:1;139;132:12;94:2;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:2;;;405:1;402;395:12;357:2;437:9;431:16;456:31;481:5;456:31;:::i;522:936::-;619:6;627;635;643;651;704:3;692:9;683:7;679:23;675:33;672:2;;;721:1;718;711:12;672:2;760:9;747:23;779:31;804:5;779:31;:::i;:::-;829:5;-1:-1:-1;886:2:1;871:18;;858:32;899:33;858:32;899:33;:::i;:::-;951:7;-1:-1:-1;1005:2:1;990:18;;977:32;;-1:-1:-1;1060:2:1;1045:18;;1032:32;1083:18;1113:14;;;1110:2;;;1140:1;1137;1130:12;1110:2;1178:6;1167:9;1163:22;1153:32;;1223:7;1216:4;1212:2;1208:13;1204:27;1194:2;;1245:1;1242;1235:12;1194:2;1285;1272:16;1311:2;1303:6;1300:14;1297:2;;;1327:1;1324;1317:12;1297:2;1372:7;1367:2;1358:6;1354:2;1350:15;1346:24;1343:37;1340:2;;;1393:1;1390;1383:12;1340:2;662:796;;;;-1:-1:-1;662:796:1;;-1:-1:-1;1424:2:1;1416:11;;1446:6;662:796;-1:-1:-1;;;662:796:1:o;1463:315::-;1531:6;1539;1592:2;1580:9;1571:7;1567:23;1563:32;1560:2;;;1608:1;1605;1598:12;1560:2;1647:9;1634:23;1666:31;1691:5;1666:31;:::i;:::-;1716:5;1768:2;1753:18;;;;1740:32;;-1:-1:-1;;;1550:228:1:o;1783:277::-;1850:6;1903:2;1891:9;1882:7;1878:23;1874:32;1871:2;;;1919:1;1916;1909:12;1871:2;1951:9;1945:16;2004:5;1997:13;1990:21;1983:5;1980:32;1970:2;;2026:1;2023;2016:12;2065:286;2123:6;2176:2;2164:9;2155:7;2151:23;2147:32;2144:2;;;2192:1;2189;2182:12;2144:2;2218:23;;-1:-1:-1;;;;;;2270:32:1;;2260:43;;2250:2;;2317:1;2314;2307:12;2356:180;2415:6;2468:2;2456:9;2447:7;2443:23;2439:32;2436:2;;;2484:1;2481;2474:12;2436:2;-1:-1:-1;2507:23:1;;2426:110;-1:-1:-1;2426:110:1:o;2541:184::-;2611:6;2664:2;2652:9;2643:7;2639:23;2635:32;2632:2;;;2680:1;2677;2670:12;2632:2;-1:-1:-1;2703:16:1;;2622:103;-1:-1:-1;2622:103:1:o;2730:248::-;2798:6;2806;2859:2;2847:9;2838:7;2834:23;2830:32;2827:2;;;2875:1;2872;2865:12;2827:2;-1:-1:-1;;2898:23:1;;;2968:2;2953:18;;;2940:32;;-1:-1:-1;2817:161:1:o;2983:316::-;3060:6;3068;3076;3129:2;3117:9;3108:7;3104:23;3100:32;3097:2;;;3145:1;3142;3135:12;3097:2;-1:-1:-1;;3168:23:1;;;3238:2;3223:18;;3210:32;;-1:-1:-1;3289:2:1;3274:18;;;3261:32;;3087:212;-1:-1:-1;3087:212:1:o;4480:632::-;4651:2;4703:21;;;4773:13;;4676:18;;;4795:22;;;4622:4;;4651:2;4874:15;;;;4848:2;4833:18;;;4622:4;4917:169;4931:6;4928:1;4925:13;4917:169;;;4992:13;;4980:26;;5061:15;;;;5026:12;;;;4953:1;4946:9;4917:169;;;-1:-1:-1;5103:3:1;;4631:481;-1:-1:-1;;;;;;4631:481:1:o;10181:405::-;10383:2;10365:21;;;10422:2;10402:18;;;10395:30;10461:34;10456:2;10441:18;;10434:62;-1:-1:-1;;;10527:2:1;10512:18;;10505:39;10576:3;10561:19;;10355:231::o;11705:356::-;11907:2;11889:21;;;11926:18;;;11919:30;11985:34;11980:2;11965:18;;11958:62;12052:2;12037:18;;11879:182::o;12066:398::-;12268:2;12250:21;;;12307:2;12287:18;;;12280:30;12346:34;12341:2;12326:18;;12319:62;-1:-1:-1;;;12412:2:1;12397:18;;12390:32;12454:3;12439:19;;12240:224::o;12469:352::-;12671:2;12653:21;;;12710:2;12690:18;;;12683:30;12749;12744:2;12729:18;;12722:58;12812:2;12797:18;;12643:178::o;13184:346::-;13386:2;13368:21;;;13425:2;13405:18;;;13398:30;-1:-1:-1;;;13459:2:1;13444:18;;13437:52;13521:2;13506:18;;13358:172::o;13535:355::-;13737:2;13719:21;;;13776:2;13756:18;;;13749:30;13815:33;13810:2;13795:18;;13788:61;13881:2;13866:18;;13709:181::o;13895:355::-;14097:2;14079:21;;;14136:2;14116:18;;;14109:30;14175:33;14170:2;14155:18;;14148:61;14241:2;14226:18;;14069:181::o;14437:128::-;14477:3;14508:1;14504:6;14501:1;14498:13;14495:2;;;14514:18;;:::i;:::-;-1:-1:-1;14550:9:1;;14485:80::o;14570:217::-;14610:1;14636;14626:2;;14680:10;14675:3;14671:20;14668:1;14661:31;14715:4;14712:1;14705:15;14743:4;14740:1;14733:15;14626:2;-1:-1:-1;14772:9:1;;14616:171::o;14792:168::-;14832:7;14898:1;14894;14890:6;14886:14;14883:1;14880:21;14875:1;14868:9;14861:17;14857:45;14854:2;;;14905:18;;:::i;:::-;-1:-1:-1;14945:9:1;;14844:116::o;14965:125::-;15005:4;15033:1;15030;15027:8;15024:2;;;15038:18;;:::i;:::-;-1:-1:-1;15075:9:1;;15014:76::o;15095:136::-;15134:3;15162:5;15152:2;;15171:18;;:::i;:::-;-1:-1:-1;;;15207:18:1;;15142:89::o;15236:135::-;15275:3;-1:-1:-1;;15296:17:1;;15293:2;;;15316:18;;:::i;:::-;-1:-1:-1;15363:1:1;15352:13;;15283:88::o;15376:127::-;15437:10;15432:3;15428:20;15425:1;15418:31;15468:4;15465:1;15458:15;15492:4;15489:1;15482:15;15508:127;15569:10;15564:3;15560:20;15557:1;15550:31;15600:4;15597:1;15590:15;15624:4;15621:1;15614:15;15640:127;15701:10;15696:3;15692:20;15689:1;15682:31;15732:4;15729:1;15722:15;15756:4;15753:1;15746:15;15772:127;15833:10;15828:3;15824:20;15821:1;15814:31;15864:4;15861:1;15854:15;15888:4;15885:1;15878:15;15904:131;-1:-1:-1;;;;;15979:31:1;;15969:42;;15959:2;;16025:1;16022;16015:12

Swarm Source

ipfs://b2585f2a64efa3f4c6fa27ec5a05068f53a143816231cdcfbc66f757fd63b9c0

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.