ETH Price: $3,902.35 (-0.29%)

Contract

0xaE120f96281FB2D376845da4B35226fadF184c73
 

Overview

ETH Balance

3.207678585537989952 ETH

Eth Value

$12,517.49 (@ $3,902.35/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
DAPP_create_SAI_...212815502024-11-27 20:44:1115 days ago1732740251IN
0xaE120f96...adF184c73
0 ETH0.0031736320.73551167
DAPP_create_SAI_...212784092024-11-27 10:11:3515 days ago1732702295IN
0xaE120f96...adF184c73
0 ETH0.001191528.18327344
DAPP_create_SAI_...212777432024-11-27 7:57:4716 days ago1732694267IN
0xaE120f96...adF184c73
0 ETH0.0012856710.23159271
DAPP_create_SAI_...212777322024-11-27 7:55:3516 days ago1732694135IN
0xaE120f96...adF184c73
0 ETH0.001269089.87943931
DAPP_create_SAI_...212776572024-11-27 7:40:3516 days ago1732693235IN
0xaE120f96...adF184c73
0 ETH0.0023134315.88440808
DAPP_buyback_and...198592282024-05-13 6:13:11214 days ago1715580791IN
0xaE120f96...adF184c73
0 ETH0.000771214.17106333
DAPP_buyback_and...198530732024-05-12 9:33:47214 days ago1715506427IN
0xaE120f96...adF184c73
0 ETH0.000769954.16425266
DAPP_buyback_and...198520742024-05-12 6:11:59215 days ago1715494319IN
0xaE120f96...adF184c73
0 ETH0.000636363.44192948
DAPP_buyback_and...198406922024-05-10 16:00:35216 days ago1715356835IN
0xaE120f96...adF184c73
0 ETH0.001354657.32703464
DAPP_buyback_and...198406512024-05-10 15:52:23216 days ago1715356343IN
0xaE120f96...adF184c73
0 ETH0.001142836.1813421
DAPP_buyback_and...198403002024-05-10 14:41:47216 days ago1715352107IN
0xaE120f96...adF184c73
0 ETH0.001590068.6002655
DAPP_buyback_and...198402172024-05-10 14:25:11216 days ago1715351111IN
0xaE120f96...adF184c73
0 ETH0.001658728.21165027
DAPP_buyback_and...198329662024-05-09 14:04:11217 days ago1715263451IN
0xaE120f96...adF184c73
0 ETH0.000914774.88417761
DAPP_buyback_and...198325972024-05-09 12:50:23217 days ago1715259023IN
0xaE120f96...adF184c73
0 ETH0.00107185.79677134
DAPP_buyback_and...198320892024-05-09 11:08:35217 days ago1715252915IN
0xaE120f96...adF184c73
0 ETH0.000752284.06866867
DAPP_buyback_and...198320542024-05-09 11:01:35217 days ago1715252495IN
0xaE120f96...adF184c73
0 ETH0.000819044.43
DAPP_buyback_and...198320502024-05-09 11:00:47217 days ago1715252447IN
0xaE120f96...adF184c73
0 ETH0.001069715.78547899
DAPP_buyback_and...198320332024-05-09 10:57:23217 days ago1715252243IN
0xaE120f96...adF184c73
0 ETH0.000960335.19391297
DAPP_buyback_and...198314472024-05-09 8:59:47217 days ago1715245187IN
0xaE120f96...adF184c73
0 ETH0.000849674.59540617
DAPP_buyback_and...198314222024-05-09 8:54:47217 days ago1715244887IN
0xaE120f96...adF184c73
0 ETH0.000852344.61012303
DAPP_buyback_and...198306642024-05-09 6:22:23218 days ago1715235743IN
0xaE120f96...adF184c73
0 ETH0.001113666.02314569
DAPP_buyback_and...198286672024-05-08 23:39:23218 days ago1715211563IN
0xaE120f96...adF184c73
0 ETH0.000731833.95804276
DAPP_buyback_and...198286372024-05-08 23:33:23218 days ago1715211203IN
0xaE120f96...adF184c73
0 ETH0.000817914.42393742
DAPP_buyback_and...198267412024-05-08 17:11:11218 days ago1715188271IN
0xaE120f96...adF184c73
0 ETH0.001242326.71942096
DAPP_buyback_and...198248542024-05-08 10:49:59218 days ago1715165399IN
0xaE120f96...adF184c73
0 ETH0.001007785.4505104
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
198592282024-05-13 6:13:11214 days ago1715580791
0xaE120f96...adF184c73
0.03 ETH
198530732024-05-12 9:33:47214 days ago1715506427
0xaE120f96...adF184c73
0.03 ETH
198520742024-05-12 6:11:59215 days ago1715494319
0xaE120f96...adF184c73
0.03 ETH
198406922024-05-10 16:00:35216 days ago1715356835
0xaE120f96...adF184c73
0.03 ETH
198406512024-05-10 15:52:23216 days ago1715356343
0xaE120f96...adF184c73
0.03 ETH
198403002024-05-10 14:41:47216 days ago1715352107
0xaE120f96...adF184c73
0.03 ETH
198402172024-05-10 14:25:11216 days ago1715351111
0xaE120f96...adF184c73
0.03 ETH
198329662024-05-09 14:04:11217 days ago1715263451
0xaE120f96...adF184c73
0.03 ETH
198329662024-05-09 14:04:11217 days ago1715263451
0xaE120f96...adF184c73
0.05 ETH
198325972024-05-09 12:50:23217 days ago1715259023
0xaE120f96...adF184c73
0.03 ETH
198320892024-05-09 11:08:35217 days ago1715252915
0xaE120f96...adF184c73
0.03 ETH
198320542024-05-09 11:01:35217 days ago1715252495
0xaE120f96...adF184c73
0.03 ETH
198320502024-05-09 11:00:47217 days ago1715252447
0xaE120f96...adF184c73
0.03 ETH
198320332024-05-09 10:57:23217 days ago1715252243
0xaE120f96...adF184c73
0.03 ETH
198314472024-05-09 8:59:47217 days ago1715245187
0xaE120f96...adF184c73
0.03 ETH
198314222024-05-09 8:54:47217 days ago1715244887
0xaE120f96...adF184c73
0.03 ETH
198306642024-05-09 6:22:23218 days ago1715235743
0xaE120f96...adF184c73
0.03 ETH
198286672024-05-08 23:39:23218 days ago1715211563
0xaE120f96...adF184c73
0.03 ETH
198286372024-05-08 23:33:23218 days ago1715211203
0xaE120f96...adF184c73
0.03 ETH
198267412024-05-08 17:11:11218 days ago1715188271
0xaE120f96...adF184c73
0.03 ETH
198248542024-05-08 10:49:59218 days ago1715165399
0xaE120f96...adF184c73
0.03 ETH
198235732024-05-08 6:31:35219 days ago1715149895
0xaE120f96...adF184c73
0.03 ETH
198213672024-05-07 23:08:11219 days ago1715123291
0xaE120f96...adF184c73
0.03 ETH
198180352024-05-07 11:57:35219 days ago1715083055
0xaE120f96...adF184c73
0.03 ETH
198169092024-05-07 8:10:59220 days ago1715069459
0xaE120f96...adF184c73
0.03 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SocialAIEngaged

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-07
*/

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

/*

The social engagement revolution.
Personal XP, buybacks, LP burns, lotteries, airdrops, and much more! 
Telegram: https://t.me/SocialAIPortal
Website: https://www.socialai.finance/

*/

library TransferHelper {

    // To make sure the correct transfers if called and reverts are caught in "success"

    function safeTransfer(address token, address to, uint value) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }
}
 
interface IUniswapRouter {

    function WETH() external pure returns (address);

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
        ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function factory() external pure returns (address);
}

interface IUniswapFactory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
}

interface IERC20 {
    function approve(address spender, uint amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address holder, address spender) external view returns(uint256);
}

