ETH Price: $1,985.20 (+1.73%)

Contract

0xAd47d5A59B6d1Ca4DC3EbD53693fdA7d7449f165
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Ownersh...152326272022-07-28 18:30:321319 days ago1659033032IN
0xAd47d5A5...d7449f165
0 ETH0.0009175819.20509294

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapAnchoredView

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.8.7;

import "./UniswapConfig.sol";
import "./UniswapLib.sol";
import "../Ownable.sol";
import "../Chainlink/AggregatorValidatorInterface.sol";

struct PriceData {
    uint248 price;
    bool failoverActive;
}

contract UniswapAnchoredView is
    AggregatorValidatorInterface,
    UniswapConfig,
    Ownable
{
    /// @notice The number of wei in 1 ETH
    uint256 public constant ETH_BASE_UNIT = 1e18;

    /// @notice A common scaling factor to maintain precision
    uint256 public constant EXP_SCALE = 1e18;

    /// @notice The highest ratio of the new price to the anchor price that will still trigger the price to be updated
    uint256 public immutable upperBoundAnchorRatio;

    /// @notice The lowest ratio of the new price to the anchor price that will still trigger the price to be updated
    uint256 public immutable lowerBoundAnchorRatio;

    /// @notice The time interval to search for TWAPs when calling the Uniswap V3 observe function
    uint32 public immutable anchorPeriod;

    /// @notice Official prices by symbol hash
    mapping(bytes32 => PriceData) public prices;

    /// @notice The event emitted when new prices are posted but the stored price is not updated due to the anchor
    event PriceGuarded(
        bytes32 indexed symbolHash,
        uint256 reporterPrice,
        uint256 anchorPrice
    );

    /// @notice The event emitted when the stored price is updated
    event PriceUpdated(bytes32 indexed symbolHash, uint256 price);

    /// @notice The event emitted when failover is activated
    event FailoverActivated(bytes32 indexed symbolHash);

    /// @notice The event emitted when failover is deactivated
    event FailoverDeactivated(bytes32 indexed symbolHash);

    bytes32 internal constant ETH_HASH = keccak256("ETH");

    /**
     * @notice Construct a Uniswap anchored view for a set of token configurations
     * @dev Note that to avoid immature TWAPs, the system must run for at least a single anchorPeriod before using.
     *      NOTE: Reported prices are set to 1 during construction. We assume that this contract will not be voted in by
     *      governance until prices have been updated through `validate` for each TokenConfig.
     * @param anchorToleranceMantissa_ The percentage tolerance that the reporter may deviate from the Uniswap anchor
     * @param anchorPeriod_ The minimum amount of time required for the old Uniswap price accumulator to be replaced
     * @param configs The static token configurations which define what prices are supported and how
     */
    constructor(
        uint256 anchorToleranceMantissa_,
        uint32 anchorPeriod_,
        TokenConfig[] memory configs
    ) UniswapConfig(configs) {
        require(anchorPeriod_ > 0, "Period not >0");
        anchorPeriod = anchorPeriod_;

        // Allow the tolerance to be whatever the deployer chooses, but prevent under/overflow (and prices from being 0)
        upperBoundAnchorRatio = anchorToleranceMantissa_ >
            type(uint256).max - ETH_BASE_UNIT
            ? type(uint256).max
            : ETH_BASE_UNIT + anchorToleranceMantissa_;
        lowerBoundAnchorRatio = anchorToleranceMantissa_ < ETH_BASE_UNIT
            ? ETH_BASE_UNIT - anchorToleranceMantissa_
            : 1;

        uint256 numConfigs = configs.length;
        for (uint256 i = 0; i < numConfigs; i++) {
            TokenConfig memory config = configs[i];
            require(config.baseUnit > 0, "baseUnit not >0");
            address uniswapMarket = config.uniswapMarket;
            if (config.priceSource == PriceSource.REPORTER) {
                require(uniswapMarket != address(0), "No anchor");
                require(config.reporter != address(0), "No reporter");
                bytes32 symbolHash = config.symbolHash;
                prices[symbolHash].price = 1;
            } else {
                require(uniswapMarket == address(0), "Doesnt need anchor");
                require(config.reporter == address(0), "Doesnt need reporter");
            }
        }
    }

    /**
     * @notice Get the official price for a symbol
     * @param symbol The symbol to fetch the price of
     * @return Price denominated in USD, with 6 decimals
     */
    function price(string calldata symbol) external view returns (uint256) {
        TokenConfig memory config = getTokenConfigBySymbol(symbol);
        return priceInternal(config);
    }

    function priceInternal(TokenConfig memory config)
        internal
        view
        returns (uint256)
    {
        if (config.priceSource == PriceSource.REPORTER) {
            return prices[config.symbolHash].price;
        } else if (config.priceSource == PriceSource.FIXED_USD) {
            return config.fixedPrice;
        } else {
            // config.priceSource == PriceSource.FIXED_ETH
            uint256 usdPerEth = prices[ETH_HASH].price;
            require(usdPerEth > 0, "ETH price not set");
            return FullMath.mulDiv(usdPerEth, config.fixedPrice, ETH_BASE_UNIT);
        }
    }

    /**
     * @notice Get the underlying price of a cToken, in the format expected by the Comptroller.
     * @dev Implements the PriceOracle interface for Compound v2.
     * @param cToken The cToken address for price retrieval
     * @return Price denominated in USD for the given cToken address, in the format expected by the Comptroller.
     */
    function getUnderlyingPrice(address cToken)
        external
        view
        returns (uint256)
    {
        TokenConfig memory config = getTokenConfigByUnderlying(
            CErc20(cToken).underlying()
        );
        // Comptroller needs prices in the format: ${raw price} * 1e36 / baseUnit
        // The baseUnit of an asset is the amount of the smallest denomination of that asset per whole.
        // For example, the baseUnit of ETH is 1e18.
        // Since the prices in this view have 6 decimals, we must scale them by 1e(36 - 6)/baseUnit
        return FullMath.mulDiv(1e30, priceInternal(config), config.baseUnit);
    }

    /**
     * @notice This is called by the reporter whenever a new price is posted on-chain
     * @dev called by AccessControlledOffchainAggregator
     * @param currentAnswer the price
     * @return valid bool
     */
    function validate(
        uint256, /* previousRoundId */
        int256, /* previousAnswer */
        uint256, /* currentRoundId */
        int256 currentAnswer
    ) external override returns (bool valid) {
        // NOTE: We don't do any access control on msg.sender here. The access control is done in getTokenConfigByReporter,
        // which will REVERT if an unauthorized address is passed.
        TokenConfig memory config = getTokenConfigByReporter(msg.sender);
        uint256 reportedPrice = convertReportedPrice(config, currentAnswer);
        uint256 anchorPrice = calculateAnchorPriceFromEthPrice(config);

        PriceData memory priceData = prices[config.symbolHash];
        if (priceData.failoverActive) {
            require(anchorPrice < 2**248, "Anchor too big");
            prices[config.symbolHash].price = uint248(anchorPrice);
            emit PriceUpdated(config.symbolHash, anchorPrice);
        } else if (isWithinAnchor(reportedPrice, anchorPrice)) {
            require(reportedPrice < 2**248, "Reported too big");
            prices[config.symbolHash].price = uint248(reportedPrice);
            emit PriceUpdated(config.symbolHash, reportedPrice);
            valid = true;
        } else {
            emit PriceGuarded(config.symbolHash, reportedPrice, anchorPrice);
        }
    }

    /**
     * @notice In the event that a feed is failed over to Uniswap TWAP, this function can be called
     * by anyone to update the TWAP price.
     * @dev This only works if the feed represented by the symbolHash is failed over, and will revert otherwise
     * @param symbolHash bytes32
     */
    function pokeFailedOverPrice(bytes32 symbolHash) public {
        PriceData memory priceData = prices[symbolHash];
        require(priceData.failoverActive, "Not active");
        TokenConfig memory config = getTokenConfigBySymbolHash(symbolHash);
        uint256 anchorPrice = calculateAnchorPriceFromEthPrice(config);
        require(anchorPrice < 2**248, "Anchor too big");
        prices[config.symbolHash].price = uint248(anchorPrice);
        emit PriceUpdated(config.symbolHash, anchorPrice);
    }

    /**
     * @notice Calculate the anchor price by fetching price data from the TWAP
     * @param config TokenConfig
     * @return anchorPrice uint
     */
    function calculateAnchorPriceFromEthPrice(TokenConfig memory config)
        internal
        view
        returns (uint256 anchorPrice)
    {
        require(config.priceSource == PriceSource.REPORTER, "Reporter only");
        uint256 ethPrice = fetchEthPrice();
        if (config.symbolHash == ETH_HASH) {
            anchorPrice = ethPrice;
        } else {
            anchorPrice = fetchAnchorPrice(config, ethPrice);
        }
    }

    /**
     * @notice Convert the reported price to the 6 decimal format that this view requires
     * @param config TokenConfig
     * @param reportedPrice from the reporter
     * @return convertedPrice uint256
     */
    function convertReportedPrice(
        TokenConfig memory config,
        int256 reportedPrice
    ) internal pure returns (uint256) {
        require(reportedPrice >= 0, "Cant be neg");
        uint256 unsignedPrice = uint256(reportedPrice);
        uint256 convertedPrice = FullMath.mulDiv(
            unsignedPrice,
            config.reporterMultiplier,
            config.baseUnit
        );
        return convertedPrice;
    }

    function isWithinAnchor(uint256 reporterPrice, uint256 anchorPrice)
        internal
        view
        returns (bool)
    {
        if (reporterPrice > 0) {
            uint256 anchorRatio = FullMath.mulDiv(
                anchorPrice,
                ETH_BASE_UNIT,
                reporterPrice
            );
            return
                anchorRatio <= upperBoundAnchorRatio &&
                anchorRatio >= lowerBoundAnchorRatio;
        }
        return false;
    }

    /**
     * @dev Fetches the latest TWATP from the UniV3 pool oracle, over the last anchor period.
     *      Note that the TWATP (time-weighted average tick-price) is not equivalent to the TWAP,
     *      as ticks are logarithmic. The TWATP returned by this function will usually
     *      be lower than the TWAP.
     */
    function getUniswapTwap(TokenConfig memory config)
        internal
        view
        returns (uint256)
    {
        uint32 anchorPeriod_ = anchorPeriod;
        uint32[] memory secondsAgos = new uint32[](2);
        secondsAgos[0] = anchorPeriod_;
        (int56[] memory tickCumulatives, ) = IUniswapV3Pool(
            config.uniswapMarket
        ).observe(secondsAgos);

        int56 anchorPeriod__ = int56(uint56(anchorPeriod_));
        int56 timeWeightedAverageTickS56 = (tickCumulatives[1] -
            tickCumulatives[0]) / anchorPeriod__;
        require(
            timeWeightedAverageTickS56 >= TickMath.MIN_TICK &&
                timeWeightedAverageTickS56 <= TickMath.MAX_TICK,
            "TWAP not in range"
        );
        require(
            timeWeightedAverageTickS56 < type(int24).max,
            "timeWeightedAverageTick > max"
        );
        int24 timeWeightedAverageTick = int24(timeWeightedAverageTickS56);
        if (config.isUniswapReversed) {
            // If the reverse price is desired, inverse the tick
            // price = 1.0001^{tick}
            // (price)^{-1} = (1.0001^{tick})^{-1}
            // \frac{1}{price} = 1.0001^{-tick}
            timeWeightedAverageTick = -timeWeightedAverageTick;
        }
        uint160 sqrtPriceX96 = TickMath.getSqrtRatioAtTick(
            timeWeightedAverageTick
        );
        // Squaring the result also squares the Q96 scalar (2**96),
        // so after this mulDiv, the resulting TWAP is still in Q96 fixed precision.
        uint256 twapX96 = FullMath.mulDiv(
            sqrtPriceX96,
            sqrtPriceX96,
            FixedPoint96.Q96
        );

        // Scale up to a common precision (EXP_SCALE), then down-scale from Q96.
        return FullMath.mulDiv(EXP_SCALE, twapX96, FixedPoint96.Q96);
    }

    /**
     * @dev Fetches the current eth/usd price from Uniswap, with 6 decimals of precision.
     *  Conversion factor is 1e18 for eth/usdc market, since we decode Uniswap price statically with 18 decimals.
     */
    function fetchEthPrice() internal view returns (uint256) {
        return
            fetchAnchorPrice(
                getTokenConfigBySymbolHash(ETH_HASH),
                ETH_BASE_UNIT
            );
    }

    /**
     * @dev Fetches the current token/usd price from Uniswap, with 6 decimals of precision.
     * @param conversionFactor 1e18 if seeking the ETH price, and a 6 decimal ETH-USDC price in the case of other assets
     */
    function fetchAnchorPrice(
        TokenConfig memory config,
        uint256 conversionFactor
    ) internal view virtual returns (uint256) {
        // `getUniswapTwap(config)`
        //      -> TWAP between the baseUnits of Uniswap pair (scaled to 1e18)
        // `twap * config.baseUnit`
        //      -> price of 1 token relative to `baseUnit` of the other token (scaled to 1e18)
        uint256 twap = getUniswapTwap(config);

        // `unscaledPriceMantissa * config.baseUnit / EXP_SCALE`
        //      -> price of 1 token relative to baseUnit of the other token (scaled to 1)
        uint256 unscaledPriceMantissa = twap * conversionFactor;

        // Adjust twap according to the units of the non-ETH asset
        // 1. In the case of ETH, we would have to scale by 1e6 / USDC_UNITS, but since baseUnit2 is 1e6 (USDC), it cancels
        // 2. In the case of non-ETH tokens
        //  a. `getUniswapTwap(config)` handles "reversed" token pairs, so `twap` will always be Token/ETH TWAP.
        //  b. conversionFactor = ETH price * 1e6
        //      unscaledPriceMantissa = twap{token/ETH} * EXP_SCALE * conversionFactor
        //      so ->
        //      anchorPrice = (twap * tokenBaseUnit / ETH_BASE_UNIT) * ETH_price * 1e6
        //                  = twap * conversionFactor * tokenBaseUnit / ETH_BASE_UNIT
        //                  = unscaledPriceMantissa / EXP_SCALE * tokenBaseUnit / ETH_BASE_UNIT
        uint256 anchorPrice = (unscaledPriceMantissa * config.baseUnit) /
            ETH_BASE_UNIT /
            EXP_SCALE;

        return anchorPrice;
    }

    /**
     * @notice Activate failover, and fall back to using failover directly.
     * @dev Only the owner can call this function
     */
    function activateFailover(bytes32 symbolHash) external onlyOwner {
        require(!prices[symbolHash].failoverActive, "Already active");
        TokenConfig memory config = getTokenConfigBySymbolHash(symbolHash);
        require(config.priceSource == PriceSource.REPORTER, "Not reporter");
        prices[symbolHash].failoverActive = true;
        emit FailoverActivated(symbolHash);
        pokeFailedOverPrice(symbolHash);
    }

    /**
     * @notice Deactivate a previously activated failover
     * @dev Only the owner can call this function
     */
    function deactivateFailover(bytes32 symbolHash) external onlyOwner {
        require(prices[symbolHash].failoverActive, "Not active");
        prices[symbolHash].failoverActive = false;
        emit FailoverDeactivated(symbolHash);
    }
}

// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.8.7;

import {CErc20} from "./CErc20.sol";

