ETH Price: $3,414.60 (+3.92%)

Contract

0x68F989F17ce7e21b1B82235a89098a00771528Ef
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040110898562020-10-20 0:56:301495 days ago1603155390IN
 Create: MSTX
0 ETH0.134267125

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MSTX

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-10-20
*/

// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.6.12;

interface IERC20 { // brief interface for erc20 token tx
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}

interface IWETH { // brief interface for canonical ether token wrapper 
    function deposit() external payable;
    function transfer(address dst, uint wad) external returns (bool);
}

library Address { // helper for address type - see openzeppelin-contracts/blob/master/contracts/utils/Address.sol
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }
}

library SafeERC20 { // wrapper around erc20 token tx for non-standard contract - see openzeppelin-contracts/blob/master/contracts/token/ERC20/SafeERC20.sol
    using Address for address;
    
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }
    
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }
    
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");
        (bool success, bytes memory returnData) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returnData.length > 0) { // return data is optional
            require(abi.decode(returnData, (bool)), "SafeERC20: erc20 operation did not succeed");
        }
    }
}

library SafeMath { // arithmetic wrapper for unit under/overflow check
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }
    
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }
    
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }
    
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0);
        uint256 c = a / b;

        return c;
    }
}

contract ReentrancyGuard { // call wrapper for reentrancy check
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() internal {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

contract MSTX is ReentrancyGuard { 
    using SafeERC20 for IERC20;
    using SafeMath for uint256;

    /***************
    GLOBAL CONSTANTS
    ***************/
    address public depositToken; // deposit token contract reference - default = wETH
    address public stakeToken; // stake token contract reference for guild voting shares 
    address public constant wETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // canonical ether token wrapper contract reference 
    uint256 public proposalDeposit; // default = 10 deposit token 
    uint256 public processingReward; // default = 0.1 - amount of deposit token to give to whoever processes a proposal
    uint256 public periodDuration; // default = 17280 = 4.8 hours in seconds (5 periods per day)
    uint256 public votingPeriodLength; // default = 35 periods (7 days)
    uint256 public gracePeriodLength; // default = 35 periods (7 days)
    uint256 public dilutionBound; // default = 3 - maximum multiplier a YES voter will be obligated to pay in case of mass ragequit
    uint256 public summoningTime; // needed to determine the current period
    bool private initialized; // internally tracks deployment under eip-1167 proxy pattern
    
    // HARD-CODED LIMITS
    uint256 constant MAX_GUILD_BOUND = 10**36; // maximum bound for guild member accounting
    uint256 constant MAX_TOKEN_WHITELIST_COUNT = 400; // maximum number of whitelisted tokens
    uint256 constant MAX_TOKEN_GUILDBANK_COUNT = 200; // maximum number of tokens with non-zero balance in guildbank

    // GUILD TOKEN DETAILS
    uint8 public constant decimals = 18;
    string public constant name = "MSTX";
    string public constant symbol = "MSTX";
    
    // *******************
    // INTERNAL ACCOUNTING
    // *******************
    address public constant GUILD = address(0xdead);
    address public constant ESCROW = address(0xdeaf);
    address public constant TOTAL = address(0xdeed);
    uint256 public proposalCount; // total proposals submitted
    uint256 public totalShares; // total shares across all members
    uint256 public totalLoot; // total loot across all members
    uint256 public totalSupply; // total shares & loot across all members (total guild tokens)
    uint256 public totalGuildBankTokens; // total tokens with non-zero balance in guild bank

    mapping(uint256 => bytes) public actions; // proposalId => action data
    mapping(address => uint256) public balanceOf; // guild token balances
    mapping(address => mapping(address => uint256)) public allowance; // guild token (loot) allowances
    mapping(address => mapping(address => uint256)) private userTokenBalances; // userTokenBalances[userAddress][tokenAddress]
    
    address[] public approvedTokens;
    mapping(address => bool) public tokenWhitelist;
    
    uint256[] public proposalQueue;
    mapping(uint256 => Proposal) public proposals;

    mapping(address => bool) public proposedToWhitelist;
    mapping(address => bool) public proposedToKick;
    
    mapping(address => Member) public members;
    mapping(address => address) public memberAddressByDelegateKey;

    // **************
    // EVENT TRACKING
    // **************
    event SubmitProposal(address indexed applicant, uint256 sharesRequested, uint256 lootRequested, uint256 tributeOffered, address tributeToken, uint256 paymentRequested, address paymentToken, bytes32 details, uint8[9] flags, bytes data, uint256 proposalId, address indexed delegateKey, address indexed memberAddress);
    event CancelProposal(uint256 indexed proposalId, address applicantAddress);
    event SponsorProposal(address indexed delegateKey, address indexed memberAddress, uint256 proposalId, uint256 proposalIndex, uint256 startingPeriod);
    event SubmitVote(uint256 proposalId, uint256 indexed proposalIndex, address indexed delegateKey, address indexed memberAddress, uint8 uintVote);
    event ProcessProposal(uint256 indexed proposalIndex, uint256 indexed proposalId, bool didPass);
    event ProcessActionProposal(uint256 indexed proposalIndex, uint256 indexed proposalId, bool didPass);
    event ProcessGuildKickProposal(uint256 indexed proposalIndex, uint256 indexed proposalId, bool didPass);
    event ProcessWhitelistProposal(uint256 indexed proposalIndex, uint256 indexed proposalId, bool didPass);
    event ProcessWithdrawalProposal(uint256 indexed proposalIndex, uint256 indexed proposalId, bool didPass);
    event UpdateDelegateKey(address indexed memberAddress, address newDelegateKey);
    event Ragequit(address indexed memberAddress, uint256 sharesToBurn, uint256 lootToBurn);
    event TokensCollected(address indexed token, uint256 amountToCollect);
    event Withdraw(address indexed memberAddress, address token, uint256 amount);
    event ConvertSharesToLoot(address indexed memberAddress, uint256 amount);
    event StakeTokenForShares(address indexed memberAddress, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 amount); // guild token (loot) allowance tracking
    event Transfer(address indexed sender, address indexed recipient, uint256 amount); // guild token mint, burn & loot transfer tracking
    
    enum Vote {
        Null, // default value, counted as abstention
        Yes,
        No
    }
    
    struct Member {
        address delegateKey; // the key responsible for submitting proposals & voting - defaults to member address unless updated
        uint8 exists; // always true (1) once a member has been created
        uint256 shares; // the # of voting shares assigned to this member
        uint256 loot; // the loot amount available to this member (combined with shares on ragekick) - transferable by guild token
        uint256 highestIndexYesVote; // highest proposal index # on which the member voted YES
        uint256 jailed; // set to proposalIndex of a passing guild kick proposal for this member, prevents voting on & sponsoring proposals
    }
    
    struct Proposal {
        address applicant; // the applicant who wishes to become a member - this key will be used for withdrawals (doubles as target for alt. proposals)
        address proposer; // the account that submitted the proposal (can be non-member)
        address sponsor; // the member that sponsored the proposal (moving it into the queue)
        address tributeToken; // tribute token contract reference
        address paymentToken; // payment token contract reference
        uint8[9] flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action, withdrawal, standard]
        uint256 sharesRequested; // the # of shares the applicant is requesting
        uint256 lootRequested; // the amount of loot the applicant is requesting
        uint256 paymentRequested; // amount of tokens requested as payment
        uint256 tributeOffered; // amount of tokens offered as tribute
        uint256 startingPeriod; // the period in which voting can start for this proposal
        uint256 yesVotes; // the total number of YES votes for this proposal
        uint256 noVotes; // the total number of NO votes for this proposal
        uint256 maxTotalSharesAndLootAtYesVote; // the maximum # of total shares encountered at a yes vote on this proposal
        bytes32 details; // proposal details to add context for members 
        mapping(address => Vote) votesByMember; // the votes on this proposal by each member
    }
    
    modifier onlyDelegate {
        require(members[memberAddressByDelegateKey[msg.sender]].shares > 0, "!delegate");
        _;
    }

    function init(
        address _depositToken,
        address _stakeToken,
        address[] memory _summoner,
        uint256[] memory _summonerShares,
        uint256 _summonerDeposit,
        uint256 _proposalDeposit,
        uint256 _processingReward,
        uint256 _periodDuration,
        uint256 _votingPeriodLength,
        uint256 _gracePeriodLength,
        uint256 _dilutionBound
    ) external {
        require(!initialized, "initialized");
        require(_depositToken != _stakeToken, "depositToken = stakeToken");
        require(_summoner.length == _summonerShares.length, "summoner != summonerShares");
        require(_proposalDeposit >= _processingReward, "_processingReward > _proposalDeposit");
        
        for (uint256 i = 0; i < _summoner.length; i++) {
            growGuild(_summoner[i], _summonerShares[i], 0);
        }
        
        require(totalShares <= MAX_GUILD_BOUND, "guild maxed");
        tokenWhitelist[_depositToken] = true;
        approvedTokens.push(_depositToken);
        
        if (_summonerDeposit > 0) {
            totalGuildBankTokens += 1;
            unsafeAddToBalance(GUILD, _depositToken, _summonerDeposit);
        }
        
        depositToken = _depositToken;
        stakeToken = _stakeToken;
        proposalDeposit = _proposalDeposit;
        processingReward = _processingReward;
        periodDuration = _periodDuration;
        votingPeriodLength = _votingPeriodLength;
        gracePeriodLength = _gracePeriodLength;
        dilutionBound = _dilutionBound;
        summoningTime = now;
        initialized = true;
    }
    
    /*****************
    PROPOSAL FUNCTIONS
    *****************/
    function submitProposal(
        address applicant,
        uint256 sharesRequested,
        uint256 lootRequested,
        uint256 tributeOffered,
        address tributeToken,
        uint256 paymentRequested,
        address paymentToken,
        bytes32 details
    ) external nonReentrant payable returns (uint256 proposalId) {
        require(sharesRequested.add(lootRequested) <= MAX_GUILD_BOUND, "guild maxed");
        require(tokenWhitelist[tributeToken], "tributeToken != whitelist");
        require(tokenWhitelist[paymentToken], "paymentToken != whitelist");
        require(applicant != GUILD && applicant != ESCROW && applicant != TOTAL, "applicant unreservable");
        require(members[applicant].jailed == 0, "applicant jailed");

        if (tributeOffered > 0 && userTokenBalances[GUILD][tributeToken] == 0) {
            require(totalGuildBankTokens < MAX_TOKEN_GUILDBANK_COUNT, "guildbank maxed");
        }
        
        // collect tribute from proposer & store it in MSTX until the proposal is processed - if ether, wrap into wETH
        if (tributeToken == wETH && msg.value > 0) {
            require(msg.value == tributeOffered, "!ethBalance");
            IWETH(wETH).deposit();
            (bool success, ) = wETH.call{value: msg.value}("");
            require(success, "!ethCall");
            IWETH(wETH).transfer(address(this), msg.value);
        } else {
            IERC20(tributeToken).safeTransferFrom(msg.sender, address(this), tributeOffered);
        }
        
        unsafeAddToBalance(ESCROW, tributeToken, tributeOffered);
        
        uint8[9] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action, withdrawal, standard]
        flags[8] = 1; // standard

        _submitProposal(applicant, sharesRequested, lootRequested, tributeOffered, tributeToken, paymentRequested, paymentToken, details, flags, "");
        
        return proposalCount - 1; // return proposalId - contracts calling submit might want it
    }
    
     function submitActionProposal( // stages arbitrary function calls for member vote - based on Raid Guild 'Minion'
        address actionTo, // target account for action (e.g., address to receive ether, token, dao, etc.)
        uint256 actionTokenAmount, // helps check outbound guild bank token amount does not exceed internal balance / amount to update bank if successful 
        uint256 actionValue, // ether value, if any, in call 
        bytes32 details, // details tx staged for member execution - as external, extra care should be applied in diligencing action 
        bytes calldata data // data for function call
    ) external returns (uint256 proposalId) {
        uint8[9] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action, withdrawal, standard]
        flags[6] = 1; // action
        
        _submitProposal(actionTo, 0, 0, actionValue, address(0), actionTokenAmount, address(0), details, flags, data);
        
        return proposalCount - 1;
    }

    function submitGuildKickProposal(address memberToKick, bytes32 details) external returns (uint256 proposalId) {
        Member memory member = members[memberToKick];
        require(member.shares > 0 || member.loot > 0, "!share||loot");
        require(members[memberToKick].jailed == 0, "jailed");
        uint8[9] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action, withdrawal, standard]
        flags[5] = 1; // guildkick

        _submitProposal(memberToKick, 0, 0, 0, address(0), 0, address(0), details, flags, "");
        
        return proposalCount - 1;
    }
    
    function submitWhitelistProposal(address tokenToWhitelist, bytes32 details) external returns (uint256 proposalId) {
        require(tokenToWhitelist != address(0), "!token");
        require(tokenToWhitelist != stakeToken, "tokenToWhitelist = stakeToken");
        require(!tokenWhitelist[tokenToWhitelist], "whitelisted");
        require(approvedTokens.length < MAX_TOKEN_WHITELIST_COUNT, "whitelist maxed");
        uint8[9] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action, withdrawal, standard]
        flags[4] = 1; // whitelist

        _submitProposal(address(0), 0, 0, 0, tokenToWhitelist, 0, address(0), details, flags, "");
        
        return proposalCount - 1;
    }
    
    function submitWithdrawalProposal(address withdrawalTo, bytes32 details) external returns (uint256 proposalId) {
        uint8[9] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action, withdrawal, standard]
        flags[7] = 1; // withdrawal

        _submitProposal(withdrawalTo, 0, 0, 0, address(0), 0, address(0), details, flags, "");
        
        return proposalCount - 1;
    }
   
    function _submitProposal(
        address applicant,
        uint256 sharesRequested,
        uint256 lootRequested,
        uint256 tributeOffered,
        address tributeToken,
        uint256 paymentRequested,
        address paymentToken,
        bytes32 details,
        uint8[9] memory flags,
        bytes memory data
    ) internal {
        Proposal memory proposal = Proposal({
            applicant : applicant,
            proposer : msg.sender,
            sponsor : address(0),
            tributeToken : tributeToken,
            paymentToken : paymentToken,
            flags : flags,
            sharesRequested : sharesRequested,
            lootRequested : lootRequested,
            paymentRequested : paymentRequested,
            tributeOffered : tributeOffered,
            startingPeriod : 0,
            yesVotes : 0,
            noVotes : 0,
            maxTotalSharesAndLootAtYesVote : 0,
            details : details
        });
        
        if (proposal.flags[6] == 1) {
            actions[proposalCount] = data;
        }
        
        proposals[proposalCount] = proposal;
        // NOTE: argument order matters, avoid stack too deep
        emit SubmitProposal(applicant, sharesRequested, lootRequested, tributeOffered, tributeToken, paymentRequested, paymentToken, details, flags, data, proposalCount, msg.sender, memberAddressByDelegateKey[msg.sender]);
        
        proposalCount += 1;
    }

    function sponsorProposal(uint256 proposalId) external nonReentrant onlyDelegate {
        // collect proposal deposit from sponsor & store it in MSTX until the proposal is processed
        IERC20(depositToken).safeTransferFrom(msg.sender, address(this), proposalDeposit);
        unsafeAddToBalance(ESCROW, depositToken, proposalDeposit);
        Proposal storage proposal = proposals[proposalId];
        require(proposal.proposer != address(0), "!proposed");
        require(proposal.flags[0] == 0, "sponsored");
        require(proposal.flags[3] == 0, "cancelled");
        require(members[proposal.applicant].jailed == 0, "applicant jailed");

        if (proposal.tributeOffered > 0 && userTokenBalances[GUILD][proposal.tributeToken] == 0) {
            require(totalGuildBankTokens < MAX_TOKEN_GUILDBANK_COUNT, "guildbank maxed");
        }

        // whitelist proposal
        if (proposal.flags[4] == 1) {
            require(!tokenWhitelist[address(proposal.tributeToken)], "whitelisted");
            require(!proposedToWhitelist[address(proposal.tributeToken)], "whitelist proposed");
            require(approvedTokens.length < MAX_TOKEN_WHITELIST_COUNT, "whitelist maxed");
            proposedToWhitelist[address(proposal.tributeToken)] = true;

        // guild kick proposal
        } else if (proposal.flags[5] == 1) {
            require(!proposedToKick[proposal.applicant], "kick proposed");
            proposedToKick[proposal.applicant] = true;
        }

        // compute startingPeriod for proposal
        uint256 startingPeriod = max(
            getCurrentPeriod(),
            proposalQueue.length == 0 ? 0 : proposals[proposalQueue[proposalQueue.length - 1]].startingPeriod
        ) + 1;

        proposal.startingPeriod = startingPeriod;
        proposal.sponsor = memberAddressByDelegateKey[msg.sender];
        proposal.flags[0] = 1; // sponsored
        // append proposal to the queue
        proposalQueue.push(proposalId);
        
        emit SponsorProposal(msg.sender, proposal.sponsor, proposalId, proposalQueue.length - 1, startingPeriod);
    }

    // NOTE: In MSTX, proposalIndex != proposalId
    function submitVote(uint256 proposalIndex, uint8 uintVote) external nonReentrant onlyDelegate {
        address memberAddress = memberAddressByDelegateKey[msg.sender];
        Member storage member = members[memberAddress];
        require(proposalIndex < proposalQueue.length, "!proposed");
        uint256 proposalId = proposalQueue[proposalIndex];
        Proposal storage proposal = proposals[proposalId];
        require(uintVote < 3, ">2");
        Vote vote = Vote(uintVote);
        require(getCurrentPeriod() >= proposal.startingPeriod, "pending");
        require(!hasVotingPeriodExpired(proposal.startingPeriod), "expired");
        require(proposal.votesByMember[memberAddress] == Vote.Null, "voted");
        require(vote == Vote.Yes || vote == Vote.No, "!Yes||No");
        proposal.votesByMember[memberAddress] = vote;

        if (vote == Vote.Yes) {
            proposal.yesVotes += member.shares;

            // set highest index (latest) yes vote - must be processed for member to ragequit
            if (proposalIndex > member.highestIndexYesVote) {
                member.highestIndexYesVote = proposalIndex;
            }

            // set maximum of total shares encountered at a yes vote - used to bound dilution for yes voters
            if (totalSupply > proposal.maxTotalSharesAndLootAtYesVote) {
                proposal.maxTotalSharesAndLootAtYesVote = totalSupply;
            }

        } else if (vote == Vote.No) {
            proposal.noVotes += member.shares;
        }
     
        // NOTE: subgraph indexes by proposalId not proposalIndex since proposalIndex isn't set until it's been sponsored but proposal is created on submission
        emit SubmitVote(proposalId, proposalIndex, msg.sender, memberAddress, uintVote);
    }

    function processProposal(uint256 proposalIndex) external nonReentrant {
        _validateProposalForProcessing(proposalIndex);
        uint256 proposalId = proposalQueue[proposalIndex];
        Proposal storage proposal = proposals[proposalId];
        require(proposal.flags[8] == 1, "!standard");
        proposal.flags[1] = 1; // processed
        
        bool didPass = _didPass(proposalIndex);
        // Make the proposal fail if the new total number of shares & loot exceeds the limit
        if (totalSupply.add(proposal.sharesRequested).add(proposal.lootRequested) > MAX_GUILD_BOUND) {
            didPass = false;
        }

        // Make the proposal fail if it is requesting more tokens as payment than the available guild bank balance
        if (proposal.paymentRequested > userTokenBalances[GUILD][proposal.paymentToken]) {
            didPass = false;
        }

        // Make the proposal fail if it would result in too many tokens with non-zero balance in guild bank
        if (proposal.tributeOffered > 0 && userTokenBalances[GUILD][proposal.tributeToken] == 0 && totalGuildBankTokens >= MAX_TOKEN_GUILDBANK_COUNT) {
            didPass = false;
        }

        // PROPOSAL PASSED
        if (didPass) {
            proposal.flags[2] = 1; // didPass

            growGuild(proposal.applicant, proposal.sharesRequested, proposal.lootRequested);

            // if the proposal tribute is the first token of its kind to make it into the guild bank, increment total guild bank tokens
            if (userTokenBalances[GUILD][proposal.tributeToken] == 0 && proposal.tributeOffered > 0) {
                totalGuildBankTokens += 1;
            }

            unsafeInternalTransfer(ESCROW, GUILD, proposal.tributeToken, proposal.tributeOffered);
            unsafeInternalTransfer(GUILD, proposal.applicant, proposal.paymentToken, proposal.paymentRequested);

            // if the proposal spends 100% of guild bank balance for a token, decrement total guild bank tokens
            if (userTokenBalances[GUILD][proposal.paymentToken] == 0 && proposal.paymentRequested > 0) {
                totalGuildBankTokens -= 1;
            }

        // PROPOSAL FAILED
        } else {
            // return all tokens to the proposer (not the applicant, because funds come from proposer)
            unsafeInternalTransfer(ESCROW, proposal.proposer, proposal.tributeToken, proposal.tributeOffered);
        }

        _returnDeposit(proposal.sponsor);
        
        emit ProcessProposal(proposalIndex, proposalId, didPass);
    }
    
     function processActionProposal(uint256 proposalIndex) external nonReentrant returns (bool, bytes memory) {
        _validateProposalForProcessing(proposalIndex);
        uint256 proposalId = proposalQueue[proposalIndex];
        bytes storage action = actions[proposalId];
        Proposal storage proposal = proposals[proposalId];
        require(proposal.flags[6] == 1, "!action");
        proposal.flags[1] = 1; // processed

        bool didPass = _didPass(proposalIndex);
        // Make the proposal fail if it is requesting more accounted tokens than the available guild bank balance
        if (tokenWhitelist[proposal.applicant] && proposal.paymentRequested > userTokenBalances[GUILD][proposal.applicant]) {
            didPass = false;
        }
        
        // Make the proposal fail if it is requesting more ether than the available local balance
        if (proposal.tributeOffered > address(this).balance) {
            didPass = false;
        }

        if (didPass) {
            proposal.flags[2] = 1; // didPass
            (bool success, bytes memory returnData) = proposal.applicant.call{value: proposal.tributeOffered}(action);
            if (tokenWhitelist[proposal.applicant]) {
                unsafeSubtractFromBalance(GUILD, proposal.applicant, proposal.paymentRequested);
                // if the action proposal spends 100% of guild bank balance for a token, decrement total guild bank tokens
                if (userTokenBalances[GUILD][proposal.applicant] == 0 && proposal.paymentRequested > 0) {totalGuildBankTokens -= 1;}
            }
            return (success, returnData);
        }
        
        _returnDeposit(proposal.sponsor);
        
        emit ProcessActionProposal(proposalIndex, proposalId, didPass);
    }

    function processGuildKickProposal(uint256 proposalIndex) external nonReentrant {
        _validateProposalForProcessing(proposalIndex);
        uint256 proposalId = proposalQueue[proposalIndex];
        Proposal storage proposal = proposals[proposalId];
        require(proposal.flags[5] == 1, "!kick");
        proposal.flags[1] = 1; // processed

        bool didPass = _didPass(proposalIndex);
        if (didPass) {
            proposal.flags[2] = 1; // didPass
            Member storage member = members[proposal.applicant];
            member.jailed = proposalIndex;
            // transfer shares to loot
            member.loot = member.loot.add(member.shares);
            totalShares = totalShares.sub(member.shares);
            totalLoot = totalLoot.add(member.shares);
            member.shares = 0; // revoke all shares
        }

        proposedToKick[proposal.applicant] = false;

        _returnDeposit(proposal.sponsor);
        
        emit ProcessGuildKickProposal(proposalIndex, proposalId, didPass);
    }
    
    function processWhitelistProposal(uint256 proposalIndex) external {
        _validateProposalForProcessing(proposalIndex);
        uint256 proposalId = proposalQueue[proposalIndex];
        Proposal storage proposal = proposals[proposalId];
        require(proposal.flags[4] == 1, "!whitelist");
        proposal.flags[1] = 1; // processed

        bool didPass = _didPass(proposalIndex);
        if (approvedTokens.length >= MAX_TOKEN_WHITELIST_COUNT) {
            didPass = false;
        }

        if (didPass) {
            proposal.flags[2] = 1; // didPass
            tokenWhitelist[address(proposal.tributeToken)] = true;
            approvedTokens.push(proposal.tributeToken);
        }

        proposedToWhitelist[address(proposal.tributeToken)] = false;

        _returnDeposit(proposal.sponsor);
        
        emit ProcessWhitelistProposal(proposalIndex, proposalId, didPass);
    }
    
    function processWithdrawalProposal(uint256 proposalIndex) external nonReentrant {
        _validateProposalForProcessing(proposalIndex);
        uint256 proposalId = proposalQueue[proposalIndex];
        Proposal storage proposal = proposals[proposalId];
        require(proposal.flags[7] == 1, "!withdrawal");
        proposal.flags[1] = 1; // processed

        bool didPass = _didPass(proposalIndex);
        if (didPass) {
            proposal.flags[2] = 1; // didPass
            for (uint256 i = 0; i < approvedTokens.length; i++) {
                // deliberately not using safemath here to keep overflows from preventing the function execution (which would break withdrawal)
                // if a token overflows, it is because the supply was artificially inflated to oblivion, so we probably don't care about it anyways
                uint256 withdrawalAmount = userTokenBalances[GUILD][approvedTokens[i]];
                userTokenBalances[GUILD][approvedTokens[i]] -= withdrawalAmount;
                userTokenBalances[proposal.applicant][approvedTokens[i]] += withdrawalAmount;
            }
            totalGuildBankTokens -= approvedTokens.length;
        }
        
        _returnDeposit(proposal.sponsor);
        
        emit ProcessWithdrawalProposal(proposalIndex, proposalId, didPass);
    }

    function _didPass(uint256 proposalIndex) internal view returns (bool didPass) {
        Proposal memory proposal = proposals[proposalQueue[proposalIndex]];
        
        if (proposal.yesVotes > proposal.noVotes) {
            didPass = true;
        }
        
        // Make the proposal fail if the dilutionBound is exceeded
        if ((totalSupply.mul(dilutionBound)) < proposal.maxTotalSharesAndLootAtYesVote) {
            didPass = false;
        }

        // Make the proposal fail if the applicant is jailed
        // - for standard proposals, we don't want the applicant to get any shares/loot/payment
        // - for guild kick proposals, we should never be able to propose to kick a jailed member (or have two kick proposals active), so it doesn't matter
        if (members[proposal.applicant].jailed != 0) {
            didPass = false;
        }

        return didPass;
    }

    function _validateProposalForProcessing(uint256 proposalIndex) internal view {
        require(proposalIndex < proposalQueue.length, "!proposal");
        Proposal memory proposal = proposals[proposalQueue[proposalIndex]];
        require(getCurrentPeriod() >= proposal.startingPeriod.add(votingPeriodLength).add(gracePeriodLength), "!ready");
        require(proposal.flags[1] == 0, "processed");
        require(proposalIndex == 0 || proposals[proposalQueue[proposalIndex - 1]].flags[1] == 1, "prior !processed");
    }

    function _returnDeposit(address sponsor) internal {
        unsafeInternalTransfer(ESCROW, msg.sender, depositToken, processingReward);
        unsafeInternalTransfer(ESCROW, sponsor, depositToken, proposalDeposit - processingReward);
    }

    function ragequit(uint256 sharesToBurn, uint256 lootToBurn) external nonReentrant {
        require(members[msg.sender].exists == 1, "!member");
        _ragequit(msg.sender, sharesToBurn, lootToBurn);
    }

    function _ragequit(address memberAddress, uint256 sharesToBurn, uint256 lootToBurn) internal {
        uint256 initialTotalSharesAndLoot = totalSupply;
        Member storage member = members[memberAddress];
        require(member.shares >= sharesToBurn, "!shares");
        require(member.loot >= lootToBurn, "!loot");
        require(canRagequit(member.highestIndexYesVote), "!ragequit until highest index proposal member voted YES processes");
        uint256 sharesAndLootToBurn = sharesToBurn.add(lootToBurn);

        // burn guild token, shares & loot
        balanceOf[memberAddress] = balanceOf[memberAddress].sub(sharesAndLootToBurn);
        member.shares = member.shares.sub(sharesToBurn);
        member.loot = member.loot.sub(lootToBurn);
        totalShares = totalShares.sub(sharesToBurn);
        totalLoot = totalLoot.sub(lootToBurn);
        totalSupply = totalShares.add(totalLoot);

        for (uint256 i = 0; i < approvedTokens.length; i++) {
            uint256 amountToRagequit = fairShare(userTokenBalances[GUILD][approvedTokens[i]], sharesAndLootToBurn, initialTotalSharesAndLoot);
            if (amountToRagequit > 0) { // gas optimization to allow a higher maximum token limit
                // deliberately not using safemath here to keep overflows from preventing the function execution (which would break ragekicks)
                // if a token overflows, it is because the supply was artificially inflated to oblivion, so we probably don't care about it anyways
                userTokenBalances[GUILD][approvedTokens[i]] -= amountToRagequit;
                userTokenBalances[memberAddress][approvedTokens[i]] += amountToRagequit;
            }
        }

        emit Ragequit(memberAddress, sharesToBurn, lootToBurn);
        emit Transfer(memberAddress, address(0), sharesAndLootToBurn);
    }

    function ragekick(address memberToKick) external nonReentrant onlyDelegate {
        Member storage member = members[memberToKick];
        require(member.jailed != 0, "!jailed");
        require(member.loot > 0, "!loot"); // note - should be impossible for jailed member to have shares
        require(canRagequit(member.highestIndexYesVote), "!ragequit until highest index proposal member voted YES processes");
        _ragequit(memberToKick, 0, member.loot);
    }
    
    function withdrawBalance(address token, uint256 amount) external nonReentrant {
        _withdrawBalance(token, amount);
    }

    function withdrawBalances(address[] calldata tokens, uint256[] calldata amounts, bool max) external nonReentrant {
        require(tokens.length == amounts.length, "tokens != amounts");
        for (uint256 i=0; i < tokens.length; i++) {
            uint256 withdrawAmount = amounts[i];
            if (max) { // withdraw the maximum balance
                withdrawAmount = userTokenBalances[msg.sender][tokens[i]];
            }
            _withdrawBalance(tokens[i], withdrawAmount);
        }
    }
    
    function _withdrawBalance(address token, uint256 amount) internal {
        require(userTokenBalances[msg.sender][token] >= amount, "!balance");
        IERC20(token).safeTransfer(msg.sender, amount);
        unsafeSubtractFromBalance(msg.sender, token, amount);
        emit Withdraw(msg.sender, token, amount);
    }

    function collectTokens(address token) external nonReentrant onlyDelegate {
        uint256 amountToCollect = IERC20(token).balanceOf(address(this)).sub(userTokenBalances[TOTAL][token]);
        // only collect if 1) there are tokens to collect & 2) token is whitelisted
        require(amountToCollect > 0, "!amount");
        require(tokenWhitelist[token], "!whitelisted");
        
        if (userTokenBalances[GUILD][token] == 0 && totalGuildBankTokens < MAX_TOKEN_GUILDBANK_COUNT) {totalGuildBankTokens += 1;}
        unsafeAddToBalance(GUILD, token, amountToCollect);

        emit TokensCollected(token, amountToCollect);
    }

    // NOTE: requires that delegate key which sent the original proposal cancels, msg.sender = proposal.proposer
    function cancelProposal(uint256 proposalId) external {
        Proposal storage proposal = proposals[proposalId];
        require(proposal.flags[0] == 0, "sponsored");
        require(proposal.flags[3] == 0, "cancelled");
        require(msg.sender == proposal.proposer, "!proposer");
        proposal.flags[3] = 1; // cancelled
       
        unsafeInternalTransfer(ESCROW, proposal.proposer, proposal.tributeToken, proposal.tributeOffered);
        
        emit CancelProposal(proposalId, msg.sender);
    }

    function updateDelegateKey(address newDelegateKey) external {
        require(members[msg.sender].shares > 0, "!shareholder");
        require(newDelegateKey != address(0), "newDelegateKey = 0");

        // skip checks if member is setting the delegate key to their member address
        if (newDelegateKey != msg.sender) {
            require(members[newDelegateKey].exists == 0, "!overwrite members");
            require(members[memberAddressByDelegateKey[newDelegateKey]].exists == 0, "!overwrite keys");
        }

        Member storage member = members[msg.sender];
        memberAddressByDelegateKey[member.delegateKey] = address(0);
        memberAddressByDelegateKey[newDelegateKey] = msg.sender;
        member.delegateKey = newDelegateKey;

        emit UpdateDelegateKey(msg.sender, newDelegateKey);
    }
    
    // can only ragequit if the latest proposal you voted YES on has been processed
    function canRagequit(uint256 highestIndexYesVote) public view returns (bool) {
        require(highestIndexYesVote < proposalQueue.length, "!proposal");
        return proposals[proposalQueue[highestIndexYesVote]].flags[1] == 1;
    }

    function hasVotingPeriodExpired(uint256 startingPeriod) public view returns (bool) {
        return getCurrentPeriod() >= startingPeriod.add(votingPeriodLength);
    }
    
    /***************
    GETTER FUNCTIONS
    ***************/
    function max(uint256 x, uint256 y) internal pure returns (uint256) {
        return x >= y ? x : y;
    }
    
    function getCurrentPeriod() public view returns (uint256) {
        return now.sub(summoningTime).div(periodDuration);
    }
    
    function getMemberProposalVote(address memberAddress, uint256 proposalIndex) external view returns (Vote) {
        require(members[memberAddress].exists == 1, "!member");
        require(proposalIndex < proposalQueue.length, "!proposed");
        return proposals[proposalQueue[proposalIndex]].votesByMember[memberAddress];
    }

    function getProposalFlags(uint256 proposalId) external view returns (uint8[9] memory) {
        return proposals[proposalId].flags;
    }
    
    function getProposalQueueLength() external view returns (uint256) {
        return proposalQueue.length;
    }
    
    function getTokenCount() external view returns (uint256) {
        return approvedTokens.length;
    }

    function getUserTokenBalance(address user, address token) external view returns (uint256) {
        return userTokenBalances[user][token];
    }
    
    /***************
    HELPER FUNCTIONS
    ***************/
    receive() external payable {}
    
    function fairShare(uint256 balance, uint256 shares, uint256 totalSharesAndLoot) internal pure returns (uint256) {
        require(totalSharesAndLoot != 0);

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

        uint256 prod = balance * shares;

        if (prod / balance == shares) { // no overflow in multiplication above?
            return prod / totalSharesAndLoot;
        }

        return (balance / totalSharesAndLoot) * shares;
    }
    
    function growGuild(address account, uint256 shares, uint256 loot) internal {
        // if the account is already a member, add to their existing shares & loot
        if (members[account].exists == 1) {
            members[account].shares = members[account].shares.add(shares);
            members[account].loot = members[account].loot.add(loot);

        // if the account is a new member, create a new record for them
        } else {
            // if new member is already taken by a member's delegateKey, reset it to their member address
            if (members[memberAddressByDelegateKey[account]].exists == 1) {
                address memberToOverride = memberAddressByDelegateKey[account];
                memberAddressByDelegateKey[memberToOverride] = memberToOverride;
                members[memberToOverride].delegateKey = memberToOverride;
            }
        
            members[account] = Member({
                delegateKey : account,
                exists : 1, // 'true'
                shares : shares,
                loot : loot.add(members[account].loot), // take into account loot from pre-membership transfers
                highestIndexYesVote : 0,
                jailed : 0
            });
            memberAddressByDelegateKey[account] = account;
        }
        
        uint256 sharesAndLoot = shares.add(loot);
        // mint new guild token, update total shares & loot 
        balanceOf[account] = balanceOf[account].add(sharesAndLoot);
        totalShares = totalShares.add(shares);
        totalLoot = totalLoot.add(loot);
        totalSupply = totalShares.add(totalLoot);
        
        emit Transfer(address(0), account, sharesAndLoot);
    }
    
    function unsafeAddToBalance(address user, address token, uint256 amount) internal {
        userTokenBalances[user][token] += amount;
        userTokenBalances[TOTAL][token] += amount;
    }
    
    function unsafeInternalTransfer(address from, address to, address token, uint256 amount) internal {
        unsafeSubtractFromBalance(from, token, amount);
        unsafeAddToBalance(to, token, amount);
    }

    function unsafeSubtractFromBalance(address user, address token, uint256 amount) internal {
        userTokenBalances[user][token] -= amount;
        userTokenBalances[TOTAL][token] -= amount;
    }
    
    /********************
    GUILD TOKEN FUNCTIONS
    ********************/
    function approve(address spender, uint256 amount) external returns (bool) {
        require(amount == 0 || allowance[msg.sender][spender] == 0);
        allowance[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function convertSharesToLoot(uint256 sharesToLoot) external nonReentrant {
        members[msg.sender].shares = members[msg.sender].shares.sub(sharesToLoot);
        members[msg.sender].loot = members[msg.sender].loot.add(sharesToLoot);
        totalShares = totalShares.sub(sharesToLoot);
        totalLoot = totalLoot.add(sharesToLoot);
        emit ConvertSharesToLoot(msg.sender, sharesToLoot);
    }
    
    function stakeTokenForShares(uint256 amount) external nonReentrant {
        IERC20(stakeToken).safeTransferFrom(msg.sender, address(this), amount); // deposit stake token & claim shares (1:1)
        growGuild(msg.sender, amount, 0);
        require(totalSupply <= MAX_GUILD_BOUND, "guild maxed");
        emit StakeTokenForShares(msg.sender, amount);
    }

    function transfer(address recipient, uint256 lootToTransfer) external returns (bool) {
        members[msg.sender].loot = members[msg.sender].loot.sub(lootToTransfer);
        members[recipient].loot = members[recipient].loot.add(lootToTransfer);
        balanceOf[msg.sender] = balanceOf[msg.sender].sub(lootToTransfer);
        balanceOf[recipient] = balanceOf[recipient].add(lootToTransfer);
        emit Transfer(msg.sender, recipient, lootToTransfer);
        return true;
    }
    
    function transferFrom(address sender, address recipient, uint256 lootToTransfer) external returns (bool) {
        allowance[sender][msg.sender] = allowance[sender][msg.sender].sub(lootToTransfer);
        members[sender].loot = members[sender].loot.sub(lootToTransfer);
        members[recipient].loot = members[recipient].loot.add(lootToTransfer);
        balanceOf[sender] = balanceOf[sender].sub(lootToTransfer);
        balanceOf[recipient] = balanceOf[recipient].add(lootToTransfer);
        emit Transfer(sender, recipient, lootToTransfer);
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"applicantAddress","type":"address"}],"name":"CancelProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ConvertSharesToLoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"didPass","type":"bool"}],"name":"ProcessActionProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"didPass","type":"bool"}],"name":"ProcessGuildKickProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"didPass","type":"bool"}],"name":"ProcessProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"didPass","type":"bool"}],"name":"ProcessWhitelistProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"didPass","type":"bool"}],"name":"ProcessWithdrawalProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"sharesToBurn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lootToBurn","type":"uint256"}],"name":"Ragequit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegateKey","type":"address"},{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startingPeriod","type":"uint256"}],"name":"SponsorProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeTokenForShares","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"applicant","type":"address"},{"indexed":false,"internalType":"uint256","name":"sharesRequested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lootRequested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tributeOffered","type":"uint256"},{"indexed":false,"internalType":"address","name":"tributeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"paymentRequested","type":"uint256"},{"indexed":false,"internalType":"address","name":"paymentToken","type":"address"},{"indexed":false,"internalType":"bytes32","name":"details","type":"bytes32"},{"indexed":false,"internalType":"uint8[9]","name":"flags","type":"uint8[9]"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"delegateKey","type":"address"},{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"}],"name":"SubmitProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"delegateKey","type":"address"},{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"uint8","name":"uintVote","type":"uint8"}],"name":"SubmitVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountToCollect","type":"uint256"}],"name":"TokensCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newDelegateKey","type":"address"}],"name":"UpdateDelegateKey","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"ESCROW","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GUILD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"actions","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"highestIndexYesVote","type":"uint256"}],"name":"canRagequit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancelProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"collectTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sharesToLoot","type":"uint256"}],"name":"convertSharesToLoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dilutionBound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"memberAddress","type":"address"},{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"getMemberProposalVote","outputs":[{"internalType":"enum MSTX.Vote","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalFlags","outputs":[{"internalType":"uint8[9]","name":"","type":"uint8[9]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProposalQueueLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getUserTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gracePeriodLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startingPeriod","type":"uint256"}],"name":"hasVotingPeriodExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositToken","type":"address"},{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address[]","name":"_summoner","type":"address[]"},{"internalType":"uint256[]","name":"_summonerShares","type":"uint256[]"},{"internalType":"uint256","name":"_summonerDeposit","type":"uint256"},{"internalType":"uint256","name":"_proposalDeposit","type":"uint256"},{"internalType":"uint256","name":"_processingReward","type":"uint256"},{"internalType":"uint256","name":"_periodDuration","type":"uint256"},{"internalType":"uint256","name":"_votingPeriodLength","type":"uint256"},{"internalType":"uint256","name":"_gracePeriodLength","type":"uint256"},{"internalType":"uint256","name":"_dilutionBound","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"memberAddressByDelegateKey","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"members","outputs":[{"internalType":"address","name":"delegateKey","type":"address"},{"internalType":"uint8","name":"exists","type":"uint8"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"loot","type":"uint256"},{"internalType":"uint256","name":"highestIndexYesVote","type":"uint256"},{"internalType":"uint256","name":"jailed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"processActionProposal","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"processGuildKickProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"processProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"processWhitelistProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"processWithdrawalProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"processingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"address","name":"applicant","type":"address"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"address","name":"sponsor","type":"address"},{"internalType":"address","name":"tributeToken","type":"address"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"sharesRequested","type":"uint256"},{"internalType":"uint256","name":"lootRequested","type":"uint256"},{"internalType":"uint256","name":"paymentRequested","type":"uint256"},{"internalType":"uint256","name":"tributeOffered","type":"uint256"},{"internalType":"uint256","name":"startingPeriod","type":"uint256"},{"internalType":"uint256","name":"yesVotes","type":"uint256"},{"internalType":"uint256","name":"noVotes","type":"uint256"},{"internalType":"uint256","name":"maxTotalSharesAndLootAtYesVote","type":"uint256"},{"internalType":"bytes32","name":"details","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"proposedToKick","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"proposedToWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"memberToKick","type":"address"}],"name":"ragekick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sharesToBurn","type":"uint256"},{"internalType":"uint256","name":"lootToBurn","type":"uint256"}],"name":"ragequit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"sponsorProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeTokenForShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"actionTo","type":"address"},{"internalType":"uint256","name":"actionTokenAmount","type":"uint256"},{"internalType":"uint256","name":"actionValue","type":"uint256"},{"internalType":"bytes32","name":"details","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"submitActionProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"memberToKick","type":"address"},{"internalType":"bytes32","name":"details","type":"bytes32"}],"name":"submitGuildKickProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"applicant","type":"address"},{"internalType":"uint256","name":"sharesRequested","type":"uint256"},{"internalType":"uint256","name":"lootRequested","type":"uint256"},{"internalType":"uint256","name":"tributeOffered","type":"uint256"},{"internalType":"address","name":"tributeToken","type":"address"},{"internalType":"uint256","name":"paymentRequested","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"bytes32","name":"details","type":"bytes32"}],"name":"submitProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"internalType":"uint8","name":"uintVote","type":"uint8"}],"name":"submitVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenToWhitelist","type":"address"},{"internalType":"bytes32","name":"details","type":"bytes32"}],"name":"submitWhitelistProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawalTo","type":"address"},{"internalType":"bytes32","name":"details","type":"bytes32"}],"name":"submitWithdrawalProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"summoningTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGuildBankTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLoot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"lootToTransfer","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"lootToTransfer","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDelegateKey","type":"address"}],"name":"updateDelegateKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"votingPeriodLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bool","name":"max","type":"bool"}],"name":"withdrawBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b506001600055615fd480620000266000396000f3fe6080604052600436106103d25760003560e01c80637a609641116101fd578063afe5475f11610118578063e0a8f6f5116100ab578063e681c4aa1161007a578063e681c4aa1461114a578063ea7b6ffd1461115f578063f2428621146111b4578063f5d54c77146111c9578063ff82cc6c146111de576103d9565b8063e0a8f6f514611099578063e1780345146110c3578063e1a0e3fa146110f6578063e63bc62d14611120576103d9565b8063c89039c5116100e7578063c89039c514611001578063da35c66414611016578063dd62ed3e1461102b578063dfdd369e14611066576103d9565b8063afe5475f14610f4a578063b2643aab14610f5f578063b470aade14610fc2578063c169591f14610fd7576103d9565b80639746d94011610190578063a3dc38001161015f578063a3dc380014610d41578063a42e01c114610d6b578063a4d2d9ec14610ed8578063a9059cbb14610f11576103d9565b80639746d94014610ca557806399653fbe14610ccf5780639d1722cb14610d025780639e96eb0f14610d17576103d9565b80638b15a605116101cc5780638b15a60514610bca5780639398573714610bdf5780639425a47614610c7b57806395d89b4114610527576103d9565b80637a60964114610b4c5780637d5b6c7214610b7657806383240f8314610b8b5780638340bbce14610bb5576103d9565b80633a98ef39116102ed578063635e99aa1161028057806373f8fd4b1161024f57806373f8fd4b14610ab4578063753d756314610aef57806378a8956714610b22578063797daf7014610b37576103d9565b8063635e99aa14610a1e57806363858f2d14610a335780636d4475eb14610a4857806370a0823114610a81576103d9565b80634482394b116102bc5780634482394b146108d057806351ed6a301461099d57806359999b41146109b25780635a8511ff146109e5576103d9565b80633a98ef391461082b5780633b214a74146108405780633fc24bba1461086a578063402c17941461089d576103d9565b806315eb349e116103655780632582bf2a116103345780632582bf2a1461078e57806327efc086146107c1578063313ce567146107d65780633793ab3c14610801576103d9565b806315eb349e146106c057806318160ddd146106f05780631dafede01461070557806323b872dd1461074b576103d9565b8063086146d2116103a1578063086146d2146105b157806308ae4b0c146105c6578063095ea7b3146106385780630cf20cc914610685576103d9565b8063013cf08b146103de57806303e32fa1146104a6578063044a0ca8146104cd57806306fdde0314610527576103d9565b366103d957005b600080fd5b3480156103ea57600080fd5b506104086004803603602081101561040157600080fd5b5035611289565b604051808f6001600160a01b031681526020018e6001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b031681526020018b6001600160a01b031681526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019e50505050505050505050505050505060405180910390f35b3480156104b257600080fd5b506104bb611308565b60408051918252519081900360200190f35b3480156104d957600080fd5b50610506600480360360408110156104f057600080fd5b506001600160a01b03813516906020013561130e565b6040518082600281111561051657fe5b815260200191505060405180910390f35b34801561053357600080fd5b5061053c611401565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561057657818101518382015260200161055e565b50505050905090810190601f1680156105a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105bd57600080fd5b506104bb611421565b3480156105d257600080fd5b506105f9600480360360208110156105e957600080fd5b50356001600160a01b0316611449565b604080516001600160a01b03909716875260ff9095166020870152858501939093526060850191909152608084015260a0830152519081900360c00190f35b34801561064457600080fd5b506106716004803603604081101561065b57600080fd5b506001600160a01b038135169060200135611489565b604080519115158252519081900360200190f35b34801561069157600080fd5b506106be600480360360408110156106a857600080fd5b506001600160a01b038135169060200135611529565b005b3480156106cc57600080fd5b506106be600480360360408110156106e357600080fd5b5080359060200135611587565b3480156106fc57600080fd5b506104bb611634565b34801561071157600080fd5b5061072f6004803603602081101561072857600080fd5b503561163a565b604080516001600160a01b039092168252519081900360200190f35b34801561075757600080fd5b506106716004803603606081101561076e57600080fd5b506001600160a01b03813581169160208101359091169060400135611661565b34801561079a57600080fd5b506106be600480360360208110156107b157600080fd5b50356001600160a01b03166117ba565b3480156107cd57600080fd5b5061072f6119d6565b3480156107e257600080fd5b506107eb6119dc565b6040805160ff9092168252519081900360200190f35b34801561080d57600080fd5b506106be6004803603602081101561082457600080fd5b50356119e1565b34801561083757600080fd5b506104bb611b9c565b34801561084c57600080fd5b506104bb6004803603602081101561086357600080fd5b5035611ba2565b34801561087657600080fd5b506106716004803603602081101561088d57600080fd5b50356001600160a01b0316611bc0565b3480156108a957600080fd5b5061072f600480360360208110156108c057600080fd5b50356001600160a01b0316611bd5565b3480156108dc57600080fd5b506106be600480360360608110156108f357600080fd5b810190602081018135600160201b81111561090d57600080fd5b82018360208201111561091f57600080fd5b803590602001918460208302840111600160201b8311171561094057600080fd5b919390929091602081019035600160201b81111561095d57600080fd5b82018360208201111561096f57600080fd5b803590602001918460208302840111600160201b8311171561099057600080fd5b9193509150351515611bf0565b3480156109a957600080fd5b5061072f611d36565b3480156109be57600080fd5b506106be600480360360208110156109d557600080fd5b50356001600160a01b0316611d45565b3480156109f157600080fd5b506104bb60048036036040811015610a0857600080fd5b506001600160a01b038135169060200135611fd7565b348015610a2a57600080fd5b506104bb612021565b348015610a3f57600080fd5b506104bb612027565b348015610a5457600080fd5b506104bb60048036036040811015610a6b57600080fd5b506001600160a01b03813516906020013561202d565b348015610a8d57600080fd5b506104bb60048036036020811015610aa457600080fd5b50356001600160a01b031661218f565b348015610ac057600080fd5b506104bb60048036036040811015610ad757600080fd5b506001600160a01b03813581169160200135166121a1565b348015610afb57600080fd5b5061067160048036036020811015610b1257600080fd5b50356001600160a01b03166121cc565b348015610b2e57600080fd5b506104bb6121e1565b348015610b4357600080fd5b506104bb6121e7565b348015610b5857600080fd5b506106be60048036036020811015610b6f57600080fd5b50356121ed565b348015610b8257600080fd5b506104bb6122ea565b348015610b9757600080fd5b5061053c60048036036020811015610bae57600080fd5b50356122f0565b348015610bc157600080fd5b506104bb61238b565b348015610bd657600080fd5b506104bb612391565b348015610beb57600080fd5b506104bb600480360360a0811015610c0257600080fd5b6001600160a01b038235169160208101359160408201359160608101359181019060a081016080820135600160201b811115610c3d57600080fd5b820183602082011115610c4f57600080fd5b803590602001918460018302840111600160201b83111715610c7057600080fd5b509092509050612397565b348015610c8757600080fd5b5061067160048036036020811015610c9e57600080fd5b503561240c565b348015610cb157600080fd5b506106be60048036036020811015610cc857600080fd5b5035612433565b348015610cdb57600080fd5b506106be60048036036040811015610cf257600080fd5b508035906020013560ff16612a18565b348015610d0e57600080fd5b506104bb612e0e565b348015610d2357600080fd5b506106be60048036036020811015610d3a57600080fd5b5035612e14565b348015610d4d57600080fd5b5061067160048036036020811015610d6457600080fd5b50356130a5565b348015610d7757600080fd5b506106be6004803603610160811015610d8f57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b811115610dc257600080fd5b820183602082011115610dd457600080fd5b803590602001918460208302840111600160201b83111715610df557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610e4457600080fd5b820183602082011115610e5657600080fd5b803590602001918460208302840111600160201b83111715610e7757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060208101359060408101359060608101359060808101359060a08101359060c00135613146565b348015610ee457600080fd5b506104bb60048036036040811015610efb57600080fd5b506001600160a01b038135169060200135613404565b348015610f1d57600080fd5b5061067160048036036040811015610f3457600080fd5b506001600160a01b03813516906020013561358b565b348015610f5657600080fd5b506104bb613688565b348015610f6b57600080fd5b50610f8960048036036020811015610f8257600080fd5b503561368e565b604051808261012080838360005b83811015610faf578181015183820152602001610f97565b5050505090500191505060405180910390f35b348015610fce57600080fd5b506104bb6136f7565b348015610fe357600080fd5b506106be60048036036020811015610ffa57600080fd5b50356136fd565b34801561100d57600080fd5b5061072f6137fe565b34801561102257600080fd5b506104bb61380d565b34801561103757600080fd5b506104bb6004803603604081101561104e57600080fd5b506001600160a01b0381358116916020013516613813565b34801561107257600080fd5b506106be6004803603602081101561108957600080fd5b50356001600160a01b0316613830565b3480156110a557600080fd5b506106be600480360360208110156110bc57600080fd5b50356139d1565b3480156110cf57600080fd5b50610671600480360360208110156110e657600080fd5b50356001600160a01b0316613b39565b34801561110257600080fd5b506106be6004803603602081101561111957600080fd5b5035613b4e565b34801561112c57600080fd5b506106be6004803603602081101561114357600080fd5b5035613d34565b34801561115657600080fd5b5061072f61409c565b6104bb600480360361010081101561117657600080fd5b506001600160a01b038135811691602081013591604082013591606081013591608082013581169160a08101359160c0820135169060e001356140a2565b3480156111c057600080fd5b5061072f614605565b3480156111d557600080fd5b5061072f61461d565b3480156111ea57600080fd5b506112086004803603602081101561120157600080fd5b5035614623565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561124d578181015183820152602001611235565b50505050905090810190601f16801561127a5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6017602052600090815260409020805460018201546002830154600384015460048501546006860154600787015460088801546009890154600a8a0154600b8b0154600c8c0154600d8d0154600e909d01546001600160a01b039c8d169d9b8d169c9a8b169b998b169a9098169896979596949593949293919290918e565b60045481565b6001600160a01b0382166000908152601a6020526040812054600160a01b900460ff1660011461136f576040805162461bcd60e51b815260206004820152600760248201526610b6b2b6b132b960c91b604482015290519081900360640190fd5b60165482106113b1576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b60176000601684815481106113c257fe5b6000918252602080832090910154835282810193909352604091820181206001600160a01b0387168252600f0190925290205460ff1690505b92915050565b6040518060400160405280600481526020016309aa6a8b60e31b81525081565b600061144460055461143e6009544261496990919063ffffffff16565b9061497e565b905090565b601a60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b03841694600160a01b90940460ff16939086565b60008115806114b957503360009081526012602090815260408083206001600160a01b0387168452909152902054155b6114c257600080fd5b3360008181526012602090815260408083206001600160a01b03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b6002600054141561156f576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b600260005561157e82826149a0565b50506001600055565b600260005414156115cd576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b60026000908155338152601a6020526040902054600160a01b900460ff16600114611629576040805162461bcd60e51b815260206004820152600760248201526610b6b2b6b132b960c91b604482015290519081900360640190fd5b61157e338383614a69565b600e5481565b6014818154811061164757fe5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b038316600090815260126020908152604080832033845290915281205461168f9083614969565b6001600160a01b0385166000818152601260209081526040808320338452825280832094909455918152601a90915220600201546116cd9083614969565b6001600160a01b038086166000908152601a602052604080822060029081019490945591861681522001546117029083614d97565b6001600160a01b038085166000908152601a602090815260408083206002019490945591871681526011909152205461173b9083614969565b6001600160a01b03808616600090815260116020526040808220939093559085168152205461176a9083614d97565b6001600160a01b038085166000818152601160209081526040918290209490945580518681529051919392881692600080516020615f3183398151915292918290030190a35060015b9392505050565b336000908152601a602052604090206001015461180d576040805162461bcd60e51b815260206004820152600c60248201526b10b9b430b932b437b63232b960a11b604482015290519081900360640190fd5b6001600160a01b03811661185d576040805162461bcd60e51b815260206004820152601260248201527106e657744656c65676174654b6579203d20360741b604482015290519081900360640190fd5b6001600160a01b038116331461194d576001600160a01b0381166000908152601a6020526040902054600160a01b900460ff16156118d7576040805162461bcd60e51b8152602060048201526012602482015271216f7665727772697465206d656d6265727360701b604482015290519081900360640190fd5b6001600160a01b038181166000908152601b60209081526040808320549093168252601a90522054600160a01b900460ff161561194d576040805162461bcd60e51b815260206004820152600f60248201526e216f7665727772697465206b65797360881b604482015290519081900360640190fd5b336000818152601a6020908152604080832080546001600160a01b039081168552601b845282852080546001600160a01b031990811690915590871680865294839020805482168717905581541684178155815193845290519093927fde7b64a369e10562cc2e71f0f1f944eaf144b75fead6ecb51fac9c4dd693488592908290030190a25050565b61deed81565b601281565b6119ea81614da9565b6000601682815481106119f957fe5b60009182526020808320919091015480835260179091526040909120600581015491925090600160201b900460ff16600114611a69576040805162461bcd60e51b815260206004820152600a602482015269085dda1a5d195b1a5cdd60b21b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000611a8584615075565b60145490915061019011611a97575060005b8015611b285760058201805462ff00001916620100001790556003820180546001600160a01b039081166000908152601560205260408120805460ff1916600190811790915592546014805494850181559091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9092018054929091166001600160a01b03199092169190911790555b60038201546001600160a01b039081166000908152601860205260409020805460ff191690556002830154611b5d911661520e565b6040805182151581529051849186917f2094fc13d2ecb0acd6861e82bd006c7e5ab6f312ec0c6cdfe3d1a01ee54d885a9181900360200190a350505050565b600c5481565b60168181548110611baf57fe5b600091825260209091200154905081565b60196020526000908152604090205460ff1681565b601b602052600090815260409020546001600160a01b031681565b60026000541415611c36576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b6002600055838214611c83576040805162461bcd60e51b8152602060048201526011602482015270746f6b656e7320213d20616d6f756e747360781b604482015290519081900360640190fd5b60005b84811015611d29576000848483818110611c9c57fe5b9050602002013590508215611cfb5733600090815260136020526040812090888885818110611cc757fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000205490505b611d20878784818110611d0a57fe5b905060200201356001600160a01b0316826149a0565b50600101611c86565b5050600160005550505050565b6002546001600160a01b031681565b60026000541415611d8b576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b60026000908155338152601b60209081526040808320546001600160a01b03168352601a909152902060010154611df5576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b6001600160a01b03811660008181527ff70de54536712c8ff8e72cff9589e58e41f45f6aceb543b6c431cd10034dc475602090815260408083205481516370a0823160e01b815230600482015291519394611ea194919390926370a082319260248083019392829003018186803b158015611e6f57600080fd5b505afa158015611e83573d6000803e3d6000fd5b505050506040513d6020811015611e9957600080fd5b505190614969565b905060008111611ee2576040805162461bcd60e51b815260206004820152600760248201526608585b5bdd5b9d60ca1b604482015290519081900360640190fd5b6001600160a01b03821660009081526015602052604090205460ff16611f3e576040805162461bcd60e51b815260206004820152600c60248201526b085dda1a5d195b1a5cdd195960a21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600080516020615f118339815191526020526040902054158015611f73575060c8600f54105b15611f8257600f805460010190555b611f8f61dead8383615255565b6040805182815290516001600160a01b038416917f9381e53ffdc9733a6783a6f8665be3f89c231bb81a6771996ed553b4e75c0fe3919081900360200190a250506001600055565b6000611fe1615c93565b600160e08201526040805160208101909152600080825261201291869190819081908190819081908b908a906152b3565b5050600b546000190192915050565b600d5481565b60075481565b6000612037615cb2565b506001600160a01b038381166000908152601a6020908152604091829020825160c08101845281549485168152600160a01b90940460ff1691840191909152600181015491830182905260028101546060840152600381015460808401526004015460a08301521515806120af575060008160600151115b6120ef576040805162461bcd60e51b815260206004820152600c60248201526b085cda185c995f1f1b1bdbdd60a21b604482015290519081900360640190fd5b6001600160a01b0384166000908152601a602052604090206004015415612146576040805162461bcd60e51b81526020600482015260066024820152651a985a5b195960d21b604482015290519081900360640190fd5b61214e615c93565b600160a08201526040805160208101909152600080825261217f91879190819081908190819081908c908a906152b3565b5050600b54600019019392505050565b60116020526000908152604090205481565b6001600160a01b03918216600090815260136020908152604080832093909416825291909152205490565b60156020526000908152604090205460ff1681565b60145490565b60165490565b60026000541415612233576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b60026000908155338152601a60205260409020600101546122549082614969565b336000908152601a602052604090206001810191909155600201546122799082614d97565b336000908152601a6020526040902060020155600c546122999082614969565b600c55600d546122a99082614d97565b600d5560408051828152905133917f919a31da3abe80797e98aa9c2c7f702e81362432ae3e701295d162ceee68101b919081900360200190a2506001600055565b60095481565b60106020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156123835780601f1061235857610100808354040283529160200191612383565b820191906000526020600020905b81548152906001019060200180831161236657829003601f168201915b505050505081565b60065481565b60035481565b60006123a1615c93565b600160c0820152604080516020601f86018190048102820181019092528481526123f9918a9160009182918b9183918e9183918e918b91908f908f90819084018382808284376000920191909152506152b392505050565b5050600b54600019019695505050505050565b600061242360065483614d9790919063ffffffff16565b61242b611421565b101592915050565b60026000541415612479576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b60026000908155338152601b60209081526040808320546001600160a01b03168352601a9091529020600101546124e3576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b600354600154612502916001600160a01b039091169033903090615624565b6001546003546125219161deaf916001600160a01b0390911690615255565b600081815260176020526040902060018101546001600160a01b031661257a576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b600581015460ff16156125c0576040805162461bcd60e51b81526020600482015260096024820152681cdc1bdb9cdbdc995960ba1b604482015290519081900360640190fd5b60058101546301000000900460ff161561260d576040805162461bcd60e51b815260206004820152600960248201526818d85b98d95b1b195960ba1b604482015290519081900360640190fd5b80546001600160a01b03166000908152601a60205260409020600401541561266f576040805162461bcd60e51b815260206004820152601060248201526f185c1c1b1a58d85b9d081a985a5b195960821b604482015290519081900360640190fd5b600081600901541180156126aa575060038101546001600160a01b03166000908152600080516020615f118339815191526020526040902054155b156126f85760c8600f54106126f8576040805162461bcd60e51b815260206004820152600f60248201526e19dd5a5b1918985b9ac81b585e1959608a1b604482015290519081900360640190fd5b6005810154600160201b900460ff166001141561284c5760038101546001600160a01b031660009081526015602052604090205460ff161561276f576040805162461bcd60e51b815260206004820152600b60248201526a1dda1a5d195b1a5cdd195960aa1b604482015290519081900360640190fd5b60038101546001600160a01b031660009081526018602052604090205460ff16156127d6576040805162461bcd60e51b81526020600482015260126024820152711dda1a5d195b1a5cdd081c1c9bdc1bdcd95960721b604482015290519081900360640190fd5b60145461019011612820576040805162461bcd60e51b815260206004820152600f60248201526e1dda1a5d195b1a5cdd081b585e1959608a1b604482015290519081900360640190fd5b60038101546001600160a01b03166000908152601860205260409020805460ff191660011790556128e9565b600581015465010000000000900460ff16600114156128e95780546001600160a01b031660009081526019602052604090205460ff16156128c4576040805162461bcd60e51b815260206004820152600d60248201526c1ada58dac81c1c9bdc1bdcd959609a1b604482015290519081900360640190fd5b80546001600160a01b03166000908152601960205260409020805460ff191660011790555b60006129406128f6611421565b601654156129385760168054601791600091600019810190811061291657fe5b90600052602060002001548152602001908152602001600020600a015461293b565b60005b615684565b6001908101600a8401819055336000818152601b60209081526040808320546002890180546001600160a01b0319166001600160a01b0392831617815560058a01805460ff191689179055601680549889018155948590527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242899097018a90559554925481518a8152600019909101928101929092528181018590525193955093169290917f2a383a979381335e3eb401ac01dd8083e024ff0256bf5338456ffc0063390bbd9181900360600190a35050600160005550565b60026000541415612a5e576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b60026000908155338152601b60209081526040808320546001600160a01b03168352601a909152902060010154612ac8576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b336000908152601b60209081526040808320546001600160a01b0316808452601a9092529091206016548410612b31576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b600060168581548110612b4057fe5b600091825260208083209091015480835260179091526040909120909150600360ff861610612b9b576040805162461bcd60e51b81526020600482015260026024820152611f1960f11b604482015290519081900360640190fd5b60008560ff166002811115612bac57fe5b905081600a0154612bbb611421565b1015612bf8576040805162461bcd60e51b815260206004820152600760248201526670656e64696e6760c81b604482015290519081900360640190fd5b612c0582600a015461240c565b15612c41576040805162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f8301602052604081205460ff166002811115612c6a57fe5b14612ca4576040805162461bcd60e51b81526020600482015260056024820152641d9bdd195960da1b604482015290519081900360640190fd5b6001816002811115612cb257fe5b1480612cc957506002816002811115612cc757fe5b145b612d05576040805162461bcd60e51b8152602060048201526008602482015267215965737c7c4e6f60c01b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f830160205260409020805482919060ff19166001836002811115612d3657fe5b02179055506001816002811115612d4957fe5b1415612d8f576001840154600b8301805490910190556003840154871115612d7357600384018790555b81600d0154600e541115612d8a57600e54600d8301555b612db4565b6002816002811115612d9d57fe5b1415612db4576001840154600c8301805490910190555b6040805184815260ff8816602082015281516001600160a01b0388169233928b927f804f03797630bf8b8a46b9371608abbf7d78a20df720e477bab641957ca68a20929181900390910190a4505060016000555050505050565b600f5481565b60026000541415612e5a576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b6002600055612e6881614da9565b600060168281548110612e7757fe5b60009182526020808320919091015480835260179091526040909120600581015491925090670100000000000000900460ff16600114612eec576040805162461bcd60e51b815260206004820152600b60248201526a085dda5d1a191c985dd85b60aa1b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000612f0884615075565b9050801561304a5760058201805462ff000019166201000017905560005b60145481101561303b5761dead6000908152601360205260148054600080516020615f1183398151915291839185908110612f5d57fe5b60009182526020808320909101546001600160a01b0316835282810193909352604090910181205461dead82526013909252601480549293508392600080516020615f1183398151915292919086908110612fb457fe5b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822080549590950390945587549092168252601390925290812060148054849391908690811061300757fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190208054909101905550600101612f26565b50601454600f80549190910390555b6002820154613061906001600160a01b031661520e565b6040805182151581529051849186917f7b76f1f32124f1887f0f0a8b6b0e131e672e39b2ab0c2df506bf17f407e72fee9181900360200190a3505060016000555050565b60165460009082106130ea576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd85b60ba1b604482015290519081900360640190fd5b60176000601684815481106130fb57fe5b9060005260206000200154815260200190815260200160002060050160016009811061312357fe5b602091828204019190069054906101000a900460ff1660ff166001149050919050565b600a5460ff161561318c576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9a5d1a585b1a5e995960aa1b604482015290519081900360640190fd5b896001600160a01b03168b6001600160a01b031614156131f3576040805162461bcd60e51b815260206004820152601960248201527f6465706f736974546f6b656e203d207374616b65546f6b656e00000000000000604482015290519081900360640190fd5b8751895114613249576040805162461bcd60e51b815260206004820152601a60248201527f73756d6d6f6e657220213d2073756d6d6f6e6572536861726573000000000000604482015290519081900360640190fd5b848610156132885760405162461bcd60e51b8152600401808060200182810382526024815260200180615f516024913960400191505060405180910390fd5b60005b89518110156132ce576132c68a82815181106132a357fe5b60200260200101518a83815181106132b757fe5b6020026020010151600061569b565b60010161328b565b506ec097ce7bc90715b34b9f1000000000600c541115613323576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b6001600160a01b038b166000818152601560205260408120805460ff191660019081179091556014805491820181559091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b031916909117905586156133a457600f805460010190556133a461dead8c89615255565b600180546001600160a01b039c8d166001600160a01b0319918216178255600280549c909d169b169a909a17909a5560039490945560049290925560055560065560075550505060089190915542600955600a805460ff19169091179055565b60006001600160a01b03831661344a576040805162461bcd60e51b815260206004820152600660248201526510ba37b5b2b760d11b604482015290519081900360640190fd5b6002546001600160a01b03848116911614156134ad576040805162461bcd60e51b815260206004820152601d60248201527f746f6b656e546f57686974656c697374203d207374616b65546f6b656e000000604482015290519081900360640190fd5b6001600160a01b03831660009081526015602052604090205460ff1615613509576040805162461bcd60e51b815260206004820152600b60248201526a1dda1a5d195b1a5cdd195960aa1b604482015290519081900360640190fd5b60145461019011613553576040805162461bcd60e51b815260206004820152600f60248201526e1dda1a5d195b1a5cdd081b585e1959608a1b604482015290519081900360640190fd5b61355b615c93565b6001608082015260408051602081019091526000808252612012918190819081908990829081908b908a906152b3565b336000908152601a60205260408120600201546135a89083614969565b336000908152601a60205260408082206002908101939093556001600160a01b0386168252902001546135db9083614d97565b6001600160a01b0384166000908152601a60209081526040808320600201939093553382526011905220546136109083614969565b33600090815260116020526040808220929092556001600160a01b0385168152205461363c9083614d97565b6001600160a01b038416600081815260116020908152604091829020939093558051858152905191923392600080516020615f318339815191529281900390910190a350600192915050565b60085481565b613696615c93565b6000828152601760205260408082208151610120810192839052926005909101916009918390855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116136be575094979650505050505050565b60055481565b60026000541415613743576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b6002600081905554613760906001600160a01b0316333084615624565b61376c3382600061569b565b6ec097ce7bc90715b34b9f1000000000600e5411156137c0576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b60408051828152905133917f83b37e7ebc9b774fe613926f7f5dd4594c0f8d39e7ca0169a9f6810011f2b6f8919081900360200190a2506001600055565b6001546001600160a01b031681565b600b5481565b601260209081526000928352604080842090915290825290205481565b60026000541415613876576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b60026000908155338152601b60209081526040808320546001600160a01b03168352601a9091529020600101546138e0576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b6001600160a01b0381166000908152601a602052604090206004810154613938576040805162461bcd60e51b8152602060048201526007602482015266085a985a5b195960ca1b604482015290519081900360640190fd5b6000816002015411613979576040805162461bcd60e51b8152602060048201526005602482015264085b1bdbdd60da1b604482015290519081900360640190fd5b61398681600301546130a5565b6139c15760405162461bcd60e51b8152600401808060200182810382526041815260200180615eb06041913960600191505060405180910390fd5b61157e8260008360020154614a69565b6000818152601760205260409020600581015460ff1615613a25576040805162461bcd60e51b81526020600482015260096024820152681cdc1bdb9cdbdc995960ba1b604482015290519081900360640190fd5b60058101546301000000900460ff1615613a72576040805162461bcd60e51b815260206004820152600960248201526818d85b98d95b1b195960ba1b604482015290519081900360640190fd5b60018101546001600160a01b03163314613abf576040805162461bcd60e51b815260206004820152600960248201526810b83937b837b9b2b960b91b604482015290519081900360640190fd5b60058101805463ff00000019166301000000179055600181015460038201546009830154613aff9261deaf926001600160a01b0391821692911690615957565b60408051338152905183917fc215fed6680bb02d323dc3f8b8f85241572607538426059c9232601bd293c3be919081900360200190a25050565b60186020526000908152604090205460ff1681565b60026000541415613b94576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b6002600055613ba281614da9565b600060168281548110613bb157fe5b6000918252602080832091909101548083526017909152604090912060058101549192509065010000000000900460ff16600114613c1e576040805162461bcd60e51b8152602060048201526005602482015264216b69636b60d81b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000613c3a84615075565b90508015613cbe5760058201805462ff000019166201000017905581546001600160a01b03166000908152601a602052604090206004810185905560018101546002820154613c8891614d97565b60028201556001810154600c54613c9e91614969565b600c556001810154600d54613cb291614d97565b600d5560006001909101555b81546001600160a01b039081166000908152601960205260409020805460ff191690556002830154613cf0911661520e565b6040805182151581529051849186917f0e347d00d3e9e6cdff9e6c09092c9ff1bd448f9b3dfb7091b30939ec5e7a3c739181900360200190a3505060016000555050565b60026000541415613d7a576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b6002600055613d8881614da9565b600060168281548110613d9757fe5b6000918252602080832091909101548083526017909152604090912060058101549192509068010000000000000000900460ff16600114613e0b576040805162461bcd60e51b8152602060048201526009602482015268085cdd185b99185c9960ba1b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000613e2784615075565b90506ec097ce7bc90715b34b9f1000000000613e608360070154613e5a8560060154600e54614d9790919063ffffffff16565b90614d97565b1115613e6a575060005b60048201546001600160a01b03166000908152600080516020615f11833981519152602052604090205460088301541115613ea3575060005b60008260090154118015613ede575060038201546001600160a01b03166000908152600080516020615f118339815191526020526040902054155b8015613eed575060c8600f5410155b15613ef6575060005b80156140165760058201805462ff0000191662010000179055815460068301546007840154613f2f926001600160a01b0316919061569b565b60038201546001600160a01b03166000908152600080516020615f118339815191526020526040902054158015613f6a575060008260090154115b15613f7957600f805460010190555b60038201546009830154613f9e9161deaf9161dead916001600160a01b031690615957565b815460048301546008840154613fc69261dead926001600160a01b0391821692911690615957565b60048201546001600160a01b03166000908152600080516020615f118339815191526020526040902054158015614001575060008260080154115b1561401157600f80546000190190555b614041565b6001820154600383015460098401546140419261deaf926001600160a01b0391821692911690615957565b6002820154614058906001600160a01b031661520e565b6040805182151581529051849186917f86f74240ecee9e4230d26ff92e17fee978460d9c0f78f5c88b2864c9e7a494279181900360200190a3505060016000555050565b61deaf81565b6000600260005414156140ea576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b60026000556ec097ce7bc90715b34b9f10000000006141098989614d97565b111561414a576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b6001600160a01b03851660009081526015602052604090205460ff166141b7576040805162461bcd60e51b815260206004820152601960248201527f74726962757465546f6b656e20213d2077686974656c69737400000000000000604482015290519081900360640190fd5b6001600160a01b03831660009081526015602052604090205460ff16614224576040805162461bcd60e51b815260206004820152601960248201527f7061796d656e74546f6b656e20213d2077686974656c69737400000000000000604482015290519081900360640190fd5b6001600160a01b03891661dead1480159061424a57506001600160a01b03891661deaf14155b801561426157506001600160a01b03891661deed14155b6142ab576040805162461bcd60e51b81526020600482015260166024820152756170706c6963616e7420756e72657365727661626c6560501b604482015290519081900360640190fd5b6001600160a01b0389166000908152601a60205260409020600401541561430c576040805162461bcd60e51b815260206004820152601060248201526f185c1c1b1a58d85b9d081a985a5b195960821b604482015290519081900360640190fd5b60008611801561433f57506001600160a01b0385166000908152600080516020615f118339815191526020526040902054155b1561438d5760c8600f541061438d576040805162461bcd60e51b815260206004820152600f60248201526e19dd5a5b1918985b9ac81b585e1959608a1b604482015290519081900360640190fd5b6001600160a01b03851673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21480156143b95750600034115b1561458f57853414614400576040805162461bcd60e51b815260206004820152600b60248201526a2165746842616c616e636560a81b604482015290519081900360640190fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561444f57600080fd5b505af1158015614463573d6000803e3d6000fd5b50506040516000925073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2915034908381818185875af1925050503d80600081146144bd576040519150601f19603f3d011682016040523d82523d6000602084013e6144c2565b606091505b5050905080614503576040805162461bcd60e51b815260206004820152600860248201526708595d1a10d85b1b60c21b604482015290519081900360640190fd5b6040805163a9059cbb60e01b8152306004820152346024820152905173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29163a9059cbb9160448083019260209291908290030181600087803b15801561455c57600080fd5b505af1158015614570573d6000803e3d6000fd5b505050506040513d602081101561458657600080fd5b506145a4915050565b6145a46001600160a01b038616333089615624565b6145b161deaf8688615255565b6145b9615c93565b60016101008201526040805160208101909152600081526145eb908b908b908b908b908b908b908b908b908a906152b3565b5050600b5460001901600160005598975050505050505050565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61dead81565b600060606002600054141561466d576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b600260005561467b83614da9565b60006016848154811061468a57fe5b6000918252602080832091909101548083526010825260408084206017909352909220600581015492935090916601000000000000900460ff16600114614702576040805162461bcd60e51b815260206004820152600760248201526610b0b1ba34b7b760c91b604482015290519081900360640190fd5b60058101805461ff001916610100179055600061471e87615075565b82546001600160a01b031660009081526015602052604090205490915060ff168015614773575081546001600160a01b03166000908152600080516020615f1183398151915260205260409020546008830154115b1561477c575060005b478260090154111561478c575060005b80156149085760058201805462ff00001916620100001790558154600983015460405185546000936060936001600160a01b03909116929091889190819083906002600019600183161561010002019091160480156148225780601f10614800576101008083540402835291820191614822565b820191906000526020600020905b81548152906001019060200180831161480e575b505091505060006040518083038185875af1925050503d8060008114614864576040519150601f19603f3d011682016040523d82523d6000602084013e614869565b606091505b5085546001600160a01b0316600090815260156020526040902054919350915060ff16156148f957835460088501546148b19161dead916001600160a01b039091169061596d565b83546001600160a01b03166000908152600080516020615f1183398151915260205260409020541580156148e9575060008460080154115b156148f957600f80546000190190555b909650945061495d9350505050565b600282015461491f906001600160a01b031661520e565b6040805182151581529051859189917f225ab65268ea3d2f5b1ed97e7d032147f17bba561ef01b819bfe3832bc05b0339181900360200190a3505050505b60016000559092909150565b60008282111561497857600080fd5b50900390565b600080821161498c57600080fd5b600082848161499757fe5b04949350505050565b3360009081526013602090815260408083206001600160a01b0386168452909152902054811115614a03576040805162461bcd60e51b81526020600482015260086024820152672162616c616e636560c01b604482015290519081900360640190fd5b614a176001600160a01b03831633836159cd565b614a2233838361596d565b604080516001600160a01b038416815260208101839052815133927f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb928290030190a25050565b600e546001600160a01b0384166000908152601a602052604090206001810154841115614ac7576040805162461bcd60e51b81526020600482015260076024820152662173686172657360c81b604482015290519081900360640190fd5b8281600201541015614b08576040805162461bcd60e51b8152602060048201526005602482015264085b1bdbdd60da1b604482015290519081900360640190fd5b614b1581600301546130a5565b614b505760405162461bcd60e51b8152600401808060200182810382526041815260200180615eb06041913960600191505060405180910390fd5b6000614b5c8585614d97565b6001600160a01b038716600090815260116020526040902054909150614b829082614969565b6001600160a01b0387166000908152601160205260409020556001820154614baa9086614969565b60018301556002820154614bbe9085614969565b6002830155600c54614bd09086614969565b600c55600d54614be09085614969565b600d819055600c54614bf191614d97565b600e5560005b601454811015614d1c5761dead6000908152601360205260148054614c5f91600080516020615f118339815191529184919086908110614c3357fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548487615a24565b90508015614d135761dead60009081526013602052601480548392600080516020615f1183398151915292909186908110614c9657fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220805495909503909455918b1682526013909252908120601480548493919086908110614ce757fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805490910190555b50600101614bf7565b50604080518681526020810186905281516001600160a01b038916927fcad1a1c68982832d9abc314de8a1e5d5e8c81b0588961e360766736d10c3be1a928290030190a26040805182815290516000916001600160a01b03891691600080516020615f318339815191529181900360200190a3505050505050565b6000828201838110156117b357600080fd5b6016548110614deb576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd85b60ba1b604482015290519081900360640190fd5b614df3615cf4565b6017600060168481548110614e0457fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b03908116825260018301548116958201959095526002820154851681850152600382015485166060820152600482015490941660808501528251610120810193849052909260a085019260058501916009918390855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411614e8b5790505050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e820154815250509050614f3e600754613e5a600654846101400151614d9790919063ffffffff16565b614f46611421565b1015614f82576040805162461bcd60e51b815260206004820152600660248201526521726561647960d01b604482015290519081900360640190fd5b60a08101516020015160ff1615614fcc576040805162461bcd60e51b81526020600482015260096024820152681c1c9bd8d95cdcd95960ba1b604482015290519081900360640190fd5b81158061502d57506017600060166001850381548110614fe857fe5b9060005260206000200154815260200190815260200160002060050160016009811061501057fe5b602091828204019190069054906101000a900460ff1660ff166001145b615071576040805162461bcd60e51b815260206004820152601060248201526f1c1c9a5bdc88085c1c9bd8d95cdcd95960821b604482015290519081900360640190fd5b5050565b600061507f615cf4565b601760006016858154811061509057fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b03908116825260018301548116958201959095526002820154851681850152600382015485166060820152600482015490941660808501528251610120810193849052909260a085019260058501916009918390855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116151175790505050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e82015481525050905080610180015181610160015111156151c157600191505b6101a0810151600854600e546151d691615a78565b10156151e157600091505b80516001600160a01b03166000908152601a60205260409020600401541561520857600091505b50919050565b60015460045461522d9161deaf9133916001600160a01b031690615957565b6001546004546003546152529261deaf9285926001600160a01b039092169103615957565b50565b6001600160a01b0392831660009081526013602090815260408083209490951682529283528381208054830190557ff70de54536712c8ff8e72cff9589e58e41f45f6aceb543b6c431cd10034dc47590925291902080549091019055565b6152bb615cf4565b604051806101e001604052808c6001600160a01b03168152602001336001600160a01b0316815260200160006001600160a01b03168152602001886001600160a01b03168152602001866001600160a01b031681526020018481526020018b81526020018a8152602001878152602001898152602001600081526020016000815260200160008152602001600081526020018581525090508060a0015160066009811061536457fe5b602002015160ff166001141561539857600b546000908152601060209081526040909120835161539692850190615d74565b505b600b54600090815260176020908152604091829020835181546001600160a01b03199081166001600160a01b03928316178355928501516001830180548516918316919091179055928401516002820180548416918516919091179055606084015160038201805484169185169190911790556080840151600482018054909316931692909217905560a08201518291906154399060058301906009615df2565b5060c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c01556101a082015181600d01556101c082015181600e0155905050601b6000336001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b03168c6001600160a01b03167f7cb968086968ca711ceb9da54f994af4c4ea21283e4ef4518c98d6e6e9b8b9248d8d8d8d8d8d8d8d8d600b54604051808b81526020018a8152602001898152602001886001600160a01b03168152602001878152602001866001600160a01b0316815260200185815260200184600960200280838360005b8381101561558557818101518382015260200161556d565b5050505090500180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156155cb5781810151838201526020016155b3565b50505050905090810190601f1680156155f85780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a45050600b80546001019055505050505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261567e908590615a9f565b50505050565b60008183101561569457816117b3565b5090919050565b6001600160a01b0383166000908152601a6020526040902054600160a01b900460ff166001141561573b576001600160a01b0383166000908152601a60205260409020600101546156ec9083614d97565b6001600160a01b0384166000908152601a6020526040902060018101919091556002015461571a9082614d97565b6001600160a01b0384166000908152601a60205260409020600201556158a6565b6001600160a01b038084166000908152601b60209081526040808320549093168252601a9052205460ff600160a01b90910416600114156157c3576001600160a01b038084166000908152601b602090815260408083205490931680835283832080546001600160a01b03199081168317909155601a90925292909120805490911690911790555b6040805160c0810182526001600160a01b03851680825260016020808401919091528284018690526000918252601a90529190912060020154606082019061580c908490614d97565b81526000602080830182905260409283018290526001600160a01b03808816808452601a8352848420865181548886015160ff16600160a01b0260ff60a01b19929095166001600160a01b03199182161791909116939093178155868601516001820155606087015160028201556080870151600382015560a090960151600490960195909555601b909152919020805490911690911790555b60006158b28383614d97565b6001600160a01b0385166000908152601160205260409020549091506158d89082614d97565b6001600160a01b038516600090815260116020526040902055600c546158fe9084614d97565b600c55600d5461590e9083614d97565b600d819055600c5461591f91614d97565b600e556040805182815290516001600160a01b03861691600091600080516020615f318339815191529181900360200190a350505050565b61596284838361596d565b61567e838383615255565b6001600160a01b039283166000908152601360209081526040808320949095168252928352838120805483900390557ff70de54536712c8ff8e72cff9589e58e41f45f6aceb543b6c431cd10034dc4759092529190208054919091039055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052615a1f908490615a9f565b505050565b600081615a3057600080fd5b83615a3d575060006117b3565b83830283858281615a4a57fe5b041415615a6357828181615a5a57fe5b049150506117b3565b83838681615a6d57fe5b040295945050505050565b600082615a87575060006113fb565b82820282848281615a9457fe5b04146117b357600080fd5b615ab1826001600160a01b0316615c57565b615b02576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615b405780518252601f199092019160209182019101615b21565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615ba2576040519150601f19603f3d011682016040523d82523d6000602084013e615ba7565b606091505b509150915081615bfe576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561567e57808060200190516020811015615c1a57600080fd5b505161567e5760405162461bcd60e51b815260040180806020018281038252602a815260200180615f75602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590615c8b57508115155b949350505050565b6040518061012001604052806009906020820280368337509192915050565b6040518060c0016040528060006001600160a01b03168152602001600060ff168152602001600081526020016000815260200160008152602001600081525090565b604080516101e08101825260008082526020820181905291810182905260608101829052608081019190915260a08101615d2c615c93565b81526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600080191681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615db557805160ff1916838001178555615de2565b82800160010185558215615de2579182015b82811115615de2578251825591602001919060010190615dc7565b50615dee929150615e81565b5090565b600183019183908215615e755791602002820160005b83821115615e4657835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302615e08565b8015615e735782816101000a81549060ff0219169055600101602081600001049283019260010302615e46565b505b50615dee929150615e96565b5b80821115615dee5760008155600101615e82565b5b80821115615dee57805460ff19168155600101615e9756fe21726167657175697420756e74696c206869676865737420696e6465782070726f706f73616c206d656d62657220766f746564205945532070726f6365737365735265656e7472616e637947756172643a207265656e7472616e742063616c6c002264e2d7bacabe6058f5009f42467b9be28015e7760f87409562384c94ac271cddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f70726f63657373696e67526577617264203e205f70726f706f73616c4465706f7369745361666545524332303a206572633230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122025925608d1a06554ed632696526cfef2e841ab7f7db412dea66e4ecdb358cce164736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106103d25760003560e01c80637a609641116101fd578063afe5475f11610118578063e0a8f6f5116100ab578063e681c4aa1161007a578063e681c4aa1461114a578063ea7b6ffd1461115f578063f2428621146111b4578063f5d54c77146111c9578063ff82cc6c146111de576103d9565b8063e0a8f6f514611099578063e1780345146110c3578063e1a0e3fa146110f6578063e63bc62d14611120576103d9565b8063c89039c5116100e7578063c89039c514611001578063da35c66414611016578063dd62ed3e1461102b578063dfdd369e14611066576103d9565b8063afe5475f14610f4a578063b2643aab14610f5f578063b470aade14610fc2578063c169591f14610fd7576103d9565b80639746d94011610190578063a3dc38001161015f578063a3dc380014610d41578063a42e01c114610d6b578063a4d2d9ec14610ed8578063a9059cbb14610f11576103d9565b80639746d94014610ca557806399653fbe14610ccf5780639d1722cb14610d025780639e96eb0f14610d17576103d9565b80638b15a605116101cc5780638b15a60514610bca5780639398573714610bdf5780639425a47614610c7b57806395d89b4114610527576103d9565b80637a60964114610b4c5780637d5b6c7214610b7657806383240f8314610b8b5780638340bbce14610bb5576103d9565b80633a98ef39116102ed578063635e99aa1161028057806373f8fd4b1161024f57806373f8fd4b14610ab4578063753d756314610aef57806378a8956714610b22578063797daf7014610b37576103d9565b8063635e99aa14610a1e57806363858f2d14610a335780636d4475eb14610a4857806370a0823114610a81576103d9565b80634482394b116102bc5780634482394b146108d057806351ed6a301461099d57806359999b41146109b25780635a8511ff146109e5576103d9565b80633a98ef391461082b5780633b214a74146108405780633fc24bba1461086a578063402c17941461089d576103d9565b806315eb349e116103655780632582bf2a116103345780632582bf2a1461078e57806327efc086146107c1578063313ce567146107d65780633793ab3c14610801576103d9565b806315eb349e146106c057806318160ddd146106f05780631dafede01461070557806323b872dd1461074b576103d9565b8063086146d2116103a1578063086146d2146105b157806308ae4b0c146105c6578063095ea7b3146106385780630cf20cc914610685576103d9565b8063013cf08b146103de57806303e32fa1146104a6578063044a0ca8146104cd57806306fdde0314610527576103d9565b366103d957005b600080fd5b3480156103ea57600080fd5b506104086004803603602081101561040157600080fd5b5035611289565b604051808f6001600160a01b031681526020018e6001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b031681526020018b6001600160a01b031681526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019e50505050505050505050505050505060405180910390f35b3480156104b257600080fd5b506104bb611308565b60408051918252519081900360200190f35b3480156104d957600080fd5b50610506600480360360408110156104f057600080fd5b506001600160a01b03813516906020013561130e565b6040518082600281111561051657fe5b815260200191505060405180910390f35b34801561053357600080fd5b5061053c611401565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561057657818101518382015260200161055e565b50505050905090810190601f1680156105a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105bd57600080fd5b506104bb611421565b3480156105d257600080fd5b506105f9600480360360208110156105e957600080fd5b50356001600160a01b0316611449565b604080516001600160a01b03909716875260ff9095166020870152858501939093526060850191909152608084015260a0830152519081900360c00190f35b34801561064457600080fd5b506106716004803603604081101561065b57600080fd5b506001600160a01b038135169060200135611489565b604080519115158252519081900360200190f35b34801561069157600080fd5b506106be600480360360408110156106a857600080fd5b506001600160a01b038135169060200135611529565b005b3480156106cc57600080fd5b506106be600480360360408110156106e357600080fd5b5080359060200135611587565b3480156106fc57600080fd5b506104bb611634565b34801561071157600080fd5b5061072f6004803603602081101561072857600080fd5b503561163a565b604080516001600160a01b039092168252519081900360200190f35b34801561075757600080fd5b506106716004803603606081101561076e57600080fd5b506001600160a01b03813581169160208101359091169060400135611661565b34801561079a57600080fd5b506106be600480360360208110156107b157600080fd5b50356001600160a01b03166117ba565b3480156107cd57600080fd5b5061072f6119d6565b3480156107e257600080fd5b506107eb6119dc565b6040805160ff9092168252519081900360200190f35b34801561080d57600080fd5b506106be6004803603602081101561082457600080fd5b50356119e1565b34801561083757600080fd5b506104bb611b9c565b34801561084c57600080fd5b506104bb6004803603602081101561086357600080fd5b5035611ba2565b34801561087657600080fd5b506106716004803603602081101561088d57600080fd5b50356001600160a01b0316611bc0565b3480156108a957600080fd5b5061072f600480360360208110156108c057600080fd5b50356001600160a01b0316611bd5565b3480156108dc57600080fd5b506106be600480360360608110156108f357600080fd5b810190602081018135600160201b81111561090d57600080fd5b82018360208201111561091f57600080fd5b803590602001918460208302840111600160201b8311171561094057600080fd5b919390929091602081019035600160201b81111561095d57600080fd5b82018360208201111561096f57600080fd5b803590602001918460208302840111600160201b8311171561099057600080fd5b9193509150351515611bf0565b3480156109a957600080fd5b5061072f611d36565b3480156109be57600080fd5b506106be600480360360208110156109d557600080fd5b50356001600160a01b0316611d45565b3480156109f157600080fd5b506104bb60048036036040811015610a0857600080fd5b506001600160a01b038135169060200135611fd7565b348015610a2a57600080fd5b506104bb612021565b348015610a3f57600080fd5b506104bb612027565b348015610a5457600080fd5b506104bb60048036036040811015610a6b57600080fd5b506001600160a01b03813516906020013561202d565b348015610a8d57600080fd5b506104bb60048036036020811015610aa457600080fd5b50356001600160a01b031661218f565b348015610ac057600080fd5b506104bb60048036036040811015610ad757600080fd5b506001600160a01b03813581169160200135166121a1565b348015610afb57600080fd5b5061067160048036036020811015610b1257600080fd5b50356001600160a01b03166121cc565b348015610b2e57600080fd5b506104bb6121e1565b348015610b4357600080fd5b506104bb6121e7565b348015610b5857600080fd5b506106be60048036036020811015610b6f57600080fd5b50356121ed565b348015610b8257600080fd5b506104bb6122ea565b348015610b9757600080fd5b5061053c60048036036020811015610bae57600080fd5b50356122f0565b348015610bc157600080fd5b506104bb61238b565b348015610bd657600080fd5b506104bb612391565b348015610beb57600080fd5b506104bb600480360360a0811015610c0257600080fd5b6001600160a01b038235169160208101359160408201359160608101359181019060a081016080820135600160201b811115610c3d57600080fd5b820183602082011115610c4f57600080fd5b803590602001918460018302840111600160201b83111715610c7057600080fd5b509092509050612397565b348015610c8757600080fd5b5061067160048036036020811015610c9e57600080fd5b503561240c565b348015610cb157600080fd5b506106be60048036036020811015610cc857600080fd5b5035612433565b348015610cdb57600080fd5b506106be60048036036040811015610cf257600080fd5b508035906020013560ff16612a18565b348015610d0e57600080fd5b506104bb612e0e565b348015610d2357600080fd5b506106be60048036036020811015610d3a57600080fd5b5035612e14565b348015610d4d57600080fd5b5061067160048036036020811015610d6457600080fd5b50356130a5565b348015610d7757600080fd5b506106be6004803603610160811015610d8f57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b811115610dc257600080fd5b820183602082011115610dd457600080fd5b803590602001918460208302840111600160201b83111715610df557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610e4457600080fd5b820183602082011115610e5657600080fd5b803590602001918460208302840111600160201b83111715610e7757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060208101359060408101359060608101359060808101359060a08101359060c00135613146565b348015610ee457600080fd5b506104bb60048036036040811015610efb57600080fd5b506001600160a01b038135169060200135613404565b348015610f1d57600080fd5b5061067160048036036040811015610f3457600080fd5b506001600160a01b03813516906020013561358b565b348015610f5657600080fd5b506104bb613688565b348015610f6b57600080fd5b50610f8960048036036020811015610f8257600080fd5b503561368e565b604051808261012080838360005b83811015610faf578181015183820152602001610f97565b5050505090500191505060405180910390f35b348015610fce57600080fd5b506104bb6136f7565b348015610fe357600080fd5b506106be60048036036020811015610ffa57600080fd5b50356136fd565b34801561100d57600080fd5b5061072f6137fe565b34801561102257600080fd5b506104bb61380d565b34801561103757600080fd5b506104bb6004803603604081101561104e57600080fd5b506001600160a01b0381358116916020013516613813565b34801561107257600080fd5b506106be6004803603602081101561108957600080fd5b50356001600160a01b0316613830565b3480156110a557600080fd5b506106be600480360360208110156110bc57600080fd5b50356139d1565b3480156110cf57600080fd5b50610671600480360360208110156110e657600080fd5b50356001600160a01b0316613b39565b34801561110257600080fd5b506106be6004803603602081101561111957600080fd5b5035613b4e565b34801561112c57600080fd5b506106be6004803603602081101561114357600080fd5b5035613d34565b34801561115657600080fd5b5061072f61409c565b6104bb600480360361010081101561117657600080fd5b506001600160a01b038135811691602081013591604082013591606081013591608082013581169160a08101359160c0820135169060e001356140a2565b3480156111c057600080fd5b5061072f614605565b3480156111d557600080fd5b5061072f61461d565b3480156111ea57600080fd5b506112086004803603602081101561120157600080fd5b5035614623565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561124d578181015183820152602001611235565b50505050905090810190601f16801561127a5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6017602052600090815260409020805460018201546002830154600384015460048501546006860154600787015460088801546009890154600a8a0154600b8b0154600c8c0154600d8d0154600e909d01546001600160a01b039c8d169d9b8d169c9a8b169b998b169a9098169896979596949593949293919290918e565b60045481565b6001600160a01b0382166000908152601a6020526040812054600160a01b900460ff1660011461136f576040805162461bcd60e51b815260206004820152600760248201526610b6b2b6b132b960c91b604482015290519081900360640190fd5b60165482106113b1576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b60176000601684815481106113c257fe5b6000918252602080832090910154835282810193909352604091820181206001600160a01b0387168252600f0190925290205460ff1690505b92915050565b6040518060400160405280600481526020016309aa6a8b60e31b81525081565b600061144460055461143e6009544261496990919063ffffffff16565b9061497e565b905090565b601a60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b03841694600160a01b90940460ff16939086565b60008115806114b957503360009081526012602090815260408083206001600160a01b0387168452909152902054155b6114c257600080fd5b3360008181526012602090815260408083206001600160a01b03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b6002600054141561156f576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b600260005561157e82826149a0565b50506001600055565b600260005414156115cd576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b60026000908155338152601a6020526040902054600160a01b900460ff16600114611629576040805162461bcd60e51b815260206004820152600760248201526610b6b2b6b132b960c91b604482015290519081900360640190fd5b61157e338383614a69565b600e5481565b6014818154811061164757fe5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b038316600090815260126020908152604080832033845290915281205461168f9083614969565b6001600160a01b0385166000818152601260209081526040808320338452825280832094909455918152601a90915220600201546116cd9083614969565b6001600160a01b038086166000908152601a602052604080822060029081019490945591861681522001546117029083614d97565b6001600160a01b038085166000908152601a602090815260408083206002019490945591871681526011909152205461173b9083614969565b6001600160a01b03808616600090815260116020526040808220939093559085168152205461176a9083614d97565b6001600160a01b038085166000818152601160209081526040918290209490945580518681529051919392881692600080516020615f3183398151915292918290030190a35060015b9392505050565b336000908152601a602052604090206001015461180d576040805162461bcd60e51b815260206004820152600c60248201526b10b9b430b932b437b63232b960a11b604482015290519081900360640190fd5b6001600160a01b03811661185d576040805162461bcd60e51b815260206004820152601260248201527106e657744656c65676174654b6579203d20360741b604482015290519081900360640190fd5b6001600160a01b038116331461194d576001600160a01b0381166000908152601a6020526040902054600160a01b900460ff16156118d7576040805162461bcd60e51b8152602060048201526012602482015271216f7665727772697465206d656d6265727360701b604482015290519081900360640190fd5b6001600160a01b038181166000908152601b60209081526040808320549093168252601a90522054600160a01b900460ff161561194d576040805162461bcd60e51b815260206004820152600f60248201526e216f7665727772697465206b65797360881b604482015290519081900360640190fd5b336000818152601a6020908152604080832080546001600160a01b039081168552601b845282852080546001600160a01b031990811690915590871680865294839020805482168717905581541684178155815193845290519093927fde7b64a369e10562cc2e71f0f1f944eaf144b75fead6ecb51fac9c4dd693488592908290030190a25050565b61deed81565b601281565b6119ea81614da9565b6000601682815481106119f957fe5b60009182526020808320919091015480835260179091526040909120600581015491925090600160201b900460ff16600114611a69576040805162461bcd60e51b815260206004820152600a602482015269085dda1a5d195b1a5cdd60b21b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000611a8584615075565b60145490915061019011611a97575060005b8015611b285760058201805462ff00001916620100001790556003820180546001600160a01b039081166000908152601560205260408120805460ff1916600190811790915592546014805494850181559091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9092018054929091166001600160a01b03199092169190911790555b60038201546001600160a01b039081166000908152601860205260409020805460ff191690556002830154611b5d911661520e565b6040805182151581529051849186917f2094fc13d2ecb0acd6861e82bd006c7e5ab6f312ec0c6cdfe3d1a01ee54d885a9181900360200190a350505050565b600c5481565b60168181548110611baf57fe5b600091825260209091200154905081565b60196020526000908152604090205460ff1681565b601b602052600090815260409020546001600160a01b031681565b60026000541415611c36576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b6002600055838214611c83576040805162461bcd60e51b8152602060048201526011602482015270746f6b656e7320213d20616d6f756e747360781b604482015290519081900360640190fd5b60005b84811015611d29576000848483818110611c9c57fe5b9050602002013590508215611cfb5733600090815260136020526040812090888885818110611cc757fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000205490505b611d20878784818110611d0a57fe5b905060200201356001600160a01b0316826149a0565b50600101611c86565b5050600160005550505050565b6002546001600160a01b031681565b60026000541415611d8b576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b60026000908155338152601b60209081526040808320546001600160a01b03168352601a909152902060010154611df5576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b6001600160a01b03811660008181527ff70de54536712c8ff8e72cff9589e58e41f45f6aceb543b6c431cd10034dc475602090815260408083205481516370a0823160e01b815230600482015291519394611ea194919390926370a082319260248083019392829003018186803b158015611e6f57600080fd5b505afa158015611e83573d6000803e3d6000fd5b505050506040513d6020811015611e9957600080fd5b505190614969565b905060008111611ee2576040805162461bcd60e51b815260206004820152600760248201526608585b5bdd5b9d60ca1b604482015290519081900360640190fd5b6001600160a01b03821660009081526015602052604090205460ff16611f3e576040805162461bcd60e51b815260206004820152600c60248201526b085dda1a5d195b1a5cdd195960a21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600080516020615f118339815191526020526040902054158015611f73575060c8600f54105b15611f8257600f805460010190555b611f8f61dead8383615255565b6040805182815290516001600160a01b038416917f9381e53ffdc9733a6783a6f8665be3f89c231bb81a6771996ed553b4e75c0fe3919081900360200190a250506001600055565b6000611fe1615c93565b600160e08201526040805160208101909152600080825261201291869190819081908190819081908b908a906152b3565b5050600b546000190192915050565b600d5481565b60075481565b6000612037615cb2565b506001600160a01b038381166000908152601a6020908152604091829020825160c08101845281549485168152600160a01b90940460ff1691840191909152600181015491830182905260028101546060840152600381015460808401526004015460a08301521515806120af575060008160600151115b6120ef576040805162461bcd60e51b815260206004820152600c60248201526b085cda185c995f1f1b1bdbdd60a21b604482015290519081900360640190fd5b6001600160a01b0384166000908152601a602052604090206004015415612146576040805162461bcd60e51b81526020600482015260066024820152651a985a5b195960d21b604482015290519081900360640190fd5b61214e615c93565b600160a08201526040805160208101909152600080825261217f91879190819081908190819081908c908a906152b3565b5050600b54600019019392505050565b60116020526000908152604090205481565b6001600160a01b03918216600090815260136020908152604080832093909416825291909152205490565b60156020526000908152604090205460ff1681565b60145490565b60165490565b60026000541415612233576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b60026000908155338152601a60205260409020600101546122549082614969565b336000908152601a602052604090206001810191909155600201546122799082614d97565b336000908152601a6020526040902060020155600c546122999082614969565b600c55600d546122a99082614d97565b600d5560408051828152905133917f919a31da3abe80797e98aa9c2c7f702e81362432ae3e701295d162ceee68101b919081900360200190a2506001600055565b60095481565b60106020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156123835780601f1061235857610100808354040283529160200191612383565b820191906000526020600020905b81548152906001019060200180831161236657829003601f168201915b505050505081565b60065481565b60035481565b60006123a1615c93565b600160c0820152604080516020601f86018190048102820181019092528481526123f9918a9160009182918b9183918e9183918e918b91908f908f90819084018382808284376000920191909152506152b392505050565b5050600b54600019019695505050505050565b600061242360065483614d9790919063ffffffff16565b61242b611421565b101592915050565b60026000541415612479576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b60026000908155338152601b60209081526040808320546001600160a01b03168352601a9091529020600101546124e3576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b600354600154612502916001600160a01b039091169033903090615624565b6001546003546125219161deaf916001600160a01b0390911690615255565b600081815260176020526040902060018101546001600160a01b031661257a576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b600581015460ff16156125c0576040805162461bcd60e51b81526020600482015260096024820152681cdc1bdb9cdbdc995960ba1b604482015290519081900360640190fd5b60058101546301000000900460ff161561260d576040805162461bcd60e51b815260206004820152600960248201526818d85b98d95b1b195960ba1b604482015290519081900360640190fd5b80546001600160a01b03166000908152601a60205260409020600401541561266f576040805162461bcd60e51b815260206004820152601060248201526f185c1c1b1a58d85b9d081a985a5b195960821b604482015290519081900360640190fd5b600081600901541180156126aa575060038101546001600160a01b03166000908152600080516020615f118339815191526020526040902054155b156126f85760c8600f54106126f8576040805162461bcd60e51b815260206004820152600f60248201526e19dd5a5b1918985b9ac81b585e1959608a1b604482015290519081900360640190fd5b6005810154600160201b900460ff166001141561284c5760038101546001600160a01b031660009081526015602052604090205460ff161561276f576040805162461bcd60e51b815260206004820152600b60248201526a1dda1a5d195b1a5cdd195960aa1b604482015290519081900360640190fd5b60038101546001600160a01b031660009081526018602052604090205460ff16156127d6576040805162461bcd60e51b81526020600482015260126024820152711dda1a5d195b1a5cdd081c1c9bdc1bdcd95960721b604482015290519081900360640190fd5b60145461019011612820576040805162461bcd60e51b815260206004820152600f60248201526e1dda1a5d195b1a5cdd081b585e1959608a1b604482015290519081900360640190fd5b60038101546001600160a01b03166000908152601860205260409020805460ff191660011790556128e9565b600581015465010000000000900460ff16600114156128e95780546001600160a01b031660009081526019602052604090205460ff16156128c4576040805162461bcd60e51b815260206004820152600d60248201526c1ada58dac81c1c9bdc1bdcd959609a1b604482015290519081900360640190fd5b80546001600160a01b03166000908152601960205260409020805460ff191660011790555b60006129406128f6611421565b601654156129385760168054601791600091600019810190811061291657fe5b90600052602060002001548152602001908152602001600020600a015461293b565b60005b615684565b6001908101600a8401819055336000818152601b60209081526040808320546002890180546001600160a01b0319166001600160a01b0392831617815560058a01805460ff191689179055601680549889018155948590527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242899097018a90559554925481518a8152600019909101928101929092528181018590525193955093169290917f2a383a979381335e3eb401ac01dd8083e024ff0256bf5338456ffc0063390bbd9181900360600190a35050600160005550565b60026000541415612a5e576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b60026000908155338152601b60209081526040808320546001600160a01b03168352601a909152902060010154612ac8576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b336000908152601b60209081526040808320546001600160a01b0316808452601a9092529091206016548410612b31576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b600060168581548110612b4057fe5b600091825260208083209091015480835260179091526040909120909150600360ff861610612b9b576040805162461bcd60e51b81526020600482015260026024820152611f1960f11b604482015290519081900360640190fd5b60008560ff166002811115612bac57fe5b905081600a0154612bbb611421565b1015612bf8576040805162461bcd60e51b815260206004820152600760248201526670656e64696e6760c81b604482015290519081900360640190fd5b612c0582600a015461240c565b15612c41576040805162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f8301602052604081205460ff166002811115612c6a57fe5b14612ca4576040805162461bcd60e51b81526020600482015260056024820152641d9bdd195960da1b604482015290519081900360640190fd5b6001816002811115612cb257fe5b1480612cc957506002816002811115612cc757fe5b145b612d05576040805162461bcd60e51b8152602060048201526008602482015267215965737c7c4e6f60c01b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f830160205260409020805482919060ff19166001836002811115612d3657fe5b02179055506001816002811115612d4957fe5b1415612d8f576001840154600b8301805490910190556003840154871115612d7357600384018790555b81600d0154600e541115612d8a57600e54600d8301555b612db4565b6002816002811115612d9d57fe5b1415612db4576001840154600c8301805490910190555b6040805184815260ff8816602082015281516001600160a01b0388169233928b927f804f03797630bf8b8a46b9371608abbf7d78a20df720e477bab641957ca68a20929181900390910190a4505060016000555050505050565b600f5481565b60026000541415612e5a576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b6002600055612e6881614da9565b600060168281548110612e7757fe5b60009182526020808320919091015480835260179091526040909120600581015491925090670100000000000000900460ff16600114612eec576040805162461bcd60e51b815260206004820152600b60248201526a085dda5d1a191c985dd85b60aa1b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000612f0884615075565b9050801561304a5760058201805462ff000019166201000017905560005b60145481101561303b5761dead6000908152601360205260148054600080516020615f1183398151915291839185908110612f5d57fe5b60009182526020808320909101546001600160a01b0316835282810193909352604090910181205461dead82526013909252601480549293508392600080516020615f1183398151915292919086908110612fb457fe5b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822080549590950390945587549092168252601390925290812060148054849391908690811061300757fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190208054909101905550600101612f26565b50601454600f80549190910390555b6002820154613061906001600160a01b031661520e565b6040805182151581529051849186917f7b76f1f32124f1887f0f0a8b6b0e131e672e39b2ab0c2df506bf17f407e72fee9181900360200190a3505060016000555050565b60165460009082106130ea576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd85b60ba1b604482015290519081900360640190fd5b60176000601684815481106130fb57fe5b9060005260206000200154815260200190815260200160002060050160016009811061312357fe5b602091828204019190069054906101000a900460ff1660ff166001149050919050565b600a5460ff161561318c576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9a5d1a585b1a5e995960aa1b604482015290519081900360640190fd5b896001600160a01b03168b6001600160a01b031614156131f3576040805162461bcd60e51b815260206004820152601960248201527f6465706f736974546f6b656e203d207374616b65546f6b656e00000000000000604482015290519081900360640190fd5b8751895114613249576040805162461bcd60e51b815260206004820152601a60248201527f73756d6d6f6e657220213d2073756d6d6f6e6572536861726573000000000000604482015290519081900360640190fd5b848610156132885760405162461bcd60e51b8152600401808060200182810382526024815260200180615f516024913960400191505060405180910390fd5b60005b89518110156132ce576132c68a82815181106132a357fe5b60200260200101518a83815181106132b757fe5b6020026020010151600061569b565b60010161328b565b506ec097ce7bc90715b34b9f1000000000600c541115613323576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b6001600160a01b038b166000818152601560205260408120805460ff191660019081179091556014805491820181559091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b031916909117905586156133a457600f805460010190556133a461dead8c89615255565b600180546001600160a01b039c8d166001600160a01b0319918216178255600280549c909d169b169a909a17909a5560039490945560049290925560055560065560075550505060089190915542600955600a805460ff19169091179055565b60006001600160a01b03831661344a576040805162461bcd60e51b815260206004820152600660248201526510ba37b5b2b760d11b604482015290519081900360640190fd5b6002546001600160a01b03848116911614156134ad576040805162461bcd60e51b815260206004820152601d60248201527f746f6b656e546f57686974656c697374203d207374616b65546f6b656e000000604482015290519081900360640190fd5b6001600160a01b03831660009081526015602052604090205460ff1615613509576040805162461bcd60e51b815260206004820152600b60248201526a1dda1a5d195b1a5cdd195960aa1b604482015290519081900360640190fd5b60145461019011613553576040805162461bcd60e51b815260206004820152600f60248201526e1dda1a5d195b1a5cdd081b585e1959608a1b604482015290519081900360640190fd5b61355b615c93565b6001608082015260408051602081019091526000808252612012918190819081908990829081908b908a906152b3565b336000908152601a60205260408120600201546135a89083614969565b336000908152601a60205260408082206002908101939093556001600160a01b0386168252902001546135db9083614d97565b6001600160a01b0384166000908152601a60209081526040808320600201939093553382526011905220546136109083614969565b33600090815260116020526040808220929092556001600160a01b0385168152205461363c9083614d97565b6001600160a01b038416600081815260116020908152604091829020939093558051858152905191923392600080516020615f318339815191529281900390910190a350600192915050565b60085481565b613696615c93565b6000828152601760205260408082208151610120810192839052926005909101916009918390855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116136be575094979650505050505050565b60055481565b60026000541415613743576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b6002600081905554613760906001600160a01b0316333084615624565b61376c3382600061569b565b6ec097ce7bc90715b34b9f1000000000600e5411156137c0576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b60408051828152905133917f83b37e7ebc9b774fe613926f7f5dd4594c0f8d39e7ca0169a9f6810011f2b6f8919081900360200190a2506001600055565b6001546001600160a01b031681565b600b5481565b601260209081526000928352604080842090915290825290205481565b60026000541415613876576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b60026000908155338152601b60209081526040808320546001600160a01b03168352601a9091529020600101546138e0576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b6001600160a01b0381166000908152601a602052604090206004810154613938576040805162461bcd60e51b8152602060048201526007602482015266085a985a5b195960ca1b604482015290519081900360640190fd5b6000816002015411613979576040805162461bcd60e51b8152602060048201526005602482015264085b1bdbdd60da1b604482015290519081900360640190fd5b61398681600301546130a5565b6139c15760405162461bcd60e51b8152600401808060200182810382526041815260200180615eb06041913960600191505060405180910390fd5b61157e8260008360020154614a69565b6000818152601760205260409020600581015460ff1615613a25576040805162461bcd60e51b81526020600482015260096024820152681cdc1bdb9cdbdc995960ba1b604482015290519081900360640190fd5b60058101546301000000900460ff1615613a72576040805162461bcd60e51b815260206004820152600960248201526818d85b98d95b1b195960ba1b604482015290519081900360640190fd5b60018101546001600160a01b03163314613abf576040805162461bcd60e51b815260206004820152600960248201526810b83937b837b9b2b960b91b604482015290519081900360640190fd5b60058101805463ff00000019166301000000179055600181015460038201546009830154613aff9261deaf926001600160a01b0391821692911690615957565b60408051338152905183917fc215fed6680bb02d323dc3f8b8f85241572607538426059c9232601bd293c3be919081900360200190a25050565b60186020526000908152604090205460ff1681565b60026000541415613b94576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b6002600055613ba281614da9565b600060168281548110613bb157fe5b6000918252602080832091909101548083526017909152604090912060058101549192509065010000000000900460ff16600114613c1e576040805162461bcd60e51b8152602060048201526005602482015264216b69636b60d81b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000613c3a84615075565b90508015613cbe5760058201805462ff000019166201000017905581546001600160a01b03166000908152601a602052604090206004810185905560018101546002820154613c8891614d97565b60028201556001810154600c54613c9e91614969565b600c556001810154600d54613cb291614d97565b600d5560006001909101555b81546001600160a01b039081166000908152601960205260409020805460ff191690556002830154613cf0911661520e565b6040805182151581529051849186917f0e347d00d3e9e6cdff9e6c09092c9ff1bd448f9b3dfb7091b30939ec5e7a3c739181900360200190a3505060016000555050565b60026000541415613d7a576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b6002600055613d8881614da9565b600060168281548110613d9757fe5b6000918252602080832091909101548083526017909152604090912060058101549192509068010000000000000000900460ff16600114613e0b576040805162461bcd60e51b8152602060048201526009602482015268085cdd185b99185c9960ba1b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000613e2784615075565b90506ec097ce7bc90715b34b9f1000000000613e608360070154613e5a8560060154600e54614d9790919063ffffffff16565b90614d97565b1115613e6a575060005b60048201546001600160a01b03166000908152600080516020615f11833981519152602052604090205460088301541115613ea3575060005b60008260090154118015613ede575060038201546001600160a01b03166000908152600080516020615f118339815191526020526040902054155b8015613eed575060c8600f5410155b15613ef6575060005b80156140165760058201805462ff0000191662010000179055815460068301546007840154613f2f926001600160a01b0316919061569b565b60038201546001600160a01b03166000908152600080516020615f118339815191526020526040902054158015613f6a575060008260090154115b15613f7957600f805460010190555b60038201546009830154613f9e9161deaf9161dead916001600160a01b031690615957565b815460048301546008840154613fc69261dead926001600160a01b0391821692911690615957565b60048201546001600160a01b03166000908152600080516020615f118339815191526020526040902054158015614001575060008260080154115b1561401157600f80546000190190555b614041565b6001820154600383015460098401546140419261deaf926001600160a01b0391821692911690615957565b6002820154614058906001600160a01b031661520e565b6040805182151581529051849186917f86f74240ecee9e4230d26ff92e17fee978460d9c0f78f5c88b2864c9e7a494279181900360200190a3505060016000555050565b61deaf81565b6000600260005414156140ea576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b60026000556ec097ce7bc90715b34b9f10000000006141098989614d97565b111561414a576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b6001600160a01b03851660009081526015602052604090205460ff166141b7576040805162461bcd60e51b815260206004820152601960248201527f74726962757465546f6b656e20213d2077686974656c69737400000000000000604482015290519081900360640190fd5b6001600160a01b03831660009081526015602052604090205460ff16614224576040805162461bcd60e51b815260206004820152601960248201527f7061796d656e74546f6b656e20213d2077686974656c69737400000000000000604482015290519081900360640190fd5b6001600160a01b03891661dead1480159061424a57506001600160a01b03891661deaf14155b801561426157506001600160a01b03891661deed14155b6142ab576040805162461bcd60e51b81526020600482015260166024820152756170706c6963616e7420756e72657365727661626c6560501b604482015290519081900360640190fd5b6001600160a01b0389166000908152601a60205260409020600401541561430c576040805162461bcd60e51b815260206004820152601060248201526f185c1c1b1a58d85b9d081a985a5b195960821b604482015290519081900360640190fd5b60008611801561433f57506001600160a01b0385166000908152600080516020615f118339815191526020526040902054155b1561438d5760c8600f541061438d576040805162461bcd60e51b815260206004820152600f60248201526e19dd5a5b1918985b9ac81b585e1959608a1b604482015290519081900360640190fd5b6001600160a01b03851673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21480156143b95750600034115b1561458f57853414614400576040805162461bcd60e51b815260206004820152600b60248201526a2165746842616c616e636560a81b604482015290519081900360640190fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561444f57600080fd5b505af1158015614463573d6000803e3d6000fd5b50506040516000925073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2915034908381818185875af1925050503d80600081146144bd576040519150601f19603f3d011682016040523d82523d6000602084013e6144c2565b606091505b5050905080614503576040805162461bcd60e51b815260206004820152600860248201526708595d1a10d85b1b60c21b604482015290519081900360640190fd5b6040805163a9059cbb60e01b8152306004820152346024820152905173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29163a9059cbb9160448083019260209291908290030181600087803b15801561455c57600080fd5b505af1158015614570573d6000803e3d6000fd5b505050506040513d602081101561458657600080fd5b506145a4915050565b6145a46001600160a01b038616333089615624565b6145b161deaf8688615255565b6145b9615c93565b60016101008201526040805160208101909152600081526145eb908b908b908b908b908b908b908b908b908a906152b3565b5050600b5460001901600160005598975050505050505050565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61dead81565b600060606002600054141561466d576040805162461bcd60e51b815260206004820152601f6024820152600080516020615ef1833981519152604482015290519081900360640190fd5b600260005561467b83614da9565b60006016848154811061468a57fe5b6000918252602080832091909101548083526010825260408084206017909352909220600581015492935090916601000000000000900460ff16600114614702576040805162461bcd60e51b815260206004820152600760248201526610b0b1ba34b7b760c91b604482015290519081900360640190fd5b60058101805461ff001916610100179055600061471e87615075565b82546001600160a01b031660009081526015602052604090205490915060ff168015614773575081546001600160a01b03166000908152600080516020615f1183398151915260205260409020546008830154115b1561477c575060005b478260090154111561478c575060005b80156149085760058201805462ff00001916620100001790558154600983015460405185546000936060936001600160a01b03909116929091889190819083906002600019600183161561010002019091160480156148225780601f10614800576101008083540402835291820191614822565b820191906000526020600020905b81548152906001019060200180831161480e575b505091505060006040518083038185875af1925050503d8060008114614864576040519150601f19603f3d011682016040523d82523d6000602084013e614869565b606091505b5085546001600160a01b0316600090815260156020526040902054919350915060ff16156148f957835460088501546148b19161dead916001600160a01b039091169061596d565b83546001600160a01b03166000908152600080516020615f1183398151915260205260409020541580156148e9575060008460080154115b156148f957600f80546000190190555b909650945061495d9350505050565b600282015461491f906001600160a01b031661520e565b6040805182151581529051859189917f225ab65268ea3d2f5b1ed97e7d032147f17bba561ef01b819bfe3832bc05b0339181900360200190a3505050505b60016000559092909150565b60008282111561497857600080fd5b50900390565b600080821161498c57600080fd5b600082848161499757fe5b04949350505050565b3360009081526013602090815260408083206001600160a01b0386168452909152902054811115614a03576040805162461bcd60e51b81526020600482015260086024820152672162616c616e636560c01b604482015290519081900360640190fd5b614a176001600160a01b03831633836159cd565b614a2233838361596d565b604080516001600160a01b038416815260208101839052815133927f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb928290030190a25050565b600e546001600160a01b0384166000908152601a602052604090206001810154841115614ac7576040805162461bcd60e51b81526020600482015260076024820152662173686172657360c81b604482015290519081900360640190fd5b8281600201541015614b08576040805162461bcd60e51b8152602060048201526005602482015264085b1bdbdd60da1b604482015290519081900360640190fd5b614b1581600301546130a5565b614b505760405162461bcd60e51b8152600401808060200182810382526041815260200180615eb06041913960600191505060405180910390fd5b6000614b5c8585614d97565b6001600160a01b038716600090815260116020526040902054909150614b829082614969565b6001600160a01b0387166000908152601160205260409020556001820154614baa9086614969565b60018301556002820154614bbe9085614969565b6002830155600c54614bd09086614969565b600c55600d54614be09085614969565b600d819055600c54614bf191614d97565b600e5560005b601454811015614d1c5761dead6000908152601360205260148054614c5f91600080516020615f118339815191529184919086908110614c3357fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548487615a24565b90508015614d135761dead60009081526013602052601480548392600080516020615f1183398151915292909186908110614c9657fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220805495909503909455918b1682526013909252908120601480548493919086908110614ce757fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805490910190555b50600101614bf7565b50604080518681526020810186905281516001600160a01b038916927fcad1a1c68982832d9abc314de8a1e5d5e8c81b0588961e360766736d10c3be1a928290030190a26040805182815290516000916001600160a01b03891691600080516020615f318339815191529181900360200190a3505050505050565b6000828201838110156117b357600080fd5b6016548110614deb576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd85b60ba1b604482015290519081900360640190fd5b614df3615cf4565b6017600060168481548110614e0457fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b03908116825260018301548116958201959095526002820154851681850152600382015485166060820152600482015490941660808501528251610120810193849052909260a085019260058501916009918390855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411614e8b5790505050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e820154815250509050614f3e600754613e5a600654846101400151614d9790919063ffffffff16565b614f46611421565b1015614f82576040805162461bcd60e51b815260206004820152600660248201526521726561647960d01b604482015290519081900360640190fd5b60a08101516020015160ff1615614fcc576040805162461bcd60e51b81526020600482015260096024820152681c1c9bd8d95cdcd95960ba1b604482015290519081900360640190fd5b81158061502d57506017600060166001850381548110614fe857fe5b9060005260206000200154815260200190815260200160002060050160016009811061501057fe5b602091828204019190069054906101000a900460ff1660ff166001145b615071576040805162461bcd60e51b815260206004820152601060248201526f1c1c9a5bdc88085c1c9bd8d95cdcd95960821b604482015290519081900360640190fd5b5050565b600061507f615cf4565b601760006016858154811061509057fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b03908116825260018301548116958201959095526002820154851681850152600382015485166060820152600482015490941660808501528251610120810193849052909260a085019260058501916009918390855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116151175790505050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e82015481525050905080610180015181610160015111156151c157600191505b6101a0810151600854600e546151d691615a78565b10156151e157600091505b80516001600160a01b03166000908152601a60205260409020600401541561520857600091505b50919050565b60015460045461522d9161deaf9133916001600160a01b031690615957565b6001546004546003546152529261deaf9285926001600160a01b039092169103615957565b50565b6001600160a01b0392831660009081526013602090815260408083209490951682529283528381208054830190557ff70de54536712c8ff8e72cff9589e58e41f45f6aceb543b6c431cd10034dc47590925291902080549091019055565b6152bb615cf4565b604051806101e001604052808c6001600160a01b03168152602001336001600160a01b0316815260200160006001600160a01b03168152602001886001600160a01b03168152602001866001600160a01b031681526020018481526020018b81526020018a8152602001878152602001898152602001600081526020016000815260200160008152602001600081526020018581525090508060a0015160066009811061536457fe5b602002015160ff166001141561539857600b546000908152601060209081526040909120835161539692850190615d74565b505b600b54600090815260176020908152604091829020835181546001600160a01b03199081166001600160a01b03928316178355928501516001830180548516918316919091179055928401516002820180548416918516919091179055606084015160038201805484169185169190911790556080840151600482018054909316931692909217905560a08201518291906154399060058301906009615df2565b5060c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c01556101a082015181600d01556101c082015181600e0155905050601b6000336001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b03168c6001600160a01b03167f7cb968086968ca711ceb9da54f994af4c4ea21283e4ef4518c98d6e6e9b8b9248d8d8d8d8d8d8d8d8d600b54604051808b81526020018a8152602001898152602001886001600160a01b03168152602001878152602001866001600160a01b0316815260200185815260200184600960200280838360005b8381101561558557818101518382015260200161556d565b5050505090500180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156155cb5781810151838201526020016155b3565b50505050905090810190601f1680156155f85780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a45050600b80546001019055505050505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261567e908590615a9f565b50505050565b60008183101561569457816117b3565b5090919050565b6001600160a01b0383166000908152601a6020526040902054600160a01b900460ff166001141561573b576001600160a01b0383166000908152601a60205260409020600101546156ec9083614d97565b6001600160a01b0384166000908152601a6020526040902060018101919091556002015461571a9082614d97565b6001600160a01b0384166000908152601a60205260409020600201556158a6565b6001600160a01b038084166000908152601b60209081526040808320549093168252601a9052205460ff600160a01b90910416600114156157c3576001600160a01b038084166000908152601b602090815260408083205490931680835283832080546001600160a01b03199081168317909155601a90925292909120805490911690911790555b6040805160c0810182526001600160a01b03851680825260016020808401919091528284018690526000918252601a90529190912060020154606082019061580c908490614d97565b81526000602080830182905260409283018290526001600160a01b03808816808452601a8352848420865181548886015160ff16600160a01b0260ff60a01b19929095166001600160a01b03199182161791909116939093178155868601516001820155606087015160028201556080870151600382015560a090960151600490960195909555601b909152919020805490911690911790555b60006158b28383614d97565b6001600160a01b0385166000908152601160205260409020549091506158d89082614d97565b6001600160a01b038516600090815260116020526040902055600c546158fe9084614d97565b600c55600d5461590e9083614d97565b600d819055600c5461591f91614d97565b600e556040805182815290516001600160a01b03861691600091600080516020615f318339815191529181900360200190a350505050565b61596284838361596d565b61567e838383615255565b6001600160a01b039283166000908152601360209081526040808320949095168252928352838120805483900390557ff70de54536712c8ff8e72cff9589e58e41f45f6aceb543b6c431cd10034dc4759092529190208054919091039055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052615a1f908490615a9f565b505050565b600081615a3057600080fd5b83615a3d575060006117b3565b83830283858281615a4a57fe5b041415615a6357828181615a5a57fe5b049150506117b3565b83838681615a6d57fe5b040295945050505050565b600082615a87575060006113fb565b82820282848281615a9457fe5b04146117b357600080fd5b615ab1826001600160a01b0316615c57565b615b02576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615b405780518252601f199092019160209182019101615b21565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615ba2576040519150601f19603f3d011682016040523d82523d6000602084013e615ba7565b606091505b509150915081615bfe576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561567e57808060200190516020811015615c1a57600080fd5b505161567e5760405162461bcd60e51b815260040180806020018281038252602a815260200180615f75602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590615c8b57508115155b949350505050565b6040518061012001604052806009906020820280368337509192915050565b6040518060c0016040528060006001600160a01b03168152602001600060ff168152602001600081526020016000815260200160008152602001600081525090565b604080516101e08101825260008082526020820181905291810182905260608101829052608081019190915260a08101615d2c615c93565b81526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600080191681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615db557805160ff1916838001178555615de2565b82800160010185558215615de2579182015b82811115615de2578251825591602001919060010190615dc7565b50615dee929150615e81565b5090565b600183019183908215615e755791602002820160005b83821115615e4657835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302615e08565b8015615e735782816101000a81549060ff0219169055600101602081600001049283019260010302615e46565b505b50615dee929150615e96565b5b80821115615dee5760008155600101615e82565b5b80821115615dee57805460ff19168155600101615e9756fe21726167657175697420756e74696c206869676865737420696e6465782070726f706f73616c206d656d62657220766f746564205945532070726f6365737365735265656e7472616e637947756172643a207265656e7472616e742063616c6c002264e2d7bacabe6058f5009f42467b9be28015e7760f87409562384c94ac271cddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f70726f63657373696e67526577617264203e205f70726f706f73616c4465706f7369745361666545524332303a206572633230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122025925608d1a06554ed632696526cfef2e841ab7f7db412dea66e4ecdb358cce164736f6c634300060c0033

