POL Price: $0.300629 (-5.05%)
 

Overview

POL Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 POL

POL Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TokenSwapSpot

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at polygonscan.com on 2024-11-30
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface ITokenSwap {
    function swapToken(
        address tokenIn,
        address tokenOut,
        uint256 amountIn,
        uint24 feeTier,
        address payable reseller
    ) external payable;
    function getPrice(address token1,address token2,uint256 feeTier) external view returns (uint256);
    function WETH() external view returns (address);
}

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function allowance(address owner,address spender) external view returns (uint);
    function approve(address spender, uint256 amount) external returns (bool);
}

interface IWETH {
    function deposit() external payable;
    function withdraw(uint wad) external;
}

contract TokenSwapSpot {
    // Owner of the contract
    address public owner;

    // Oracle address to call for order processing
    address public oracle;

    // Address of the TokenSwap contract (Uniswap swap handler)
    address public tokenSwapContract;
    ITokenSwap tokenSwap;
    address public WETH;

    uint public oracleFee = 0.02 ether;

    // Event for order placed
    event OrderPlaced(address indexed user, address tokenIn, address tokenOut, uint256 price, uint256 amountIn);

    // Event for swap triggered via oracle
    event OrderTriggered(address indexed user, address tokenIn, address tokenOut, uint256 price, uint256 amountIn);

    // Event for order cancellation
    event OrderCancelled(address indexed user, address tokenIn, address tokenOut, uint256 price, uint256 amountIn);

    // Struct representing a limit order
    struct Order {
        address user;
        uint256 priceIn;
        uint256 pairPriceId;
        uint256 amountIn; // tokenInAmount
        uint8 status; // 0=>open / 1=>withdrawed / 2=>cancelled
        uint256 createdAt;
        uint256 updatedAt;
    }
    uint256 public lastOrderId;
    mapping(uint256 => Order) public orders;
    mapping (address => uint[]) userOrderIds;
    mapping (address =>uint) public userOrderCount;

    struct PairPrice{
        address tokenIn;
        address tokenOut;
        uint256 price;
        uint256 totalAmountIn;
        uint256 amountOut; // if 0 its open, if more it's done
        uint256 totalWithdrawn;
    }
    uint256 public lastPairId;
    mapping(uint256 => PairPrice) public pairPrices;
    mapping(address => mapping(address => mapping(uint=>uint))) pairPriceIds;
    
    // Modifier to restrict functions to the contract owner
    modifier onlyOwner() {
        require(msg.sender == owner, "Not the contract owner");
        _;
    }

    // Modifier to restrict functions to the oracle
    modifier onlyOracle() {
        require(msg.sender == oracle, "Not the oracle");
        _;
    }

    constructor(address _tokenSwapContract) {
        owner = msg.sender;
        oracle = msg.sender;
        tokenSwapContract = _tokenSwapContract;
        tokenSwap = ITokenSwap(tokenSwapContract);
        WETH = tokenSwap.WETH();
    }

    // Function to place a limit order
    function placeOrder(address tokenIn, address tokenOut, uint256 price, uint256 amountIn) external payable {
        require(msg.value >= oracleFee,"Not enough oracle fee");
        if (msg.value > oracleFee && (tokenIn==address(0) || tokenIn==address(WETH)) ) {
            tokenIn = WETH;
            amountIn = msg.value - oracleFee;
            IWETH wethContract = IWETH(WETH);
            wethContract.deposit{value: amountIn}();

            //transfer oracle fee to oracle address
            (bool sent, ) = oracle.call{value: oracleFee}("");
            require(sent, "Failed to send oracle fee");
        }else{
            require(amountIn > 0, "Must specify an amount to swap");

            //transfer token to contract
            IERC20 token = IERC20(tokenIn);
            token.transferFrom(msg.sender, address(this), amountIn);

            //transfer oracle fee to oracle address
            if(msg.value>0){
                (bool sent, ) = oracle.call{value: msg.value}("");
                require(sent, "Failed to send oracle fee");
            }
        }
        
        uint256 pairPriceId = getPairPriceId(tokenIn,tokenOut,price);
        pairPrices[pairPriceId].totalAmountIn += amountIn;

        //approve tokenIn
        IERC20 erc20 = IERC20(tokenIn);
        if(erc20.allowance(address(this), tokenSwapContract)<amountIn)
            erc20.approve(tokenSwapContract,2**255);

        //place order
        Order memory newOrder = Order({
            user: msg.sender,
            priceIn: tokenSwap.getPrice(tokenIn, tokenOut,3000),
            pairPriceId:pairPriceId,
            amountIn: amountIn,
            status:0,//pending
            createdAt: block.timestamp,
            updatedAt: 0
        });

        lastOrderId++;
        orders[lastOrderId] = newOrder;
        userOrderIds[msg.sender].push(lastOrderId);
        userOrderCount[msg.sender]++;

        emit OrderPlaced(msg.sender, tokenIn, tokenOut, price, amountIn);
    }

    // Function to cancel an order
    function cancelOrder(uint256 orderIndex) external {
        //validate inputs
        require(orderIndex<=userOrderCount[msg.sender],"Order id is not valid");
        uint256 orderId = userOrderIds[msg.sender][orderIndex];
        require(orders[orderId].status==0 && orders[orderId].amountIn>0,"Order is not open");

        //update order status
        orders[orderId].status=2;
        orders[orderId].updatedAt=block.timestamp;
        
        //rolback the amounts 
        uint256 pairPriceId = orders[orderId].pairPriceId;
        if(pairPrices[pairPriceId].tokenIn==WETH)
        {
            IWETH(WETH).withdraw(orders[orderId].amountIn);
            (bool success, ) = msg.sender.call{value: orders[orderId].amountIn}("");
            require(success, "Failed to send ETH");
        }else
            IERC20(pairPrices[pairPriceId].tokenIn).transfer(msg.sender, orders[orderId].amountIn);
            
        pairPrices[pairPriceId].totalAmountIn -= orders[orderId].amountIn;
    }

    function withdrawOrder(uint256 orderIndex) public{
        
        //validate inputs
        require(orderIndex<=userOrderCount[msg.sender],"Order id is not valid");
        uint256 orderId = userOrderIds[msg.sender][orderIndex];
        require(orders[orderId].status==0 && orders[orderId].amountIn>0,"Order is not open");

        //update order status
        orders[orderId].status=1; //withdrawed
        orders[orderId].updatedAt=block.timestamp;
        
        //pay the swapped amounts 
        uint256 pairPriceId = orders[orderId].pairPriceId;
        require(pairPrices[pairPriceId].amountOut>0,"Order is not placed yet.");
        uint256 totalAmountIn = pairPrices[pairPriceId].totalAmountIn;
        uint256 totalAmountOut = pairPrices[pairPriceId].amountOut;
        uint256 myAmountIn = orders[orderId].amountIn;
        uint256 ratio = myAmountIn * 10**18 / totalAmountIn;
        uint256 myAmountOut = totalAmountOut * ratio / 10**18;

        if(pairPrices[pairPriceId].tokenOut==WETH)
        {
            //IWETH(WETH).withdraw(myAmountOut); //already converted to ETH in swap contract
            (bool success, ) = msg.sender.call{value: myAmountOut}("");
            require(success, "Failed to send ETH");
        }else
            IERC20(pairPrices[pairPriceId].tokenOut).transfer(msg.sender, myAmountOut);
        pairPrices[pairPriceId].totalWithdrawn += myAmountOut;
    }

    // Function to process orders in steps (batch processing)
    function processPairPrice(uint256 pairPriceId) external onlyOracle {
        
        //TODO:
        //get price and check if it is ok
        //??????????????????

        //place swap order and get received token amount
        uint256 firstBalance;
        if(pairPrices[pairPriceId].tokenOut == WETH)
            firstBalance = address(this).balance;
        else
            firstBalance = IERC20(pairPrices[pairPriceId].tokenOut).balanceOf(address(this));

        tokenSwap.swapToken(
            pairPrices[pairPriceId].tokenIn,
            pairPrices[pairPriceId].tokenOut,
            pairPrices[pairPriceId].totalAmountIn,
            3000,
            payable(oracle)
        );

        uint256 newBalance;
        if(pairPrices[pairPriceId].tokenOut == WETH)
            newBalance = address(this).balance;
        else
            newBalance = IERC20(pairPrices[pairPriceId].tokenOut).balanceOf(address(this));
        uint256 income = newBalance - firstBalance;
        require(income>0,"Failed to process swap");

        //disable old pairPrice and update income
        pairPrices[pairPriceId].amountOut = income;
        pairPriceIds[pairPrices[pairPriceId].tokenIn][pairPrices[pairPriceId].tokenOut][pairPrices[pairPriceId].price]=0;
    }

    // Function to get all active orders for a user with pagination
    struct TmpOrder {
        uint userOrderIndex;
        address user;
        uint256 priceIn;
        uint256 pairPriceId;
        uint256 amountIn; // tokenInAmount
        uint8 status; // 0=>open / 1=>withdrawed / 2=>cancelled
        uint256 createdAt;
        uint256 updatedAt;
        address tokenIn;
        address tokenOut;
        uint256 price;
        uint256 totalAmountIn;
        uint256 amountOut; // if 0 its open, if more it's done
        uint256 totalWithdrawn;
    }
    function getUserOrdersPaginated(address user,uint256 fromId, uint256 toId) external view returns (TmpOrder[] memory) {
    
        if (toId > userOrderIds[user].length) {
            toId = userOrderIds[user].length;
        }
        require(fromId <= toId, "Invalid pagination range");

        uint256 size = toId - fromId;
        TmpOrder[] memory paginatedOrders = new TmpOrder[](size);
        
        for (uint256 i = 0; i < size; i++) {
            uint256 orderIndex = userOrderIds[user][fromId + i];
            uint256 pairPriceId = orders[orderIndex].pairPriceId;

            TmpOrder memory _tmpOrder = TmpOrder({
                userOrderIndex: fromId + i,
                user: orders[orderIndex].user,
                priceIn: orders[orderIndex].priceIn,
                pairPriceId: orders[orderIndex].pairPriceId,
                amountIn: orders[orderIndex].amountIn, // tokenInAmount
                status: orders[orderIndex].status, // 0=>open / 1=>withdrawed / 2=>cancelled
                createdAt: orders[orderIndex].createdAt,
                updatedAt: orders[orderIndex].updatedAt,
                tokenIn: pairPrices[pairPriceId].tokenIn,
                tokenOut: pairPrices[pairPriceId].tokenOut,
                price: pairPrices[pairPriceId].price,
                totalAmountIn: pairPrices[pairPriceId].totalAmountIn,
                amountOut: pairPrices[pairPriceId].amountOut,
                totalWithdrawn: pairPrices[pairPriceId].totalWithdrawn
            });

            // Store the struct in the paginatedOrders array
            paginatedOrders[i] = _tmpOrder;
        }

        return paginatedOrders;
    }

    
    // Function to set a new TokenSwap contract address
    function setTokenSwapContract(address _tokenSwapContract) external onlyOwner {
        tokenSwapContract = _tokenSwapContract;
        tokenSwap = ITokenSwap(tokenSwapContract);
        WETH = tokenSwap.WETH();
    }

    // Function to set the oracle address
    function setOracle(address _oracle) external onlyOwner {
        oracle = _oracle;
    }

    // Function to set the oracle address
    function setOracleFee(uint _oracleFee) external onlyOwner {
        oracleFee = _oracleFee;
    }

    // Helper function to round the price to a smaller step using base 2
    function roundPriceBase2(uint256 price) private pure returns (uint256) {
        uint256 magnitude = 1 << (log2(price) - 8); // Shift to create smaller rounding steps
        uint256 roundedPrice = (price / magnitude) * magnitude;
        return roundedPrice;
    }

    // Efficient log2 implementation (based on bit-shifting)
    function log2(uint256 x) private pure returns (uint256) {
        uint256 result = 0;
        if (x >= 2**128) { x >>= 128; result += 128; }
        if (x >= 2**64)  { x >>= 64; result += 64; }
        if (x >= 2**32)  { x >>= 32; result += 32; }
        if (x >= 2**16)  { x >>= 16; result += 16; }
        if (x >= 2**8)   { x >>= 8;  result += 8; }
        if (x >= 2**4)   { x >>= 4;  result += 4; }
        if (x >= 2**2)   { x >>= 2;  result += 2; }
        if (x >= 2**1)   { result += 1; }
        return result;
    }
    
    function getPairPriceId(address tokenIn,address tokenOut,uint256 price) private returns(uint){
        // Round the price to the nearest 0.1%
        price = roundPriceBase2(price);
        
        if(pairPriceIds[tokenIn][tokenOut][price]>0)
            return pairPriceIds[tokenIn][tokenOut][price];
        
        PairPrice memory _pairPrice = PairPrice({
            tokenIn:tokenIn,
            tokenOut:tokenOut,
            price:price,
            totalAmountIn:0,
            amountOut:0, // if 0 its open, if more it's done
            totalWithdrawn:0
        });
        lastPairId++;
        pairPrices[lastPairId] = _pairPrice;
        pairPriceIds[tokenIn][tokenOut][price] = lastPairId;
        return lastPairId;
    }

    // Emergency withdraw ETH
    function emergencyWithdrawETH(address payable to) external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No ETH to withdraw");
        to.transfer(balance);
    }

    // Emergency withdraw ERC20 tokens
    function emergencyWithdrawToken(address token, address to) external onlyOwner {
        IERC20 erc20 = IERC20(token);
        uint256 balance = erc20.balanceOf(address(this));
        require(balance > 0, "No token balance to withdraw");
        erc20.transfer(to, balance);
    }

    // Fallback function to receive ETH
    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_tokenSwapContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"OrderCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"OrderPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"OrderTriggered","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderIndex","type":"uint256"}],"name":"cancelOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"emergencyWithdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"emergencyWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"fromId","type":"uint256"},{"internalType":"uint256","name":"toId","type":"uint256"}],"name":"getUserOrdersPaginated","outputs":[{"components":[{"internalType":"uint256","name":"userOrderIndex","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"priceIn","type":"uint256"},{"internalType":"uint256","name":"pairPriceId","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"totalAmountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"totalWithdrawn","type":"uint256"}],"internalType":"struct TokenSwapSpot.TmpOrder[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastOrderId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPairId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"orders","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"priceIn","type":"uint256"},{"internalType":"uint256","name":"pairPriceId","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairPrices","outputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"totalAmountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"totalWithdrawn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"placeOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairPriceId","type":"uint256"}],"name":"processPairPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oracleFee","type":"uint256"}],"name":"setOracleFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenSwapContract","type":"address"}],"name":"setTokenSwapContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenSwapContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userOrderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderIndex","type":"uint256"}],"name":"withdrawOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405266470de4df82000060055534801561001a575f5ffd5b50604051614028380380614028833981810160405281019061003c919061028d565b335f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503360015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ea919061028d565b60045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506102b8565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61025c82610233565b9050919050565b61026c81610252565b8114610276575f5ffd5b50565b5f8151905061028781610263565b92915050565b5f602082840312156102a2576102a161022f565b5b5f6102af84828501610279565b91505092915050565b613d63806102c55f395ff3fe608060405260043610610122575f3560e01c8063817422c01161009f578063af01afdf11610063578063af01afdf146103cc578063b6d9ef60146103f4578063ec4eb4f91461041c578063f9cd3ceb14610458578063fb791b0b1461048257610129565b8063817422c0146102cb5780638da5cb5b1461030c578063962fba2714610336578063a85c38ef14610360578063ad5c4648146103a257610129565b806366f48cf5116100e657806366f48cf5146101ed578063682458bd146102295780636e2bd98d146102515780637adbf973146102795780637dc0d1d0146102a157610129565b8063214ff4591461012d5780633bb7dac714610155578063514fcac71461017f578063559bf6fd146101a75780635662ecc7146101c357610129565b3661012957005b5f5ffd5b348015610138575f5ffd5b50610153600480360381019061014e9190612d7d565b6104aa565b005b348015610160575f5ffd5b506101696105c6565b6040516101769190612dc8565b60405180910390f35b34801561018a575f5ffd5b506101a560048036038101906101a09190612e14565b6105eb565b005b6101c160048036038101906101bc9190612e69565b610a91565b005b3480156101ce575f5ffd5b506101d76112ee565b6040516101e49190612edc565b60405180910390f35b3480156101f8575f5ffd5b50610213600480360381019061020e9190612ef5565b6112f4565b6040516102209190613145565b60405180910390f35b348015610234575f5ffd5b5061024f600480360381019061024a9190613165565b61170e565b005b34801561025c575f5ffd5b5061027760048036038101906102729190612e14565b6118df565b005b348015610284575f5ffd5b5061029f600480360381019061029a91906131a3565b611e8a565b005b3480156102ac575f5ffd5b506102b5611f5b565b6040516102c29190612dc8565b60405180910390f35b3480156102d6575f5ffd5b506102f160048036038101906102ec9190612e14565b611f80565b604051610303969594939291906131ce565b60405180910390f35b348015610317575f5ffd5b50610320611ff6565b60405161032d9190612dc8565b60405180910390f35b348015610341575f5ffd5b5061034a61201a565b6040516103579190612edc565b60405180910390f35b34801561036b575f5ffd5b5061038660048036038101906103819190612e14565b612020565b604051610399979695949392919061323c565b60405180910390f35b3480156103ad575f5ffd5b506103b6612089565b6040516103c39190612dc8565b60405180910390f35b3480156103d7575f5ffd5b506103f260048036038101906103ed91906131a3565b6120ae565b005b3480156103ff575f5ffd5b5061041a60048036038101906104159190612e14565b6122ad565b005b348015610427575f5ffd5b50610442600480360381019061043d91906131a3565b612345565b60405161044f9190612edc565b60405180910390f35b348015610463575f5ffd5b5061046c61235a565b6040516104799190612edc565b60405180910390f35b34801561048d575f5ffd5b506104a860048036038101906104a39190612e14565b612360565b005b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052f90613303565b60405180910390fd5b5f4790505f811161057e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105759061336b565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156105c1573d5f5f3e3d5ffd5b505050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205481111561066b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610662906133d3565b60405180910390fd5b5f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082815481106106bb576106ba6133f1565b5b905f5260205f20015490505f60075f8381526020019081526020015f206004015f9054906101000a900460ff1660ff1614801561070b57505f60075f8381526020019081526020015f2060030154115b61074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074190613468565b60405180910390fd5b600260075f8381526020019081526020015f206004015f6101000a81548160ff021916908360ff1602179055504260075f8381526020019081526020015f20600601819055505f60075f8381526020019081526020015f2060020154905060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b5f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361098b5760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d60075f8581526020019081526020015f20600301546040518263ffffffff1660e01b815260040161089c9190612edc565b5f604051808303815f87803b1580156108b3575f5ffd5b505af11580156108c5573d5f5f3e3d5ffd5b505050505f3373ffffffffffffffffffffffffffffffffffffffff1660075f8581526020019081526020015f2060030154604051610902906134b3565b5f6040518083038185875af1925050503d805f811461093c576040519150601f19603f3d011682016040523d82523d5f602084013e610941565b606091505b5050905080610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097c90613511565b60405180910390fd5b50610a4e565b600b5f8281526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3360075f8681526020019081526020015f20600301546040518363ffffffff1660e01b8152600401610a0c92919061352f565b6020604051808303815f875af1158015610a28573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4c919061358b565b505b60075f8381526020019081526020015f2060030154600b5f8381526020019081526020015f206003015f828254610a8591906135e3565b92505081905550505050565b600554341015610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd90613660565b60405180910390fd5b60055434118015610b6957505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b68575060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b5b15610cf65760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935060055434610ba091906135e3565b90505f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015610c0d575f5ffd5b505af1158015610c1f573d5f5f3e3d5ffd5b50505050505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600554604051610c6c906134b3565b5f6040518083038185875af1925050503d805f8114610ca6576040519150601f19603f3d011682016040523d82523d5f602084013e610cab565b606091505b5050905080610cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce6906136c8565b60405180910390fd5b5050610e8f565b5f8111610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f90613730565b60405180910390fd5b5f8490508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401610d799392919061374e565b6020604051808303815f875af1158015610d95573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db9919061358b565b505f341115610e8d575f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051610e08906134b3565b5f6040518083038185875af1925050503d805f8114610e42576040519150601f19603f3d011682016040523d82523d5f602084013e610e47565b606091505b5050905080610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e82906136c8565b60405180910390fd5b505b505b5f610e9b858585612818565b905081600b5f8381526020019081526020015f206003015f828254610ec09190613783565b925050819055505f859050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e3060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610f289291906137b6565b602060405180830381865afa158015610f43573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6791906137f1565b101561102b578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b360025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f80000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401610fe992919061385e565b6020604051808303815f875af1158015611005573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611029919061358b565b505b5f6040518060e001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200160035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9dd14d68a8a610bb86040518463ffffffff1660e01b81526004016110b3939291906138be565b602060405180830381865afa1580156110ce573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f291906137f1565b81526020018481526020018581526020015f60ff1681526020014281526020015f815250905060065f81548092919061112a906138f3565b91905055508060075f60065481526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff021916908360ff16021790555060a0820151816005015560c0820151816006015590505060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600654908060018154018082558091505060019003905f5260205f20015f909190919091505560095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061128c906138f3565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f25f958e981f7f2a99eb96852a8dffe251ff392838f2c8e280d160399a90b0fe1888888886040516112dd949392919061393a565b60405180910390a250505050505050565b60065481565b606060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490508211156113825760085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905091505b818311156113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc906139c7565b60405180910390fd5b5f83836113d291906135e3565b90505f8167ffffffffffffffff8111156113ef576113ee6139e5565b5b60405190808252806020026020018201604052801561142857816020015b611415612c79565b81526020019060019003908161140d5790505b5090505f5f90505b82811015611701575f60085f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082886114829190613783565b81548110611493576114926133f1565b5b905f5260205f20015490505f60075f8381526020019081526020015f206002015490505f604051806101c00160405280858b6114cf9190613783565b815260200160075f8681526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160075f8681526020019081526020015f2060010154815260200160075f8681526020019081526020015f2060020154815260200160075f8681526020019081526020015f2060030154815260200160075f8681526020019081526020015f206004015f9054906101000a900460ff1660ff16815260200160075f8681526020019081526020015f2060050154815260200160075f8681526020019081526020015f20600601548152602001600b5f8581526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600b5f8581526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600b5f8581526020019081526020015f20600201548152602001600b5f8581526020019081526020015f20600301548152602001600b5f8581526020019081526020015f20600401548152602001600b5f8581526020019081526020015f20600501548152509050808585815181106116e6576116e56133f1565b5b60200260200101819052505050508080600101915050611430565b5080925050509392505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461179c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179390613303565b60405180910390fd5b5f8290505f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117da9190612dc8565b602060405180830381865afa1580156117f5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061181991906137f1565b90505f811161185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490613a5c565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b815260040161189892919061352f565b6020604051808303815f875af11580156118b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118d8919061358b565b5050505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590613ac4565b60405180910390fd5b5f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b5f8481526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036119fe57479050611aac565b600b5f8381526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a6a9190612dc8565b602060405180830381865afa158015611a85573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aa991906137f1565b90505b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394ef1501600b5f8581526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b5f8681526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b5f8781526020019081526020015f2060030154610bb860015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518663ffffffff1660e01b8152600401611baa959493929190613b2f565b5f604051808303815f87803b158015611bc1575f5ffd5b505af1158015611bd3573d5f5f3e3d5ffd5b505050505f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b5f8581526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c6757479050611d15565b600b5f8481526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611cd39190612dc8565b602060405180830381865afa158015611cee573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1291906137f1565b90505b5f8282611d2291906135e3565b90505f8111611d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5d90613bca565b60405180910390fd5b80600b5f8681526020019081526020015f20600401819055505f600c5f600b5f8881526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f600b5f8881526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f600b5f8881526020019081526020015f206002015481526020019081526020015f208190555050505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0f90613303565b60405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b602052805f5260405f205f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154905086565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b6007602052805f5260405f205f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002015490806003015490806004015f9054906101000a900460ff16908060050154908060060154905087565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461213c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213390613303565b60405180910390fd5b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612247573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061226b9190613bfc565b60045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461233b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233290613303565b60405180910390fd5b8060058190555050565b6009602052805f5260405f205f915090505481565b60055481565b60095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548111156123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d7906133d3565b60405180910390fd5b5f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082815481106124305761242f6133f1565b5b905f5260205f20015490505f60075f8381526020019081526020015f206004015f9054906101000a900460ff1660ff1614801561248057505f60075f8381526020019081526020015f2060030154115b6124bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b690613468565b60405180910390fd5b600160075f8381526020019081526020015f206004015f6101000a81548160ff021916908360ff1602179055504260075f8381526020019081526020015f20600601819055505f60075f8381526020019081526020015f206002015490505f600b5f8381526020019081526020015f206004015411612573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256a90613c71565b60405180910390fd5b5f600b5f8381526020019081526020015f206003015490505f600b5f8481526020019081526020015f206004015490505f60075f8681526020019081526020015f206003015490505f83670de0b6b3a7640000836125d19190613c8f565b6125db9190613cfd565b90505f670de0b6b3a764000082856125f39190613c8f565b6125fd9190613cfd565b905060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b5f8881526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612734575f3373ffffffffffffffffffffffffffffffffffffffff16826040516126ab906134b3565b5f6040518083038185875af1925050503d805f81146126e5576040519150601f19603f3d011682016040523d82523d5f602084013e6126ea565b606091505b505090508061272e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272590613511565b60405180910390fd5b506127e4565b600b5f8781526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016127a292919061352f565b6020604051808303815f875af11580156127be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127e2919061358b565b505b80600b5f8881526020019081526020015f206005015f8282546128079190613783565b925050819055505050505050505050565b5f61282282612b1a565b91505f600c5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f2054111561294257600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20549050612b13565b5f6040518060c001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020015f81526020015f81526020015f8152509050600a5f8154809291906129b0906138f3565b919050555080600b5f600a5481526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a08201518160050155905050600a54600c5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f2081905550600a549150505b9392505050565b5f5f6008612b2784612b5b565b612b3191906135e3565b6001901b90505f818285612b459190613cfd565b612b4f9190613c8f565b90508092505050919050565b5f5f5f90507001000000000000000000000000000000008310612b8f57608083901c9250608081612b8c9190613783565b90505b680100000000000000008310612bb657604083901c9250604081612bb39190613783565b90505b6401000000008310612bd957602083901c9250602081612bd69190613783565b90505b620100008310612bfa57601083901c9250601081612bf79190613783565b90505b6101008310612c1a57600883901c9250600881612c179190613783565b90505b60108310612c3957600483901c9250600481612c369190613783565b90505b60048310612c5857600283901c9250600281612c559190613783565b90505b60028310612c7057600181612c6d9190613783565b90505b80915050919050565b604051806101c001604052805f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f60ff1681526020015f81526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81525090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d4c82612d23565b9050919050565b612d5c81612d42565b8114612d66575f5ffd5b50565b5f81359050612d7781612d53565b92915050565b5f60208284031215612d9257612d91612d1f565b5b5f612d9f84828501612d69565b91505092915050565b5f612db282612d23565b9050919050565b612dc281612da8565b82525050565b5f602082019050612ddb5f830184612db9565b92915050565b5f819050919050565b612df381612de1565b8114612dfd575f5ffd5b50565b5f81359050612e0e81612dea565b92915050565b5f60208284031215612e2957612e28612d1f565b5b5f612e3684828501612e00565b91505092915050565b612e4881612da8565b8114612e52575f5ffd5b50565b5f81359050612e6381612e3f565b92915050565b5f5f5f5f60808587031215612e8157612e80612d1f565b5b5f612e8e87828801612e55565b9450506020612e9f87828801612e55565b9350506040612eb087828801612e00565b9250506060612ec187828801612e00565b91505092959194509250565b612ed681612de1565b82525050565b5f602082019050612eef5f830184612ecd565b92915050565b5f5f5f60608486031215612f0c57612f0b612d1f565b5b5f612f1986828701612e55565b9350506020612f2a86828701612e00565b9250506040612f3b86828701612e00565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612f7781612de1565b82525050565b612f8681612da8565b82525050565b5f60ff82169050919050565b612fa181612f8c565b82525050565b6101c082015f820151612fbc5f850182612f6e565b506020820151612fcf6020850182612f7d565b506040820151612fe26040850182612f6e565b506060820151612ff56060850182612f6e565b5060808201516130086080850182612f6e565b5060a082015161301b60a0850182612f98565b5060c082015161302e60c0850182612f6e565b5060e082015161304160e0850182612f6e565b50610100820151613056610100850182612f7d565b5061012082015161306b610120850182612f7d565b50610140820151613080610140850182612f6e565b50610160820151613095610160850182612f6e565b506101808201516130aa610180850182612f6e565b506101a08201516130bf6101a0850182612f6e565b50505050565b5f6130d08383612fa7565b6101c08301905092915050565b5f602082019050919050565b5f6130f382612f45565b6130fd8185612f4f565b935061310883612f5f565b805f5b8381101561313857815161311f88826130c5565b975061312a836130dd565b92505060018101905061310b565b5085935050505092915050565b5f6020820190508181035f83015261315d81846130e9565b905092915050565b5f5f6040838503121561317b5761317a612d1f565b5b5f61318885828601612e55565b925050602061319985828601612e55565b9150509250929050565b5f602082840312156131b8576131b7612d1f565b5b5f6131c584828501612e55565b91505092915050565b5f60c0820190506131e15f830189612db9565b6131ee6020830188612db9565b6131fb6040830187612ecd565b6132086060830186612ecd565b6132156080830185612ecd565b61322260a0830184612ecd565b979650505050505050565b61323681612f8c565b82525050565b5f60e08201905061324f5f83018a612db9565b61325c6020830189612ecd565b6132696040830188612ecd565b6132766060830187612ecd565b613283608083018661322d565b61329060a0830185612ecd565b61329d60c0830184612ecd565b98975050505050505050565b5f82825260208201905092915050565b7f4e6f742074686520636f6e7472616374206f776e6572000000000000000000005f82015250565b5f6132ed6016836132a9565b91506132f8826132b9565b602082019050919050565b5f6020820190508181035f83015261331a816132e1565b9050919050565b7f4e6f2045544820746f20776974686472617700000000000000000000000000005f82015250565b5f6133556012836132a9565b915061336082613321565b602082019050919050565b5f6020820190508181035f83015261338281613349565b9050919050565b7f4f72646572206964206973206e6f742076616c696400000000000000000000005f82015250565b5f6133bd6015836132a9565b91506133c882613389565b602082019050919050565b5f6020820190508181035f8301526133ea816133b1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4f72646572206973206e6f74206f70656e0000000000000000000000000000005f82015250565b5f6134526011836132a9565b915061345d8261341e565b602082019050919050565b5f6020820190508181035f83015261347f81613446565b9050919050565b5f81905092915050565b50565b5f61349e5f83613486565b91506134a982613490565b5f82019050919050565b5f6134bd82613493565b9150819050919050565b7f4661696c656420746f2073656e642045544800000000000000000000000000005f82015250565b5f6134fb6012836132a9565b9150613506826134c7565b602082019050919050565b5f6020820190508181035f830152613528816134ef565b9050919050565b5f6040820190506135425f830185612db9565b61354f6020830184612ecd565b9392505050565b5f8115159050919050565b61356a81613556565b8114613574575f5ffd5b50565b5f8151905061358581613561565b92915050565b5f602082840312156135a05761359f612d1f565b5b5f6135ad84828501613577565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6135ed82612de1565b91506135f883612de1565b92508282039050818111156136105761360f6135b6565b5b92915050565b7f4e6f7420656e6f756768206f7261636c652066656500000000000000000000005f82015250565b5f61364a6015836132a9565b915061365582613616565b602082019050919050565b5f6020820190508181035f8301526136778161363e565b9050919050565b7f4661696c656420746f2073656e64206f7261636c6520666565000000000000005f82015250565b5f6136b26019836132a9565b91506136bd8261367e565b602082019050919050565b5f6020820190508181035f8301526136df816136a6565b9050919050565b7f4d757374207370656369667920616e20616d6f756e7420746f207377617000005f82015250565b5f61371a601e836132a9565b9150613725826136e6565b602082019050919050565b5f6020820190508181035f8301526137478161370e565b9050919050565b5f6060820190506137615f830186612db9565b61376e6020830185612db9565b61377b6040830184612ecd565b949350505050565b5f61378d82612de1565b915061379883612de1565b92508282019050808211156137b0576137af6135b6565b5b92915050565b5f6040820190506137c95f830185612db9565b6137d66020830184612db9565b9392505050565b5f815190506137eb81612dea565b92915050565b5f6020828403121561380657613805612d1f565b5b5f613813848285016137dd565b91505092915050565b5f819050919050565b5f819050919050565b5f61384861384361383e8461381c565b613825565b612de1565b9050919050565b6138588161382e565b82525050565b5f6040820190506138715f830185612db9565b61387e602083018461384f565b9392505050565b5f819050919050565b5f6138a86138a361389e84613885565b613825565b612de1565b9050919050565b6138b88161388e565b82525050565b5f6060820190506138d15f830186612db9565b6138de6020830185612db9565b6138eb60408301846138af565b949350505050565b5f6138fd82612de1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361392f5761392e6135b6565b5b600182019050919050565b5f60808201905061394d5f830187612db9565b61395a6020830186612db9565b6139676040830185612ecd565b6139746060830184612ecd565b95945050505050565b7f496e76616c696420706167696e6174696f6e2072616e676500000000000000005f82015250565b5f6139b16018836132a9565b91506139bc8261397d565b602082019050919050565b5f6020820190508181035f8301526139de816139a5565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e6f20746f6b656e2062616c616e636520746f207769746864726177000000005f82015250565b5f613a46601c836132a9565b9150613a5182613a12565b602082019050919050565b5f6020820190508181035f830152613a7381613a3a565b9050919050565b7f4e6f7420746865206f7261636c650000000000000000000000000000000000005f82015250565b5f613aae600e836132a9565b9150613ab982613a7a565b602082019050919050565b5f6020820190508181035f830152613adb81613aa2565b9050919050565b5f62ffffff82169050919050565b5f613b0a613b05613b0084613885565b613825565b613ae2565b9050919050565b613b1a81613af0565b82525050565b613b2981612d42565b82525050565b5f60a082019050613b425f830188612db9565b613b4f6020830187612db9565b613b5c6040830186612ecd565b613b696060830185613b11565b613b766080830184613b20565b9695505050505050565b7f4661696c656420746f2070726f636573732073776170000000000000000000005f82015250565b5f613bb46016836132a9565b9150613bbf82613b80565b602082019050919050565b5f6020820190508181035f830152613be181613ba8565b9050919050565b5f81519050613bf681612e3f565b92915050565b5f60208284031215613c1157613c10612d1f565b5b5f613c1e84828501613be8565b91505092915050565b7f4f72646572206973206e6f7420706c61636564207965742e00000000000000005f82015250565b5f613c5b6018836132a9565b9150613c6682613c27565b602082019050919050565b5f6020820190508181035f830152613c8881613c4f565b9050919050565b5f613c9982612de1565b9150613ca483612de1565b9250828202613cb281612de1565b91508282048414831517613cc957613cc86135b6565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613d0782612de1565b9150613d1283612de1565b925082613d2257613d21613cd0565b5b82820490509291505056fea2646970667358221220526d8e59a60bde533bc51eb0a7eb32f324efa51359755617b9fc8502c79eaa1664736f6c634300081c003300000000000000000000000032d6b39bc53f9d85d7d64034bad9e5061b408e38

Deployed Bytecode

0x608060405260043610610122575f3560e01c8063817422c01161009f578063af01afdf11610063578063af01afdf146103cc578063b6d9ef60146103f4578063ec4eb4f91461041c578063f9cd3ceb14610458578063fb791b0b1461048257610129565b8063817422c0146102cb5780638da5cb5b1461030c578063962fba2714610336578063a85c38ef14610360578063ad5c4648146103a257610129565b806366f48cf5116100e657806366f48cf5146101ed578063682458bd146102295780636e2bd98d146102515780637adbf973146102795780637dc0d1d0146102a157610129565b8063214ff4591461012d5780633bb7dac714610155578063514fcac71461017f578063559bf6fd146101a75780635662ecc7146101c357610129565b3661012957005b5f5ffd5b348015610138575f5ffd5b50610153600480360381019061014e9190612d7d565b6104aa565b005b348015610160575f5ffd5b506101696105c6565b6040516101769190612dc8565b60405180910390f35b34801561018a575f5ffd5b506101a560048036038101906101a09190612e14565b6105eb565b005b6101c160048036038101906101bc9190612e69565b610a91565b005b3480156101ce575f5ffd5b506101d76112ee565b6040516101e49190612edc565b60405180910390f35b3480156101f8575f5ffd5b50610213600480360381019061020e9190612ef5565b6112f4565b6040516102209190613145565b60405180910390f35b348015610234575f5ffd5b5061024f600480360381019061024a9190613165565b61170e565b005b34801561025c575f5ffd5b5061027760048036038101906102729190612e14565b6118df565b005b348015610284575f5ffd5b5061029f600480360381019061029a91906131a3565b611e8a565b005b3480156102ac575f5ffd5b506102b5611f5b565b6040516102c29190612dc8565b60405180910390f35b3480156102d6575f5ffd5b506102f160048036038101906102ec9190612e14565b611f80565b604051610303969594939291906131ce565b60405180910390f35b348015610317575f5ffd5b50610320611ff6565b60405161032d9190612dc8565b60405180910390f35b348015610341575f5ffd5b5061034a61201a565b6040516103579190612edc565b60405180910390f35b34801561036b575f5ffd5b5061038660048036038101906103819190612e14565b612020565b604051610399979695949392919061323c565b60405180910390f35b3480156103ad575f5ffd5b506103b6612089565b6040516103c39190612dc8565b60405180910390f35b3480156103d7575f5ffd5b506103f260048036038101906103ed91906131a3565b6120ae565b005b3480156103ff575f5ffd5b5061041a60048036038101906104159190612e14565b6122ad565b005b348015610427575f5ffd5b50610442600480360381019061043d91906131a3565b612345565b60405161044f9190612edc565b60405180910390f35b348015610463575f5ffd5b5061046c61235a565b6040516104799190612edc565b60405180910390f35b34801561048d575f5ffd5b506104a860048036038101906104a39190612e14565b612360565b005b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052f90613303565b60405180910390fd5b5f4790505f811161057e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105759061336b565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156105c1573d5f5f3e3d5ffd5b505050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205481111561066b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610662906133d3565b60405180910390fd5b5f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082815481106106bb576106ba6133f1565b5b905f5260205f20015490505f60075f8381526020019081526020015f206004015f9054906101000a900460ff1660ff1614801561070b57505f60075f8381526020019081526020015f2060030154115b61074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074190613468565b60405180910390fd5b600260075f8381526020019081526020015f206004015f6101000a81548160ff021916908360ff1602179055504260075f8381526020019081526020015f20600601819055505f60075f8381526020019081526020015f2060020154905060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b5f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361098b5760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d60075f8581526020019081526020015f20600301546040518263ffffffff1660e01b815260040161089c9190612edc565b5f604051808303815f87803b1580156108b3575f5ffd5b505af11580156108c5573d5f5f3e3d5ffd5b505050505f3373ffffffffffffffffffffffffffffffffffffffff1660075f8581526020019081526020015f2060030154604051610902906134b3565b5f6040518083038185875af1925050503d805f811461093c576040519150601f19603f3d011682016040523d82523d5f602084013e610941565b606091505b5050905080610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097c90613511565b60405180910390fd5b50610a4e565b600b5f8281526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3360075f8681526020019081526020015f20600301546040518363ffffffff1660e01b8152600401610a0c92919061352f565b6020604051808303815f875af1158015610a28573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4c919061358b565b505b60075f8381526020019081526020015f2060030154600b5f8381526020019081526020015f206003015f828254610a8591906135e3565b92505081905550505050565b600554341015610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd90613660565b60405180910390fd5b60055434118015610b6957505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b68575060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b5b15610cf65760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935060055434610ba091906135e3565b90505f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015610c0d575f5ffd5b505af1158015610c1f573d5f5f3e3d5ffd5b50505050505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600554604051610c6c906134b3565b5f6040518083038185875af1925050503d805f8114610ca6576040519150601f19603f3d011682016040523d82523d5f602084013e610cab565b606091505b5050905080610cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce6906136c8565b60405180910390fd5b5050610e8f565b5f8111610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f90613730565b60405180910390fd5b5f8490508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401610d799392919061374e565b6020604051808303815f875af1158015610d95573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db9919061358b565b505f341115610e8d575f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051610e08906134b3565b5f6040518083038185875af1925050503d805f8114610e42576040519150601f19603f3d011682016040523d82523d5f602084013e610e47565b606091505b5050905080610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e82906136c8565b60405180910390fd5b505b505b5f610e9b858585612818565b905081600b5f8381526020019081526020015f206003015f828254610ec09190613783565b925050819055505f859050828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e3060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610f289291906137b6565b602060405180830381865afa158015610f43573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6791906137f1565b101561102b578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b360025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f80000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401610fe992919061385e565b6020604051808303815f875af1158015611005573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611029919061358b565b505b5f6040518060e001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200160035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9dd14d68a8a610bb86040518463ffffffff1660e01b81526004016110b3939291906138be565b602060405180830381865afa1580156110ce573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f291906137f1565b81526020018481526020018581526020015f60ff1681526020014281526020015f815250905060065f81548092919061112a906138f3565b91905055508060075f60065481526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff021916908360ff16021790555060a0820151816005015560c0820151816006015590505060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600654908060018154018082558091505060019003905f5260205f20015f909190919091505560095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061128c906138f3565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f25f958e981f7f2a99eb96852a8dffe251ff392838f2c8e280d160399a90b0fe1888888886040516112dd949392919061393a565b60405180910390a250505050505050565b60065481565b606060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490508211156113825760085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905091505b818311156113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc906139c7565b60405180910390fd5b5f83836113d291906135e3565b90505f8167ffffffffffffffff8111156113ef576113ee6139e5565b5b60405190808252806020026020018201604052801561142857816020015b611415612c79565b81526020019060019003908161140d5790505b5090505f5f90505b82811015611701575f60085f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082886114829190613783565b81548110611493576114926133f1565b5b905f5260205f20015490505f60075f8381526020019081526020015f206002015490505f604051806101c00160405280858b6114cf9190613783565b815260200160075f8681526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160075f8681526020019081526020015f2060010154815260200160075f8681526020019081526020015f2060020154815260200160075f8681526020019081526020015f2060030154815260200160075f8681526020019081526020015f206004015f9054906101000a900460ff1660ff16815260200160075f8681526020019081526020015f2060050154815260200160075f8681526020019081526020015f20600601548152602001600b5f8581526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600b5f8581526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600b5f8581526020019081526020015f20600201548152602001600b5f8581526020019081526020015f20600301548152602001600b5f8581526020019081526020015f20600401548152602001600b5f8581526020019081526020015f20600501548152509050808585815181106116e6576116e56133f1565b5b60200260200101819052505050508080600101915050611430565b5080925050509392505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461179c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179390613303565b60405180910390fd5b5f8290505f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117da9190612dc8565b602060405180830381865afa1580156117f5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061181991906137f1565b90505f811161185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490613a5c565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b815260040161189892919061352f565b6020604051808303815f875af11580156118b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118d8919061358b565b5050505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590613ac4565b60405180910390fd5b5f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b5f8481526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036119fe57479050611aac565b600b5f8381526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a6a9190612dc8565b602060405180830381865afa158015611a85573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aa991906137f1565b90505b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394ef1501600b5f8581526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b5f8681526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b5f8781526020019081526020015f2060030154610bb860015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518663ffffffff1660e01b8152600401611baa959493929190613b2f565b5f604051808303815f87803b158015611bc1575f5ffd5b505af1158015611bd3573d5f5f3e3d5ffd5b505050505f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b5f8581526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c6757479050611d15565b600b5f8481526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611cd39190612dc8565b602060405180830381865afa158015611cee573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1291906137f1565b90505b5f8282611d2291906135e3565b90505f8111611d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5d90613bca565b60405180910390fd5b80600b5f8681526020019081526020015f20600401819055505f600c5f600b5f8881526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f600b5f8881526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f600b5f8881526020019081526020015f206002015481526020019081526020015f208190555050505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0f90613303565b60405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b602052805f5260405f205f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154905086565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b6007602052805f5260405f205f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002015490806003015490806004015f9054906101000a900460ff16908060050154908060060154905087565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461213c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213390613303565b60405180910390fd5b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612247573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061226b9190613bfc565b60045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461233b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233290613303565b60405180910390fd5b8060058190555050565b6009602052805f5260405f205f915090505481565b60055481565b60095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548111156123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d7906133d3565b60405180910390fd5b5f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082815481106124305761242f6133f1565b5b905f5260205f20015490505f60075f8381526020019081526020015f206004015f9054906101000a900460ff1660ff1614801561248057505f60075f8381526020019081526020015f2060030154115b6124bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b690613468565b60405180910390fd5b600160075f8381526020019081526020015f206004015f6101000a81548160ff021916908360ff1602179055504260075f8381526020019081526020015f20600601819055505f60075f8381526020019081526020015f206002015490505f600b5f8381526020019081526020015f206004015411612573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256a90613c71565b60405180910390fd5b5f600b5f8381526020019081526020015f206003015490505f600b5f8481526020019081526020015f206004015490505f60075f8681526020019081526020015f206003015490505f83670de0b6b3a7640000836125d19190613c8f565b6125db9190613cfd565b90505f670de0b6b3a764000082856125f39190613c8f565b6125fd9190613cfd565b905060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b5f8881526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612734575f3373ffffffffffffffffffffffffffffffffffffffff16826040516126ab906134b3565b5f6040518083038185875af1925050503d805f81146126e5576040519150601f19603f3d011682016040523d82523d5f602084013e6126ea565b606091505b505090508061272e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272590613511565b60405180910390fd5b506127e4565b600b5f8781526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016127a292919061352f565b6020604051808303815f875af11580156127be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127e2919061358b565b505b80600b5f8881526020019081526020015f206005015f8282546128079190613783565b925050819055505050505050505050565b5f61282282612b1a565b91505f600c5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f2054111561294257600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20549050612b13565b5f6040518060c001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020015f81526020015f81526020015f8152509050600a5f8154809291906129b0906138f3565b919050555080600b5f600a5481526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a08201518160050155905050600a54600c5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f2081905550600a549150505b9392505050565b5f5f6008612b2784612b5b565b612b3191906135e3565b6001901b90505f818285612b459190613cfd565b612b4f9190613c8f565b90508092505050919050565b5f5f5f90507001000000000000000000000000000000008310612b8f57608083901c9250608081612b8c9190613783565b90505b680100000000000000008310612bb657604083901c9250604081612bb39190613783565b90505b6401000000008310612bd957602083901c9250602081612bd69190613783565b90505b620100008310612bfa57601083901c9250601081612bf79190613783565b90505b6101008310612c1a57600883901c9250600881612c179190613783565b90505b60108310612c3957600483901c9250600481612c369190613783565b90505b60048310612c5857600283901c9250600281612c559190613783565b90505b60028310612c7057600181612c6d9190613783565b90505b80915050919050565b604051806101c001604052805f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f60ff1681526020015f81526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81525090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d4c82612d23565b9050919050565b612d5c81612d42565b8114612d66575f5ffd5b50565b5f81359050612d7781612d53565b92915050565b5f60208284031215612d9257612d91612d1f565b5b5f612d9f84828501612d69565b91505092915050565b5f612db282612d23565b9050919050565b612dc281612da8565b82525050565b5f602082019050612ddb5f830184612db9565b92915050565b5f819050919050565b612df381612de1565b8114612dfd575f5ffd5b50565b5f81359050612e0e81612dea565b92915050565b5f60208284031215612e2957612e28612d1f565b5b5f612e3684828501612e00565b91505092915050565b612e4881612da8565b8114612e52575f5ffd5b50565b5f81359050612e6381612e3f565b92915050565b5f5f5f5f60808587031215612e8157612e80612d1f565b5b5f612e8e87828801612e55565b9450506020612e9f87828801612e55565b9350506040612eb087828801612e00565b9250506060612ec187828801612e00565b91505092959194509250565b612ed681612de1565b82525050565b5f602082019050612eef5f830184612ecd565b92915050565b5f5f5f60608486031215612f0c57612f0b612d1f565b5b5f612f1986828701612e55565b9350506020612f2a86828701612e00565b9250506040612f3b86828701612e00565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612f7781612de1565b82525050565b612f8681612da8565b82525050565b5f60ff82169050919050565b612fa181612f8c565b82525050565b6101c082015f820151612fbc5f850182612f6e565b506020820151612fcf6020850182612f7d565b506040820151612fe26040850182612f6e565b506060820151612ff56060850182612f6e565b5060808201516130086080850182612f6e565b5060a082015161301b60a0850182612f98565b5060c082015161302e60c0850182612f6e565b5060e082015161304160e0850182612f6e565b50610100820151613056610100850182612f7d565b5061012082015161306b610120850182612f7d565b50610140820151613080610140850182612f6e565b50610160820151613095610160850182612f6e565b506101808201516130aa610180850182612f6e565b506101a08201516130bf6101a0850182612f6e565b50505050565b5f6130d08383612fa7565b6101c08301905092915050565b5f602082019050919050565b5f6130f382612f45565b6130fd8185612f4f565b935061310883612f5f565b805f5b8381101561313857815161311f88826130c5565b975061312a836130dd565b92505060018101905061310b565b5085935050505092915050565b5f6020820190508181035f83015261315d81846130e9565b905092915050565b5f5f6040838503121561317b5761317a612d1f565b5b5f61318885828601612e55565b925050602061319985828601612e55565b9150509250929050565b5f602082840312156131b8576131b7612d1f565b5b5f6131c584828501612e55565b91505092915050565b5f60c0820190506131e15f830189612db9565b6131ee6020830188612db9565b6131fb6040830187612ecd565b6132086060830186612ecd565b6132156080830185612ecd565b61322260a0830184612ecd565b979650505050505050565b61323681612f8c565b82525050565b5f60e08201905061324f5f83018a612db9565b61325c6020830189612ecd565b6132696040830188612ecd565b6132766060830187612ecd565b613283608083018661322d565b61329060a0830185612ecd565b61329d60c0830184612ecd565b98975050505050505050565b5f82825260208201905092915050565b7f4e6f742074686520636f6e7472616374206f776e6572000000000000000000005f82015250565b5f6132ed6016836132a9565b91506132f8826132b9565b602082019050919050565b5f6020820190508181035f83015261331a816132e1565b9050919050565b7f4e6f2045544820746f20776974686472617700000000000000000000000000005f82015250565b5f6133556012836132a9565b915061336082613321565b602082019050919050565b5f6020820190508181035f83015261338281613349565b9050919050565b7f4f72646572206964206973206e6f742076616c696400000000000000000000005f82015250565b5f6133bd6015836132a9565b91506133c882613389565b602082019050919050565b5f6020820190508181035f8301526133ea816133b1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4f72646572206973206e6f74206f70656e0000000000000000000000000000005f82015250565b5f6134526011836132a9565b915061345d8261341e565b602082019050919050565b5f6020820190508181035f83015261347f81613446565b9050919050565b5f81905092915050565b50565b5f61349e5f83613486565b91506134a982613490565b5f82019050919050565b5f6134bd82613493565b9150819050919050565b7f4661696c656420746f2073656e642045544800000000000000000000000000005f82015250565b5f6134fb6012836132a9565b9150613506826134c7565b602082019050919050565b5f6020820190508181035f830152613528816134ef565b9050919050565b5f6040820190506135425f830185612db9565b61354f6020830184612ecd565b9392505050565b5f8115159050919050565b61356a81613556565b8114613574575f5ffd5b50565b5f8151905061358581613561565b92915050565b5f602082840312156135a05761359f612d1f565b5b5f6135ad84828501613577565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6135ed82612de1565b91506135f883612de1565b92508282039050818111156136105761360f6135b6565b5b92915050565b7f4e6f7420656e6f756768206f7261636c652066656500000000000000000000005f82015250565b5f61364a6015836132a9565b915061365582613616565b602082019050919050565b5f6020820190508181035f8301526136778161363e565b9050919050565b7f4661696c656420746f2073656e64206f7261636c6520666565000000000000005f82015250565b5f6136b26019836132a9565b91506136bd8261367e565b602082019050919050565b5f6020820190508181035f8301526136df816136a6565b9050919050565b7f4d757374207370656369667920616e20616d6f756e7420746f207377617000005f82015250565b5f61371a601e836132a9565b9150613725826136e6565b602082019050919050565b5f6020820190508181035f8301526137478161370e565b9050919050565b5f6060820190506137615f830186612db9565b61376e6020830185612db9565b61377b6040830184612ecd565b949350505050565b5f61378d82612de1565b915061379883612de1565b92508282019050808211156137b0576137af6135b6565b5b92915050565b5f6040820190506137c95f830185612db9565b6137d66020830184612db9565b9392505050565b5f815190506137eb81612dea565b92915050565b5f6020828403121561380657613805612d1f565b5b5f613813848285016137dd565b91505092915050565b5f819050919050565b5f819050919050565b5f61384861384361383e8461381c565b613825565b612de1565b9050919050565b6138588161382e565b82525050565b5f6040820190506138715f830185612db9565b61387e602083018461384f565b9392505050565b5f819050919050565b5f6138a86138a361389e84613885565b613825565b612de1565b9050919050565b6138b88161388e565b82525050565b5f6060820190506138d15f830186612db9565b6138de6020830185612db9565b6138eb60408301846138af565b949350505050565b5f6138fd82612de1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361392f5761392e6135b6565b5b600182019050919050565b5f60808201905061394d5f830187612db9565b61395a6020830186612db9565b6139676040830185612ecd565b6139746060830184612ecd565b95945050505050565b7f496e76616c696420706167696e6174696f6e2072616e676500000000000000005f82015250565b5f6139b16018836132a9565b91506139bc8261397d565b602082019050919050565b5f6020820190508181035f8301526139de816139a5565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e6f20746f6b656e2062616c616e636520746f207769746864726177000000005f82015250565b5f613a46601c836132a9565b9150613a5182613a12565b602082019050919050565b5f6020820190508181035f830152613a7381613a3a565b9050919050565b7f4e6f7420746865206f7261636c650000000000000000000000000000000000005f82015250565b5f613aae600e836132a9565b9150613ab982613a7a565b602082019050919050565b5f6020820190508181035f830152613adb81613aa2565b9050919050565b5f62ffffff82169050919050565b5f613b0a613b05613b0084613885565b613825565b613ae2565b9050919050565b613b1a81613af0565b82525050565b613b2981612d42565b82525050565b5f60a082019050613b425f830188612db9565b613b4f6020830187612db9565b613b5c6040830186612ecd565b613b696060830185613b11565b613b766080830184613b20565b9695505050505050565b7f4661696c656420746f2070726f636573732073776170000000000000000000005f82015250565b5f613bb46016836132a9565b9150613bbf82613b80565b602082019050919050565b5f6020820190508181035f830152613be181613ba8565b9050919050565b5f81519050613bf681612e3f565b92915050565b5f60208284031215613c1157613c10612d1f565b5b5f613c1e84828501613be8565b91505092915050565b7f4f72646572206973206e6f7420706c61636564207965742e00000000000000005f82015250565b5f613c5b6018836132a9565b9150613c6682613c27565b602082019050919050565b5f6020820190508181035f830152613c8881613c4f565b9050919050565b5f613c9982612de1565b9150613ca483612de1565b9250828202613cb281612de1565b91508282048414831517613cc957613cc86135b6565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613d0782612de1565b9150613d1283612de1565b925082613d2257613d21613cd0565b5b82820490509291505056fea2646970667358221220526d8e59a60bde533bc51eb0a7eb32f324efa51359755617b9fc8502c79eaa1664736f6c634300081c0033

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

00000000000000000000000032d6b39bc53f9d85d7d64034bad9e5061b408e38

-----Decoded View---------------
Arg [0] : _tokenSwapContract (address): 0x32d6B39bc53F9D85d7d64034bAD9e5061b408e38

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000032d6b39bc53f9d85d7d64034bad9e5061b408e38


Deployed Bytecode Sourcemap

994:13514:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13883:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1230:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5430:1017;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3360:2026;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2146:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9839:1696;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14142:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7959:1293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11877:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1135:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2595:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;1054:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2563:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2179:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;1296:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11606:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12018:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2272:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1324:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6455:1433;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13883:211;2849:5;;;;;;;;;;;2835:19;;:10;:19;;;2827:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;13963:15:::1;13981:21;13963:39;;14031:1;14021:7;:11;14013:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;14066:2;:11;;:20;14078:7;14066:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13952:142;13883:211:::0;:::o;1230:32::-;;;;;;;;;;;;;:::o;5430:1017::-;5538:14;:26;5553:10;5538:26;;;;;;;;;;;;;;;;5526:10;:38;;5518:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;5600:15;5618:12;:24;5631:10;5618:24;;;;;;;;;;;;;;;5643:10;5618:36;;;;;;;;:::i;:::-;;;;;;;;;;5600:54;;5697:1;5673:6;:15;5680:7;5673:15;;;;;;;;;;;:22;;;;;;;;;;;;:25;;;:55;;;;;5727:1;5702:6;:15;5709:7;5702:15;;;;;;;;;;;:24;;;:26;5673:55;5665:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;5816:1;5793:6;:15;5800:7;5793:15;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;5854:15;5828:6;:15;5835:7;5828:15;;;;;;;;;;;:25;;:41;;;;5922:19;5944:6;:15;5951:7;5944:15;;;;;;;;;;;:27;;;5922:49;;6018:4;;;;;;;;;;;5985:37;;:10;:23;5996:11;5985:23;;;;;;;;;;;:31;;;;;;;;;;;;:37;;;5982:367;;6054:4;;;;;;;;;;;6048:20;;;6069:6;:15;6076:7;6069:15;;;;;;;;;;;:24;;;6048:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6110:12;6128:10;:15;;6151:6;:15;6158:7;6151:15;;;;;;;;;;;:24;;;6128:52;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6109:71;;;6203:7;6195:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;6033:212;5982:367;;;6270:10;:23;6281:11;6270:23;;;;;;;;;;;:31;;;;;;;;;;;;6263:48;;;6312:10;6324:6;:15;6331:7;6324:15;;;;;;;;;;;:24;;;6263:86;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5982:367;6415:6;:15;6422:7;6415:15;;;;;;;;;;;:24;;;6374:10;:23;6385:11;6374:23;;;;;;;;;;;:37;;;:65;;;;;;;:::i;:::-;;;;;;;;5480:967;;5430:1017;:::o;3360:2026::-;3497:9;;3484;:22;;3476:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3558:9;;3546;:21;:72;;;;;3589:1;3572:19;;:7;:19;;;:45;;;;3612:4;;;;;;;;;;;3595:22;;:7;:22;;;3572:45;3546:72;3542:918;;;3646:4;;;;;;;;;;;3636:14;;3688:9;;3676;:21;;;;:::i;:::-;3665:32;;3712:18;3739:4;;;;;;;;;;;3712:32;;3759:12;:20;;;3787:8;3759:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3869:9;3884:6;;;;;;;;;;;:11;;3903:9;;3884:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3868:49;;;3940:4;3932:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;3621:365;;3542:918;;;4024:1;4013:8;:12;4005:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;4119:12;4141:7;4119:30;;4164:5;:18;;;4183:10;4203:4;4210:8;4164:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4302:1;4292:9;:11;4289:160;;;4324:9;4339:6;;;;;;;;;;;:11;;4358:9;4339:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4323:49;;;4399:4;4391:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4304:145;4289:160;3990:470;3542:918;4480:19;4502:38;4517:7;4525:8;4534:5;4502:14;:38::i;:::-;4480:60;;4592:8;4551:10;:23;4562:11;4551:23;;;;;;;;;;;:37;;;:49;;;;;;;:::i;:::-;;;;;;;;4640:12;4662:7;4640:30;;4734:8;4684:5;:15;;;4708:4;4715:17;;;;;;;;;;;4684:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;4681:115;;;4757:5;:13;;;4771:17;;;;;;;;;;;4789:6;4757:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4681:115;4832:21;4856:286;;;;;;;;4883:10;4856:286;;;;;;4917:9;;;;;;;;;;;:18;;;4936:7;4945:8;4954:4;4917:42;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4856:286;;;;4986:11;4856:286;;;;5022:8;4856:286;;;;5052:1;4856:286;;;;;;5088:15;4856:286;;;;5129:1;4856:286;;;4832:310;;5155:11;;:13;;;;;;;;;:::i;:::-;;;;;;5201:8;5179:6;:19;5186:11;;5179:19;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5220:12;:24;5233:10;5220:24;;;;;;;;;;;;;;;5250:11;;5220:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5273:14;:26;5288:10;5273:26;;;;;;;;;;;;;;;;:28;;;;;;;;;:::i;:::-;;;;;;5331:10;5319:59;;;5343:7;5352:8;5362:5;5369:8;5319:59;;;;;;;;;:::i;:::-;;;;;;;;3465:1921;;;3360:2026;;;;:::o;2146:26::-;;;;:::o;9839:1696::-;9937:17;9984:12;:18;9997:4;9984:18;;;;;;;;;;;;;;;:25;;;;9977:4;:32;9973:97;;;10033:12;:18;10046:4;10033:18;;;;;;;;;;;;;;;:25;;;;10026:32;;9973:97;10098:4;10088:6;:14;;10080:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;10144:12;10166:6;10159:4;:13;;;;:::i;:::-;10144:28;;10183:33;10234:4;10219:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;10183:56;;10265:9;10277:1;10265:13;;10260:1233;10284:4;10280:1;:8;10260:1233;;;10310:18;10331:12;:18;10344:4;10331:18;;;;;;;;;;;;;;;10359:1;10350:6;:10;;;;:::i;:::-;10331:30;;;;;;;;:::i;:::-;;;;;;;;;;10310:51;;10376:19;10398:6;:18;10405:10;10398:18;;;;;;;;;;;:30;;;10376:52;;10445:25;10473:899;;;;;;;;10526:1;10517:6;:10;;;;:::i;:::-;10473:899;;;;10552:6;:18;10559:10;10552:18;;;;;;;;;;;:23;;;;;;;;;;;;10473:899;;;;;;10603:6;:18;10610:10;10603:18;;;;;;;;;;;:26;;;10473:899;;;;10661:6;:18;10668:10;10661:18;;;;;;;;;;;:30;;;10473:899;;;;10720:6;:18;10727:10;10720:18;;;;;;;;;;;:27;;;10473:899;;;;10791:6;:18;10798:10;10791:18;;;;;;;;;;;:25;;;;;;;;;;;;10473:899;;;;;;10888:6;:18;10895:10;10888:18;;;;;;;;;;;:28;;;10473:899;;;;10946:6;:18;10953:10;10946:18;;;;;;;;;;;:28;;;10473:899;;;;11002:10;:23;11013:11;11002:23;;;;;;;;;;;:31;;;;;;;;;;;;10473:899;;;;;;11062:10;:23;11073:11;11062:23;;;;;;;;;;;:32;;;;;;;;;;;;10473:899;;;;;;11120:10;:23;11131:11;11120:23;;;;;;;;;;;:29;;;10473:899;;;;11183:10;:23;11194:11;11183:23;;;;;;;;;;;:37;;;10473:899;;;;11250:10;:23;11261:11;11250:23;;;;;;;;;;;:33;;;10473:899;;;;11318:10;:23;11329:11;11318:23;;;;;;;;;;;:38;;;10473:899;;;10445:927;;11472:9;11451:15;11467:1;11451:18;;;;;;;;:::i;:::-;;;;;;;:30;;;;10295:1198;;;10290:3;;;;;;;10260:1233;;;;11512:15;11505:22;;;;9839:1696;;;;;:::o;14142:285::-;2849:5;;;;;;;;;;;2835:19;;:10;:19;;;2827:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;14231:12:::1;14253:5;14231:28;;14270:15;14288:5;:15;;;14312:4;14288:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14270:48;;14347:1;14337:7;:11;14329:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;14392:5;:14;;;14407:2;14411:7;14392:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14220:207;;14142:285:::0;;:::o;7959:1293::-;3017:6;;;;;;;;;;;3003:20;;:10;:20;;;2995:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;8197:20:::1;8267:4;;;;;;;;;;;8231:40;;:10;:23;8242:11;8231:23;;;;;;;;;;;:32;;;;;;;;;;;;:40;;::::0;8228:203:::1;;8301:21;8286:36;;8228:203;;;8373:10;:23;8384:11;8373:23;;;;;;;;;;;:32;;;;;;;;;;;;8366:50;;;8425:4;8366:65;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8351:80;;8228:203;8444:9;;;;;;;;;;;:19;;;8478:10;:23;8489:11;8478:23;;;;;;;;;;;:31;;;;;;;;;;;;8524:10;:23;8535:11;8524:23;;;;;;;;;;;:32;;;;;;;;;;;;8571:10;:23;8582:11;8571:23;;;;;;;;;;;:37;;;8623:4;8650:6;;;;;;;;;;;8444:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8681:18;8749:4;;;;;;;;;;;8713:40;;:10;:23;8724:11;8713:23;;;;;;;;;;;:32;;;;;;;;;;;;:40;;::::0;8710:199:::1;;8781:21;8768:34;;8710:199;;;8851:10;:23;8862:11;8851:23;;;;;;;;;;;:32;;;;;;;;;;;;8844:50;;;8903:4;8844:65;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8831:78;;8710:199;8920:14;8950:12;8937:10;:25;;;;:::i;:::-;8920:42;;8988:1;8981:6;:8;8973:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;9115:6;9079:10;:23;9090:11;9079:23;;;;;;;;;;;:33;;:42;;;;9243:1;9132:12;:45;9145:10;:23;9156:11;9145:23;;;;;;;;;;;:31;;;;;;;;;;;;9132:45;;;;;;;;;;;;;;;:79;9178:10;:23;9189:11;9178:23;;;;;;;;;;;:32;;;;;;;;;;;;9132:79;;;;;;;;;;;;;;;:110;9212:10;:23;9223:11;9212:23;;;;;;;;;;;:29;;;9132:110;;;;;;;;;;;:112;;;;8026:1226;;;7959:1293:::0;:::o;11877:90::-;2849:5;;;;;;;;;;;2835:19;;:10;:19;;;2827:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;11952:7:::1;11943:6;;:16;;;;;;;;;;;;;;;;;;11877:90:::0;:::o;1135:21::-;;;;;;;;;;;;;:::o;2595:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1054:20::-;;;;;;;;;;;;;:::o;2563:25::-;;;;:::o;2179:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1296:19::-;;;;;;;;;;;;;:::o;11606:220::-;2849:5;;;;;;;;;;;2835:19;;:10;:19;;;2827:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;11714:18:::1;11694:17;;:38;;;;;;;;;;;;;;;;;;11766:17;;;;;;;;;;;11743:9;;:41;;;;;;;;;;;;;;;;;;11802:9;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11795:4;;:23;;;;;;;;;;;;;;;;;;11606:220:::0;:::o;12018:99::-;2849:5;;;;;;;;;;;2835:19;;:10;:19;;;2827:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;12099:10:::1;12087:9;:22;;;;12018:99:::0;:::o;2272:46::-;;;;;;;;;;;;;;;;;:::o;1324:34::-;;;;:::o;6455:1433::-;6572:14;:26;6587:10;6572:26;;;;;;;;;;;;;;;;6560:10;:38;;6552:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;6634:15;6652:12;:24;6665:10;6652:24;;;;;;;;;;;;;;;6677:10;6652:36;;;;;;;;:::i;:::-;;;;;;;;;;6634:54;;6731:1;6707:6;:15;6714:7;6707:15;;;;;;;;;;;:22;;;;;;;;;;;;:25;;;:55;;;;;6761:1;6736:6;:15;6743:7;6736:15;;;;;;;;;;;:24;;;:26;6707:55;6699:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;6850:1;6827:6;:15;6834:7;6827:15;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;6901:15;6875:6;:15;6882:7;6875:15;;;;;;;;;;;:25;;:41;;;;6973:19;6995:6;:15;7002:7;6995:15;;;;;;;;;;;:27;;;6973:49;;7075:1;7041:10;:23;7052:11;7041:23;;;;;;;;;;;:33;;;:35;7033:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;7115:21;7139:10;:23;7150:11;7139:23;;;;;;;;;;;:37;;;7115:61;;7187:22;7212:10;:23;7223:11;7212:23;;;;;;;;;;;:33;;;7187:58;;7256:18;7277:6;:15;7284:7;7277:15;;;;;;;;;;;:24;;;7256:45;;7312:13;7350;7341:6;7328:10;:19;;;;:::i;:::-;:35;;;;:::i;:::-;7312:51;;7374:19;7421:6;7413:5;7396:14;:22;;;;:::i;:::-;:31;;;;:::i;:::-;7374:53;;7477:4;;;;;;;;;;;7443:38;;:10;:23;7454:11;7443:23;;;;;;;;;;;:32;;;;;;;;;;;;:38;;;7440:376;;7602:12;7620:10;:15;;7643:11;7620:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7601:58;;;7682:7;7674:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;7492:232;7440:376;;;7749:10;:23;7760:11;7749:23;;;;;;;;;;;:32;;;;;;;;;;;;7742:49;;;7792:10;7804:11;7742:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7440:376;7869:11;7827:10;:23;7838:11;7827:23;;;;;;;;;;;:38;;;:53;;;;;;;:::i;:::-;;;;;;;;6504:1384;;;;;;;6455:1433;:::o;13087:757::-;13175:4;13247:22;13263:5;13247:15;:22::i;:::-;13239:30;;13332:1;13293:12;:21;13306:7;13293:21;;;;;;;;;;;;;;;:31;13315:8;13293:31;;;;;;;;;;;;;;;:38;13325:5;13293:38;;;;;;;;;;;;:40;13290:103;;;13355:12;:21;13368:7;13355:21;;;;;;;;;;;;;;;:31;13377:8;13355:31;;;;;;;;;;;;;;;:38;13387:5;13355:38;;;;;;;;;;;;13348:45;;;;13290:103;13414:27;13444:233;;;;;;;;13477:7;13444:233;;;;;;13508:8;13444:233;;;;;;13537:5;13444:233;;;;13571:1;13444:233;;;;13597:1;13444:233;;;;13664:1;13444:233;;;13414:263;;13688:10;;:12;;;;;;;;;:::i;:::-;;;;;;13736:10;13711;:22;13722:10;;13711:22;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13798:10;;13757:12;:21;13770:7;13757:21;;;;;;;;;;;;;;;:31;13779:8;13757:31;;;;;;;;;;;;;;;:38;13789:5;13757:38;;;;;;;;;;;:51;;;;13826:10;;13819:17;;;13087:757;;;;;;:::o;12199:269::-;12261:7;12281:17;12321:1;12307:11;12312:5;12307:4;:11::i;:::-;:15;;;;:::i;:::-;12301:1;:22;;12281:42;;12376:20;12421:9;12408;12400:5;:17;;;;:::i;:::-;12399:31;;;;:::i;:::-;12376:54;;12448:12;12441:19;;;;12199:269;;;:::o;12538:537::-;12585:7;12605:14;12622:1;12605:18;;12643:6;12638:1;:11;12634:46;;12659:3;12653:9;;;;;12674:3;12664:13;;;;;:::i;:::-;;;12634:46;12699:5;12694:1;:10;12690:44;;12715:2;12709:8;;;;;12729:2;12719:12;;;;;:::i;:::-;;;12690:44;12753:5;12748:1;:10;12744:44;;12769:2;12763:8;;;;;12783:2;12773:12;;;;;:::i;:::-;;;12744:44;12807:5;12802:1;:10;12798:44;;12823:2;12817:8;;;;;12837:2;12827:12;;;;;:::i;:::-;;;12798:44;12861:4;12856:1;:9;12852:43;;12877:1;12871:7;;;;;12891:1;12881:11;;;;;:::i;:::-;;;12852:43;12914:4;12909:1;:9;12905:43;;12930:1;12924:7;;;;;12944:1;12934:11;;;;;:::i;:::-;;;12905:43;12967:4;12962:1;:9;12958:43;;12983:1;12977:7;;;;;12997:1;12987:11;;;;;:::i;:::-;;;12958:43;13020:4;13015:1;:9;13011:33;;13040:1;13030:11;;;;;:::i;:::-;;;13011:33;13061:6;13054:13;;;12538:537;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;88:117:1:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:104::-;511:7;540:24;558:5;540:24;:::i;:::-;529:35;;466:104;;;:::o;576:138::-;657:32;683:5;657:32;:::i;:::-;650:5;647:43;637:71;;704:1;701;694:12;637:71;576:138;:::o;720:155::-;774:5;812:6;799:20;790:29;;828:41;863:5;828:41;:::i;:::-;720:155;;;;:::o;881:345::-;948:6;997:2;985:9;976:7;972:23;968:32;965:119;;;1003:79;;:::i;:::-;965:119;1123:1;1148:61;1201:7;1192:6;1181:9;1177:22;1148:61;:::i;:::-;1138:71;;1094:125;881:345;;;;:::o;1232:96::-;1269:7;1298:24;1316:5;1298:24;:::i;:::-;1287:35;;1232:96;;;:::o;1334:118::-;1421:24;1439:5;1421:24;:::i;:::-;1416:3;1409:37;1334:118;;:::o;1458:222::-;1551:4;1589:2;1578:9;1574:18;1566:26;;1602:71;1670:1;1659:9;1655:17;1646:6;1602:71;:::i;:::-;1458:222;;;;:::o;1686:77::-;1723:7;1752:5;1741:16;;1686:77;;;:::o;1769:122::-;1842:24;1860:5;1842:24;:::i;:::-;1835:5;1832:35;1822:63;;1881:1;1878;1871:12;1822:63;1769:122;:::o;1897:139::-;1943:5;1981:6;1968:20;1959:29;;1997:33;2024:5;1997:33;:::i;:::-;1897:139;;;;:::o;2042:329::-;2101:6;2150:2;2138:9;2129:7;2125:23;2121:32;2118:119;;;2156:79;;:::i;:::-;2118:119;2276:1;2301:53;2346:7;2337:6;2326:9;2322:22;2301:53;:::i;:::-;2291:63;;2247:117;2042:329;;;;:::o;2377:122::-;2450:24;2468:5;2450:24;:::i;:::-;2443:5;2440:35;2430:63;;2489:1;2486;2479:12;2430:63;2377:122;:::o;2505:139::-;2551:5;2589:6;2576:20;2567:29;;2605:33;2632:5;2605:33;:::i;:::-;2505:139;;;;:::o;2650:765::-;2736:6;2744;2752;2760;2809:3;2797:9;2788:7;2784:23;2780:33;2777:120;;;2816:79;;:::i;:::-;2777:120;2936:1;2961:53;3006:7;2997:6;2986:9;2982:22;2961:53;:::i;:::-;2951:63;;2907:117;3063:2;3089:53;3134:7;3125:6;3114:9;3110:22;3089:53;:::i;:::-;3079:63;;3034:118;3191:2;3217:53;3262:7;3253:6;3242:9;3238:22;3217:53;:::i;:::-;3207:63;;3162:118;3319:2;3345:53;3390:7;3381:6;3370:9;3366:22;3345:53;:::i;:::-;3335:63;;3290:118;2650:765;;;;;;;:::o;3421:118::-;3508:24;3526:5;3508:24;:::i;:::-;3503:3;3496:37;3421:118;;:::o;3545:222::-;3638:4;3676:2;3665:9;3661:18;3653:26;;3689:71;3757:1;3746:9;3742:17;3733:6;3689:71;:::i;:::-;3545:222;;;;:::o;3773:619::-;3850:6;3858;3866;3915:2;3903:9;3894:7;3890:23;3886:32;3883:119;;;3921:79;;:::i;:::-;3883:119;4041:1;4066:53;4111:7;4102:6;4091:9;4087:22;4066:53;:::i;:::-;4056:63;;4012:117;4168:2;4194:53;4239:7;4230:6;4219:9;4215:22;4194:53;:::i;:::-;4184:63;;4139:118;4296:2;4322:53;4367:7;4358:6;4347:9;4343:22;4322:53;:::i;:::-;4312:63;;4267:118;3773:619;;;;;:::o;4398:139::-;4490:6;4524:5;4518:12;4508:22;;4398:139;;;:::o;4543:209::-;4667:11;4701:6;4696:3;4689:19;4741:4;4736:3;4732:14;4717:29;;4543:209;;;;:::o;4758:157::-;4850:4;4873:3;4865:11;;4903:4;4898:3;4894:14;4886:22;;4758:157;;;:::o;4921:108::-;4998:24;5016:5;4998:24;:::i;:::-;4993:3;4986:37;4921:108;;:::o;5035:::-;5112:24;5130:5;5112:24;:::i;:::-;5107:3;5100:37;5035:108;;:::o;5149:86::-;5184:7;5224:4;5217:5;5213:16;5202:27;;5149:86;;;:::o;5241:102::-;5314:22;5330:5;5314:22;:::i;:::-;5309:3;5302:35;5241:102;;:::o;5419:2675::-;5556:6;5551:3;5547:16;5655:4;5648:5;5644:16;5638:23;5674:63;5731:4;5726:3;5722:14;5708:12;5674:63;:::i;:::-;5573:174;5829:4;5822:5;5818:16;5812:23;5848:63;5905:4;5900:3;5896:14;5882:12;5848:63;:::i;:::-;5757:164;6006:4;5999:5;5995:16;5989:23;6025:63;6082:4;6077:3;6073:14;6059:12;6025:63;:::i;:::-;5931:167;6187:4;6180:5;6176:16;6170:23;6206:63;6263:4;6258:3;6254:14;6240:12;6206:63;:::i;:::-;6108:171;6365:4;6358:5;6354:16;6348:23;6384:63;6441:4;6436:3;6432:14;6418:12;6384:63;:::i;:::-;6289:168;6541:4;6534:5;6530:16;6524:23;6560:59;6613:4;6608:3;6604:14;6590:12;6560:59;:::i;:::-;6467:162;6716:4;6709:5;6705:16;6699:23;6735:63;6792:4;6787:3;6783:14;6769:12;6735:63;:::i;:::-;6639:169;6895:4;6888:5;6884:16;6878:23;6914:63;6971:4;6966:3;6962:14;6948:12;6914:63;:::i;:::-;6818:169;7072:6;7065:5;7061:18;7055:25;7093:65;7150:6;7145:3;7141:16;7127:12;7093:65;:::i;:::-;6997:171;7254:6;7247:5;7243:18;7237:25;7275:65;7332:6;7327:3;7323:16;7309:12;7275:65;:::i;:::-;7178:172;7433:6;7426:5;7422:18;7416:25;7454:65;7511:6;7506:3;7502:16;7488:12;7454:65;:::i;:::-;7360:169;7620:6;7613:5;7609:18;7603:25;7641:65;7698:6;7693:3;7689:16;7675:12;7641:65;:::i;:::-;7539:177;7803:6;7796:5;7792:18;7786:25;7824:65;7881:6;7876:3;7872:16;7858:12;7824:65;:::i;:::-;7726:173;7991:6;7984:5;7980:18;7974:25;8012:65;8069:6;8064:3;8060:16;8046:12;8012:65;:::i;:::-;7909:178;5525:2569;5419:2675;;:::o;8100:281::-;8219:10;8240:96;8332:3;8324:6;8240:96;:::i;:::-;8368:6;8363:3;8359:16;8345:30;;8100:281;;;;:::o;8387:138::-;8482:4;8514;8509:3;8505:14;8497:22;;8387:138;;;:::o;8605:932::-;8774:3;8803:79;8876:5;8803:79;:::i;:::-;8898:111;9002:6;8997:3;8898:111;:::i;:::-;8891:118;;9033:81;9108:5;9033:81;:::i;:::-;9137:7;9168:1;9153:359;9178:6;9175:1;9172:13;9153:359;;;9254:6;9248:13;9281:113;9390:3;9375:13;9281:113;:::i;:::-;9274:120;;9417:85;9495:6;9417:85;:::i;:::-;9407:95;;9213:299;9200:1;9197;9193:9;9188:14;;9153:359;;;9157:14;9528:3;9521:10;;8779:758;;;8605:932;;;;:::o;9543:473::-;9736:4;9774:2;9763:9;9759:18;9751:26;;9823:9;9817:4;9813:20;9809:1;9798:9;9794:17;9787:47;9851:158;10004:4;9995:6;9851:158;:::i;:::-;9843:166;;9543:473;;;;:::o;10022:474::-;10090:6;10098;10147:2;10135:9;10126:7;10122:23;10118:32;10115:119;;;10153:79;;:::i;:::-;10115:119;10273:1;10298:53;10343:7;10334:6;10323:9;10319:22;10298:53;:::i;:::-;10288:63;;10244:117;10400:2;10426:53;10471:7;10462:6;10451:9;10447:22;10426:53;:::i;:::-;10416:63;;10371:118;10022:474;;;;;:::o;10502:329::-;10561:6;10610:2;10598:9;10589:7;10585:23;10581:32;10578:119;;;10616:79;;:::i;:::-;10578:119;10736:1;10761:53;10806:7;10797:6;10786:9;10782:22;10761:53;:::i;:::-;10751:63;;10707:117;10502:329;;;;:::o;10837:775::-;11070:4;11108:3;11097:9;11093:19;11085:27;;11122:71;11190:1;11179:9;11175:17;11166:6;11122:71;:::i;:::-;11203:72;11271:2;11260:9;11256:18;11247:6;11203:72;:::i;:::-;11285;11353:2;11342:9;11338:18;11329:6;11285:72;:::i;:::-;11367;11435:2;11424:9;11420:18;11411:6;11367:72;:::i;:::-;11449:73;11517:3;11506:9;11502:19;11493:6;11449:73;:::i;:::-;11532;11600:3;11589:9;11585:19;11576:6;11532:73;:::i;:::-;10837:775;;;;;;;;;:::o;11618:112::-;11701:22;11717:5;11701:22;:::i;:::-;11696:3;11689:35;11618:112;;:::o;11736:878::-;11993:4;12031:3;12020:9;12016:19;12008:27;;12045:71;12113:1;12102:9;12098:17;12089:6;12045:71;:::i;:::-;12126:72;12194:2;12183:9;12179:18;12170:6;12126:72;:::i;:::-;12208;12276:2;12265:9;12261:18;12252:6;12208:72;:::i;:::-;12290;12358:2;12347:9;12343:18;12334:6;12290:72;:::i;:::-;12372:69;12436:3;12425:9;12421:19;12412:6;12372:69;:::i;:::-;12451:73;12519:3;12508:9;12504:19;12495:6;12451:73;:::i;:::-;12534;12602:3;12591:9;12587:19;12578:6;12534:73;:::i;:::-;11736:878;;;;;;;;;;:::o;12620:169::-;12704:11;12738:6;12733:3;12726:19;12778:4;12773:3;12769:14;12754:29;;12620:169;;;;:::o;12795:172::-;12935:24;12931:1;12923:6;12919:14;12912:48;12795:172;:::o;12973:366::-;13115:3;13136:67;13200:2;13195:3;13136:67;:::i;:::-;13129:74;;13212:93;13301:3;13212:93;:::i;:::-;13330:2;13325:3;13321:12;13314:19;;12973:366;;;:::o;13345:419::-;13511:4;13549:2;13538:9;13534:18;13526:26;;13598:9;13592:4;13588:20;13584:1;13573:9;13569:17;13562:47;13626:131;13752:4;13626:131;:::i;:::-;13618:139;;13345:419;;;:::o;13770:168::-;13910:20;13906:1;13898:6;13894:14;13887:44;13770:168;:::o;13944:366::-;14086:3;14107:67;14171:2;14166:3;14107:67;:::i;:::-;14100:74;;14183:93;14272:3;14183:93;:::i;:::-;14301:2;14296:3;14292:12;14285:19;;13944:366;;;:::o;14316:419::-;14482:4;14520:2;14509:9;14505:18;14497:26;;14569:9;14563:4;14559:20;14555:1;14544:9;14540:17;14533:47;14597:131;14723:4;14597:131;:::i;:::-;14589:139;;14316:419;;;:::o;14741:171::-;14881:23;14877:1;14869:6;14865:14;14858:47;14741:171;:::o;14918:366::-;15060:3;15081:67;15145:2;15140:3;15081:67;:::i;:::-;15074:74;;15157:93;15246:3;15157:93;:::i;:::-;15275:2;15270:3;15266:12;15259:19;;14918:366;;;:::o;15290:419::-;15456:4;15494:2;15483:9;15479:18;15471:26;;15543:9;15537:4;15533:20;15529:1;15518:9;15514:17;15507:47;15571:131;15697:4;15571:131;:::i;:::-;15563:139;;15290:419;;;:::o;15715:180::-;15763:77;15760:1;15753:88;15860:4;15857:1;15850:15;15884:4;15881:1;15874:15;15901:167;16041:19;16037:1;16029:6;16025:14;16018:43;15901:167;:::o;16074:366::-;16216:3;16237:67;16301:2;16296:3;16237:67;:::i;:::-;16230:74;;16313:93;16402:3;16313:93;:::i;:::-;16431:2;16426:3;16422:12;16415:19;;16074:366;;;:::o;16446:419::-;16612:4;16650:2;16639:9;16635:18;16627:26;;16699:9;16693:4;16689:20;16685:1;16674:9;16670:17;16663:47;16727:131;16853:4;16727:131;:::i;:::-;16719:139;;16446:419;;;:::o;16871:147::-;16972:11;17009:3;16994:18;;16871:147;;;;:::o;17024:114::-;;:::o;17144:398::-;17303:3;17324:83;17405:1;17400:3;17324:83;:::i;:::-;17317:90;;17416:93;17505:3;17416:93;:::i;:::-;17534:1;17529:3;17525:11;17518:18;;17144:398;;;:::o;17548:379::-;17732:3;17754:147;17897:3;17754:147;:::i;:::-;17747:154;;17918:3;17911:10;;17548:379;;;:::o;17933:168::-;18073:20;18069:1;18061:6;18057:14;18050:44;17933:168;:::o;18107:366::-;18249:3;18270:67;18334:2;18329:3;18270:67;:::i;:::-;18263:74;;18346:93;18435:3;18346:93;:::i;:::-;18464:2;18459:3;18455:12;18448:19;;18107:366;;;:::o;18479:419::-;18645:4;18683:2;18672:9;18668:18;18660:26;;18732:9;18726:4;18722:20;18718:1;18707:9;18703:17;18696:47;18760:131;18886:4;18760:131;:::i;:::-;18752:139;;18479:419;;;:::o;18904:332::-;19025:4;19063:2;19052:9;19048:18;19040:26;;19076:71;19144:1;19133:9;19129:17;19120:6;19076:71;:::i;:::-;19157:72;19225:2;19214:9;19210:18;19201:6;19157:72;:::i;:::-;18904:332;;;;;:::o;19242:90::-;19276:7;19319:5;19312:13;19305:21;19294:32;;19242:90;;;:::o;19338:116::-;19408:21;19423:5;19408:21;:::i;:::-;19401:5;19398:32;19388:60;;19444:1;19441;19434:12;19388:60;19338:116;:::o;19460:137::-;19514:5;19545:6;19539:13;19530:22;;19561:30;19585:5;19561:30;:::i;:::-;19460:137;;;;:::o;19603:345::-;19670:6;19719:2;19707:9;19698:7;19694:23;19690:32;19687:119;;;19725:79;;:::i;:::-;19687:119;19845:1;19870:61;19923:7;19914:6;19903:9;19899:22;19870:61;:::i;:::-;19860:71;;19816:125;19603:345;;;;:::o;19954:180::-;20002:77;19999:1;19992:88;20099:4;20096:1;20089:15;20123:4;20120:1;20113:15;20140:194;20180:4;20200:20;20218:1;20200:20;:::i;:::-;20195:25;;20234:20;20252:1;20234:20;:::i;:::-;20229:25;;20278:1;20275;20271:9;20263:17;;20302:1;20296:4;20293:11;20290:37;;;20307:18;;:::i;:::-;20290:37;20140:194;;;;:::o;20340:171::-;20480:23;20476:1;20468:6;20464:14;20457:47;20340:171;:::o;20517:366::-;20659:3;20680:67;20744:2;20739:3;20680:67;:::i;:::-;20673:74;;20756:93;20845:3;20756:93;:::i;:::-;20874:2;20869:3;20865:12;20858:19;;20517:366;;;:::o;20889:419::-;21055:4;21093:2;21082:9;21078:18;21070:26;;21142:9;21136:4;21132:20;21128:1;21117:9;21113:17;21106:47;21170:131;21296:4;21170:131;:::i;:::-;21162:139;;20889:419;;;:::o;21314:175::-;21454:27;21450:1;21442:6;21438:14;21431:51;21314:175;:::o;21495:366::-;21637:3;21658:67;21722:2;21717:3;21658:67;:::i;:::-;21651:74;;21734:93;21823:3;21734:93;:::i;:::-;21852:2;21847:3;21843:12;21836:19;;21495:366;;;:::o;21867:419::-;22033:4;22071:2;22060:9;22056:18;22048:26;;22120:9;22114:4;22110:20;22106:1;22095:9;22091:17;22084:47;22148:131;22274:4;22148:131;:::i;:::-;22140:139;;21867:419;;;:::o;22292:180::-;22432:32;22428:1;22420:6;22416:14;22409:56;22292:180;:::o;22478:366::-;22620:3;22641:67;22705:2;22700:3;22641:67;:::i;:::-;22634:74;;22717:93;22806:3;22717:93;:::i;:::-;22835:2;22830:3;22826:12;22819:19;;22478:366;;;:::o;22850:419::-;23016:4;23054:2;23043:9;23039:18;23031:26;;23103:9;23097:4;23093:20;23089:1;23078:9;23074:17;23067:47;23131:131;23257:4;23131:131;:::i;:::-;23123:139;;22850:419;;;:::o;23275:442::-;23424:4;23462:2;23451:9;23447:18;23439:26;;23475:71;23543:1;23532:9;23528:17;23519:6;23475:71;:::i;:::-;23556:72;23624:2;23613:9;23609:18;23600:6;23556:72;:::i;:::-;23638;23706:2;23695:9;23691:18;23682:6;23638:72;:::i;:::-;23275:442;;;;;;:::o;23723:191::-;23763:3;23782:20;23800:1;23782:20;:::i;:::-;23777:25;;23816:20;23834:1;23816:20;:::i;:::-;23811:25;;23859:1;23856;23852:9;23845:16;;23880:3;23877:1;23874:10;23871:36;;;23887:18;;:::i;:::-;23871:36;23723:191;;;;:::o;23920:332::-;24041:4;24079:2;24068:9;24064:18;24056:26;;24092:71;24160:1;24149:9;24145:17;24136:6;24092:71;:::i;:::-;24173:72;24241:2;24230:9;24226:18;24217:6;24173:72;:::i;:::-;23920:332;;;;;:::o;24258:143::-;24315:5;24346:6;24340:13;24331:22;;24362:33;24389:5;24362:33;:::i;:::-;24258:143;;;;:::o;24407:351::-;24477:6;24526:2;24514:9;24505:7;24501:23;24497:32;24494:119;;;24532:79;;:::i;:::-;24494:119;24652:1;24677:64;24733:7;24724:6;24713:9;24709:22;24677:64;:::i;:::-;24667:74;;24623:128;24407:351;;;;:::o;24764:161::-;24885:7;24914:5;24903:16;;24764:161;;;:::o;24931:60::-;24959:3;24980:5;24973:12;;24931:60;;;:::o;24997:310::-;25131:9;25164:137;25182:118;25191:108;25293:5;25191:108;:::i;:::-;25182:118;:::i;:::-;25164:137;:::i;:::-;25151:150;;24997:310;;;:::o;25313:299::-;25484:121;25599:5;25484:121;:::i;:::-;25479:3;25472:134;25313:299;;:::o;25618:500::-;25823:4;25861:2;25850:9;25846:18;25838:26;;25874:71;25942:1;25931:9;25927:17;25918:6;25874:71;:::i;:::-;25955:156;26107:2;26096:9;26092:18;26083:6;25955:156;:::i;:::-;25618:500;;;;;:::o;26124:88::-;26172:7;26201:5;26190:16;;26124:88;;;:::o;26218:164::-;26279:9;26312:64;26330:45;26339:35;26368:5;26339:35;:::i;:::-;26330:45;:::i;:::-;26312:64;:::i;:::-;26299:77;;26218:164;;;:::o;26388:153::-;26486:48;26528:5;26486:48;:::i;:::-;26481:3;26474:61;26388:153;;:::o;26547:464::-;26707:4;26745:2;26734:9;26730:18;26722:26;;26758:71;26826:1;26815:9;26811:17;26802:6;26758:71;:::i;:::-;26839:72;26907:2;26896:9;26892:18;26883:6;26839:72;:::i;:::-;26921:83;27000:2;26989:9;26985:18;26976:6;26921:83;:::i;:::-;26547:464;;;;;;:::o;27017:233::-;27056:3;27079:24;27097:5;27079:24;:::i;:::-;27070:33;;27125:66;27118:5;27115:77;27112:103;;27195:18;;:::i;:::-;27112:103;27242:1;27235:5;27231:13;27224:20;;27017:233;;;:::o;27256:553::-;27433:4;27471:3;27460:9;27456:19;27448:27;;27485:71;27553:1;27542:9;27538:17;27529:6;27485:71;:::i;:::-;27566:72;27634:2;27623:9;27619:18;27610:6;27566:72;:::i;:::-;27648;27716:2;27705:9;27701:18;27692:6;27648:72;:::i;:::-;27730;27798:2;27787:9;27783:18;27774:6;27730:72;:::i;:::-;27256:553;;;;;;;:::o;27815:174::-;27955:26;27951:1;27943:6;27939:14;27932:50;27815:174;:::o;27995:366::-;28137:3;28158:67;28222:2;28217:3;28158:67;:::i;:::-;28151:74;;28234:93;28323:3;28234:93;:::i;:::-;28352:2;28347:3;28343:12;28336:19;;27995:366;;;:::o;28367:419::-;28533:4;28571:2;28560:9;28556:18;28548:26;;28620:9;28614:4;28610:20;28606:1;28595:9;28591:17;28584:47;28648:131;28774:4;28648:131;:::i;:::-;28640:139;;28367:419;;;:::o;28792:180::-;28840:77;28837:1;28830:88;28937:4;28934:1;28927:15;28961:4;28958:1;28951:15;28978:178;29118:30;29114:1;29106:6;29102:14;29095:54;28978:178;:::o;29162:366::-;29304:3;29325:67;29389:2;29384:3;29325:67;:::i;:::-;29318:74;;29401:93;29490:3;29401:93;:::i;:::-;29519:2;29514:3;29510:12;29503:19;;29162:366;;;:::o;29534:419::-;29700:4;29738:2;29727:9;29723:18;29715:26;;29787:9;29781:4;29777:20;29773:1;29762:9;29758:17;29751:47;29815:131;29941:4;29815:131;:::i;:::-;29807:139;;29534:419;;;:::o;29959:164::-;30099:16;30095:1;30087:6;30083:14;30076:40;29959:164;:::o;30129:366::-;30271:3;30292:67;30356:2;30351:3;30292:67;:::i;:::-;30285:74;;30368:93;30457:3;30368:93;:::i;:::-;30486:2;30481:3;30477:12;30470:19;;30129:366;;;:::o;30501:419::-;30667:4;30705:2;30694:9;30690:18;30682:26;;30754:9;30748:4;30744:20;30740:1;30729:9;30725:17;30718:47;30782:131;30908:4;30782:131;:::i;:::-;30774:139;;30501:419;;;:::o;30926:91::-;30962:7;31002:8;30995:5;30991:20;30980:31;;30926:91;;;:::o;31023:162::-;31083:9;31116:63;31133:45;31142:35;31171:5;31142:35;:::i;:::-;31133:45;:::i;:::-;31116:63;:::i;:::-;31103:76;;31023:162;;;:::o;31191:151::-;31288:47;31329:5;31288:47;:::i;:::-;31283:3;31276:60;31191:151;;:::o;31348:142::-;31451:32;31477:5;31451:32;:::i;:::-;31446:3;31439:45;31348:142;;:::o;31496:716::-;31727:4;31765:3;31754:9;31750:19;31742:27;;31779:71;31847:1;31836:9;31832:17;31823:6;31779:71;:::i;:::-;31860:72;31928:2;31917:9;31913:18;31904:6;31860:72;:::i;:::-;31942;32010:2;31999:9;31995:18;31986:6;31942:72;:::i;:::-;32024:82;32102:2;32091:9;32087:18;32078:6;32024:82;:::i;:::-;32116:89;32200:3;32189:9;32185:19;32176:6;32116:89;:::i;:::-;31496:716;;;;;;;;:::o;32218:172::-;32358:24;32354:1;32346:6;32342:14;32335:48;32218:172;:::o;32396:366::-;32538:3;32559:67;32623:2;32618:3;32559:67;:::i;:::-;32552:74;;32635:93;32724:3;32635:93;:::i;:::-;32753:2;32748:3;32744:12;32737:19;;32396:366;;;:::o;32768:419::-;32934:4;32972:2;32961:9;32957:18;32949:26;;33021:9;33015:4;33011:20;33007:1;32996:9;32992:17;32985:47;33049:131;33175:4;33049:131;:::i;:::-;33041:139;;32768:419;;;:::o;33193:143::-;33250:5;33281:6;33275:13;33266:22;;33297:33;33324:5;33297:33;:::i;:::-;33193:143;;;;:::o;33342:351::-;33412:6;33461:2;33449:9;33440:7;33436:23;33432:32;33429:119;;;33467:79;;:::i;:::-;33429:119;33587:1;33612:64;33668:7;33659:6;33648:9;33644:22;33612:64;:::i;:::-;33602:74;;33558:128;33342:351;;;;:::o;33699:174::-;33839:26;33835:1;33827:6;33823:14;33816:50;33699:174;:::o;33879:366::-;34021:3;34042:67;34106:2;34101:3;34042:67;:::i;:::-;34035:74;;34118:93;34207:3;34118:93;:::i;:::-;34236:2;34231:3;34227:12;34220:19;;33879:366;;;:::o;34251:419::-;34417:4;34455:2;34444:9;34440:18;34432:26;;34504:9;34498:4;34494:20;34490:1;34479:9;34475:17;34468:47;34532:131;34658:4;34532:131;:::i;:::-;34524:139;;34251:419;;;:::o;34676:410::-;34716:7;34739:20;34757:1;34739:20;:::i;:::-;34734:25;;34773:20;34791:1;34773:20;:::i;:::-;34768:25;;34828:1;34825;34821:9;34850:30;34868:11;34850:30;:::i;:::-;34839:41;;35029:1;35020:7;35016:15;35013:1;35010:22;34990:1;34983:9;34963:83;34940:139;;35059:18;;:::i;:::-;34940:139;34724:362;34676:410;;;;:::o;35092:180::-;35140:77;35137:1;35130:88;35237:4;35234:1;35227:15;35261:4;35258:1;35251:15;35278:185;35318:1;35335:20;35353:1;35335:20;:::i;:::-;35330:25;;35369:20;35387:1;35369:20;:::i;:::-;35364:25;;35408:1;35398:35;;35413:18;;:::i;:::-;35398:35;35455:1;35452;35448:9;35443:14;;35278:185;;;;:::o

Swarm Source

ipfs://526d8e59a60bde533bc51eb0a7eb32f324efa51359755617b9fc8502c79eaa16

Block Transaction 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

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.