contract UniswapConfig {
    /// @notice The maximum integer possible
    uint256 public constant MAX_INTEGER = type(uint256).max;

    /// @dev Describe how to interpret the fixedPrice in the TokenConfig.
    enum PriceSource {
        FIXED_ETH, /// implies the fixedPrice is a constant multiple of the ETH price (which varies)
        FIXED_USD, /// implies the fixedPrice is a constant multiple of the USD price (which is 1)
        REPORTER /// implies the price is set by the reporter
    }

    /// @dev Describe how the USD price should be determined for an asset.
    ///  There should be 1 TokenConfig object for each supported asset, passed in the constructor.
    struct TokenConfig {
        // The address of the underlying market token. For this `LINK` market configuration, this would be the address of the `LINK` token.
        address underlying;
        // The bytes32 hash of the underlying symbol.
        bytes32 symbolHash;
        // The number of smallest units of measurement in a single whole unit.
        uint256 baseUnit;
        // Where price is coming from.  Refer to README for more information
        PriceSource priceSource;
        // The fixed price multiple of either ETH or USD, depending on the `priceSource`. If `priceSource` is `reporter`, this is unused.
        uint256 fixedPrice;
        // The address of the pool being used as the anchor for this market.
        address uniswapMarket;
        // The address of the `ValidatorProxy` acting as the reporter
        address reporter;
        // Prices reported by a `ValidatorProxy` must be transformed to 6 decimals for the UAV.  This is the multiplier to convert the reported price to 6dp
        uint256 reporterMultiplier;
        // True if the pair on Uniswap is defined as ETH / X
        bool isUniswapReversed;
    }

    /// @notice The max number of tokens this contract is hardcoded to support
    /// @dev Do not change this variable without updating all the fields throughout the contract.
    uint256 public constant MAX_TOKENS = 35;

    /// @notice The number of tokens this contract actually supports
    uint256 public immutable numTokens;

    address internal immutable underlying00;
    address internal immutable underlying01;
    address internal immutable underlying02;
    address internal immutable underlying03;
    address internal immutable underlying04;
    address internal immutable underlying05;
    address internal immutable underlying06;
    address internal immutable underlying07;
    address internal immutable underlying08;
    address internal immutable underlying09;
    address internal immutable underlying10;
    address internal immutable underlying11;
    address internal immutable underlying12;
    address internal immutable underlying13;
    address internal immutable underlying14;
    address internal immutable underlying15;
    address internal immutable underlying16;
    address internal immutable underlying17;
    address internal immutable underlying18;
    address internal immutable underlying19;
    address internal immutable underlying20;
    address internal immutable underlying21;
    address internal immutable underlying22;
    address internal immutable underlying23;
    address internal immutable underlying24;
    address internal immutable underlying25;
    address internal immutable underlying26;
    address internal immutable underlying27;
    address internal immutable underlying28;
    address internal immutable underlying29;
    address internal immutable underlying30;
    address internal immutable underlying31;
    address internal immutable underlying32;
    address internal immutable underlying33;
    address internal immutable underlying34;

    bytes32 internal immutable symbolHash00;
    bytes32 internal immutable symbolHash01;
    bytes32 internal immutable symbolHash02;
    bytes32 internal immutable symbolHash03;
    bytes32 internal immutable symbolHash04;
    bytes32 internal immutable symbolHash05;
    bytes32 internal immutable symbolHash06;
    bytes32 internal immutable symbolHash07;
    bytes32 internal immutable symbolHash08;
    bytes32 internal immutable symbolHash09;
    bytes32 internal immutable symbolHash10;
    bytes32 internal immutable symbolHash11;
    bytes32 internal immutable symbolHash12;
    bytes32 internal immutable symbolHash13;
    bytes32 internal immutable symbolHash14;
    bytes32 internal immutable symbolHash15;
    bytes32 internal immutable symbolHash16;
    bytes32 internal immutable symbolHash17;
    bytes32 internal immutable symbolHash18;
    bytes32 internal immutable symbolHash19;
    bytes32 internal immutable symbolHash20;
    bytes32 internal immutable symbolHash21;
    bytes32 internal immutable symbolHash22;
    bytes32 internal immutable symbolHash23;
    bytes32 internal immutable symbolHash24;
    bytes32 internal immutable symbolHash25;
    bytes32 internal immutable symbolHash26;
    bytes32 internal immutable symbolHash27;
    bytes32 internal immutable symbolHash28;
    bytes32 internal immutable symbolHash29;
    bytes32 internal immutable symbolHash30;
    bytes32 internal immutable symbolHash31;
    bytes32 internal immutable symbolHash32;
    bytes32 internal immutable symbolHash33;
    bytes32 internal immutable symbolHash34;

    uint256 internal immutable baseUnit00;
    uint256 internal immutable baseUnit01;
    uint256 internal immutable baseUnit02;
    uint256 internal immutable baseUnit03;
    uint256 internal immutable baseUnit04;
    uint256 internal immutable baseUnit05;
    uint256 internal immutable baseUnit06;
    uint256 internal immutable baseUnit07;
    uint256 internal immutable baseUnit08;
    uint256 internal immutable baseUnit09;
    uint256 internal immutable baseUnit10;
    uint256 internal immutable baseUnit11;
    uint256 internal immutable baseUnit12;
    uint256 internal immutable baseUnit13;
    uint256 internal immutable baseUnit14;
    uint256 internal immutable baseUnit15;
    uint256 internal immutable baseUnit16;
    uint256 internal immutable baseUnit17;
    uint256 internal immutable baseUnit18;
    uint256 internal immutable baseUnit19;
    uint256 internal immutable baseUnit20;
    uint256 internal immutable baseUnit21;
    uint256 internal immutable baseUnit22;
    uint256 internal immutable baseUnit23;
    uint256 internal immutable baseUnit24;
    uint256 internal immutable baseUnit25;
    uint256 internal immutable baseUnit26;
    uint256 internal immutable baseUnit27;
    uint256 internal immutable baseUnit28;
    uint256 internal immutable baseUnit29;
    uint256 internal immutable baseUnit30;
    uint256 internal immutable baseUnit31;
    uint256 internal immutable baseUnit32;
    uint256 internal immutable baseUnit33;
    uint256 internal immutable baseUnit34;

    PriceSource internal immutable priceSource00;
    PriceSource internal immutable priceSource01;
    PriceSource internal immutable priceSource02;
    PriceSource internal immutable priceSource03;
    PriceSource internal immutable priceSource04;
    PriceSource internal immutable priceSource05;
    PriceSource internal immutable priceSource06;
    PriceSource internal immutable priceSource07;
    PriceSource internal immutable priceSource08;
    PriceSource internal immutable priceSource09;
    PriceSource internal immutable priceSource10;
    PriceSource internal immutable priceSource11;
    PriceSource internal immutable priceSource12;
    PriceSource internal immutable priceSource13;
    PriceSource internal immutable priceSource14;
    PriceSource internal immutable priceSource15;
    PriceSource internal immutable priceSource16;
    PriceSource internal immutable priceSource17;
    PriceSource internal immutable priceSource18;
    PriceSource internal immutable priceSource19;
    PriceSource internal immutable priceSource20;
    PriceSource internal immutable priceSource21;
    PriceSource internal immutable priceSource22;
    PriceSource internal immutable priceSource23;
    PriceSource internal immutable priceSource24;
    PriceSource internal immutable priceSource25;
    PriceSource internal immutable priceSource26;
    PriceSource internal immutable priceSource27;
    PriceSource internal immutable priceSource28;
    PriceSource internal immutable priceSource29;
    PriceSource internal immutable priceSource30;
    PriceSource internal immutable priceSource31;
    PriceSource internal immutable priceSource32;
    PriceSource internal immutable priceSource33;
    PriceSource internal immutable priceSource34;

    uint256 internal immutable fixedPrice00;
    uint256 internal immutable fixedPrice01;
    uint256 internal immutable fixedPrice02;
    uint256 internal immutable fixedPrice03;
    uint256 internal immutable fixedPrice04;
    uint256 internal immutable fixedPrice05;
    uint256 internal immutable fixedPrice06;
    uint256 internal immutable fixedPrice07;
    uint256 internal immutable fixedPrice08;
    uint256 internal immutable fixedPrice09;
    uint256 internal immutable fixedPrice10;
    uint256 internal immutable fixedPrice11;
    uint256 internal immutable fixedPrice12;
    uint256 internal immutable fixedPrice13;
    uint256 internal immutable fixedPrice14;
    uint256 internal immutable fixedPrice15;
    uint256 internal immutable fixedPrice16;
    uint256 internal immutable fixedPrice17;
    uint256 internal immutable fixedPrice18;
    uint256 internal immutable fixedPrice19;
    uint256 internal immutable fixedPrice20;
    uint256 internal immutable fixedPrice21;
    uint256 internal immutable fixedPrice22;
    uint256 internal immutable fixedPrice23;
    uint256 internal immutable fixedPrice24;
    uint256 internal immutable fixedPrice25;
    uint256 internal immutable fixedPrice26;
    uint256 internal immutable fixedPrice27;
    uint256 internal immutable fixedPrice28;
    uint256 internal immutable fixedPrice29;
    uint256 internal immutable fixedPrice30;
    uint256 internal immutable fixedPrice31;
    uint256 internal immutable fixedPrice32;
    uint256 internal immutable fixedPrice33;
    uint256 internal immutable fixedPrice34;

    address internal immutable uniswapMarket00;
    address internal immutable uniswapMarket01;
    address internal immutable uniswapMarket02;
    address internal immutable uniswapMarket03;
    address internal immutable uniswapMarket04;
    address internal immutable uniswapMarket05;
    address internal immutable uniswapMarket06;
    address internal immutable uniswapMarket07;
    address internal immutable uniswapMarket08;
    address internal immutable uniswapMarket09;
    address internal immutable uniswapMarket10;
    address internal immutable uniswapMarket11;
    address internal immutable uniswapMarket12;
    address internal immutable uniswapMarket13;
    address internal immutable uniswapMarket14;
    address internal immutable uniswapMarket15;
    address internal immutable uniswapMarket16;
    address internal immutable uniswapMarket17;
    address internal immutable uniswapMarket18;
    address internal immutable uniswapMarket19;
    address internal immutable uniswapMarket20;
    address internal immutable uniswapMarket21;
    address internal immutable uniswapMarket22;
    address internal immutable uniswapMarket23;
    address internal immutable uniswapMarket24;
    address internal immutable uniswapMarket25;
    address internal immutable uniswapMarket26;
    address internal immutable uniswapMarket27;
    address internal immutable uniswapMarket28;
    address internal immutable uniswapMarket29;
    address internal immutable uniswapMarket30;
    address internal immutable uniswapMarket31;
    address internal immutable uniswapMarket32;
    address internal immutable uniswapMarket33;
    address internal immutable uniswapMarket34;

    address internal immutable reporter00;
    address internal immutable reporter01;
    address internal immutable reporter02;
    address internal immutable reporter03;
    address internal immutable reporter04;
    address internal immutable reporter05;
    address internal immutable reporter06;
    address internal immutable reporter07;
    address internal immutable reporter08;
    address internal immutable reporter09;
    address internal immutable reporter10;
    address internal immutable reporter11;
    address internal immutable reporter12;
    address internal immutable reporter13;
    address internal immutable reporter14;
    address internal immutable reporter15;
    address internal immutable reporter16;
    address internal immutable reporter17;
    address internal immutable reporter18;
    address internal immutable reporter19;
    address internal immutable reporter20;
    address internal immutable reporter21;
    address internal immutable reporter22;
    address internal immutable reporter23;
    address internal immutable reporter24;
    address internal immutable reporter25;
    address internal immutable reporter26;
    address internal immutable reporter27;
    address internal immutable reporter28;
    address internal immutable reporter29;
    address internal immutable reporter30;
    address internal immutable reporter31;
    address internal immutable reporter32;
    address internal immutable reporter33;
    address internal immutable reporter34;

    uint256 internal immutable reporterMultiplier00;
    uint256 internal immutable reporterMultiplier01;
    uint256 internal immutable reporterMultiplier02;
    uint256 internal immutable reporterMultiplier03;
    uint256 internal immutable reporterMultiplier04;
    uint256 internal immutable reporterMultiplier05;
    uint256 internal immutable reporterMultiplier06;
    uint256 internal immutable reporterMultiplier07;
    uint256 internal immutable reporterMultiplier08;
    uint256 internal immutable reporterMultiplier09;
    uint256 internal immutable reporterMultiplier10;
    uint256 internal immutable reporterMultiplier11;
    uint256 internal immutable reporterMultiplier12;
    uint256 internal immutable reporterMultiplier13;
    uint256 internal immutable reporterMultiplier14;
    uint256 internal immutable reporterMultiplier15;
    uint256 internal immutable reporterMultiplier16;
    uint256 internal immutable reporterMultiplier17;
    uint256 internal immutable reporterMultiplier18;
    uint256 internal immutable reporterMultiplier19;
    uint256 internal immutable reporterMultiplier20;
    uint256 internal immutable reporterMultiplier21;
    uint256 internal immutable reporterMultiplier22;
    uint256 internal immutable reporterMultiplier23;
    uint256 internal immutable reporterMultiplier24;
    uint256 internal immutable reporterMultiplier25;
    uint256 internal immutable reporterMultiplier26;
    uint256 internal immutable reporterMultiplier27;
    uint256 internal immutable reporterMultiplier28;
    uint256 internal immutable reporterMultiplier29;
    uint256 internal immutable reporterMultiplier30;
    uint256 internal immutable reporterMultiplier31;
    uint256 internal immutable reporterMultiplier32;
    uint256 internal immutable reporterMultiplier33;
    uint256 internal immutable reporterMultiplier34;

    // Contract bytecode size optimization:
    // Each bit i stores a bool, corresponding to the ith config.
    uint256 internal immutable isUniswapReversed;

    /**
     * @notice Construct an immutable store of configs into the contract data
     * @param configs The configs for the supported assets
     */
    constructor(TokenConfig[] memory configs) {
        require(configs.length <= MAX_TOKENS, "Too many");
        numTokens = configs.length;

        TokenConfig memory config = get(configs, 0);
        underlying00 = config.underlying;
        symbolHash00 = config.symbolHash;
        baseUnit00 = config.baseUnit;
        priceSource00 = config.priceSource;
        fixedPrice00 = config.fixedPrice;
        uniswapMarket00 = config.uniswapMarket;
        reporter00 = config.reporter;
        reporterMultiplier00 = config.reporterMultiplier;

        config = get(configs, 1);
        underlying01 = config.underlying;
        symbolHash01 = config.symbolHash;
        baseUnit01 = config.baseUnit;
        priceSource01 = config.priceSource;
        fixedPrice01 = config.fixedPrice;
        uniswapMarket01 = config.uniswapMarket;
        reporter01 = config.reporter;
        reporterMultiplier01 = config.reporterMultiplier;

        config = get(configs, 2);
        underlying02 = config.underlying;
        symbolHash02 = config.symbolHash;
        baseUnit02 = config.baseUnit;
        priceSource02 = config.priceSource;
        fixedPrice02 = config.fixedPrice;
        uniswapMarket02 = config.uniswapMarket;
        reporter02 = config.reporter;
        reporterMultiplier02 = config.reporterMultiplier;

        config = get(configs, 3);
        underlying03 = config.underlying;
        symbolHash03 = config.symbolHash;
        baseUnit03 = config.baseUnit;
        priceSource03 = config.priceSource;
        fixedPrice03 = config.fixedPrice;
        uniswapMarket03 = config.uniswapMarket;
        reporter03 = config.reporter;
        reporterMultiplier03 = config.reporterMultiplier;

        config = get(configs, 4);
        underlying04 = config.underlying;
        symbolHash04 = config.symbolHash;
        baseUnit04 = config.baseUnit;
        priceSource04 = config.priceSource;
        fixedPrice04 = config.fixedPrice;
        uniswapMarket04 = config.uniswapMarket;
        reporter04 = config.reporter;
        reporterMultiplier04 = config.reporterMultiplier;

        config = get(configs, 5);
        underlying05 = config.underlying;
        symbolHash05 = config.symbolHash;
        baseUnit05 = config.baseUnit;
        priceSource05 = config.priceSource;
        fixedPrice05 = config.fixedPrice;
        uniswapMarket05 = config.uniswapMarket;
        reporter05 = config.reporter;
        reporterMultiplier05 = config.reporterMultiplier;

        config = get(configs, 6);
        underlying06 = config.underlying;
        symbolHash06 = config.symbolHash;
        baseUnit06 = config.baseUnit;
        priceSource06 = config.priceSource;
        fixedPrice06 = config.fixedPrice;
        uniswapMarket06 = config.uniswapMarket;
        reporter06 = config.reporter;
        reporterMultiplier06 = config.reporterMultiplier;

        config = get(configs, 7);
        underlying07 = config.underlying;
        symbolHash07 = config.symbolHash;
        baseUnit07 = config.baseUnit;
        priceSource07 = config.priceSource;
        fixedPrice07 = config.fixedPrice;
        uniswapMarket07 = config.uniswapMarket;
        reporter07 = config.reporter;
        reporterMultiplier07 = config.reporterMultiplier;

        config = get(configs, 8);
        underlying08 = config.underlying;
        symbolHash08 = config.symbolHash;
        baseUnit08 = config.baseUnit;
        priceSource08 = config.priceSource;
        fixedPrice08 = config.fixedPrice;
        uniswapMarket08 = config.uniswapMarket;
        reporter08 = config.reporter;
        reporterMultiplier08 = config.reporterMultiplier;

        config = get(configs, 9);
        underlying09 = config.underlying;
        symbolHash09 = config.symbolHash;
        baseUnit09 = config.baseUnit;
        priceSource09 = config.priceSource;
        fixedPrice09 = config.fixedPrice;
        uniswapMarket09 = config.uniswapMarket;
        reporter09 = config.reporter;
        reporterMultiplier09 = config.reporterMultiplier;

        config = get(configs, 10);
        underlying10 = config.underlying;
        symbolHash10 = config.symbolHash;
        baseUnit10 = config.baseUnit;
        priceSource10 = config.priceSource;
        fixedPrice10 = config.fixedPrice;
        uniswapMarket10 = config.uniswapMarket;
        reporter10 = config.reporter;
        reporterMultiplier10 = config.reporterMultiplier;

        config = get(configs, 11);
        underlying11 = config.underlying;
        symbolHash11 = config.symbolHash;
        baseUnit11 = config.baseUnit;
        priceSource11 = config.priceSource;
        fixedPrice11 = config.fixedPrice;
        uniswapMarket11 = config.uniswapMarket;
        reporter11 = config.reporter;
        reporterMultiplier11 = config.reporterMultiplier;

        config = get(configs, 12);
        underlying12 = config.underlying;
        symbolHash12 = config.symbolHash;
        baseUnit12 = config.baseUnit;
        priceSource12 = config.priceSource;
        fixedPrice12 = config.fixedPrice;
        uniswapMarket12 = config.uniswapMarket;
        reporter12 = config.reporter;
        reporterMultiplier12 = config.reporterMultiplier;

        config = get(configs, 13);
        underlying13 = config.underlying;
        symbolHash13 = config.symbolHash;
        baseUnit13 = config.baseUnit;
        priceSource13 = config.priceSource;
        fixedPrice13 = config.fixedPrice;
        uniswapMarket13 = config.uniswapMarket;
        reporter13 = config.reporter;
        reporterMultiplier13 = config.reporterMultiplier;

        config = get(configs, 14);
        underlying14 = config.underlying;
        symbolHash14 = config.symbolHash;
        baseUnit14 = config.baseUnit;
        priceSource14 = config.priceSource;
        fixedPrice14 = config.fixedPrice;
        uniswapMarket14 = config.uniswapMarket;
        reporter14 = config.reporter;
        reporterMultiplier14 = config.reporterMultiplier;

        config = get(configs, 15);
        underlying15 = config.underlying;
        symbolHash15 = config.symbolHash;
        baseUnit15 = config.baseUnit;
        priceSource15 = config.priceSource;
        fixedPrice15 = config.fixedPrice;
        uniswapMarket15 = config.uniswapMarket;
        reporter15 = config.reporter;
        reporterMultiplier15 = config.reporterMultiplier;

        config = get(configs, 16);
        underlying16 = config.underlying;
        symbolHash16 = config.symbolHash;
        baseUnit16 = config.baseUnit;
        priceSource16 = config.priceSource;
        fixedPrice16 = config.fixedPrice;
        uniswapMarket16 = config.uniswapMarket;
        reporter16 = config.reporter;
        reporterMultiplier16 = config.reporterMultiplier;

        config = get(configs, 17);
        underlying17 = config.underlying;
        symbolHash17 = config.symbolHash;
        baseUnit17 = config.baseUnit;
        priceSource17 = config.priceSource;
        fixedPrice17 = config.fixedPrice;
        uniswapMarket17 = config.uniswapMarket;
        reporter17 = config.reporter;
        reporterMultiplier17 = config.reporterMultiplier;

        config = get(configs, 18);
        underlying18 = config.underlying;
        symbolHash18 = config.symbolHash;
        baseUnit18 = config.baseUnit;
        priceSource18 = config.priceSource;
        fixedPrice18 = config.fixedPrice;
        uniswapMarket18 = config.uniswapMarket;
        reporter18 = config.reporter;
        reporterMultiplier18 = config.reporterMultiplier;

        config = get(configs, 19);
        underlying19 = config.underlying;
        symbolHash19 = config.symbolHash;
        baseUnit19 = config.baseUnit;
        priceSource19 = config.priceSource;
        fixedPrice19 = config.fixedPrice;
        uniswapMarket19 = config.uniswapMarket;
        reporter19 = config.reporter;
        reporterMultiplier19 = config.reporterMultiplier;

        config = get(configs, 20);
        underlying20 = config.underlying;
        symbolHash20 = config.symbolHash;
        baseUnit20 = config.baseUnit;
        priceSource20 = config.priceSource;
        fixedPrice20 = config.fixedPrice;
        uniswapMarket20 = config.uniswapMarket;
        reporter20 = config.reporter;
        reporterMultiplier20 = config.reporterMultiplier;

        config = get(configs, 21);
        underlying21 = config.underlying;
        symbolHash21 = config.symbolHash;
        baseUnit21 = config.baseUnit;
        priceSource21 = config.priceSource;
        fixedPrice21 = config.fixedPrice;
        uniswapMarket21 = config.uniswapMarket;
        reporter21 = config.reporter;
        reporterMultiplier21 = config.reporterMultiplier;

        config = get(configs, 22);
        underlying22 = config.underlying;
        symbolHash22 = config.symbolHash;
        baseUnit22 = config.baseUnit;
        priceSource22 = config.priceSource;
        fixedPrice22 = config.fixedPrice;
        uniswapMarket22 = config.uniswapMarket;
        reporter22 = config.reporter;
        reporterMultiplier22 = config.reporterMultiplier;

        config = get(configs, 23);
        underlying23 = config.underlying;
        symbolHash23 = config.symbolHash;
        baseUnit23 = config.baseUnit;
        priceSource23 = config.priceSource;
        fixedPrice23 = config.fixedPrice;
        uniswapMarket23 = config.uniswapMarket;
        reporter23 = config.reporter;
        reporterMultiplier23 = config.reporterMultiplier;

        config = get(configs, 24);
        underlying24 = config.underlying;
        symbolHash24 = config.symbolHash;
        baseUnit24 = config.baseUnit;
        priceSource24 = config.priceSource;
        fixedPrice24 = config.fixedPrice;
        uniswapMarket24 = config.uniswapMarket;
        reporter24 = config.reporter;
        reporterMultiplier24 = config.reporterMultiplier;

        config = get(configs, 25);
        underlying25 = config.underlying;
        symbolHash25 = config.symbolHash;
        baseUnit25 = config.baseUnit;
        priceSource25 = config.priceSource;
        fixedPrice25 = config.fixedPrice;
        uniswapMarket25 = config.uniswapMarket;
        reporter25 = config.reporter;
        reporterMultiplier25 = config.reporterMultiplier;

        config = get(configs, 26);
        underlying26 = config.underlying;
        symbolHash26 = config.symbolHash;
        baseUnit26 = config.baseUnit;
        priceSource26 = config.priceSource;
        fixedPrice26 = config.fixedPrice;
        uniswapMarket26 = config.uniswapMarket;
        reporter26 = config.reporter;
        reporterMultiplier26 = config.reporterMultiplier;

        config = get(configs, 27);
        underlying27 = config.underlying;
        symbolHash27 = config.symbolHash;
        baseUnit27 = config.baseUnit;
        priceSource27 = config.priceSource;
        fixedPrice27 = config.fixedPrice;
        uniswapMarket27 = config.uniswapMarket;
        reporter27 = config.reporter;
        reporterMultiplier27 = config.reporterMultiplier;

        config = get(configs, 28);
        underlying28 = config.underlying;
        symbolHash28 = config.symbolHash;
        baseUnit28 = config.baseUnit;
        priceSource28 = config.priceSource;
        fixedPrice28 = config.fixedPrice;
        uniswapMarket28 = config.uniswapMarket;
        reporter28 = config.reporter;
        reporterMultiplier28 = config.reporterMultiplier;

        config = get(configs, 29);
        underlying29 = config.underlying;
        symbolHash29 = config.symbolHash;
        baseUnit29 = config.baseUnit;
        priceSource29 = config.priceSource;
        fixedPrice29 = config.fixedPrice;
        uniswapMarket29 = config.uniswapMarket;
        reporter29 = config.reporter;
        reporterMultiplier29 = config.reporterMultiplier;

        config = get(configs, 30);
        underlying30 = config.underlying;
        symbolHash30 = config.symbolHash;
        baseUnit30 = config.baseUnit;
        priceSource30 = config.priceSource;
        fixedPrice30 = config.fixedPrice;
        uniswapMarket30 = config.uniswapMarket;
        reporter30 = config.reporter;
        reporterMultiplier30 = config.reporterMultiplier;

        config = get(configs, 31);
        underlying31 = config.underlying;
        symbolHash31 = config.symbolHash;
        baseUnit31 = config.baseUnit;
        priceSource31 = config.priceSource;
        fixedPrice31 = config.fixedPrice;
        uniswapMarket31 = config.uniswapMarket;
        reporter31 = config.reporter;
        reporterMultiplier31 = config.reporterMultiplier;

        config = get(configs, 32);
        underlying32 = config.underlying;
        symbolHash32 = config.symbolHash;
        baseUnit32 = config.baseUnit;
        priceSource32 = config.priceSource;
        fixedPrice32 = config.fixedPrice;
        uniswapMarket32 = config.uniswapMarket;
        reporter32 = config.reporter;
        reporterMultiplier32 = config.reporterMultiplier;

        config = get(configs, 33);
        underlying33 = config.underlying;
        symbolHash33 = config.symbolHash;
        baseUnit33 = config.baseUnit;
        priceSource33 = config.priceSource;
        fixedPrice33 = config.fixedPrice;
        uniswapMarket33 = config.uniswapMarket;
        reporter33 = config.reporter;
        reporterMultiplier33 = config.reporterMultiplier;

        config = get(configs, 34);
        underlying34 = config.underlying;
        symbolHash34 = config.symbolHash;
        baseUnit34 = config.baseUnit;
        priceSource34 = config.priceSource;
        fixedPrice34 = config.fixedPrice;
        uniswapMarket34 = config.uniswapMarket;
        reporter34 = config.reporter;
        reporterMultiplier34 = config.reporterMultiplier;

        uint256 isUniswapReversed_;
        uint256 numTokenConfigs = configs.length;
        for (uint256 i = 0; i < numTokenConfigs; i++) {
            config = configs[i];
            if (config.isUniswapReversed) isUniswapReversed_ |= uint256(1) << i;
        }
        isUniswapReversed = isUniswapReversed_;
    }

    function get(TokenConfig[] memory configs, uint256 i)
        internal
        pure
        returns (TokenConfig memory)
    {
        if (i < configs.length) return configs[i];
        return
            TokenConfig({
                underlying: address(0),
                symbolHash: bytes32(0),
                baseUnit: uint256(0),
                priceSource: PriceSource(0),
                fixedPrice: uint256(0),
                uniswapMarket: address(0),
                reporter: address(0),
                reporterMultiplier: uint256(0),
                isUniswapReversed: false
            });
    }

    function getReporterIndex(address reporter)
        internal
        view
        returns (uint256)
    {
        if (reporter == reporter00) return 0;
        if (reporter == reporter01) return 1;
        if (reporter == reporter02) return 2;
        if (reporter == reporter03) return 3;
        if (reporter == reporter04) return 4;
        if (reporter == reporter05) return 5;
        if (reporter == reporter06) return 6;
        if (reporter == reporter07) return 7;
        if (reporter == reporter08) return 8;
        if (reporter == reporter09) return 9;
        if (reporter == reporter10) return 10;
        if (reporter == reporter11) return 11;
        if (reporter == reporter12) return 12;
        if (reporter == reporter13) return 13;
        if (reporter == reporter14) return 14;
        if (reporter == reporter15) return 15;
        if (reporter == reporter16) return 16;
        if (reporter == reporter17) return 17;
        if (reporter == reporter18) return 18;
        if (reporter == reporter19) return 19;
        if (reporter == reporter20) return 20;
        if (reporter == reporter21) return 21;
        if (reporter == reporter22) return 22;
        if (reporter == reporter23) return 23;
        if (reporter == reporter24) return 24;
        if (reporter == reporter25) return 25;
        if (reporter == reporter26) return 26;
        if (reporter == reporter27) return 27;
        if (reporter == reporter28) return 28;
        if (reporter == reporter29) return 29;
        if (reporter == reporter30) return 30;
        if (reporter == reporter31) return 31;
        if (reporter == reporter32) return 32;
        if (reporter == reporter33) return 33;
        if (reporter == reporter34) return 34;

        return MAX_INTEGER;
    }

    function getUnderlyingIndex(address underlying)
        internal
        view
        returns (uint256)
    {
        if (underlying == underlying00) return 0;
        if (underlying == underlying01) return 1;
        if (underlying == underlying02) return 2;
        if (underlying == underlying03) return 3;
        if (underlying == underlying04) return 4;
        if (underlying == underlying05) return 5;
        if (underlying == underlying06) return 6;
        if (underlying == underlying07) return 7;
        if (underlying == underlying08) return 8;
        if (underlying == underlying09) return 9;
        if (underlying == underlying10) return 10;
        if (underlying == underlying11) return 11;
        if (underlying == underlying12) return 12;
        if (underlying == underlying13) return 13;
        if (underlying == underlying14) return 14;
        if (underlying == underlying15) return 15;
        if (underlying == underlying16) return 16;
        if (underlying == underlying17) return 17;
        if (underlying == underlying18) return 18;
        if (underlying == underlying19) return 19;
        if (underlying == underlying20) return 20;
        if (underlying == underlying21) return 21;
        if (underlying == underlying22) return 22;
        if (underlying == underlying23) return 23;
        if (underlying == underlying24) return 24;
        if (underlying == underlying25) return 25;
        if (underlying == underlying26) return 26;
        if (underlying == underlying27) return 27;
        if (underlying == underlying28) return 28;
        if (underlying == underlying29) return 29;
        if (underlying == underlying30) return 30;
        if (underlying == underlying31) return 31;
        if (underlying == underlying32) return 32;
        if (underlying == underlying33) return 33;
        if (underlying == underlying34) return 34;

        return type(uint256).max;
    }

    function getSymbolHashIndex(bytes32 symbolHash)
        internal
        view
        returns (uint256)
    {
        if (symbolHash == symbolHash00) return 0;
        if (symbolHash == symbolHash01) return 1;
        if (symbolHash == symbolHash02) return 2;
        if (symbolHash == symbolHash03) return 3;
        if (symbolHash == symbolHash04) return 4;
        if (symbolHash == symbolHash05) return 5;
        if (symbolHash == symbolHash06) return 6;
        if (symbolHash == symbolHash07) return 7;
        if (symbolHash == symbolHash08) return 8;
        if (symbolHash == symbolHash09) return 9;
        if (symbolHash == symbolHash10) return 10;
        if (symbolHash == symbolHash11) return 11;
        if (symbolHash == symbolHash12) return 12;
        if (symbolHash == symbolHash13) return 13;
        if (symbolHash == symbolHash14) return 14;
        if (symbolHash == symbolHash15) return 15;
        if (symbolHash == symbolHash16) return 16;
        if (symbolHash == symbolHash17) return 17;
        if (symbolHash == symbolHash18) return 18;
        if (symbolHash == symbolHash19) return 19;
        if (symbolHash == symbolHash20) return 20;
        if (symbolHash == symbolHash21) return 21;
        if (symbolHash == symbolHash22) return 22;
        if (symbolHash == symbolHash23) return 23;
        if (symbolHash == symbolHash24) return 24;
        if (symbolHash == symbolHash25) return 25;
        if (symbolHash == symbolHash26) return 26;
        if (symbolHash == symbolHash27) return 27;
        if (symbolHash == symbolHash28) return 28;
        if (symbolHash == symbolHash29) return 29;
        if (symbolHash == symbolHash30) return 30;
        if (symbolHash == symbolHash31) return 31;
        if (symbolHash == symbolHash32) return 32;
        if (symbolHash == symbolHash33) return 33;
        if (symbolHash == symbolHash34) return 34;

        return type(uint256).max;
    }

    /**
     * @notice Get the i-th config, according to the order they were passed in originally
     * @param i The index of the config to get
     * @return The config object
     */
    function getTokenConfig(uint256 i)
        public
        view
        returns (TokenConfig memory)
    {
        require(i < numTokens, "Not found");

        address underlying;
        bytes32 symbolHash;
        uint256 baseUnit;
        PriceSource priceSource;
        uint256 fixedPrice;
        address uniswapMarket;
        address reporter;
        uint256 reporterMultiplier;
        if (i == 0) {
            underlying = underlying00;
            symbolHash = symbolHash00;
            baseUnit = baseUnit00;
            priceSource = priceSource00;
            fixedPrice = fixedPrice00;
            uniswapMarket = uniswapMarket00;
            reporter = reporter00;
            reporterMultiplier = reporterMultiplier00;
        } else if (i == 1) {
            underlying = underlying01;
            symbolHash = symbolHash01;
            baseUnit = baseUnit01;
            priceSource = priceSource01;
            fixedPrice = fixedPrice01;
            uniswapMarket = uniswapMarket01;
            reporter = reporter01;
            reporterMultiplier = reporterMultiplier01;
        } else if (i == 2) {
            underlying = underlying02;
            symbolHash = symbolHash02;
            baseUnit = baseUnit02;
            priceSource = priceSource02;
            fixedPrice = fixedPrice02;
            uniswapMarket = uniswapMarket02;
            reporter = reporter02;
            reporterMultiplier = reporterMultiplier02;
        } else if (i == 3) {
            underlying = underlying03;
            symbolHash = symbolHash03;
            baseUnit = baseUnit03;
            priceSource = priceSource03;
            fixedPrice = fixedPrice03;
            uniswapMarket = uniswapMarket03;
            reporter = reporter03;
            reporterMultiplier = reporterMultiplier03;
        } else if (i == 4) {
            underlying = underlying04;
            symbolHash = symbolHash04;
            baseUnit = baseUnit04;
            priceSource = priceSource04;
            fixedPrice = fixedPrice04;
            uniswapMarket = uniswapMarket04;
            reporter = reporter04;
            reporterMultiplier = reporterMultiplier04;
        } else if (i == 5) {
            underlying = underlying05;
            symbolHash = symbolHash05;
            baseUnit = baseUnit05;
            priceSource = priceSource05;
            fixedPrice = fixedPrice05;
            uniswapMarket = uniswapMarket05;
            reporter = reporter05;
            reporterMultiplier = reporterMultiplier05;
        } else if (i == 6) {
            underlying = underlying06;
            symbolHash = symbolHash06;
            baseUnit = baseUnit06;
            priceSource = priceSource06;
            fixedPrice = fixedPrice06;
            uniswapMarket = uniswapMarket06;
            reporter = reporter06;
            reporterMultiplier = reporterMultiplier06;
        } else if (i == 7) {
            underlying = underlying07;
            symbolHash = symbolHash07;
            baseUnit = baseUnit07;
            priceSource = priceSource07;
            fixedPrice = fixedPrice07;
            uniswapMarket = uniswapMarket07;
            reporter = reporter07;
            reporterMultiplier = reporterMultiplier07;
        } else if (i == 8) {
            underlying = underlying08;
            symbolHash = symbolHash08;
            baseUnit = baseUnit08;
            priceSource = priceSource08;
            fixedPrice = fixedPrice08;
            uniswapMarket = uniswapMarket08;
            reporter = reporter08;
            reporterMultiplier = reporterMultiplier08;
        } else if (i == 9) {
            underlying = underlying09;
            symbolHash = symbolHash09;
            baseUnit = baseUnit09;
            priceSource = priceSource09;
            fixedPrice = fixedPrice09;
            uniswapMarket = uniswapMarket09;
            reporter = reporter09;
            reporterMultiplier = reporterMultiplier09;
        } else if (i == 10) {
            underlying = underlying10;
            symbolHash = symbolHash10;
            baseUnit = baseUnit10;
            priceSource = priceSource10;
            fixedPrice = fixedPrice10;
            uniswapMarket = uniswapMarket10;
            reporter = reporter10;
            reporterMultiplier = reporterMultiplier10;
        } else if (i == 11) {
            underlying = underlying11;
            symbolHash = symbolHash11;
            baseUnit = baseUnit11;
            priceSource = priceSource11;
            fixedPrice = fixedPrice11;
            uniswapMarket = uniswapMarket11;
            reporter = reporter11;
            reporterMultiplier = reporterMultiplier11;
        } else if (i == 12) {
            underlying = underlying12;
            symbolHash = symbolHash12;
            baseUnit = baseUnit12;
            priceSource = priceSource12;
            fixedPrice = fixedPrice12;
            uniswapMarket = uniswapMarket12;
            reporter = reporter12;
            reporterMultiplier = reporterMultiplier12;
        } else if (i == 13) {
            underlying = underlying13;
            symbolHash = symbolHash13;
            baseUnit = baseUnit13;
            priceSource = priceSource13;
            fixedPrice = fixedPrice13;
            uniswapMarket = uniswapMarket13;
            reporter = reporter13;
            reporterMultiplier = reporterMultiplier13;
        } else if (i == 14) {
            underlying = underlying14;
            symbolHash = symbolHash14;
            baseUnit = baseUnit14;
            priceSource = priceSource14;
            fixedPrice = fixedPrice14;
            uniswapMarket = uniswapMarket14;
            reporter = reporter14;
            reporterMultiplier = reporterMultiplier14;
        } else if (i == 15) {
            underlying = underlying15;
            symbolHash = symbolHash15;
            baseUnit = baseUnit15;
            priceSource = priceSource15;
            fixedPrice = fixedPrice15;
            uniswapMarket = uniswapMarket15;
            reporter = reporter15;
            reporterMultiplier = reporterMultiplier15;
        } else if (i == 16) {
            underlying = underlying16;
            symbolHash = symbolHash16;
            baseUnit = baseUnit16;
            priceSource = priceSource16;
            fixedPrice = fixedPrice16;
            uniswapMarket = uniswapMarket16;
            reporter = reporter16;
            reporterMultiplier = reporterMultiplier16;
        } else if (i == 17) {
            underlying = underlying17;
            symbolHash = symbolHash17;
            baseUnit = baseUnit17;
            priceSource = priceSource17;
            fixedPrice = fixedPrice17;
            uniswapMarket = uniswapMarket17;
            reporter = reporter17;
            reporterMultiplier = reporterMultiplier17;
        } else if (i == 18) {
            underlying = underlying18;
            symbolHash = symbolHash18;
            baseUnit = baseUnit18;
            priceSource = priceSource18;
            fixedPrice = fixedPrice18;
            uniswapMarket = uniswapMarket18;
            reporter = reporter18;
            reporterMultiplier = reporterMultiplier18;
        } else if (i == 19) {
            underlying = underlying19;
            symbolHash = symbolHash19;
            baseUnit = baseUnit19;
            priceSource = priceSource19;
            fixedPrice = fixedPrice19;
            uniswapMarket = uniswapMarket19;
            reporter = reporter19;
            reporterMultiplier = reporterMultiplier19;
        } else if (i == 20) {
            underlying = underlying20;
            symbolHash = symbolHash20;
            baseUnit = baseUnit20;
            priceSource = priceSource20;
            fixedPrice = fixedPrice20;
            uniswapMarket = uniswapMarket20;
            reporter = reporter20;
            reporterMultiplier = reporterMultiplier20;
        } else if (i == 21) {
            underlying = underlying21;
            symbolHash = symbolHash21;
            baseUnit = baseUnit21;
            priceSource = priceSource21;
            fixedPrice = fixedPrice21;
            uniswapMarket = uniswapMarket21;
            reporter = reporter21;
            reporterMultiplier = reporterMultiplier21;
        } else if (i == 22) {
            underlying = underlying22;
            symbolHash = symbolHash22;
            baseUnit = baseUnit22;
            priceSource = priceSource22;
            fixedPrice = fixedPrice22;
            uniswapMarket = uniswapMarket22;
            reporter = reporter22;
            reporterMultiplier = reporterMultiplier22;
        } else if (i == 23) {
            underlying = underlying23;
            symbolHash = symbolHash23;
            baseUnit = baseUnit23;
            priceSource = priceSource23;
            fixedPrice = fixedPrice23;
            uniswapMarket = uniswapMarket23;
            reporter = reporter23;
            reporterMultiplier = reporterMultiplier23;
        } else if (i == 24) {
            underlying = underlying24;
            symbolHash = symbolHash24;
            baseUnit = baseUnit24;
            priceSource = priceSource24;
            fixedPrice = fixedPrice24;
            uniswapMarket = uniswapMarket24;
            reporter = reporter24;
            reporterMultiplier = reporterMultiplier24;
        } else if (i == 25) {
            underlying = underlying25;
            symbolHash = symbolHash25;
            baseUnit = baseUnit25;
            priceSource = priceSource25;
            fixedPrice = fixedPrice25;
            uniswapMarket = uniswapMarket25;
            reporter = reporter25;
            reporterMultiplier = reporterMultiplier25;
        } else if (i == 26) {
            underlying = underlying26;
            symbolHash = symbolHash26;
            baseUnit = baseUnit26;
            priceSource = priceSource26;
            fixedPrice = fixedPrice26;
            uniswapMarket = uniswapMarket26;
            reporter = reporter26;
            reporterMultiplier = reporterMultiplier26;
        } else if (i == 27) {
            underlying = underlying27;
            symbolHash = symbolHash27;
            baseUnit = baseUnit27;
            priceSource = priceSource27;
            fixedPrice = fixedPrice27;
            uniswapMarket = uniswapMarket27;
            reporter = reporter27;
            reporterMultiplier = reporterMultiplier27;
        } else if (i == 28) {
            underlying = underlying28;
            symbolHash = symbolHash28;
            baseUnit = baseUnit28;
            priceSource = priceSource28;
            fixedPrice = fixedPrice28;
            uniswapMarket = uniswapMarket28;
            reporter = reporter28;
            reporterMultiplier = reporterMultiplier28;
        } else if (i == 29) {
            underlying = underlying29;
            symbolHash = symbolHash29;
            baseUnit = baseUnit29;
            priceSource = priceSource29;
            fixedPrice = fixedPrice29;
            uniswapMarket = uniswapMarket29;
            reporter = reporter29;
            reporterMultiplier = reporterMultiplier29;
        } else if (i == 30) {
            underlying = underlying30;
            symbolHash = symbolHash30;
            baseUnit = baseUnit30;
            priceSource = priceSource30;
            fixedPrice = fixedPrice30;
            uniswapMarket = uniswapMarket30;
            reporter = reporter30;
            reporterMultiplier = reporterMultiplier30;
        } else if (i == 31) {
            underlying = underlying31;
            symbolHash = symbolHash31;
            baseUnit = baseUnit31;
            priceSource = priceSource31;
            fixedPrice = fixedPrice31;
            uniswapMarket = uniswapMarket31;
            reporter = reporter31;
            reporterMultiplier = reporterMultiplier31;
        } else if (i == 32) {
            underlying = underlying32;
            symbolHash = symbolHash32;
            baseUnit = baseUnit32;
            priceSource = priceSource32;
            fixedPrice = fixedPrice32;
            uniswapMarket = uniswapMarket32;
            reporter = reporter32;
            reporterMultiplier = reporterMultiplier32;
        } else if (i == 33) {
            underlying = underlying33;
            symbolHash = symbolHash33;
            baseUnit = baseUnit33;
            priceSource = priceSource33;
            fixedPrice = fixedPrice33;
            uniswapMarket = uniswapMarket33;
            reporter = reporter33;
            reporterMultiplier = reporterMultiplier33;
        } else if (i == 34) {
            underlying = underlying34;
            symbolHash = symbolHash34;
            baseUnit = baseUnit34;
            priceSource = priceSource34;
            fixedPrice = fixedPrice34;
            uniswapMarket = uniswapMarket34;
            reporter = reporter34;
            reporterMultiplier = reporterMultiplier34;
        }

        return
            TokenConfig({
                underlying: underlying,
                symbolHash: symbolHash,
                baseUnit: baseUnit,
                priceSource: priceSource,
                fixedPrice: fixedPrice,
                uniswapMarket: uniswapMarket,
                reporter: reporter,
                reporterMultiplier: reporterMultiplier,
                isUniswapReversed: ((isUniswapReversed >> i) & uint256(1)) == 1
            });
    }

    /**
     * @notice Get the config for symbol
     * @param symbol The symbol of the config to get
     * @return The config object
     */
    function getTokenConfigBySymbol(string calldata symbol)
        public
        view
        returns (TokenConfig memory)
    {
        return getTokenConfigBySymbolHash(keccak256(bytes(symbol)));
    }

    /**
     * @notice Get the config for the reporter
     * @param reporter The address of the reporter of the config to get
     * @return The config object
     */
    function getTokenConfigByReporter(address reporter)
        public
        view
        returns (TokenConfig memory)
    {
        return getTokenConfig(getReporterIndex(reporter));
    }

    /**
     * @notice Get the config for the symbolHash
     * @param symbolHash The keccack256 of the symbol of the config to get
     * @return The config object
     */
    function getTokenConfigBySymbolHash(bytes32 symbolHash)
        public
        view
        returns (TokenConfig memory)
    {
        return getTokenConfig(getSymbolHashIndex(symbolHash));
    }

    /**
     * @notice Get the config for an underlying asset
     * @param underlying The address of the underlying asset of the config to get
     * @return The config object
     */
    function getTokenConfigByUnderlying(address underlying)
        public
        view
        returns (TokenConfig memory)
    {
        return getTokenConfig(getUnderlyingIndex(underlying));
    }
}

// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.8.7;

// From: https://github.com/Uniswap/uniswap-v3-core

/// @title FixedPoint96
/// @notice A library for handling binary fixed point numbers, see https://en.wikipedia.org/wiki/Q_(number_format)
/// @dev Used in SqrtPriceMath.sol
library FixedPoint96 {
    uint8 internal constant RESOLUTION = 96;
    uint256 internal constant Q96 = 0x1000000000000000000000000;
}

/// @title Contains 512-bit math functions
/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision
/// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits
library FullMath {
    /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
    /// @param a The multiplicand
    /// @param b The multiplier
    /// @param denominator The divisor
    /// @return result The 256-bit result
    /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv
    function mulDiv(
        uint256 a,
        uint256 b,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        // 512-bit multiply [prod1 prod0] = a * b
        // Compute the product mod 2**256 and mod 2**256 - 1
        // then use the Chinese Remainder Theorem to reconstruct
        // the 512 bit result. The result is stored in two 256
        // variables such that product = prod1 * 2**256 + prod0
        uint256 prod0; // Least significant 256 bits of the product
        uint256 prod1; // Most significant 256 bits of the product
        assembly {
            let mm := mulmod(a, b, not(0))
            prod0 := mul(a, b)
            prod1 := sub(sub(mm, prod0), lt(mm, prod0))
        }

        // Handle non-overflow cases, 256 by 256 division
        if (prod1 == 0) {
            require(denominator > 0);
            assembly {
                result := div(prod0, denominator)
            }
            return result;
        }

        // Make sure the result is less than 2**256.
        // Also prevents denominator == 0
        require(denominator > prod1);

        ///////////////////////////////////////////////
        // 512 by 256 division.
        ///////////////////////////////////////////////

        // Make division exact by subtracting the remainder from [prod1 prod0]
        // Compute remainder using mulmod
        uint256 remainder;
        assembly {
            remainder := mulmod(a, b, denominator)
        }
        // Subtract 256 bit number from 512 bit number
        assembly {
            prod1 := sub(prod1, gt(remainder, prod0))
            prod0 := sub(prod0, remainder)
        }

        // Factor powers of two out of denominator
        // Compute largest power of two divisor of denominator.
        // Always >= 1.
        uint256 twos = denominator & (~denominator + 1);
        // Divide denominator by power of two
        assembly {
            denominator := div(denominator, twos)
        }

        // Divide [prod1 prod0] by the factors of two
        assembly {
            prod0 := div(prod0, twos)
        }
        // Shift in bits from prod1 into prod0. For this we need
        // to flip `twos` such that it is 2**256 / twos.
        // If twos is zero, then it becomes one
        assembly {
            twos := add(div(sub(0, twos), twos), 1)
        }
        prod0 |= prod1 * twos;

        // Invert denominator mod 2**256
        // Now that denominator is an odd number, it has an inverse
        // modulo 2**256 such that denominator * inv = 1 mod 2**256.
        // Compute the inverse by starting with a seed that is correct
        // correct for four bits. That is, denominator * inv = 1 mod 2**4
        uint256 inv = (3 * denominator) ^ 2;
        // Now use Newton-Raphson iteration to improve the precision.
        // Thanks to Hensel's lifting lemma, this also works in modular
        // arithmetic, doubling the correct bits in each step.
        inv *= 2 - denominator * inv; // inverse mod 2**8
        inv *= 2 - denominator * inv; // inverse mod 2**16
        inv *= 2 - denominator * inv; // inverse mod 2**32
        inv *= 2 - denominator * inv; // inverse mod 2**64
        inv *= 2 - denominator * inv; // inverse mod 2**128
        inv *= 2 - denominator * inv; // inverse mod 2**256

        // Because the division is now exact we can divide by multiplying
        // with the modular inverse of denominator. This will give us the
        // correct result modulo 2**256. Since the precoditions guarantee
        // that the outcome is less than 2**256, this is the final result.
        // We don't need to compute the high bits of the result and prod1
        // is no longer required.
        result = prod0 * inv;
        return result;
    }
}