contract SocialAIEngaged {

    struct Project {
        uint256 project_id;
        address token;
        address owner;
        uint256 eth_balance;
        uint256 tokens_reserved;
        bool active;
    }
    
    address public DAPP_controller; // wallet used to sign automatic DAPP interactions
    address public sai_fee_wallet;
    address public gas_wallet;

    mapping(uint => address) public allowed_token;
    mapping(uint => Project) public projects;


    address private constant UNISWAP_ROUTER_ADDRESS = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address private constant ZERO = 0x0000000000000000000000000000000000000000;
    IUniswapRouter private constant uniswapRouter = IUniswapRouter(UNISWAP_ROUTER_ADDRESS);


    uint256 public sai_reserved;
    uint256 public gas_reserved;
    uint256 public send_gas_at = 0.05 ether;

    bool public safety_enabled = true;


    // Access control 
    constructor() {
        DAPP_controller = msg.sender;
        gas_wallet = msg.sender;
        sai_fee_wallet = msg.sender;
    }

    modifier only_DAPP() {
        require(msg.sender == DAPP_controller, "Caller not DAPP"); _;
    }

    // BASIC CONTRACT CONTROL
    function DAPP_set_DAPP_controller(address new_controller) external only_DAPP {
        DAPP_controller = new_controller;
    }

    function DAPP_set_gas_wallet(address new_gas_wallet) external only_DAPP {
        gas_wallet = new_gas_wallet;
    }

    function DAPP_set_sai_fee_wallet(address new_fee_wallet) external only_DAPP {
        sai_fee_wallet = new_fee_wallet;
    }

    function DAPP_withdraw_sai_fee() external only_DAPP {
        payable(sai_fee_wallet).transfer(sai_reserved);
        sai_reserved = 0;
    }

    function DAPP_manual_withdraw_gas_fee() external only_DAPP {
        payable(gas_wallet).transfer(gas_reserved);
        gas_reserved = 0;
    }

    function DAPP_set_send_threshold(uint new_threshold) external only_DAPP {
        send_gas_at = new_threshold;
    }

    // INTERNAL HELPERS
    function _swap_eth_for_tokens(address token, uint256 ethAmount, address to) internal returns (uint tokensBought) {
        // Define the token to swap and the path to swap it
        address[] memory path = new address[](2);
        path[0] = uniswapRouter.WETH();
        path[1] = token;

        // Swap the ETH for the token, and check how much we gained 
        uint balBefore = IERC20(token).balanceOf(address(this));
        uniswapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmount}(0, path, to, block.timestamp+1);
        tokensBought = IERC20(token).balanceOf(address(this)) - balBefore;
    }

    function _charge_fee(uint project_id, uint256 amount, uint256 sai_fee, uint256 gas_fee_of_prev_tx, bool is_eth) internal {
        // Is this a valid project
        require(projects[project_id].active, "Not active");

        // Check for enough balance
        uint256 total_eth = 0;

        if (is_eth) {
            // The fee equal the total amount of ETH + fees
            total_eth = amount + sai_fee + gas_fee_of_prev_tx;

        } else {
            // Check if the token address is set otherwise tokens cannot be reserved
            require(projects[project_id].token != address(0), "Token not set");

            // In case of a token, we have to charge ETH seperately
            total_eth = sai_fee + gas_fee_of_prev_tx;
            
            // Check for enough tokens
            uint token_balance = IERC20(projects[project_id].token).balanceOf(address(this));
            uint tokens_available = token_balance - projects[project_id].tokens_reserved;
            require(amount <= tokens_available, "TOKEN: not enough avaiable");
            
            // Reserve the tokens
            projects[project_id].tokens_reserved += amount;
        }
        
        // Check for enough ETH and reduce balance
        require(total_eth <= projects[project_id].eth_balance, "ETH: Not enough balance");
        projects[project_id].eth_balance -= total_eth;

        // Update the fee reserved for the SAI ecosystem
        sai_reserved += sai_fee;
        gas_reserved += gas_fee_of_prev_tx;

        // Should we send ETH
        if (gas_reserved >= send_gas_at) {
            payable(DAPP_controller).transfer(gas_reserved);
            gas_reserved = 0;
        }        
    }

    function _check_merkle_tree(bytes32 airdrop_hash, bytes32[] memory _witnesses, uint256 path) internal view returns(bool) {
        bytes32 merkleRoot = merkle_root_hash[airdrop_hash];  
        require(merkleRoot != bytes32(0), "No merkle airdrop");  
        bytes32 node = keccak256(abi.encodePacked(uint8(0x00), msg.sender));
        for (uint16 i = 0; i < _witnesses.length; i++) {
            if ((path & 0x01) == 1) {
                node = keccak256(abi.encodePacked(uint8(0x01), _witnesses[i], node));
            } else {
                node = keccak256(abi.encodePacked(uint8(0x01), node, _witnesses[i]));
            }
            path /= 2;
        }
        return node == merkleRoot;
    }

    function _finalize_airdrop(bytes32 airdrop_hash, uint project_id) internal {
        Airdrop memory current_drop = airdrops[airdrop_hash];
        uint refund = current_drop.drops_left * current_drop.amount;
        if (current_drop.is_eth) {
            projects[project_id].eth_balance += refund;
        } else {
            // can reset the reserved tokens
            projects[project_id].tokens_reserved -= refund;
        }
        delete airdrops[airdrop_hash];
    }

    function _charge_just_gas(uint project_id, uint gas_fee) internal {
        require(gas_fee <= projects[project_id].eth_balance, "Cant cover gas");
        projects[project_id].eth_balance -= gas_fee;
    }

    // PROJECT CREATION
    function DAPP_set_verified_token(uint project_id, address token, uint gas_prev_tx) external only_DAPP {
        _charge_just_gas(project_id, gas_prev_tx);
        projects[project_id].token = token;
        IERC20(token).approve(UNISWAP_ROUTER_ADDRESS, 2**256 - 1); // approve on router so we don't have to do this later
    }

    function DAPP_create_SAI_engaged_project(uint project_id, address wallet, address token) external only_DAPP {
        require(projects[project_id].owner == address(0), "Already exists");
    
        // Create the project struct
        Project memory p = Project(project_id, token, wallet, 0, 0, true);
        projects[project_id] = p;
        
        // Approve if token address is given 
         if (token != address(0)) {
            IERC20(token).approve(UNISWAP_ROUTER_ADDRESS, 2**256 - 1);
        }
    }

    // EXTERNAL PROJECT INTERACTIONS
    function deposit_eth_to_project(uint project_id) external payable {
        require(msg.value > 0, "No ETH");
        require(projects[project_id].active, "Not active");
        projects[project_id].eth_balance += msg.value;
    }

    function deposit_tokens_to_project(address token, uint256 token_amount) external {
        // requires token approval first 
        TransferHelper.safeTransferFrom(token, msg.sender, address(this), token_amount);
    }

    function change_project_owner(uint project_id, address new_owner) external {
        require(msg.sender == projects[project_id].owner, "Sender != owner");
        projects[project_id].owner = new_owner;
    }

    // AUTOMATIC GROUP REWARDS
    function DAPP_buyback_and_burn(uint project_id, uint256 amount, uint256 sai_fee, uint256 gas_prev_tx) external only_DAPP {
        // Check whether this tx can be executed and adjust the projects balance
        _charge_fee(project_id, amount, sai_fee, gas_prev_tx, true);
        address token = projects[project_id].token;
        require(token != address(0), "Token not set");
        _swap_eth_for_tokens(token, amount, DEAD); 
    }
    
    function DAPP_add_lp_and_burn(uint project_id, uint amount, uint256 sai_fee, uint256 gas_prev_tx) external only_DAPP  {
        _charge_fee(project_id, amount, sai_fee, gas_prev_tx, true); 
        // Use half of the ETH to buy tokens 
        address token = projects[project_id].token;
        require(token != address(0), "Token not set");
        uint256 tokensOut = _swap_eth_for_tokens(token, amount/2, address(this));        
        // Add the tokens to the pool 
        uniswapRouter.addLiquidityETH{value: amount/2}(token, tokensOut, 0, 0, DEAD, block.timestamp);
    }

    // PERSONAL - LOTTERIES

    mapping(bytes32 => uint256) public lottery_amount;
    mapping(bytes32 => bool)    public lottery_is_eth;

    function DAPP_award_lottery(uint project_id, uint lottery_id, address[] memory winners, uint[] memory amounts, uint gas_prev_tx) external only_DAPP {
        require(winners.length == amounts.length, "Length winners != amounts");
        bytes32 lottery_hash = keccak256(abi.encodePacked(project_id, lottery_id));

        // Just charge the gas for awards, sai fee was paid upon creation
        _charge_just_gas(project_id, gas_prev_tx);

        bool is_eth = lottery_is_eth[lottery_hash];
        uint tot_awarded = 0;
        
        for (uint i=0; i<winners.length; i++) {
            uint amount = amounts[i]; // Amounts can be different for different winners 
            tot_awarded += amount;

            // Check if we need to send ETH or tokens
            address winner = winners[i];
            if (is_eth) {
                payable(winner).transfer(amount);
            } else {
                TransferHelper.safeTransfer(projects[project_id].token, winner, amount);
            }
        }

        // Make sure not more is spent than initially allocated
        uint256 tot_reserved = lottery_amount[lottery_hash];
        require(tot_reserved > 0, "Lottery does not exist/is over");
        require(tot_awarded <= tot_reserved, "Spent more than reserved");

        // If something is left refund 
        if (is_eth) {
            uint256 refund_amount = tot_reserved - tot_awarded;
            projects[project_id].eth_balance += refund_amount;
        } else {
            // Nothing is reserved anymore, regardless of what was awarded
            projects[project_id].tokens_reserved -= tot_reserved;
        }

        // Lottery is over so reset amount hash, whether it is ETH does 
        // not matter cause it will be reset anyway for new lotteries
        lottery_amount[lottery_hash] = 0 ;
    }

    function DAPP_create_lottery(uint project_id, uint lottery_id, uint tot_amount, bool is_eth, uint sai_fee, uint gas_prev_tx) external only_DAPP {
        _charge_fee(project_id, tot_amount, sai_fee, gas_prev_tx, is_eth); // Will automatically reserve the tokens + check if active
        require(tot_amount > 0, "Lottery amount cannot be 0");
        bytes32 lottery_hash = keccak256(abi.encodePacked(project_id, lottery_id));
        require(lottery_amount[lottery_hash] == 0, "Lottery ongoing");
        lottery_amount[lottery_hash] = tot_amount;
        lottery_is_eth[lottery_hash] = is_eth;
    }

    // PERSONAL - AIRDROPS
    struct Airdrop {
        uint amount;
        uint expires_at;
        bool is_eth;
        bool is_active;
        uint total_drops;
        uint drops_left;
    }

    mapping(bytes32 => Airdrop) airdrops; // hash project id and airdrop id
    mapping(bytes32 => bool) airdrop_claimed;
    mapping(bytes32 => bytes32) merkle_root_hash; // Only applicable to merkle root airdrops
    
    function DAPP_create_airdrop(uint project_id, uint airdrop_id, uint airdrop_amount, uint number_of_airdrops, bytes32 merkle_root,
     uint expire_stamp, bool is_eth, uint sai_fee, uint gas_prev_tx) external only_DAPP {
        // Check how much ETH/tokens in total would be needed for the airdrop
        uint tot_amount = airdrop_amount * number_of_airdrops;

         // Reserve/subtract balance to pre reserve
        _charge_fee(project_id, tot_amount, sai_fee, gas_prev_tx, is_eth);

         // Get the hash and check if this exists already
        bytes32 airdrop_hash = keccak256(abi.encodePacked(project_id, airdrop_id));
        require(airdrops[airdrop_hash].is_active == false, "Already there");

        // Allocate the airdrop struct
        Airdrop memory drop = Airdrop(airdrop_amount, expire_stamp, is_eth, true, number_of_airdrops, number_of_airdrops);
        airdrops[airdrop_hash] = drop;

        // In case a merkle root is given, we use that 
        if (merkle_root != bytes32(0)) {
            merkle_root_hash[airdrop_hash] = merkle_root;
        }
    }
 
    function DAPP_extend_airdrop(uint project_id, uint airdrop_id, uint new_expire_stamp, uint gas_prev_tx) external only_DAPP {
        _charge_just_gas(project_id, gas_prev_tx);
        bytes32 airdrop_hash = keccak256(abi.encodePacked(project_id, airdrop_id));
        airdrops[airdrop_hash].expires_at = new_expire_stamp;
    }
    
    function DAPP_update_merkle_airdrop(uint project_id, uint airdrop_id, bytes32 new_merkle_root, uint gas_prev_tx) external only_DAPP {
        _charge_just_gas(project_id, gas_prev_tx);
        bytes32 airdrop_hash = keccak256(abi.encodePacked(project_id, airdrop_id));

        // Check if this was a merkle in the first place
        require(merkle_root_hash[airdrop_hash] != bytes32(0), "AIRDROP: not a merkle");

        // Update the root and reactivate
        merkle_root_hash[airdrop_hash] = new_merkle_root;
        airdrops[airdrop_hash].is_active = true; // usually we will temp disable the airdrop to prevent frontruns (unless send in private txns)
    }

    function DAPP_distribute_bulk_airdrop(uint project_id, uint airdrop_id, address[] memory receivers, uint gas_prev_tx) external  only_DAPP {
        _charge_just_gas(project_id, gas_prev_tx);

        bytes32 airdrop_hash = keccak256(abi.encodePacked(project_id, airdrop_id));

        Airdrop memory current_drop = airdrops[airdrop_hash];
        
        // Verify if this is actually an airdrop meant to be distributes manually
        require(merkle_root_hash[airdrop_hash] == bytes32(0), "AIRDROP: This is not a bulk drop");
        require(current_drop.is_active, "AIRDROP: Inactive");

        // Since we do this every 24 hours we sometimes might distribute after ending a drop
        // as extra safety, we only allow distributing up to 2 days after but not after this 
        // anymore
        require(block.timestamp <= current_drop.expires_at + 2 days, "Distribute expired");

        uint airdrop_amount = current_drop.amount;
        address token = projects[project_id].token;

        // Transfer to tokens to receivers
        uint dropped = 0;
        for (uint i = 0; i < receivers.length; i++) {
            address receiver = receivers[i];

            // Send out the tokens or eth 
            if (current_drop.is_eth) {
                payable(receiver).transfer(airdrop_amount);
            } else {
                TransferHelper.safeTransfer(token, receiver, airdrop_amount);
            }
            
            // Keep check of drop count to make sure not more is dropped than intended
            dropped += 1;
        }

        require(dropped <= current_drop.drops_left, "No drops left!");
        airdrops[airdrop_hash].drops_left -= dropped;

        // Update reserved tokens (if applicable)
        if (!current_drop.is_eth) {
            projects[project_id].tokens_reserved -= (dropped * current_drop.amount);
        }
        
        // auto-finalize
        if (airdrops[airdrop_hash].drops_left  == 0) {
            _finalize_airdrop(airdrop_hash, project_id);
        }
    }

    function claim_airdrop(uint256 path, bytes32[] memory witness, uint project_id, uint256 airdrop_id) external {
        bytes32 sender_hash = keccak256(abi.encodePacked(msg.sender, project_id, airdrop_id));
        bytes32 airdrop_hash = keccak256(abi.encodePacked(project_id, airdrop_id));
        
        Airdrop memory current_drop = airdrops[airdrop_hash];

        require(!airdrop_claimed[sender_hash],                          "CLAIM: Already claimed");
        require(_check_merkle_tree(airdrop_hash, witness, path),        "CLAIM: Not whitelisted");
        require(current_drop.is_active,                                 "CLAIM: Airdrop inactive"); // Frontrun safety by first deactivating
        require(block.timestamp <= current_drop.expires_at + 2 days,    "CLAIM: Drop Expired!");    // Whitelist gets updated every 24 hours as well, so allow some slack

        airdrop_claimed[sender_hash] = true;
        
        require(airdrops[airdrop_hash].drops_left >= 1, "CLAIM: no drops left");
        airdrops[airdrop_hash].drops_left -= 1;

        if (current_drop.is_eth) {
           payable(msg.sender).transfer(current_drop.amount);
        } else {
            TransferHelper.safeTransfer(projects[project_id].token, msg.sender, current_drop.amount);
            projects[project_id].tokens_reserved -= current_drop.amount;
        }

        // auto-finalize
        if (airdrops[airdrop_hash].drops_left  == 0) {
            _finalize_airdrop(airdrop_hash, project_id);
        }
    }

    function DAPP_finalize_airdrop(uint project_id, uint airdrop_id) external only_DAPP {
        bytes32 airdrop_hash = keccak256(abi.encodePacked(project_id, airdrop_id));
        
        // Check if this can be called yet
        if (airdrops[airdrop_hash].drops_left > 0) {
           require(block.timestamp >= airdrops[airdrop_hash].expires_at + 2 days, "Cant refund yet");
        }

        _finalize_airdrop(airdrop_hash, project_id);
    }

    // We need to adjust airdrop when we update the merkle-root to prevent front running to be in two batches
    // we can skip this when the update txs are submitted on private RPC
    function DAPP_temp_disable_airdrop(uint project_id, uint airdrop_id, bool status) public only_DAPP {
        bytes32 airdrop_hash = keccak256(abi.encodePacked(project_id, airdrop_id));
        airdrops[airdrop_hash].is_active = status;
    }
    
    // TERMINATORS
    // While terminate will kill the project it's possible to withdraw everything that is currently
    // not reserved for a lottery ot airdrop. However, this will cause issues with the bounties
    // and hence should be executed  by the DAPP after deleting active bounties
    function DAPP_withdraw_partial(uint project_id, uint gas_fee_of_prev_tx) external only_DAPP {
        Project memory project = projects[project_id];
        require(project.active, "Non existent");

        // ETH side
        require(gas_fee_of_prev_tx <= project.eth_balance, "Cant cover gas refund");
        uint eth_to_refund = project.eth_balance - gas_fee_of_prev_tx;
        if (eth_to_refund > 0) {
            projects[project_id].eth_balance = 0; 
            gas_reserved += gas_fee_of_prev_tx;
            payable(project.owner).transfer(eth_to_refund);
        }

        // Token side, note the difference is that only non reserved tokens are send
        if (project.token != address(0)) {
            
            // All tokens in the contract
            uint total_tokens = IERC20(project.token).balanceOf(address(this));

            // Unreserved tokens
            uint tokens_to_refund = total_tokens - project.tokens_reserved;
            if (tokens_to_refund > 0) {
                TransferHelper.safeTransfer(project.token, project.owner, tokens_to_refund);
            }
        }

    }

    // Note this will send as much as we can, this includes tokens reserved for lotteries or airdrops
    // rendering those invalid. There will be no additional checks if this ETH still exists when awarding
    // hence this only should be used when the DAPP erased every record for this project prior to calling
    function DAPP_terminate_project(uint project_id, uint gas_fee_of_prev_tx) external only_DAPP {
        Project memory project = projects[project_id];
        require(project.active, "Non existent");
        
        // ETH side
        require(gas_fee_of_prev_tx <= project.eth_balance, "Cant cover gas refund");
        uint eth_to_refund = project.eth_balance - gas_fee_of_prev_tx;
        if (eth_to_refund > 0) {
            project.eth_balance = 0; 
            gas_reserved += gas_fee_of_prev_tx;
            payable(project.owner).transfer(eth_to_refund);
        }
     
        // Token side 
        if (project.token != address(0)) {
            // All tokens in the contract
            uint tokens_to_refund = IERC20(project.token).balanceOf(address(this));
            if (tokens_to_refund > 0) {
                TransferHelper.safeTransfer(project.token, project.owner, tokens_to_refund);
            }
        }

        // Remove project, this will invalidate current bounties
         delete projects[project_id];

    }

    function DAPP_withdraw_all_eth() external only_DAPP {
        require(safety_enabled, "Can't use this anymore");
        payable(DAPP_controller).transfer(address(this).balance);
    }

    function DAPP_send_token(address token, uint amount) external only_DAPP {
        require(safety_enabled, "Can't use this anymore");
        TransferHelper.safeTransfer(token, DAPP_controller, amount);
    }

    // Only call this when sure contract is functioning as expected
    // this will remove the possibility to send out ETH and tokens
    // in case it would get stuck
    function DAPP_permanantely_revoke_safety() external only_DAPP {
        safety_enabled = false;
    }

    receive() external payable {}


    // BASE - some info view functions
    function project_token_balance(uint project_id) public view returns(uint) {
        address token = projects[project_id].token;
        return IERC20(token).balanceOf(address(this));
    }

    function burned_tokens(uint project_id) external view returns(uint) {
        return IERC20(projects[project_id].token).balanceOf(DEAD);
    }

    function get_pair(uint project_id) public view returns(address) {
        address tokenA = projects[project_id].token; 
        address tokenB = uniswapRouter.WETH();
        address pairTokens =  IUniswapFactory(uniswapRouter.factory()).getPair(tokenA, tokenB);
        return pairTokens;
    }

    function burned_lp(uint project_id) external view returns(uint) {
        address pairTokens = get_pair(project_id);
        return IERC20(pairTokens).balanceOf(DEAD);
    }

    function check_token_balance(uint project_id, address wallet) external view returns(uint) {
        return IERC20(projects[project_id].token).balanceOf(wallet);
    }



}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"sai_fee","type":"uint256"},{"internalType":"uint256","name":"gas_prev_tx","type":"uint256"}],"name":"DAPP_add_lp_and_burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"uint256","name":"lottery_id","type":"uint256"},{"internalType":"address[]","name":"winners","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"gas_prev_tx","type":"uint256"}],"name":"DAPP_award_lottery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"sai_fee","type":"uint256"},{"internalType":"uint256","name":"gas_prev_tx","type":"uint256"}],"name":"DAPP_buyback_and_burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"DAPP_controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"DAPP_create_SAI_engaged_project","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"uint256","name":"airdrop_id","type":"uint256"},{"internalType":"uint256","name":"airdrop_amount","type":"uint256"},{"internalType":"uint256","name":"number_of_airdrops","type":"uint256"},{"internalType":"bytes32","name":"merkle_root","type":"bytes32"},{"internalType":"uint256","name":"expire_stamp","type":"uint256"},{"internalType":"bool","name":"is_eth","type":"bool"},{"internalType":"uint256","name":"sai_fee","type":"uint256"},{"internalType":"uint256","name":"gas_prev_tx","type":"uint256"}],"name":"DAPP_create_airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"uint256","name":"lottery_id","type":"uint256"},{"internalType":"uint256","name":"tot_amount","type":"uint256"},{"internalType":"bool","name":"is_eth","type":"bool"},{"internalType":"uint256","name":"sai_fee","type":"uint256"},{"internalType":"uint256","name":"gas_prev_tx","type":"uint256"}],"name":"DAPP_create_lottery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"uint256","name":"airdrop_id","type":"uint256"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256","name":"gas_prev_tx","type":"uint256"}],"name":"DAPP_distribute_bulk_airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"uint256","name":"airdrop_id","type":"uint256"},{"internalType":"uint256","name":"new_expire_stamp","type":"uint256"},{"internalType":"uint256","name":"gas_prev_tx","type":"uint256"}],"name":"DAPP_extend_airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"uint256","name":"airdrop_id","type":"uint256"}],"name":"DAPP_finalize_airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"DAPP_manual_withdraw_gas_fee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"DAPP_permanantely_revoke_safety","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DAPP_send_token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_controller","type":"address"}],"name":"DAPP_set_DAPP_controller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_gas_wallet","type":"address"}],"name":"DAPP_set_gas_wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_fee_wallet","type":"address"}],"name":"DAPP_set_sai_fee_wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_threshold","type":"uint256"}],"name":"DAPP_set_send_threshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"gas_prev_tx","type":"uint256"}],"name":"DAPP_set_verified_token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"uint256","name":"airdrop_id","type":"uint256"},{"internalType":"bool","name":"status","type":"bool"}],"name":"DAPP_temp_disable_airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"uint256","name":"gas_fee_of_prev_tx","type":"uint256"}],"name":"DAPP_terminate_project","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"uint256","name":"airdrop_id","type":"uint256"},{"internalType":"bytes32","name":"new_merkle_root","type":"bytes32"},{"internalType":"uint256","name":"gas_prev_tx","type":"uint256"}],"name":"DAPP_update_merkle_airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"DAPP_withdraw_all_eth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"uint256","name":"gas_fee_of_prev_tx","type":"uint256"}],"name":"DAPP_withdraw_partial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"DAPP_withdraw_sai_fee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allowed_token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"}],"name":"burned_lp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"}],"name":"burned_tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"address","name":"new_owner","type":"address"}],"name":"change_project_owner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"}],"name":"check_token_balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"path","type":"uint256"},{"internalType":"bytes32[]","name":"witness","type":"bytes32[]"},{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"uint256","name":"airdrop_id","type":"uint256"}],"name":"claim_airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"}],"name":"deposit_eth_to_project","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"token_amount","type":"uint256"}],"name":"deposit_tokens_to_project","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gas_reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gas_wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"}],"name":"get_pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"lottery_amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"lottery_is_eth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"project_id","type":"uint256"}],"name":"project_token_balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"projects","outputs":[{"internalType":"uint256","name":"project_id","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"eth_balance","type":"uint256"},{"internalType":"uint256","name":"tokens_reserved","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"safety_enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sai_fee_wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sai_reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"send_gas_at","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405266b1a2bc2ec500006007556008805460ff1916600117905534801561002857600080fd5b5060008054336001600160a01b031991821681178355600280548316821790556001805490921617905561501890819061006290396000f3fe6080604052600436106102e05760003560e01c80638392896311610184578063c76130b2116100d6578063e98bc83e1161008a578063f31ff07311610064578063f31ff073146108e0578063f3c8e81814610900578063f89f78b41461092057600080fd5b8063e98bc83e1461088b578063f1e4d7ff146108a0578063f1fc648f146108c057600080fd5b8063e2a6e793116100bb578063e2a6e7931461082b578063e3c95af61461084b578063e5f61de41461086b57600080fd5b8063c76130b2146107eb578063d50735da1461080b57600080fd5b806394a7c93511610138578063abd2ec2911610112578063abd2ec291461078b578063afa869a5146107ab578063be300cc3146107cb57600080fd5b806394a7c935146107295780639931863b1461073e578063998fc4421461076b57600080fd5b80638dd32ce9116101695780638dd32ce9146106bc57806391cfa6ec146106e957806393e9fa3f1461070957600080fd5b8063839289631461066f5780638923f17b1461069c57600080fd5b80634b76d0011161023d5780635ef45476116101f15780636a200c04116101cb5780636a200c041461061a5780636d56830e1461062f578063804a71dc1461064f57600080fd5b80635ef45476146105c05780635f2f1b84146105da578063605770b3146105fa57600080fd5b806356b73afa1161022257806356b73afa146105225780635bcecbe31461058a5780635c0361e5146105a057600080fd5b80634b76d001146104e25780634fc324831461050257600080fd5b80632102fff3116102945780632ea18167116102795780632ea1816714610499578063350af265146104b9578063455193d5146104cc57600080fd5b80632102fff3146104395780632499795f1461047957600080fd5b806311b56b57116102c557806311b56b57146103c8578063184bc722146103e85780631d762fd41461040c57600080fd5b806305f75c1d146102ec578063107046bd1461030e57600080fd5b366102e757005b600080fd5b3480156102f857600080fd5b5061030c610307366004614830565b610935565b005b34801561031a57600080fd5b5061037b61032936600461485c565b6004602081905260009182526040909120805460018201546002830154600384015494840154600590940154929473ffffffffffffffffffffffffffffffffffffffff92831694919092169260ff1686565b6040805196875273ffffffffffffffffffffffffffffffffffffffff9586166020880152939094169285019290925260608401526080830152151560a082015260c0015b60405180910390f35b3480156103d457600080fd5b5061030c6103e3366004614883565b610a50565b3480156103f457600080fd5b506103fe60065481565b6040519081526020016103bf565b34801561041857600080fd5b506103fe61042736600461485c565b60096020526000908152604090205481565b34801561044557600080fd5b5061046961045436600461485c565b600a6020526000908152604090205460ff1681565b60405190151581526020016103bf565b34801561048557600080fd5b5061030c6104943660046148f7565b610c9a565b3480156104a557600080fd5b5061030c6104b4366004614a2a565b610d62565b61030c6104c736600461485c565b6111b7565b3480156104d857600080fd5b506103fe60055481565b3480156104ee57600080fd5b5061030c6104fd366004614a82565b6112c5565b34801561050e57600080fd5b5061030c61051d366004614a82565b61166e565b34801561052e57600080fd5b5061056561053d36600461485c565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103bf565b34801561059657600080fd5b506103fe60075481565b3480156105ac57600080fd5b5061030c6105bb366004614aa4565b6117c7565b3480156105cc57600080fd5b506008546104699060ff1681565b3480156105e657600080fd5b5061030c6105f5366004614aa4565b611892565b34801561060657600080fd5b506103fe61061536600461485c565b611a9f565b34801561062657600080fd5b5061030c611b4a565b34801561063b57600080fd5b5061030c61064a366004614ad6565b611c81565b34801561065b57600080fd5b5061030c61066a366004614a82565b612107565b34801561067b57600080fd5b506002546105659073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106a857600080fd5b5061030c6106b7366004614aa4565b61244f565b3480156106c857600080fd5b506000546105659073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106f557600080fd5b5061030c610704366004614b81565b61257a565b34801561071557600080fd5b5061030c6107243660046148f7565b612849565b34801561073557600080fd5b5061030c612911565b34801561074a57600080fd5b506001546105659073ffffffffffffffffffffffffffffffffffffffff1681565b34801561077757600080fd5b5061030c610786366004614bc3565b6129bc565b34801561079757600080fd5b5061030c6107a6366004614bfb565b612b50565b3480156107b757600080fd5b5061030c6107c636600461485c565b612c36565b3480156107d757600080fd5b506103fe6107e6366004614bfb565b612cbc565b3480156107f757600080fd5b5061056561080636600461485c565b612d69565b34801561081757600080fd5b5061030c610826366004614c2b565b612f49565b34801561083757600080fd5b5061030c610846366004614aa4565b6132cd565b34801561085757600080fd5b5061030c610866366004614cfe565b613446565b34801561087757600080fd5b5061030c610886366004614d51565b61362f565b34801561089757600080fd5b5061030c613745565b3480156108ac57600080fd5b506103fe6108bb36600461485c565b613817565b3480156108cc57600080fd5b5061030c6108db3660046148f7565b613893565b3480156108ec57600080fd5b5061030c6108fb366004614830565b61395b565b34801561090c57600080fd5b506103fe61091b36600461485c565b613967565b34801561092c57600080fd5b5061030c6139d0565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064015b60405180910390fd5b60085460ff16610a27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e277420757365207468697320616e796d6f72650000000000000000000060448201526064016109b2565b600054610a4c90839073ffffffffffffffffffffffffffffffffffffffff1683613aa2565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b6000610add8789614dae565b9050610aec8a82858588613c0b565b60408051602081018c90529081018a9052600090606001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206000818152600b909352912060020154909150610100900460ff1615610bbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f416c72656164792074686572650000000000000000000000000000000000000060448201526064016109b2565b60006040518060c001604052808b815260200188815260200187151581526020016001151581526020018a81526020018a815250905080600b6000848152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff0219169083151502179055506080820151816003015560a082015181600401559050506000801b8814610c8c576000828152600d602052604090208890555b505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314610de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b610ded8482613fd3565b6040805160208101869052908101849052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206000818152600b835283812060c08601855280548652600181015486850152600281015460ff8082161515888801526101009091041615156060870152600381015460808701526004015460a0860152818152600d9092529190205490925015610f00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f41495244524f503a2054686973206973206e6f7420612062756c6b2064726f7060448201526064016109b2565b8060600151610f6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f41495244524f503a20496e61637469766500000000000000000000000000000060448201526064016109b2565b6020810151610f7d906202a300614dc5565b421115610fe6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f446973747269627574652065787069726564000000000000000000000000000060448201526064016109b2565b805160008781526004602052604081206001015473ffffffffffffffffffffffffffffffffffffffff1690805b87518110156110b957600088828151811061103057611030614dd8565b6020026020010151905085604001511561108d5760405173ffffffffffffffffffffffffffffffffffffffff82169086156108fc029087906000818181858888f19350505050158015611087573d6000803e3d6000fd5b50611098565b611098848287613aa2565b6110a3600184614dc5565b92505080806110b190614e07565b915050611013565b508360a00151811115611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f2064726f7073206c6566742100000000000000000000000000000000000060448201526064016109b2565b6000858152600b602052604081206004018054839290611149908490614e3f565b9091555050604084015161118a5783516111639082614dae565b60008a81526004602081905260408220018054909190611184908490614e3f565b90915550505b6000858152600b602052604081206004015490036111ac576111ac858a614078565b505050505050505050565b60003411611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4e6f20455448000000000000000000000000000000000000000000000000000060448201526064016109b2565b60008181526004602052604090206005015460ff1661129c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e6f74206163746976650000000000000000000000000000000000000000000060448201526064016109b2565b600081815260046020526040812060030180543492906112bd908490614dc5565b909155505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b600082815260046020818152604092839020835160c08101855281548152600182015473ffffffffffffffffffffffffffffffffffffffff908116938201939093526002820154909216938201939093526003830154606082015290820154608082015260059091015460ff16151560a08201819052611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f6e206578697374656e74000000000000000000000000000000000000000060448201526064016109b2565b8060600151821115611490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f43616e7420636f7665722067617320726566756e64000000000000000000000060448201526064016109b2565b60008282606001516114a29190614e3f565b9050801561151557600060608301819052600680548592906114c5908490614dc5565b9091555050604080830151905173ffffffffffffffffffffffffffffffffffffffff9091169082156108fc029083906000818181858888f19350505050158015611513573d6000803e3d6000fd5b505b602082015173ffffffffffffffffffffffffffffffffffffffff16156115e75760208201516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156115a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ca9190614e52565b905080156115e5576115e58360200151846040015183613aa2565b505b505050600090815260046020819052604082208281556001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556002820180549091169055600381018390559081019190915560050180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146116ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b604080516020808201859052818301849052825180830384018152606090920183528151918101919091206000818152600b90925291902060040154156117b8576000818152600b602052604090206001015461174f906202a300614dc5565b4210156117b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616e7420726566756e6420796574000000000000000000000000000000000060448201526064016109b2565b6117c28184614078565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b6118528482613fd3565b506040805160208082019590955280820193909352805180840382018152606090930181528251928401929092206000908152600b909352912060010155565b60005473ffffffffffffffffffffffffffffffffffffffff163314611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b611921848484846001613c0b565b60008481526004602052604090206001015473ffffffffffffffffffffffffffffffffffffffff16806119b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f546f6b656e206e6f74207365740000000000000000000000000000000000000060448201526064016109b2565b60006119c7826119c1600288614e6b565b30614196565b9050737a250d5630b4cf539739df2c5dacb4c659f2488d63f305d7196119ee600288614e6b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff8616600482015260248101859052600060448201819052606482015261dead60848201524260a482015260c40160606040518083038185885af1158015611a7a573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111ac9190614ea6565b60008181526004602081905260408083206001015490517f70a0823100000000000000000000000000000000000000000000000000000000815261dead9281019290925273ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b449190614e52565b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b60085460ff16611c37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e277420757365207468697320616e796d6f72650000000000000000000060448201526064016109b2565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116914780156108fc02929091818181858888f19350505050158015611c7e573d6000803e3d6000fd5b50565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b1660208201526034810183905260548101829052600090607401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018690529082018490529150600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206000818152600b835283812060c08601855280548652600181015486850152600281015460ff8082161515888801526101009091048116151560608801526003820154608088015260049091015460a0870152878252600c90935292909220549193501615611e0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f434c41494d3a20416c726561647920636c61696d65640000000000000000000060448201526064016109b2565b611e1982878961445f565b611e7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f434c41494d3a204e6f742077686974656c69737465640000000000000000000060448201526064016109b2565b8060600151611eea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f434c41494d3a2041697264726f7020696e61637469766500000000000000000060448201526064016109b2565b6020810151611efc906202a300614dc5565b421115611f65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f434c41494d3a2044726f7020457870697265642100000000000000000000000060448201526064016109b2565b6000838152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155858452600b909252909120600401541015612019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f434c41494d3a206e6f2064726f7073206c65667400000000000000000000000060448201526064016109b2565b6000828152600b6020526040812060040180546001929061203b908490614e3f565b909155505060408101511561207d578051604051339180156108fc02916000818181858888f19350505050158015612077573d6000803e3d6000fd5b506120dc565b60008581526004602052604090206001015481516120b39173ffffffffffffffffffffffffffffffffffffffff16903390613aa2565b8051600086815260046020819052604082200180549091906120d6908490614e3f565b90915550505b6000828152600b602052604081206004015490036120fe576120fe8286614078565b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b600082815260046020818152604092839020835160c08101855281548152600182015473ffffffffffffffffffffffffffffffffffffffff908116938201939093526002820154909216938201939093526003830154606082015290820154608082015260059091015460ff16151560a08201819052612264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f6e206578697374656e74000000000000000000000000000000000000000060448201526064016109b2565b80606001518211156122d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f43616e7420636f7665722067617320726566756e64000000000000000000000060448201526064016109b2565b60008282606001516122e49190614e3f565b9050801561236257600084815260046020526040812060030181905560068054859290612312908490614dc5565b9091555050604080830151905173ffffffffffffffffffffffffffffffffffffffff9091169082156108fc029083906000818181858888f19350505050158015612360573d6000803e3d6000fd5b505b602082015173ffffffffffffffffffffffffffffffffffffffff16156124495760208201516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156123f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124179190614e52565b9050600083608001518261242b9190614e3f565b90508015612446576124468460200151856040015183613aa2565b50505b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146124d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b6124de848484846001613c0b565b60008481526004602052604090206001015473ffffffffffffffffffffffffffffffffffffffff168061256d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f546f6b656e206e6f74207365740000000000000000000000000000000000000060448201526064016109b2565b612446818561dead614196565b60005473ffffffffffffffffffffffffffffffffffffffff1633146125fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b60008381526004602052604090206002015473ffffffffffffffffffffffffffffffffffffffff161561268a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416c72656164792065786973747300000000000000000000000000000000000060448201526064016109b2565b6040805160c08101825284815273ffffffffffffffffffffffffffffffffffffffff838116602080840182815287841685870190815260006060870181815260808801828152600160a08a018181528e85526004978890529a90932089518155945192850180547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116948a1694909417905592516002850180549093169716969096179055935160038201559251908301559251600590910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790559015612449576040517f095ea7b3000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602482015273ffffffffffffffffffffffffffffffffffffffff83169063095ea7b3906044016020604051808303816000875af115801561281e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128429190614ed4565b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146128ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314612992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60005473ffffffffffffffffffffffffffffffffffffffff163314612a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b612a478382613fd3565b60008381526004602081905260409182902060010180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915591517f095ea7b3000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d918101919091527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602482015263095ea7b3906044016020604051808303816000875af1158015612b2c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124499190614ed4565b60008281526004602052604090206002015473ffffffffffffffffffffffffffffffffffffffff163314612be0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f53656e64657220213d206f776e6572000000000000000000000000000000000060448201526064016109b2565b60009182526004602052604090912060020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314612cb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b600755565b60008281526004602081905260408083206001015490517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116938201939093529116906370a0823190602401602060405180830381865afa158015612d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d629190614e52565b9392505050565b60008181526004602081815260408084206001015481517fad5c4648000000000000000000000000000000000000000000000000000000008152915173ffffffffffffffffffffffffffffffffffffffff909116938593737a250d5630b4cf539739df2c5dacb4c659f2488d9363ad5c4648938184019390918290030181865afa158015612dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1f9190614ef1565b90506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea69190614ef1565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528481166024830152919091169063e6a4390590604401602060405180830381865afa158015612f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f409190614ef1565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612fca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b8151835114613035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4c656e6774682077696e6e65727320213d20616d6f756e74730000000000000060448201526064016109b2565b604080516020808201889052818301879052825180830384018152606090920190925280519101206130678683613fd3565b6000818152600a602052604081205460ff1690805b865181101561316657600086828151811061309957613099614dd8565b6020026020010151905080836130af9190614dc5565b925060008883815181106130c5576130c5614dd8565b60200260200101519050841561311e5760405173ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f19350505050158015613118573d6000803e3d6000fd5b50613151565b60008b8152600460205260409020600101546131519073ffffffffffffffffffffffffffffffffffffffff168284613aa2565b5050808061315e90614e07565b91505061307c565b50600083815260096020526040902054806131dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4c6f747465727920646f6573206e6f742065786973742f6973206f766572000060448201526064016109b2565b80821115613247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5370656e74206d6f7265207468616e207265736572766564000000000000000060448201526064016109b2565b821561328d5760006132598383614e3f565b905080600460008c815260200190815260200160002060030160008282546132819190614dc5565b909155506132b4915050565b600089815260046020819052604082200180548392906132ae908490614e3f565b90915550505b5050506000908152600960205260408120555050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461334e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b6133588482613fd3565b604080516020808201879052818301869052825180830384018152606090920183528151918101919091206000818152600d909252919020546133f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f41495244524f503a206e6f742061206d65726b6c65000000000000000000000060448201526064016109b2565b6000908152600d6020908152604080832094909455600b90529190912060020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146134c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b6134d48685848487613c0b565b6000841161353e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4c6f747465727920616d6f756e742063616e6e6f74206265203000000000000060448201526064016109b2565b604080516020808201899052818301889052825180830384018152606090920183528151918101919091206000818152600990925291902054156135de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4c6f7474657279206f6e676f696e67000000000000000000000000000000000060448201526064016109b2565b600090815260096020908152604080832096909655600a90529390932080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169215159290921790915550505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146136b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b6040805160208101859052908101839052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600b90925290206002018054921515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff90931692909217909155505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146137c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b60015460055460405173ffffffffffffffffffffffffffffffffffffffff9092169181156108fc0291906000818181858888f1935050505015801561380f573d6000803e3d6000fd5b506000600555565b60008061382383612d69565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815261dead600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a08231906024015b602060405180830381865afa158015612d3e573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314613914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610a4c82333084614678565b60008181526004602081905260408083206001015490517f70a08231000000000000000000000000000000000000000000000000000000008152309281019290925273ffffffffffffffffffffffffffffffffffffffff169081906370a0823190602401613876565b60005473ffffffffffffffffffffffffffffffffffffffff163314613a51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b60025460065460405173ffffffffffffffffffffffffffffffffffffffff9092169181156108fc0291906000818181858888f19350505050158015613a9a573d6000803e3d6000fd5b506000600655565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790529151600092839290871691613b399190614f0e565b6000604051808303816000865af19150503d8060008114613b76576040519150601f19603f3d011682016040523d82523d6000602084013e613b7b565b606091505b5091509150818015613ba5575080511580613ba5575080806020019051810190613ba59190614ed4565b612842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016109b2565b60008581526004602052604090206005015460ff16613c86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e6f74206163746976650000000000000000000000000000000000000000000060448201526064016109b2565b60008115613caa5782613c998587614dc5565b613ca39190614dc5565b9050613e9f565b60008681526004602052604090206001015473ffffffffffffffffffffffffffffffffffffffff16613d38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f546f6b656e206e6f74207365740000000000000000000000000000000000000060448201526064016109b2565b613d428385614dc5565b60008781526004602081905260408083206001015490517f70a082310000000000000000000000000000000000000000000000000000000081523092810192909252929350909173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015613dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dea9190614e52565b60008881526004602081905260408220015491925090613e0a9083614e3f565b905080871115613e76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f544f4b454e3a206e6f7420656e6f756768206176616961626c6500000000000060448201526064016109b2565b60008881526004602081905260408220018054899290613e97908490614dc5565b909155505050505b600086815260046020526040902060030154811115613f1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4554483a204e6f7420656e6f7567682062616c616e636500000000000000000060448201526064016109b2565b60008681526004602052604081206003018054839290613f3b908490614e3f565b925050819055508360056000828254613f549190614dc5565b925050819055508260066000828254613f6d9190614dc5565b909155505060075460065410612446576000805460065460405173ffffffffffffffffffffffffffffffffffffffff9092169281156108fc029290818181858888f19350505050158015613fc5573d6000803e3d6000fd5b506000600655505050505050565b60008281526004602052604090206003015481111561404e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f43616e7420636f7665722067617300000000000000000000000000000000000060448201526064016109b2565b6000828152600460205260408120600301805483929061406f908490614e3f565b90915550505050565b6000828152600b60209081526040808320815160c0810183528154808252600183015494820194909452600282015460ff808216151594830194909452610100900490921615156060830152600381015460808301526004015460a082018190529092916140e591614dae565b905081604001511561411d5760008381526004602052604081206003018054839290614112908490614dc5565b909155506141449050565b6000838152600460208190526040822001805483929061413e908490614e3f565b90915550505b5050506000908152600b60205260408120818155600181018290556002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690556003810182905560040155565b60408051600280825260608201835260009283929190602083019080368337019050509050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561421a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061423e9190614ef1565b8160008151811061425157614251614dd8565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050848160018151811061429f5761429f614dd8565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918716906370a0823190602401602060405180830381865afa15801561431a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061433e9190614e52565b9050737a250d5630b4cf539739df2c5dacb4c659f2488d63b6f9de95866000858861436a426001614dc5565b6040518663ffffffff1660e01b81526004016143899493929190614f3d565b6000604051808303818588803b1580156143a257600080fd5b505af11580156143b6573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015284935073ffffffffffffffffffffffffffffffffffffffff8a1692506370a082319150602401602060405180830381865afa158015614427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061444b9190614e52565b6144559190614e3f565b9695505050505050565b6000838152600d6020526040812054806144d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4e6f206d65726b6c652061697264726f7000000000000000000000000000000060448201526064016109b2565b6040516000602082018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b1660218301529060350160405160208183030381529060405280519060200120905060005b85518161ffff16101561466e57846001166001036145cb576001868261ffff168151811061455b5761455b614dd8565b6020026020010151836040516020016145ae9392919060f89390931b7fff000000000000000000000000000000000000000000000000000000000000001683526001830191909152602182015260410190565b60405160208183030381529060405280519060200120915061464f565b600182878361ffff16815181106145e4576145e4614dd8565b60200260200101516040516020016146369392919060f89390931b7fff000000000000000000000000000000000000000000000000000000000000001683526001830191909152602182015260410190565b6040516020818303038152906040528051906020012091505b61465a600286614e6b565b94508061466681614fc1565b91505061452b565b5014949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916147179190614f0e565b6000604051808303816000865af19150503d8060008114614754576040519150601f19603f3d011682016040523d82523d6000602084013e614759565b606091505b50915091508180156147835750805115806147835750808060200190518101906147839190614ed4565b612446576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c45440000000000000000000000000000000000000000000000000000000060648201526084016109b2565b73ffffffffffffffffffffffffffffffffffffffff81168114611c7e57600080fd5b6000806040838503121561484357600080fd5b823561484e8161480e565b946020939093013593505050565b60006020828403121561486e57600080fd5b5035919050565b8015158114611c7e57600080fd5b60008060008060008060008060006101208a8c0312156148a257600080fd5b8935985060208a0135975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a01356148d781614875565b8093505060e08a013591506101008a013590509295985092959850929598565b60006020828403121561490957600080fd5b8135612d628161480e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561498a5761498a614914565b604052919050565b600067ffffffffffffffff8211156149ac576149ac614914565b5060051b60200190565b600082601f8301126149c757600080fd5b813560206149dc6149d783614992565b614943565b82815260059290921b840181019181810190868411156149fb57600080fd5b8286015b84811015614a1f578035614a128161480e565b83529183019183016149ff565b509695505050505050565b60008060008060808587031215614a4057600080fd5b8435935060208501359250604085013567ffffffffffffffff811115614a6557600080fd5b614a71878288016149b6565b949793965093946060013593505050565b60008060408385031215614a9557600080fd5b50508035926020909101359150565b60008060008060808587031215614aba57600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060808587031215614aec57600080fd5b8435935060208086013567ffffffffffffffff811115614b0b57600080fd5b8601601f81018813614b1c57600080fd5b8035614b2a6149d782614992565b81815260059190911b8201830190838101908a831115614b4957600080fd5b928401925b82841015614b6757833582529284019290840190614b4e565b979a97995050505060408601359560600135949350505050565b600080600060608486031215614b9657600080fd5b833592506020840135614ba88161480e565b91506040840135614bb88161480e565b809150509250925092565b600080600060608486031215614bd857600080fd5b833592506020840135614bea8161480e565b929592945050506040919091013590565b60008060408385031215614c0e57600080fd5b823591506020830135614c208161480e565b809150509250929050565b600080600080600060a08688031215614c4357600080fd5b853594506020808701359450604087013567ffffffffffffffff80821115614c6a57600080fd5b614c768a838b016149b6565b95506060890135915080821115614c8c57600080fd5b508701601f81018913614c9e57600080fd5b8035614cac6149d782614992565b81815260059190911b8201830190838101908b831115614ccb57600080fd5b928401925b82841015614ce957833582529284019290840190614cd0565b989b979a509598608001359695505050505050565b60008060008060008060c08789031215614d1757600080fd5b8635955060208701359450604087013593506060870135614d3781614875565b9598949750929560808101359460a0909101359350915050565b600080600060608486031215614d6657600080fd5b83359250602084013591506040840135614bb881614875565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417611b4457611b44614d7f565b80820180821115611b4457611b44614d7f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e3857614e38614d7f565b5060010190565b81810381811115611b4457611b44614d7f565b600060208284031215614e6457600080fd5b5051919050565b600082614ea1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600080600060608486031215614ebb57600080fd5b8351925060208401519150604084015190509250925092565b600060208284031215614ee657600080fd5b8151612d6281614875565b600060208284031215614f0357600080fd5b8151612d628161480e565b6000825160005b81811015614f2f5760208186018101518583015201614f15565b506000920191825250919050565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015614f9457845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101614f62565b505073ffffffffffffffffffffffffffffffffffffffff9690961660408501525050506060015292915050565b600061ffff808316818103614fd857614fd8614d7f565b600101939250505056fea2646970667358221220176e0ae1b9162fd9b7599d523a18a4e2bb0dab4c63e50fd1bdb115cad16547aa64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102e05760003560e01c80638392896311610184578063c76130b2116100d6578063e98bc83e1161008a578063f31ff07311610064578063f31ff073146108e0578063f3c8e81814610900578063f89f78b41461092057600080fd5b8063e98bc83e1461088b578063f1e4d7ff146108a0578063f1fc648f146108c057600080fd5b8063e2a6e793116100bb578063e2a6e7931461082b578063e3c95af61461084b578063e5f61de41461086b57600080fd5b8063c76130b2146107eb578063d50735da1461080b57600080fd5b806394a7c93511610138578063abd2ec2911610112578063abd2ec291461078b578063afa869a5146107ab578063be300cc3146107cb57600080fd5b806394a7c935146107295780639931863b1461073e578063998fc4421461076b57600080fd5b80638dd32ce9116101695780638dd32ce9146106bc57806391cfa6ec146106e957806393e9fa3f1461070957600080fd5b8063839289631461066f5780638923f17b1461069c57600080fd5b80634b76d0011161023d5780635ef45476116101f15780636a200c04116101cb5780636a200c041461061a5780636d56830e1461062f578063804a71dc1461064f57600080fd5b80635ef45476146105c05780635f2f1b84146105da578063605770b3146105fa57600080fd5b806356b73afa1161022257806356b73afa146105225780635bcecbe31461058a5780635c0361e5146105a057600080fd5b80634b76d001146104e25780634fc324831461050257600080fd5b80632102fff3116102945780632ea18167116102795780632ea1816714610499578063350af265146104b9578063455193d5146104cc57600080fd5b80632102fff3146104395780632499795f1461047957600080fd5b806311b56b57116102c557806311b56b57146103c8578063184bc722146103e85780631d762fd41461040c57600080fd5b806305f75c1d146102ec578063107046bd1461030e57600080fd5b366102e757005b600080fd5b3480156102f857600080fd5b5061030c610307366004614830565b610935565b005b34801561031a57600080fd5b5061037b61032936600461485c565b6004602081905260009182526040909120805460018201546002830154600384015494840154600590940154929473ffffffffffffffffffffffffffffffffffffffff92831694919092169260ff1686565b6040805196875273ffffffffffffffffffffffffffffffffffffffff9586166020880152939094169285019290925260608401526080830152151560a082015260c0015b60405180910390f35b3480156103d457600080fd5b5061030c6103e3366004614883565b610a50565b3480156103f457600080fd5b506103fe60065481565b6040519081526020016103bf565b34801561041857600080fd5b506103fe61042736600461485c565b60096020526000908152604090205481565b34801561044557600080fd5b5061046961045436600461485c565b600a6020526000908152604090205460ff1681565b60405190151581526020016103bf565b34801561048557600080fd5b5061030c6104943660046148f7565b610c9a565b3480156104a557600080fd5b5061030c6104b4366004614a2a565b610d62565b61030c6104c736600461485c565b6111b7565b3480156104d857600080fd5b506103fe60055481565b3480156104ee57600080fd5b5061030c6104fd366004614a82565b6112c5565b34801561050e57600080fd5b5061030c61051d366004614a82565b61166e565b34801561052e57600080fd5b5061056561053d36600461485c565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103bf565b34801561059657600080fd5b506103fe60075481565b3480156105ac57600080fd5b5061030c6105bb366004614aa4565b6117c7565b3480156105cc57600080fd5b506008546104699060ff1681565b3480156105e657600080fd5b5061030c6105f5366004614aa4565b611892565b34801561060657600080fd5b506103fe61061536600461485c565b611a9f565b34801561062657600080fd5b5061030c611b4a565b34801561063b57600080fd5b5061030c61064a366004614ad6565b611c81565b34801561065b57600080fd5b5061030c61066a366004614a82565b612107565b34801561067b57600080fd5b506002546105659073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106a857600080fd5b5061030c6106b7366004614aa4565b61244f565b3480156106c857600080fd5b506000546105659073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106f557600080fd5b5061030c610704366004614b81565b61257a565b34801561071557600080fd5b5061030c6107243660046148f7565b612849565b34801561073557600080fd5b5061030c612911565b34801561074a57600080fd5b506001546105659073ffffffffffffffffffffffffffffffffffffffff1681565b34801561077757600080fd5b5061030c610786366004614bc3565b6129bc565b34801561079757600080fd5b5061030c6107a6366004614bfb565b612b50565b3480156107b757600080fd5b5061030c6107c636600461485c565b612c36565b3480156107d757600080fd5b506103fe6107e6366004614bfb565b612cbc565b3480156107f757600080fd5b5061056561080636600461485c565b612d69565b34801561081757600080fd5b5061030c610826366004614c2b565b612f49565b34801561083757600080fd5b5061030c610846366004614aa4565b6132cd565b34801561085757600080fd5b5061030c610866366004614cfe565b613446565b34801561087757600080fd5b5061030c610886366004614d51565b61362f565b34801561089757600080fd5b5061030c613745565b3480156108ac57600080fd5b506103fe6108bb36600461485c565b613817565b3480156108cc57600080fd5b5061030c6108db3660046148f7565b613893565b3480156108ec57600080fd5b5061030c6108fb366004614830565b61395b565b34801561090c57600080fd5b506103fe61091b36600461485c565b613967565b34801561092c57600080fd5b5061030c6139d0565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064015b60405180910390fd5b60085460ff16610a27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e277420757365207468697320616e796d6f72650000000000000000000060448201526064016109b2565b600054610a4c90839073ffffffffffffffffffffffffffffffffffffffff1683613aa2565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b6000610add8789614dae565b9050610aec8a82858588613c0b565b60408051602081018c90529081018a9052600090606001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206000818152600b909352912060020154909150610100900460ff1615610bbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f416c72656164792074686572650000000000000000000000000000000000000060448201526064016109b2565b60006040518060c001604052808b815260200188815260200187151581526020016001151581526020018a81526020018a815250905080600b6000848152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff0219169083151502179055506080820151816003015560a082015181600401559050506000801b8814610c8c576000828152600d602052604090208890555b505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314610de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b610ded8482613fd3565b6040805160208101869052908101849052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206000818152600b835283812060c08601855280548652600181015486850152600281015460ff8082161515888801526101009091041615156060870152600381015460808701526004015460a0860152818152600d9092529190205490925015610f00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f41495244524f503a2054686973206973206e6f7420612062756c6b2064726f7060448201526064016109b2565b8060600151610f6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f41495244524f503a20496e61637469766500000000000000000000000000000060448201526064016109b2565b6020810151610f7d906202a300614dc5565b421115610fe6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f446973747269627574652065787069726564000000000000000000000000000060448201526064016109b2565b805160008781526004602052604081206001015473ffffffffffffffffffffffffffffffffffffffff1690805b87518110156110b957600088828151811061103057611030614dd8565b6020026020010151905085604001511561108d5760405173ffffffffffffffffffffffffffffffffffffffff82169086156108fc029087906000818181858888f19350505050158015611087573d6000803e3d6000fd5b50611098565b611098848287613aa2565b6110a3600184614dc5565b92505080806110b190614e07565b915050611013565b508360a00151811115611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f2064726f7073206c6566742100000000000000000000000000000000000060448201526064016109b2565b6000858152600b602052604081206004018054839290611149908490614e3f565b9091555050604084015161118a5783516111639082614dae565b60008a81526004602081905260408220018054909190611184908490614e3f565b90915550505b6000858152600b602052604081206004015490036111ac576111ac858a614078565b505050505050505050565b60003411611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4e6f20455448000000000000000000000000000000000000000000000000000060448201526064016109b2565b60008181526004602052604090206005015460ff1661129c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e6f74206163746976650000000000000000000000000000000000000000000060448201526064016109b2565b600081815260046020526040812060030180543492906112bd908490614dc5565b909155505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b600082815260046020818152604092839020835160c08101855281548152600182015473ffffffffffffffffffffffffffffffffffffffff908116938201939093526002820154909216938201939093526003830154606082015290820154608082015260059091015460ff16151560a08201819052611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f6e206578697374656e74000000000000000000000000000000000000000060448201526064016109b2565b8060600151821115611490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f43616e7420636f7665722067617320726566756e64000000000000000000000060448201526064016109b2565b60008282606001516114a29190614e3f565b9050801561151557600060608301819052600680548592906114c5908490614dc5565b9091555050604080830151905173ffffffffffffffffffffffffffffffffffffffff9091169082156108fc029083906000818181858888f19350505050158015611513573d6000803e3d6000fd5b505b602082015173ffffffffffffffffffffffffffffffffffffffff16156115e75760208201516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156115a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ca9190614e52565b905080156115e5576115e58360200151846040015183613aa2565b505b505050600090815260046020819052604082208281556001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556002820180549091169055600381018390559081019190915560050180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146116ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b604080516020808201859052818301849052825180830384018152606090920183528151918101919091206000818152600b90925291902060040154156117b8576000818152600b602052604090206001015461174f906202a300614dc5565b4210156117b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616e7420726566756e6420796574000000000000000000000000000000000060448201526064016109b2565b6117c28184614078565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b6118528482613fd3565b506040805160208082019590955280820193909352805180840382018152606090930181528251928401929092206000908152600b909352912060010155565b60005473ffffffffffffffffffffffffffffffffffffffff163314611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b611921848484846001613c0b565b60008481526004602052604090206001015473ffffffffffffffffffffffffffffffffffffffff16806119b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f546f6b656e206e6f74207365740000000000000000000000000000000000000060448201526064016109b2565b60006119c7826119c1600288614e6b565b30614196565b9050737a250d5630b4cf539739df2c5dacb4c659f2488d63f305d7196119ee600288614e6b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff8616600482015260248101859052600060448201819052606482015261dead60848201524260a482015260c40160606040518083038185885af1158015611a7a573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111ac9190614ea6565b60008181526004602081905260408083206001015490517f70a0823100000000000000000000000000000000000000000000000000000000815261dead9281019290925273ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b449190614e52565b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b60085460ff16611c37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e277420757365207468697320616e796d6f72650000000000000000000060448201526064016109b2565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116914780156108fc02929091818181858888f19350505050158015611c7e573d6000803e3d6000fd5b50565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b1660208201526034810183905260548101829052600090607401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018690529082018490529150600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206000818152600b835283812060c08601855280548652600181015486850152600281015460ff8082161515888801526101009091048116151560608801526003820154608088015260049091015460a0870152878252600c90935292909220549193501615611e0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f434c41494d3a20416c726561647920636c61696d65640000000000000000000060448201526064016109b2565b611e1982878961445f565b611e7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f434c41494d3a204e6f742077686974656c69737465640000000000000000000060448201526064016109b2565b8060600151611eea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f434c41494d3a2041697264726f7020696e61637469766500000000000000000060448201526064016109b2565b6020810151611efc906202a300614dc5565b421115611f65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f434c41494d3a2044726f7020457870697265642100000000000000000000000060448201526064016109b2565b6000838152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155858452600b909252909120600401541015612019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f434c41494d3a206e6f2064726f7073206c65667400000000000000000000000060448201526064016109b2565b6000828152600b6020526040812060040180546001929061203b908490614e3f565b909155505060408101511561207d578051604051339180156108fc02916000818181858888f19350505050158015612077573d6000803e3d6000fd5b506120dc565b60008581526004602052604090206001015481516120b39173ffffffffffffffffffffffffffffffffffffffff16903390613aa2565b8051600086815260046020819052604082200180549091906120d6908490614e3f565b90915550505b6000828152600b602052604081206004015490036120fe576120fe8286614078565b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b600082815260046020818152604092839020835160c08101855281548152600182015473ffffffffffffffffffffffffffffffffffffffff908116938201939093526002820154909216938201939093526003830154606082015290820154608082015260059091015460ff16151560a08201819052612264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f6e206578697374656e74000000000000000000000000000000000000000060448201526064016109b2565b80606001518211156122d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f43616e7420636f7665722067617320726566756e64000000000000000000000060448201526064016109b2565b60008282606001516122e49190614e3f565b9050801561236257600084815260046020526040812060030181905560068054859290612312908490614dc5565b9091555050604080830151905173ffffffffffffffffffffffffffffffffffffffff9091169082156108fc029083906000818181858888f19350505050158015612360573d6000803e3d6000fd5b505b602082015173ffffffffffffffffffffffffffffffffffffffff16156124495760208201516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156123f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124179190614e52565b9050600083608001518261242b9190614e3f565b90508015612446576124468460200151856040015183613aa2565b50505b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146124d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b6124de848484846001613c0b565b60008481526004602052604090206001015473ffffffffffffffffffffffffffffffffffffffff168061256d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f546f6b656e206e6f74207365740000000000000000000000000000000000000060448201526064016109b2565b612446818561dead614196565b60005473ffffffffffffffffffffffffffffffffffffffff1633146125fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b60008381526004602052604090206002015473ffffffffffffffffffffffffffffffffffffffff161561268a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416c72656164792065786973747300000000000000000000000000000000000060448201526064016109b2565b6040805160c08101825284815273ffffffffffffffffffffffffffffffffffffffff838116602080840182815287841685870190815260006060870181815260808801828152600160a08a018181528e85526004978890529a90932089518155945192850180547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116948a1694909417905592516002850180549093169716969096179055935160038201559251908301559251600590910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790559015612449576040517f095ea7b3000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602482015273ffffffffffffffffffffffffffffffffffffffff83169063095ea7b3906044016020604051808303816000875af115801561281e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128429190614ed4565b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146128ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314612992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60005473ffffffffffffffffffffffffffffffffffffffff163314612a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b612a478382613fd3565b60008381526004602081905260409182902060010180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915591517f095ea7b3000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d918101919091527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602482015263095ea7b3906044016020604051808303816000875af1158015612b2c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124499190614ed4565b60008281526004602052604090206002015473ffffffffffffffffffffffffffffffffffffffff163314612be0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f53656e64657220213d206f776e6572000000000000000000000000000000000060448201526064016109b2565b60009182526004602052604090912060020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314612cb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b600755565b60008281526004602081905260408083206001015490517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116938201939093529116906370a0823190602401602060405180830381865afa158015612d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d629190614e52565b9392505050565b60008181526004602081815260408084206001015481517fad5c4648000000000000000000000000000000000000000000000000000000008152915173ffffffffffffffffffffffffffffffffffffffff909116938593737a250d5630b4cf539739df2c5dacb4c659f2488d9363ad5c4648938184019390918290030181865afa158015612dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1f9190614ef1565b90506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea69190614ef1565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528481166024830152919091169063e6a4390590604401602060405180830381865afa158015612f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f409190614ef1565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612fca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b8151835114613035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4c656e6774682077696e6e65727320213d20616d6f756e74730000000000000060448201526064016109b2565b604080516020808201889052818301879052825180830384018152606090920190925280519101206130678683613fd3565b6000818152600a602052604081205460ff1690805b865181101561316657600086828151811061309957613099614dd8565b6020026020010151905080836130af9190614dc5565b925060008883815181106130c5576130c5614dd8565b60200260200101519050841561311e5760405173ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f19350505050158015613118573d6000803e3d6000fd5b50613151565b60008b8152600460205260409020600101546131519073ffffffffffffffffffffffffffffffffffffffff168284613aa2565b5050808061315e90614e07565b91505061307c565b50600083815260096020526040902054806131dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4c6f747465727920646f6573206e6f742065786973742f6973206f766572000060448201526064016109b2565b80821115613247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5370656e74206d6f7265207468616e207265736572766564000000000000000060448201526064016109b2565b821561328d5760006132598383614e3f565b905080600460008c815260200190815260200160002060030160008282546132819190614dc5565b909155506132b4915050565b600089815260046020819052604082200180548392906132ae908490614e3f565b90915550505b5050506000908152600960205260408120555050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461334e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b6133588482613fd3565b604080516020808201879052818301869052825180830384018152606090920183528151918101919091206000818152600d909252919020546133f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f41495244524f503a206e6f742061206d65726b6c65000000000000000000000060448201526064016109b2565b6000908152600d6020908152604080832094909455600b90529190912060020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146134c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b6134d48685848487613c0b565b6000841161353e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4c6f747465727920616d6f756e742063616e6e6f74206265203000000000000060448201526064016109b2565b604080516020808201899052818301889052825180830384018152606090920183528151918101919091206000818152600990925291902054156135de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4c6f7474657279206f6e676f696e67000000000000000000000000000000000060448201526064016109b2565b600090815260096020908152604080832096909655600a90529390932080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169215159290921790915550505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146136b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b6040805160208101859052908101839052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000908152600b90925290206002018054921515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff90931692909217909155505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146137c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b60015460055460405173ffffffffffffffffffffffffffffffffffffffff9092169181156108fc0291906000818181858888f1935050505015801561380f573d6000803e3d6000fd5b506000600555565b60008061382383612d69565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815261dead600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a08231906024015b602060405180830381865afa158015612d3e573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314613914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610a4c82333084614678565b60008181526004602081905260408083206001015490517f70a08231000000000000000000000000000000000000000000000000000000008152309281019290925273ffffffffffffffffffffffffffffffffffffffff169081906370a0823190602401613876565b60005473ffffffffffffffffffffffffffffffffffffffff163314613a51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616c6c6572206e6f742044415050000000000000000000000000000000000060448201526064016109b2565b60025460065460405173ffffffffffffffffffffffffffffffffffffffff9092169181156108fc0291906000818181858888f19350505050158015613a9a573d6000803e3d6000fd5b506000600655565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790529151600092839290871691613b399190614f0e565b6000604051808303816000865af19150503d8060008114613b76576040519150601f19603f3d011682016040523d82523d6000602084013e613b7b565b606091505b5091509150818015613ba5575080511580613ba5575080806020019051810190613ba59190614ed4565b612842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016109b2565b60008581526004602052604090206005015460ff16613c86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e6f74206163746976650000000000000000000000000000000000000000000060448201526064016109b2565b60008115613caa5782613c998587614dc5565b613ca39190614dc5565b9050613e9f565b60008681526004602052604090206001015473ffffffffffffffffffffffffffffffffffffffff16613d38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f546f6b656e206e6f74207365740000000000000000000000000000000000000060448201526064016109b2565b613d428385614dc5565b60008781526004602081905260408083206001015490517f70a082310000000000000000000000000000000000000000000000000000000081523092810192909252929350909173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015613dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dea9190614e52565b60008881526004602081905260408220015491925090613e0a9083614e3f565b905080871115613e76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f544f4b454e3a206e6f7420656e6f756768206176616961626c6500000000000060448201526064016109b2565b60008881526004602081905260408220018054899290613e97908490614dc5565b909155505050505b600086815260046020526040902060030154811115613f1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4554483a204e6f7420656e6f7567682062616c616e636500000000000000000060448201526064016109b2565b60008681526004602052604081206003018054839290613f3b908490614e3f565b925050819055508360056000828254613f549190614dc5565b925050819055508260066000828254613f6d9190614dc5565b909155505060075460065410612446576000805460065460405173ffffffffffffffffffffffffffffffffffffffff9092169281156108fc029290818181858888f19350505050158015613fc5573d6000803e3d6000fd5b506000600655505050505050565b60008281526004602052604090206003015481111561404e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f43616e7420636f7665722067617300000000000000000000000000000000000060448201526064016109b2565b6000828152600460205260408120600301805483929061406f908490614e3f565b90915550505050565b6000828152600b60209081526040808320815160c0810183528154808252600183015494820194909452600282015460ff808216151594830194909452610100900490921615156060830152600381015460808301526004015460a082018190529092916140e591614dae565b905081604001511561411d5760008381526004602052604081206003018054839290614112908490614dc5565b909155506141449050565b6000838152600460208190526040822001805483929061413e908490614e3f565b90915550505b5050506000908152600b60205260408120818155600181018290556002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690556003810182905560040155565b60408051600280825260608201835260009283929190602083019080368337019050509050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561421a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061423e9190614ef1565b8160008151811061425157614251614dd8565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050848160018151811061429f5761429f614dd8565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918716906370a0823190602401602060405180830381865afa15801561431a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061433e9190614e52565b9050737a250d5630b4cf539739df2c5dacb4c659f2488d63b6f9de95866000858861436a426001614dc5565b6040518663ffffffff1660e01b81526004016143899493929190614f3d565b6000604051808303818588803b1580156143a257600080fd5b505af11580156143b6573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015284935073ffffffffffffffffffffffffffffffffffffffff8a1692506370a082319150602401602060405180830381865afa158015614427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061444b9190614e52565b6144559190614e3f565b9695505050505050565b6000838152600d6020526040812054806144d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4e6f206d65726b6c652061697264726f7000000000000000000000000000000060448201526064016109b2565b6040516000602082018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b1660218301529060350160405160208183030381529060405280519060200120905060005b85518161ffff16101561466e57846001166001036145cb576001868261ffff168151811061455b5761455b614dd8565b6020026020010151836040516020016145ae9392919060f89390931b7fff000000000000000000000000000000000000000000000000000000000000001683526001830191909152602182015260410190565b60405160208183030381529060405280519060200120915061464f565b600182878361ffff16815181106145e4576145e4614dd8565b60200260200101516040516020016146369392919060f89390931b7fff000000000000000000000000000000000000000000000000000000000000001683526001830191909152602182015260410190565b6040516020818303038152906040528051906020012091505b61465a600286614e6b565b94508061466681614fc1565b91505061452b565b5014949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916147179190614f0e565b6000604051808303816000865af19150503d8060008114614754576040519150601f19603f3d011682016040523d82523d6000602084013e614759565b606091505b50915091508180156147835750805115806147835750808060200190518101906147839190614ed4565b612446576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c45440000000000000000000000000000000000000000000000000000000060648201526084016109b2565b73ffffffffffffffffffffffffffffffffffffffff81168114611c7e57600080fd5b6000806040838503121561484357600080fd5b823561484e8161480e565b946020939093013593505050565b60006020828403121561486e57600080fd5b5035919050565b8015158114611c7e57600080fd5b60008060008060008060008060006101208a8c0312156148a257600080fd5b8935985060208a0135975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a01356148d781614875565b8093505060e08a013591506101008a013590509295985092959850929598565b60006020828403121561490957600080fd5b8135612d628161480e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561498a5761498a614914565b604052919050565b600067ffffffffffffffff8211156149ac576149ac614914565b5060051b60200190565b600082601f8301126149c757600080fd5b813560206149dc6149d783614992565b614943565b82815260059290921b840181019181810190868411156149fb57600080fd5b8286015b84811015614a1f578035614a128161480e565b83529183019183016149ff565b509695505050505050565b60008060008060808587031215614a4057600080fd5b8435935060208501359250604085013567ffffffffffffffff811115614a6557600080fd5b614a71878288016149b6565b949793965093946060013593505050565b60008060408385031215614a9557600080fd5b50508035926020909101359150565b60008060008060808587031215614aba57600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060808587031215614aec57600080fd5b8435935060208086013567ffffffffffffffff811115614b0b57600080fd5b8601601f81018813614b1c57600080fd5b8035614b2a6149d782614992565b81815260059190911b8201830190838101908a831115614b4957600080fd5b928401925b82841015614b6757833582529284019290840190614b4e565b979a97995050505060408601359560600135949350505050565b600080600060608486031215614b9657600080fd5b833592506020840135614ba88161480e565b91506040840135614bb88161480e565b809150509250925092565b600080600060608486031215614bd857600080fd5b833592506020840135614bea8161480e565b929592945050506040919091013590565b60008060408385031215614c0e57600080fd5b823591506020830135614c208161480e565b809150509250929050565b600080600080600060a08688031215614c4357600080fd5b853594506020808701359450604087013567ffffffffffffffff80821115614c6a57600080fd5b614c768a838b016149b6565b95506060890135915080821115614c8c57600080fd5b508701601f81018913614c9e57600080fd5b8035614cac6149d782614992565b81815260059190911b8201830190838101908b831115614ccb57600080fd5b928401925b82841015614ce957833582529284019290840190614cd0565b989b979a509598608001359695505050505050565b60008060008060008060c08789031215614d1757600080fd5b8635955060208701359450604087013593506060870135614d3781614875565b9598949750929560808101359460a0909101359350915050565b600080600060608486031215614d6657600080fd5b83359250602084013591506040840135614bb881614875565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417611b4457611b44614d7f565b80820180821115611b4457611b44614d7f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e3857614e38614d7f565b5060010190565b81810381811115611b4457611b44614d7f565b600060208284031215614e6457600080fd5b5051919050565b600082614ea1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600080600060608486031215614ebb57600080fd5b8351925060208401519150604084015190509250925092565b600060208284031215614ee657600080fd5b8151612d6281614875565b600060208284031215614f0357600080fd5b8151612d628161480e565b6000825160005b81811015614f2f5760208186018101518583015201614f15565b506000920191825250919050565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015614f9457845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101614f62565b505073ffffffffffffffffffffffffffffffffffffffff9690961660408501525050506060015292915050565b600061ffff808316818103614fd857614fd8614d7f565b600101939250505056fea2646970667358221220176e0ae1b9162fd9b7599d523a18a4e2bb0dab4c63e50fd1bdb115cad16547aa64736f6c63430008120033

Deployed Bytecode Sourcemap

2110:23069:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23579:210;;;;;;;;;;-1:-1:-1;23579:210:0;;;;;:::i;:::-;;:::i;:::-;;2552:40;;;;;;;;;;-1:-1:-1;2552:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;959:25:1;;;1003:42;1081:15;;;1076:2;1061:18;;1054:43;1133:15;;;;1113:18;;;1106:43;;;;1180:2;1165:18;;1158:34;1223:3;1208:19;;1201:35;1280:14;1273:22;1267:3;1252:19;;1245:51;946:3;931:19;2552:40:0;;;;;;;;13886:1102;;;;;;;;;;-1:-1:-1;13886:1102:0;;;;;:::i;:::-;;:::i;2995:27::-;;;;;;;;;;;;;;;;;;;2372:25:1;;;2360:2;2345:18;2995:27:0;2226:177:1;10848:49:0;;;;;;;;;;-1:-1:-1;10848:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;10904;;;;;;;;;;-1:-1:-1;10904:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2758:14:1;;2751:22;2733:41;;2721:2;2706:18;10904:49:0;2593:187:1;3425:128:0;;;;;;;;;;-1:-1:-1;3425:128:0;;;;;:::i;:::-;;:::i;16023:2071::-;;;;;;;;;;-1:-1:-1;16023:2071:0;;;;;:::i;:::-;;:::i;9043:234::-;;;;;;:::i;:::-;;:::i;2961:27::-;;;;;;;;;;;;;;;;22313:1063;;;;;;;;;;-1:-1:-1;22313:1063:0;;;;;:::i;:::-;;:::i;19645:455::-;;;;;;;;;;-1:-1:-1;19645:455:0;;;;;:::i;:::-;;:::i;2500:45::-;;;;;;;;;;-1:-1:-1;2500:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5482:42:1;5470:55;;;5452:74;;5440:2;5425:18;2500:45:0;5306:226:1;3029:39:0;;;;;;;;;;;;;;;;14997:331;;;;;;;;;;-1:-1:-1;14997:331:0;;;;;:::i;:::-;;:::i;3077:33::-;;;;;;;;;;-1:-1:-1;3077:33:0;;;;;;;;10221:588;;;;;;;;;;-1:-1:-1;10221:588:0;;;;;:::i;:::-;;:::i;24358:144::-;;;;;;;;;;-1:-1:-1;24358:144:0;;;;;:::i;:::-;;:::i;23384:187::-;;;;;;;;;;;;;:::i;18102:1535::-;;;;;;;;;;-1:-1:-1;18102:1535:0;;;;;:::i;:::-;;:::i;20848:1140::-;;;;;;;;;;-1:-1:-1;20848:1140:0;;;;;:::i;:::-;;:::i;2466:25::-;;;;;;;;;;-1:-1:-1;2466:25:0;;;;;;;;9766:443;;;;;;;;;;-1:-1:-1;9766:443:0;;;;;:::i;:::-;;:::i;2342:30::-;;;;;;;;;;-1:-1:-1;2342:30:0;;;;;;;;8471:526;;;;;;;;;;-1:-1:-1;8471:526:0;;;;;:::i;:::-;;:::i;3687:126::-;;;;;;;;;;-1:-1:-1;3687:126:0;;;;;:::i;:::-;;:::i;23969:103::-;;;;;;;;;;;;;:::i;2430:29::-;;;;;;;;;;-1:-1:-1;2430:29:0;;;;;;;;8133:330;;;;;;;;;;-1:-1:-1;8133:330:0;;;;;:::i;:::-;;:::i;9515:211::-;;;;;;;;;;-1:-1:-1;9515:211:0;;;;;:::i;:::-;;:::i;4128:118::-;;;;;;;;;;-1:-1:-1;4128:118:0;;;;;:::i;:::-;;:::i;25002:168::-;;;;;;;;;;-1:-1:-1;25002:168:0;;;;;:::i;:::-;;:::i;24510:300::-;;;;;;;;;;-1:-1:-1;24510:300:0;;;;;:::i;:::-;;:::i;10962:1869::-;;;;;;;;;;-1:-1:-1;10962:1869:0;;;;;:::i;:::-;;:::i;15340:675::-;;;;;;;;;;-1:-1:-1;15340:675:0;;;;;:::i;:::-;;:::i;12839:608::-;;;;;;;;;;-1:-1:-1;12839:608:0;;;;;:::i;:::-;;:::i;20293:244::-;;;;;;;;;;-1:-1:-1;20293:244:0;;;;;:::i;:::-;;:::i;3821:144::-;;;;;;;;;;;;;:::i;24818:176::-;;;;;;;;;;-1:-1:-1;24818:176:0;;;;;:::i;:::-;;:::i;3561:118::-;;;;;;;;;;-1:-1:-1;3561:118:0;;;;;:::i;:::-;;:::i;9285:222::-;;;;;;;;;;-1:-1:-1;9285:222:0;;;;;:::i;:::-;;:::i;24159:191::-;;;;;;;;;;-1:-1:-1;24159:191:0;;;;;:::i;:::-;;:::i;3973:147::-;;;;;;;;;;;;;:::i;23579:210::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;;;;;;;;;23670:14:::1;::::0;::::1;;23662:49;;;::::0;::::1;::::0;;11453:2:1;23662:49:0::1;::::0;::::1;11435:21:1::0;11492:2;11472:18;;;11465:30;11531:24;11511:18;;;11504:52;11573:18;;23662:49:0::1;11251:346:1::0;23662:49:0::1;23757:15;::::0;23722:59:::1;::::0;23750:5;;23757:15:::1;;23774:6:::0;23722:27:::1;:59::i;:::-;23579:210:::0;;:::o;13886:1102::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;14195:15:::1;14213:35;14230:18:::0;14213:14;:35:::1;:::i;:::-;14195:53;;14314:65;14326:10;14338;14350:7;14359:11;14372:6;14314:11;:65::i;:::-;14484:40;::::0;;::::1;::::0;::::1;12121:19:1::0;;;12156:12;;;12149:28;;;14451:20:0::1;::::0;12193:12:1;;14484:40:0::1;::::0;;;;::::1;::::0;;;;;;;14474:51;;14484:40:::1;14474:51:::0;;::::1;::::0;14544:22:::1;::::0;;;:8:::1;:22:::0;;;;;:32:::1;;::::0;14474:51;;-1:-1:-1;14544:32:0::1;::::0;::::1;;;:41;14536:67;;;::::0;::::1;::::0;;12418:2:1;14536:67:0::1;::::0;::::1;12400:21:1::0;12457:2;12437:18;;;12430:30;12496:15;12476:18;;;12469:43;12529:18;;14536:67:0::1;12216:337:1::0;14536:67:0::1;14656:19;14678:91;;;;;;;;14686:14;14678:91;;;;14702:12;14678:91;;;;14716:6;14678:91;;;;;;14724:4;14678:91;;;;;;14730:18;14678:91;;;;14750:18;14678:91;;::::0;14656:113:::1;;14805:4;14780:8;:22;14789:12;14780:22;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14906:1;14898:10:::0;::::1;14883:11;:25;14879:102;;14925:30;::::0;;;:16:::1;:30;::::0;;;;:44;;;14879:102:::1;14105:883;;;13886:1102:::0;;;;;;;;;:::o;3425:128::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;3513:15:::1;:32:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;3425:128::o;16023:2071::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;16172:41:::1;16189:10;16201:11;16172:16;:41::i;:::-;16259:40;::::0;;::::1;::::0;::::1;12121:19:1::0;;;12156:12;;;12149:28;;;16226:20:0::1;::::0;12193:12:1;;16259:40:0::1;::::0;;;;;::::1;::::0;;;;;;16249:51;;16259:40:::1;16249:51:::0;;::::1;::::0;16313:27:::1;16343:22:::0;;;:8:::1;:22:::0;;;;;16313:52:::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;::::0;;;;::::1;::::0;;::::1;;;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;16477:30;;;:16:::1;:30:::0;;;;;;;16249:51;;-1:-1:-1;16477:44:0;16469:89:::1;;;::::0;::::1;::::0;;12760:2:1;16469:89:0::1;::::0;::::1;12742:21:1::0;;;12779:18;;;12772:30;12838:34;12818:18;;;12811:62;12890:18;;16469:89:0::1;12558:356:1::0;16469:89:0::1;16577:12;:22;;;16569:52;;;::::0;::::1;::::0;;13121:2:1;16569:52:0::1;::::0;::::1;13103:21:1::0;13160:2;13140:18;;;13133:30;13199:19;13179:18;;;13172:47;13236:18;;16569:52:0::1;12919:341:1::0;16569:52:0::1;16870:23;::::0;::::1;::::0;:32:::1;::::0;16896:6:::1;16870:32;:::i;:::-;16851:15;:51;;16843:82;;;::::0;::::1;::::0;;13597:2:1;16843:82:0::1;::::0;::::1;13579:21:1::0;13636:2;13616:18;;;13609:30;13675:20;13655:18;;;13648:48;13713:18;;16843:82:0::1;13395:342:1::0;16843:82:0::1;16960:19:::0;;16938::::1;17006:20:::0;;;:8:::1;:20;::::0;;;;:26:::1;;::::0;::::1;;::::0;16938:19;17116:494:::1;17137:9;:16;17133:1;:20;17116:494;;;17175:16;17194:9;17204:1;17194:12;;;;;;;;:::i;:::-;;;;;;;17175:31;;17271:12;:19;;;17267:203;;;17311:42;::::0;:26:::1;::::0;::::1;::::0;:42;::::1;;;::::0;17338:14;;17311:42:::1;::::0;;;17338:14;17311:26;:42;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;17267:203;;;17394:60;17422:5;17429:8;17439:14;17394:27;:60::i;:::-;17586:12;17597:1;17586:12:::0;::::1;:::i;:::-;;;17160:450;17155:3;;;;;:::i;:::-;;;;17116:494;;;;17641:12;:23;;;17630:7;:34;;17622:61;;;::::0;::::1;::::0;;14333:2:1;17622:61:0::1;::::0;::::1;14315:21:1::0;14372:2;14352:18;;;14345:30;14411:16;14391:18;;;14384:44;14445:18;;17622:61:0::1;14131:338:1::0;17622:61:0::1;17694:22;::::0;;;:8:::1;:22;::::0;;;;:33:::1;;:44:::0;;17731:7;;17694:22;:44:::1;::::0;17731:7;;17694:44:::1;:::i;:::-;::::0;;;-1:-1:-1;;17807:19:0::1;::::0;::::1;::::0;17802:124:::1;;17894:19:::0;;17884:29:::1;::::0;:7;:29:::1;:::i;:::-;17843:20;::::0;;;:8:::1;:20;::::0;;;;;;:36:::1;:71:::0;;:36;;:20;:71:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;17802:124:0::1;17976:22;::::0;;;:8:::1;:22;::::0;;;;:33:::1;;::::0;:39;;17972:115:::1;;18032:43;18050:12;18064:10;18032:17;:43::i;:::-;16161:1933;;;;;16023:2071:::0;;;;:::o;9043:234::-;9140:1;9128:9;:13;9120:32;;;;;;;14809:2:1;9120:32:0;;;14791:21:1;14848:1;14828:18;;;14821:29;14886:8;14866:18;;;14859:36;14912:18;;9120:32:0;14607:329:1;9120:32:0;9171:20;;;;:8;:20;;;;;:27;;;;;9163:50;;;;;;;15143:2:1;9163:50:0;;;15125:21:1;15182:2;15162:18;;;15155:30;15221:12;15201:18;;;15194:40;15251:18;;9163:50:0;14941:334:1;9163:50:0;9224:20;;;;:8;:20;;;;;:32;;:45;;9260:9;;9224:20;:45;;9260:9;;9224:45;:::i;:::-;;;;-1:-1:-1;;;9043:234:0:o;22313:1063::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;22417:22:::1;22442:20:::0;;;:8:::1;:20;::::0;;;;;;;;22417:45;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;;;;22473:39:::1;;;::::0;::::1;::::0;;15482:2:1;22473:39:0::1;::::0;::::1;15464:21:1::0;15521:2;15501:18;;;15494:30;15560:14;15540:18;;;15533:42;15592:18;;22473:39:0::1;15280:336:1::0;22473:39:0::1;22584:7;:19;;;22562:18;:41;;22554:75;;;::::0;::::1;::::0;;15823:2:1;22554:75:0::1;::::0;::::1;15805:21:1::0;15862:2;15842:18;;;15835:30;15901:23;15881:18;;;15874:51;15942:18;;22554:75:0::1;15621:345:1::0;22554:75:0::1;22640:18;22683;22661:7;:19;;;:40;;;;:::i;:::-;22640:61:::0;-1:-1:-1;22716:17:0;;22712:184:::1;;22772:1;22750:19;::::0;::::1;:23:::0;;;22789:12:::1;:34:::0;;22805:18;;22772:1;22789:34:::1;::::0;22805:18;;22789:34:::1;:::i;:::-;::::0;;;-1:-1:-1;;22846:13:0::1;::::0;;::::1;::::0;22838:46;;:31:::1;::::0;;::::1;::::0;:46;::::1;;;::::0;22870:13;;22838:46:::1;::::0;;;22870:13;22838:31;:46;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;22712:184;22941:13;::::0;::::1;::::0;:27:::1;;::::0;22937:323:::1;;23059:13;::::0;::::1;::::0;23052:46:::1;::::0;;;;23092:4:::1;23052:46;::::0;::::1;5452:74:1::0;23028:21:0::1;::::0;23052:31:::1;;::::0;::::1;::::0;5425:18:1;;23052:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23028:70:::0;-1:-1:-1;23117:20:0;;23113:136:::1;;23158:75;23186:7;:13;;;23201:7;:13;;;23216:16;23158:27;:75::i;:::-;22970:290;22937:323;-1:-1:-1::0;;;23346:20:0::1;::::0;;;:8:::1;:20;::::0;;;;;;23339:27;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;22313:1063::o;19645:455::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;19773:40:::1;::::0;;::::1;::::0;;::::1;12121:19:1::0;;;12156:12;;;12149:28;;;19773:40:0;;;;;;;;;12193:12:1;;;;19773:40:0;;19763:51;;;;::::1;::::0;;;;-1:-1:-1;19883:22:0;;;:8:::1;:22:::0;;;;;;:33:::1;;::::0;:37;19879:158:::1;;19963:22;::::0;;;:8:::1;:22;::::0;;;;:33:::1;;::::0;:42:::1;::::0;19999:6:::1;19963:42;:::i;:::-;19944:15;:61;;19936:89;;;::::0;::::1;::::0;;16362:2:1;19936:89:0::1;::::0;::::1;16344:21:1::0;16401:2;16381:18;;;16374:30;16440:17;16420:18;;;16413:45;16475:18;;19936:89:0::1;16160:339:1::0;19936:89:0::1;20049:43;20067:12;20081:10;20049:17;:43::i;:::-;19729:371;19645:455:::0;;:::o;14997:331::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;15131:41:::1;15148:10;15160:11;15131:16;:41::i;:::-;-1:-1:-1::0;15216:40:0::1;::::0;;::::1;::::0;;::::1;12121:19:1::0;;;;12156:12;;;12149:28;;;;15216:40:0;;;;;;;;;12193:12:1;;;;15216:40:0;;15206:51;;;;::::1;::::0;;;;-1:-1:-1;15268:22:0;;;:8:::1;:22:::0;;;;;:33:::1;;:52:::0;14997:331::o;10221:588::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;10350:59:::1;10362:10;10374:6;10382:7;10391:11;10404:4;10350:11;:59::i;:::-;10468:13;10484:20:::0;;;:8:::1;:20;::::0;;;;:26:::1;;::::0;::::1;;::::0;10521:45:::1;;;::::0;::::1;::::0;;16706:2:1;10521:45:0::1;::::0;::::1;16688:21:1::0;16745:2;16725:18;;;16718:30;16784:15;16764:18;;;16757:43;16817:18;;10521:45:0::1;16504:337:1::0;10521:45:0::1;10577:17;10597:52;10618:5:::0;10625:8:::1;10632:1;10625:6:::0;:8:::1;:::i;:::-;10643:4;10597:20;:52::i;:::-;10577:72:::0;-1:-1:-1;2653:42:0::1;10708:29;10745:8;10752:1;10745:6:::0;:8:::1;:::i;:::-;10708:93;::::0;;::::1;::::0;;;;;;17438:42:1;17507:15;;10708:93:0::1;::::0;::::1;17489:34:1::0;17539:18;;;17532:34;;;10773:1:0::1;17582:18:1::0;;;17575:34;;;17625:18;;;17618:34;2734:42:0::1;17668:19:1::0;;;17661:44;10785:15:0::1;17721:19:1::0;;;17714:35;17400:19;;10708:93:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24358:144::-:0;24420:4;24451:20;;;:8;:20;;;;;;;;:26;;;24444:50;;;;;2734:42;24444:50;;;5452:74:1;;;;24451:26:0;;;24444:44;;5425:18:1;;24444:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24437:57;24358:144;-1:-1:-1;;24358:144:0:o;23384:187::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;23455:14:::1;::::0;::::1;;23447:49;;;::::0;::::1;::::0;;11453:2:1;23447:49:0::1;::::0;::::1;11435:21:1::0;11492:2;11472:18;;;11465:30;11531:24;11511:18;;;11504:52;11573:18;;23447:49:0::1;11251:346:1::0;23447:49:0::1;23515:15;::::0;;23507:56:::1;::::0;23515:15:::1;::::0;;::::1;::::0;23541:21:::1;23507:56:::0;::::1;;;::::0;23541:21;;23507:56;23515:15;23507:56;23541:21;23515:15;23507:56;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;23384:187::o:0;18102:1535::-;18254:52;;18289:66:1;18271:10:0;18276:2:1;18272:15;18268:88;18254:52:0;;;18256:101:1;18373:12;;;18366:28;;;18410:12;;;18403:28;;;18222:19:0;;18447:12:1;;18254:52:0;;;;;;;;;;;;;18244:63;;18254:52;18244:63;;;;18351:40;;;12121:19:1;;;12156:12;;;12149:28;;;18244:63:0;-1:-1:-1;18318:20:0;;12193:12:1;;18351:40:0;;;;;;;;;;;;;18341:51;;18351:40;18341:51;;;;18413:27;18443:22;;;:8;:22;;;;;18413:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18487:28;;;:15;:28;;;;;;;;18341:51;;-1:-1:-1;18487:28:0;18486:29;18478:89;;;;;;;18672:2:1;18478:89:0;;;18654:21:1;18711:2;18691:18;;;18684:30;18750:24;18730:18;;;18723:52;18792:18;;18478:89:0;18470:346:1;18478:89:0;18586:47;18605:12;18619:7;18628:4;18586:18;:47::i;:::-;18578:89;;;;;;;19023:2:1;18578:89:0;;;19005:21:1;19062:2;19042:18;;;19035:30;19101:24;19081:18;;;19074:52;19143:18;;18578:89:0;18821:346:1;18578:89:0;18686:12;:22;;;18678:90;;;;;;;19374:2:1;18678:90:0;;;19356:21:1;19413:2;19393:18;;;19386:30;19452:25;19432:18;;;19425:53;19495:18;;18678:90:0;19172:347:1;18678:90:0;18847:23;;;;:32;;18873:6;18847:32;:::i;:::-;18828:15;:51;;18820:87;;;;;;;19726:2:1;18820:87:0;;;19708:21:1;19765:2;19745:18;;;19738:30;19804:22;19784:18;;;19777:50;19844:18;;18820:87:0;19524:344:1;18820:87:0;18993:28;;;;:15;:28;;;;;;;;:35;;;;19024:4;18993:35;;;;;;19057:22;;;:8;:22;;;;;;:33;;;:38;;19049:71;;;;;;;20075:2:1;19049:71:0;;;20057:21:1;20114:2;20094:18;;;20087:30;20153:22;20133:18;;;20126:50;20193:18;;19049:71:0;19873:344:1;19049:71:0;19131:22;;;;:8;:22;;;;;:33;;:38;;19168:1;;19131:22;:38;;19168:1;;19131:38;:::i;:::-;;;;-1:-1:-1;;19186:19:0;;;;19182:295;;;19250:19;;19221:49;;19229:10;;19221:49;;;;;19250:19;19221:49;19250:19;19221:49;19250:19;19229:10;19221:49;;;;;;;;;;;;;;;;;;;;;19182:295;;;19331:20;;;;:8;:20;;;;;:26;;;19371:19;;19303:88;;19331:26;;;19359:10;;19303:27;:88::i;:::-;19446:19;;;19406:20;;;:8;:20;;;;;;;:36;:59;;:36;;19446:19;19406:59;;19446:19;;19406:59;:::i;:::-;;;;-1:-1:-1;;19182:295:0;19519:22;;;;:8;:22;;;;;:33;;;:39;;19515:115;;19575:43;19593:12;19607:10;19575:17;:43::i;:::-;18211:1426;;;18102:1535;;;;:::o;20848:1140::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;20951:22:::1;20976:20:::0;;;:8:::1;:20;::::0;;;;;;;;20951:45;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;;;;21007:39:::1;;;::::0;::::1;::::0;;15482:2:1;21007:39:0::1;::::0;::::1;15464:21:1::0;15521:2;15501:18;;;15494:30;15560:14;15540:18;;;15533:42;15592:18;;21007:39:0::1;15280:336:1::0;21007:39:0::1;21110:7;:19;;;21088:18;:41;;21080:75;;;::::0;::::1;::::0;;15823:2:1;21080:75:0::1;::::0;::::1;15805:21:1::0;15862:2;15842:18;;;15835:30;15901:23;15881:18;;;15874:51;15942:18;;21080:75:0::1;15621:345:1::0;21080:75:0::1;21166:18;21209;21187:7;:19;;;:40;;;;:::i;:::-;21166:61:::0;-1:-1:-1;21242:17:0;;21238:197:::1;;21311:1;21276:20:::0;;;:8:::1;:20;::::0;;;;:32:::1;;:36:::0;;;21328:12:::1;:34:::0;;21344:18;;21311:1;21328:34:::1;::::0;21344:18;;21328:34:::1;:::i;:::-;::::0;;;-1:-1:-1;;21385:13:0::1;::::0;;::::1;::::0;21377:46;;:31:::1;::::0;;::::1;::::0;:46;::::1;;;::::0;21409:13;;21377:46:::1;::::0;;;21409:13;21377:31;:46;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;21238:197;21537:13;::::0;::::1;::::0;:27:::1;;::::0;21533:446:::1;;21665:13;::::0;::::1;::::0;21658:46:::1;::::0;;;;21698:4:::1;21658:46;::::0;::::1;5452:74:1::0;21638:17:0::1;::::0;21658:31:::1;;::::0;::::1;::::0;5425:18:1;;21658:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21638:66;;21755:21;21794:7;:23;;;21779:12;:38;;;;:::i;:::-;21755:62:::0;-1:-1:-1;21836:20:0;;21832:136:::1;;21877:75;21905:7;:13;;;21920:7;:13;;;21935:16;21877:27;:75::i;:::-;21566:413;;21533:446;20940:1048;;20848:1140:::0;;:::o;9766:443::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;9980:59:::1;9992:10;10004:6;10012:7;10021:11;10034:4;9980:11;:59::i;:::-;10050:13;10066:20:::0;;;:8:::1;:20;::::0;;;;:26:::1;;::::0;::::1;;::::0;10103:45:::1;;;::::0;::::1;::::0;;16706:2:1;10103:45:0::1;::::0;::::1;16688:21:1::0;16745:2;16725:18;;;16718:30;16784:15;16764:18;;;16757:43;16817:18;;10103:45:0::1;16504:337:1::0;10103:45:0::1;10159:41;10180:5;10187:6;2734:42;10159:20;:41::i;8471:526::-:0;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;8636:1:::1;8598:20:::0;;;:8:::1;:20;::::0;;;;:26:::1;;::::0;:40:::1;:26;:40:::0;8590:67:::1;;;::::0;::::1;::::0;;20424:2:1;8590:67:0::1;::::0;::::1;20406:21:1::0;20463:2;20443:18;;;20436:30;20502:16;20482:18;;;20475:44;20536:18;;8590:67:0::1;20222:338:1::0;8590:67:0::1;8731:46;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;-1:-1:-1;8731:46:0;;;;;;;;;;;;8772:4:::1;8731:46:::0;;;;;;8788:20;;;:8:::1;:20:::0;;;;;;;;:24;;;;;;;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;8731:46;8885:19;8881:109:::1;;8921:57;::::0;;;;2653:42:::1;8921:57;::::0;::::1;20824:74:1::0;8967:10:0::1;20914:18:1::0;;;20907:34;8921:21:0::1;::::0;::::1;::::0;::::1;::::0;20797:18:1;;8921:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8579:418;8471:526:::0;;;:::o;3687:126::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;3774:14:::1;:31:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;3687:126::o;23969:103::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;24042:14:::1;:22:::0;;;::::1;::::0;;23969:103::o;8133:330::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;8246:41:::1;8263:10;8275:11;8246:16;:41::i;:::-;8298:20;::::0;;;:8:::1;:20;::::0;;;;;;;;:26:::1;;:34:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;8343:57;;;;;2653:42:::1;8343:57:::0;;::::1;20824:74:1::0;;;;8389:10:0::1;20914:18:1::0;;;20907:34;8343:21:0::1;::::0;20797:18:1;;8343:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9515:211::-:0;9623:20;;;;:8;:20;;;;;:26;;;;;9609:10;:40;9601:68;;;;;;;21404:2:1;9601:68:0;;;21386:21:1;21443:2;21423:18;;;21416:30;21482:17;21462:18;;;21455:45;21517:18;;9601:68:0;21202:339:1;9601:68:0;9680:20;;;;:8;:20;;;;;;:26;;:38;;;;;;;;;;;;;;9515:211::o;4128:118::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;4211:11:::1;:27:::0;4128:118::o;25002:168::-;25086:4;25117:20;;;:8;:20;;;;;;;;:26;;;25110:52;;;;;25117:26;5470:55:1;;;25110:52:0;;;5452:74:1;;;;25117:26:0;;;25110:44;;5425:18:1;;25110:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25103:59;25002:168;-1:-1:-1;;;25002:168:0:o;24510:300::-;24565:7;24602:20;;;:8;:20;;;;;;;;:26;;;24657:20;;;;;;;24602:26;;;;;24565:7;;2653:42;;24657:18;;:20;;;;;;;;;;;2653:42;24657:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24640:37;;24688:18;2653:42;24726:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24710:64;;;;;:48;22055:15:1;;;24710:64:0;;;22037:34:1;22107:15;;;22087:18;;;22080:43;24710:48:0;;;;;;;21949:18:1;;24710:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24688:86;24510:300;-1:-1:-1;;;;;24510:300:0:o;10962:1869::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;11147:7:::1;:14;11129:7;:14;:32;11121:70;;;::::0;::::1;::::0;;22336:2:1;11121:70:0::1;::::0;::::1;22318:21:1::0;22375:2;22355:18;;;22348:30;22414:27;22394:18;;;22387:55;22459:18;;11121:70:0::1;22134:349:1::0;11121:70:0::1;11235:40;::::0;;::::1;::::0;;::::1;12121:19:1::0;;;12156:12;;;12149:28;;;11235:40:0;;;;;;;;;12193:12:1;;;;11235:40:0;;;11225:51;;;::::1;::::0;11364:41:::1;12121:19:1::0;11393:11:0;11364:16:::1;:41::i;:::-;11418:11;11432:28:::0;;;:14:::1;:28;::::0;;;;;::::1;;::::0;11418:11;11512:480:::1;11529:7;:14;11527:1;:16;11512:480;;;11565:11;11579:7;11587:1;11579:10;;;;;;;;:::i;:::-;;;;;;;11565:24;;11670:6;11655:21;;;;;:::i;:::-;;;11748:14;11765:7;11773:1;11765:10;;;;;;;;:::i;:::-;;;;;;;11748:27;;11794:6;11790:191;;;11821:32;::::0;:24:::1;::::0;::::1;::::0;:32;::::1;;;::::0;11846:6;;11821:32:::1;::::0;;;11846:6;11821:24;:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;11790:191;;;11922:20;::::0;;;:8:::1;:20;::::0;;;;:26:::1;;::::0;11894:71:::1;::::0;11922:26:::1;;11950:6:::0;11958;11894:27:::1;:71::i;:::-;11550:442;;11545:3;;;;;:::i;:::-;;;;11512:480;;;-1:-1:-1::0;12069:20:0::1;12092:28:::0;;;:14:::1;:28;::::0;;;;;12139:16;12131:59:::1;;;::::0;::::1;::::0;;22690:2:1;12131:59:0::1;::::0;::::1;22672:21:1::0;22729:2;22709:18;;;22702:30;22768:32;22748:18;;;22741:60;22818:18;;12131:59:0::1;22488:354:1::0;12131:59:0::1;12224:12;12209:11;:27;;12201:64;;;::::0;::::1;::::0;;23049:2:1;12201:64:0::1;::::0;::::1;23031:21:1::0;23088:2;23068:18;;;23061:30;23127:26;23107:18;;;23100:54;23171:18;;12201:64:0::1;22847:348:1::0;12201:64:0::1;12323:6;12319:314;;;12346:21;12370:26;12385:11:::0;12370:12;:26:::1;:::i;:::-;12346:50;;12447:13;12411:8;:20;12420:10;12411:20;;;;;;;;;;;:32;;;:49;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;12319:314:0::1;::::0;-1:-1:-1;;12319:314:0::1;;12569:20;::::0;;;:8:::1;:20;::::0;;;;;;:36:::1;:52:::0;;12609:12;;12569:20;:52:::1;::::0;12609:12;;12569:52:::1;:::i;:::-;::::0;;;-1:-1:-1;;12319:314:0::1;-1:-1:-1::0;;;12821:1:0::1;12790:28:::0;;;:14:::1;:28;::::0;;;;:32;-1:-1:-1;;;;;10962:1869:0:o;15340:675::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;15483:41:::1;15500:10;15512:11;15483:16;:41::i;:::-;15568:40;::::0;;::::1;::::0;;::::1;12121:19:1::0;;;12156:12;;;12149:28;;;15568:40:0;;;;;;;;;12193:12:1;;;;15568:40:0;;15558:51;;;;::::1;::::0;;;;-1:-1:-1;15688:30:0;;;:16:::1;:30:::0;;;;;;;15680:78:::1;;;::::0;::::1;::::0;;23402:2:1;15680:78:0::1;::::0;::::1;23384:21:1::0;23441:2;23421:18;;;23414:30;23480:23;23460:18;;;23453:51;23521:18;;15680:78:0::1;23200:345:1::0;15680:78:0::1;15814:30;::::0;;;:16:::1;:30;::::0;;;;;;;:48;;;;15873:8:::1;:22:::0;;;;;;:32:::1;;:39:::0;;;::::1;;;::::0;;-1:-1:-1;;;15340:675:0:o;12839:608::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;12994:65:::1;13006:10;13018;13030:7;13039:11;13052:6;12994:11;:65::i;:::-;13150:1;13137:10;:14;13129:53;;;::::0;::::1;::::0;;23752:2:1;13129:53:0::1;::::0;::::1;23734:21:1::0;23791:2;23771:18;;;23764:30;23830:28;23810:18;;;23803:56;23876:18;;13129:53:0::1;23550:350:1::0;13129:53:0::1;13226:40;::::0;;::::1;::::0;;::::1;12121:19:1::0;;;12156:12;;;12149:28;;;13226:40:0;;;;;;;;;12193:12:1;;;;13226:40:0;;13216:51;;;;::::1;::::0;;;;-1:-1:-1;13286:28:0;;;:14:::1;:28:::0;;;;;;;:33;13278:61:::1;;;::::0;::::1;::::0;;24107:2:1;13278:61:0::1;::::0;::::1;24089:21:1::0;24146:2;24126:18;;;24119:30;24185:17;24165:18;;;24158:45;24220:18;;13278:61:0::1;23905:339:1::0;13278:61:0::1;13350:28;::::0;;;:14:::1;:28;::::0;;;;;;;:41;;;;13402:14:::1;:28:::0;;;;;;:37;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;;;12839:608:0:o;20293:244::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;20436:40:::1;::::0;;::::1;::::0;::::1;12121:19:1::0;;;12156:12;;;12149:28;;;20403:20:0::1;::::0;12193:12:1;;20436:40:0::1;::::0;;;;;::::1;::::0;;;;;;20426:51;;20436:40:::1;20426:51:::0;;::::1;::::0;20488:22:::1;::::0;;;:8:::1;:22:::0;;;;;:32:::1;;:41:::0;;;::::1;;;;::::0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;20293:244:0:o;3821:144::-;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;3892:14:::1;::::0;3917:12:::1;::::0;3884:46:::1;::::0;3892:14:::1;::::0;;::::1;::::0;3884:46;::::1;;;::::0;3917:12;3892:14:::1;3884:46:::0;3892:14;3884:46;3917:12;3892:14;3884:46;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;3956:1:0::1;3941:12;:16:::0;3821:144::o;24818:176::-;24876:4;24893:18;24914:20;24923:10;24914:8;:20::i;:::-;24952:34;;;;;2734:42;24952:34;;;5452:74:1;24893:41:0;;-1:-1:-1;24952:28:0;;;;;;5425:18:1;;24952:34:0;;;;;;;;;;;;;;;;;;;;;;;3561:118;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;3644:10:::1;:27:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;3561:118::o;9285:222::-;9420:79;9452:5;9459:10;9479:4;9486:12;9420:31;:79::i;24159:191::-;24227:4;24260:20;;;:8;:20;;;;;;;;:26;;;24304:38;;;;;24336:4;24304:38;;;5452:74:1;;;;24260:26:0;;;;;24304:23;;5425:18:1;;24304:38:0;5306:226:1;3973:147:0;3340:15;;;;3326:10;:29;3318:57;;;;;;;11109:2:1;3318:57:0;;;11091:21:1;11148:2;11128:18;;;11121:30;11187:17;11167:18;;;11160:45;11222:18;;3318:57:0;10907:339:1;3318:57:0;4051:10:::1;::::0;4072:12:::1;::::0;4043:42:::1;::::0;4051:10:::1;::::0;;::::1;::::0;4043:42;::::1;;;::::0;4072:12;4051:10:::1;4043:42:::0;4051:10;4043:42;4072:12;4051:10;4043:42;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;4111:1:0::1;4096:12;:16:::0;3973:147::o;382:294::-;510:45;;;499:10;20842:55:1;;;510:45:0;;;20824:74:1;20914:18;;;;20907:34;;;510:45:0;;;;;;;;;;20797:18:1;;;;510:45:0;;;;;;;;;;;;;499:57;;-1:-1:-1;;;;499:10:0;;;;:57;;510:45;499:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;463:93;;;;575:7;:57;;;;-1:-1:-1;587:11:0;;:16;;:44;;;618:4;607:24;;;;;;;;;;;;:::i;:::-;567:101;;;;;;;25170:2:1;567:101:0;;;25152:21:1;25209:2;25189:18;;;25182:30;25248:33;25228:18;;;25221:61;25299:18;;567:101:0;24968:355:1;4926:1739:0;5102:20;;;;:8;:20;;;;;:27;;;;;5094:50;;;;;;;15143:2:1;5094:50:0;;;15125:21:1;15182:2;15162:18;;;15155:30;15221:12;15201:18;;;15194:40;15251:18;;5094:50:0;14941:334:1;5094:50:0;5194:17;5232:6;5228:892;;;5347:18;5328:16;5337:7;5328:6;:16;:::i;:::-;:37;;;;:::i;:::-;5316:49;;5228:892;;;5532:1;5494:20;;;:8;:20;;;;;:26;;;:40;:26;5486:66;;;;;;;16706:2:1;5486:66:0;;;16688:21:1;16745:2;16725:18;;;16718:30;16784:15;16764:18;;;16757:43;16817:18;;5486:66:0;16504:337:1;5486:66:0;5650:28;5660:18;5650:7;:28;:::i;:::-;5747:18;5775:20;;;:8;:20;;;;;;;;:26;;;5768:59;;;;;5821:4;5768:59;;;5452:74:1;;;;5638:40:0;;-1:-1:-1;5747:18:0;;5775:26;;;5768:44;;5425:18:1;;5768:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5842:21;5882:20;;;:8;:20;;;;;;;:36;;5747:80;;-1:-1:-1;5842:21:0;5866:52;;5747:80;5866:52;:::i;:::-;5842:76;;5951:16;5941:6;:26;;5933:65;;;;;;;25530:2:1;5933:65:0;;;25512:21:1;25569:2;25549:18;;;25542:30;25608:28;25588:18;;;25581:56;25654:18;;5933:65:0;25328:350:1;5933:65:0;6062:20;;;;:8;:20;;;;;;;:36;:46;;6102:6;;6062:20;:46;;6102:6;;6062:46;:::i;:::-;;;;-1:-1:-1;;;;5228:892:0;6213:20;;;;:8;:20;;;;;:32;;;6200:45;;;6192:81;;;;;;;25885:2:1;6192:81:0;;;25867:21:1;25924:2;25904:18;;;25897:30;25963:25;25943:18;;;25936:53;26006:18;;6192:81:0;25683:347:1;6192:81:0;6284:20;;;;:8;:20;;;;;:32;;:45;;6320:9;;6284:20;:45;;6320:9;;6284:45;:::i;:::-;;;;;;;;6416:7;6400:12;;:23;;;;;;;:::i;:::-;;;;;;;;6450:18;6434:12;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;;6532:11:0;;6516:12;;:27;6512:138;;6568:15;;;6594:12;;6560:47;;6568:15;;;;;6560:47;;;;;;;6568:15;6560:47;6594:12;6568:15;6560:47;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6637:1:0;6622:12;:16;5047:1618;4926:1739;;;;;:::o;7891:209::-;7987:20;;;;:8;:20;;;;;:32;;;7976:43;;;7968:70;;;;;;;26237:2:1;7968:70:0;;;26219:21:1;26276:2;26256:18;;;26249:30;26315:16;26295:18;;;26288:44;26349:18;;7968:70:0;26035:338:1;7968:70:0;8049:20;;;;:8;:20;;;;;:32;;:43;;8085:7;;8049:20;:43;;8085:7;;8049:43;:::i;:::-;;;;-1:-1:-1;;;;7891:209:0:o;7398:485::-;7484:27;7514:22;;;:8;:22;;;;;;;;7484:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:27;7561:45;;;:::i;:::-;7547:59;;7621:12;:19;;;7617:219;;;7657:20;;;;:8;:20;;;;;:32;;:42;;7693:6;;7657:20;:42;;7693:6;;7657:42;:::i;:::-;;;;-1:-1:-1;7617:219:0;;-1:-1:-1;7617:219:0;;7778:20;;;;:8;:20;;;;;;;:36;:46;;7818:6;;7778:20;:46;;7818:6;;7778:46;:::i;:::-;;;;-1:-1:-1;;7617:219:0;-1:-1:-1;;;7853:22:0;;;;:8;:22;;;;;7846:29;;;;;;;;;;;;;;;;;;;;;;;;;;;7398:485::o;4279:639::-;4488:16;;;4502:1;4488:16;;;;;;;;4373:17;;;;4488:16;4502:1;4488:16;;;;;;;;;;-1:-1:-1;4488:16:0;4464:40;;2653:42;4525:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4515:4;4520:1;4515:7;;;;;;;;:::i;:::-;;;;;;:30;;;;;;;;;;;4566:5;4556:4;4561:1;4556:7;;;;;;;;:::i;:::-;:15;;;;:7;;;;;;;;;:15;4671:38;;;;;4703:4;4671:38;;;5452:74:1;4654:14:0;;4671:23;;;;;5425:18:1;;4671:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4654:55;-1:-1:-1;2653:42:0;4720:64;4792:9;4803:1;4806:4;4812:2;4816:17;:15;4832:1;4816:17;:::i;:::-;4720:114;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4860:38:0;;;;;4892:4;4860:38;;;5452:74:1;4901:9:0;;-1:-1:-1;4860:23:0;;;;-1:-1:-1;4860:23:0;;-1:-1:-1;5425:18:1;;4860:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;4845:65;4279:639;-1:-1:-1;;;;;;4279:639:0:o;6673:717::-;6788:4;6826:30;;;:16;:30;;;;;;;6869:54;;;;;;;27539:2:1;6869:54:0;;;27521:21:1;27578:2;27558:18;;;27551:30;27617:19;27597:18;;;27590:47;27654:18;;6869:54:0;27337:341:1;6869:54:0;6961:41;;6936:12;6961:41;;;27836:102:1;;;27988:66;6991:10:0;27975:2:1;27971:15;27967:88;27954:11;;;27947:109;6936:12:0;28072::1;;6961:41:0;;;;;;;;;;;;6951:52;;;;;;6936:67;;7019:8;7014:333;7037:10;:17;7033:1;:21;;;7014:333;;;7081:4;7088;7081:11;7097:1;7080:18;7076:236;;7159:4;7166:10;7177:1;7166:13;;;;;;;;;;:::i;:::-;;;;;;;7181:4;7136:50;;;;;;;;;28296:3:1;28292:16;;;;28310:66;28288:89;28276:102;;28403:1;28394:11;;28387:27;;;;28439:2;28430:12;;28423:28;28476:2;28467:12;;28095:390;7136:50:0;;;;;;;;;;;;;7126:61;;;;;;7119:68;;7076:236;;;7268:4;7275;7281:10;7292:1;7281:13;;;;;;;;;;:::i;:::-;;;;;;;7245:50;;;;;;;;;28296:3:1;28292:16;;;;28310:66;28288:89;28276:102;;28403:1;28394:11;;28387:27;;;;28439:2;28430:12;;28423:28;28476:2;28467:12;;28095:390;7245:50:0;;;;;;;;;;;;;7235:61;;;;;;7228:68;;7076:236;7326:9;7334:1;7326:9;;:::i;:::-;;-1:-1:-1;7056:3:0;;;;:::i;:::-;;;;7014:333;;;-1:-1:-1;7364:18:0;;6673:717;-1:-1:-1;;;;6673:717:0:o;684:323::-;830:51;;;819:10;28973:15:1;;;830:51:0;;;28955:34:1;29025:15;;;29005:18;;;28998:43;29057:18;;;;29050:34;;;830:51:0;;;;;;;;;;28867:18:1;;;;830:51:0;;;;;;;;;;;;;819:63;;-1:-1:-1;;;;819:10:0;;;;:63;;830:51;819:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;783:99;;;;901:7;:57;;;;-1:-1:-1;913:11:0;;:16;;:44;;;944:4;933:24;;;;;;;;;;;;:::i;:::-;893:106;;;;;;;29297:2:1;893:106:0;;;29279:21:1;29336:2;29316:18;;;29309:30;29375:34;29355:18;;;29348:62;29446:6;29426:18;;;29419:34;29470:19;;893:106:0;29095:400:1;14:154;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:315;241:6;249;302:2;290:9;281:7;277:23;273:32;270:52;;;318:1;315;308:12;270:52;357:9;344:23;376:31;401:5;376:31;:::i;:::-;426:5;478:2;463:18;;;;450:32;;-1:-1:-1;;;173:315:1:o;493:180::-;552:6;605:2;593:9;584:7;580:23;576:32;573:52;;;621:1;618;611:12;573:52;-1:-1:-1;644:23:1;;493:180;-1:-1:-1;493:180:1:o;1307:118::-;1393:5;1386:13;1379:21;1372:5;1369:32;1359:60;;1415:1;1412;1405:12;1430:791;1558:6;1566;1574;1582;1590;1598;1606;1614;1622;1675:3;1663:9;1654:7;1650:23;1646:33;1643:53;;;1692:1;1689;1682:12;1643:53;1728:9;1715:23;1705:33;;1785:2;1774:9;1770:18;1757:32;1747:42;;1836:2;1825:9;1821:18;1808:32;1798:42;;1887:2;1876:9;1872:18;1859:32;1849:42;;1938:3;1927:9;1923:19;1910:33;1900:43;;1990:3;1979:9;1975:19;1962:33;1952:43;;2045:3;2034:9;2030:19;2017:33;2059:28;2081:5;2059:28;:::i;:::-;2106:5;2096:15;;;2158:3;2147:9;2143:19;2130:33;2120:43;;2210:3;2199:9;2195:19;2182:33;2172:43;;1430:791;;;;;;;;;;;:::o;2785:247::-;2844:6;2897:2;2885:9;2876:7;2872:23;2868:32;2865:52;;;2913:1;2910;2903:12;2865:52;2952:9;2939:23;2971:31;2996:5;2971:31;:::i;3037:184::-;3089:77;3086:1;3079:88;3186:4;3183:1;3176:15;3210:4;3207:1;3200:15;3226:334;3297:2;3291:9;3353:2;3343:13;;3358:66;3339:86;3327:99;;3456:18;3441:34;;3477:22;;;3438:62;3435:88;;;3503:18;;:::i;:::-;3539:2;3532:22;3226:334;;-1:-1:-1;3226:334:1:o;3565:183::-;3625:4;3658:18;3650:6;3647:30;3644:56;;;3680:18;;:::i;:::-;-1:-1:-1;3725:1:1;3721:14;3737:4;3717:25;;3565:183::o;3753:737::-;3807:5;3860:3;3853:4;3845:6;3841:17;3837:27;3827:55;;3878:1;3875;3868:12;3827:55;3914:6;3901:20;3940:4;3964:60;3980:43;4020:2;3980:43;:::i;:::-;3964:60;:::i;:::-;4058:15;;;4144:1;4140:10;;;;4128:23;;4124:32;;;4089:12;;;;4168:15;;;4165:35;;;4196:1;4193;4186:12;4165:35;4232:2;4224:6;4220:15;4244:217;4260:6;4255:3;4252:15;4244:217;;;4340:3;4327:17;4357:31;4382:5;4357:31;:::i;:::-;4401:18;;4439:12;;;;4277;;4244:217;;;-1:-1:-1;4479:5:1;3753:737;-1:-1:-1;;;;;;3753:737:1:o;4495:553::-;4606:6;4614;4622;4630;4683:3;4671:9;4662:7;4658:23;4654:33;4651:53;;;4700:1;4697;4690:12;4651:53;4736:9;4723:23;4713:33;;4793:2;4782:9;4778:18;4765:32;4755:42;;4848:2;4837:9;4833:18;4820:32;4875:18;4867:6;4864:30;4861:50;;;4907:1;4904;4897:12;4861:50;4930:61;4983:7;4974:6;4963:9;4959:22;4930:61;:::i;:::-;4495:553;;;;-1:-1:-1;4920:71:1;;5038:2;5023:18;5010:32;;-1:-1:-1;;;4495:553:1:o;5053:248::-;5121:6;5129;5182:2;5170:9;5161:7;5157:23;5153:32;5150:52;;;5198:1;5195;5188:12;5150:52;-1:-1:-1;;5221:23:1;;;5291:2;5276:18;;;5263:32;;-1:-1:-1;5053:248:1:o;5537:385::-;5623:6;5631;5639;5647;5700:3;5688:9;5679:7;5675:23;5671:33;5668:53;;;5717:1;5714;5707:12;5668:53;-1:-1:-1;;5740:23:1;;;5810:2;5795:18;;5782:32;;-1:-1:-1;5861:2:1;5846:18;;5833:32;;5912:2;5897:18;5884:32;;-1:-1:-1;5537:385:1;-1:-1:-1;5537:385:1:o;5927:1096::-;6038:6;6046;6054;6062;6115:3;6103:9;6094:7;6090:23;6086:33;6083:53;;;6132:1;6129;6122:12;6083:53;6168:9;6155:23;6145:33;;6197:2;6250;6239:9;6235:18;6222:32;6277:18;6269:6;6266:30;6263:50;;;6309:1;6306;6299:12;6263:50;6332:22;;6385:4;6377:13;;6373:27;-1:-1:-1;6363:55:1;;6414:1;6411;6404:12;6363:55;6450:2;6437:16;6473:60;6489:43;6529:2;6489:43;:::i;6473:60::-;6567:15;;;6649:1;6645:10;;;;6637:19;;6633:28;;;6598:12;;;;6673:19;;;6670:39;;;6705:1;6702;6695:12;6670:39;6729:11;;;;6749:142;6765:6;6760:3;6757:15;6749:142;;;6831:17;;6819:30;;6782:12;;;;6869;;;;6749:142;;;5927:1096;;6910:5;;-1:-1:-1;;;;6962:2:1;6947:18;;6934:32;;7013:2;6998:18;6985:32;;5927:1096;-1:-1:-1;;;;5927:1096:1:o;7028:456::-;7105:6;7113;7121;7174:2;7162:9;7153:7;7149:23;7145:32;7142:52;;;7190:1;7187;7180:12;7142:52;7226:9;7213:23;7203:33;;7286:2;7275:9;7271:18;7258:32;7299:31;7324:5;7299:31;:::i;:::-;7349:5;-1:-1:-1;7406:2:1;7391:18;;7378:32;7419:33;7378:32;7419:33;:::i;:::-;7471:7;7461:17;;;7028:456;;;;;:::o;7489:383::-;7566:6;7574;7582;7635:2;7623:9;7614:7;7610:23;7606:32;7603:52;;;7651:1;7648;7641:12;7603:52;7687:9;7674:23;7664:33;;7747:2;7736:9;7732:18;7719:32;7760:31;7785:5;7760:31;:::i;:::-;7489:383;;7810:5;;-1:-1:-1;;;7862:2:1;7847:18;;;;7834:32;;7489:383::o;7877:315::-;7945:6;7953;8006:2;7994:9;7985:7;7981:23;7977:32;7974:52;;;8022:1;8019;8012:12;7974:52;8058:9;8045:23;8035:33;;8118:2;8107:9;8103:18;8090:32;8131:31;8156:5;8131:31;:::i;:::-;8181:5;8171:15;;;7877:315;;;;;:::o;8197:1344::-;8342:6;8350;8358;8366;8374;8427:3;8415:9;8406:7;8402:23;8398:33;8395:53;;;8444:1;8441;8434:12;8395:53;8480:9;8467:23;8457:33;;8509:2;8558;8547:9;8543:18;8530:32;8520:42;;8613:2;8602:9;8598:18;8585:32;8636:18;8677:2;8669:6;8666:14;8663:34;;;8693:1;8690;8683:12;8663:34;8716:61;8769:7;8760:6;8749:9;8745:22;8716:61;:::i;:::-;8706:71;;8830:2;8819:9;8815:18;8802:32;8786:48;;8859:2;8849:8;8846:16;8843:36;;;8875:1;8872;8865:12;8843:36;-1:-1:-1;8898:24:1;;8953:4;8945:13;;8941:27;-1:-1:-1;8931:55:1;;8982:1;8979;8972:12;8931:55;9018:2;9005:16;9041:60;9057:43;9097:2;9057:43;:::i;9041:60::-;9135:15;;;9217:1;9213:10;;;;9205:19;;9201:28;;;9166:12;;;;9241:19;;;9238:39;;;9273:1;9270;9263:12;9238:39;9297:11;;;;9317:142;9333:6;9328:3;9325:15;9317:142;;;9399:17;;9387:30;;9350:12;;;;9437;;;;9317:142;;;8197:1344;;;;-1:-1:-1;8197:1344:1;;9530:3;9515:19;9502:33;;8197:1344;-1:-1:-1;;;;;;8197:1344:1:o;9936:584::-;10037:6;10045;10053;10061;10069;10077;10130:3;10118:9;10109:7;10105:23;10101:33;10098:53;;;10147:1;10144;10137:12;10098:53;10183:9;10170:23;10160:33;;10240:2;10229:9;10225:18;10212:32;10202:42;;10291:2;10280:9;10276:18;10263:32;10253:42;;10345:2;10334:9;10330:18;10317:32;10358:28;10380:5;10358:28;:::i;:::-;9936:584;;;;-1:-1:-1;9936:584:1;;10457:3;10442:19;;10429:33;;10509:3;10494:19;;;10481:33;;-1:-1:-1;9936:584:1;-1:-1:-1;;9936:584:1:o;10525:377::-;10599:6;10607;10615;10668:2;10656:9;10647:7;10643:23;10639:32;10636:52;;;10684:1;10681;10674:12;10636:52;10720:9;10707:23;10697:33;;10777:2;10766:9;10762:18;10749:32;10739:42;;10831:2;10820:9;10816:18;10803:32;10844:28;10866:5;10844:28;:::i;11602:184::-;11654:77;11651:1;11644:88;11751:4;11748:1;11741:15;11775:4;11772:1;11765:15;11791:168;11864:9;;;11895;;11912:15;;;11906:22;;11892:37;11882:71;;11933:18;;:::i;13265:125::-;13330:9;;;13351:10;;;13348:36;;;13364:18;;:::i;13742:184::-;13794:77;13791:1;13784:88;13891:4;13888:1;13881:15;13915:4;13912:1;13905:15;13931:195;13970:3;14001:66;13994:5;13991:77;13988:103;;14071:18;;:::i;:::-;-1:-1:-1;14118:1:1;14107:13;;13931:195::o;14474:128::-;14541:9;;;14562:11;;;14559:37;;;14576:18;;:::i;15971:184::-;16041:6;16094:2;16082:9;16073:7;16069:23;16065:32;16062:52;;;16110:1;16107;16100:12;16062:52;-1:-1:-1;16133:16:1;;15971:184;-1:-1:-1;15971:184:1:o;16846:274::-;16886:1;16912;16902:189;;16947:77;16944:1;16937:88;17048:4;17045:1;17038:15;17076:4;17073:1;17066:15;16902:189;-1:-1:-1;17105:9:1;;16846:274::o;17760:306::-;17848:6;17856;17864;17917:2;17905:9;17896:7;17892:23;17888:32;17885:52;;;17933:1;17930;17923:12;17885:52;17962:9;17956:16;17946:26;;18012:2;18001:9;17997:18;17991:25;17981:35;;18056:2;18045:9;18041:18;18035:25;18025:35;;17760:306;;;;;:::o;20952:245::-;21019:6;21072:2;21060:9;21051:7;21047:23;21043:32;21040:52;;;21088:1;21085;21078:12;21040:52;21120:9;21114:16;21139:28;21161:5;21139:28;:::i;21546:251::-;21616:6;21669:2;21657:9;21648:7;21644:23;21640:32;21637:52;;;21685:1;21682;21675:12;21637:52;21717:9;21711:16;21736:31;21761:5;21736:31;:::i;24551:412::-;24680:3;24718:6;24712:13;24743:1;24753:129;24767:6;24764:1;24761:13;24753:129;;;24865:4;24849:14;;;24845:25;;24839:32;24826:11;;;24819:53;24782:12;24753:129;;;-1:-1:-1;24937:1:1;24901:16;;24926:13;;;-1:-1:-1;24901:16:1;24551:412;-1:-1:-1;24551:412:1:o;26378:954::-;26612:4;26660:3;26649:9;26645:19;26691:6;26680:9;26673:25;26717:2;26755:3;26750:2;26739:9;26735:18;26728:31;26779:6;26814;26808:13;26845:6;26837;26830:22;26883:3;26872:9;26868:19;26861:26;;26922:2;26914:6;26910:15;26896:29;;26943:1;26953:218;26967:6;26964:1;26961:13;26953:218;;;27032:13;;27047:42;27028:62;27016:75;;27146:15;;;;27111:12;;;;26989:1;26982:9;26953:218;;;-1:-1:-1;;27239:42:1;27227:55;;;;27222:2;27207:18;;27200:83;-1:-1:-1;;;27314:2:1;27299:18;27292:34;27188:3;26378:954;-1:-1:-1;;26378:954:1:o;28490:197::-;28528:3;28556:6;28597:2;28590:5;28586:14;28624:2;28615:7;28612:15;28609:41;;28630:18;;:::i;:::-;28679:1;28666:15;;28490:197;-1:-1:-1;;;28490:197:1:o

Swarm Source

ipfs://176e0ae1b9162fd9b7599d523a18a4e2bb0dab4c63e50fd1bdb115cad16547aa

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  ]
[ 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.