FRAX Price: $0.85 (-16.67%)

Contract

0xfd7B5FBbD21712a3f63A82Fa9f33def2D8ae8Bd7

Overview

FRAX Balance | FXTL Balance

0 FRAX | 0 FXTL

FRAX Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Age:24H
Reset Filter

Transaction Hash
Block
From
To

There are no matching entries

Update your filters to view other transactions

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PositionMarket

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at fraxscan.com on 2024-02-28
*/

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

// This interface defines basic ERC20 token functionalities, including transfer and balance queries.
interface IERC20 {
    /**
     * @dev Transfers a specified amount of tokens from one address to another.
     * @param from The address from which tokens are transferred.
     * @param to The address to which tokens are transferred.
     * @param amount The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation was successful.
     */
    function transferFrom(address from, address to, uint amount) external returns (bool);

    /**
     * @dev Transfers a specified amount of tokens to a specified address.
     * @param to The address to which tokens are transferred.
     * @param amount The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation was successful.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the token balance of a specified address.
     * @param account The address whose token balance will be retrieved.
     * @return The number of tokens held by the given address.
     */
    function balanceOf(address account) external view returns (uint);
}

// This interface defines a function for getting the latest price answer from an oracle.
interface IAggregator {
    /**
     * @dev Returns the latest price answer.
     * @return int256 The latest price.
     */
    function latestAnswer() external view returns (int256);
}