/// @title Math library for computing sqrt prices from ticks and vice versa
/// @notice Computes sqrt price for ticks of size 1.0001, i.e. sqrt(1.0001^tick) as fixed point Q64.96 numbers. Supports
/// prices between 2**-128 and 2**128
library TickMath {
    /// @dev The maximum tick that may be passed to #getSqrtRatioAtTick computed from log base 1.0001 of 2**128
    int24 internal constant MIN_TICK = -887272;
    int24 internal constant MAX_TICK = -MIN_TICK;

    /// @dev The minimum value that can be returned from #getSqrtRatioAtTick. Equivalent to getSqrtRatioAtTick(MIN_TICK)
    uint160 internal constant MIN_SQRT_RATIO = 4295128739;
    /// @dev The maximum value that can be returned from #getSqrtRatioAtTick. Equivalent to getSqrtRatioAtTick(MAX_TICK)
    uint160 internal constant MAX_SQRT_RATIO =
        1461446703485210103287273052203988822378723970342;

    /// @notice Calculates sqrt(1.0001^tick) * 2^96
    /// @dev Throws if |tick| > max tick
    /// @param tick The input tick for the above formula
    /// @return sqrtPriceX96 A Fixed point Q64.96 number representing the sqrt of the ratio of the two assets (token1/token0)
    /// at the given tick
    function getSqrtRatioAtTick(int24 tick)
        internal
        pure
        returns (uint160 sqrtPriceX96)
    {
        uint256 absTick = tick < 0
            ? uint256(-int256(tick))
            : uint256(int256(tick));
        require(absTick <= uint256(uint24(MAX_TICK)), "T");

        uint256 ratio = absTick & 0x1 != 0
            ? 0xfffcb933bd6fad37aa2d162d1a594001
            : 0x100000000000000000000000000000000;
        if (absTick & 0x2 != 0)
            ratio = (ratio * 0xfff97272373d413259a46990580e213a) >> 128;
        if (absTick & 0x4 != 0)
            ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;
        if (absTick & 0x8 != 0)
            ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;
        if (absTick & 0x10 != 0)
            ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644) >> 128;
        if (absTick & 0x20 != 0)
            ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0) >> 128;
        if (absTick & 0x40 != 0)
            ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861) >> 128;
        if (absTick & 0x80 != 0)
            ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;
        if (absTick & 0x100 != 0)
            ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;
        if (absTick & 0x200 != 0)
            ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54) >> 128;
        if (absTick & 0x400 != 0)
            ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;
        if (absTick & 0x800 != 0)
            ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;
        if (absTick & 0x1000 != 0)
            ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;
        if (absTick & 0x2000 != 0)
            ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;
        if (absTick & 0x4000 != 0)
            ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;
        if (absTick & 0x8000 != 0)
            ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6) >> 128;
        if (absTick & 0x10000 != 0)
            ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;
        if (absTick & 0x20000 != 0)
            ratio = (ratio * 0x5d6af8dedb81196699c329225ee604) >> 128;
        if (absTick & 0x40000 != 0)
            ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98) >> 128;
        if (absTick & 0x80000 != 0)
            ratio = (ratio * 0x48a170391f7dc42444e8fa2) >> 128;

        if (tick > 0) ratio = type(uint256).max / ratio;

        // this divides by 1<<32 rounding up to go from a Q128.128 to a Q128.96.
        // we then downcast because we know the result always fits within 160 bits due to our tick input constraint
        // we round up in the division so getTickAtSqrtRatio of the output price is always consistent
        sqrtPriceX96 = uint160(
            (ratio >> 32) + (ratio % (1 << 32) == 0 ? 0 : 1)
        );
    }
}

interface IUniswapV3Pool {
    /// @notice The first of the two tokens of the pool, sorted by address
    /// @return The token contract address
    function token0() external view returns (address);

    /// @notice The second of the two tokens of the pool, sorted by address
    /// @return The token contract address
    function token1() external view returns (address);

    /// @notice Returns the cumulative tick and liquidity as of each timestamp `secondsAgo` from the current block timestamp
    /// @dev To get a time weighted average tick or liquidity-in-range, you must call this with two values, one representing
    /// the beginning of the period and another for the end of the period. E.g., to get the last hour time-weighted average tick,
    /// you must call it with secondsAgos = [3600, 0].
    /// @dev The time weighted average tick represents the geometric time weighted average price of the pool, in
    /// log base sqrt(1.0001) of token1 / token0. The TickMath library can be used to go from a tick value to a ratio.
    /// @param secondsAgos From how long ago each cumulative tick and liquidity value should be returned
    /// @return tickCumulatives Cumulative tick values as of each `secondsAgos` from the current block timestamp
    /// @return secondsPerLiquidityCumulativeX128s Cumulative seconds per liquidity-in-range value as of each `secondsAgos` from the current block
    /// timestamp
    function observe(uint32[] calldata secondsAgos)
        external
        view
        returns (
            int56[] memory tickCumulatives,
            uint160[] memory secondsPerLiquidityCumulativeX128s
        );

    /// @notice Swap token0 for token1, or token1 for token0
    /// @dev The caller of this method receives a callback in the form of IUniswapV3SwapCallback#uniswapV3SwapCallback
    /// @param recipient The address to receive the output of the swap
    /// @param zeroForOne The direction of the swap, true for token0 to token1, false for token1 to token0
    /// @param amountSpecified The amount of the swap, which implicitly configures the swap as exact input (positive), or exact output (negative)
    /// @param sqrtPriceLimitX96 The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this
    /// value after the swap. If one for zero, the price cannot be greater than this value after the swap
    /// @param data Any data to be passed through to the callback
    /// @return amount0 The delta of the balance of token0 of the pool, exact when negative, minimum when positive
    /// @return amount1 The delta of the balance of token1 of the pool, exact when negative, minimum when positive
    function swap(
        address recipient,
        bool zeroForOne,
        int256 amountSpecified,
        uint160 sqrtPriceLimitX96,
        bytes calldata data
    ) external returns (int256 amount0, int256 amount1);
}

/// @title Callback for IUniswapV3PoolActions#swap
/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface
interface IUniswapV3SwapCallback {
    /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap.
    /// @dev In the implementation you must pay the pool tokens owed for the swap.
    /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory.
    /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.
    /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token0 to the pool.
    /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token1 to the pool.
    /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call
    function uniswapV3SwapCallback(
        int256 amount0Delta,
        int256 amount1Delta,
        bytes calldata data
    ) external;
}

interface IERC20 {
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool success);
}

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.7;

/**
 * @notice A contract with helpers for safe contract ownership.
 */
contract Ownable {

    address private ownerAddr;
    address private pendingOwnerAddr;

    event OwnershipTransferRequested(address indexed from, address indexed to);
    event OwnershipTransferred(address indexed from, address indexed to);

    constructor() {
        ownerAddr = msg.sender;
    }

    /**
    * @notice Allows an owner to begin transferring ownership to a new address,
    * pending.
    */
    function transferOwnership(address to) external onlyOwner() {
        require(to != msg.sender, "Cannot transfer to self");

        pendingOwnerAddr = to;

        emit OwnershipTransferRequested(ownerAddr, to);
    }

    /**
    * @notice Allows an ownership transfer to be completed by the recipient.
    */
    function acceptOwnership() external {
        require(msg.sender == pendingOwnerAddr, "Must be proposed owner");

        address oldOwner = ownerAddr;
        ownerAddr = msg.sender;
        pendingOwnerAddr = address(0);

        emit OwnershipTransferred(oldOwner, msg.sender);
    }

    /**
    * @notice Get the current owner
    */
    function owner() public view returns (address) {
        return ownerAddr;
    }

    /**
    * @notice Reverts if called by anyone other than the contract owner.
    */
    modifier onlyOwner() {
        require(msg.sender == ownerAddr, "Only callable by owner");
        _;
    }

}

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

interface AggregatorValidatorInterface {
	function validate(uint256 previousRoundId,
			int256 previousAnswer,
			uint256 currentRoundId,
			int256 currentAnswer) external returns (bool);
}

// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.8.7;