Deployed Bytecode Sourcemap

3354:41876:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6236:45;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6236:45:0;;:::i;:::-;;;;;-1:-1:-1;;;;;6236:45:0;;;;;;-1:-1:-1;;;;;6236:45:0;;;;;;-1:-1:-1;;;;;6236:45:0;;;;;;-1:-1:-1;;;;;6236:45:0;;;;;;-1:-1:-1;;;;;6236:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3908:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39154:334;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39154:334:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;4984:36;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39016:126;;;;;;;;;;;;;:::i;6407:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6407:41:0;-1:-1:-1;;;;;6407:41:0;;:::i;:::-;;;;-1:-1:-1;;;;;6407:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43065:277;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43065:277:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;35186:128;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35186:128:0;;;;;;;;:::i;:::-;;32613:210;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32613:210:0;;;;;;;:::i;5521:26::-;;;;;;;;;;;;;:::i;6102:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6102:31:0;;:::i;:::-;;;;-1:-1:-1;;;;;6102:31:0;;;;;;;;;;;;;;44645:582;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44645:582:0;;;;;;;;;;;;;;;;;:::i;37472:836::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37472:836:0;-1:-1:-1;;;;;37472:836:0;;:::i;5271:47::-;;;;;;;;;;;;;:::i;4942:35::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28618:922;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28618:922:0;;:::i;5389:26::-;;;;;;;;;;;;;:::i;6199:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6199:30:0;;:::i;6348:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6348:46:0;-1:-1:-1;;;;;6348:46:0;;:::i;6455:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6455:61:0;-1:-1:-1;;;;;6455:61:0;;:::i;35322:512::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35322:512:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35322:512:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35322:512:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35322:512:0;;;;;;;;;;;;-1:-1:-1;35322:512:0;-1:-1:-1;35322:512:0;;;;:::i;3616:25::-;;;;;;;;;;;;;:::i;36177:644::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36177:644:0;-1:-1:-1;;;;;36177:644:0;;:::i;17206:429::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17206:429:0;;;;;;;;:::i;5457:24::-;;;;;;;;;;;;;:::i;4200:32::-;;;;;;;;;;;;;:::i;15831:617::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15831:617:0;;;;;;;;:::i;5789:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5789:44:0;-1:-1:-1;;;;;5789:44:0;;:::i;39883:146::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39883:146:0;;;;;;;;;;:::i;6140:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6140:46:0;-1:-1:-1;;;;;6140:46:0;;:::i;39771:104::-;;;;;;;;;;;;;:::i;39647:112::-;;;;;;;;;;;;;:::i;43350:410::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43350:410:0;;:::i;4405:28::-;;;;;;;;;;;;;:::i;5713:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5713:40:0;;:::i;4127:33::-;;;;;;;;;;;;;:::i;3840:30::-;;;;;;;;;;;;;:::i;14803:1020::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14803:1020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14803:1020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14803:1020:0;;;;;;;;;;-1:-1:-1;14803:1020:0;;-1:-1:-1;14803:1020:0;-1:-1:-1;14803:1020:0;:::i;38650:169::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38650:169:0;;:::i;19132:2132::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19132:2132:0;;:::i;21323:1803::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21323:1803:0;;;;;;;;;:::i;5617:35::-;;;;;;;;;;;;;:::i;29552:1341::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29552:1341:0;;:::i;38405:237::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38405:237:0;;:::i;11022:1638::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11022:1638:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11022:1638:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11022:1638:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11022:1638:0;;;;;;;;-1:-1:-1;11022:1638:0;;-1:-1:-1;;;;;11022:1638:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11022:1638:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11022:1638:0;;-1:-1:-1;;11022:1638:0;;;-1:-1:-1;;;11022:1638:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16460:734::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16460:734:0;;;;;;;;:::i;44143:490::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44143:490:0;;;;;;;;:::i;4272:28::-;;;;;;;;;;;;;:::i;39496:139::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39496:139:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4029:29;;;;;;;;;;;;;:::i;43772:363::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43772:363:0;;:::i;3529:27::-;;;;;;;;;;;;;:::i;5325:28::-;;;;;;;;;;;;;:::i;5864:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5864:64:0;;;;;;;;;;:::i;34700:474::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34700:474:0;-1:-1:-1;;;;;34700:474:0;;:::i;36943:521::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36943:521:0;;:::i;6290:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6290:51:0;-1:-1:-1;;;;;6290:51:0;;:::i;27552:1054::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27552:1054:0;;:::i;23134:2600::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23134:2600:0;;:::i;5216:48::-;;;;;;;;;;;;;:::i;12744:2046::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12744:2046:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3707:73::-;;;;;;;;;;;;;:::i;5162:47::-;;;;;;;;;;;;;:::i;25747:1797::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25747:1797:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6236:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6236:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3908:31::-;;;;:::o;39154:334::-;-1:-1:-1;;;;;39279:22:0;;39254:4;39279:22;;;:7;:22;;;;;:29;-1:-1:-1;;;39279:29:0;;;;39312:1;39279:34;39271:54;;;;;-1:-1:-1;;;39271:54:0;;;;;;;;;;;;-1:-1:-1;;;39271:54:0;;;;;;;;;;;;;;;39360:13;:20;39344:36;;39336:58;;;;;-1:-1:-1;;;39336:58:0;;;;;;;;;;;;-1:-1:-1;;;39336:58:0;;;;;;;;;;;;;;;39412:9;:39;39422:13;39436;39422:28;;;;;;;;;;;;;;;;;;;;39412:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;39412:68:0;;;;:53;;:68;;;;;;;;;-1:-1:-1;39154:334:0;;;;;:::o;4984:36::-;;;;;;;;;;;;;;-1:-1:-1;;;4984:36:0;;;;:::o;39016:126::-;39065:7;39092:42;39119:14;;39092:22;39100:13;;39092:3;:7;;:22;;;;:::i;:::-;:26;;:42::i;:::-;39085:49;;39016:126;:::o;6407:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6407:41:0;;;-1:-1:-1;;;6407:41:0;;;;;;;;:::o;43065:277::-;43133:4;43158:11;;;:50;;-1:-1:-1;43183:10:0;43173:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;43173:30:0;;;;;;;;;;:35;43158:50;43150:59;;;;;;43230:10;43220:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;43220:30:0;;;;;;;;;;;;:39;;;43275:37;;;;;;;43220:30;;43230:10;43275:37;;;;;;;;;;;-1:-1:-1;43330:4:0;43065:277;;;;:::o;35186:128::-;3055:1;3210:7;;:19;;3202:63;;;;;-1:-1:-1;;;3202:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3202:63:0;;;;;;;;;;;;;;;3055:1;3276:7;:18;35275:31:::1;35292:5:::0;35299:6;35275:16:::1;:31::i;:::-;-1:-1:-1::0;;3011:1:0;3317:7;:22;35186:128::o;32613:210::-;3055:1;3210:7;;:19;;3202:63;;;;;-1:-1:-1;;;3202:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3202:63:0;;;;;;;;;;;;;;;3055:1;3276:7;:18;;;32722:10:::1;32714:19:::0;;:7:::1;:19;::::0;;;;:26;-1:-1:-1;;;32714:26:0;::::1;;;32744:1;32714:31;32706:51;;;::::0;;-1:-1:-1;;;32706:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32706:51:0;;;;;;;;;;;;;::::1;;32768:47;32778:10;32790:12;32804:10;32768:9;:47::i;5521:26::-:0;;;;:::o;6102:31::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6102:31:0;;-1:-1:-1;6102:31:0;:::o;44645:582::-;-1:-1:-1;;;;;44793:17:0;;44744:4;44793:17;;;:9;:17;;;;;;;;44811:10;44793:29;;;;;;;;:49;;44827:14;44793:33;:49::i;:::-;-1:-1:-1;;;;;44761:17:0;;;;;;:9;:17;;;;;;;;44779:10;44761:29;;;;;;;:81;;;;44876:15;;;:7;:15;;;;:20;;;:40;;44901:14;44876:24;:40::i;:::-;-1:-1:-1;;;;;44853:15:0;;;;;;;:7;:15;;;;;;:20;;;;:63;;;;44953:18;;;;;;:23;;:43;;44981:14;44953:27;:43::i;:::-;-1:-1:-1;;;;;44927:18:0;;;;;;;:7;:18;;;;;;;;:23;;:69;;;;45027:17;;;;;:9;:17;;;;;:37;;45049:14;45027:21;:37::i;:::-;-1:-1:-1;;;;;45007:17:0;;;;;;;:9;:17;;;;;;:57;;;;45098:20;;;;;;;:40;;45123:14;45098:24;:40::i;:::-;-1:-1:-1;;;;;45075:20:0;;;;;;;:9;:20;;;;;;;;;:63;;;;45154:43;;;;;;;45075:20;;45154:43;;;;-1:-1:-1;;;;;;;;;;;45154:43:0;;;;;;;;-1:-1:-1;45215:4:0;44645:582;;;;;;:::o;37472:836::-;37559:10;37580:1;37551:19;;;:7;:19;;;;;:26;;;37543:55;;;;;-1:-1:-1;;;37543:55:0;;;;;;;;;;;;-1:-1:-1;;;37543:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37617:28:0;;37609:59;;;;;-1:-1:-1;;;37609:59:0;;;;;;;;;;;;-1:-1:-1;;;37609:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37771:28:0;;37789:10;37771:28;37767:233;;-1:-1:-1;;;;;37824:23:0;;;;;;:7;:23;;;;;:30;-1:-1:-1;;;37824:30:0;;;;:35;37816:66;;;;;-1:-1:-1;;;37816:66:0;;;;;;;;;;;;-1:-1:-1;;;37816:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37913:42:0;;;37905:51;37913:42;;;:26;:42;;;;;;;;;;;;37905:51;;:7;:51;;;:58;-1:-1:-1;;;37905:58:0;;;;:63;37897:91;;;;;-1:-1:-1;;;37897:91:0;;;;;;;;;;;;-1:-1:-1;;;37897:91:0;;;;;;;;;;;;;;;38044:10;38012:21;38036:19;;;:7;:19;;;;;;;;38093:18;;-1:-1:-1;;;;;38093:18:0;;;38066:46;;:26;:46;;;;;:59;;-1:-1:-1;;;;;;38066:59:0;;;;;;38136:42;;;;;;;;;;:55;;;;;;;;38202:35;;;;;;;38255:45;;;;;;;38036:19;;38044:10;38255:45;;;;;;;;;37472:836;;:::o;5271:47::-;5311:6;5271:47;:::o;4942:35::-;4975:2;4942:35;:::o;28618:922::-;28695:45;28726:13;28695:30;:45::i;:::-;28751:18;28772:13;28786;28772:28;;;;;;;;;;;;;;;;;;;;;28839:21;;;:9;:21;;;;;;;28879:14;;;:17;28772:28;;-1:-1:-1;28839:21:0;-1:-1:-1;;;28879:17:0;;;;28900:1;28879:22;28871:45;;;;;-1:-1:-1;;;28871:45:0;;;;;;;;;;;;-1:-1:-1;;;28871:45:0;;;;;;;;;;;;;;;28927:14;;;:21;;-1:-1:-1;;28927:21:0;;;;;:17;28989:23;28998:13;28989:8;:23::i;:::-;29027:14;:21;28974:38;;-1:-1:-1;4744:3:0;-1:-1:-1;29023:98:0;;-1:-1:-1;29104:5:0;29023:98;29137:7;29133:197;;;29161:14;;;:21;;-1:-1:-1;;29161:21:0;;;;;29231;;;;;-1:-1:-1;;;;;29231:21:0;;;29161:17;29208:46;;;:14;29161:17;29208:46;;;;:53;;-1:-1:-1;;29208:53:0;29181:1;29208:53;;;;;;29296:21;;29276:14;:42;;;;;;;;;;;;;;;;29296:21;;;;-1:-1:-1;;;;;;29276:42:0;;;;;;;;;29133:197;29370:21;;;;-1:-1:-1;;;;;29370:21:0;;;29396:5;29342:51;;;:19;:51;;;;;:59;;-1:-1:-1;;29342:59:0;;;29429:16;;;;29414:32;;29429:16;29414:14;:32::i;:::-;29472:60;;;;;;;;;;29512:10;;29497:13;;29472:60;;;;;;;;;28618:922;;;;:::o;5389:26::-;;;;:::o;6199:30::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6199:30:0;:::o;6348:46::-;;;;;;;;;;;;;;;:::o;6455:61::-;;;;;;;;;;;;-1:-1:-1;;;;;6455:61:0;;:::o;35322:512::-;3055:1;3210:7;;:19;;3202:63;;;;;-1:-1:-1;;;3202:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3202:63:0;;;;;;;;;;;;;;;3055:1;3276:7;:18;35454:31;;::::1;35446:61;;;::::0;;-1:-1:-1;;;35446:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35446:61:0;;;;;;;;;;;;;::::1;;35523:9;35518:309;35536:17:::0;;::::1;35518:309;;;35575:22;35600:7;;35608:1;35600:10;;;;;;;;;;;;;35575:35;;35629:3;35625:133;;;35720:10;35702:29;::::0;;;:17:::1;:29;::::0;;;;;35732:6;;35739:1;35732:9;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;35732:9:0::1;-1:-1:-1::0;;;;;35702:40:0::1;-1:-1:-1::0;;;;;35702:40:0::1;;;;;;;;;;;;;35685:57;;35625:133;35772:43;35789:6;;35796:1;35789:9;;;;;;;;;;;;;-1:-1:-1::0;;;;;35789:9:0::1;35800:14;35772:16;:43::i;:::-;-1:-1:-1::0;35555:3:0::1;;35518:309;;;-1:-1:-1::0;;3011:1:0;3317:7;:22;-1:-1:-1;;;;35322:512:0:o;3616:25::-;;;-1:-1:-1;;;;;3616:25:0;;:::o;36177:644::-;3055:1;3210:7;;:19;;3202:63;;;;;-1:-1:-1;;;3202:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3202:63:0;;;;;;;;;;;;;;;3055:1;3276:7;:18;;;10957:10:::1;10930:38:::0;;:26:::1;:38;::::0;;;;;;;;-1:-1:-1;;;;;10930:38:0::1;10922:47:::0;;:7:::1;:47:::0;;;;;10930:38;10922:54:::1;::::0;10914:80:::1;;;::::0;;-1:-1:-1;;;10914:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10914:80:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;36330:31:0;::::2;36261:23;36330:31:::0;;;:24;::::2;:31:::0;;;:24;:31;;;;36287:38;;-1:-1:-1;;;36287:38:0;;36319:4:::2;36287:38;::::0;::::2;::::0;;;36261:23;;36287:75:::2;::::0;36330:31;;;;36287:23:::2;::::0;:38;;;;;36330:24;36287:38;;;;;36330:31;36287:38;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36287:38:0;;:42:::2;:75::i;:::-;36261:101;;36484:1;36466:15;:19;36458:39;;;::::0;;-1:-1:-1;;;36458:39:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;36458:39:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;36516:21:0;::::2;;::::0;;;:14:::2;:21;::::0;;;;;::::2;;36508:46;;;::::0;;-1:-1:-1;;;36508:46:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;36508:46:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;36579:31:0;::::2;:24;:31:::0;;;-1:-1:-1;;;;;;;;;;;36579:24:0::2;:31:::0;:24;:31;;;:36;:88;::::2;;;;4839:3;36619:20;;:48;36579:88;36575:122;;;36670:20;:25:::0;;36694:1:::2;36670:25;::::0;;36575:122:::2;36707:49;5202:6;36733:5;36740:15;36707:18;:49::i;:::-;36774:39;::::0;;;;;;;-1:-1:-1;;;;;36774:39:0;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;::::2;-1:-1:-1::0;;3011:1:0;3317:7;:22;36177:644::o;17206:429::-;17297:18;17328:21;;:::i;:::-;17469:1;17458:8;;;:12;17497:85;;;17458:8;17497:85;;;;;17527:1;17497:85;;;;;17513:12;;17527:1;;;;;;;;;;;17563:7;;17458:5;;17497:15;:85::i;:::-;-1:-1:-1;;17610:13:0;;-1:-1:-1;;17610:17:0;17206:429;;;;:::o;5457:24::-;;;;:::o;4200:32::-;;;;:::o;15831:617::-;15921:18;15952:20;;:::i;:::-;-1:-1:-1;;;;;;15975:21:0;;;;;;;:7;:21;;;;;;;;;15952:44;;;;;;;;;;;;;;-1:-1:-1;;;15952:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16015:17;;;:36;;;16050:1;16036:6;:11;;;:15;16015:36;16007:61;;;;;-1:-1:-1;;;16007:61:0;;;;;;;;;;;;-1:-1:-1;;;16007:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;16087:21:0;;;;;;:7;:21;;;;;:28;;;:33;16079:52;;;;;-1:-1:-1;;;16079:52:0;;;;;;;;;;;;-1:-1:-1;;;16079:52:0;;;;;;;;;;;;;;;16142:21;;:::i;:::-;16283:1;16272:8;;;:12;16310:85;;;16272:8;16310:85;;;;;16340:1;16310:85;;;;;16326:12;;16340:1;;;;;;;;;;;16376:7;;16272:5;;16310:15;:85::i;:::-;-1:-1:-1;;16423:13:0;;-1:-1:-1;;16423:17:0;;15831:617;-1:-1:-1;;;15831:617:0:o;5789:44::-;;;;;;;;;;;;;:::o;39883:146::-;-1:-1:-1;;;;;39991:23:0;;;39964:7;39991:23;;;:17;:23;;;;;;;;:30;;;;;;;;;;;;;39883:146::o;6140:46::-;;;;;;;;;;;;;;;:::o;39771:104::-;39846:14;:21;39771:104;:::o;39647:112::-;39731:13;:20;39647:112;:::o;43350:410::-;3055:1;3210:7;;:19;;3202:63;;;;;-1:-1:-1;;;3202:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3202:63:0;;;;;;;;;;;;;;;3055:1;3276:7;:18;;;43471:10:::1;43463:19:::0;;:7:::1;:19;::::0;;;;:26:::1;;::::0;:44:::1;::::0;43494:12;43463:30:::1;:44::i;:::-;43442:10;43434:19;::::0;;;:7:::1;:19;::::0;;;;:26:::1;::::0;::::1;:73:::0;;;;43545:24:::1;;::::0;:42:::1;::::0;43574:12;43545:28:::1;:42::i;:::-;43526:10;43518:19;::::0;;;:7:::1;:19;::::0;;;;:24:::1;;:69:::0;43612:11:::1;::::0;:29:::1;::::0;43628:12;43612:15:::1;:29::i;:::-;43598:11;:43:::0;43664:9:::1;::::0;:27:::1;::::0;43678:12;43664:13:::1;:27::i;:::-;43652:9;:39:::0;43707:45:::1;::::0;;;;;;;43727:10:::1;::::0;43707:45:::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;3011:1:0;3317:7;:22;43350:410::o;4405:28::-;;;;:::o;5713:40::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5713:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4127:33::-;;;;:::o;3840:30::-;;;;:::o;14803:1020::-;15457:18;15488:21;;:::i;:::-;15629:1;15618:8;;;:12;15661:109;;;15618:8;15661:109;;;;;;;;;;;;;;;;;;;;15677:8;;15687:1;;;;15693:11;;15687:1;;15718:17;;15687:1;;15749:7;;15618:5;;15661:109;15765:4;;;;;;15661:109;;15765:4;;;;15661:109;;;;;;;;;-1:-1:-1;15661:15:0;;-1:-1:-1;;;15661:109:0:i;:::-;-1:-1:-1;;15798:13:0;;-1:-1:-1;;15798:17:0;14803:1020;;;;;;;;:::o;38650:169::-;38727:4;38773:38;38792:18;;38773:14;:18;;:38;;;;:::i;:::-;38751:18;:16;:18::i;:::-;:60;;;38650:169;-1:-1:-1;;38650:169:0:o;19132:2132::-;3055:1;3210:7;;:19;;3202:63;;;;;-1:-1:-1;;;3202:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3202:63:0;;;;;;;;;;;;;;;3055:1;3276:7;:18;;;10957:10:::1;10930:38:::0;;:26:::1;:38;::::0;;;;;;;;-1:-1:-1;;;;;10930:38:0::1;10922:47:::0;;:7:::1;:47:::0;;;;;10930:38;10922:54:::1;::::0;10914:80:::1;;;::::0;;-1:-1:-1;;;10914:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10914:80:0;;;;;;;;;;;;;::::1;;19389:15:::2;::::0;19331:12:::2;::::0;19324:81:::2;::::0;-1:-1:-1;;;;;19331:12:0;;::::2;::::0;19362:10:::2;::::0;19382:4:::2;::::0;19324:37:::2;:81::i;:::-;19443:12;::::0;19457:15:::2;::::0;19416:57:::2;::::0;5257:6:::2;::::0;-1:-1:-1;;;;;19443:12:0;;::::2;::::0;19416:18:::2;:57::i;:::-;19484:25;19512:21:::0;;;:9:::2;:21;::::0;;;;19552:17:::2;::::0;::::2;::::0;-1:-1:-1;;;;;19552:17:0::2;19544:53;;;::::0;;-1:-1:-1;;;19544:53:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19544:53:0;;;;;;;;;;;;;::::2;;19616:14;::::0;::::2;:17:::0;::::2;;:22:::0;19608:44:::2;;;::::0;;-1:-1:-1;;;19608:44:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19608:44:0;;;;;;;;;;;;;::::2;;19671:14;::::0;::::2;:17:::0;;;::::2;;;:22:::0;19663:44:::2;;;::::0;;-1:-1:-1;;;19663:44:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19663:44:0;;;;;;;;;;;;;::::2;;19734:18:::0;;-1:-1:-1;;;;;19734:18:0::2;19726:27;::::0;;;:7:::2;:27;::::0;;;;:34:::2;;::::0;:39;19718:68:::2;;;::::0;;-1:-1:-1;;;19718:68:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19718:68:0;;;;;;;;;;;;;::::2;;19829:1;19803:8;:23;;;:27;:83;;;;-1:-1:-1::0;19859:21:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;19859:21:0::2;19834:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;19834:24:0::2;:47:::0;:24;:47;;;:52;19803:83:::2;19799:192;;;4839:3;19911:20;;:48;19903:76;;;::::0;;-1:-1:-1;;;19903:76:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19903:76:0;;;;;;;;;;;;;::::2;;20038:14;::::0;::::2;:17:::0;-1:-1:-1;;;20038:17:0;::::2;;;20059:1;20038:22;20034:601;;;20109:21;::::0;::::2;::::0;-1:-1:-1;;;;;20109:21:0::2;20086:46;::::0;;;:14:::2;:46;::::0;;;;;::::2;;20085:47;20077:71;;;::::0;;-1:-1:-1;;;20077:71:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;20077:71:0;;;;;;;;;;;;;::::2;;20200:21;::::0;::::2;::::0;-1:-1:-1;;;;;20200:21:0::2;20172:51;::::0;;;:19:::2;:51;::::0;;;;;::::2;;20171:52;20163:83;;;::::0;;-1:-1:-1;;;20163:83:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;20163:83:0;;;;;;;;;;;;;::::2;;20269:14;:21:::0;4744:3:::2;-1:-1:-1::0;20261:77:0::2;;;::::0;;-1:-1:-1;;;20261:77:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;20261:77:0;;;;;;;;;;;;;::::2;;20381:21;::::0;::::2;::::0;-1:-1:-1;;;;;20381:21:0::2;20353:51;::::0;;;:19:::2;:51;::::0;;;;:58;;-1:-1:-1;;20353:58:0::2;20407:4;20353:58;::::0;;20034:601:::2;;;20467:14;::::0;::::2;:17:::0;;;::::2;;;20488:1;20467:22;20463:172;;;20530:18:::0;;-1:-1:-1;;;;;20530:18:0::2;20515:34;::::0;;;:14:::2;:34;::::0;;;;;::::2;;20514:35;20506:61;;;::::0;;-1:-1:-1;;;20506:61:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;20506:61:0;;;;;;;;;;;;;::::2;;20597:18:::0;;-1:-1:-1;;;;;20597:18:0::2;20582:34;::::0;;;:14:::2;:34;::::0;;;;:41;;-1:-1:-1;;20582:41:0::2;20619:4;20582:41;::::0;;20463:172:::2;20695:22;20720:159;20738:18;:16;:18::i;:::-;20771:13;:20:::0;:25;:97:::2;;20813:13;20827:20:::0;;20803:9:::2;::::0;:50:::2;::::0;-1:-1:-1;;20827:24:0;;;20813:39;::::2;;;;;;;;;;;;;20803:50;;;;;;;;;;;:65;;;20771:97;;;20799:1;20771:97;20720:3;:159::i;:::-;20882:1;20720:163:::0;;::::2;20896:23;::::0;::::2;:40:::0;;;20993:10:::2;20966:38;::::0;;;:26:::2;:38;::::0;;;;;;;;20947:16:::2;::::0;::::2;:57:::0;;-1:-1:-1;;;;;;20947:57:0::2;-1:-1:-1::0;;;;;20966:38:0;;::::2;20947:57;::::0;;21015:14:::2;::::0;::::2;:21:::0;;-1:-1:-1;;21015:21:0::2;::::0;::::2;::::0;;21101:13:::2;:30:::0;;;;::::2;::::0;;;;;;;;;::::2;::::0;;;21185:16;;21215:20;;21157:99;;;;;-1:-1:-1;;21215:24:0;;;21157:99;;::::2;::::0;;;;;;;;;;;20720:163;;-1:-1:-1;21185:16:0;::::2;::::0;20993:10;;21157:99:::2;::::0;;;;;;;::::2;-1:-1:-1::0;;3011:1:0;3317:7;:22;-1:-1:-1;19132:2132:0:o;21323:1803::-;3055:1;3210:7;;:19;;3202:63;;;;;-1:-1:-1;;;3202:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3202:63:0;;;;;;;;;;;;;;;3055:1;3276:7;:18;;;10957:10:::1;10930:38:::0;;:26:::1;:38;::::0;;;;;;;;-1:-1:-1;;;;;10930:38:0::1;10922:47:::0;;:7:::1;:47:::0;;;;;10930:38;10922:54:::1;::::0;10914:80:::1;;;::::0;;-1:-1:-1;;;10914:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10914:80:0;;;;;;;;;;;;;::::1;;21479:10:::2;21428:21;21452:38:::0;;;:26:::2;:38;::::0;;;;;;;;-1:-1:-1;;;;;21452:38:0::2;21525:22:::0;;;:7:::2;:22:::0;;;;;;21582:13:::2;:20:::0;21566:36;::::2;21558:58;;;::::0;;-1:-1:-1;;;21558:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21558:58:0;;;;;;;;;;;;;::::2;;21627:18;21648:13;21662;21648:28;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;21715:21;;;:9:::2;:21:::0;;;;;;;21648:28;;-1:-1:-1;21766:1:0::2;21755:12;::::0;::::2;;21747:27;;;::::0;;-1:-1:-1;;;21747:27:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21747:27:0;;;;;;;;;;;;;::::2;;21785:9;21802:8;21797:14;;;;;;;;;;21785:26;;21852:8;:23;;;21830:18;:16;:18::i;:::-;:45;;21822:65;;;::::0;;-1:-1:-1;;;21822:65:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21822:65:0;;;;;;;;;;;;;::::2;;21907:47;21930:8;:23;;;21907:22;:47::i;:::-;21906:48;21898:68;;;::::0;;-1:-1:-1;;;21898:68:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21898:68:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;21985:37:0;::::2;22026:9;21985:37:::0;;;:22:::2;::::0;::::2;:37;::::0;;;;;::::2;;:50;::::0;::::2;;;;;;;21977:68;;;::::0;;-1:-1:-1;;;21977:68:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21977:68:0;;;;;;;;;;;;;::::2;;22072:8;22064:4;:16;;;;;;;;;:35;;;-1:-1:-1::0;22092:7:0::2;22084:4;:15;;;;;;;;;22064:35;22056:56;;;::::0;;-1:-1:-1;;;22056:56:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;22056:56:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;22123:37:0;::::2;;::::0;;;:22:::2;::::0;::::2;:37;::::0;;;;:44;;22163:4;;22123:37;-1:-1:-1;;22123:44:0::2;::::0;22163:4;22123:44:::2;::::0;::::2;;;;;;;;::::0;;-1:-1:-1;22192:8:0::2;22184:4;:16;;;;;;;;;22180:681;;;22238:13;::::0;::::2;::::0;22217:17:::2;::::0;::::2;:34:::0;;;;::::2;::::0;;22383:26:::2;::::0;::::2;::::0;22367:42;::::2;22363:125;;;22430:26;::::0;::::2;:42:::0;;;22363:125:::2;22632:8;:39;;;22618:11;;:53;22614:147;;;22734:11;::::0;22692:39:::2;::::0;::::2;:53:::0;22614:147:::2;22180:681;;;22792:7;22784:4;:15;;;;;;;;;22780:81;;;22836:13;::::0;::::2;::::0;22816:16:::2;::::0;::::2;:33:::0;;;;::::2;::::0;;22780:81:::2;23044:74;::::0;;;;;::::2;::::0;::::2;;::::0;::::2;::::0;;;-1:-1:-1;;;;;23044:74:0;::::2;::::0;23082:10:::2;::::0;23067:13;;23044:74:::2;::::0;;;;;;;;;::::2;-1:-1:-1::0;;3011:1:0;3317:7;:22;-1:-1:-1;;;;;21323:1803:0:o;5617:35::-;;;;:::o;29552:1341::-;3055:1;3210:7;;:19;;3202:63;;;;;-1:-1:-1;;;3202:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3202:63:0;;;;;;;;;;;;;;;3055:1;3276:7;:18;29643:45:::1;29674:13:::0;29643:30:::1;:45::i;:::-;29699:18;29720:13;29734;29720:28;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;::::0;29787:21;;;:9:::1;:21:::0;;;;;;;29827:14:::1;::::0;::::1;:17:::0;29720:28;;-1:-1:-1;29787:21:0;29827:17;;::::1;;;29848:1;29827:22;29819:46;;;::::0;;-1:-1:-1;;;29819:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29819:46:0;;;;;;;;;;;;;::::1;;29876:14;::::0;::::1;:21:::0;;-1:-1:-1;;29876:21:0::1;;;::::0;;:17;29938:23:::1;29947:13:::0;29938:8:::1;:23::i;:::-;29923:38;;29976:7;29972:774;;;30000:14;::::0;::::1;:21:::0;;-1:-1:-1;;30000:21:0::1;::::0;::::1;::::0;;:17;30047:628:::1;30071:14;:21:::0;30067:25;::::1;30047:628;;;5202:6;30412:24;30439::::0;;;:17:::1;:24;::::0;30464:14:::1;:17:::0;;-1:-1:-1;;;;;;;;;;;30439:24:0;30412;;30479:1;;30464:17;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;30464:17:0::1;30439:43:::0;;;;::::1;::::0;;;;;;;;;;;5202:6:::1;30501:24:::0;;:17:::1;:24:::0;;;30526:14:::1;:17:::0;;30439:43;;-1:-1:-1;30439:43:0;;-1:-1:-1;;;;;;;;;;;30501:24:0;30464:17;30526:14;30541:1;;30526:17;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;30526:17:0;;::::1;30501:43:::0;;;;::::1;::::0;;;;;;;;;;:63;;;;;::::1;::::0;;;30601:18;;;;::::1;30583:37:::0;;:17:::1;:37:::0;;;;;;30621:14:::1;:17:::0;;30643:16;;30526:17;30621:14;30636:1;;30621:17;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;30621:17:0::1;30583:56:::0;;;::::1;::::0;;;;;;;;:76;;;;::::1;::::0;;-1:-1:-1;30621:17:0;30094:3:::1;30047:628;;;-1:-1:-1::0;30713:14:0::1;:21:::0;30689:20:::1;:45:::0;;;;;::::1;::::0;;29972:774:::1;30781:16;::::0;::::1;::::0;30766:32:::1;::::0;-1:-1:-1;;;;;30781:16:0::1;30766:14;:32::i;:::-;30824:61;::::0;;;::::1;;::::0;;;;30865:10;;30850:13;;30824:61:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;3011:1:0;3317:7;:22;-1:-1:-1;;29552:1341:0:o;38405:237::-;38523:13;:20;38476:4;;38501:42;;38493:64;;;;;-1:-1:-1;;;38493:64:0;;;;;;;;;;;;-1:-1:-1;;;38493:64:0;;;;;;;;;;;;;;;38575:9;:45;38585:13;38599:19;38585:34;;;;;;;;;;;;;;;;38575:45;;;;;;;;;;;:51;;38627:1;38575:54;;;;;;;;;;;;;;;;;;;;;;;;;:59;;38633:1;38575:59;38568:66;;38405:237;;;:::o;11022:1638::-;11462:11;;;;11461:12;11453:36;;;;;-1:-1:-1;;;11453:36:0;;;;;;;;;;;;-1:-1:-1;;;11453:36:0;;;;;;;;;;;;;;;11525:11;-1:-1:-1;;;;;11508:28:0;:13;-1:-1:-1;;;;;11508:28:0;;;11500:66;;;;;-1:-1:-1;;;11500:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11605:15;:22;11585:9;:16;:42;11577:81;;;;;-1:-1:-1;;;11577:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11697:17;11677:16;:37;;11669:86;;;;-1:-1:-1;;;11669:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11781:9;11776:120;11800:9;:16;11796:1;:20;11776:120;;;11838:46;11848:9;11858:1;11848:12;;;;;;;;;;;;;;11862:15;11878:1;11862:18;;;;;;;;;;;;;;11882:1;11838:9;:46::i;:::-;11818:3;;11776:120;;;;4641:6;11924:11;;:30;;11916:54;;;;;-1:-1:-1;;;11916:54:0;;;;;;;;;;;;-1:-1:-1;;;11916:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;11981:29:0;;;;;;:14;:29;;;;;:36;;-1:-1:-1;;11981:36:0;12013:4;11981:36;;;;;;12028:14;:34;;;;;;;;;;;;;;-1:-1:-1;;;;;;12028:34:0;;;;;;12087:20;;12083:151;;12124:20;:25;;12148:1;12124:25;;;12164:58;5202:6;12190:13;12205:16;12164:18;:58::i;:::-;12254:12;:28;;-1:-1:-1;;;;;12254:28:0;;;-1:-1:-1;;;;;;12254:28:0;;;;;;12293:10;:24;;;;;;;;;;;;;;;12328:15;:34;;;;12373:16;:36;;;;12420:14;:32;12463:18;:40;12514:17;:38;-1:-1:-1;;;12563:13:0;:30;;;;12620:3;12604:13;:19;12634:11;:18;;-1:-1:-1;;12634:18:0;;;;;;11022:1638::o;16460:734::-;16554:18;-1:-1:-1;;;;;16593:30:0;;16585:49;;;;;-1:-1:-1;;;16585:49:0;;;;;;;;;;;;-1:-1:-1;;;16585:49:0;;;;;;;;;;;;;;;16673:10;;-1:-1:-1;;;;;16653:30:0;;;16673:10;;16653:30;;16645:72;;;;;-1:-1:-1;;;16645:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16737:32:0;;;;;;:14;:32;;;;;;;;16736:33;16728:57;;;;;-1:-1:-1;;;16728:57:0;;;;;;;;;;;;-1:-1:-1;;;16728:57:0;;;;;;;;;;;;;;;16804:14;:21;4744:3;-1:-1:-1;16796:77:0;;;;;-1:-1:-1;;;16796:77:0;;;;;;;;;;;;-1:-1:-1;;;16796:77:0;;;;;;;;;;;;;;;16884:21;;:::i;:::-;17025:1;17014:8;;;:12;17052:89;;;17014:8;17052:89;;;;;17076:1;17052:89;;;;;17076:1;;;;;;17089:16;;17076:1;;;;17122:7;;17014:5;;17052:15;:89::i;44143:490::-;44274:10;44222:4;44266:19;;;:7;:19;;;;;:24;;;:44;;44295:14;44266:28;:44::i;:::-;44247:10;44239:19;;;;:7;:19;;;;;;:24;;;;:71;;;;-1:-1:-1;;;;;44347:18:0;;;;;;:23;;:43;;44375:14;44347:27;:43::i;:::-;-1:-1:-1;;;;;44321:18:0;;;;;;:7;:18;;;;;;;;:23;;:69;;;;44435:10;44425:21;;:9;:21;;;;:41;;44451:14;44425:25;:41::i;:::-;44411:10;44401:21;;;;:9;:21;;;;;;:65;;;;-1:-1:-1;;;;;44500:20:0;;;;;;:40;;44525:14;44500:24;:40::i;:::-;-1:-1:-1;;;;;44477:20:0;;;;;;:9;:20;;;;;;;;;:63;;;;44556:47;;;;;;;44477:20;;44565:10;;-1:-1:-1;;;;;;;;;;;44556:47:0;;;;;;;;;-1:-1:-1;44621:4:0;44143:490;;;;:::o;4272:28::-;;;;:::o;39496:139::-;39565:15;;:::i;:::-;39600:21;;;;:9;:21;;;;;;39593:34;;;;;;;;;;39600:27;;;;;39593:34;;39600:27;;39593:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39593:34:0;;39496:139;-1:-1:-1;;;;;;;39496:139:0:o;4029:29::-;;;;:::o;43772:363::-;3055:1;3210:7;;:19;;3202:63;;;;;-1:-1:-1;;;3202:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3202:63:0;;;;;;;;;;;;;;;3055:1;3276:7;:18;;;43857:10;43850:70:::1;::::0;-1:-1:-1;;;;;43857:10:0::1;43886;43906:4;43913:6:::0;43850:35:::1;:70::i;:::-;43975:32;43985:10;43997:6;44005:1;43975:9;:32::i;:::-;4641:6;44026:11;;:30;;44018:54;;;::::0;;-1:-1:-1;;;44018:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;44018:54:0;;;;;;;;;;;;;::::1;;44088:39;::::0;;;;;;;44108:10:::1;::::0;44088:39:::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;3011:1:0;3317:7;:22;43772:363::o;3529:27::-;;;-1:-1:-1;;;;;3529:27:0;;:::o;5325:28::-;;;;:::o;5864:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;34700:474::-;3055:1;3210:7;;:19;;3202:63;;;;;-1:-1:-1;;;3202:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3202:63:0;;;;;;;;;;;;;;;3055:1;3276:7;:18;;;10957:10:::1;10930:38:::0;;:26:::1;:38;::::0;;;;;;;;-1:-1:-1;;;;;10930:38:0::1;10922:47:::0;;:7:::1;:47:::0;;;;;10930:38;10922:54:::1;::::0;10914:80:::1;;;::::0;;-1:-1:-1;;;10914:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10914:80:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34810:21:0;::::2;34786;34810::::0;;;:7:::2;:21;::::0;;;;34850:13:::2;::::0;::::2;::::0;34842:38:::2;;;::::0;;-1:-1:-1;;;34842:38:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34842:38:0;;;;;;;;;;;;;::::2;;34913:1;34899:6;:11;;;:15;34891:33;;;::::0;;-1:-1:-1;;;34891:33:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34891:33:0;;;;;;;;;;;;;::::2;;35007:39;35019:6;:26;;;35007:11;:39::i;:::-;34999:117;;;;-1:-1:-1::0;;;34999:117:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35127:39;35137:12;35151:1;35154:6;:11;;;35127:9;:39::i;36943:521::-:0;37007:25;37035:21;;;:9;:21;;;;;37075:14;;;:17;;;:22;37067:44;;;;;-1:-1:-1;;;37067:44:0;;;;;;;;;;;;-1:-1:-1;;;37067:44:0;;;;;;;;;;;;;;;37130:14;;;:17;;;;;;:22;37122:44;;;;;-1:-1:-1;;;37122:44:0;;;;;;;;;;;;-1:-1:-1;;;37122:44:0;;;;;;;;;;;;;;;37199:17;;;;-1:-1:-1;;;;;37199:17:0;37185:10;:31;37177:53;;;;;-1:-1:-1;;;37177:53:0;;;;;;;;;;;;-1:-1:-1;;;37177:53:0;;;;;;;;;;;;;;;37241:14;;;:21;;-1:-1:-1;;37241:21:0;;;;;37261:1;37326:17;;;37256:1;37345:21;;;37368:23;;;;37295:97;;5257:6;;-1:-1:-1;;;;;37326:17:0;;;;37345:21;;;37295:22;:97::i;:::-;37418:38;;;37445:10;37418:38;;;;37433:10;;37418:38;;;;;;;;;;36943:521;;:::o;6290:51::-;;;;;;;;;;;;;;;:::o;27552:1054::-;3055:1;3210:7;;:19;;3202:63;;;;;-1:-1:-1;;;3202:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3202:63:0;;;;;;;;;;;;;;;3055:1;3276:7;:18;27642:45:::1;27673:13:::0;27642:30:::1;:45::i;:::-;27698:18;27719:13;27733;27719:28;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;::::0;27786:21;;;:9:::1;:21:::0;;;;;;;27826:14:::1;::::0;::::1;:17:::0;27719:28;;-1:-1:-1;27786:21:0;27826:17;;::::1;;;27847:1;27826:22;27818:40;;;::::0;;-1:-1:-1;;;27818:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27818:40:0;;;;;;;;;;;;;::::1;;27869:14;::::0;::::1;:21:::0;;-1:-1:-1;;27869:21:0::1;;;::::0;;:17;27931:23:::1;27940:13:::0;27931:8:::1;:23::i;:::-;27916:38;;27969:7;27965:448;;;27993:14;::::0;::::1;:21:::0;;-1:-1:-1;;27993:21:0::1;::::0;::::1;::::0;;28072:18;;-1:-1:-1;;;;;28072:18:0::1;27993:17:::0;28064:27;;;:7:::1;27993:17;28064:27:::0;;;;28106:13:::1;::::0;::::1;:29:::0;;;28013:1:::1;28220:13:::0;::::1;::::0;28008:1:::1;28204:11:::0;::::1;::::0;:30:::1;::::0;:15:::1;:30::i;:::-;28190:11;::::0;::::1;:44:::0;28279:13:::1;::::0;::::1;::::0;28263:11:::1;::::0;:30:::1;::::0;:15:::1;:30::i;:::-;28249:11;:44:::0;28334:13:::1;::::0;::::1;::::0;28320:9:::1;::::0;:28:::1;::::0;:13:::1;:28::i;:::-;28308:9;:40:::0;28379:1:::1;28363:13;::::0;;::::1;:17:::0;27965:448:::1;28440:18:::0;;-1:-1:-1;;;;;28440:18:0;;::::1;28462:5;28425:34:::0;;;:14:::1;:34;::::0;;;;:42;;-1:-1:-1;;28425:42:0::1;::::0;;28495:16:::1;::::0;::::1;::::0;28480:32:::1;::::0;28495:16:::1;28480:14;:32::i;:::-;28538:60;::::0;;;::::1;;::::0;;;;28578:10;;28563:13;;28538:60:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;3011:1:0;3317:7;:22;-1:-1:-1;;27552:1054:0:o;23134:2600::-;3055:1;3210:7;;:19;;3202:63;;;;;-1:-1:-1;;;3202:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3202:63:0;;;;;;;;;;;;;;;3055:1;3276:7;:18;23215:45:::1;23246:13:::0;23215:30:::1;:45::i;:::-;23271:18;23292:13;23306;23292:28;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;::::0;23359:21;;;:9:::1;:21:::0;;;;;;;23399:14:::1;::::0;::::1;:17:::0;23292:28;;-1:-1:-1;23359:21:0;23399:17;;::::1;;;23420:1;23399:22;23391:44;;;::::0;;-1:-1:-1;;;23391:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;23391:44:0;;;;;;;;;;;;;::::1;;23446:14;::::0;::::1;:21:::0;;-1:-1:-1;;23446:21:0::1;;;::::0;;:17;23516:23:::1;23525:13:::0;23516:8:::1;:23::i;:::-;23501:38;;4641:6;23648:69;23694:8;:22;;;23648:41;23664:8;:24;;;23648:11;;:15;;:41;;;;:::i;:::-;:45:::0;::::1;:69::i;:::-;:87;23644:135;;;-1:-1:-1::0;23762:5:0::1;23644:135;23964:21;::::0;::::1;::::0;-1:-1:-1;;;;;23964:21:0::1;23939:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;23939:24:0::1;:47:::0;:24;:47;;;23911:25:::1;::::0;::::1;::::0;:75:::1;23907:123;;;-1:-1:-1::0;24013:5:0::1;23907:123;24181:1;24155:8;:23;;;:27;:83;;;;-1:-1:-1::0;24211:21:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;24211:21:0::1;24186:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;24186:24:0::1;:47:::0;:24;:47;;;:52;24155:83:::1;:136;;;;;4839:3;24242:20;;:49;;24155:136;24151:184;;;-1:-1:-1::0;24318:5:0::1;24151:184;24379:7;24375:1230;;;24403:14;::::0;::::1;:21:::0;;-1:-1:-1;;24403:21:0::1;::::0;::::1;::::0;;24462:18;;24482:24:::1;::::0;::::1;::::0;24508:22:::1;::::0;::::1;::::0;24452:79:::1;::::0;-1:-1:-1;;;;;24462:18:0::1;::::0;24482:24;24452:9:::1;:79::i;:::-;24714:21;::::0;::::1;::::0;-1:-1:-1;;;;;24714:21:0::1;24689:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;24689:24:0::1;:47:::0;:24;:47;;;:52;:83;::::1;;;;24771:1;24745:8;:23;;;:27;24689:83;24685:149;;;24793:20;:25:::0;;24817:1:::1;24793:25;::::0;;24685:149:::1;24888:21;::::0;::::1;::::0;24911:23:::1;::::0;::::1;::::0;24850:85:::1;::::0;5257:6:::1;::::0;5202::::1;::::0;-1:-1:-1;;;;;24888:21:0::1;::::0;24850:22:::1;:85::i;:::-;24980:18:::0;;25000:21:::1;::::0;::::1;::::0;25023:25:::1;::::0;::::1;::::0;24950:99:::1;::::0;5202:6:::1;::::0;-1:-1:-1;;;;;24980:18:0;;::::1;::::0;25000:21;::::1;::::0;24950:22:::1;:99::i;:::-;25208:21;::::0;::::1;::::0;-1:-1:-1;;;;;25208:21:0::1;25183:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;25183:24:0::1;:47:::0;:24;:47;;;:52;:85;::::1;;;;25267:1;25239:8;:25;;;:29;25183:85;25179:151;;;25289:20;:25:::0;;-1:-1:-1;;25289:25:0;;;25179:151:::1;24375:1230;;;25527:17;::::0;::::1;::::0;25546:21:::1;::::0;::::1;::::0;25569:23:::1;::::0;::::1;::::0;25496:97:::1;::::0;5257:6:::1;::::0;-1:-1:-1;;;;;25527:17:0;;::::1;::::0;25546:21;::::1;::::0;25496:22:::1;:97::i;:::-;25632:16;::::0;::::1;::::0;25617:32:::1;::::0;-1:-1:-1;;;;;25632:16:0::1;25617:14;:32::i;:::-;25675:51;::::0;;;::::1;;::::0;;;;25706:10;;25691:13;;25675:51:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;3011:1:0;3317:7;:22;-1:-1:-1;;23134:2600:0:o;5216:48::-;5257:6;5216:48;:::o;12744:2046::-;13064:18;3055:1;3210:7;;:19;;3202:63;;;;;-1:-1:-1;;;3202:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3202:63:0;;;;;;;;;;;;;;;3055:1;3276:7;:18;4641:6:::1;13103:34;:15:::0;13123:13;13103:19:::1;:34::i;:::-;:53;;13095:77;;;::::0;;-1:-1:-1;;;13095:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;13095:77:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;13191:28:0;::::1;;::::0;;;:14:::1;:28;::::0;;;;;::::1;;13183:66;;;::::0;;-1:-1:-1;;;13183:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;13268:28:0;::::1;;::::0;;;:14:::1;:28;::::0;;;;;::::1;;13260:66;;;::::0;;-1:-1:-1;;;13260:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;13345:18:0;::::1;5202:6;13345:18;::::0;::::1;::::0;:41:::1;;-1:-1:-1::0;;;;;;13367:19:0;::::1;5257:6;13367:19;;13345:41;:63;;;;-1:-1:-1::0;;;;;;13390:18:0;::::1;5311:6;13390:18;;13345:63;13337:98;;;::::0;;-1:-1:-1;;;13337:98:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;13337:98:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;13454:18:0;::::1;;::::0;;;:7:::1;:18;::::0;;;;:25:::1;;::::0;:30;13446:59:::1;;;::::0;;-1:-1:-1;;;13446:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;13446:59:0;;;;;;;;;;;;;::::1;;13539:1;13522:14;:18;:65;;;;-1:-1:-1::0;;;;;;13544:38:0;::::1;:24;:38:::0;;;-1:-1:-1;;;;;;;;;;;13544:24:0::1;:38:::0;:24;:38;;;:43;13522:65:::1;13518:174;;;4839:3;13612:20;;:48;13604:76;;;::::0;;-1:-1:-1;;;13604:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;13604:76:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;13836:20:0;::::1;3738:42;13836:20;:37:::0;::::1;;;;13872:1;13860:9;:13;13836:37;13832:439;;;13911:14;13898:9;:27;13890:51;;;::::0;;-1:-1:-1;;;13890:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;13890:51:0;;;;;;;;;;;;;::::1;;3738:42;-1:-1:-1::0;;;;;13956:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;14011:31:0::1;::::0;13993:12:::1;::::0;-1:-1:-1;3738:42:0::1;::::0;-1:-1:-1;14028:9:0::1;::::0;13993:12;14011:31;13993:12;14011:31;14028:9;3738:42;14011:31:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13992:50;;;14065:7;14057:28;;;::::0;;-1:-1:-1;;;14057:28:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;14057:28:0;;;;;;;;;;;;;::::1;;14100:46;::::0;;-1:-1:-1;;;14100:46:0;;14129:4:::1;14100:46;::::0;::::1;::::0;14136:9:::1;14100:46:::0;;;;;;3738:42:::1;::::0;14100:20:::1;::::0;:46;;;;;::::1;::::0;;;;;;;;-1:-1:-1;3738:42:0;14100:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;13832:439:0::1;::::0;-1:-1:-1;;13832:439:0::1;;14179:80;-1:-1:-1::0;;;;;14179:37:0;::::1;14217:10;14237:4;14244:14:::0;14179:37:::1;:80::i;:::-;14291:56;5257:6;14318:12;14332:14;14291:18;:56::i;:::-;14368:21;;:::i;:::-;14509:1;14498:8:::0;;::::1;:12:::0;14535:140:::1;::::0;;14498:8:::1;14535:140:::0;::::1;::::0;;;-1:-1:-1;14535:140:0;;::::1;::::0;14551:9;;14562:15;;14579:13;;14594:14;;14610:12;;14624:16;;14642:12;;14656:7;;14498:5;;14535:15:::1;:140::i;:::-;-1:-1:-1::0;;14703:13:0::1;::::0;-1:-1:-1;;14703:17:0;3011:1;3317:7;:22;12744:2046;;-1:-1:-1;;;;;;;;12744:2046:0:o;3707:73::-;3738:42;3707:73;:::o;5162:47::-;5202:6;5162:47;:::o;25747:1797::-;25832:4;25838:12;3055:1;3210:7;;:19;;3202:63;;;;;-1:-1:-1;;;3202:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3202:63:0;;;;;;;;;;;;;;;3055:1;3276:7;:18;25863:45:::1;25894:13:::0;25863:30:::1;:45::i;:::-;25919:18;25940:13;25954;25940:28;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;::::0;26002:19;;;:7:::1;:19:::0;;;;;;26060:9:::1;:21:::0;;;;;;26100:14:::1;::::0;::::1;:17:::0;25940:28;;-1:-1:-1;26002:19:0;;26100:17;;::::1;;;26121:1;26100:22;26092:42;;;::::0;;-1:-1:-1;;;26092:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26092:42:0;;;;;;;;;;;;;::::1;;26145:14;::::0;::::1;:21:::0;;-1:-1:-1;;26145:21:0::1;;;::::0;;:17;26207:23:::1;26216:13:::0;26207:8:::1;:23::i;:::-;26375:18:::0;;-1:-1:-1;;;;;26375:18:0::1;26360:34;::::0;;;:14:::1;:34;::::0;;;;;26192:38;;-1:-1:-1;26360:34:0::1;;:110:::0;::::1;;;-1:-1:-1::0;26451:18:0;;-1:-1:-1;;;;;26451:18:0::1;26426:24;:44:::0;;;-1:-1:-1;;;;;;;;;;;26426:24:0::1;:44:::0;:24;:44;;;26398:25:::1;::::0;::::1;::::0;:72:::1;26360:110;26356:158;;;-1:-1:-1::0;26497:5:0::1;26356:158;26663:21;26637:8;:23;;;:47;26633:95;;;-1:-1:-1::0;26711:5:0::1;26633:95;26744:7;26740:661;;;26768:14;::::0;::::1;:21:::0;;-1:-1:-1;;26768:21:0::1;::::0;::::1;::::0;;26857:18;;26888:23:::1;::::0;::::1;::::0;26857:63:::1;::::0;;;26768:17;;26830:23:::1;::::0;-1:-1:-1;;;;;26857:18:0;;::::1;::::0;26888:23;;26913:6;;26857:63;;;26913:6;;26783:1:::1;-1:-1:-1::0;;26788:1:0::1;26857:63:::0;::::1;;26768:21;26857:63;::::0;;;::::1;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;26954:18:0;;-1:-1:-1;;;;;26954:18:0::1;26939:34;::::0;;;:14:::1;:34;::::0;;;;;26815:105;;-1:-1:-1;26815:105:0;-1:-1:-1;26939:34:0::1;;26935:412;;;27027:18:::0;;27047:25:::1;::::0;::::1;::::0;26994:79:::1;::::0;5202:6:::1;::::0;-1:-1:-1;;;;;27027:18:0;;::::1;::::0;26994:25:::1;:79::i;:::-;27245:18:::0;;-1:-1:-1;;;;;27245:18:0::1;27220:24;:44:::0;;;-1:-1:-1;;;;;;;;;;;27220:24:0::1;:44:::0;:24;:44;;;:49;:82;::::1;;;;27301:1;27273:8;:25;;;:29;27220:82;27216:116;;;27305:20;:25:::0;;-1:-1:-1;;27305:25:0;;;27216:116:::1;27369:7:::0;;-1:-1:-1;27378:10:0;-1:-1:-1;27361:28:0::1;::::0;-1:-1:-1;;;;27361:28:0::1;26740:661;27436:16;::::0;::::1;::::0;27421:32:::1;::::0;-1:-1:-1;;;;;27436:16:0::1;27421:14;:32::i;:::-;27479:57;::::0;;;::::1;;::::0;;;;27516:10;;27501:13;;27479:57:::1;::::0;;;;::::1;::::0;;::::1;3305:1;;;;;3011::::0;3317:7;:22;25747:1797;;;;-1:-1:-1;25747:1797:0:o;2359:150::-;2417:7;2450:1;2445;:6;;2437:15;;;;;;-1:-1:-1;2475:5:0;;;2359:150::o;2746:149::-;2804:7;2836:1;2832;:5;2824:14;;;;;;2849:9;2865:1;2861;:5;;;;;;;2746:149;-1:-1:-1;;;;2746:149:0:o;35846:323::-;35949:10;35931:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;35931:36:0;;;;;;;;;;:46;-1:-1:-1;35931:46:0;35923:67;;;;;-1:-1:-1;;;35923:67:0;;;;;;;;;;;;-1:-1:-1;;;35923:67:0;;;;;;;;;;;;;;;36001:46;-1:-1:-1;;;;;36001:26:0;;36028:10;36040:6;36001:26;:46::i;:::-;36058:52;36084:10;36096:5;36103:6;36058:25;:52::i;:::-;36126:35;;;-1:-1:-1;;;;;36126:35:0;;;;;;;;;;;;36135:10;;36126:35;;;;;;;;35846:323;;:::o;32831:1861::-;32971:11;;-1:-1:-1;;;;;33017:22:0;;32935:33;33017:22;;;:7;:22;;;;;33058:13;;;;:29;-1:-1:-1;33058:29:0;33050:49;;;;;-1:-1:-1;;;33050:49:0;;;;;;;;;;;;-1:-1:-1;;;33050:49:0;;;;;;;;;;;;;;;33133:10;33118:6;:11;;;:25;;33110:43;;;;;-1:-1:-1;;;33110:43:0;;;;;;;;;;;;-1:-1:-1;;;33110:43:0;;;;;;;;;;;;;;;33172:39;33184:6;:26;;;33172:11;:39::i;:::-;33164:117;;;;-1:-1:-1;;;33164:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33292:27;33322:28;:12;33339:10;33322:16;:28::i;:::-;-1:-1:-1;;;;;33434:24:0;;;;;;:9;:24;;;;;;33292:58;;-1:-1:-1;33434:49:0;;33292:58;33434:28;:49::i;:::-;-1:-1:-1;;;;;33407:24:0;;;;;;:9;:24;;;;;:76;33510:13;;;;:31;;33528:12;33510:17;:31::i;:::-;33494:13;;;:47;33566:11;;;;:27;;33582:10;33566:15;:27::i;:::-;33552:11;;;:41;33618:11;;:29;;33634:12;33618:15;:29::i;:::-;33604:11;:43;33670:9;;:25;;33684:10;33670:13;:25::i;:::-;33658:9;:37;;;33720:11;;:26;;:15;:26::i;:::-;33706:11;:40;33764:9;33759:787;33783:14;:21;33779:25;;33759:787;;;5202:6;33826:24;33863;;;:17;:24;;33888:14;:17;;33853:102;;-1:-1:-1;;;;;;;;;;;33863:24:0;33826;;33888:14;33903:1;;33888:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33888:17:0;33863:43;;;;;;;;;;;;;33908:19;33929:25;33853:9;:102::i;:::-;33826:129;-1:-1:-1;33974:20:0;;33970:565;;5202:6;34366:24;;;;:17;:24;;34391:14;:17;;34413:16;;-1:-1:-1;;;;;;;;;;;34366:24:0;;;34406:1;;34391:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34391:17:0;;;34366:43;;;;;;;;;;;;;;;:63;;;;;;;;;34448:32;;;;;:17;:32;;;;;;34481:14;:17;;34503:16;;34391:17;34481:14;34496:1;;34481:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34481:17:0;34448:51;;;;;;;;;;;;:71;;;;;;;33970:565;-1:-1:-1;33806:3:0;;33759:787;;;-1:-1:-1;34563:49:0;;;;;;;;;;;;;;-1:-1:-1;;;;;34563:49:0;;;;;;;;;;;34628:56;;;;;;;;34660:1;;-1:-1:-1;;;;;34628:56:0;;;-1:-1:-1;;;;;;;;;;;34628:56:0;;;;;;;;32831:1861;;;;;;:::o;2197:150::-;2255:7;2287:5;;;2311:6;;;;2303:15;;;;;31827:527;31939:13;:20;31923:36;;31915:58;;;;;-1:-1:-1;;;31915:58:0;;;;;;;;;;;;-1:-1:-1;;;31915:58:0;;;;;;;;;;;;;;;31984:24;;:::i;:::-;32011:9;:39;32021:13;32035;32021:28;;;;;;;;;;;;;;;;;;;;;32011:39;;;;;;;;;;;;;;;31984:66;;;;;;;;;-1:-1:-1;;;;;31984:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32011:39;;31984:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32091:70;32143:17;;32091:47;32119:18;;32091:8;:23;;;:27;;:47;;;;:::i;:70::-;32069:18;:16;:18::i;:::-;:92;;32061:111;;;;;-1:-1:-1;;;32061:111:0;;;;;;;;;;;;-1:-1:-1;;;32061:111:0;;;;;;;;;;;;;;;32191:14;;;;:17;;;:22;;;32183:44;;;;;-1:-1:-1;;;32183:44:0;;;;;;;;;;;;-1:-1:-1;;;32183:44:0;;;;;;;;;;;;;;;32246:18;;;:79;;;32268:9;:43;32278:13;32308:1;32292:13;:17;32278:32;;;;;;;;;;;;;;;;32268:43;;;;;;;;;;;:49;;32318:1;32268:52;;;;;;;;;;;;;;;;;;;;;;;;;:57;;32324:1;32268:57;32246:79;32238:108;;;;;-1:-1:-1;;;32238:108:0;;;;;;;;;;;;-1:-1:-1;;;32238:108:0;;;;;;;;;;;;;;;31827:527;;:::o;30901:918::-;30965:12;30990:24;;:::i;:::-;31017:9;:39;31027:13;31041;31027:28;;;;;;;;;;;;;;;;;;;;;31017:39;;;;;;;;;;;;;;;30990:66;;;;;;;;;-1:-1:-1;;;;;30990:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31017:39;;30990:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31101:8;:16;;;31081:8;:17;;;:36;31077:83;;;31144:4;31134:14;;31077:83;31287:39;;;;31269:13;;31253:11;;:30;;:15;:30::i;:::-;31252:74;31248:122;;;31353:5;31343:15;;31248:122;31710:18;;-1:-1:-1;;;;;31702:27:0;;;;;:7;:27;;;;;:34;;;:39;31698:87;;31768:5;31758:15;;31698:87;31797:14;30901:918;;;:::o;32362:243::-;32466:12;;32480:16;;32423:74;;5257:6;;32454:10;;-1:-1:-1;;;;;32466:12:0;;32423:22;:74::i;:::-;32548:12;;32580:16;;32562:15;;32508:89;;5257:6;;32539:7;;-1:-1:-1;;;;;32548:12:0;;;;32562:34;32508:22;:89::i;:::-;32362:243;:::o;42348:193::-;-1:-1:-1;;;;;42441:23:0;;;;;;;:17;:23;;;;;;;;:30;;;;;;;;;;;;:40;;;;;;42492:24;:31;;;;;;:41;;;;;;;42348:193::o;17646:1478::-;18008:24;;:::i;:::-;18035:595;;;;;;;;18071:9;-1:-1:-1;;;;;18035:595:0;;;;;18106:10;-1:-1:-1;;;;;18035:595:0;;;;;18149:1;-1:-1:-1;;;;;18035:595:0;;;;;18181:12;-1:-1:-1;;;;;18035:595:0;;;;;18223:12;-1:-1:-1;;;;;18035:595:0;;;;;18258:5;18035:595;;;;18296:15;18035:595;;;;18342:13;18035:595;;;;18389:16;18035:595;;;;18437:14;18035:595;;;;18483:1;18035:595;;;;18510:1;18035:595;;;;18536:1;18035:595;;;;18585:1;18035:595;;;;18611:7;18035:595;;;18008:622;;18655:8;:14;;;18670:1;18655:17;;;;;;;;;;;:22;;18676:1;18655:22;18651:84;;;18702:13;;18694:22;;;;:7;:22;;;;;;;;:29;;;;;;;;:::i;:::-;;18651:84;18765:13;;18755:24;;;;:9;:24;;;;;;;;;:35;;;;-1:-1:-1;;;;;;18755:35:0;;;-1:-1:-1;;;;;18755:35:0;;;;;;;;;;-1:-1:-1;18755:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19038:26;:38;19065:10;-1:-1:-1;;;;;19038:38:0;-1:-1:-1;;;;;19038:38:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19038:38:0;-1:-1:-1;;;;;18869:208:0;19026:10;-1:-1:-1;;;;;18869:208:0;18884:9;-1:-1:-1;;;;;18869:208:0;;18895:15;18912:13;18927:14;18943:12;18957:16;18975:12;18989:7;18998:5;19005:4;19011:13;;18869:208;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18869:208:0;;;;;;;;;;;-1:-1:-1;;;;;18869:208:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19098:13:0;:18;;19115:1;19098:18;;;-1:-1:-1;;;;;;;;;17646:1478:0:o;1418:205::-;1546:68;;;-1:-1:-1;;;;;1546:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1546:68:0;-1:-1:-1;;;1546:68:0;;;1519:96;;1539:5;;1519:19;:96::i;:::-;1418:205;;;;:::o;38897:107::-;38955:7;38987:1;38982;:6;;:14;;38995:1;38982:14;;;-1:-1:-1;38991:1:0;;38975:21;-1:-1:-1;38897:107:0:o;40610:1726::-;-1:-1:-1;;;;;40784:16:0;;;;;;:7;:16;;;;;:23;-1:-1:-1;;;40784:23:0;;;;40811:1;40784:28;40780:1146;;;-1:-1:-1;;;;;40855:16:0;;;;;;:7;:16;;;;;:23;;;:35;;40883:6;40855:27;:35::i;:::-;-1:-1:-1;;;;;40829:16:0;;;;;;:7;:16;;;;;:23;;;:61;;;;40929:21;;;:31;;40955:4;40929:25;:31::i;:::-;-1:-1:-1;;;;;40905:16:0;;;;;;:7;:16;;;;;:21;;:55;40780:1146;;;-1:-1:-1;;;;;41187:35:0;;;41179:44;41187:35;;;:26;:35;;;;;;;;;;;;41179:44;;:7;:44;;;:51;;-1:-1:-1;;;41179:51:0;;;;41187:35;41179:56;41175:316;;;-1:-1:-1;;;;;41283:35:0;;;41256:24;41283:35;;;:26;:35;;;;;;;;;;;;41337:44;;;;;;:63;;-1:-1:-1;;;;;;41337:63:0;;;;;;;;41419:7;:25;;;;;;;:56;;;;;;;;;;41175:316;41534:320;;;;;;;;-1:-1:-1;;;;;41534:320:0;;;;;41609:1;41534:320;;;;;;;;;;;;;;-1:-1:-1;41689:16:0;;;:7;:16;;;;;;:21;;;41534:320;;;;41680:31;;:4;;:8;:31::i;:::-;41534:320;;41808:1;41534:320;;;;;;;;;;;;;;-1:-1:-1;;;;;41515:16:0;;;;;;:7;:16;;;;;:339;;;;;;;;;;-1:-1:-1;;;41515:339:0;-1:-1:-1;;;;41515:339:0;;;;-1:-1:-1;;;;;;41515:339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41869:26;:35;;;;;;:45;;;;;;;;;;40780:1146;41946:21;41970:16;:6;41981:4;41970:10;:16::i;:::-;-1:-1:-1;;;;;42080:18:0;;;;;;:9;:18;;;;;;41946:40;;-1:-1:-1;42080:37:0;;41946:40;42080:22;:37::i;:::-;-1:-1:-1;;;;;42059:18:0;;;;;;:9;:18;;;;;:58;42142:11;;:23;;42158:6;42142:15;:23::i;:::-;42128:11;:37;42188:9;;:19;;42202:4;42188:13;:19::i;:::-;42176:9;:31;;;42232:11;;:26;;:15;:26::i;:::-;42218:11;:40;42284:44;;;;;;;;-1:-1:-1;;;;;42284:44:0;;;42301:1;;-1:-1:-1;;;;;;;;;;;42284:44:0;;;;;;;;40610:1726;;;;:::o;42553:211::-;42662:46;42688:4;42694:5;42701:6;42662:25;:46::i;:::-;42719:37;42738:2;42742:5;42749:6;42719:18;:37::i;42772:200::-;-1:-1:-1;;;;;42872:23:0;;;;;;;:17;:23;;;;;;;;:30;;;;;;;;;;;;:40;;;;;;;42923:24;:31;;;;;;:41;;;;;;;;42772:200::o;1229:177::-;1339:58;;;-1:-1:-1;;;;;1339:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1339:58:0;-1:-1:-1;;;1339:58:0;;;1312:86;;1332:5;;1312:19;:86::i;:::-;1229:177;;;:::o;40148:450::-;40251:7;40279:23;40271:32;;;;;;40320:12;40316:31;;-1:-1:-1;40343:1:0;40336:8;;40316:31;40374:16;;;40384:6;40374:7;:16;:7;40407:14;;;;;:24;40403:129;;;40502:18;40495:4;:25;;;;;;40488:32;;;;;40403:129;40584:6;40562:18;40552:7;:28;;;;;;40551:39;;40148:450;-1:-1:-1;;;;;40148:450:0:o;2521:213::-;2579:7;2603:6;2599:47;;-1:-1:-1;2633:1:0;2626:8;;2599:47;2670:5;;;2674:1;2670;:5;:1;2694:5;;;;;:10;2686:19;;;;;1635:479;1724:27;1732:5;-1:-1:-1;;;;;1724:25:0;;:27::i;:::-;1716:71;;;;;-1:-1:-1;;;1716:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1799:12;1813:23;1848:5;-1:-1:-1;;;;;1840:19:0;1860:4;1840:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1840:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1798:67;;;;1884:7;1876:52;;;;;-1:-1:-1;;;1876:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1945:17;;:21;1941:166;;2029:10;2018:30;;;;;;;;;;;;;;;-1:-1:-1;2018:30:0;2010:85;;;;-1:-1:-1;;;2010:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;706:317;766:4;932:20;;832:66;972:23;;;;;;:42;;-1:-1:-1;999:15:0;;;972:42;964:51;706:317;-1:-1:-1;;;;706:317:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://25925608d1a06554ed632696526cfef2e841ab7f7db412dea66e4ecdb358cce1

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.