contract PositionMarket {
    // Data structure for storing information about currency pair oracles
    uint private currencyPairCount;

    // Data structure for storing information about metal pair oracles
    uint private metalPairCount;

    // Mapping storing addresses of oracles for default trading tokens
    mapping(address => address) private defaultTradingTokenOracles;

    // Variable storing the address of the current default trading token
    address private defaultTradingToken;

    // Minimum timestamp set by the owner
    uint256 private minimumTimestamp;

    // Mapping of oracles for various currencies
    mapping(string => address) private currencyOracles;

    // A counter to keep track of the number of positions created. 
    // It's used as a unique identifier for each new position.
    uint256 private positionCounter;

    // A mapping from a position's unique identifier (uint256) to its corresponding Position struct.
    // This structure stores detailed information about each position.
    mapping(uint256 => Position) private positions;

    // A percentage fee that is charged on the profit made from a position.
    // This fee is taken when the profit is realized and is calculated as a percentage of the profit.
    uint256 private profitFeePercentage;

    // The address of the contract owner. 
    // This address has special permissions within the contract, like setting fees or modifying key parameters.
    address private owner;
    
    // Mapping storing price pairs and their oracles
    mapping(string => PricePair) private pricePairs;

    // Tracks if the initial setup of the contract has been completed
    // Ensures that setup logic is executed only once
    bool private isSetup;

    // Represents the paused state of the contract
    // When true, certain functions of the contract are disabled
    bool private _paused;

    // Stores the block number at which the contract was setup.
    uint private setupBlock;

    // Flag to prevent reentrant calls.
    bool private locked;

    // A variable returning the current name of the contract.
    string private contractName;

    // Event emitted when the default token is deposited by the owner
    event DefaultTokenDepositedByOwner(address indexed owner, uint256 amount);

    // Event emitted when the default token is withdrawn by the owner
    event DefaultTokenWithdrawnByOwner(address indexed owner, uint256 amount);

    // Event emitted during the addition or updating of an oracle for a default trading token
    event DefaultTradingTokenOracleUpdated(address tokenAddress, address oracleAddress);

    // Event emitted when a new price pair is added to the contract.
    // @param pairSymbol The symbol representing the pair.
    // @param assetOne The first asset in the pair.
    // @param assetTwo The second asset in the pair.
    // @param oracleAddress The address of the oracle providing the price data.
    // @param classId A classification identifier for the asset pair.
    // @param dataHash A hash representing additional data associated with the pair.
    event PricePairAdded(string pairSymbol, string assetOne, string assetTwo, address oracleAddress, string classId, bytes32 dataHash);

    // Event emitted when the setup of the contract is completed.
    event SetupCompleted(address indexed owner, uint setupBlock);

    // Event emitted when the profit fee percentage is updated.
    event ProfitFeePercentageUpdated(uint256 newProfitFeePercentage);

    /**
     * @dev Modifier to restrict function access to only the owner of the contract.
     * It checks if the sender of the message (transaction) is the owner.
     * Reverts if the sender is not the owner.
     */
    modifier onlyOwner() {
        require(msg.sender == owner, "Caller is not the owner");
        _;
    }

    /**
     * @dev Modifier to validate the price pair and its class ID.
     * It checks if the provided pair symbol and class ID match an existing pair's data.
     * Reverts if the pair symbol and class ID do not match or if the pair does not exist.
     * @param pairSymbol The symbol of the price pair to validate.
     * @param classId The class ID to validate against the pair.
     */
    modifier onlyValidPair(string memory pairSymbol, string memory classId) {
        PricePair memory pair = pricePairs[pairSymbol];
        require(
            keccak256(bytes(pair.classId)) == keccak256(bytes(classId)),
            "Invalid pair or class ID"
        );
        _;
    }

    /**
     * @dev Modifier to prevent a contract from calling itself, directly or indirectly.
     */
    modifier nonReentrant() {
        require(!locked, "Reentrant call");
        locked = true;
        _;
        locked = false;
    }

    /**
     * @dev Modifier to ensure a function is called only once during the contract's lifetime.
     */
    modifier setupOnce() {
        require(!isSetup, "Setup already called!");
        _;
        isSetup = true;
    }

    /**
     * @dev Modifier that allows function execution only when the contract is not paused.
     * It checks if the contract is not paused before allowing the function to proceed.
     */
    modifier whenNotPaused() {
        require(!_paused, "Contract is paused"); // Checks if the contract is not paused
        _; // Continues execution of the modified function
    }

     /**
     * @dev Modifier that allows function execution only when the contract is paused.
     */
    modifier whenPaused() {
        require(_paused, "Contract is not paused"); // Checks if the contract is paused
        _; // Continues execution of the modified function
    }

    /**
     * @dev Retrieves the name of this contract.
     * @return The name of the contract as a string.
     */
    function getContractName() public view returns (string memory) {
        return contractName;
    }

    /**
     * @dev Returns detailed information of a specific position.
     * @param positionId The unique identifier of the position.
     */
    function getPositionDetails(uint256 positionId) public view returns (
        uint256, address, string memory, string memory, uint256, bool, bool, uint256, uint256
    ) {
        Position memory position = positions[positionId];
        return (
            position.positionId,
            position.trader,
            position.pairSymbol,
            position.classId,
            position.timestamp,
            position.isLong,
            position.isOpen,
            position.collateral,
            position.priceAtOpen
        );
    }

    /**
     * @dev Returns detailed information of a specified price pair.
     * @param pairSymbol The symbol of the price pair.
     */
    function getPricePairDetails(string memory pairSymbol) public view returns (
        string memory, string memory, string memory, address, string memory, bytes32
    ) {
        PricePair memory pricePair = pricePairs[pairSymbol];
        return (
            pricePair.pairSymbol,
            pricePair.assetOne,
            pricePair.assetTwo,
            pricePair.oracleAddress,
            pricePair.classId,
            pricePair.dataHash
        );
    }

    /**
     * @dev Returns the current count of currency pairs.
     * @return The current count of currency pairs.
     */
    function getCurrencyPairCount() public view returns (uint) {
        return currencyPairCount;
    }

    /**
     * @dev Returns the current count of metal pairs.
     * @return The current count of metal pairs.
     */
    function getMetalPairCount() public view returns (uint) {
        return metalPairCount;
    }

    /**
     * @dev Returns the oracle address for a given default trading token.
     * @param tokenAddress The address of the trading token.
     * @return The oracle address associated with the given trading token.
     */
    function getDefaultTradingTokenOracle(address tokenAddress) public view returns (address) {
        return defaultTradingTokenOracles[tokenAddress];
    }

    /**
     * @dev Returns the address of the current default trading token.
     * @return The address of the current default trading token.
     */
    function getDefaultTradingToken() public view returns (address) {
        return defaultTradingToken;
    }

    /**
     * @dev Returns the minimum timestamp set by the owner.
     * @return The minimum timestamp.
     */
    function getMinimumTimestamp() public view returns (uint256) {
        return minimumTimestamp;
    }

    /**
     * @dev Returns the oracle address for a given currency.
     * @param currency The name of the currency.
     * @return The oracle address associated with the given currency.
     */
    function getCurrencyOracle(string memory currency) public view returns (address) {
        return currencyOracles[currency];
    }

    /**
     * @dev Returns the current position counter.
     * @return The current number of positions created.
     */
    function getPositionCounter() public view returns (uint256) {
        return positionCounter;
    }

    /**
     * @dev Returns the current profit fee percentage.
     * @return The profit fee percentage.
     */
    function getProfitFeePercentage() public view returns (uint256) {
        return profitFeePercentage;
    }

    /**
     * @dev Returns the address of the contract owner.
     * @return The address of the owner.
     */
    function getOwner() public view returns (address) {
        return owner;
    }

    /**
     * @dev Returns the boolean status indicating if the contract setup is completed.
     * @return True if setup is completed, false otherwise.
     */
    function getIsSetup() public view returns (bool) {
        return isSetup;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function isPaused() public view returns (bool) {
        return _paused;
    }

    /**
     * @dev Sets up initial configuration of the contract.
     * This function can only be called once.
     * It initializes the owner and setupBlock variables.
     */
    function setup() public setupOnce {
        owner = msg.sender;
        setupBlock = block.number;
        emit SetupCompleted(owner, setupBlock);
    }

    /**
     * @dev Sets a new name for the contract.
     * @param _name The new name to be set.
     */
    function setContractName(string calldata _name) public onlyOwner whenNotPaused {
        require(keccak256(bytes(_name)) != keccak256(bytes(contractName)), "New name must be different from the current name"); // Checks if the new name is different from the current one
        contractName = _name;
    }

    /**
     * @dev Function to pause the contract.
     * This function can only be called by the contract's admin.
     * It sets the contract state to paused.
     */
    function pause() public onlyOwner whenNotPaused {
        _paused = true; // Sets the contract state to paused
    }

    /**
     * @dev Function to resume the contract's operations.
     * This function can only be called by the contract's admin.
     * It sets the contract state to not paused.
     */
    function unpause() public onlyOwner whenPaused {
        _paused = false; // Sets the contract state to not paused
    }

    // Struct representing a pair of assets with their oracle and additional data.
    struct PricePair {
        string pairSymbol; // Symbol representing the asset pair.
        string assetOne; // Symbol of the first asset in the pair.
        string assetTwo; // Symbol of the second asset in the pair.
        address oracleAddress; // Address of the oracle providing price data for this pair.
        string classId; // Identifier for the asset class.
        bytes32 dataHash; // Hash of additional data related to the pair.
    }

    // Struct representing a trading position.
    struct Position {
        uint256 positionId; // Unique identifier for the position.
        address trader; // Address of the trader who owns the position.
        string pairSymbol; // Symbol representing the traded asset pair.
        string classId; // Identifier for the asset class of the position.
        uint256 timestamp; // Timestamp when the position was created.
        bool isLong; // Boolean flag indicating if the position is long.
        bool isOpen; // Boolean flag indicating if the position is currently open.
        uint256 collateral; // Amount of collateral posted for the position.
        uint256 priceAtOpen; // Price of the asset pair at the time of position opening.
    }

    // Event emitted when a new position is created.
    event PositionCreated(
        uint256 indexed positionId,
        address indexed trader,
        string pairSymbol,
        string classId,
        uint256 timestamp,
        bool isLong
    );

    // Function to set the minimum required timestamp for creating a position.
    /** 
     * @dev Sets the minimum timestamp for position creation.
     * Can only be called by the contract owner.
     * @param _timestamp The minimum timestamp.
     */
    function setMinimumTimestamp(uint256 _timestamp) public onlyOwner {
        minimumTimestamp = _timestamp;
    }

    // Internal function to handle the deposit of collateral.
    /** 
     * @dev Deposits collateral into the contract.
     * Requires that the collateral amount is greater than zero.
     * Transfers the specified collateral amount from the sender to the contract.
     * @param amount The amount of collateral to deposit.
     */
    function depositCollateral(uint256 amount) internal {
        require(amount > 0, "Collateral amount must be greater than zero");
        IERC20 token = IERC20(defaultTradingToken);
        require(token.transferFrom(msg.sender, address(this), amount), "Transfer failed");
    }

    // Function to create a new trading position.
    /** 
     * @dev Creates a new trading position with the specified parameters.
     * Checks if the pair is valid, the contract is not paused, and prevents reentrant calls.
     * Requires that the timestamp is valid and the collateral amount is greater than zero.
     * Deposits collateral and emits an event upon successful position creation.
     * @param pairSymbol The symbol of the traded asset pair.
     * @param classId The identifier for the asset class.
     * @param isLong Boolean indicating if the position is long.
     * @param timestamp Timestamp when the position is created.
     * @param collateralAmount The amount of collateral for the position.
     */
    function createPosition(string memory pairSymbol, string memory classId, bool isLong, uint256 timestamp, uint256 collateralAmount) public onlyValidPair(pairSymbol, classId) whenNotPaused nonReentrant {
        require(timestamp >= minimumTimestamp, "Timestamp is too early");
        require(timestamp <= block.timestamp, "Future timestamp is not allowed");
        require(collateralAmount > 0, "Collateral amount must be greater than zero");

        int256 priceAtOpen = getPrice(pairSymbol);
        require(priceAtOpen > 0, "Invalid price for pair");

        depositCollateral(collateralAmount);

        uint256 newPositionId = ++positionCounter;
        positions[newPositionId] = Position({
            positionId: newPositionId,
            trader: msg.sender,
            pairSymbol: pairSymbol,
            classId: classId,
            timestamp: timestamp,
            isLong: isLong,
            isOpen: true,
            collateral: collateralAmount,
            priceAtOpen: uint256(priceAtOpen)
        });

        emit PositionCreated(newPositionId, msg.sender, pairSymbol, classId, timestamp, isLong);
    }
    
    /**
     * @dev Allows the contract owner to add or update the oracle address for a specific currency.
     * @param currency The currency for which the oracle is being set.
     * @param oracleAddress The address of the oracle.
     */
    function setCurrencyOracle(string memory currency, address oracleAddress) public onlyOwner {
        require(oracleAddress != address(0), "Oracle address cannot be zero");
        currencyOracles[currency] = oracleAddress;
    }

    /**
     * @dev Returns the price of a position in multiple currencies.
     * @param positionId The ID of the position.
     * @return priceInUSD The price of the position in USD.
     * @return priceInEUR The price of the position in EUR.
     * @return priceInGBP The price of the position in GBP.
     * @return priceInCHF The price of the position in CHF.
     * @return priceInCNY The price of the position in CNY.
     */
    function getPositionPriceInCurrencies(uint256 positionId) public view returns (uint256 priceInUSD, uint256 priceInEUR, uint256 priceInGBP, uint256 priceInCHF, uint256 priceInCNY) {
        Position memory position = positions[positionId];
        require(position.positionId != 0, "Position does not exist");

        int256 priceInUSDInt = getPrice(position.pairSymbol);
        require(priceInUSDInt > 0, "Invalid price for pair");
        priceInUSD = uint256(priceInUSDInt) * position.collateral;

        priceInEUR = convertCurrency("EUR/USD", priceInUSD);
        priceInGBP = convertCurrency("GBP/USD", priceInUSD);
        priceInCHF = convertCurrency("CHF/USD", priceInUSD);
        priceInCNY = convertCurrency("CNY/USD", priceInUSD);
    }

    /**
     * @dev Helper function to convert a currency amount from USD to another currency using a specific currency pair.
     * @param currencyPair The currency pair used for conversion (e.g., "EUR/USD").
     * @param amountInUSD The amount in USD to convert.
     * @return The converted amount in the target currency.
     */
    function convertCurrency(string memory currencyPair, uint256 amountInUSD) private view returns (uint256) {
        address oracleAddress = currencyOracles[currencyPair];
        require(oracleAddress != address(0), "Oracle not set for this currency pair");

        IAggregator oracle = IAggregator(oracleAddress);
        int256 exchangeRate = oracle.latestAnswer();
        require(exchangeRate > 0, "Invalid exchange rate");

        return (amountInUSD * uint256(exchangeRate)) / 1e8;
    }

    /**
     * @dev Allows the contract owner to set the fee percentage applied to profits.
     * @param _profitFeePercentage The new profit fee percentage.
     */
    function setProfitFeePercentage(uint256 _profitFeePercentage) public onlyOwner {
        require(_profitFeePercentage <= 333333, "Fee percentage cannot exceed 33,333%");
        profitFeePercentage = _profitFeePercentage;
        emit ProfitFeePercentageUpdated(_profitFeePercentage);
    }

    // Event emitted when a trading position is closed.
    // It includes the position ID, trader's address, a flag indicating if the position was profitable,
    // and the amount returned to the trader.
    event PositionClosed(
        uint256 indexed positionId,
        address indexed trader,
        bool wasProfitable,
        uint256 amountReturned
    );

    /**
     * @dev Function to close a trading position.
     * @param positionId The ID of the position to be closed.
     * Requires that the position belongs to the message sender, is currently open, 
     * and meets the timestamp conditions.
     * Calculates profitability, applies fees if profitable, and returns the appropriate amount.
     * Emits the PositionClosed event upon success.
     */
    function closePosition(uint256 positionId) public whenNotPaused nonReentrant {
        Position storage position = positions[positionId];

        // Validation checks
        require(position.trader == msg.sender, "You are not the owner of this position");
        require(position.isOpen, "Position is already closed");
        require(block.timestamp >= position.timestamp, "Position cannot be closed before its set timestamp");
        require(block.timestamp >= minimumTimestamp, "Position cannot be closed before minimum timestamp set by owner");

        // Retrieve current price of the pair
        int256 currentPrice = getPrice(position.pairSymbol);
        require(currentPrice > 0, "Invalid current price for pair");

        bool wasProfitable;
        uint256 amountReturned;

        // Calculate profitability and amount to return
        if (position.isLong) {
            wasProfitable = uint256(currentPrice) > position.priceAtOpen;
        } else {
            wasProfitable = uint256(currentPrice) < position.priceAtOpen;
        }

        if (wasProfitable) {
            uint256 grossProfit = (position.collateral * (uint256(currentPrice) - position.priceAtOpen) / position.priceAtOpen);
            uint256 fee = grossProfit * profitFeePercentage / 1000000; // Fee calculation
            amountReturned = position.collateral + grossProfit - fee;
        } else {
            amountReturned = 0; // No return in case of loss
        }

        // Close the position
        position.isOpen = false;

        if (amountReturned > 0) {
            IERC20 token = IERC20(defaultTradingToken);
            require(token.balanceOf(address(this)) >= amountReturned, "Insufficient contract balance");
            require(token.transfer(msg.sender, amountReturned), "Transfer failed");
        }

        emit PositionClosed(positionId, msg.sender, wasProfitable, amountReturned);
    }

    /**
     * @dev Function to set or update the oracle for the default trading token.
     * @param tokenAddress The address of the trading token.
     * @param oracleAddress The address of the oracle for the token.
     * Requires that both addresses are not zero.
     * Updates the oracle mapping and sets the default trading token.
     * Emits DefaultTradingTokenOracleUpdated event upon success.
     */
    function setDefaultTradingToken(address tokenAddress, address oracleAddress) public onlyOwner {
        require(tokenAddress != address(0), "Token address cannot be zero");
        require(oracleAddress != address(0), "Oracle address cannot be zero");

        defaultTradingTokenOracles[tokenAddress] = oracleAddress;
        defaultTradingToken = tokenAddress;
        emit DefaultTradingTokenOracleUpdated(tokenAddress, oracleAddress);
    }

    /**
     * @dev Function to retrieve the current price from the oracle.
     * @param pair The trading pair symbol.
     * @return price The current price of the trading pair.
     * Requires that the oracle is set for the specified pair and the price is not zero.
     */
    function getPrice(string memory pair) public view returns (int256) {
        PricePair memory pricePair = pricePairs[pair];
        require(pricePair.oracleAddress != address(0), "Oracle not set for this pair");
        IAggregator oracle = IAggregator(pricePair.oracleAddress);
        int256 price = oracle.latestAnswer();
        require(price != 0, "Price cannot be zero");
        return price;
    }

    /**
     * @dev Returns the price for a given class ID by finding the corresponding pair symbol and fetching its price.
     * @param classId The class ID for which the price is to be fetched.
     * @return The price of the asset associated with the given class ID.
     */
    function getPriceByClassId(string memory classId) public view returns (int256) {
        for (uint i = 0; i < currencyPairCount + metalPairCount; i++) {
            PricePair storage pricePair = pricePairs[uintToString(i)];
            if (keccak256(bytes(pricePair.classId)) == keccak256(bytes(classId))) {
                return getPrice(pricePair.pairSymbol);
            }
        }
        revert("Class ID not found");
    }

    /**
     * @dev Adds a new price pair to the contract. Only callable by the contract owner.
     * @param pairSymbol The symbol representing the pair.
     * @param assetOne Name of the first asset.
     * @param assetTwo Name of the second asset.
     * @param oracleAddress Address of the price oracle for this pair.
     * @param isCurrencyPair Boolean flag indicating if it's a currency pair.
     */
    function addPricePair(string memory pairSymbol, string memory assetOne, string memory assetTwo, address oracleAddress, bool isCurrencyPair) public onlyOwner {
        require(oracleAddress != address(0), "Oracle address cannot be zero");
        require(isValidPairSymbol(pairSymbol), "Invalid pair symbol format");

        string memory classId;
        if (isCurrencyPair) {
            classId = string(abi.encodePacked("A", uintToString(++currencyPairCount)));
        } else {
            classId = string(abi.encodePacked("B", uintToString(++metalPairCount)));
        }

        bytes32 dataHash = keccak256(abi.encodePacked(pairSymbol, assetOne, assetTwo, oracleAddress, isCurrencyPair, classId));

        pricePairs[pairSymbol] = PricePair(pairSymbol, assetOne, assetTwo, oracleAddress, classId, dataHash);
        emit PricePairAdded(pairSymbol, assetOne, assetTwo, oracleAddress, classId, dataHash);
    }

    /**
     * @dev Helper function to check if a pair symbol is in a valid format.
     * @param symbol The symbol to be validated.
     * @return A boolean indicating whether the symbol is valid.
     */
    function isValidPairSymbol(string memory symbol) private pure returns (bool) {
        bytes memory symbolBytes = bytes(symbol);
        bool slashFound = false;

        for(uint i = 0; i < symbolBytes.length; i++) {
            if(symbolBytes[i] == "/") {
                if(slashFound || i == 0 || i == symbolBytes.length - 1) {
                    return false;
                }
                slashFound = true;
            }
        }

        return slashFound;
    }

    /**
     * @dev Allows the owner to deposit the default trading token into the contract.
     * @param amount The amount of the token to be deposited.
     */
    function depositDefaultTradingToken(uint256 amount) public onlyOwner {
        require(defaultTradingToken != address(0), "Default trading token not set");
        
        IERC20 token = IERC20(defaultTradingToken);
        require(token.transferFrom(msg.sender, address(this), amount), "Transfer failed");

        emit DefaultTokenDepositedByOwner(msg.sender, amount);
    }

    /**
     * @dev Allows the owner to withdraw the default trading token from the contract.
     * @param amount The amount of the token to be withdrawn.
     */
    function withdrawDefaultTradingToken(uint256 amount) public onlyOwner {
        require(defaultTradingToken != address(0), "Default trading token not set");

        IERC20 token = IERC20(defaultTradingToken);
        uint256 contractBalance = token.balanceOf(address(this));
        require(contractBalance >= amount, "Insufficient funds in the contract");
        
        require(token.transfer(msg.sender, amount), "Transfer failed");

        emit DefaultTokenWithdrawnByOwner(msg.sender, amount);
    }

    /**
     * @dev Helper function to convert a uint256 to a string.
     * @param v The uint256 value to be converted.
     * @return str The string representation of the input value.
     */
    function uintToString(uint v) private pure returns (string memory str) {
        if (v == 0) {
            return "0";
        }
        uint j = v;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (v != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(v - v / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            v /= 10;
        }
        return string(bstr);
    }
}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DefaultTokenDepositedByOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DefaultTokenWithdrawnByOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"oracleAddress","type":"address"}],"name":"DefaultTradingTokenOracleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"positionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"bool","name":"wasProfitable","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amountReturned","type":"uint256"}],"name":"PositionClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"positionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"string","name":"pairSymbol","type":"string"},{"indexed":false,"internalType":"string","name":"classId","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"}],"name":"PositionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"pairSymbol","type":"string"},{"indexed":false,"internalType":"string","name":"assetOne","type":"string"},{"indexed":false,"internalType":"string","name":"assetTwo","type":"string"},{"indexed":false,"internalType":"address","name":"oracleAddress","type":"address"},{"indexed":false,"internalType":"string","name":"classId","type":"string"},{"indexed":false,"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"PricePairAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newProfitFeePercentage","type":"uint256"}],"name":"ProfitFeePercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"setupBlock","type":"uint256"}],"name":"SetupCompleted","type":"event"},{"inputs":[{"internalType":"string","name":"pairSymbol","type":"string"},{"internalType":"string","name":"assetOne","type":"string"},{"internalType":"string","name":"assetTwo","type":"string"},{"internalType":"address","name":"oracleAddress","type":"address"},{"internalType":"bool","name":"isCurrencyPair","type":"bool"}],"name":"addPricePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"closePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pairSymbol","type":"string"},{"internalType":"string","name":"classId","type":"string"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"}],"name":"createPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositDefaultTradingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContractName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currency","type":"string"}],"name":"getCurrencyOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrencyPairCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDefaultTradingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getDefaultTradingTokenOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIsSetup","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMetalPairCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPositionCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"getPositionDetails","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"getPositionPriceInCurrencies","outputs":[{"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"internalType":"uint256","name":"priceInEUR","type":"uint256"},{"internalType":"uint256","name":"priceInGBP","type":"uint256"},{"internalType":"uint256","name":"priceInCHF","type":"uint256"},{"internalType":"uint256","name":"priceInCNY","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"pair","type":"string"}],"name":"getPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"classId","type":"string"}],"name":"getPriceByClassId","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"pairSymbol","type":"string"}],"name":"getPricePairDetails","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"},{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProfitFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"setContractName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"currency","type":"string"},{"internalType":"address","name":"oracleAddress","type":"address"}],"name":"setCurrencyOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"oracleAddress","type":"address"}],"name":"setDefaultTradingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setMinimumTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_profitFeePercentage","type":"uint256"}],"name":"setProfitFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawDefaultTradingToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561000f575f80fd5b5061359d8061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c80639ecceb5e116100fe578063c5d80c7d1161009e578063e3601e341161006e578063e3601e34146103e6578063eaf92c52146103ee578063edbfe0a014610419578063f5f5ba721461042c575f80fd5b8063c5d80c7d14610372578063c9efe435146103ad578063d5ae5e11146103c0578063d7fdc664146103d3575f80fd5b8063a58aba8f116100d9578063a58aba8f14610322578063b0ca3d0114610347578063b187bd261461035a578063ba0bba401461036a575f80fd5b80639ecceb5e146102d05780639f40d0cd146102f8578063a126d6011461030f575f80fd5b80636a333fe61161017457806381aafcfb1161014457806381aafcfb146102915780638456cb59146102a4578063893d20e8146102ac5780638dcdd021146102bd575f80fd5b80636a333fe61461025b5780636b49bac7146102635780637808cf1d1461026b5780637dc851e51461027e575f80fd5b806329c1a991116101af57806329c1a991146102145780633f4ba83a1461021b5780633fd5376b14610223578063524f388914610248575f80fd5b80630b5ee006146101d55780630ee87df0146101ea5780631da58d1714610201575b5f80fd5b6101e86101e3366004612b67565b610441565b005b6004545b6040519081526020015b60405180910390f35b6101e861020f366004612bd3565b610543565b5f546101ee565b6101e8610754565b6003546001600160a01b03165b6040516001600160a01b0390911681526020016101f8565b6101ee610256366004612c87565b6107db565b6006546101ee565b6001546101ee565b6101e8610279366004612cd4565b610b7e565b6101e861028c366004612d1f565b610c12565b61023061029f366004612c87565b610d30565b6101e8610d60565b6009546001600160a01b0316610230565b6101e86102cb366004612d57565b610dc3565b6102e36102de366004612bd3565b611037565b6040516101f899989796959493929190612e4b565b600b5460ff165b60405190151581526020016101f8565b6101e861031d366004612bd3565b611258565b610335610330366004612c87565b6117bc565b6040516101f896959493929190612eb7565b6101e8610355366004612bd3565b611a81565b600b54610100900460ff166102ff565b6101e8611b45565b610385610380366004612bd3565b611bed565b604080519586526020860194909452928401919091526060830152608082015260a0016101f8565b6101ee6103bb366004612c87565b611efe565b6101e86103ce366004612f26565b611fbe565b6101e86103e1366004612bd3565b61259f565b6008546101ee565b6102306103fc366004612fa8565b6001600160a01b039081165f908152600260205260409020541690565b6101e8610427366004612bd3565b6126f0565b61043461271f565b6040516101f89190612fc8565b6009546001600160a01b031633146104745760405162461bcd60e51b815260040161046b90612fda565b60405180910390fd5b600b54610100900460ff161561049c5760405162461bcd60e51b815260040161046b90613011565b600e6040516104ab9190613075565b604051809103902082826040516104c39291906130e7565b6040518091039020036105315760405162461bcd60e51b815260206004820152603060248201527f4e6577206e616d65206d75737420626520646966666572656e742066726f6d2060448201526f7468652063757272656e74206e616d6560801b606482015260840161046b565b600e61053e828483613141565b505050565b6009546001600160a01b0316331461056d5760405162461bcd60e51b815260040161046b90612fda565b6003546001600160a01b03166105c55760405162461bcd60e51b815260206004820152601d60248201527f44656661756c742074726164696e6720746f6b656e206e6f7420736574000000604482015260640161046b565b6003546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa15801561060f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063391906131fb565b9050828110156106905760405162461bcd60e51b815260206004820152602260248201527f496e73756666696369656e742066756e647320696e2074686520636f6e74726160448201526118dd60f21b606482015260840161046b565b60405163a9059cbb60e01b8152336004820152602481018490526001600160a01b0383169063a9059cbb906044016020604051808303815f875af11580156106da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fe9190613212565b61071a5760405162461bcd60e51b815260040161046b9061322d565b60405183815233907f438a789ddecb040a37bde559b416983cda42b06c5b3ea44d10c0178046a16ecf9060200160405180910390a2505050565b6009546001600160a01b0316331461077e5760405162461bcd60e51b815260040161046b90612fda565b600b54610100900460ff166107ce5760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9858dd081a5cc81b9bdd081c185d5cd95960521b604482015260640161046b565b600b805461ff0019169055565b5f80600a836040516107ed9190613256565b90815260200160405180910390206040518060c00160405290815f820180546108159061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546108419061303d565b801561088c5780601f106108635761010080835404028352916020019161088c565b820191905f5260205f20905b81548152906001019060200180831161086f57829003601f168201915b505050505081526020016001820180546108a59061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546108d19061303d565b801561091c5780601f106108f35761010080835404028352916020019161091c565b820191905f5260205f20905b8154815290600101906020018083116108ff57829003601f168201915b505050505081526020016002820180546109359061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546109619061303d565b80156109ac5780601f10610983576101008083540402835291602001916109ac565b820191905f5260205f20905b81548152906001019060200180831161098f57829003601f168201915b505050918352505060038201546001600160a01b031660208201526004820180546040909201916109dc9061303d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a089061303d565b8015610a535780601f10610a2a57610100808354040283529160200191610a53565b820191905f5260205f20905b815481529060010190602001808311610a3657829003601f168201915b50505091835250506005919091015460209091015260608101519091506001600160a01b0316610ac55760405162461bcd60e51b815260206004820152601c60248201527f4f7261636c65206e6f742073657420666f722074686973207061697200000000604482015260640161046b565b5f816060015190505f816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2e91906131fb565b9050805f03610b765760405162461bcd60e51b815260206004820152601460248201527350726963652063616e6e6f74206265207a65726f60601b604482015260640161046b565b949350505050565b6009546001600160a01b03163314610ba85760405162461bcd60e51b815260040161046b90612fda565b6001600160a01b038116610bce5760405162461bcd60e51b815260040161046b90613271565b80600583604051610bdf9190613256565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050565b6009546001600160a01b03163314610c3c5760405162461bcd60e51b815260040161046b90612fda565b6001600160a01b038216610c925760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20616464726573732063616e6e6f74206265207a65726f00000000604482015260640161046b565b6001600160a01b038116610cb85760405162461bcd60e51b815260040161046b90613271565b6001600160a01b038281165f8181526002602090815260409182902080546001600160a01b0319908116958716958617909155600380549091168417905581519283528201929092527fe3221c1fb11e1e628cffc07406d7a01ba973ccb9b0a072bfee6fa81885503730910160405180910390a15050565b5f600582604051610d419190613256565b908152604051908190036020019020546001600160a01b031692915050565b6009546001600160a01b03163314610d8a5760405162461bcd60e51b815260040161046b90612fda565b600b54610100900460ff1615610db25760405162461bcd60e51b815260040161046b90613011565b600b805461ff001916610100179055565b6009546001600160a01b03163314610ded5760405162461bcd60e51b815260040161046b90612fda565b6001600160a01b038216610e135760405162461bcd60e51b815260040161046b90613271565b610e1c856127af565b610e685760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420706169722073796d626f6c20666f726d6174000000000000604482015260640161046b565b60608115610eb057610e8a5f808154610e80906132bc565b918290555061282d565b604051602001610e9a91906132d4565b6040516020818303038152906040529050610ee3565b610ec160015f8154610e80906132bc565b604051602001610ed191906132fc565b60405160208183030381529060405290505b5f868686868686604051602001610eff96959493929190613317565b6040516020818303038152906040528051906020012090506040518060c00160405280888152602001878152602001868152602001856001600160a01b0316815260200183815260200182815250600a88604051610f5d9190613256565b90815260405190819003602001902081518190610f7a9082613396565b5060208201516001820190610f8f9082613396565b5060408201516002820190610fa49082613396565b5060608201516003820180546001600160a01b0319166001600160a01b0390921691909117905560808201516004820190610fdf9082613396565b5060a082015181600501559050507f48c10220a820dc38d7fdcbdb6fb08a378782327e9c59d5d943ed496d2ecdd1e487878787868660405161102696959493929190612eb7565b60405180910390a150505050505050565b5f806060805f805f805f8060075f8c81526020019081526020015f20604051806101200160405290815f8201548152602001600182015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016002820180546110a69061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546110d29061303d565b801561111d5780601f106110f45761010080835404028352916020019161111d565b820191905f5260205f20905b81548152906001019060200180831161110057829003601f168201915b505050505081526020016003820180546111369061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546111629061303d565b80156111ad5780601f10611184576101008083540402835291602001916111ad565b820191905f5260205f20905b81548152906001019060200180831161119057829003601f168201915b5050505050815260200160048201548152602001600582015f9054906101000a900460ff161515151581526020016005820160019054906101000a900460ff16151515158152602001600682015481526020016007820154815250509050805f015181602001518260400151836060015184608001518560a001518660c001518760e00151886101000151995099509950995099509950995099509950509193959799909294969850565b600b54610100900460ff16156112805760405162461bcd60e51b815260040161046b90613011565b600d5460ff16156112c45760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b604482015260640161046b565b600d805460ff191660019081179091555f828152600760205260409020908101546001600160a01b0316331461134b5760405162461bcd60e51b815260206004820152602660248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320706f60448201526539b4ba34b7b760d11b606482015260840161046b565b6005810154610100900460ff166113a45760405162461bcd60e51b815260206004820152601a60248201527f506f736974696f6e20697320616c726561647920636c6f736564000000000000604482015260640161046b565b80600401544210156114135760405162461bcd60e51b815260206004820152603260248201527f506f736974696f6e2063616e6e6f7420626520636c6f736564206265666f7265604482015271020697473207365742074696d657374616d760741b606482015260840161046b565b60045442101561148b5760405162461bcd60e51b815260206004820152603f60248201527f506f736974696f6e2063616e6e6f7420626520636c6f736564206265666f726560448201527f206d696e696d756d2074696d657374616d7020736574206279206f776e657200606482015260840161046b565b5f61151f82600201805461149e9061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546114ca9061303d565b80156115155780601f106114ec57610100808354040283529160200191611515565b820191905f5260205f20905b8154815290600101906020018083116114f857829003601f168201915b50505050506107db565b90505f81136115705760405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063757272656e7420707269636520666f7220706169720000604482015260640161046b565b60058201545f90819060ff161561158f57836007015483119150611599565b8360070154831091505b811561160e5760078401545f906115b08186613456565b86600601546115bf9190613469565b6115c99190613480565b90505f620f4240600854836115de9190613469565b6115e89190613480565b9050808287600601546115fb919061349f565b6116059190613456565b92505050611611565b505f5b60058401805461ff0019169055801561176c576003546040516370a0823160e01b81523060048201526001600160a01b0390911690829082906370a0823190602401602060405180830381865afa15801561166e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061169291906131fb565b10156116e05760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e6365000000604482015260640161046b565b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0382169063a9059cbb906044016020604051808303815f875af115801561172a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061174e9190613212565b61176a5760405162461bcd60e51b815260040161046b9061322d565b505b60408051831515815260208101839052339187917f9e65723e6c7acb1f0a5433ac5cb04c672922b9ea7458668112e59a3148a4a59e910160405180910390a35050600d805460ff19169055505050565b60608060605f60605f80600a886040516117d69190613256565b90815260200160405180910390206040518060c00160405290815f820180546117fe9061303d565b80601f016020809104026020016040519081016040528092919081815260200182805461182a9061303d565b80156118755780601f1061184c57610100808354040283529160200191611875565b820191905f5260205f20905b81548152906001019060200180831161185857829003601f168201915b5050505050815260200160018201805461188e9061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546118ba9061303d565b80156119055780601f106118dc57610100808354040283529160200191611905565b820191905f5260205f20905b8154815290600101906020018083116118e857829003601f168201915b5050505050815260200160028201805461191e9061303d565b80601f016020809104026020016040519081016040528092919081815260200182805461194a9061303d565b80156119955780601f1061196c57610100808354040283529160200191611995565b820191905f5260205f20905b81548152906001019060200180831161197857829003601f168201915b505050918352505060038201546001600160a01b031660208201526004820180546040909201916119c59061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546119f19061303d565b8015611a3c5780601f10611a1357610100808354040283529160200191611a3c565b820191905f5260205f20905b815481529060010190602001808311611a1f57829003601f168201915b50505091835250506005919091015460209182015281519082015160408301516060840151608085015160a090950151939d929c50909a509850919650945092505050565b6009546001600160a01b03163314611aab5760405162461bcd60e51b815260040161046b90612fda565b62051615811115611b0a5760405162461bcd60e51b8152602060048201526024808201527f4665652070657263656e746167652063616e6e6f74206578636565642033332c6044820152633333332560e01b606482015260840161046b565b60088190556040518181527f03f98616ec62d83e2c04df10d90f9760c157d6a00a06481856e648d20151dddd9060200160405180910390a150565b600b5460ff1615611b905760405162461bcd60e51b8152602060048201526015602482015274536574757020616c72656164792063616c6c65642160581b604482015260640161046b565b600980546001600160a01b0319163390811790915543600c8190556040519081527f9e4bd02b115dd3cb5ad86085de76fc3f2d3f9ea0b557c054c2d9cbdce10390139060200160405180910390a2600b805460ff19166001179055565b5f8181526007602090815260408083208151610120810183528154815260018201546001600160a01b031693810193909352600281018054859485948594859485949192840191611c3d9061303d565b80601f0160208091040260200160405190810160405280929190818152602001828054611c699061303d565b8015611cb45780601f10611c8b57610100808354040283529160200191611cb4565b820191905f5260205f20905b815481529060010190602001808311611c9757829003601f168201915b50505050508152602001600382018054611ccd9061303d565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf99061303d565b8015611d445780601f10611d1b57610100808354040283529160200191611d44565b820191905f5260205f20905b815481529060010190602001808311611d2757829003601f168201915b505050918352505060048201546020820152600582015460ff8082161515604084015261010090910416151560608201526006820154608082015260079091015460a09091015280519091505f03611dde5760405162461bcd60e51b815260206004820152601760248201527f506f736974696f6e20646f6573206e6f74206578697374000000000000000000604482015260640161046b565b5f611dec82604001516107db565b90505f8113611e365760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b210383934b1b2903337b9103830b4b960511b604482015260640161046b565b60e0820151611e459082613469565b9650611e70604051806040016040528060078152602001661155548bd554d160ca1b81525088612953565b9550611e9b6040518060400160405280600781526020016611d0940bd554d160ca1b81525088612953565b9450611ec66040518060400160405280600781526020016610d2118bd554d160ca1b81525088612953565b9350611ef16040518060400160405280600781526020016610d3964bd554d160ca1b81525088612953565b9250505091939590929450565b5f805b6001545f54611f10919061349f565b811015611f80575f600a611f238361282d565b604051611f309190613256565b90815260200160405180910390209050838051906020012081600401604051611f599190613075565b604051809103902003611f7757610b76815f01805461149e9061303d565b50600101611f01565b5060405162461bcd60e51b815260206004820152601260248201527110db185cdcc81251081b9bdd08199bdd5b9960721b604482015260640161046b565b84845f600a83604051611fd19190613256565b90815260200160405180910390206040518060c00160405290815f82018054611ff99061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546120259061303d565b80156120705780601f1061204757610100808354040283529160200191612070565b820191905f5260205f20905b81548152906001019060200180831161205357829003601f168201915b505050505081526020016001820180546120899061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546120b59061303d565b80156121005780601f106120d757610100808354040283529160200191612100565b820191905f5260205f20905b8154815290600101906020018083116120e357829003601f168201915b505050505081526020016002820180546121199061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546121459061303d565b80156121905780601f1061216757610100808354040283529160200191612190565b820191905f5260205f20905b81548152906001019060200180831161217357829003601f168201915b505050918352505060038201546001600160a01b031660208201526004820180546040909201916121c09061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546121ec9061303d565b80156122375780601f1061220e57610100808354040283529160200191612237565b820191905f5260205f20905b81548152906001019060200180831161221a57829003601f168201915b5050505050815260200160058201548152505090508180519060200120816080015180519060200120146122ad5760405162461bcd60e51b815260206004820152601860248201527f496e76616c69642070616972206f7220636c6173732049440000000000000000604482015260640161046b565b600b54610100900460ff16156122d55760405162461bcd60e51b815260040161046b90613011565b600d5460ff16156123195760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b604482015260640161046b565b600d805460ff191660011790556004548510156123715760405162461bcd60e51b815260206004820152601660248201527554696d657374616d7020697320746f6f206561726c7960501b604482015260640161046b565b428511156123c15760405162461bcd60e51b815260206004820152601f60248201527f4675747572652074696d657374616d70206973206e6f7420616c6c6f77656400604482015260640161046b565b5f84116123e05760405162461bcd60e51b815260040161046b906134b2565b5f6123ea896107db565b90505f81136124345760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b210383934b1b2903337b9103830b4b960511b604482015260640161046b565b61243d85612aae565b5f60065f815461244c906132bc565b918290555060408051610120810182528281523360208083019182528284018f8152606084018f9052608084018d90528d151560a0850152600160c0850181905260e085018d905261010085018990525f87815260079093529490912083518155915193820180546001600160a01b0319166001600160a01b039095169490941790935591519293509160028201906124e59082613396565b50606082015160038201906124fa9082613396565b506080820151600482015560a082015160058201805460c085015161ffff1990911692151561ff00191692909217610100921515830217905560e0830151600683015590910151600790910155604051339082907f81c9b58c22d0dd1b08d4012816ff5b2e54cf4388c6cd0ee81655f1df4223f2ac90612581908e908e908d908f906134fd565b60405180910390a35050600d805460ff191690555050505050505050565b6009546001600160a01b031633146125c95760405162461bcd60e51b815260040161046b90612fda565b6003546001600160a01b03166126215760405162461bcd60e51b815260206004820152601d60248201527f44656661756c742074726164696e6720746f6b656e206e6f7420736574000000604482015260640161046b565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b039091169081906323b872dd906064016020604051808303815f875af1158015612677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061269b9190613212565b6126b75760405162461bcd60e51b815260040161046b9061322d565b60405182815233907f253960ffd8f7153d1c32bebbc91c25fb77e4b85a0d19b07f9190701168cbadc59060200160405180910390a25050565b6009546001600160a01b0316331461271a5760405162461bcd60e51b815260040161046b90612fda565b600455565b6060600e805461272e9061303d565b80601f016020809104026020016040519081016040528092919081815260200182805461275a9061303d565b80156127a55780601f1061277c576101008083540402835291602001916127a5565b820191905f5260205f20905b81548152906001019060200180831161278857829003601f168201915b5050505050905090565b5f8181805b8251811015612825578281815181106127cf576127cf61353a565b01602001516001600160f81b031916602f60f81b0361281d5781806127f2575080155b806128095750600183516128069190613456565b81145b1561281857505f949350505050565b600191505b6001016127b4565b509392505050565b6060815f036128535750506040805180820190915260018152600360fc1b602082015290565b815f5b811561287c5780612866816132bc565b91506128759050600a83613480565b9150612856565b5f8167ffffffffffffffff81111561289657612896612bea565b6040519080825280601f01601f1916602001820160405280156128c0576020820181803683370190505b509050815b851561294a576128d6600182613456565b90505f6128e4600a88613480565b6128ef90600a613469565b6128f99088613456565b61290490603061354e565b90505f8160f81b9050808484815181106129205761292061353a565b60200101906001600160f81b03191690815f1a905350612941600a89613480565b975050506128c5565b50949350505050565b5f806005846040516129659190613256565b908152604051908190036020019020546001600160a01b03169050806129db5760405162461bcd60e51b815260206004820152602560248201527f4f7261636c65206e6f742073657420666f7220746869732063757272656e6379604482015264103830b4b960d91b606482015260840161046b565b5f8190505f816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a4091906131fb565b90505f8113612a895760405162461bcd60e51b8152602060048201526015602482015274496e76616c69642065786368616e6765207261746560581b604482015260640161046b565b6305f5e100612a988287613469565b612aa29190613480565b93505050505b92915050565b5f8111612acd5760405162461bcd60e51b815260040161046b906134b2565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b039091169081906323b872dd906064016020604051808303815f875af1158015612b23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b479190613212565b612b635760405162461bcd60e51b815260040161046b9061322d565b5050565b5f8060208385031215612b78575f80fd5b823567ffffffffffffffff80821115612b8f575f80fd5b818501915085601f830112612ba2575f80fd5b813581811115612bb0575f80fd5b866020828501011115612bc1575f80fd5b60209290920196919550909350505050565b5f60208284031215612be3575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612c0d575f80fd5b813567ffffffffffffffff80821115612c2857612c28612bea565b604051601f8301601f19908116603f01168101908282118183101715612c5057612c50612bea565b81604052838152866020858801011115612c68575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215612c97575f80fd5b813567ffffffffffffffff811115612cad575f80fd5b610b7684828501612bfe565b80356001600160a01b0381168114612ccf575f80fd5b919050565b5f8060408385031215612ce5575f80fd5b823567ffffffffffffffff811115612cfb575f80fd5b612d0785828601612bfe565b925050612d1660208401612cb9565b90509250929050565b5f8060408385031215612d30575f80fd5b612d3983612cb9565b9150612d1660208401612cb9565b8015158114612d54575f80fd5b50565b5f805f805f60a08688031215612d6b575f80fd5b853567ffffffffffffffff80821115612d82575f80fd5b612d8e89838a01612bfe565b96506020880135915080821115612da3575f80fd5b612daf89838a01612bfe565b95506040880135915080821115612dc4575f80fd5b50612dd188828901612bfe565b935050612de060608701612cb9565b91506080860135612df081612d47565b809150509295509295909350565b5f5b83811015612e18578181015183820152602001612e00565b50505f910152565b5f8151808452612e37816020860160208601612dfe565b601f01601f19169290920160200192915050565b8981526001600160a01b0389166020820152610120604082018190525f90612e758382018b612e20565b90508281036060840152612e89818a612e20565b6080840198909852505093151560a085015291151560c084015260e083015261010090910152949350505050565b60c081525f612ec960c0830189612e20565b8281036020840152612edb8189612e20565b90508281036040840152612eef8188612e20565b6001600160a01b038716606085015283810360808501529050612f128186612e20565b9150508260a0830152979650505050505050565b5f805f805f60a08688031215612f3a575f80fd5b853567ffffffffffffffff80821115612f51575f80fd5b612f5d89838a01612bfe565b96506020880135915080821115612f72575f80fd5b50612f7f88828901612bfe565b9450506040860135612f9081612d47565b94979396509394606081013594506080013592915050565b5f60208284031215612fb8575f80fd5b612fc182612cb9565b9392505050565b602081525f612fc16020830184612e20565b60208082526017908201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b600181811c9082168061305157607f821691505b60208210810361306f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f8083546130828161303d565b6001828116801561309a57600181146130af576130db565b60ff19841687528215158302870194506130db565b875f526020805f205f5b858110156130d25781548a8201529084019082016130b9565b50505082870194505b50929695505050505050565b818382375f9101908152919050565b601f82111561053e57805f5260205f20601f840160051c8101602085101561311b5750805b601f840160051c820191505b8181101561313a575f8155600101613127565b5050505050565b67ffffffffffffffff83111561315957613159612bea565b61316d83613167835461303d565b836130f6565b5f601f84116001811461319e575f85156131875750838201355b5f19600387901b1c1916600186901b17835561313a565b5f83815260208120601f198716915b828110156131cd57868501358255602094850194600190920191016131ad565b50868210156131e9575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f6020828403121561320b575f80fd5b5051919050565b5f60208284031215613222575f80fd5b8151612fc181612d47565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b5f8251613267818460208701612dfe565b9190910192915050565b6020808252601d908201527f4f7261636c6520616464726573732063616e6e6f74206265207a65726f000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b5f600182016132cd576132cd6132a8565b5060010190565b604160f81b81525f82516132ef816001850160208701612dfe565b9190910160010192915050565b602160f91b81525f82516132ef816001850160208701612dfe565b5f8751613328818460208c01612dfe565b87519083019061333c818360208c01612dfe565b875191019061334f818360208b01612dfe565b606087901b6bffffffffffffffffffffffff1916910190815284151560f81b60148201528351613386816015840160208801612dfe565b0160150198975050505050505050565b815167ffffffffffffffff8111156133b0576133b0612bea565b6133c4816133be845461303d565b846130f6565b602080601f8311600181146133f7575f84156133e05750858301515b5f19600386901b1c1916600185901b17855561344e565b5f85815260208120601f198616915b8281101561342557888601518255948401946001909101908401613406565b508582101561344257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b81810381811115612aa857612aa86132a8565b8082028115828204841417612aa857612aa86132a8565b5f8261349a57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115612aa857612aa86132a8565b6020808252602b908201527f436f6c6c61746572616c20616d6f756e74206d7573742062652067726561746560408201526a72207468616e207a65726f60a81b606082015260800190565b608081525f61350f6080830187612e20565b82810360208401526135218187612e20565b6040840195909552505090151560609091015292915050565b634e487b7160e01b5f52603260045260245ffd5b60ff8181168382160190811115612aa857612aa86132a856fea2646970667358221220f431c9f00d32614ae915e4f2ecb94b1a3bb0baa1dab13257283ba4b618cb7a9d64736f6c63430008170033

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106101d1575f3560e01c80639ecceb5e116100fe578063c5d80c7d1161009e578063e3601e341161006e578063e3601e34146103e6578063eaf92c52146103ee578063edbfe0a014610419578063f5f5ba721461042c575f80fd5b8063c5d80c7d14610372578063c9efe435146103ad578063d5ae5e11146103c0578063d7fdc664146103d3575f80fd5b8063a58aba8f116100d9578063a58aba8f14610322578063b0ca3d0114610347578063b187bd261461035a578063ba0bba401461036a575f80fd5b80639ecceb5e146102d05780639f40d0cd146102f8578063a126d6011461030f575f80fd5b80636a333fe61161017457806381aafcfb1161014457806381aafcfb146102915780638456cb59146102a4578063893d20e8146102ac5780638dcdd021146102bd575f80fd5b80636a333fe61461025b5780636b49bac7146102635780637808cf1d1461026b5780637dc851e51461027e575f80fd5b806329c1a991116101af57806329c1a991146102145780633f4ba83a1461021b5780633fd5376b14610223578063524f388914610248575f80fd5b80630b5ee006146101d55780630ee87df0146101ea5780631da58d1714610201575b5f80fd5b6101e86101e3366004612b67565b610441565b005b6004545b6040519081526020015b60405180910390f35b6101e861020f366004612bd3565b610543565b5f546101ee565b6101e8610754565b6003546001600160a01b03165b6040516001600160a01b0390911681526020016101f8565b6101ee610256366004612c87565b6107db565b6006546101ee565b6001546101ee565b6101e8610279366004612cd4565b610b7e565b6101e861028c366004612d1f565b610c12565b61023061029f366004612c87565b610d30565b6101e8610d60565b6009546001600160a01b0316610230565b6101e86102cb366004612d57565b610dc3565b6102e36102de366004612bd3565b611037565b6040516101f899989796959493929190612e4b565b600b5460ff165b60405190151581526020016101f8565b6101e861031d366004612bd3565b611258565b610335610330366004612c87565b6117bc565b6040516101f896959493929190612eb7565b6101e8610355366004612bd3565b611a81565b600b54610100900460ff166102ff565b6101e8611b45565b610385610380366004612bd3565b611bed565b604080519586526020860194909452928401919091526060830152608082015260a0016101f8565b6101ee6103bb366004612c87565b611efe565b6101e86103ce366004612f26565b611fbe565b6101e86103e1366004612bd3565b61259f565b6008546101ee565b6102306103fc366004612fa8565b6001600160a01b039081165f908152600260205260409020541690565b6101e8610427366004612bd3565b6126f0565b61043461271f565b6040516101f89190612fc8565b6009546001600160a01b031633146104745760405162461bcd60e51b815260040161046b90612fda565b60405180910390fd5b600b54610100900460ff161561049c5760405162461bcd60e51b815260040161046b90613011565b600e6040516104ab9190613075565b604051809103902082826040516104c39291906130e7565b6040518091039020036105315760405162461bcd60e51b815260206004820152603060248201527f4e6577206e616d65206d75737420626520646966666572656e742066726f6d2060448201526f7468652063757272656e74206e616d6560801b606482015260840161046b565b600e61053e828483613141565b505050565b6009546001600160a01b0316331461056d5760405162461bcd60e51b815260040161046b90612fda565b6003546001600160a01b03166105c55760405162461bcd60e51b815260206004820152601d60248201527f44656661756c742074726164696e6720746f6b656e206e6f7420736574000000604482015260640161046b565b6003546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa15801561060f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063391906131fb565b9050828110156106905760405162461bcd60e51b815260206004820152602260248201527f496e73756666696369656e742066756e647320696e2074686520636f6e74726160448201526118dd60f21b606482015260840161046b565b60405163a9059cbb60e01b8152336004820152602481018490526001600160a01b0383169063a9059cbb906044016020604051808303815f875af11580156106da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fe9190613212565b61071a5760405162461bcd60e51b815260040161046b9061322d565b60405183815233907f438a789ddecb040a37bde559b416983cda42b06c5b3ea44d10c0178046a16ecf9060200160405180910390a2505050565b6009546001600160a01b0316331461077e5760405162461bcd60e51b815260040161046b90612fda565b600b54610100900460ff166107ce5760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9858dd081a5cc81b9bdd081c185d5cd95960521b604482015260640161046b565b600b805461ff0019169055565b5f80600a836040516107ed9190613256565b90815260200160405180910390206040518060c00160405290815f820180546108159061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546108419061303d565b801561088c5780601f106108635761010080835404028352916020019161088c565b820191905f5260205f20905b81548152906001019060200180831161086f57829003601f168201915b505050505081526020016001820180546108a59061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546108d19061303d565b801561091c5780601f106108f35761010080835404028352916020019161091c565b820191905f5260205f20905b8154815290600101906020018083116108ff57829003601f168201915b505050505081526020016002820180546109359061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546109619061303d565b80156109ac5780601f10610983576101008083540402835291602001916109ac565b820191905f5260205f20905b81548152906001019060200180831161098f57829003601f168201915b505050918352505060038201546001600160a01b031660208201526004820180546040909201916109dc9061303d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a089061303d565b8015610a535780601f10610a2a57610100808354040283529160200191610a53565b820191905f5260205f20905b815481529060010190602001808311610a3657829003601f168201915b50505091835250506005919091015460209091015260608101519091506001600160a01b0316610ac55760405162461bcd60e51b815260206004820152601c60248201527f4f7261636c65206e6f742073657420666f722074686973207061697200000000604482015260640161046b565b5f816060015190505f816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2e91906131fb565b9050805f03610b765760405162461bcd60e51b815260206004820152601460248201527350726963652063616e6e6f74206265207a65726f60601b604482015260640161046b565b949350505050565b6009546001600160a01b03163314610ba85760405162461bcd60e51b815260040161046b90612fda565b6001600160a01b038116610bce5760405162461bcd60e51b815260040161046b90613271565b80600583604051610bdf9190613256565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050565b6009546001600160a01b03163314610c3c5760405162461bcd60e51b815260040161046b90612fda565b6001600160a01b038216610c925760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20616464726573732063616e6e6f74206265207a65726f00000000604482015260640161046b565b6001600160a01b038116610cb85760405162461bcd60e51b815260040161046b90613271565b6001600160a01b038281165f8181526002602090815260409182902080546001600160a01b0319908116958716958617909155600380549091168417905581519283528201929092527fe3221c1fb11e1e628cffc07406d7a01ba973ccb9b0a072bfee6fa81885503730910160405180910390a15050565b5f600582604051610d419190613256565b908152604051908190036020019020546001600160a01b031692915050565b6009546001600160a01b03163314610d8a5760405162461bcd60e51b815260040161046b90612fda565b600b54610100900460ff1615610db25760405162461bcd60e51b815260040161046b90613011565b600b805461ff001916610100179055565b6009546001600160a01b03163314610ded5760405162461bcd60e51b815260040161046b90612fda565b6001600160a01b038216610e135760405162461bcd60e51b815260040161046b90613271565b610e1c856127af565b610e685760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420706169722073796d626f6c20666f726d6174000000000000604482015260640161046b565b60608115610eb057610e8a5f808154610e80906132bc565b918290555061282d565b604051602001610e9a91906132d4565b6040516020818303038152906040529050610ee3565b610ec160015f8154610e80906132bc565b604051602001610ed191906132fc565b60405160208183030381529060405290505b5f868686868686604051602001610eff96959493929190613317565b6040516020818303038152906040528051906020012090506040518060c00160405280888152602001878152602001868152602001856001600160a01b0316815260200183815260200182815250600a88604051610f5d9190613256565b90815260405190819003602001902081518190610f7a9082613396565b5060208201516001820190610f8f9082613396565b5060408201516002820190610fa49082613396565b5060608201516003820180546001600160a01b0319166001600160a01b0390921691909117905560808201516004820190610fdf9082613396565b5060a082015181600501559050507f48c10220a820dc38d7fdcbdb6fb08a378782327e9c59d5d943ed496d2ecdd1e487878787868660405161102696959493929190612eb7565b60405180910390a150505050505050565b5f806060805f805f805f8060075f8c81526020019081526020015f20604051806101200160405290815f8201548152602001600182015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016002820180546110a69061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546110d29061303d565b801561111d5780601f106110f45761010080835404028352916020019161111d565b820191905f5260205f20905b81548152906001019060200180831161110057829003601f168201915b505050505081526020016003820180546111369061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546111629061303d565b80156111ad5780601f10611184576101008083540402835291602001916111ad565b820191905f5260205f20905b81548152906001019060200180831161119057829003601f168201915b5050505050815260200160048201548152602001600582015f9054906101000a900460ff161515151581526020016005820160019054906101000a900460ff16151515158152602001600682015481526020016007820154815250509050805f015181602001518260400151836060015184608001518560a001518660c001518760e00151886101000151995099509950995099509950995099509950509193959799909294969850565b600b54610100900460ff16156112805760405162461bcd60e51b815260040161046b90613011565b600d5460ff16156112c45760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b604482015260640161046b565b600d805460ff191660019081179091555f828152600760205260409020908101546001600160a01b0316331461134b5760405162461bcd60e51b815260206004820152602660248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320706f60448201526539b4ba34b7b760d11b606482015260840161046b565b6005810154610100900460ff166113a45760405162461bcd60e51b815260206004820152601a60248201527f506f736974696f6e20697320616c726561647920636c6f736564000000000000604482015260640161046b565b80600401544210156114135760405162461bcd60e51b815260206004820152603260248201527f506f736974696f6e2063616e6e6f7420626520636c6f736564206265666f7265604482015271020697473207365742074696d657374616d760741b606482015260840161046b565b60045442101561148b5760405162461bcd60e51b815260206004820152603f60248201527f506f736974696f6e2063616e6e6f7420626520636c6f736564206265666f726560448201527f206d696e696d756d2074696d657374616d7020736574206279206f776e657200606482015260840161046b565b5f61151f82600201805461149e9061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546114ca9061303d565b80156115155780601f106114ec57610100808354040283529160200191611515565b820191905f5260205f20905b8154815290600101906020018083116114f857829003601f168201915b50505050506107db565b90505f81136115705760405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063757272656e7420707269636520666f7220706169720000604482015260640161046b565b60058201545f90819060ff161561158f57836007015483119150611599565b8360070154831091505b811561160e5760078401545f906115b08186613456565b86600601546115bf9190613469565b6115c99190613480565b90505f620f4240600854836115de9190613469565b6115e89190613480565b9050808287600601546115fb919061349f565b6116059190613456565b92505050611611565b505f5b60058401805461ff0019169055801561176c576003546040516370a0823160e01b81523060048201526001600160a01b0390911690829082906370a0823190602401602060405180830381865afa15801561166e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061169291906131fb565b10156116e05760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e6365000000604482015260640161046b565b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0382169063a9059cbb906044016020604051808303815f875af115801561172a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061174e9190613212565b61176a5760405162461bcd60e51b815260040161046b9061322d565b505b60408051831515815260208101839052339187917f9e65723e6c7acb1f0a5433ac5cb04c672922b9ea7458668112e59a3148a4a59e910160405180910390a35050600d805460ff19169055505050565b60608060605f60605f80600a886040516117d69190613256565b90815260200160405180910390206040518060c00160405290815f820180546117fe9061303d565b80601f016020809104026020016040519081016040528092919081815260200182805461182a9061303d565b80156118755780601f1061184c57610100808354040283529160200191611875565b820191905f5260205f20905b81548152906001019060200180831161185857829003601f168201915b5050505050815260200160018201805461188e9061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546118ba9061303d565b80156119055780601f106118dc57610100808354040283529160200191611905565b820191905f5260205f20905b8154815290600101906020018083116118e857829003601f168201915b5050505050815260200160028201805461191e9061303d565b80601f016020809104026020016040519081016040528092919081815260200182805461194a9061303d565b80156119955780601f1061196c57610100808354040283529160200191611995565b820191905f5260205f20905b81548152906001019060200180831161197857829003601f168201915b505050918352505060038201546001600160a01b031660208201526004820180546040909201916119c59061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546119f19061303d565b8015611a3c5780601f10611a1357610100808354040283529160200191611a3c565b820191905f5260205f20905b815481529060010190602001808311611a1f57829003601f168201915b50505091835250506005919091015460209182015281519082015160408301516060840151608085015160a090950151939d929c50909a509850919650945092505050565b6009546001600160a01b03163314611aab5760405162461bcd60e51b815260040161046b90612fda565b62051615811115611b0a5760405162461bcd60e51b8152602060048201526024808201527f4665652070657263656e746167652063616e6e6f74206578636565642033332c6044820152633333332560e01b606482015260840161046b565b60088190556040518181527f03f98616ec62d83e2c04df10d90f9760c157d6a00a06481856e648d20151dddd9060200160405180910390a150565b600b5460ff1615611b905760405162461bcd60e51b8152602060048201526015602482015274536574757020616c72656164792063616c6c65642160581b604482015260640161046b565b600980546001600160a01b0319163390811790915543600c8190556040519081527f9e4bd02b115dd3cb5ad86085de76fc3f2d3f9ea0b557c054c2d9cbdce10390139060200160405180910390a2600b805460ff19166001179055565b5f8181526007602090815260408083208151610120810183528154815260018201546001600160a01b031693810193909352600281018054859485948594859485949192840191611c3d9061303d565b80601f0160208091040260200160405190810160405280929190818152602001828054611c699061303d565b8015611cb45780601f10611c8b57610100808354040283529160200191611cb4565b820191905f5260205f20905b815481529060010190602001808311611c9757829003601f168201915b50505050508152602001600382018054611ccd9061303d565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf99061303d565b8015611d445780601f10611d1b57610100808354040283529160200191611d44565b820191905f5260205f20905b815481529060010190602001808311611d2757829003601f168201915b505050918352505060048201546020820152600582015460ff8082161515604084015261010090910416151560608201526006820154608082015260079091015460a09091015280519091505f03611dde5760405162461bcd60e51b815260206004820152601760248201527f506f736974696f6e20646f6573206e6f74206578697374000000000000000000604482015260640161046b565b5f611dec82604001516107db565b90505f8113611e365760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b210383934b1b2903337b9103830b4b960511b604482015260640161046b565b60e0820151611e459082613469565b9650611e70604051806040016040528060078152602001661155548bd554d160ca1b81525088612953565b9550611e9b6040518060400160405280600781526020016611d0940bd554d160ca1b81525088612953565b9450611ec66040518060400160405280600781526020016610d2118bd554d160ca1b81525088612953565b9350611ef16040518060400160405280600781526020016610d3964bd554d160ca1b81525088612953565b9250505091939590929450565b5f805b6001545f54611f10919061349f565b811015611f80575f600a611f238361282d565b604051611f309190613256565b90815260200160405180910390209050838051906020012081600401604051611f599190613075565b604051809103902003611f7757610b76815f01805461149e9061303d565b50600101611f01565b5060405162461bcd60e51b815260206004820152601260248201527110db185cdcc81251081b9bdd08199bdd5b9960721b604482015260640161046b565b84845f600a83604051611fd19190613256565b90815260200160405180910390206040518060c00160405290815f82018054611ff99061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546120259061303d565b80156120705780601f1061204757610100808354040283529160200191612070565b820191905f5260205f20905b81548152906001019060200180831161205357829003601f168201915b505050505081526020016001820180546120899061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546120b59061303d565b80156121005780601f106120d757610100808354040283529160200191612100565b820191905f5260205f20905b8154815290600101906020018083116120e357829003601f168201915b505050505081526020016002820180546121199061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546121459061303d565b80156121905780601f1061216757610100808354040283529160200191612190565b820191905f5260205f20905b81548152906001019060200180831161217357829003601f168201915b505050918352505060038201546001600160a01b031660208201526004820180546040909201916121c09061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546121ec9061303d565b80156122375780601f1061220e57610100808354040283529160200191612237565b820191905f5260205f20905b81548152906001019060200180831161221a57829003601f168201915b5050505050815260200160058201548152505090508180519060200120816080015180519060200120146122ad5760405162461bcd60e51b815260206004820152601860248201527f496e76616c69642070616972206f7220636c6173732049440000000000000000604482015260640161046b565b600b54610100900460ff16156122d55760405162461bcd60e51b815260040161046b90613011565b600d5460ff16156123195760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b604482015260640161046b565b600d805460ff191660011790556004548510156123715760405162461bcd60e51b815260206004820152601660248201527554696d657374616d7020697320746f6f206561726c7960501b604482015260640161046b565b428511156123c15760405162461bcd60e51b815260206004820152601f60248201527f4675747572652074696d657374616d70206973206e6f7420616c6c6f77656400604482015260640161046b565b5f84116123e05760405162461bcd60e51b815260040161046b906134b2565b5f6123ea896107db565b90505f81136124345760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b210383934b1b2903337b9103830b4b960511b604482015260640161046b565b61243d85612aae565b5f60065f815461244c906132bc565b918290555060408051610120810182528281523360208083019182528284018f8152606084018f9052608084018d90528d151560a0850152600160c0850181905260e085018d905261010085018990525f87815260079093529490912083518155915193820180546001600160a01b0319166001600160a01b039095169490941790935591519293509160028201906124e59082613396565b50606082015160038201906124fa9082613396565b506080820151600482015560a082015160058201805460c085015161ffff1990911692151561ff00191692909217610100921515830217905560e0830151600683015590910151600790910155604051339082907f81c9b58c22d0dd1b08d4012816ff5b2e54cf4388c6cd0ee81655f1df4223f2ac90612581908e908e908d908f906134fd565b60405180910390a35050600d805460ff191690555050505050505050565b6009546001600160a01b031633146125c95760405162461bcd60e51b815260040161046b90612fda565b6003546001600160a01b03166126215760405162461bcd60e51b815260206004820152601d60248201527f44656661756c742074726164696e6720746f6b656e206e6f7420736574000000604482015260640161046b565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b039091169081906323b872dd906064016020604051808303815f875af1158015612677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061269b9190613212565b6126b75760405162461bcd60e51b815260040161046b9061322d565b60405182815233907f253960ffd8f7153d1c32bebbc91c25fb77e4b85a0d19b07f9190701168cbadc59060200160405180910390a25050565b6009546001600160a01b0316331461271a5760405162461bcd60e51b815260040161046b90612fda565b600455565b6060600e805461272e9061303d565b80601f016020809104026020016040519081016040528092919081815260200182805461275a9061303d565b80156127a55780601f1061277c576101008083540402835291602001916127a5565b820191905f5260205f20905b81548152906001019060200180831161278857829003601f168201915b5050505050905090565b5f8181805b8251811015612825578281815181106127cf576127cf61353a565b01602001516001600160f81b031916602f60f81b0361281d5781806127f2575080155b806128095750600183516128069190613456565b81145b1561281857505f949350505050565b600191505b6001016127b4565b509392505050565b6060815f036128535750506040805180820190915260018152600360fc1b602082015290565b815f5b811561287c5780612866816132bc565b91506128759050600a83613480565b9150612856565b5f8167ffffffffffffffff81111561289657612896612bea565b6040519080825280601f01601f1916602001820160405280156128c0576020820181803683370190505b509050815b851561294a576128d6600182613456565b90505f6128e4600a88613480565b6128ef90600a613469565b6128f99088613456565b61290490603061354e565b90505f8160f81b9050808484815181106129205761292061353a565b60200101906001600160f81b03191690815f1a905350612941600a89613480565b975050506128c5565b50949350505050565b5f806005846040516129659190613256565b908152604051908190036020019020546001600160a01b03169050806129db5760405162461bcd60e51b815260206004820152602560248201527f4f7261636c65206e6f742073657420666f7220746869732063757272656e6379604482015264103830b4b960d91b606482015260840161046b565b5f8190505f816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a4091906131fb565b90505f8113612a895760405162461bcd60e51b8152602060048201526015602482015274496e76616c69642065786368616e6765207261746560581b604482015260640161046b565b6305f5e100612a988287613469565b612aa29190613480565b93505050505b92915050565b5f8111612acd5760405162461bcd60e51b815260040161046b906134b2565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b039091169081906323b872dd906064016020604051808303815f875af1158015612b23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b479190613212565b612b635760405162461bcd60e51b815260040161046b9061322d565b5050565b5f8060208385031215612b78575f80fd5b823567ffffffffffffffff80821115612b8f575f80fd5b818501915085601f830112612ba2575f80fd5b813581811115612bb0575f80fd5b866020828501011115612bc1575f80fd5b60209290920196919550909350505050565b5f60208284031215612be3575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612c0d575f80fd5b813567ffffffffffffffff80821115612c2857612c28612bea565b604051601f8301601f19908116603f01168101908282118183101715612c5057612c50612bea565b81604052838152866020858801011115612c68575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215612c97575f80fd5b813567ffffffffffffffff811115612cad575f80fd5b610b7684828501612bfe565b80356001600160a01b0381168114612ccf575f80fd5b919050565b5f8060408385031215612ce5575f80fd5b823567ffffffffffffffff811115612cfb575f80fd5b612d0785828601612bfe565b925050612d1660208401612cb9565b90509250929050565b5f8060408385031215612d30575f80fd5b612d3983612cb9565b9150612d1660208401612cb9565b8015158114612d54575f80fd5b50565b5f805f805f60a08688031215612d6b575f80fd5b853567ffffffffffffffff80821115612d82575f80fd5b612d8e89838a01612bfe565b96506020880135915080821115612da3575f80fd5b612daf89838a01612bfe565b95506040880135915080821115612dc4575f80fd5b50612dd188828901612bfe565b935050612de060608701612cb9565b91506080860135612df081612d47565b809150509295509295909350565b5f5b83811015612e18578181015183820152602001612e00565b50505f910152565b5f8151808452612e37816020860160208601612dfe565b601f01601f19169290920160200192915050565b8981526001600160a01b0389166020820152610120604082018190525f90612e758382018b612e20565b90508281036060840152612e89818a612e20565b6080840198909852505093151560a085015291151560c084015260e083015261010090910152949350505050565b60c081525f612ec960c0830189612e20565b8281036020840152612edb8189612e20565b90508281036040840152612eef8188612e20565b6001600160a01b038716606085015283810360808501529050612f128186612e20565b9150508260a0830152979650505050505050565b5f805f805f60a08688031215612f3a575f80fd5b853567ffffffffffffffff80821115612f51575f80fd5b612f5d89838a01612bfe565b96506020880135915080821115612f72575f80fd5b50612f7f88828901612bfe565b9450506040860135612f9081612d47565b94979396509394606081013594506080013592915050565b5f60208284031215612fb8575f80fd5b612fc182612cb9565b9392505050565b602081525f612fc16020830184612e20565b60208082526017908201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b600181811c9082168061305157607f821691505b60208210810361306f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f8083546130828161303d565b6001828116801561309a57600181146130af576130db565b60ff19841687528215158302870194506130db565b875f526020805f205f5b858110156130d25781548a8201529084019082016130b9565b50505082870194505b50929695505050505050565b818382375f9101908152919050565b601f82111561053e57805f5260205f20601f840160051c8101602085101561311b5750805b601f840160051c820191505b8181101561313a575f8155600101613127565b5050505050565b67ffffffffffffffff83111561315957613159612bea565b61316d83613167835461303d565b836130f6565b5f601f84116001811461319e575f85156131875750838201355b5f19600387901b1c1916600186901b17835561313a565b5f83815260208120601f198716915b828110156131cd57868501358255602094850194600190920191016131ad565b50868210156131e9575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f6020828403121561320b575f80fd5b5051919050565b5f60208284031215613222575f80fd5b8151612fc181612d47565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b5f8251613267818460208701612dfe565b9190910192915050565b6020808252601d908201527f4f7261636c6520616464726573732063616e6e6f74206265207a65726f000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b5f600182016132cd576132cd6132a8565b5060010190565b604160f81b81525f82516132ef816001850160208701612dfe565b9190910160010192915050565b602160f91b81525f82516132ef816001850160208701612dfe565b5f8751613328818460208c01612dfe565b87519083019061333c818360208c01612dfe565b875191019061334f818360208b01612dfe565b606087901b6bffffffffffffffffffffffff1916910190815284151560f81b60148201528351613386816015840160208801612dfe565b0160150198975050505050505050565b815167ffffffffffffffff8111156133b0576133b0612bea565b6133c4816133be845461303d565b846130f6565b602080601f8311600181146133f7575f84156133e05750858301515b5f19600386901b1c1916600185901b17855561344e565b5f85815260208120601f198616915b8281101561342557888601518255948401946001909101908401613406565b508582101561344257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b81810381811115612aa857612aa86132a8565b8082028115828204841417612aa857612aa86132a8565b5f8261349a57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115612aa857612aa86132a8565b6020808252602b908201527f436f6c6c61746572616c20616d6f756e74206d7573742062652067726561746560408201526a72207468616e207a65726f60a81b606082015260800190565b608081525f61350f6080830187612e20565b82810360208401526135218187612e20565b6040840195909552505090151560609091015292915050565b634e487b7160e01b5f52603260045260245ffd5b60ff8181168382160190811115612aa857612aa86132a856fea2646970667358221220f431c9f00d32614ae915e4f2ecb94b1a3bb0baa1dab13257283ba4b618cb7a9d64736f6c63430008170033