interface CErc20 {
    function underlying() external view returns (address);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256","name":"anchorToleranceMantissa_","type":"uint256"},{"internalType":"uint32","name":"anchorPeriod_","type":"uint32"},{"components":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"address","name":"reporter","type":"address"},{"internalType":"uint256","name":"reporterMultiplier","type":"uint256"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig[]","name":"configs","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"symbolHash","type":"bytes32"}],"name":"FailoverActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"symbolHash","type":"bytes32"}],"name":"FailoverDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"reporterPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"anchorPrice","type":"uint256"}],"name":"PriceGuarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"PriceUpdated","type":"event"},{"inputs":[],"name":"ETH_BASE_UNIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXP_SCALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_INTEGER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"symbolHash","type":"bytes32"}],"name":"activateFailover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"anchorPeriod","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"symbolHash","type":"bytes32"}],"name":"deactivateFailover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getTokenConfig","outputs":[{"components":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"address","name":"reporter","type":"address"},{"internalType":"uint256","name":"reporterMultiplier","type":"uint256"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reporter","type":"address"}],"name":"getTokenConfigByReporter","outputs":[{"components":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"address","name":"reporter","type":"address"},{"internalType":"uint256","name":"reporterMultiplier","type":"uint256"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"getTokenConfigBySymbol","outputs":[{"components":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"address","name":"reporter","type":"address"},{"internalType":"uint256","name":"reporterMultiplier","type":"uint256"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"symbolHash","type":"bytes32"}],"name":"getTokenConfigBySymbolHash","outputs":[{"components":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"address","name":"reporter","type":"address"},{"internalType":"uint256","name":"reporterMultiplier","type":"uint256"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"getTokenConfigByUnderlying","outputs":[{"components":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"address","name":"reporter","type":"address"},{"internalType":"uint256","name":"reporterMultiplier","type":"uint256"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"cToken","type":"address"}],"name":"getUnderlyingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lowerBoundAnchorRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"symbolHash","type":"bytes32"}],"name":"pokeFailedOverPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"prices","outputs":[{"internalType":"uint248","name":"price","type":"uint248"},{"internalType":"bool","name":"failoverActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upperBoundAnchorRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"int256","name":"currentAnswer","type":"int256"}],"name":"validate","outputs":[{"internalType":"bool","name":"valid","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6124206040523480156200001257600080fd5b5060405162008dc838038062008dc8833981016040819052620000359162001b67565b80602381511115620000795760405162461bcd60e51b8152602060048201526008602482015267546f6f206d616e7960c01b60448201526064015b60405180910390fd5b805160805260006200008c828262001a60565b80516001600160601b0319606091821b1660a0526020820151610500526040820151610960528101519091506002811115620000cc57620000cc62001dad565b610dc0816002811115620000e457620000e462001dad565b60f81b90525060808101516112205260a08101516001600160601b0319606091821b81166116805260c083015190911b16611ae05260e0810151611f40526200012f82600162001a60565b80516001600160601b0319606091821b1660c05260208201516105205260408201516109805281015190915060028111156200016f576200016f62001dad565b610de081600281111562000187576200018762001dad565b60f81b90525060808101516112405260a08101516001600160601b0319606091821b81166116a05260c083015190911b16611b005260e0810151611f6052620001d282600262001a60565b80516001600160601b0319606091821b1660e05260208201516105405260408201516109a052810151909150600281111562000212576200021262001dad565b610e008160028111156200022a576200022a62001dad565b60f81b90525060808101516112605260a08101516001600160601b0319606091821b81166116c05260c083015190911b16611b205260e0810151611f80526200027582600362001a60565b80516001600160601b0319606091821b166101005260208201516105605260408201516109c0528101519091506002811115620002b657620002b662001dad565b610e20816002811115620002ce57620002ce62001dad565b60f81b90525060808101516112805260a08101516001600160601b0319606091821b81166116e05260c083015190911b16611b405260e0810151611fa0526200031982600462001a60565b80516001600160601b0319606091821b166101205260208201516105805260408201516109e05281015190915060028111156200035a576200035a62001dad565b610e4081600281111562000372576200037262001dad565b60f81b90525060808101516112a05260a08101516001600160601b0319606091821b81166117005260c083015190911b16611b605260e0810151611fc052620003bd82600562001a60565b80516001600160601b0319606091821b166101405260208201516105a0526040820151610a00528101519091506002811115620003fe57620003fe62001dad565b610e6081600281111562000416576200041662001dad565b60f81b90525060808101516112c05260a08101516001600160601b0319606091821b81166117205260c083015190911b16611b805260e0810151611fe0526200046182600662001a60565b80516001600160601b0319606091821b166101605260208201516105c0526040820151610a20528101519091506002811115620004a257620004a262001dad565b610e80816002811115620004ba57620004ba62001dad565b60f81b90525060808101516112e05260a08101516001600160601b0319606091821b81166117405260c083015190911b16611ba05260e0810151612000526200050582600762001a60565b80516001600160601b0319606091821b166101805260208201516105e0526040820151610a4052810151909150600281111562000546576200054662001dad565b610ea08160028111156200055e576200055e62001dad565b60f81b90525060808101516113005260a08101516001600160601b0319606091821b81166117605260c083015190911b16611bc05260e081015161202052620005a982600862001a60565b80516001600160601b0319606091821b166101a0526020820151610600526040820151610a60528101519091506002811115620005ea57620005ea62001dad565b610ec081600281111562000602576200060262001dad565b60f81b90525060808101516113205260a08101516001600160601b0319606091821b81166117805260c083015190911b16611be05260e0810151612040526200064d82600962001a60565b80516001600160601b0319606091821b166101c0526020820151610620526040820151610a805281015190915060028111156200068e576200068e62001dad565b610ee0816002811115620006a657620006a662001dad565b60f81b90525060808101516113405260a08101516001600160601b0319606091821b81166117a05260c083015190911b16611c005260e081015161206052620006f182600a62001a60565b80516001600160601b0319606091821b166101e0526020820151610640526040820151610aa052810151909150600281111562000732576200073262001dad565b610f008160028111156200074a576200074a62001dad565b60f81b90525060808101516113605260a08101516001600160601b0319606091821b81166117c05260c083015190911b16611c205260e0810151612080526200079582600b62001a60565b80516001600160601b0319606091821b16610200526020820151610660526040820151610ac0528101519091506002811115620007d657620007d662001dad565b610f20816002811115620007ee57620007ee62001dad565b60f81b90525060808101516113805260a08101516001600160601b0319606091821b81166117e05260c083015190911b16611c405260e08101516120a0526200083982600c62001a60565b80516001600160601b0319606091821b16610220526020820151610680526040820151610ae05281015190915060028111156200087a576200087a62001dad565b610f4081600281111562000892576200089262001dad565b60f81b90525060808101516113a05260a08101516001600160601b0319606091821b81166118005260c083015190911b16611c605260e08101516120c052620008dd82600d62001a60565b80516001600160601b0319606091821b166102405260208201516106a0526040820151610b005281015190915060028111156200091e576200091e62001dad565b610f6081600281111562000936576200093662001dad565b60f81b90525060808101516113c05260a08101516001600160601b0319606091821b81166118205260c083015190911b16611c805260e08101516120e0526200098182600e62001a60565b80516001600160601b0319606091821b166102605260208201516106c0526040820151610b20528101519091506002811115620009c257620009c262001dad565b610f80816002811115620009da57620009da62001dad565b60f81b90525060808101516113e05260a08101516001600160601b0319606091821b81166118405260c083015190911b16611ca05260e08101516121005262000a2582600f62001a60565b80516001600160601b0319606091821b166102805260208201516106e0526040820151610b4052810151909150600281111562000a665762000a6662001dad565b610fa081600281111562000a7e5762000a7e62001dad565b60f81b90525060808101516114005260a08101516001600160601b0319606091821b81166118605260c083015190911b16611cc05260e08101516121205262000ac982601062001a60565b80516001600160601b0319606091821b166102a0526020820151610700526040820151610b6052810151909150600281111562000b0a5762000b0a62001dad565b610fc081600281111562000b225762000b2262001dad565b60f81b90525060808101516114205260a08101516001600160601b0319606091821b81166118805260c083015190911b16611ce05260e08101516121405262000b6d82601162001a60565b80516001600160601b0319606091821b166102c0526020820151610720526040820151610b8052810151909150600281111562000bae5762000bae62001dad565b610fe081600281111562000bc65762000bc662001dad565b60f81b90525060808101516114405260a08101516001600160601b0319606091821b81166118a05260c083015190911b16611d005260e08101516121605262000c1182601262001a60565b80516001600160601b0319606091821b166102e0526020820151610740526040820151610ba052810151909150600281111562000c525762000c5262001dad565b61100081600281111562000c6a5762000c6a62001dad565b60f81b90525060808101516114605260a08101516001600160601b0319606091821b81166118c05260c083015190911b16611d205260e08101516121805262000cb582601362001a60565b80516001600160601b0319606091821b16610300526020820151610760526040820151610bc052810151909150600281111562000cf65762000cf662001dad565b61102081600281111562000d0e5762000d0e62001dad565b60f81b90525060808101516114805260a08101516001600160601b0319606091821b81166118e05260c083015190911b16611d405260e08101516121a05262000d5982601462001a60565b80516001600160601b0319606091821b16610320526020820151610780526040820151610be052810151909150600281111562000d9a5762000d9a62001dad565b61104081600281111562000db25762000db262001dad565b60f81b90525060808101516114a05260a08101516001600160601b0319606091821b81166119005260c083015190911b16611d605260e08101516121c05262000dfd82601562001a60565b80516001600160601b0319606091821b166103405260208201516107a0526040820151610c0052810151909150600281111562000e3e5762000e3e62001dad565b61106081600281111562000e565762000e5662001dad565b60f81b90525060808101516114c05260a08101516001600160601b0319606091821b81166119205260c083015190911b16611d805260e08101516121e05262000ea182601662001a60565b80516001600160601b0319606091821b166103605260208201516107c0526040820151610c2052810151909150600281111562000ee25762000ee262001dad565b61108081600281111562000efa5762000efa62001dad565b60f81b90525060808101516114e05260a08101516001600160601b0319606091821b81166119405260c083015190911b16611da05260e08101516122005262000f4582601762001a60565b80516001600160601b0319606091821b166103805260208201516107e0526040820151610c4052810151909150600281111562000f865762000f8662001dad565b6110a081600281111562000f9e5762000f9e62001dad565b60f81b90525060808101516115005260a08101516001600160601b0319606091821b81166119605260c083015190911b16611dc05260e08101516122205262000fe982601862001a60565b80516001600160601b0319606091821b166103a0526020820151610800526040820151610c605281015190915060028111156200102a576200102a62001dad565b6110c081600281111562001042576200104262001dad565b60f81b90525060808101516115205260a08101516001600160601b0319606091821b81166119805260c083015190911b16611de05260e0810151612240526200108d82601962001a60565b80516001600160601b0319606091821b166103c0526020820151610820526040820151610c80528101519091506002811115620010ce57620010ce62001dad565b6110e0816002811115620010e657620010e662001dad565b60f81b90525060808101516115405260a08101516001600160601b0319606091821b81166119a05260c083015190911b16611e005260e0810151612260526200113182601a62001a60565b80516001600160601b0319606091821b166103e0526020820151610840526040820151610ca052810151909150600281111562001172576200117262001dad565b6111008160028111156200118a576200118a62001dad565b60f81b90525060808101516115605260a08101516001600160601b0319606091821b81166119c05260c083015190911b16611e205260e081015161228052620011d582601b62001a60565b80516001600160601b0319606091821b16610400526020820151610860526040820151610cc052810151909150600281111562001216576200121662001dad565b6111208160028111156200122e576200122e62001dad565b60f81b90525060808101516115805260a08101516001600160601b0319606091821b81166119e05260c083015190911b16611e405260e08101516122a0526200127982601c62001a60565b80516001600160601b0319606091821b16610420526020820151610880526040820151610ce0528101519091506002811115620012ba57620012ba62001dad565b611140816002811115620012d257620012d262001dad565b60f81b90525060808101516115a05260a08101516001600160601b0319606091821b8116611a005260c083015190911b16611e605260e08101516122c0526200131d82601d62001a60565b80516001600160601b0319606091821b166104405260208201516108a0526040820151610d005281015190915060028111156200135e576200135e62001dad565b61116081600281111562001376576200137662001dad565b60f81b90525060808101516115c05260a08101516001600160601b0319606091821b8116611a205260c083015190911b16611e805260e08101516122e052620013c182601e62001a60565b80516001600160601b0319606091821b166104605260208201516108c0526040820151610d2052810151909150600281111562001402576200140262001dad565b6111808160028111156200141a576200141a62001dad565b60f81b90525060808101516115e05260a08101516001600160601b0319606091821b8116611a405260c083015190911b16611ea05260e0810151612300526200146582601f62001a60565b80516001600160601b0319606091821b166104805260208201516108e0526040820151610d40528101519091506002811115620014a657620014a662001dad565b6111a0816002811115620014be57620014be62001dad565b60f81b90525060808101516116005260a08101516001600160601b0319606091821b8116611a605260c083015190911b16611ec05260e0810151612320526200150982602062001a60565b80516001600160601b0319606091821b166104a0526020820151610900526040820151610d605281015190915060028111156200154a576200154a62001dad565b6111c081600281111562001562576200156262001dad565b60f81b90525060808101516116205260a08101516001600160601b0319606091821b8116611a805260c083015190911b16611ee05260e081015161234052620015ad82602162001a60565b80516001600160601b0319606091821b166104c0526020820151610920526040820151610d80528101519091506002811115620015ee57620015ee62001dad565b6111e081600281111562001606576200160662001dad565b60f81b90525060808101516116405260a08101516001600160601b0319606091821b8116611aa05260c083015190911b16611f005260e0810151612360526200165182602262001a60565b80516001600160601b0319606091821b166104e0526020820151610940526040820151610da052810151909150600281111562001692576200169262001dad565b611200816002811115620016aa57620016aa62001dad565b60f81b90525060808101516116605260a08101516001600160601b0319606091821b8116611ac05260c083015190911b16611f205260e0810151612380528151600090815b8181101562001742578481815181106200170d576200170d62001dc3565b60200260200101519350836101000151156200172d57806001901b831792505b80620017398162001d79565b915050620016ef565b50506123a0525050600080546001600160a01b0319163317905563ffffffff8216620017a15760405162461bcd60e51b815260206004820152600d60248201526c0506572696f64206e6f74203e3609c1b604482015260640162000070565b6001600160e01b031960e083901b1661240052620017ca670de0b6b3a764000060001962001d5f565b8311620017eb57620017e583670de0b6b3a764000062001d44565b620017ef565b6000195b6123c052670de0b6b3a764000083106200180b5760016200181f565b6200181f83670de0b6b3a764000062001d5f565b6123e052805160005b8181101562001a5557600083828151811062001848576200184862001dc3565b6020026020010151905060008160400151116200189a5760405162461bcd60e51b815260206004820152600f60248201526e062617365556e6974206e6f74203e3608c1b604482015260640162000070565b60a0810151600282606001516002811115620018ba57620018ba62001dad565b141562001992576001600160a01b038116620019055760405162461bcd60e51b815260206004820152600960248201526827379030b731b437b960b91b604482015260640162000070565b60c08201516001600160a01b03166200194f5760405162461bcd60e51b815260206004820152600b60248201526a2737903932b837b93a32b960a91b604482015260640162000070565b602080830151600090815260029091526040902080547fff0000000000000000000000000000000000000000000000000000000000000016600117905562001a3d565b6001600160a01b03811615620019e05760405162461bcd60e51b81526020600482015260126024820152712237b2b9b73a103732b2b21030b731b437b960711b604482015260640162000070565b60c08201516001600160a01b03161562001a3d5760405162461bcd60e51b815260206004820152601460248201527f446f65736e74206e656564207265706f72746572000000000000000000000000604482015260640162000070565b5050808062001a4c9062001d79565b91505062001828565b505050505062001def565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810191909152825182101562001ad85782828151811062001ac85762001ac862001dc3565b6020026020010151905062001b23565b506040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101919091525b92915050565b80516001600160a01b038116811462001b4157600080fd5b919050565b8051801515811462001b4157600080fd5b80516003811062001b4157600080fd5b6000806000606080858703121562001b7e57600080fd5b8451935060208086015163ffffffff8116811462001b9b57600080fd5b604087810151919550906001600160401b038082111562001bbb57600080fd5b818901915089601f83011262001bd057600080fd5b81518181111562001be55762001be562001dd9565b62001bf5858260051b0162001d11565b8181528581019250838601610120808402860188018e101562001c1757600080fd5b600095505b8386101562001cd25780828f03121562001c3557600080fd5b62001c3f62001ce5565b62001c4a8362001b29565b81528883015189820152878301518882015262001c698a840162001b57565b818b01526080838101519082015260a062001c8681850162001b29565b9082015260c062001c9984820162001b29565b9082015260e0838101519082015261010062001cb781850162001b46565b90820152855260019590950194938701939081019062001c1c565b5050809750505050505050509250925092565b60405161012081016001600160401b038111828210171562001d0b5762001d0b62001dd9565b60405290565b604051601f8201601f191681016001600160401b038111828210171562001d3c5762001d3c62001dd9565b604052919050565b6000821982111562001d5a5762001d5a62001d97565b500190565b60008282101562001d745762001d7462001d97565b500390565b600060001982141562001d905762001d9062001d97565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60805160a05160601c60c05160601c60e05160601c6101005160601c6101205160601c6101405160601c6101605160601c6101805160601c6101a05160601c6101c05160601c6101e05160601c6102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c05160601c6102e05160601c6103005160601c6103205160601c6103405160601c6103605160601c6103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c6104405160601c6104605160601c6104805160601c6104a05160601c6104c05160601c6104e05160601c61050051610520516105405161056051610580516105a0516105c0516105e05161060051610620516106405161066051610680516106a0516106c0516106e05161070051610720516107405161076051610780516107a0516107c0516107e05161080051610820516108405161086051610880516108a0516108c0516108e05161090051610920516109405161096051610980516109a0516109c0516109e051610a0051610a2051610a4051610a6051610a8051610aa051610ac051610ae051610b0051610b2051610b4051610b6051610b8051610ba051610bc051610be051610c0051610c2051610c4051610c6051610c8051610ca051610cc051610ce051610d0051610d2051610d4051610d6051610d8051610da051610dc05160f81c610de05160f81c610e005160f81c610e205160f81c610e405160f81c610e605160f81c610e805160f81c610ea05160f81c610ec05160f81c610ee05160f81c610f005160f81c610f205160f81c610f405160f81c610f605160f81c610f805160f81c610fa05160f81c610fc05160f81c610fe05160f81c6110005160f81c6110205160f81c6110405160f81c6110605160f81c6110805160f81c6110a05160f81c6110c05160f81c6110e05160f81c6111005160f81c6111205160f81c6111405160f81c6111605160f81c6111805160f81c6111a05160f81c6111c05160f81c6111e05160f81c6112005160f81c611220516112405161126051611280516112a0516112c0516112e05161130051611320516113405161136051611380516113a0516113c0516113e05161140051611420516114405161146051611480516114a0516114c0516114e05161150051611520516115405161156051611580516115a0516115c0516115e051611600516116205161164051611660516116805160601c6116a05160601c6116c05160601c6116e05160601c6117005160601c6117205160601c6117405160601c6117605160601c6117805160601c6117a05160601c6117c05160601c6117e05160601c6118005160601c6118205160601c6118405160601c6118605160601c6118805160601c6118a05160601c6118c05160601c6118e05160601c6119005160601c6119205160601c6119405160601c6119605160601c6119805160601c6119a05160601c6119c05160601c6119e05160601c611a005160601c611a205160601c611a405160601c611a605160601c611a805160601c611aa05160601c611ac05160601c611ae05160601c611b005160601c611b205160601c611b405160601c611b605160601c611b805160601c611ba05160601c611bc05160601c611be05160601c611c005160601c611c205160601c611c405160601c611c605160601c611c805160601c611ca05160601c611cc05160601c611ce05160601c611d005160601c611d205160601c611d405160601c611d605160601c611d805160601c611da05160601c611dc05160601c611de05160601c611e005160601c611e205160601c611e405160601c611e605160601c611e805160601c611ea05160601c611ec05160601c611ee05160601c611f005160601c611f205160601c611f4051611f6051611f8051611fa051611fc051611fe05161200051612020516120405161206051612080516120a0516120c0516120e05161210051612120516121405161216051612180516121a0516121c0516121e05161220051612220516122405161226051612280516122a0516122c0516122e05161230051612320516123405161236051612380516123a0516123c0516123e0516124005160e01c615eea62002ede6000396000818161033801526152460152600081816102ee0152614edd0152600081816101990152614eb2015260006130e50152600061305801526000612f3301526000612e0e01526000612ce901526000612bc401526000612a9f0152600061297a01526000612855015260006127300152600061260b015260006124e6015260006123c10152600061229c015260006121770152600061205201526000611f2d01526000611e0801526000611ce301526000611bbe01526000611a99015260006119740152600061184f0152600061172a01526000611605015260006114e0015260006113bb01526000611296015260006111710152600061104c01526000610f2701526000610e0201526000610cdd01526000610bb801526000610a930152600061096e015260008181613035015261443f015260008181612f1001526143fd015260008181612deb01526143bb015260008181612cc60152614379015260008181612ba10152614337015260008181612a7c01526142f501526000818161295701526142b3015260008181612832015261427101526000818161270d015261422f0152600081816125e801526141ed0152600081816124c301526141ab01526000818161239e0152614169015260008181612279015261412701526000818161215401526140e501526000818161202f01526140a3015260008181611f0a0152614061015260008181611de5015261401f015260008181611cc00152613fdd015260008181611b9b0152613f9b015260008181611a760152613f590152600081816119510152613f1701526000818161182c0152613ed50152600081816117070152613e930152600081816115e20152613e510152600081816114bd0152613e0f0152600081816113980152613dcd0152600081816112730152613d8b01526000818161114e0152613d490152600081816110290152613d07015260008181610f040152613cc5015260008181610ddf0152613c83015260008181610cba0152613c41015260008181610b950152613bff015260008181610a700152613bbd01526000818161094b0152613b7b0152600061301201526000612eed01526000612dc801526000612ca301526000612b7e01526000612a59015260006129340152600061280f015260006126ea015260006125c5015260006124a00152600061237b01526000612256015260006121310152600061200c01526000611ee701526000611dc201526000611c9d01526000611b7801526000611a530152600061192e01526000611809015260006116e4015260006115bf0152600061149a01526000611375015260006112500152600061112b0152600061100601526000610ee101526000610dbc01526000610c9701526000610b7201526000610a4d0152600061092801526000612fef01526000612eca01526000612da501526000612c8001526000612b5b01526000612a3601526000612911015260006127ec015260006126c7015260006125a20152600061247d01526000612358015260006122330152600061210e01526000611fe901526000611ec401526000611d9f01526000611c7a01526000611b5501526000611a300152600061190b015260006117e6015260006116c10152600061159c01526000611477015260006113520152600061122d0152600061110801526000610fe301526000610ebe01526000610d9901526000610c7401526000610b4f01526000610a2a0152600061090501526000612fcc01526000612ea701526000612d8201526000612c5d01526000612b3801526000612a13015260006128ee015260006127c9015260006126a40152600061257f0152600061245a0152600061233501526000612210015260006120eb01526000611fc601526000611ea101526000611d7c01526000611c5701526000611b3201526000611a0d015260006118e8015260006117c30152600061169e01526000611579015260006114540152600061132f0152600061120a015260006110e501526000610fc001526000610e9b01526000610d7601526000610c5101526000610b2c01526000610a07015260006108e201526000612fa901526000612e8401526000612d5f01526000612c3a01526000612b15015260006129f0015260006128cb015260006127a6015260006126810152600061255c0152600061243701526000612312015260006121ed015260006120c801526000611fa301526000611e7e01526000611d5901526000611c3401526000611b0f015260006119ea015260006118c5015260006117a00152600061167b01526000611556015260006114310152600061130c015260006111e7015260006110c201526000610f9d01526000610e7801526000610d5301526000610c2e01526000610b09015260006109e4015260006108bf015260008181612f860152613b40015260008181612e610152613b10015260008181612d3c0152613ae0015260008181612c170152613ab0015260008181612af20152613a800152600081816129cd0152613a500152600081816128a80152613a2001526000818161278301526139f001526000818161265e01526139c0015260008181612539015261399001526000818161241401526139600152600081816122ef01526139300152600081816121ca01526139000152600081816120a501526138d0015260008181611f8001526138a0015260008181611e5b0152613870015260008181611d360152613840015260008181611c110152613810015260008181611aec01526137e00152600081816119c701526137b00152600081816118a2015261378001526000818161177d0152613750015260008181611658015261372001526000818161153301526136f001526000818161140e01526136c00152600081816112e901526136900152600081816111c4015261366001526000818161109f0152613630015260008181610f7a0152613600015260008181610e5501526135d0015260008181610d3001526135a0015260008181610c0b0152613570015260008181610ae601526135400152600081816109c1015261351001526000818161089c01526134e0015260008181612f630152614d47015260008181612e3e0152614d05015260008181612d190152614cc3015260008181612bf40152614c81015260008181612acf0152614c3f0152600081816129aa0152614bfd0152600081816128850152614bbb0152600081816127600152614b7901526000818161263b0152614b370152600081816125160152614af50152600081816123f10152614ab30152600081816122cc0152614a710152600081816121a70152614a2f01526000818161208201526149ed015260008181611f5d01526149ab015260008181611e380152614969015260008181611d130152614927015260008181611bee01526148e5015260008181611ac901526148a30152600081816119a4015261486101526000818161187f015261481f01526000818161175a01526147dd015260008181611635015261479b01526000818161151001526147590152600081816113eb01526147170152600081816112c601526146d50152600081816111a1015261469301526000818161107c0152614651015260008181610f57015261460f015260008181610e3201526145cd015260008181610d0d015261458b015260008181610be80152614549015260008181610ac3015261450701526000818161099e01526144c501526000818161087901526144830152600081816102c7015261080f0152615eea6000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80638185b81c116100c3578063beed9b511161007c578063beed9b5114610310578063e9206d7814610333578063f2fde38b1461036f578063f47c84c514610382578063fc57d4df1461038a578063fe2c61981461039d57600080fd5b80638185b81c146102815780638a003888146102945780638da5cb5b146102a75780638e499bcf146102c257806392b84357146102e9578063bbba205d1461015257600080fd5b80634da21942116101155780634da21942146101e15780635f396923146101f457806360846bc61461020957806368f9a97f1461025d57806378eadb1a1461027057806379ba50971461027957600080fd5b8063152810fb146101525780631a125204146101745780632410520914610194578063276c2cba146101bb57806329feb7bc146101ce575b600080fd5b610161670de0b6b3a764000081565b6040519081526020015b60405180910390f35b610187610182366004615a97565b6103b0565b60405161016b9190615bde565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b6101876101c9366004615ab0565b6103ca565b6101876101dc36600461598b565b6103f9565b6101876101ef36600461598b565b61040d565b610207610202366004615a97565b610421565b005b61023e610217366004615a97565b6002602052600090815260409020546001600160f81b03811690600160f81b900460ff1682565b604080516001600160f81b03909316835290151560208301520161016b565b61020761026b366004615a97565b610561565b61016160001981565b61020761069a565b61020761028f366004615a97565b610744565b6101876102a2366004615a97565b610805565b6000546040516001600160a01b03909116815260200161016b565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b61032361031e366004615b22565b61311e565b604051901515815260200161016b565b61035a7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff909116815260200161016b565b61020761037d36600461598b565b61334b565b610161602381565b61016161039836600461598b565b61341f565b6101616103ab366004615ab0565b6134bc565b6103b86158c4565b6103c46102a2836134dc565b92915050565b6103d26158c4565b6103f283836040516103e5929190615b54565b60405180910390206103b0565b9392505050565b6104016158c4565b6103c46102a283613b77565b6104156158c4565b6103c46102a28361447f565b6000546001600160a01b031633146104545760405162461bcd60e51b815260040161044b90615bae565b60405180910390fd5b600081815260026020526040902054600160f81b900460ff16156104ab5760405162461bcd60e51b815260206004820152600e60248201526d416c72656164792061637469766560901b604482015260640161044b565b60006104b6826103b0565b90506002816060015160028111156104d0576104d0615e5a565b1461050c5760405162461bcd60e51b815260206004820152600c60248201526b2737ba103932b837b93a32b960a11b604482015260640161044b565b60008281526002602052604080822080546001600160f81b0316600160f81b1790555183917fdd0f1f4e105bf96c7d8e2defcbbc958075661165b324633175ca26f08a11f4b491a261055d82610561565b5050565b6000818152600260209081526040918290208251808401909352546001600160f81b0381168352600160f81b900460ff1615159082018190526105d35760405162461bcd60e51b815260206004820152600a6024820152694e6f742061637469766560b01b604482015260640161044b565b60006105de836103b0565b905060006105eb82614d87565b9050600160f81b81106106315760405162461bcd60e51b815260206004820152600e60248201526d416e63686f7220746f6f2062696760901b604482015260640161044b565b6020828101805160009081526002835260409081902080546001600160f81b0319166001600160f81b0386161790559051905183815290917f46eec4e0eeeef5830de3472bb39db7e52b1c809286dc87c4b85b20e003cc70c3910160405180910390a250505050565b6001546001600160a01b031633146106ed5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b604482015260640161044b565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000546001600160a01b0316331461076e5760405162461bcd60e51b815260040161044b90615bae565b600081815260026020526040902054600160f81b900460ff166107c05760405162461bcd60e51b815260206004820152600a6024820152694e6f742061637469766560b01b604482015260640161044b565b60008181526002602052604080822080546001600160f81b031690555182917f5a1062b4c89c41b46f5e2da710d564c88989bfe1b4e856dbdbc40c5c59a2ce4b91a250565b61080d6158c4565b7f000000000000000000000000000000000000000000000000000000000000000082106108685760405162461bcd60e51b8152602060048201526009602482015268139bdd08199bdd5b9960ba1b604482015260640161044b565b6000808080808080808961099257507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b8960011415610ab757507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b8960021415610bdc57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b8960031415610d0157507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b8960041415610e2657507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b8960051415610f4b57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b896006141561107057507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b896007141561119557507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89600814156112ba57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89600914156113df57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89600a141561150457507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89600b141561162957507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89600c141561174e57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89600d141561187357507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89600e141561199857507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89600f1415611abd57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b8960101415611be257507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b8960111415611d0757507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b8960121415611e2c57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b8960131415611f5157507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b896014141561207657507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b896015141561219b57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601614156122c057507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601714156123e557507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b896018141561250a57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b896019141561262f57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601a141561275457507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601b141561287957507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601c141561299e57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601d1415612ac357507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601e1415612be857507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601f1415612d0d57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b8960201415612e3257507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b8960211415612f5757507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b896022141561307857507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f00000000000000000000000000000000000000000000000000000000000000005b604051806101200160405280896001600160a01b031681526020018881526020018781526020018660028111156130b1576130b1615e5a565b8152602001858152602001846001600160a01b03168152602001836001600160a01b0316815260200182815260200160018c7f0000000000000000000000000000000000000000000000000000000000000000901c16600114151581525098505050505050505050919050565b60008061312a336103f9565b905060006131388285614e2e565b9050600061314583614d87565b6020848101516000908152600282526040908190208151808301909252546001600160f81b0381168252600160f81b900460ff161580159282019290925291925061323657600160f81b82106131ce5760405162461bcd60e51b815260206004820152600e60248201526d416e63686f7220746f6f2062696760901b604482015260640161044b565b6020848101805160009081526002835260409081902080546001600160f81b0319166001600160f81b0387161790559051905184815290917f46eec4e0eeeef5830de3472bb39db7e52b1c809286dc87c4b85b20e003cc70c3910160405180910390a261333f565b6132408383614e91565b156132f757600160f81b831061328b5760405162461bcd60e51b815260206004820152601060248201526f5265706f7274656420746f6f2062696760801b604482015260640161044b565b6020848101805160009081526002835260409081902080546001600160f81b0319166001600160f81b0388161790559051905185815290917f46eec4e0eeeef5830de3472bb39db7e52b1c809286dc87c4b85b20e003cc70c3910160405180910390a26001945061333f565b83602001517f6b871468876a51b1609c5e5fc5c6f57c7e9a66aba8ad5a41ed4a5b2b50d7d1f68484604051613336929190918252602082015260400190565b60405180910390a25b50505050949350505050565b6000546001600160a01b031633146133755760405162461bcd60e51b815260040161044b90615bae565b6001600160a01b0381163314156133ce5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161044b565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600080613496836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561345e57600080fd5b505afa158015613472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ef91906159a8565b90506103f26c0c9f2c9cd04674edea400000006134b283614f11565b8360400151615021565b6000806134c984846103ca565b90506134d481614f11565b949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000082141561350e57506000919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561353e57506001919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561356e57506002919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561359e57506003919050565b7f00000000000000000000000000000000000000000000000000000000000000008214156135ce57506004919050565b7f00000000000000000000000000000000000000000000000000000000000000008214156135fe57506005919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561362e57506006919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561365e57506007919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561368e57506008919050565b7f00000000000000000000000000000000000000000000000000000000000000008214156136be57506009919050565b7f00000000000000000000000000000000000000000000000000000000000000008214156136ee5750600a919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561371e5750600b919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561374e5750600c919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561377e5750600d919050565b7f00000000000000000000000000000000000000000000000000000000000000008214156137ae5750600e919050565b7f00000000000000000000000000000000000000000000000000000000000000008214156137de5750600f919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561380e57506010919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561383e57506011919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561386e57506012919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561389e57506013919050565b7f00000000000000000000000000000000000000000000000000000000000000008214156138ce57506014919050565b7f00000000000000000000000000000000000000000000000000000000000000008214156138fe57506015919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561392e57506016919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561395e57506017919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561398e57506018919050565b7f00000000000000000000000000000000000000000000000000000000000000008214156139be57506019919050565b7f00000000000000000000000000000000000000000000000000000000000000008214156139ee5750601a919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a1e5750601b919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a4e5750601c919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a7e5750601d919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613aae5750601e919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613ade5750601f919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b0e57506020919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b3e57506021919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b6e57506022919050565b50600019919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613bbb57506000919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613bfd57506001919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613c3f57506002919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613c8157506003919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613cc357506004919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613d0557506005919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613d4757506006919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613d8957506007919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613dcb57506008919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613e0d57506009919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613e4f5750600a919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613e915750600b919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613ed35750600c919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613f155750600d919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613f575750600e919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613f995750600f919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613fdb57506010919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561401d57506011919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561405f57506012919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140a157506013919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140e357506014919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561412557506015919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561416757506016919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156141a957506017919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156141eb57506018919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561422d57506019919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561426f5750601a919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156142b15750601b919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156142f35750601c919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156143355750601d919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156143775750601e919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156143b95750601f919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156143fb57506020919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561443d57506021919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613b6e57506022919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156144c357506000919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561450557506001919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561454757506002919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561458957506003919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156145cb57506004919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561460d57506005919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561464f57506006919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561469157506007919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156146d357506008919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561471557506009919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156147575750600a919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156147995750600b919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156147db5750600c919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561481d5750600d919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561485f5750600e919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148a15750600f919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148e357506010919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561492557506011919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561496757506012919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156149a957506013919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156149eb57506014919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a2d57506015919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a6f57506016919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614ab157506017919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614af357506018919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b3557506019919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b775750601a919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614bb95750601b919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614bfb5750601c919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614c3d5750601d919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614c7f5750601e919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614cc15750601f919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614d0357506020919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614d4557506021919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613b6e57506022919050565b6000600282606001516002811115614da157614da1615e5a565b14614dde5760405162461bcd60e51b815260206004820152600d60248201526c5265706f72746572206f6e6c7960981b604482015260640161044b565b6000614de861519b565b90507faaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff483602001511415614e1e57809150614e28565b6103f283826151dc565b50919050565b600080821215614e6e5760405162461bcd60e51b815260206004820152600b60248201526a43616e74206265206e656760a81b604482015260640161044b565b60008290506000614e88828660e001518760400151615021565b95945050505050565b60008215614f08576000614eae83670de0b6b3a764000086615021565b90507f00000000000000000000000000000000000000000000000000000000000000008111158015614f0057507f00000000000000000000000000000000000000000000000000000000000000008110155b9150506103c4565b50600092915050565b6000600282606001516002811115614f2b57614f2b615e5a565b1415614f5357506020908101516000908152600290915260409020546001600160f81b031690565b600182606001516002811115614f6b57614f6b615e5a565b1415614f7957506080015190565b7faaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff460005260026020527f6200d9c0606964564958e1edf0b5d67e485691a223ce33e3267306cb461a390e546001600160f81b03168061500e5760405162461bcd60e51b8152602060048201526011602482015270115512081c1c9a58d9481b9bdd081cd95d607a1b604482015260640161044b565b6103f2818460800151670de0b6b3a76400005b60008080600019858709858702925082811083820303915050806000141561505b576000841161505057600080fd5b5082900490506103f2565b80841161506757600080fd5b600084868809808403938111909203919050600061508786196001615cea565b86169586900495938490049360008190030460010190506150a88184615d54565b9093179260006150b9876003615d54565b60021890506150c88188615d54565b6150d3906002615dc3565b6150dd9082615d54565b90506150e98188615d54565b6150f4906002615dc3565b6150fe9082615d54565b905061510a8188615d54565b615115906002615dc3565b61511f9082615d54565b905061512b8188615d54565b615136906002615dc3565b6151409082615d54565b905061514c8188615d54565b615157906002615dc3565b6151619082615d54565b905061516d8188615d54565b615178906002615dc3565b6151829082615d54565b905061518e8186615d54565b9998505050505050505050565b60006151d76151c97faaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff46103b0565b670de0b6b3a76400006151dc565b905090565b6000806151e884615232565b905060006151f68483615d54565b90506000670de0b6b3a7640000808760400151846152149190615d54565b61521e9190615d40565b6152289190615d40565b9695505050505050565b6040805160028082526060820183526000927f00000000000000000000000000000000000000000000000000000000000000009284929091602083019080368337019050509050818160008151811061528d5761528d615e70565b63ffffffff9092166020928302919091019091015260a084015160405163883bdbfd60e01b81526000916001600160a01b03169063883bdbfd906152d5908590600401615b64565b60006040518083038186803b1580156152ed57600080fd5b505afa158015615301573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261532991908101906159c5565b50905060008363ffffffff1690506000818360008151811061534d5761534d615e70565b60200260200101518460018151811061536857615368615e70565b602002602001015161537a9190615d73565b6153849190615d02565b9050620d89e719600682900b128015906153b057506153a6620d89e719615dee565b60020b8160060b13155b6153f05760405162461bcd60e51b815260206004820152601160248201527054574150206e6f7420696e2072616e676560781b604482015260640161044b565b627fffff600682900b126154465760405162461bcd60e51b815260206004820152601d60248201527f74696d655765696768746564417665726167655469636b203e206d6178000000604482015260640161044b565b61010087015181901561545f5761545c81615dee565b90505b600061546a826154ad565b905060006154866001600160a01b03831680600160601b615021565b905061549f670de0b6b3a764000082600160601b615021565b9a9950505050505050505050565b60008060008360020b126154c4578260020b6154d1565b8260020b6154d190615e11565b90506154e0620d89e719615dee565b62ffffff168111156155185760405162461bcd60e51b81526020600482015260016024820152601560fa1b604482015260640161044b565b60006001821661552c57600160801b61553e565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff169050600282161561557d576080615578826ffff97272373d413259a46990580e213a615d54565b901c90505b60048216156155a75760806155a2826ffff2e50f5f656932ef12357cf3c7fdcc615d54565b901c90505b60088216156155d15760806155cc826fffe5caca7e10e4e61c3624eaa0941cd0615d54565b901c90505b60108216156155fb5760806155f6826fffcb9843d60f6159c9db58835c926644615d54565b901c90505b6020821615615625576080615620826fff973b41fa98c081472e6896dfb254c0615d54565b901c90505b604082161561564f57608061564a826fff2ea16466c96a3843ec78b326b52861615d54565b901c90505b6080821615615679576080615674826ffe5dee046a99a2a811c461f1969c3053615d54565b901c90505b6101008216156156a457608061569f826ffcbe86c7900a88aedcffc83b479aa3a4615d54565b901c90505b6102008216156156cf5760806156ca826ff987a7253ac413176f2b074cf7815e54615d54565b901c90505b6104008216156156fa5760806156f5826ff3392b0822b70005940c7a398e4b70f3615d54565b901c90505b610800821615615725576080615720826fe7159475a2c29b7443b29c7fa6e889d9615d54565b901c90505b61100082161561575057608061574b826fd097f3bdfd2022b8845ad8f792aa5825615d54565b901c90505b61200082161561577b576080615776826fa9f746462d870fdf8a65dc1f90e061e5615d54565b901c90505b6140008216156157a65760806157a1826f70d869a156d2a1b890bb3df62baf32f7615d54565b901c90505b6180008216156157d15760806157cc826f31be135f97d08fd981231505542fcfa6615d54565b901c90505b620100008216156157fd5760806157f8826f09aa508b5b7a84e1c677de54f3e99bc9615d54565b901c90505b62020000821615615828576080615823826e5d6af8dedb81196699c329225ee604615d54565b901c90505b6204000082161561585257608061584d826d2216e584f5fa1ea926041bedfe98615d54565b901c90505b6208000082161561587a576080615875826b048a170391f7dc42444e8fa2615d54565b901c90505b60008460020b13156158955761589281600019615d40565b90505b6158a464010000000082615dda565b156158b05760016158b3565b60005b6134d49060ff16602083901c615cea565b6040805161012081018252600080825260208201819052918101829052906060820190815260006020820181905260408201819052606082018190526080820181905260a09091015290565b600082601f83011261592157600080fd5b8151602061593661593183615cc6565b615c95565b80838252828201915082860187848660051b890101111561595657600080fd5b60005b8581101561597e57815161596c81615e9c565b84529284019290840190600101615959565b5090979650505050505050565b60006020828403121561599d57600080fd5b81356103f281615e9c565b6000602082840312156159ba57600080fd5b81516103f281615e9c565b600080604083850312156159d857600080fd5b825167ffffffffffffffff808211156159f057600080fd5b818501915085601f830112615a0457600080fd5b81516020615a1461593183615cc6565b8083825282820191508286018a848660051b8901011115615a3457600080fd5b600096505b84871015615a665780518060060b8114615a5257600080fd5b835260019690960195918301918301615a39565b5091880151919650909350505080821115615a8057600080fd5b50615a8d85828601615910565b9150509250929050565b600060208284031215615aa957600080fd5b5035919050565b60008060208385031215615ac357600080fd5b823567ffffffffffffffff80821115615adb57600080fd5b818501915085601f830112615aef57600080fd5b813581811115615afe57600080fd5b866020828501011115615b1057600080fd5b60209290920196919550909350505050565b60008060008060808587031215615b3857600080fd5b5050823594602084013594506040840135936060013592509050565b8183823760009101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015615ba257835163ffffffff1683529284019291840191600101615b80565b50909695505050505050565b60208082526016908201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b604082015260600190565b81516001600160a01b031681526020808301519082015260408083015190820152606082015161012082019060038110615c2857634e487b7160e01b600052602160045260246000fd5b806060840152506080830151608083015260a0830151615c5360a08401826001600160a01b03169052565b5060c0830151615c6e60c08401826001600160a01b03169052565b5060e083015160e083015261010080840151615c8d8285018215159052565b505092915050565b604051601f8201601f1916810167ffffffffffffffff81118282101715615cbe57615cbe615e86565b604052919050565b600067ffffffffffffffff821115615ce057615ce0615e86565b5060051b60200190565b60008219821115615cfd57615cfd615e2e565b500190565b60008160060b8360060b80615d1957615d19615e44565b667fffffffffffff19821460001982141615615d3757615d37615e2e565b90059392505050565b600082615d4f57615d4f615e44565b500490565b6000816000190483118215151615615d6e57615d6e615e2e565b500290565b60008160060b8360060b6000811281667fffffffffffff1901831281151615615d9e57615d9e615e2e565b81667fffffffffffff018313811615615db957615db9615e2e565b5090039392505050565b600082821015615dd557615dd5615e2e565b500390565b600082615de957615de9615e44565b500690565b60008160020b627fffff19811415615e0857615e08615e2e565b60000392915050565b6000600160ff1b821415615e2757615e27615e2e565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114615eb157600080fd5b5056fea26469706673582212207457653868d8e968f5b288f10143b6dfa237e62183bea3ad7c62feaa460f890c64736f6c634300080700330000000000000000000000000000000000000000000000000214e8348c4f00000000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000000aaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff40000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8000000000000000000000000264bddfd9d93d48d759fbdb0670be1c6fdd50236000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000006b175474e89094c44da98b954eedeac495271d0fa5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e5680000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2e9f25be6257c210d7adf0d4cd6e3e881ba25f8000000000000000000000000b2419f587f497cdd64437f1b367e2e80889631ea000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48d6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa00000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec78b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599e98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e90000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbcdf9626bc03e24f779434178a73a0b4bad62ed0000000000000000000000004846efc15cc725456597044e6267ad0b3b51353e00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db550000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae614a7a56cb79c04df2aeba6f5dab80a39ca78e000000000000000000000000eba6f33730b9751a8ba0b18d9c256093e82f6bc2000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498b8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014424eeecbff345b38187d0b8b749e56faa685390000000000000000000000005c5db112c98dbe5977a4c37ad33f8a4c9ebd5575000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e86291a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee95040000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b055103b7633b61518cd806d95beeb2d4cd217e700000000000000000000000090655316479383795416b615b61282c72d8382c1000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a232603594dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c5320000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012c6adf3a3500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984fba01d52a7cd84480d0573725899486a0b5e55c20ff45d6628874349375d16500000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d42064fc4beb5f8aaf85f4617ae8b3b5b8bd80100000000000000000000000070f4d236fd678c9db41a52d28f90e299676d9d90000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888b6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab4540000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea4ba4ce14fdd287f380b55419b1c5b6c3f22ab6000000000000000000000000e270b8e9d7a7d2a7ee35a45e43d17d56b3e272b1000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a7790000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6cc3c2531fdaa6ae1a3ca84c2855806728693e8000000000000000000000000bcfd9b1a97ccd0a3942f0408350cdc281cdca1b1000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085d4780b73119b644ae5ecd22b376a1b8d8f7e538bb573797c963eeeed40d0bcb9f28c56104417d0da1b372ae30510000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae9de46fbfa339d54cd65b79d8320a7a53c78177565c2aaf4c8b13eed7865e7cfc80000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ab53ee1d50eef2c1dd3d5402789cd27bb52c1bb0000000000000000000000000238247e71ad0ab272203af13baea72e99ee7c3c000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2bbf304add43db0a05d104474683215530b076be1dfdf72a4d53a1e443d8e4c210000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073a6a761fe483ba19debb8f56ac5bbf14c0cdad10000000000000000000000001a6aa40170118baf36bac82214dc5681af69b0cf000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f8f72aa9304c8b593d555f12ef6589cc3a579a2ec76ec3a7e5f010a9229e69fa1945af6f0c6cc5b0a625bf03bd63812221920200000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e8c6c9227491c0a8156a0106a0204d881bb7e531000000000000000000000000ba895504a8e286691e7dacfb47ae8a3a737e2ce1000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc529c00c6401aef6d220be8c6ea1667f6ad93eec34391362c28ee226b3b8624a699ee507a40fa771fd01d38b03ac7b70998bbe0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004916039b1f59d9745bf6e0a21f191d1e0a84287000000000000000000000000ba4319741782151d2b1df4799d757892efda4165000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599e98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e90000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbcdf9626bc03e24f779434178a73a0b4bad62ed0000000000000000000000004846efc15cc725456597044e6267ad0b3b51353e00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e870d67f660d95d5be530380d0ec0bd388289e1e6ce7ecb96a43fc15fb4020f93c37885612803dd74366bb6815e4f607ac3ca200000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000956f47f50a910163d8bf957cf5846d573e7f87ca58c46f3a00a69ae5a5ce163895c14f8f5b7791333af9fe6e7a73618cb54609130000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000002028d7ef0223c45cadbf05e13f1823c1228012bf000000000000000000000000de2fa230d4c05ec0337d7b4fc10e16f5663044b0000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d1afa7b718fb893db30a3abc0cfc608aacfebb0a6a7de01e8b7ba6a4a61c782a73188d808fc1f3cf5743fadb68a02ed884b594f0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000290a6a7460b308ee3f19023d2d00de604bcf5b4200000000000000000000000044750a79ae69d5e9bc1651e099dffe1fb8611aba000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80638185b81c116100c3578063beed9b511161007c578063beed9b5114610310578063e9206d7814610333578063f2fde38b1461036f578063f47c84c514610382578063fc57d4df1461038a578063fe2c61981461039d57600080fd5b80638185b81c146102815780638a003888146102945780638da5cb5b146102a75780638e499bcf146102c257806392b84357146102e9578063bbba205d1461015257600080fd5b80634da21942116101155780634da21942146101e15780635f396923146101f457806360846bc61461020957806368f9a97f1461025d57806378eadb1a1461027057806379ba50971461027957600080fd5b8063152810fb146101525780631a125204146101745780632410520914610194578063276c2cba146101bb57806329feb7bc146101ce575b600080fd5b610161670de0b6b3a764000081565b6040519081526020015b60405180910390f35b610187610182366004615a97565b6103b0565b60405161016b9190615bde565b6101617f0000000000000000000000000000000000000000000000000ff59ee833b3000081565b6101876101c9366004615ab0565b6103ca565b6101876101dc36600461598b565b6103f9565b6101876101ef36600461598b565b61040d565b610207610202366004615a97565b610421565b005b61023e610217366004615a97565b6002602052600090815260409020546001600160f81b03811690600160f81b900460ff1682565b604080516001600160f81b03909316835290151560208301520161016b565b61020761026b366004615a97565b610561565b61016160001981565b61020761069a565b61020761028f366004615a97565b610744565b6101876102a2366004615a97565b610805565b6000546040516001600160a01b03909116815260200161016b565b6101617f000000000000000000000000000000000000000000000000000000000000001581565b6101617f0000000000000000000000000000000000000000000000000bcbce7f1b15000081565b61032361031e366004615b22565b61311e565b604051901515815260200161016b565b61035a7f000000000000000000000000000000000000000000000000000000000000070881565b60405163ffffffff909116815260200161016b565b61020761037d36600461598b565b61334b565b610161602381565b61016161039836600461598b565b61341f565b6101616103ab366004615ab0565b6134bc565b6103b86158c4565b6103c46102a2836134dc565b92915050565b6103d26158c4565b6103f283836040516103e5929190615b54565b60405180910390206103b0565b9392505050565b6104016158c4565b6103c46102a283613b77565b6104156158c4565b6103c46102a28361447f565b6000546001600160a01b031633146104545760405162461bcd60e51b815260040161044b90615bae565b60405180910390fd5b600081815260026020526040902054600160f81b900460ff16156104ab5760405162461bcd60e51b815260206004820152600e60248201526d416c72656164792061637469766560901b604482015260640161044b565b60006104b6826103b0565b90506002816060015160028111156104d0576104d0615e5a565b1461050c5760405162461bcd60e51b815260206004820152600c60248201526b2737ba103932b837b93a32b960a11b604482015260640161044b565b60008281526002602052604080822080546001600160f81b0316600160f81b1790555183917fdd0f1f4e105bf96c7d8e2defcbbc958075661165b324633175ca26f08a11f4b491a261055d82610561565b5050565b6000818152600260209081526040918290208251808401909352546001600160f81b0381168352600160f81b900460ff1615159082018190526105d35760405162461bcd60e51b815260206004820152600a6024820152694e6f742061637469766560b01b604482015260640161044b565b60006105de836103b0565b905060006105eb82614d87565b9050600160f81b81106106315760405162461bcd60e51b815260206004820152600e60248201526d416e63686f7220746f6f2062696760901b604482015260640161044b565b6020828101805160009081526002835260409081902080546001600160f81b0319166001600160f81b0386161790559051905183815290917f46eec4e0eeeef5830de3472bb39db7e52b1c809286dc87c4b85b20e003cc70c3910160405180910390a250505050565b6001546001600160a01b031633146106ed5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b604482015260640161044b565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000546001600160a01b0316331461076e5760405162461bcd60e51b815260040161044b90615bae565b600081815260026020526040902054600160f81b900460ff166107c05760405162461bcd60e51b815260206004820152600a6024820152694e6f742061637469766560b01b604482015260640161044b565b60008181526002602052604080822080546001600160f81b031690555182917f5a1062b4c89c41b46f5e2da710d564c88989bfe1b4e856dbdbc40c5c59a2ce4b91a250565b61080d6158c4565b7f000000000000000000000000000000000000000000000000000000000000001582106108685760405162461bcd60e51b8152602060048201526009602482015268139bdd08199bdd5b9960ba1b604482015260640161044b565b6000808080808080808961099257507f000000000000000000000000000000000000000000000000000000000000000096507faaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff495507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f0000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d891507f000000000000000000000000264bddfd9d93d48d759fbdb0670be1c6fdd5023690507f000000000000000000000000000000000000000000000000002386f26fc10000613078565b8960011415610ab757507f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f96507fa5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e56895507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000c2e9f25be6257c210d7adf0d4cd6e3e881ba25f891507f000000000000000000000000b2419f587f497cdd64437f1b367e2e80889631ea90507f000000000000000000000000000000000000000000000000002386f26fc10000613078565b8960021415610bdc57507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4896507fd6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa95507f00000000000000000000000000000000000000000000000000000000000f424094507f000000000000000000000000000000000000000000000000000000000000000193507f00000000000000000000000000000000000000000000000000000000000f424092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000001613078565b8960031415610d0157507f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec796507f8b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d095507f00000000000000000000000000000000000000000000000000000000000f424094507f000000000000000000000000000000000000000000000000000000000000000193507f00000000000000000000000000000000000000000000000000000000000f424092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000001613078565b8960041415610e2657507f0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59996507fe98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e995507f0000000000000000000000000000000000000000000000000000000005f5e10094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000cbcdf9626bc03e24f779434178a73a0b4bad62ed91507f0000000000000000000000004846efc15cc725456597044e6267ad0b3b51353e90507f00000000000000000000000000000000000000000000000000000000000f4240613078565b8960051415610f4b57507f0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef96507f3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db5595507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000ae614a7a56cb79c04df2aeba6f5dab80a39ca78e91507f000000000000000000000000eba6f33730b9751a8ba0b18d9c256093e82f6bc290507f000000000000000000000000000000000000000000000000002386f26fc10000613078565b896006141561107057507f000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f49896507fb8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd95507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f00000000000000000000000014424eeecbff345b38187d0b8b749e56faa6853991507f0000000000000000000000005c5db112c98dbe5977a4c37ad33f8a4c9ebd557590507f000000000000000000000000000000000000000000000000002386f26fc10000613078565b896007141561119557507f0000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e86296507f91a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee950495507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000b055103b7633b61518cd806d95beeb2d4cd217e791507f00000000000000000000000090655316479383795416b615b61282c72d8382c190507f000000000000000000000000000000000000000000000000002386f26fc10000613078565b89600814156112ba57507f00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a2326035996507f4dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c53295507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000093507f0000000000000000000000000000000000000000000000000012c6adf3a3500092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000001613078565b89600914156113df57507f0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f98496507ffba01d52a7cd84480d0573725899486a0b5e55c20ff45d6628874349375d165095507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f0000000000000000000000001d42064fc4beb5f8aaf85f4617ae8b3b5b8bd80191507f00000000000000000000000070f4d236fd678c9db41a52d28f90e299676d9d9090507f000000000000000000000000000000000000000000000000002386f26fc10000613078565b89600a141561150457507f000000000000000000000000c00e94cb662c3520282e6f5717214004a7f2688896507fb6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab45495507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000ea4ba4ce14fdd287f380b55419b1c5b6c3f22ab691507f000000000000000000000000e270b8e9d7a7d2a7ee35a45e43d17d56b3e272b190507f000000000000000000000000000000000000000000000000002386f26fc10000613078565b89600b141561162957507f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca96507f921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a77995507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000a6cc3c2531fdaa6ae1a3ca84c2855806728693e891507f000000000000000000000000bcfd9b1a97ccd0a3942f0408350cdc281cdca1b190507f000000000000000000000000000000000000000000000000002386f26fc10000613078565b89600c141561174e57507f0000000000000000000000000000000000085d4780b73119b644ae5ecd22b37696507fa1b8d8f7e538bb573797c963eeeed40d0bcb9f28c56104417d0da1b372ae305195507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000193507f00000000000000000000000000000000000000000000000000000000000f424092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000001613078565b89600d141561187357507f0000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae996507fde46fbfa339d54cd65b79d8320a7a53c78177565c2aaf4c8b13eed7865e7cfc895507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f0000000000000000000000005ab53ee1d50eef2c1dd3d5402789cd27bb52c1bb91507f0000000000000000000000000238247e71ad0ab272203af13baea72e99ee7c3c90507f000000000000000000000000000000000000000000000000002386f26fc10000613078565b89600e141561199857507f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe296507fbbf304add43db0a05d104474683215530b076be1dfdf72a4d53a1e443d8e4c2195507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f00000000000000000000000073a6a761fe483ba19debb8f56ac5bbf14c0cdad191507f0000000000000000000000001a6aa40170118baf36bac82214dc5681af69b0cf90507f000000000000000000000000000000000000000000000000002386f26fc10000613078565b89600f1415611abd57507f0000000000000000000000009f8f72aa9304c8b593d555f12ef6589cc3a579a296507fec76ec3a7e5f010a9229e69fa1945af6f0c6cc5b0a625bf03bd638122219202095507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000e8c6c9227491c0a8156a0106a0204d881bb7e53191507f000000000000000000000000ba895504a8e286691e7dacfb47ae8a3a737e2ce190507f000000000000000000000000000000000000000000000000002386f26fc10000613078565b8960101415611be257507f0000000000000000000000000bc529c00c6401aef6d220be8c6ea1667f6ad93e96507fec34391362c28ee226b3b8624a699ee507a40fa771fd01d38b03ac7b70998bbe95507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f00000000000000000000000004916039b1f59d9745bf6e0a21f191d1e0a8428791507f000000000000000000000000ba4319741782151d2b1df4799d757892efda416590507f000000000000000000000000000000000000000000000000002386f26fc10000613078565b8960111415611d0757507f0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59996507fe98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e995507f0000000000000000000000000000000000000000000000000000000005f5e10094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000cbcdf9626bc03e24f779434178a73a0b4bad62ed91507f0000000000000000000000004846efc15cc725456597044e6267ad0b3b51353e90507f00000000000000000000000000000000000000000000000000000000000f4240613078565b8960121415611e2c57507f0000000000000000000000008e870d67f660d95d5be530380d0ec0bd388289e196507fe6ce7ecb96a43fc15fb4020f93c37885612803dd74366bb6815e4f607ac3ca2095507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000193507f00000000000000000000000000000000000000000000000000000000000f424092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000001613078565b8960131415611f5157507f000000000000000000000000956f47f50a910163d8bf957cf5846d573e7f87ca96507f58c46f3a00a69ae5a5ce163895c14f8f5b7791333af9fe6e7a73618cb546091395507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f0000000000000000000000002028d7ef0223c45cadbf05e13f1823c1228012bf91507f000000000000000000000000de2fa230d4c05ec0337d7b4fc10e16f5663044b090507f000000000000000000000000000000000000000000000000002386f26fc10000613078565b896014141561207657507f0000000000000000000000007d1afa7b718fb893db30a3abc0cfc608aacfebb096507fa6a7de01e8b7ba6a4a61c782a73188d808fc1f3cf5743fadb68a02ed884b594f95507f0000000000000000000000000000000000000000000000000de0b6b3a764000094507f000000000000000000000000000000000000000000000000000000000000000293507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000290a6a7460b308ee3f19023d2d00de604bcf5b4291507f00000000000000000000000044750a79ae69d5e9bc1651e099dffe1fb8611aba90507f000000000000000000000000000000000000000000000000002386f26fc10000613078565b896015141561219b57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601614156122c057507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601714156123e557507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b896018141561250a57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b896019141561262f57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601a141561275457507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601b141561287957507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601c141561299e57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601d1415612ac357507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601e1415612be857507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b89601f1415612d0d57507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b8960201415612e3257507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b8960211415612f5757507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000613078565b896022141561307857507f000000000000000000000000000000000000000000000000000000000000000096507f000000000000000000000000000000000000000000000000000000000000000095507f000000000000000000000000000000000000000000000000000000000000000094507f000000000000000000000000000000000000000000000000000000000000000093507f000000000000000000000000000000000000000000000000000000000000000092507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f00000000000000000000000000000000000000000000000000000000000000005b604051806101200160405280896001600160a01b031681526020018881526020018781526020018660028111156130b1576130b1615e5a565b8152602001858152602001846001600160a01b03168152602001836001600160a01b0316815260200182815260200160018c7f0000000000000000000000000000000000000000000000000000000000000041901c16600114151581525098505050505050505050919050565b60008061312a336103f9565b905060006131388285614e2e565b9050600061314583614d87565b6020848101516000908152600282526040908190208151808301909252546001600160f81b0381168252600160f81b900460ff161580159282019290925291925061323657600160f81b82106131ce5760405162461bcd60e51b815260206004820152600e60248201526d416e63686f7220746f6f2062696760901b604482015260640161044b565b6020848101805160009081526002835260409081902080546001600160f81b0319166001600160f81b0387161790559051905184815290917f46eec4e0eeeef5830de3472bb39db7e52b1c809286dc87c4b85b20e003cc70c3910160405180910390a261333f565b6132408383614e91565b156132f757600160f81b831061328b5760405162461bcd60e51b815260206004820152601060248201526f5265706f7274656420746f6f2062696760801b604482015260640161044b565b6020848101805160009081526002835260409081902080546001600160f81b0319166001600160f81b0388161790559051905185815290917f46eec4e0eeeef5830de3472bb39db7e52b1c809286dc87c4b85b20e003cc70c3910160405180910390a26001945061333f565b83602001517f6b871468876a51b1609c5e5fc5c6f57c7e9a66aba8ad5a41ed4a5b2b50d7d1f68484604051613336929190918252602082015260400190565b60405180910390a25b50505050949350505050565b6000546001600160a01b031633146133755760405162461bcd60e51b815260040161044b90615bae565b6001600160a01b0381163314156133ce5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161044b565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600080613496836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561345e57600080fd5b505afa158015613472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ef91906159a8565b90506103f26c0c9f2c9cd04674edea400000006134b283614f11565b8360400151615021565b6000806134c984846103ca565b90506134d481614f11565b949350505050565b60007faaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff482141561350e57506000919050565b7fa5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e56882141561353e57506001919050565b7fd6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa82141561356e57506002919050565b7f8b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d082141561359e57506003919050565b7fe98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e98214156135ce57506004919050565b7f3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db558214156135fe57506005919050565b7fb8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd82141561362e57506006919050565b7f91a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee950482141561365e57506007919050565b7f4dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c53282141561368e57506008919050565b7ffba01d52a7cd84480d0573725899486a0b5e55c20ff45d6628874349375d16508214156136be57506009919050565b7fb6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab4548214156136ee5750600a919050565b7f921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a77982141561371e5750600b919050565b7fa1b8d8f7e538bb573797c963eeeed40d0bcb9f28c56104417d0da1b372ae305182141561374e5750600c919050565b7fde46fbfa339d54cd65b79d8320a7a53c78177565c2aaf4c8b13eed7865e7cfc882141561377e5750600d919050565b7fbbf304add43db0a05d104474683215530b076be1dfdf72a4d53a1e443d8e4c218214156137ae5750600e919050565b7fec76ec3a7e5f010a9229e69fa1945af6f0c6cc5b0a625bf03bd63812221920208214156137de5750600f919050565b7fec34391362c28ee226b3b8624a699ee507a40fa771fd01d38b03ac7b70998bbe82141561380e57506010919050565b7fe98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e982141561383e57506011919050565b7fe6ce7ecb96a43fc15fb4020f93c37885612803dd74366bb6815e4f607ac3ca2082141561386e57506012919050565b7f58c46f3a00a69ae5a5ce163895c14f8f5b7791333af9fe6e7a73618cb546091382141561389e57506013919050565b7fa6a7de01e8b7ba6a4a61c782a73188d808fc1f3cf5743fadb68a02ed884b594f8214156138ce57506014919050565b7f00000000000000000000000000000000000000000000000000000000000000008214156138fe57506015919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561392e57506016919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561395e57506017919050565b7f000000000000000000000000000000000000000000000000000000000000000082141561398e57506018919050565b7f00000000000000000000000000000000000000000000000000000000000000008214156139be57506019919050565b7f00000000000000000000000000000000000000000000000000000000000000008214156139ee5750601a919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a1e5750601b919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a4e5750601c919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a7e5750601d919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613aae5750601e919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613ade5750601f919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b0e57506020919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b3e57506021919050565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b6e57506022919050565b50600019919050565b60007f000000000000000000000000264bddfd9d93d48d759fbdb0670be1c6fdd502366001600160a01b0316826001600160a01b03161415613bbb57506000919050565b7f000000000000000000000000b2419f587f497cdd64437f1b367e2e80889631ea6001600160a01b0316826001600160a01b03161415613bfd57506001919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613c3f57506002919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613c8157506003919050565b7f0000000000000000000000004846efc15cc725456597044e6267ad0b3b51353e6001600160a01b0316826001600160a01b03161415613cc357506004919050565b7f000000000000000000000000eba6f33730b9751a8ba0b18d9c256093e82f6bc26001600160a01b0316826001600160a01b03161415613d0557506005919050565b7f0000000000000000000000005c5db112c98dbe5977a4c37ad33f8a4c9ebd55756001600160a01b0316826001600160a01b03161415613d4757506006919050565b7f00000000000000000000000090655316479383795416b615b61282c72d8382c16001600160a01b0316826001600160a01b03161415613d8957506007919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613dcb57506008919050565b7f00000000000000000000000070f4d236fd678c9db41a52d28f90e299676d9d906001600160a01b0316826001600160a01b03161415613e0d57506009919050565b7f000000000000000000000000e270b8e9d7a7d2a7ee35a45e43d17d56b3e272b16001600160a01b0316826001600160a01b03161415613e4f5750600a919050565b7f000000000000000000000000bcfd9b1a97ccd0a3942f0408350cdc281cdca1b16001600160a01b0316826001600160a01b03161415613e915750600b919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613ed35750600c919050565b7f0000000000000000000000000238247e71ad0ab272203af13baea72e99ee7c3c6001600160a01b0316826001600160a01b03161415613f155750600d919050565b7f0000000000000000000000001a6aa40170118baf36bac82214dc5681af69b0cf6001600160a01b0316826001600160a01b03161415613f575750600e919050565b7f000000000000000000000000ba895504a8e286691e7dacfb47ae8a3a737e2ce16001600160a01b0316826001600160a01b03161415613f995750600f919050565b7f000000000000000000000000ba4319741782151d2b1df4799d757892efda41656001600160a01b0316826001600160a01b03161415613fdb57506010919050565b7f0000000000000000000000004846efc15cc725456597044e6267ad0b3b51353e6001600160a01b0316826001600160a01b0316141561401d57506011919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561405f57506012919050565b7f000000000000000000000000de2fa230d4c05ec0337d7b4fc10e16f5663044b06001600160a01b0316826001600160a01b031614156140a157506013919050565b7f00000000000000000000000044750a79ae69d5e9bc1651e099dffe1fb8611aba6001600160a01b0316826001600160a01b031614156140e357506014919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561412557506015919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561416757506016919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156141a957506017919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156141eb57506018919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561422d57506019919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561426f5750601a919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156142b15750601b919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156142f35750601c919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156143355750601d919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156143775750601e919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156143b95750601f919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156143fb57506020919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561443d57506021919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613b6e57506022919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156144c357506000919050565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316826001600160a01b0316141561450557506001919050565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316826001600160a01b0316141561454757506002919050565b7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b0316826001600160a01b0316141561458957506003919050565b7f0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5996001600160a01b0316826001600160a01b031614156145cb57506004919050565b7f0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef6001600160a01b0316826001600160a01b0316141561460d57506005919050565b7f000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f4986001600160a01b0316826001600160a01b0316141561464f57506006919050565b7f0000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e8626001600160a01b0316826001600160a01b0316141561469157506007919050565b7f00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a232603596001600160a01b0316826001600160a01b031614156146d357506008919050565b7f0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9846001600160a01b0316826001600160a01b0316141561471557506009919050565b7f000000000000000000000000c00e94cb662c3520282e6f5717214004a7f268886001600160a01b0316826001600160a01b031614156147575750600a919050565b7f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b0316826001600160a01b031614156147995750600b919050565b7f0000000000000000000000000000000000085d4780b73119b644ae5ecd22b3766001600160a01b0316826001600160a01b031614156147db5750600c919050565b7f0000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae96001600160a01b0316826001600160a01b0316141561481d5750600d919050565b7f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe26001600160a01b0316826001600160a01b0316141561485f5750600e919050565b7f0000000000000000000000009f8f72aa9304c8b593d555f12ef6589cc3a579a26001600160a01b0316826001600160a01b031614156148a15750600f919050565b7f0000000000000000000000000bc529c00c6401aef6d220be8c6ea1667f6ad93e6001600160a01b0316826001600160a01b031614156148e357506010919050565b7f0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5996001600160a01b0316826001600160a01b0316141561492557506011919050565b7f0000000000000000000000008e870d67f660d95d5be530380d0ec0bd388289e16001600160a01b0316826001600160a01b0316141561496757506012919050565b7f000000000000000000000000956f47f50a910163d8bf957cf5846d573e7f87ca6001600160a01b0316826001600160a01b031614156149a957506013919050565b7f0000000000000000000000007d1afa7b718fb893db30a3abc0cfc608aacfebb06001600160a01b0316826001600160a01b031614156149eb57506014919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a2d57506015919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a6f57506016919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614ab157506017919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614af357506018919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b3557506019919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b775750601a919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614bb95750601b919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614bfb5750601c919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614c3d5750601d919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614c7f5750601e919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614cc15750601f919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614d0357506020919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614d4557506021919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613b6e57506022919050565b6000600282606001516002811115614da157614da1615e5a565b14614dde5760405162461bcd60e51b815260206004820152600d60248201526c5265706f72746572206f6e6c7960981b604482015260640161044b565b6000614de861519b565b90507faaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff483602001511415614e1e57809150614e28565b6103f283826151dc565b50919050565b600080821215614e6e5760405162461bcd60e51b815260206004820152600b60248201526a43616e74206265206e656760a81b604482015260640161044b565b60008290506000614e88828660e001518760400151615021565b95945050505050565b60008215614f08576000614eae83670de0b6b3a764000086615021565b90507f0000000000000000000000000000000000000000000000000ff59ee833b300008111158015614f0057507f0000000000000000000000000000000000000000000000000bcbce7f1b1500008110155b9150506103c4565b50600092915050565b6000600282606001516002811115614f2b57614f2b615e5a565b1415614f5357506020908101516000908152600290915260409020546001600160f81b031690565b600182606001516002811115614f6b57614f6b615e5a565b1415614f7957506080015190565b7faaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff460005260026020527f6200d9c0606964564958e1edf0b5d67e485691a223ce33e3267306cb461a390e546001600160f81b03168061500e5760405162461bcd60e51b8152602060048201526011602482015270115512081c1c9a58d9481b9bdd081cd95d607a1b604482015260640161044b565b6103f2818460800151670de0b6b3a76400005b60008080600019858709858702925082811083820303915050806000141561505b576000841161505057600080fd5b5082900490506103f2565b80841161506757600080fd5b600084868809808403938111909203919050600061508786196001615cea565b86169586900495938490049360008190030460010190506150a88184615d54565b9093179260006150b9876003615d54565b60021890506150c88188615d54565b6150d3906002615dc3565b6150dd9082615d54565b90506150e98188615d54565b6150f4906002615dc3565b6150fe9082615d54565b905061510a8188615d54565b615115906002615dc3565b61511f9082615d54565b905061512b8188615d54565b615136906002615dc3565b6151409082615d54565b905061514c8188615d54565b615157906002615dc3565b6151619082615d54565b905061516d8188615d54565b615178906002615dc3565b6151829082615d54565b905061518e8186615d54565b9998505050505050505050565b60006151d76151c97faaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff46103b0565b670de0b6b3a76400006151dc565b905090565b6000806151e884615232565b905060006151f68483615d54565b90506000670de0b6b3a7640000808760400151846152149190615d54565b61521e9190615d40565b6152289190615d40565b9695505050505050565b6040805160028082526060820183526000927f00000000000000000000000000000000000000000000000000000000000007089284929091602083019080368337019050509050818160008151811061528d5761528d615e70565b63ffffffff9092166020928302919091019091015260a084015160405163883bdbfd60e01b81526000916001600160a01b03169063883bdbfd906152d5908590600401615b64565b60006040518083038186803b1580156152ed57600080fd5b505afa158015615301573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261532991908101906159c5565b50905060008363ffffffff1690506000818360008151811061534d5761534d615e70565b60200260200101518460018151811061536857615368615e70565b602002602001015161537a9190615d73565b6153849190615d02565b9050620d89e719600682900b128015906153b057506153a6620d89e719615dee565b60020b8160060b13155b6153f05760405162461bcd60e51b815260206004820152601160248201527054574150206e6f7420696e2072616e676560781b604482015260640161044b565b627fffff600682900b126154465760405162461bcd60e51b815260206004820152601d60248201527f74696d655765696768746564417665726167655469636b203e206d6178000000604482015260640161044b565b61010087015181901561545f5761545c81615dee565b90505b600061546a826154ad565b905060006154866001600160a01b03831680600160601b615021565b905061549f670de0b6b3a764000082600160601b615021565b9a9950505050505050505050565b60008060008360020b126154c4578260020b6154d1565b8260020b6154d190615e11565b90506154e0620d89e719615dee565b62ffffff168111156155185760405162461bcd60e51b81526020600482015260016024820152601560fa1b604482015260640161044b565b60006001821661552c57600160801b61553e565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff169050600282161561557d576080615578826ffff97272373d413259a46990580e213a615d54565b901c90505b60048216156155a75760806155a2826ffff2e50f5f656932ef12357cf3c7fdcc615d54565b901c90505b60088216156155d15760806155cc826fffe5caca7e10e4e61c3624eaa0941cd0615d54565b901c90505b60108216156155fb5760806155f6826fffcb9843d60f6159c9db58835c926644615d54565b901c90505b6020821615615625576080615620826fff973b41fa98c081472e6896dfb254c0615d54565b901c90505b604082161561564f57608061564a826fff2ea16466c96a3843ec78b326b52861615d54565b901c90505b6080821615615679576080615674826ffe5dee046a99a2a811c461f1969c3053615d54565b901c90505b6101008216156156a457608061569f826ffcbe86c7900a88aedcffc83b479aa3a4615d54565b901c90505b6102008216156156cf5760806156ca826ff987a7253ac413176f2b074cf7815e54615d54565b901c90505b6104008216156156fa5760806156f5826ff3392b0822b70005940c7a398e4b70f3615d54565b901c90505b610800821615615725576080615720826fe7159475a2c29b7443b29c7fa6e889d9615d54565b901c90505b61100082161561575057608061574b826fd097f3bdfd2022b8845ad8f792aa5825615d54565b901c90505b61200082161561577b576080615776826fa9f746462d870fdf8a65dc1f90e061e5615d54565b901c90505b6140008216156157a65760806157a1826f70d869a156d2a1b890bb3df62baf32f7615d54565b901c90505b6180008216156157d15760806157cc826f31be135f97d08fd981231505542fcfa6615d54565b901c90505b620100008216156157fd5760806157f8826f09aa508b5b7a84e1c677de54f3e99bc9615d54565b901c90505b62020000821615615828576080615823826e5d6af8dedb81196699c329225ee604615d54565b901c90505b6204000082161561585257608061584d826d2216e584f5fa1ea926041bedfe98615d54565b901c90505b6208000082161561587a576080615875826b048a170391f7dc42444e8fa2615d54565b901c90505b60008460020b13156158955761589281600019615d40565b90505b6158a464010000000082615dda565b156158b05760016158b3565b60005b6134d49060ff16602083901c615cea565b6040805161012081018252600080825260208201819052918101829052906060820190815260006020820181905260408201819052606082018190526080820181905260a09091015290565b600082601f83011261592157600080fd5b8151602061593661593183615cc6565b615c95565b80838252828201915082860187848660051b890101111561595657600080fd5b60005b8581101561597e57815161596c81615e9c565b84529284019290840190600101615959565b5090979650505050505050565b60006020828403121561599d57600080fd5b81356103f281615e9c565b6000602082840312156159ba57600080fd5b81516103f281615e9c565b600080604083850312156159d857600080fd5b825167ffffffffffffffff808211156159f057600080fd5b818501915085601f830112615a0457600080fd5b81516020615a1461593183615cc6565b8083825282820191508286018a848660051b8901011115615a3457600080fd5b600096505b84871015615a665780518060060b8114615a5257600080fd5b835260019690960195918301918301615a39565b5091880151919650909350505080821115615a8057600080fd5b50615a8d85828601615910565b9150509250929050565b600060208284031215615aa957600080fd5b5035919050565b60008060208385031215615ac357600080fd5b823567ffffffffffffffff80821115615adb57600080fd5b818501915085601f830112615aef57600080fd5b813581811115615afe57600080fd5b866020828501011115615b1057600080fd5b60209290920196919550909350505050565b60008060008060808587031215615b3857600080fd5b5050823594602084013594506040840135936060013592509050565b8183823760009101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015615ba257835163ffffffff1683529284019291840191600101615b80565b50909695505050505050565b60208082526016908201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b604082015260600190565b81516001600160a01b031681526020808301519082015260408083015190820152606082015161012082019060038110615c2857634e487b7160e01b600052602160045260246000fd5b806060840152506080830151608083015260a0830151615c5360a08401826001600160a01b03169052565b5060c0830151615c6e60c08401826001600160a01b03169052565b5060e083015160e083015261010080840151615c8d8285018215159052565b505092915050565b604051601f8201601f1916810167ffffffffffffffff81118282101715615cbe57615cbe615e86565b604052919050565b600067ffffffffffffffff821115615ce057615ce0615e86565b5060051b60200190565b60008219821115615cfd57615cfd615e2e565b500190565b60008160060b8360060b80615d1957615d19615e44565b667fffffffffffff19821460001982141615615d3757615d37615e2e565b90059392505050565b600082615d4f57615d4f615e44565b500490565b6000816000190483118215151615615d6e57615d6e615e2e565b500290565b60008160060b8360060b6000811281667fffffffffffff1901831281151615615d9e57615d9e615e2e565b81667fffffffffffff018313811615615db957615db9615e2e565b5090039392505050565b600082821015615dd557615dd5615e2e565b500390565b600082615de957615de9615e44565b500690565b60008160020b627fffff19811415615e0857615e08615e2e565b60000392915050565b6000600160ff1b821415615e2757615e27615e2e565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114615eb157600080fd5b5056fea26469706673582212207457653868d8e968f5b288f10143b6dfa237e62183bea3ad7c62feaa460f890c64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000214e8348c4f00000000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000000aaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff40000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8000000000000000000000000264bddfd9d93d48d759fbdb0670be1c6fdd50236000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000006b175474e89094c44da98b954eedeac495271d0fa5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e5680000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2e9f25be6257c210d7adf0d4cd6e3e881ba25f8000000000000000000000000b2419f587f497cdd64437f1b367e2e80889631ea000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48d6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa00000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec78b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599e98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e90000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbcdf9626bc03e24f779434178a73a0b4bad62ed0000000000000000000000004846efc15cc725456597044e6267ad0b3b51353e00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db550000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae614a7a56cb79c04df2aeba6f5dab80a39ca78e000000000000000000000000eba6f33730b9751a8ba0b18d9c256093e82f6bc2000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498b8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014424eeecbff345b38187d0b8b749e56faa685390000000000000000000000005c5db112c98dbe5977a4c37ad33f8a4c9ebd5575000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e86291a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee95040000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b055103b7633b61518cd806d95beeb2d4cd217e700000000000000000000000090655316479383795416b615b61282c72d8382c1000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a232603594dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c5320000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012c6adf3a3500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984fba01d52a7cd84480d0573725899486a0b5e55c20ff45d6628874349375d16500000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d42064fc4beb5f8aaf85f4617ae8b3b5b8bd80100000000000000000000000070f4d236fd678c9db41a52d28f90e299676d9d90000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888b6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab4540000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea4ba4ce14fdd287f380b55419b1c5b6c3f22ab6000000000000000000000000e270b8e9d7a7d2a7ee35a45e43d17d56b3e272b1000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a7790000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6cc3c2531fdaa6ae1a3ca84c2855806728693e8000000000000000000000000bcfd9b1a97ccd0a3942f0408350cdc281cdca1b1000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085d4780b73119b644ae5ecd22b376a1b8d8f7e538bb573797c963eeeed40d0bcb9f28c56104417d0da1b372ae30510000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae9de46fbfa339d54cd65b79d8320a7a53c78177565c2aaf4c8b13eed7865e7cfc80000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ab53ee1d50eef2c1dd3d5402789cd27bb52c1bb0000000000000000000000000238247e71ad0ab272203af13baea72e99ee7c3c000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2bbf304add43db0a05d104474683215530b076be1dfdf72a4d53a1e443d8e4c210000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073a6a761fe483ba19debb8f56ac5bbf14c0cdad10000000000000000000000001a6aa40170118baf36bac82214dc5681af69b0cf000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f8f72aa9304c8b593d555f12ef6589cc3a579a2ec76ec3a7e5f010a9229e69fa1945af6f0c6cc5b0a625bf03bd63812221920200000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e8c6c9227491c0a8156a0106a0204d881bb7e531000000000000000000000000ba895504a8e286691e7dacfb47ae8a3a737e2ce1000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc529c00c6401aef6d220be8c6ea1667f6ad93eec34391362c28ee226b3b8624a699ee507a40fa771fd01d38b03ac7b70998bbe0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004916039b1f59d9745bf6e0a21f191d1e0a84287000000000000000000000000ba4319741782151d2b1df4799d757892efda4165000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599e98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e90000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbcdf9626bc03e24f779434178a73a0b4bad62ed0000000000000000000000004846efc15cc725456597044e6267ad0b3b51353e00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e870d67f660d95d5be530380d0ec0bd388289e1e6ce7ecb96a43fc15fb4020f93c37885612803dd74366bb6815e4f607ac3ca200000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000956f47f50a910163d8bf957cf5846d573e7f87ca58c46f3a00a69ae5a5ce163895c14f8f5b7791333af9fe6e7a73618cb54609130000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000002028d7ef0223c45cadbf05e13f1823c1228012bf000000000000000000000000de2fa230d4c05ec0337d7b4fc10e16f5663044b0000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d1afa7b718fb893db30a3abc0cfc608aacfebb0a6a7de01e8b7ba6a4a61c782a73188d808fc1f3cf5743fadb68a02ed884b594f0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000290a6a7460b308ee3f19023d2d00de604bcf5b4200000000000000000000000044750a79ae69d5e9bc1651e099dffe1fb8611aba000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : anchorToleranceMantissa_ (uint256): 150000000000000000
Arg [1] : anchorPeriod_ (uint32): 1800
Arg [2] : configs (tuple[]):
Arg [1] : underlying (address): 0x0000000000000000000000000000000000000000
Arg [2] : symbolHash (bytes32): 0xaaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff4
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8
Arg [7] : reporter (address): 0x264BDDFD9D93D48d759FBDB0670bE1C6fDd50236
Arg [8] : reporterMultiplier (uint256): 10000000000000000
Arg [9] : isUniswapReversed (bool): True

Arg [1] : underlying (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F
Arg [2] : symbolHash (bytes32): 0xa5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e568
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0xC2e9F25Be6257c210d7Adf0D4Cd6E3E881ba25f8
Arg [7] : reporter (address): 0xb2419f587f497CDd64437f1B367E2e80889631ea
Arg [8] : reporterMultiplier (uint256): 10000000000000000
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [2] : symbolHash (bytes32): 0xd6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa
Arg [3] : baseUnit (uint256): 1000000
Arg [4] : priceSource (uint8): 1
Arg [5] : fixedPrice (uint256): 1000000
Arg [6] : uniswapMarket (address): 0x0000000000000000000000000000000000000000
Arg [7] : reporter (address): 0x0000000000000000000000000000000000000000
Arg [8] : reporterMultiplier (uint256): 1
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [2] : symbolHash (bytes32): 0x8b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d0
Arg [3] : baseUnit (uint256): 1000000
Arg [4] : priceSource (uint8): 1
Arg [5] : fixedPrice (uint256): 1000000
Arg [6] : uniswapMarket (address): 0x0000000000000000000000000000000000000000
Arg [7] : reporter (address): 0x0000000000000000000000000000000000000000
Arg [8] : reporterMultiplier (uint256): 1
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599
Arg [2] : symbolHash (bytes32): 0xe98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e9
Arg [3] : baseUnit (uint256): 100000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0xCBCdF9626bC03E24f779434178A73a0B4bad62eD
Arg [7] : reporter (address): 0x4846efc15CC725456597044e6267ad0b3B51353E
Arg [8] : reporterMultiplier (uint256): 1000000
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0x0D8775F648430679A709E98d2b0Cb6250d2887EF
Arg [2] : symbolHash (bytes32): 0x3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db55
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0xAE614a7a56cB79c04Df2aeBA6f5dAB80A39CA78E
Arg [7] : reporter (address): 0xeBa6F33730B9751a8BA0b18d9C256093E82f6bC2
Arg [8] : reporterMultiplier (uint256): 10000000000000000
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0xE41d2489571d322189246DaFA5ebDe1F4699F498
Arg [2] : symbolHash (bytes32): 0xb8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0x14424eEeCbfF345B38187d0B8b749E56FAA68539
Arg [7] : reporter (address): 0x5c5db112c98dbe5977A4c37AD33F8a4c9ebd5575
Arg [8] : reporterMultiplier (uint256): 10000000000000000
Arg [9] : isUniswapReversed (bool): True

Arg [1] : underlying (address): 0x1985365e9f78359a9B6AD760e32412f4a445E862
Arg [2] : symbolHash (bytes32): 0x91a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee9504
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0xb055103b7633b61518CD806D95beeB2d4Cd217E7
Arg [7] : reporter (address): 0x90655316479383795416B615B61282C72D8382C1
Arg [8] : reporterMultiplier (uint256): 10000000000000000
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359
Arg [2] : symbolHash (bytes32): 0x4dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c532
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 0
Arg [5] : fixedPrice (uint256): 5285000000000000
Arg [6] : uniswapMarket (address): 0x0000000000000000000000000000000000000000
Arg [7] : reporter (address): 0x0000000000000000000000000000000000000000
Arg [8] : reporterMultiplier (uint256): 1
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984
Arg [2] : symbolHash (bytes32): 0xfba01d52a7cd84480d0573725899486a0b5e55c20ff45d6628874349375d1650
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0x1d42064Fc4Beb5F8aAF85F4617AE8b3b5B8Bd801
Arg [7] : reporter (address): 0x70f4D236FD678c9DB41a52d28f90E299676d9D90
Arg [8] : reporterMultiplier (uint256): 10000000000000000
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0xc00e94Cb662C3520282E6f5717214004A7f26888
Arg [2] : symbolHash (bytes32): 0xb6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab454
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0xea4Ba4CE14fdd287f380b55419B1C5b6c3f22ab6
Arg [7] : reporter (address): 0xE270B8E9d7a7d2A7eE35a45E43d17D56b3e272b1
Arg [8] : reporterMultiplier (uint256): 10000000000000000
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [2] : symbolHash (bytes32): 0x921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a779
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0xa6Cc3C2531FdaA6Ae1A3CA84c2855806728693e8
Arg [7] : reporter (address): 0xBcFd9b1a97cCD0a3942f0408350cdc281cDCa1B1
Arg [8] : reporterMultiplier (uint256): 10000000000000000
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0x0000000000085d4780B73119b644AE5ecd22b376
Arg [2] : symbolHash (bytes32): 0xa1b8d8f7e538bb573797c963eeeed40d0bcb9f28c56104417d0da1b372ae3051
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 1
Arg [5] : fixedPrice (uint256): 1000000
Arg [6] : uniswapMarket (address): 0x0000000000000000000000000000000000000000
Arg [7] : reporter (address): 0x0000000000000000000000000000000000000000
Arg [8] : reporterMultiplier (uint256): 1
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9
Arg [2] : symbolHash (bytes32): 0xde46fbfa339d54cd65b79d8320a7a53c78177565c2aaf4c8b13eed7865e7cfc8
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0x5aB53EE1d50eeF2C1DD3d5402789cd27bB52c1bB
Arg [7] : reporter (address): 0x0238247E71AD0aB272203Af13bAEa72e99EE7c3c
Arg [8] : reporterMultiplier (uint256): 10000000000000000
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0x6B3595068778DD592e39A122f4f5a5cF09C90fE2
Arg [2] : symbolHash (bytes32): 0xbbf304add43db0a05d104474683215530b076be1dfdf72a4d53a1e443d8e4c21
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0x73A6a761FE483bA19DeBb8f56aC5bbF14c0cdad1
Arg [7] : reporter (address): 0x1A6aA40170118bAf36BAc82214DC5681Af69b0cF
Arg [8] : reporterMultiplier (uint256): 10000000000000000
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2
Arg [2] : symbolHash (bytes32): 0xec76ec3a7e5f010a9229e69fa1945af6f0c6cc5b0a625bf03bd6381222192020
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0xe8c6c9227491C0a8156A0106A0204d881BB7E531
Arg [7] : reporter (address): 0xbA895504a8E286691E7dacFb47ae8A3A737e2Ce1
Arg [8] : reporterMultiplier (uint256): 10000000000000000
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e
Arg [2] : symbolHash (bytes32): 0xec34391362c28ee226b3b8624a699ee507a40fa771fd01d38b03ac7b70998bbe
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0x04916039B1f59D9745Bf6E0a21f191D1e0A84287
Arg [7] : reporter (address): 0xBa4319741782151D2B1df4799d757892EFda4165
Arg [8] : reporterMultiplier (uint256): 10000000000000000
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599
Arg [2] : symbolHash (bytes32): 0xe98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e9
Arg [3] : baseUnit (uint256): 100000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0xCBCdF9626bC03E24f779434178A73a0B4bad62eD
Arg [7] : reporter (address): 0x4846efc15CC725456597044e6267ad0b3B51353E
Arg [8] : reporterMultiplier (uint256): 1000000
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0x8E870D67F660D95d5be530380D0eC0bd388289E1
Arg [2] : symbolHash (bytes32): 0xe6ce7ecb96a43fc15fb4020f93c37885612803dd74366bb6815e4f607ac3ca20
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 1
Arg [5] : fixedPrice (uint256): 1000000
Arg [6] : uniswapMarket (address): 0x0000000000000000000000000000000000000000
Arg [7] : reporter (address): 0x0000000000000000000000000000000000000000
Arg [8] : reporterMultiplier (uint256): 1
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0x956F47F50A910163D8BF957Cf5846D573E7f87CA
Arg [2] : symbolHash (bytes32): 0x58c46f3a00a69ae5a5ce163895c14f8f5b7791333af9fe6e7a73618cb5460913
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0x2028D7Ef0223C45caDBF05E13F1823c1228012BF
Arg [7] : reporter (address): 0xDe2Fa230d4C05ec0337D7b4fc10e16f5663044B0
Arg [8] : reporterMultiplier (uint256): 10000000000000000
Arg [9] : isUniswapReversed (bool): False

Arg [1] : underlying (address): 0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0
Arg [2] : symbolHash (bytes32): 0xa6a7de01e8b7ba6a4a61c782a73188d808fc1f3cf5743fadb68a02ed884b594f
Arg [3] : baseUnit (uint256): 1000000000000000000
Arg [4] : priceSource (uint8): 2
Arg [5] : fixedPrice (uint256): 0
Arg [6] : uniswapMarket (address): 0x290A6a7460B308ee3F19023D2D00dE604bcf5B42
Arg [7] : reporter (address): 0x44750a79ae69D5E9bC1651E099DFFE1fb8611AbA
Arg [8] : reporterMultiplier (uint256): 10000000000000000
Arg [9] : isUniswapReversed (bool): False


-----Encoded View---------------
193 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000214e8348c4f0000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000708
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : aaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff4
Arg [6] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000008ad599c3a0ff1de082011efddc58f1908eb6e6d8
Arg [10] : 000000000000000000000000264bddfd9d93d48d759fbdb0670be1c6fdd50236
Arg [11] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [13] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [14] : a5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e568
Arg [15] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [18] : 000000000000000000000000c2e9f25be6257c210d7adf0d4cd6e3e881ba25f8
Arg [19] : 000000000000000000000000b2419f587f497cdd64437f1b367e2e80889631ea
Arg [20] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [22] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [23] : d6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa
Arg [24] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [26] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [31] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [32] : 8b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d0
Arg [33] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [35] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [36] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [37] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [38] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [39] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [40] : 0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599
Arg [41] : e98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e9
Arg [42] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [43] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [44] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [45] : 000000000000000000000000cbcdf9626bc03e24f779434178a73a0b4bad62ed
Arg [46] : 0000000000000000000000004846efc15cc725456597044e6267ad0b3b51353e
Arg [47] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [48] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [49] : 0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef
Arg [50] : 3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db55
Arg [51] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [52] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [53] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [54] : 000000000000000000000000ae614a7a56cb79c04df2aeba6f5dab80a39ca78e
Arg [55] : 000000000000000000000000eba6f33730b9751a8ba0b18d9c256093e82f6bc2
Arg [56] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [57] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [58] : 000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498
Arg [59] : b8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd
Arg [60] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [61] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [62] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [63] : 00000000000000000000000014424eeecbff345b38187d0b8b749e56faa68539
Arg [64] : 0000000000000000000000005c5db112c98dbe5977a4c37ad33f8a4c9ebd5575
Arg [65] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [66] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [67] : 0000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e862
Arg [68] : 91a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee9504
Arg [69] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [70] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [71] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [72] : 000000000000000000000000b055103b7633b61518cd806d95beeb2d4cd217e7
Arg [73] : 00000000000000000000000090655316479383795416b615b61282c72d8382c1
Arg [74] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [75] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [76] : 00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359
Arg [77] : 4dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c532
Arg [78] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [79] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [80] : 0000000000000000000000000000000000000000000000000012c6adf3a35000
Arg [81] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [82] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [83] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [84] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [85] : 0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984
Arg [86] : fba01d52a7cd84480d0573725899486a0b5e55c20ff45d6628874349375d1650
Arg [87] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [88] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [89] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [90] : 0000000000000000000000001d42064fc4beb5f8aaf85f4617ae8b3b5b8bd801
Arg [91] : 00000000000000000000000070f4d236fd678c9db41a52d28f90e299676d9d90
Arg [92] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [93] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [94] : 000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888
Arg [95] : b6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab454
Arg [96] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [97] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [98] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [99] : 000000000000000000000000ea4ba4ce14fdd287f380b55419b1c5b6c3f22ab6
Arg [100] : 000000000000000000000000e270b8e9d7a7d2a7ee35a45e43d17d56b3e272b1
Arg [101] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [102] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [103] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [104] : 921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a779
Arg [105] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [106] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [107] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [108] : 000000000000000000000000a6cc3c2531fdaa6ae1a3ca84c2855806728693e8
Arg [109] : 000000000000000000000000bcfd9b1a97ccd0a3942f0408350cdc281cdca1b1
Arg [110] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [111] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [112] : 0000000000000000000000000000000000085d4780b73119b644ae5ecd22b376
Arg [113] : a1b8d8f7e538bb573797c963eeeed40d0bcb9f28c56104417d0da1b372ae3051
Arg [114] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [115] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [116] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [117] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [118] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [119] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [120] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [121] : 0000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae9
Arg [122] : de46fbfa339d54cd65b79d8320a7a53c78177565c2aaf4c8b13eed7865e7cfc8
Arg [123] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [124] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [125] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [126] : 0000000000000000000000005ab53ee1d50eef2c1dd3d5402789cd27bb52c1bb
Arg [127] : 0000000000000000000000000238247e71ad0ab272203af13baea72e99ee7c3c
Arg [128] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [129] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [130] : 0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2
Arg [131] : bbf304add43db0a05d104474683215530b076be1dfdf72a4d53a1e443d8e4c21
Arg [132] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [133] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [134] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [135] : 00000000000000000000000073a6a761fe483ba19debb8f56ac5bbf14c0cdad1
Arg [136] : 0000000000000000000000001a6aa40170118baf36bac82214dc5681af69b0cf
Arg [137] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [138] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [139] : 0000000000000000000000009f8f72aa9304c8b593d555f12ef6589cc3a579a2
Arg [140] : ec76ec3a7e5f010a9229e69fa1945af6f0c6cc5b0a625bf03bd6381222192020
Arg [141] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [142] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [143] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [144] : 000000000000000000000000e8c6c9227491c0a8156a0106a0204d881bb7e531
Arg [145] : 000000000000000000000000ba895504a8e286691e7dacfb47ae8a3a737e2ce1
Arg [146] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [147] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [148] : 0000000000000000000000000bc529c00c6401aef6d220be8c6ea1667f6ad93e
Arg [149] : ec34391362c28ee226b3b8624a699ee507a40fa771fd01d38b03ac7b70998bbe
Arg [150] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [151] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [152] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [153] : 00000000000000000000000004916039b1f59d9745bf6e0a21f191d1e0a84287
Arg [154] : 000000000000000000000000ba4319741782151d2b1df4799d757892efda4165
Arg [155] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [156] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [157] : 0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599
Arg [158] : e98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e9
Arg [159] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [160] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [161] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [162] : 000000000000000000000000cbcdf9626bc03e24f779434178a73a0b4bad62ed
Arg [163] : 0000000000000000000000004846efc15cc725456597044e6267ad0b3b51353e
Arg [164] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [165] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [166] : 0000000000000000000000008e870d67f660d95d5be530380d0ec0bd388289e1
Arg [167] : e6ce7ecb96a43fc15fb4020f93c37885612803dd74366bb6815e4f607ac3ca20
Arg [168] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [169] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [170] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [171] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [172] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [173] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [174] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [175] : 000000000000000000000000956f47f50a910163d8bf957cf5846d573e7f87ca
Arg [176] : 58c46f3a00a69ae5a5ce163895c14f8f5b7791333af9fe6e7a73618cb5460913
Arg [177] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [178] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [179] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [180] : 0000000000000000000000002028d7ef0223c45cadbf05e13f1823c1228012bf
Arg [181] : 000000000000000000000000de2fa230d4c05ec0337d7b4fc10e16f5663044b0
Arg [182] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [183] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [184] : 0000000000000000000000007d1afa7b718fb893db30a3abc0cfc608aacfebb0
Arg [185] : a6a7de01e8b7ba6a4a61c782a73188d808fc1f3cf5743fadb68a02ed884b594f
Arg [186] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [187] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [188] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [189] : 000000000000000000000000290a6a7460b308ee3f19023d2d00de604bcf5b42
Arg [190] : 00000000000000000000000044750a79ae69d5e9bc1651e099dffe1fb8611aba
Arg [191] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [192] : 0000000000000000000000000000000000000000000000000000000000000000


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.