Deployed Bytecode Sourcemap

1607:28242:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12249:307;;;;;;:::i;:::-;;:::i;:::-;;10229:103;10308:16;;10229:103;;;757:25:1;;;745:2;730:18;10229:103:0;;;;;;;;28562:518;;;;;;:::i;:::-;;:::i;9107:102::-;9160:4;9184:17;9107:102;;13058:122;;;:::i;9994:109::-;10076:19;;-1:-1:-1;;;;;10076:19:0;9994:109;;;-1:-1:-1;;;;;1142:32:1;;;1124:51;;1112:2;1097:18;9994:109:0;978:203:1;24618:412:0;;;;;;:::i;:::-;;:::i;10807:101::-;10885:15;;10807:101;;9340:96;9414:14;;9340:96;;17938:231;;;;;;:::i;:::-;;:::i;23876:451::-;;;;;;:::i;:::-;;:::i;10541:132::-;;;;;;:::i;:::-;;:::i;12739:118::-;;;:::i;11266:81::-;11334:5;;-1:-1:-1;;;;;11334:5:0;11266:81;;26185:933;;;;;;:::i;:::-;;:::i;7787:559::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;11521:82::-;11588:7;;;;11521:82;;;6123:14:1;;6116:22;6098:41;;6086:2;6071:18;11521:82:0;5958:187:1;21503:1945:0;;;;;;:::i;:::-;;:::i;8497:473::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;20411:294::-;;;;;;:::i;:::-;;:::i;11703:80::-;11768:7;;;;;;;11703:80;;11975:156;;;:::i;18619:763::-;;;;;;:::i;:::-;;:::i;:::-;;;;7295:25:1;;;7351:2;7336:18;;7329:34;;;;7379:18;;;7372:34;;;;7437:2;7422:18;;7415:34;7480:3;7465:19;;7458:35;7282:3;7267:19;18619:763:0;7036:463:1;25322:438:0;;;;;;:::i;:::-;;:::i;16528:1152::-;;;;;;:::i;:::-;;:::i;28002:384::-;;;;;;:::i;:::-;;:::i;11033:109::-;11115:19;;11033:109;;9675:156;;;;;;:::i;:::-;-1:-1:-1;;;;;9783:40:0;;;9756:7;9783:40;;;:26;:40;;;;;;;;9675:156;15031:114;;;;;;:::i;:::-;;:::i;7529:101::-;;;:::i;:::-;;;;;;;:::i;12249:307::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;;;;;;;;;6968:7:::1;::::0;::::1;::::0;::::1;;;6967:8;6959:39;;;;-1:-1:-1::0;;;6959:39:0::1;;;;;;;:::i;:::-;12390:12:::2;12374:30;;;;;;:::i;:::-;;;;;;;;12363:5;;12347:23;;;;;;;:::i;:::-;;;;;;;;:57:::0;12339:118:::2;;;::::0;-1:-1:-1;;;12339:118:0;;11276:2:1;12339:118:0::2;::::0;::::2;11258:21:1::0;11315:2;11295:18;;;11288:30;11354:34;11334:18;;;11327:62;-1:-1:-1;;;11405:18:1;;;11398:46;11461:19;;12339:118:0::2;11074:412:1::0;12339:118:0::2;12528:12;:20;12543:5:::0;;12528:12;:20:::2;:::i;:::-;;12249:307:::0;;:::o;28562:518::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;28651:19:::1;::::0;-1:-1:-1;;;;;28651:19:0::1;28643:75;;;::::0;-1:-1:-1;;;28643:75:0;;13593:2:1;28643:75:0::1;::::0;::::1;13575:21:1::0;13632:2;13612:18;;;13605:30;13671:31;13651:18;;;13644:59;13720:18;;28643:75:0::1;13391:353:1::0;28643:75:0::1;28753:19;::::0;28810:30:::1;::::0;-1:-1:-1;;;28810:30:0;;28834:4:::1;28810:30;::::0;::::1;1124:51:1::0;-1:-1:-1;;;;;28753:19:0;;::::1;::::0;28731:12:::1;::::0;28753:19;;28810:15:::1;::::0;1097:18:1;;28810:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28784:56;;28878:6;28859:15;:25;;28851:72;;;::::0;-1:-1:-1;;;28851:72:0;;14140:2:1;28851:72:0::1;::::0;::::1;14122:21:1::0;14179:2;14159:18;;;14152:30;14218:34;14198:18;;;14191:62;-1:-1:-1;;;14269:18:1;;;14262:32;14311:19;;28851:72:0::1;13938:398:1::0;28851:72:0::1;28952:34;::::0;-1:-1:-1;;;28952:34:0;;28967:10:::1;28952:34;::::0;::::1;14515:51:1::0;14582:18;;;14575:34;;;-1:-1:-1;;;;;28952:14:0;::::1;::::0;::::1;::::0;14488:18:1;;28952:34:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28944:62;;;;-1:-1:-1::0;;;28944:62:0::1;;;;;;;:::i;:::-;29024:48;::::0;757:25:1;;;29053:10:0::1;::::0;29024:48:::1;::::0;745:2:1;730:18;29024:48:0::1;;;;;;;28632:448;;28562:518:::0;:::o;13058:122::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;7261:7:::1;::::0;::::1;::::0;::::1;;;7253:42;;;::::0;-1:-1:-1;;;7253:42:0;;15416:2:1;7253:42:0::1;::::0;::::1;15398:21:1::0;15455:2;15435:18;;;15428:30;-1:-1:-1;;;15474:18:1;;;15467:52;15536:18;;7253:42:0::1;15214:346:1::0;7253:42:0::1;13116:7:::2;:15:::0;;-1:-1:-1;;13116:15:0::2;::::0;;13058:122::o;24618:412::-;24677:6;24696:26;24725:10;24736:4;24725:16;;;;;;:::i;:::-;;;;;;;;;;;;;24696:45;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24696:45:0;;;-1:-1:-1;;24696:45:0;;;;-1:-1:-1;;;;;24696:45:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24696:45:0;;;-1:-1:-1;;24696:45:0;;;;;;;;;;;24760:23;;;;24696:45;;-1:-1:-1;;;;;;24760:37:0;24752:78;;;;-1:-1:-1;;;24752:78:0;;16061:2:1;24752:78:0;;;16043:21:1;16100:2;16080:18;;;16073:30;16139;16119:18;;;16112:58;16187:18;;24752:78:0;15859:352:1;24752:78:0;24841:18;24874:9;:23;;;24841:57;;24909:12;24924:6;-1:-1:-1;;;;;24924:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24909:36;;24964:5;24973:1;24964:10;24956:43;;;;-1:-1:-1;;;24956:43:0;;16606:2:1;24956:43:0;;;16588:21:1;16645:2;16625:18;;;16618:30;-1:-1:-1;;;16664:18:1;;;16657:50;16724:18;;24956:43:0;16404:344:1;24956:43:0;25017:5;24618:412;-1:-1:-1;;;;24618:412:0:o;17938:231::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18048:27:0;::::1;18040:69;;;;-1:-1:-1::0;;;18040:69:0::1;;;;;;;:::i;:::-;18148:13;18120:15;18136:8;18120:25;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:41;;-1:-1:-1;;;;;18120:41:0;;;::::1;-1:-1:-1::0;;;;;;18120:41:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;17938:231:0:o;23876:451::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23989:26:0;::::1;23981:67;;;::::0;-1:-1:-1;;;23981:67:0;;17313:2:1;23981:67:0::1;::::0;::::1;17295:21:1::0;17352:2;17332:18;;;17325:30;17391;17371:18;;;17364:58;17439:18;;23981:67:0::1;17111:352:1::0;23981:67:0::1;-1:-1:-1::0;;;;;24067:27:0;::::1;24059:69;;;;-1:-1:-1::0;;;24059:69:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24141:40:0;;::::1;;::::0;;;:26:::1;:40;::::0;;;;;;;;:56;;-1:-1:-1;;;;;;24141:56:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;24208:19:::1;:34:::0;;;;::::1;::::0;::::1;::::0;;24258:61;;17680:34:1;;;17730:18;;17723:43;;;;24258:61:0::1;::::0;17615:18:1;24258:61:0::1;;;;;;;23876:451:::0;;:::o;10541:132::-;10613:7;10640:15;10656:8;10640:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;10640:25:0;;10541:132;-1:-1:-1;;10541:132:0:o;12739:118::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;6968:7:::1;::::0;::::1;::::0;::::1;;;6967:8;6959:39;;;;-1:-1:-1::0;;;6959:39:0::1;;;;;;;:::i;:::-;12798:7:::2;:14:::0;;-1:-1:-1;;12798:14:0::2;;;::::0;;12739:118::o;26185:933::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26361:27:0;::::1;26353:69;;;;-1:-1:-1::0;;;26353:69:0::1;;;;;;;:::i;:::-;26441:29;26459:10;26441:17;:29::i;:::-;26433:68;;;::::0;-1:-1:-1;;;26433:68:0;;17979:2:1;26433:68:0::1;::::0;::::1;17961:21:1::0;18018:2;17998:18;;;17991:30;18057:28;18037:18;;;18030:56;18103:18;;26433:68:0::1;17777:350:1::0;26433:68:0::1;26514:21;26550:14;26546:225;;;26620:33;26635:17;::::0;26633:19:::1;;;;;:::i;:::-;::::0;;;;-1:-1:-1;26620:12:0::1;:33::i;:::-;26598:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;26581:74;;26546:225;;;26727:30;26742:14;;26740:16;;;;;:::i;26727:30::-;26705:53;;;;;;;;:::i;:::-;;;;;;;;;;;;;26688:71;;26546:225;26783:16;26829:10;26841:8;26851;26861:13;26876:14;26892:7;26812:88;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26802:99;;;;;;26783:118;;26939:75;;;;;;;;26949:10;26939:75;;;;26961:8;26939:75;;;;26971:8;26939:75;;;;26981:13;-1:-1:-1::0;;;;;26939:75:0::1;;;;;26996:7;26939:75;;;;27005:8;26939:75;;::::0;26914:10:::1;26925;26914:22;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:100;;:22;;:100:::1;::::0;:22;:100:::1;:::i;:::-;-1:-1:-1::0;26914:100:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;26914:100:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;26914:100:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;26914:100:0::1;-1:-1:-1::0;;;;;26914:100:0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;;;;;;;;;;;;;27030:80;27045:10;27057:8;27067;27077:13;27092:7;27101:8;27030:80;;;;;;;;;;;:::i;:::-;;;;;;;;26342:776;;26185:933:::0;;;;;:::o;7787:559::-;7866:7;7875;7884:13;7899;7914:7;7923:4;7929;7935:7;7944;7970:24;7997:9;:21;8007:10;7997:21;;;;;;;;;;;7970:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7970:48:0;-1:-1:-1;;;;;7970:48:0;-1:-1:-1;;;;;7970:48:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8051:8;:19;;;8085:8;:15;;;8115:8;:19;;;8149:8;:16;;;8180:8;:18;;;8213:8;:15;;;8243:8;:15;;;8273:8;:19;;;8307:8;:20;;;8029:309;;;;;;;;;;;;;;;;;;;7787:559;;;;;;;;;;;:::o;21503:1945::-;6968:7;;;;;;;6967:8;6959:39;;;;-1:-1:-1;;;6959:39:0;;;;;;;:::i;:::-;6383:6:::1;::::0;::::1;;6382:7;6374:34;;;::::0;-1:-1:-1;;;6374:34:0;;21956:2:1;6374:34:0::1;::::0;::::1;21938:21:1::0;21995:2;21975:18;;;21968:30;-1:-1:-1;;;22014:18:1;;;22007:44;22068:18;;6374:34:0::1;21754:338:1::0;6374:34:0::1;6419:6;:13:::0;;-1:-1:-1;;6419:13:0::1;6428:4;6419:13:::0;;::::1;::::0;;;:6:::1;21619:21:::0;;;:9:::2;:21;::::0;;;;21691:15;;::::2;::::0;-1:-1:-1;;;;;21691:15:0::2;21710:10;21691:29;21683:80;;;::::0;-1:-1:-1;;;21683:80:0;;22299:2:1;21683:80:0::2;::::0;::::2;22281:21:1::0;22338:2;22318:18;;;22311:30;22377:34;22357:18;;;22350:62;-1:-1:-1;;;22428:18:1;;;22421:36;22474:19;;21683:80:0::2;22097:402:1::0;21683:80:0::2;21782:15;::::0;::::2;::::0;::::2;::::0;::::2;;;21774:54;;;::::0;-1:-1:-1;;;21774:54:0;;22706:2:1;21774:54:0::2;::::0;::::2;22688:21:1::0;22745:2;22725:18;;;22718:30;22784:28;22764:18;;;22757:56;22830:18;;21774:54:0::2;22504:350:1::0;21774:54:0::2;21866:8;:18;;;21847:15;:37;;21839:100;;;::::0;-1:-1:-1;;;21839:100:0;;23061:2:1;21839:100:0::2;::::0;::::2;23043:21:1::0;23100:2;23080:18;;;23073:30;23139:34;23119:18;;;23112:62;-1:-1:-1;;;23190:18:1;;;23183:48;23248:19;;21839:100:0::2;22859:414:1::0;21839:100:0::2;21977:16;;21958:15;:35;;21950:111;;;::::0;-1:-1:-1;;;21950:111:0;;23480:2:1;21950:111:0::2;::::0;::::2;23462:21:1::0;23519:2;23499:18;;;23492:30;23558:34;23538:18;;;23531:62;23629:33;23609:18;;;23602:61;23680:19;;21950:111:0::2;23278:427:1::0;21950:111:0::2;22121:19;22143:29;22152:8;:19;;22143:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:29::i;:::-;22121:51;;22206:1;22191:12;:16;22183:59;;;::::0;-1:-1:-1;;;22183:59:0;;23912:2:1;22183:59:0::2;::::0;::::2;23894:21:1::0;23951:2;23931:18;;;23924:30;23990:32;23970:18;;;23963:60;24040:18;;22183:59:0::2;23710:354:1::0;22183:59:0::2;22380:15;::::0;::::2;::::0;22255:18:::2;::::0;;;22380:15:::2;;22376:201;;;22452:8;:20;;;22436:12;22428:44;22412:60;;22376:201;;;22545:8;:20;;;22529:12;22521:44;22505:60;;22376:201;22593:13;22589:403;;;22717:20;::::0;::::2;::::0;22623:19:::2;::::0;22669:44:::2;22717:20:::0;22677:12;22669:44:::2;:::i;:::-;22646:8;:19;;;:68;;;;:::i;:::-;:91;;;;:::i;:::-;22623:115;;22753:11;22803:7;22781:19;;22767:11;:33;;;;:::i;:::-;:43;;;;:::i;:::-;22753:57;;22897:3;22883:11;22861:8;:19;;;:33;;;;:::i;:::-;:39;;;;:::i;:::-;22844:56;;22608:304;;22589:403;;;-1:-1:-1::0;22950:1:0::2;22589:403;23035:15;::::0;::::2;:23:::0;;-1:-1:-1;;23035:23:0::2;::::0;;23075:18;;23071:283:::2;;23132:19;::::0;23175:30:::2;::::0;-1:-1:-1;;;23175:30:0;;23199:4:::2;23175:30;::::0;::::2;1124:51:1::0;-1:-1:-1;;;;;23132:19:0;;::::2;::::0;23209:14;;23132:19;;23175:15:::2;::::0;1097:18:1;;23175:30:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;23167:90;;;::::0;-1:-1:-1;;;23167:90:0;;24929:2:1;23167:90:0::2;::::0;::::2;24911:21:1::0;24968:2;24948:18;;;24941:30;25007:31;24987:18;;;24980:59;25056:18;;23167:90:0::2;24727:353:1::0;23167:90:0::2;23280:42;::::0;-1:-1:-1;;;23280:42:0;;23295:10:::2;23280:42;::::0;::::2;14515:51:1::0;14582:18;;;14575:34;;;-1:-1:-1;;;;;23280:14:0;::::2;::::0;::::2;::::0;14488:18:1;;23280:42:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23272:70;;;;-1:-1:-1::0;;;23272:70:0::2;;;;;;;:::i;:::-;23095:259;23071:283;23371:69;::::0;;25278:14:1;;25271:22;25253:41;;25325:2;25310:18;;25303:34;;;23398:10:0::2;::::0;23386;;23371:69:::2;::::0;25226:18:1;23371:69:0::2;;;;;;;-1:-1:-1::0;;6455:6:0::1;:14:::0;;-1:-1:-1;;6455:14:0::1;::::0;;-1:-1:-1;;;21503:1945:0:o;8497:473::-;8583:13;8598;8613;8628:7;8637:13;8652:7;8678:26;8707:10;8718;8707:22;;;;;;:::i;:::-;;;;;;;;;;;;;8678:51;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8678:51:0;;;-1:-1:-1;;8678:51:0;;;;-1:-1:-1;;;;;8678:51:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8678:51:0;;;-1:-1:-1;;8678:51:0;;;;;;;;;;;8762:20;;8797:18;;;;8830;;;;8863:23;;;;8901:17;;;;8933:18;;;;;8762:20;;8797:18;;-1:-1:-1;8830:18:0;;-1:-1:-1;8863:23:0;-1:-1:-1;8901:17:0;;-1:-1:-1;8933:18:0;-1:-1:-1;8497:473:0;-1:-1:-1;;;8497:473:0:o;20411:294::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;20533:6:::1;20509:20;:30;;20501:79;;;::::0;-1:-1:-1;;;20501:79:0;;25550:2:1;20501:79:0::1;::::0;::::1;25532:21:1::0;25589:2;25569:18;;;25562:30;25628:34;25608:18;;;25601:62;-1:-1:-1;;;25679:18:1;;;25672:34;25723:19;;20501:79:0::1;25348:400:1::0;20501:79:0::1;20591:19;:42:::0;;;20649:48:::1;::::0;757:25:1;;;20649:48:0::1;::::0;745:2:1;730:18;20649:48:0::1;;;;;;;20411:294:::0;:::o;11975:156::-;6639:7;;;;6638:8;6630:42;;;;-1:-1:-1;;;6630:42:0;;25955:2:1;6630:42:0;;;25937:21:1;25994:2;25974:18;;;25967:30;-1:-1:-1;;;26013:18:1;;;26006:51;26074:18;;6630:42:0;25753:345:1;6630:42:0;12020:5:::1;:18:::0;;-1:-1:-1;;;;;;12020:18:0::1;12028:10;12020:18:::0;;::::1;::::0;;;12062:12:::1;12049:10;:25:::0;;;12090:33:::1;::::0;757:25:1;;;12090:33:0::1;::::0;745:2:1;730:18;12090:33:0::1;;;;;;;6695:7:::0;:14;;-1:-1:-1;;6695:14:0;6705:4;6695:14;;;11975:156::o;18619:763::-;18698:18;18836:21;;;:9;:21;;;;;;;;18809:48;;;;;;;;;;;;;;;-1:-1:-1;;;;;18809:48:0;;;;;;;;;;;;;18698:18;;;;;;;;;;18836:21;;18809:48;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18809:48:0;;;-1:-1:-1;;18809:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18876:19;;18809:48;;-1:-1:-1;;18876:24:0;18868:60;;;;-1:-1:-1;;;18868:60:0;;26305:2:1;18868:60:0;;;26287:21:1;26344:2;26324:18;;;26317:30;26383:25;26363:18;;;26356:53;26426:18;;18868:60:0;26103:347:1;18868:60:0;18941:20;18964:29;18973:8;:19;;;18964:8;:29::i;:::-;18941:52;;19028:1;19012:13;:17;19004:52;;;;-1:-1:-1;;;19004:52:0;;26657:2:1;19004:52:0;;;26639:21:1;26696:2;26676:18;;;26669:30;-1:-1:-1;;;26715:18:1;;;26708:52;26777:18;;19004:52:0;26455:346:1;19004:52:0;19105:19;;;;19080:44;;19088:13;19080:44;:::i;:::-;19067:57;;19150:38;;;;;;;;;;;;;;-1:-1:-1;;;19150:38:0;;;19177:10;19150:15;:38::i;:::-;19137:51;;19212:38;;;;;;;;;;;;;;-1:-1:-1;;;19212:38:0;;;19239:10;19212:15;:38::i;:::-;19199:51;;19274:38;;;;;;;;;;;;;;-1:-1:-1;;;19274:38:0;;;19301:10;19274:15;:38::i;:::-;19261:51;;19336:38;;;;;;;;;;;;;;-1:-1:-1;;;19336:38:0;;;19363:10;19336:15;:38::i;:::-;19323:51;;18798:584;;18619:763;;;;;;;:::o;25322:438::-;25393:6;;25412:302;25453:14;;25433:17;;:34;;;;:::i;:::-;25429:1;:38;25412:302;;;25489:27;25519:10;25530:15;25543:1;25530:12;:15::i;:::-;25519:27;;;;;;:::i;:::-;;;;;;;;;;;;;25489:57;;25620:7;25604:25;;;;;;25581:9;:17;;25565:35;;;;;;:::i;:::-;;;;;;;;:64;25561:142;;25657:30;25666:9;:20;;25657:30;;;;;:::i;25561:142::-;-1:-1:-1;25469:3:0;;25412:302;;;-1:-1:-1;25724:28:0;;-1:-1:-1;;;25724:28:0;;27008:2:1;25724:28:0;;;26990:21:1;27047:2;27027:18;;;27020:30;-1:-1:-1;;;27066:18:1;;;27059:48;27124:18;;25724:28:0;26806:342:1;16528:1152:0;16680:10;16692:7;6014:21;6038:10;6049;6038:22;;;;;;:::i;:::-;;;;;;;;;;;;;6014:46;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6014:46:0;;;-1:-1:-1;;6014:46:0;;;;-1:-1:-1;;;;;6014:46:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6143:7;6127:25;;;;;;6109:4;:12;;;6093:30;;;;;;:59;6071:133;;;;-1:-1:-1;;;6071:133:0;;27355:2:1;6071:133:0;;;27337:21:1;27394:2;27374:18;;;27367:30;27433:26;27413:18;;;27406:54;27477:18;;6071:133:0;27153:348:1;6071:133:0;6968:7:::1;::::0;::::1;::::0;::::1;;;6967:8;6959:39;;;;-1:-1:-1::0;;;6959:39:0::1;;;;;;;:::i;:::-;6383:6:::2;::::0;::::2;;6382:7;6374:34;;;::::0;-1:-1:-1;;;6374:34:0;;21956:2:1;6374:34:0::2;::::0;::::2;21938:21:1::0;21995:2;21975:18;;;21968:30;-1:-1:-1;;;22014:18:1;;;22007:44;22068:18;;6374:34:0::2;21754:338:1::0;6374:34:0::2;6419:6;:13:::0;;-1:-1:-1;;6419:13:0::2;6428:4;6419:13;::::0;;16760:16:::3;::::0;16747:29;::::3;;16739:64;;;::::0;-1:-1:-1;;;16739:64:0;;27708:2:1;16739:64:0::3;::::0;::::3;27690:21:1::0;27747:2;27727:18;;;27720:30;-1:-1:-1;;;27766:18:1;;;27759:52;27828:18;;16739:64:0::3;27506:346:1::0;16739:64:0::3;16835:15;16822:9;:28;;16814:72;;;::::0;-1:-1:-1;;;16814:72:0;;28059:2:1;16814:72:0::3;::::0;::::3;28041:21:1::0;28098:2;28078:18;;;28071:30;28137:33;28117:18;;;28110:61;28188:18;;16814:72:0::3;27857:355:1::0;16814:72:0::3;16924:1;16905:16;:20;16897:76;;;;-1:-1:-1::0;;;16897:76:0::3;;;;;;;:::i;:::-;16986:18;17007:20;17016:10;17007:8;:20::i;:::-;16986:41;;17060:1;17046:11;:15;17038:50;;;::::0;-1:-1:-1;;;17038:50:0;;26657:2:1;17038:50:0::3;::::0;::::3;26639:21:1::0;26696:2;26676:18;;;26669:30;-1:-1:-1;;;26715:18:1;;;26708:52;26777:18;;17038:50:0::3;26455:346:1::0;17038:50:0::3;17101:35;17119:16;17101:17;:35::i;:::-;17149:21;17175:15;;17173:17;;;;;:::i;:::-;::::0;;;;-1:-1:-1;17228:344:0::3;::::0;;::::3;::::0;::::3;::::0;;;;;17300:10:::3;17228:344;::::0;;::::3;::::0;;;;;;;;;;;;;;;;;;;;;;::::3;;::::0;;;;17465:4:::3;17228:344:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;17201:24:0;;;:9:::3;:24:::0;;;;;;;:371;;;;;;;;::::3;::::0;;-1:-1:-1;;;;;;17201:371:0::3;-1:-1:-1::0;;;;;17201:371:0;;::::3;::::0;;;::::3;::::0;;;;;17173:17;;-1:-1:-1;17228:344:0;17201:371:::3;::::0;::::3;::::0;::::3;::::0;;::::3;:::i;:::-;-1:-1:-1::0;17201:371:0::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;;::::3;:::i;:::-;-1:-1:-1::0;17201:371:0::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;;::::3;::::0;::::3;::::0;-1:-1:-1;;17201:371:0;;;;::::3;;-1:-1:-1::0;;17201:371:0;;;;;::::3;::::0;::::3;;::::0;::::3;;::::0;;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;;;::::3;::::0;::::3;::::0;;::::3;::::0;17590:82:::3;::::0;17621:10:::3;::::0;17606:13;;17590:82:::3;::::0;::::3;::::0;17633:10;;17645:7;;17654:9;;17665:6;;17590:82:::3;:::i;:::-;;;;;;;;-1:-1:-1::0;;6455:6:0::2;:14:::0;;-1:-1:-1;;6455:14:0::2;::::0;;-1:-1:-1;;;;;;;;16528:1152:0:o;28002:384::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;28090:19:::1;::::0;-1:-1:-1;;;;;28090:19:0::1;28082:75;;;::::0;-1:-1:-1;;;28082:75:0;;13593:2:1;28082:75:0::1;::::0;::::1;13575:21:1::0;13632:2;13612:18;;;13605:30;13671:31;13651:18;;;13644:59;13720:18;;28082:75:0::1;13391:353:1::0;28082:75:0::1;28200:19;::::0;28239:53:::1;::::0;-1:-1:-1;;;28239:53:0;;28258:10:::1;28239:53;::::0;::::1;29411:34:1::0;28278:4:0::1;29461:18:1::0;;;29454:43;29513:18;;;29506:34;;;-1:-1:-1;;;;;28200:19:0;;::::1;::::0;;;28239:18:::1;::::0;29346::1;;28239:53:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28231:81;;;;-1:-1:-1::0;;;28231:81:0::1;;;;;;;:::i;:::-;28330:48;::::0;757:25:1;;;28359:10:0::1;::::0;28330:48:::1;::::0;745:2:1;730:18;28330:48:0::1;;;;;;;28071:315;28002:384:::0;:::o;15031:114::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;15108:16:::1;:29:::0;15031:114::o;7529:101::-;7577:13;7610:12;7603:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7529:101;:::o;27337:490::-;27408:4;27458:6;27408:4;;27512:278;27532:11;:18;27528:1;:22;27512:278;;;27575:11;27587:1;27575:14;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;27575:14:0;-1:-1:-1;;;27575:21:0;27572:207;;27620:10;:20;;;-1:-1:-1;27634:6:0;;27620:20;:51;;;;27670:1;27649:11;:18;:22;;;;:::i;:::-;27644:1;:27;27620:51;27617:111;;;-1:-1:-1;27703:5:0;;27337:490;-1:-1:-1;;;;27337:490:0:o;27617:111::-;27759:4;27746:17;;27572:207;27552:3;;27512:278;;;-1:-1:-1;27809:10:0;27337:490;-1:-1:-1;;;27337:490:0:o;29287:559::-;29339:17;29373:1;29378;29373:6;29369:49;;-1:-1:-1;;29396:10:0;;;;;;;;;;;;-1:-1:-1;;;29396:10:0;;;;;29287:559::o;29369:49::-;29437:1;29428:6;29468:69;29475:6;;29468:69;;29498:5;;;;:::i;:::-;;-1:-1:-1;29518:7:0;;-1:-1:-1;29523:2:0;29518:7;;:::i;:::-;;;29468:69;;;29547:17;29577:3;29567:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29567:14:0;-1:-1:-1;29547:34:0;-1:-1:-1;29601:3:0;29615:194;29622:6;;29615:194;;29649:3;29651:1;29649;:3;:::i;:::-;29645:7;-1:-1:-1;29667:10:0;29696:6;29700:2;29696:1;:6;:::i;:::-;:11;;29705:2;29696:11;:::i;:::-;29692:15;;:1;:15;:::i;:::-;29681:27;;:2;:27;:::i;:::-;29667:42;;29724:9;29743:4;29736:12;;29724:24;;29773:2;29763:4;29768:1;29763:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;29763:12:0;;;;;;;;-1:-1:-1;29790:7:0;29795:2;29790:7;;:::i;:::-;;;29630:179;;29615:194;;;-1:-1:-1;29833:4:0;29287:559;-1:-1:-1;;;;29287:559:0:o;19730:503::-;19826:7;19846:21;19870:15;19886:12;19870:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;19870:29:0;;-1:-1:-1;19870:29:0;19910:77;;;;-1:-1:-1;;;19910:77:0;;30038:2:1;19910:77:0;;;30020:21:1;30077:2;30057:18;;;30050:30;30116:34;30096:18;;;30089:62;-1:-1:-1;;;30167:18:1;;;30160:35;30212:19;;19910:77:0;29836:401:1;19910:77:0;20000:18;20033:13;20000:47;;20058:19;20080:6;-1:-1:-1;;;;;20080:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20058:43;;20135:1;20120:12;:16;20112:50;;;;-1:-1:-1;;;20112:50:0;;30444:2:1;20112:50:0;;;30426:21:1;30483:2;30463:18;;;30456:30;-1:-1:-1;;;30502:18:1;;;30495:51;30563:18;;20112:50:0;30242:345:1;20112:50:0;20222:3;20183:35;20205:12;20183:11;:35;:::i;:::-;20182:43;;;;:::i;:::-;20175:50;;;;;19730:503;;;;;:::o;15495:282::-;15575:1;15566:6;:10;15558:66;;;;-1:-1:-1;;;15558:66:0;;;;;;;:::i;:::-;15657:19;;15696:53;;-1:-1:-1;;;15696:53:0;;15715:10;15696:53;;;29411:34:1;15735:4:0;29461:18:1;;;29454:43;29513:18;;;29506:34;;;-1:-1:-1;;;;;15657:19:0;;;;;;15696:18;;29346::1;;15696:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15688:81;;;;-1:-1:-1;;;15688:81:0;;;;;;;:::i;:::-;15547:230;15495:282;:::o;14:592:1:-;85:6;93;146:2;134:9;125:7;121:23;117:32;114:52;;;162:1;159;152:12;114:52;202:9;189:23;231:18;272:2;264:6;261:14;258:34;;;288:1;285;278:12;258:34;326:6;315:9;311:22;301:32;;371:7;364:4;360:2;356:13;352:27;342:55;;393:1;390;383:12;342:55;433:2;420:16;459:2;451:6;448:14;445:34;;;475:1;472;465:12;445:34;520:7;515:2;506:6;502:2;498:15;494:24;491:37;488:57;;;541:1;538;531:12;488:57;572:2;564:11;;;;;594:6;;-1:-1:-1;14:592:1;;-1:-1:-1;;;;14:592:1:o;793:180::-;852:6;905:2;893:9;884:7;880:23;876:32;873:52;;;921:1;918;911:12;873:52;-1:-1:-1;944:23:1;;793:180;-1:-1:-1;793:180:1:o;1186:127::-;1247:10;1242:3;1238:20;1235:1;1228:31;1278:4;1275:1;1268:15;1302:4;1299:1;1292:15;1318:719;1361:5;1414:3;1407:4;1399:6;1395:17;1391:27;1381:55;;1432:1;1429;1422:12;1381:55;1468:6;1455:20;1494:18;1531:2;1527;1524:10;1521:36;;;1537:18;;:::i;:::-;1612:2;1606:9;1580:2;1666:13;;-1:-1:-1;;1662:22:1;;;1686:2;1658:31;1654:40;1642:53;;;1710:18;;;1730:22;;;1707:46;1704:72;;;1756:18;;:::i;:::-;1796:10;1792:2;1785:22;1831:2;1823:6;1816:18;1877:3;1870:4;1865:2;1857:6;1853:15;1849:26;1846:35;1843:55;;;1894:1;1891;1884:12;1843:55;1958:2;1951:4;1943:6;1939:17;1932:4;1924:6;1920:17;1907:54;2005:1;1998:4;1993:2;1985:6;1981:15;1977:26;1970:37;2025:6;2016:15;;;;;;1318:719;;;;:::o;2042:322::-;2111:6;2164:2;2152:9;2143:7;2139:23;2135:32;2132:52;;;2180:1;2177;2170:12;2132:52;2220:9;2207:23;2253:18;2245:6;2242:30;2239:50;;;2285:1;2282;2275:12;2239:50;2308;2350:7;2341:6;2330:9;2326:22;2308:50;:::i;2549:173::-;2617:20;;-1:-1:-1;;;;;2666:31:1;;2656:42;;2646:70;;2712:1;2709;2702:12;2646:70;2549:173;;;:::o;2727:396::-;2805:6;2813;2866:2;2854:9;2845:7;2841:23;2837:32;2834:52;;;2882:1;2879;2872:12;2834:52;2922:9;2909:23;2955:18;2947:6;2944:30;2941:50;;;2987:1;2984;2977:12;2941:50;3010;3052:7;3043:6;3032:9;3028:22;3010:50;:::i;:::-;3000:60;;;3079:38;3113:2;3102:9;3098:18;3079:38;:::i;:::-;3069:48;;2727:396;;;;;:::o;3128:260::-;3196:6;3204;3257:2;3245:9;3236:7;3232:23;3228:32;3225:52;;;3273:1;3270;3263:12;3225:52;3296:29;3315:9;3296:29;:::i;:::-;3286:39;;3344:38;3378:2;3367:9;3363:18;3344:38;:::i;3393:118::-;3479:5;3472:13;3465:21;3458:5;3455:32;3445:60;;3501:1;3498;3491:12;3445:60;3393:118;:::o;3516:948::-;3638:6;3646;3654;3662;3670;3723:3;3711:9;3702:7;3698:23;3694:33;3691:53;;;3740:1;3737;3730:12;3691:53;3780:9;3767:23;3809:18;3850:2;3842:6;3839:14;3836:34;;;3866:1;3863;3856:12;3836:34;3889:50;3931:7;3922:6;3911:9;3907:22;3889:50;:::i;:::-;3879:60;;3992:2;3981:9;3977:18;3964:32;3948:48;;4021:2;4011:8;4008:16;4005:36;;;4037:1;4034;4027:12;4005:36;4060:52;4104:7;4093:8;4082:9;4078:24;4060:52;:::i;:::-;4050:62;;4165:2;4154:9;4150:18;4137:32;4121:48;;4194:2;4184:8;4181:16;4178:36;;;4210:1;4207;4200:12;4178:36;;4233:52;4277:7;4266:8;4255:9;4251:24;4233:52;:::i;:::-;4223:62;;;4304:38;4338:2;4327:9;4323:18;4304:38;:::i;:::-;4294:48;;4392:3;4381:9;4377:19;4364:33;4406:28;4428:5;4406:28;:::i;:::-;4453:5;4443:15;;;3516:948;;;;;;;;:::o;4469:250::-;4554:1;4564:113;4578:6;4575:1;4572:13;4564:113;;;4654:11;;;4648:18;4635:11;;;4628:39;4600:2;4593:10;4564:113;;;-1:-1:-1;;4711:1:1;4693:16;;4686:27;4469:250::o;4724:271::-;4766:3;4804:5;4798:12;4831:6;4826:3;4819:19;4847:76;4916:6;4909:4;4904:3;4900:14;4893:4;4886:5;4882:16;4847:76;:::i;:::-;4977:2;4956:15;-1:-1:-1;;4952:29:1;4943:39;;;;4984:4;4939:50;;4724:271;-1:-1:-1;;4724:271:1:o;5000:953::-;5385:25;;;-1:-1:-1;;;;;5446:32:1;;5441:2;5426:18;;5419:60;5373:3;5510:2;5495:18;;5488:30;;;5344:4;;5541:45;5567:18;;;5559:6;5541:45;:::i;:::-;5527:59;;5634:9;5626:6;5622:22;5617:2;5606:9;5602:18;5595:50;5662:33;5688:6;5680;5662:33;:::i;:::-;5726:3;5711:19;;5704:35;;;;-1:-1:-1;;5783:14:1;;5776:22;5770:3;5755:19;;5748:51;5843:14;;5836:22;5830:3;5815:19;;5808:51;5890:3;5875:19;;5868:35;5934:3;5919:19;;;5912:35;5654:41;5000:953;-1:-1:-1;;;;5000:953:1:o;6150:881::-;6499:3;6488:9;6481:22;6462:4;6526:46;6567:3;6556:9;6552:19;6544:6;6526:46;:::i;:::-;6620:9;6612:6;6608:22;6603:2;6592:9;6588:18;6581:50;6654:33;6680:6;6672;6654:33;:::i;:::-;6640:47;;6735:9;6727:6;6723:22;6718:2;6707:9;6703:18;6696:50;6769:33;6795:6;6787;6769:33;:::i;:::-;-1:-1:-1;;;;;6838:32:1;;6833:2;6818:18;;6811:60;6908:22;;;6902:3;6887:19;;6880:51;6755:47;-1:-1:-1;6948:33:1;6755:47;6966:6;6948:33;:::i;:::-;6940:41;;;7018:6;7012:3;7001:9;6997:19;6990:35;6150:881;;;;;;;;;:::o;7504:810::-;7616:6;7624;7632;7640;7648;7701:3;7689:9;7680:7;7676:23;7672:33;7669:53;;;7718:1;7715;7708:12;7669:53;7758:9;7745:23;7787:18;7828:2;7820:6;7817:14;7814:34;;;7844:1;7841;7834:12;7814:34;7867:50;7909:7;7900:6;7889:9;7885:22;7867:50;:::i;:::-;7857:60;;7970:2;7959:9;7955:18;7942:32;7926:48;;7999:2;7989:8;7986:16;7983:36;;;8015:1;8012;8005:12;7983:36;;8038:52;8082:7;8071:8;8060:9;8056:24;8038:52;:::i;:::-;8028:62;;;8140:2;8129:9;8125:18;8112:32;8153:28;8175:5;8153:28;:::i;:::-;7504:810;;;;-1:-1:-1;8200:5:1;;8252:2;8237:18;;8224:32;;-1:-1:-1;8303:3:1;8288:19;8275:33;;7504:810;-1:-1:-1;;7504:810:1:o;8319:186::-;8378:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:52;;;8447:1;8444;8437:12;8399:52;8470:29;8489:9;8470:29;:::i;:::-;8460:39;8319:186;-1:-1:-1;;;8319:186:1:o;8510:220::-;8659:2;8648:9;8641:21;8622:4;8679:45;8720:2;8709:9;8705:18;8697:6;8679:45;:::i;8735:347::-;8937:2;8919:21;;;8976:2;8956:18;;;8949:30;9015:25;9010:2;8995:18;;8988:53;9073:2;9058:18;;8735:347::o;9087:342::-;9289:2;9271:21;;;9328:2;9308:18;;;9301:30;-1:-1:-1;;;9362:2:1;9347:18;;9340:48;9420:2;9405:18;;9087:342::o;9434:380::-;9513:1;9509:12;;;;9556;;;9577:61;;9631:4;9623:6;9619:17;9609:27;;9577:61;9684:2;9676:6;9673:14;9653:18;9650:38;9647:161;;9730:10;9725:3;9721:20;9718:1;9711:31;9765:4;9762:1;9755:15;9793:4;9790:1;9783:15;9647:161;;9434:380;;;:::o;9948:845::-;10078:3;10107:1;10140:6;10134:13;10170:36;10196:9;10170:36;:::i;:::-;10225:1;10242:17;;;10268:133;;;;10415:1;10410:358;;;;10235:533;;10268:133;-1:-1:-1;;10301:24:1;;10289:37;;10374:14;;10367:22;10355:35;;10346:45;;;-1:-1:-1;10268:133:1;;10410:358;10441:6;10438:1;10431:17;10471:4;10516;10513:1;10503:18;10543:1;10557:165;10571:6;10568:1;10565:13;10557:165;;;10649:14;;10636:11;;;10629:35;10692:16;;;;10586:10;;10557:165;;;10561:3;;;10751:6;10746:3;10742:16;10735:23;;10235:533;-1:-1:-1;10784:3:1;;9948:845;-1:-1:-1;;;;;;9948:845:1:o;10798:271::-;10981:6;10973;10968:3;10955:33;10937:3;11007:16;;11032:13;;;11007:16;10798:271;-1:-1:-1;10798:271:1:o;11491:518::-;11593:2;11588:3;11585:11;11582:421;;;11629:5;11626:1;11619:16;11673:4;11670:1;11660:18;11743:2;11731:10;11727:19;11724:1;11720:27;11714:4;11710:38;11779:4;11767:10;11764:20;11761:47;;;-1:-1:-1;11802:4:1;11761:47;11857:2;11852:3;11848:12;11845:1;11841:20;11835:4;11831:31;11821:41;;11912:81;11930:2;11923:5;11920:13;11912:81;;;11989:1;11975:16;;11956:1;11945:13;11912:81;;;11916:3;;11491:518;;;:::o;12185:1201::-;12309:18;12304:3;12301:27;12298:53;;;12331:18;;:::i;:::-;12360:94;12450:3;12410:38;12442:4;12436:11;12410:38;:::i;:::-;12404:4;12360:94;:::i;:::-;12480:1;12505:2;12500:3;12497:11;12522:1;12517:611;;;;13172:1;13189:3;13186:93;;;-1:-1:-1;13245:19:1;;;13232:33;13186:93;-1:-1:-1;;12142:1:1;12138:11;;;12134:24;12130:29;12120:40;12166:1;12162:11;;;12117:57;13292:78;;12490:890;;12517:611;9895:1;9888:14;;;9932:4;9919:18;;-1:-1:-1;;12553:17:1;;;12671:229;12685:7;12682:1;12679:14;12671:229;;;12774:19;;;12761:33;12746:49;;12881:4;12866:20;;;;12834:1;12822:14;;;;12701:12;12671:229;;;12675:3;12928;12919:7;12916:16;12913:159;;;13052:1;13048:6;13042:3;13036;13033:1;13029:11;13025:21;13021:34;13017:39;13004:9;12999:3;12995:19;12982:33;12978:79;12970:6;12963:95;12913:159;;;13115:1;13109:3;13106:1;13102:11;13098:19;13092:4;13085:33;12490:890;;12185:1201;;;:::o;13749:184::-;13819:6;13872:2;13860:9;13851:7;13847:23;13843:32;13840:52;;;13888:1;13885;13878:12;13840:52;-1:-1:-1;13911:16:1;;13749:184;-1:-1:-1;13749:184:1:o;14620:245::-;14687:6;14740:2;14728:9;14719:7;14715:23;14711:32;14708:52;;;14756:1;14753;14746:12;14708:52;14788:9;14782:16;14807:28;14829:5;14807:28;:::i;14870:339::-;15072:2;15054:21;;;15111:2;15091:18;;;15084:30;-1:-1:-1;;;15145:2:1;15130:18;;15123:45;15200:2;15185:18;;14870:339::o;15565:289::-;15696:3;15734:6;15728:13;15750:66;15809:6;15804:3;15797:4;15789:6;15785:17;15750:66;:::i;:::-;15832:16;;;;;15565:289;-1:-1:-1;;15565:289:1:o;16753:353::-;16955:2;16937:21;;;16994:2;16974:18;;;16967:30;17033:31;17028:2;17013:18;;17006:59;17097:2;17082:18;;16753:353::o;18132:127::-;18193:10;18188:3;18184:20;18181:1;18174:31;18224:4;18221:1;18214:15;18248:4;18245:1;18238:15;18264:135;18303:3;18324:17;;;18321:43;;18344:18;;:::i;:::-;-1:-1:-1;18391:1:1;18380:13;;18264:135::o;18404:431::-;-1:-1:-1;;;18661:3:1;18654:16;18636:3;18699:6;18693:13;18715:74;18782:6;18778:1;18773:3;18769:11;18762:4;18754:6;18750:17;18715:74;:::i;:::-;18809:16;;;;18827:1;18805:24;;18404:431;-1:-1:-1;;18404:431:1:o;18840:::-;-1:-1:-1;;;19097:3:1;19090:16;19072:3;19135:6;19129:13;19151:74;19218:6;19214:1;19209:3;19205:11;19198:4;19190:6;19186:17;19151:74;:::i;19276:1120::-;19601:3;19639:6;19633:13;19655:66;19714:6;19709:3;19702:4;19694:6;19690:17;19655:66;:::i;:::-;19784:13;;19743:16;;;;19806:70;19784:13;19743:16;19853:4;19841:17;;19806:70;:::i;:::-;19943:13;;19898:20;;;19965:70;19943:13;19898:20;20012:4;20000:17;;19965:70;:::i;:::-;20108:2;20104:15;;;-1:-1:-1;;20100:53:1;20057:20;;20086:68;;;20202:14;;20195:22;20190:3;20186:32;20181:2;20170:14;;20163:56;20244:13;;20266:79;20244:13;20331:2;20320:14;;20313:4;20301:17;;20266:79;:::i;:::-;20365:20;20387:2;20361:29;;19276:1120;-1:-1:-1;;;;;;;;19276:1120:1:o;20401:1348::-;20527:3;20521:10;20554:18;20546:6;20543:30;20540:56;;;20576:18;;:::i;:::-;20605:97;20695:6;20655:38;20687:4;20681:11;20655:38;:::i;:::-;20649:4;20605:97;:::i;:::-;20757:4;;20814:2;20803:14;;20831:1;20826:666;;;;21536:1;21553:6;21550:89;;;-1:-1:-1;21605:19:1;;;21599:26;21550:89;-1:-1:-1;;12142:1:1;12138:11;;;12134:24;12130:29;12120:40;12166:1;12162:11;;;12117:57;21652:81;;20796:947;;20826:666;9895:1;9888:14;;;9932:4;9919:18;;-1:-1:-1;;20862:20:1;;;20983:236;20997:7;20994:1;20991:14;20983:236;;;21086:19;;;21080:26;21065:42;;21178:27;;;;21146:1;21134:14;;;;21013:19;;20983:236;;;20987:3;21247:6;21238:7;21235:19;21232:201;;;21308:19;;;21302:26;-1:-1:-1;;21391:1:1;21387:14;;;21403:3;21383:24;21379:37;21375:42;21360:58;21345:74;;21232:201;;;21479:1;21470:6;21467:1;21463:14;21459:22;21453:4;21446:36;20796:947;;;;;20401:1348;;:::o;24069:128::-;24136:9;;;24157:11;;;24154:37;;;24171:18;;:::i;24202:168::-;24275:9;;;24306;;24323:15;;;24317:22;;24303:37;24293:71;;24344:18;;:::i;24375:217::-;24415:1;24441;24431:132;;24485:10;24480:3;24476:20;24473:1;24466:31;24520:4;24517:1;24510:15;24548:4;24545:1;24538:15;24431:132;-1:-1:-1;24577:9:1;;24375:217::o;24597:125::-;24662:9;;;24683:10;;;24680:36;;;24696:18;;:::i;28217:407::-;28419:2;28401:21;;;28458:2;28438:18;;;28431:30;28497:34;28492:2;28477:18;;28470:62;-1:-1:-1;;;28563:2:1;28548:18;;28541:41;28614:3;28599:19;;28217:407::o;28629:537::-;28876:3;28865:9;28858:22;28839:4;28903:46;28944:3;28933:9;28929:19;28921:6;28903:46;:::i;:::-;28997:9;28989:6;28985:22;28980:2;28969:9;28965:18;28958:50;29025:33;29051:6;29043;29025:33;:::i;:::-;29089:2;29074:18;;29067:34;;;;-1:-1:-1;;29144:14:1;;29137:22;29132:2;29117:18;;;29110:50;29017:41;28629:537;-1:-1:-1;;28629:537:1:o;29551:127::-;29612:10;29607:3;29603:20;29600:1;29593:31;29643:4;29640:1;29633:15;29667:4;29664:1;29657:15;29683:148;29771:4;29750:12;;;29764;;;29746:31;;29789:13;;29786:39;;;29805:18;;:::i

Swarm Source

ipfs://f431c9f00d32614ae915e4f2ecb94b1a3bb0baa1dab13257283ba4b618cb7a9d

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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.