Contract 0xaa111c62cdeef205f70e6722d1e22274274ec12f

Contract Overview

Balance:
0 ETH

ETH Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x23c75cbe19234ce50db9502b198c4030c818af03ede9195cc72ddecdf444fa6dSwap Exact Token...(pending)2024-03-01 21:08:4740 secs ago0xcc2aa1f2bd7206f405e890c1a982098c633eda39 IN 0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH(Pending)
0xe343db5e473d5b57f06f56559badd568759652e07b56e7141d0dd8347b9f9a3dSwap Exact ETH F...37693462024-03-01 21:09:1215 secs ago0x92622f6bad2f24cdd8b50618be7690cda6b6e5c8 IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0.05 ETH0.000069769296
0xe2960d79b31ddc59570e0250bfb4cbfd5c94eb8114ab4974c403ca3b31000a93Swap Exact Token...37693402024-03-01 21:08:5433 secs ago0x5d7dd4fd6982d5a26e4c73293025f950fbc53873 IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH0.00007557611
0xa370823f4d3061c2cfec774e83b1cc5da359ae9bbd64f02353ee903de50fe4f2Swap Exact Token...37693312024-03-01 21:08:271 min ago0x2f2d1d846c03120526736f81f60c19e83833bb6c IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH0.000113939136
0xc30f27f5beaeebb302bef5370b0c63046f6090df0d849f717734ebd0300ce2cfAdd Liquidity37693292024-03-01 21:08:211 min ago0xc4521cfd7831fc17093241821a132da56440f06c IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH0.000070207344
0xc30d98523a5d87415bccf0568030472ad969aefee063421a7fbb4358a6d03985Swap Exact Token...37693222024-03-01 21:08:001 min ago0x9fa3455a67c74e9dc1f7f448528d7c676292df0c IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH0.000078163
0x948e9624f29badf27b809bf89d428c693ec6e2a0ccf3cfeb67a958133a269ebeSwap Exact Token...37693132024-03-01 21:07:331 min ago0x6ac14c8d088ccdb3bb62a52b78e0c07aba8c7e8d IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH0.00006627096
0x05d44d715b8b66ff06299b6a0743fa608742d25b3fce3e657100fd0378ef178eSwap Exact ETH F...37693112024-03-01 21:07:272 mins ago0xad2692ba6186a7cadf78d077519ddccc02e8e4ef IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0.0000017123 ETH0.000113084208
0x967676d5c03575945f35cbe85399cacbc8a8e4843fba9c101d58e19e9d134f50Swap Exact ETH F...37692932024-03-01 21:06:332 mins ago0x6ac14c8d088ccdb3bb62a52b78e0c07aba8c7e8d IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0.01 ETH0.000100644336
0xe74876ef85e58cbfebe84d6f10e39400e76edc8bc0883edae00be4eaf40700f9Swap Exact ETH F...37692902024-03-01 21:06:243 mins ago0x639c31f08dd0cf28036674c36a65999356f83126 IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0.044 ETH0.000069769296
0xfb59b6cedaab2fec70e0284afaa7948044db2192d03fdea2641fcdddf1e86055Swap Exact ETH F...37692852024-03-01 21:06:093 mins ago0x71bb1ff984fe7c29d612dacddf110afc6fe1d473 IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0.0000691 ETH0.000117342864
0xc709441d022b6e8128b8d1ef1d96109b0c1f5cf598c660410b3d35a74ace25f9Swap Exact ETH F...37692852024-03-01 21:06:093 mins ago0xaa005790746ebc3512f44c85700c22dac7f024a4 IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0.000096 ETH0.000077146128
0xba231e522e6b121673772b031795a162c155bb6f21400dd2ddd08be41dfe2cdcSwap Exact Token...37692762024-03-01 21:05:194 mins ago0x3d049f4c91475345c5c0e1f0eff9cfb482f31888 IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH0.000076692873
0x6161cdf5921fb25ee304106dd49513c1e613264351b359000340a9475e6823b7Swap Exact Token...37692562024-03-01 21:04:195 mins ago0xeab70258e04c455bd44e0b6a7b6b1632b3eb157f IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH0.000070405632
0x29dff3bd3e00c9ed805361d960002a19e801b7ca006479a8f4d70948c1539974Swap Exact Token...37692512024-03-01 21:04:045 mins ago0x39935a233d894ffcd7ea07a966816eea1100fd6e IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH0.000076681987
0x031cd7ad5dbad6ad24ebdbdf4d1b6d3fa2dbe180a7ea022b032d60b78c5a516dSwap Exact Token...37692382024-03-01 21:03:256 mins ago0x507d472582fb332a0cfd6e7b4a5ea2141e620247 IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH0.000120599712
0xeb744de5a0c50288590e69339f5b0e03deac2d7d1d52fe8979aea2387e281ae5Swap Exact ETH F...37692352024-03-01 21:03:166 mins ago0xd757812b96fab06728be55c03a110a27f11b5e8a IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0.004 ETH0.00012304224
0xa904ee39ce53e0fbdb3b2026eb287b1994f8328c7733e0612ab3edb781b1dcc7Swap Exact Token...37692182024-03-01 21:02:257 mins ago0xfd309aad5e4f0b3eea209b4ebf8cc02754163a6b IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH0.00007886471
0xe4f242cb83d73625cfa9dad478ba25a9508f32d24a75efb8cb404c10a1388ee0Swap Exact Token...37692142024-03-01 21:02:137 mins ago0x93e395064978c43ae0c69786b6e2ce87ba74acc5 IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH0.00012752626
0x0d39bc7d3bfd1080d0f2caa126c6aa5eb6051dad85b4bc4adfc0111397efd71bSwap Exact ETH F...37692112024-03-01 21:02:047 mins ago0x6de8d8fbc41b1d849aab6efa6c0e793b9823680e IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0.0000481 ETH0.00010188504
0xb2c7023814fda70e141f432984a14b943345755c1e9bf8c9d775cd36235c3e31Swap Exact ETH F...37692052024-03-01 21:01:467 mins ago0x93e395064978c43ae0c69786b6e2ce87ba74acc5 IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0.02 ETH0.0001642039
0xdbaa862227f8ba8f9f41487251d71ee0531dca352e3afd19873ac58424cbc452Swap Exact ETH F...37691792024-03-01 21:00:288 mins ago0x0c581b527b848699c66762840445156148b9d5b3 IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0.0159 ETH0.000077156496
0x8d2562f2102d4a0b1eac862bc1dbcc95d1e788cec165c74bd42377ec552a706eSwap Exact Token...37691562024-03-01 20:59:1910 mins ago0x05239b3a7ef612c26c130b51d6db665512ddf1bb IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH0.00007668743
0xc3e24f8c1065a6b742bf1117457b8b9e9ff1fe2e2fed01a9ea612c5350ba0b29Swap Exact Token...37691502024-03-01 20:59:0110 mins ago0x98b45970431fe900fcad1ad3e02c21c70d5fb6de IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH0.000067532832
0xe162e23625188f44c940f81b601bf2e4e8edcd1e11bb168ffc050d83c1c670ebSwap Exact Token...37691262024-03-01 20:57:4911 mins ago0x98b45970431fe900fcad1ad3e02c21c70d5fb6de IN  0xaa111c62cdeef205f70e6722d1e22274274ec12f0 ETH0.00009571392
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xe343db5e473d5b57f06f56559badd568759652e07b56e7141d0dd8347b9f9a3d37693462024-03-01 21:09:1215 secs ago 0xaa111c62cdeef205f70e6722d1e22274274ec12fScroll: WETH Token0.05 ETH
0xc30d98523a5d87415bccf0568030472ad969aefee063421a7fbb4358a6d0398537693222024-03-01 21:08:001 min ago 0xaa111c62cdeef205f70e6722d1e22274274ec12f0x9fa3455a67c74e9dc1f7f448528d7c676292df0c0.000357130707493026 ETH
0xc30d98523a5d87415bccf0568030472ad969aefee063421a7fbb4358a6d0398537693222024-03-01 21:08:001 min ago Scroll: WETH Token 0xaa111c62cdeef205f70e6722d1e22274274ec12f0.000357130707493026 ETH
0x948e9624f29badf27b809bf89d428c693ec6e2a0ccf3cfeb67a958133a269ebe37693132024-03-01 21:07:331 min ago 0xaa111c62cdeef205f70e6722d1e22274274ec12f0x6ac14c8d088ccdb3bb62a52b78e0c07aba8c7e8d0.009950443227870137 ETH
0x948e9624f29badf27b809bf89d428c693ec6e2a0ccf3cfeb67a958133a269ebe37693132024-03-01 21:07:331 min ago Scroll: WETH Token 0xaa111c62cdeef205f70e6722d1e22274274ec12f0.009950443227870137 ETH
0x05d44d715b8b66ff06299b6a0743fa608742d25b3fce3e657100fd0378ef178e37693112024-03-01 21:07:272 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12fScroll: WETH Token0.0000017123 ETH
0x967676d5c03575945f35cbe85399cacbc8a8e4843fba9c101d58e19e9d134f5037692932024-03-01 21:06:332 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12fScroll: WETH Token0.01 ETH
0xe74876ef85e58cbfebe84d6f10e39400e76edc8bc0883edae00be4eaf40700f937692902024-03-01 21:06:243 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12fScroll: WETH Token0.044 ETH
0xfb59b6cedaab2fec70e0284afaa7948044db2192d03fdea2641fcdddf1e8605537692852024-03-01 21:06:093 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12fScroll: WETH Token0.0000691 ETH
0xc709441d022b6e8128b8d1ef1d96109b0c1f5cf598c660410b3d35a74ace25f937692852024-03-01 21:06:093 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12fScroll: WETH Token0.000096 ETH
0xba231e522e6b121673772b031795a162c155bb6f21400dd2ddd08be41dfe2cdc37692762024-03-01 21:05:194 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12f0x3d049f4c91475345c5c0e1f0eff9cfb482f318880.026478407863416928 ETH
0xba231e522e6b121673772b031795a162c155bb6f21400dd2ddd08be41dfe2cdc37692762024-03-01 21:05:194 mins ago Scroll: WETH Token 0xaa111c62cdeef205f70e6722d1e22274274ec12f0.026478407863416928 ETH
0x29dff3bd3e00c9ed805361d960002a19e801b7ca006479a8f4d70948c153997437692512024-03-01 21:04:045 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12f0x39935a233d894ffcd7ea07a966816eea1100fd6e0.000984867619543464 ETH
0x29dff3bd3e00c9ed805361d960002a19e801b7ca006479a8f4d70948c153997437692512024-03-01 21:04:045 mins ago Scroll: WETH Token 0xaa111c62cdeef205f70e6722d1e22274274ec12f0.000984867619543464 ETH
0x031cd7ad5dbad6ad24ebdbdf4d1b6d3fa2dbe180a7ea022b032d60b78c5a516d37692382024-03-01 21:03:256 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12f0x507d472582fb332a0cfd6e7b4a5ea2141e6202470.001693876965425987 ETH
0x031cd7ad5dbad6ad24ebdbdf4d1b6d3fa2dbe180a7ea022b032d60b78c5a516d37692382024-03-01 21:03:256 mins ago Scroll: WETH Token 0xaa111c62cdeef205f70e6722d1e22274274ec12f0.001693876965425987 ETH
0xeb744de5a0c50288590e69339f5b0e03deac2d7d1d52fe8979aea2387e281ae537692352024-03-01 21:03:166 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12fScroll: WETH Token0.004 ETH
0xa904ee39ce53e0fbdb3b2026eb287b1994f8328c7733e0612ab3edb781b1dcc737692182024-03-01 21:02:257 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12f0xfd309aad5e4f0b3eea209b4ebf8cc02754163a6b0.002234637814632847 ETH
0xa904ee39ce53e0fbdb3b2026eb287b1994f8328c7733e0612ab3edb781b1dcc737692182024-03-01 21:02:257 mins ago Scroll: WETH Token 0xaa111c62cdeef205f70e6722d1e22274274ec12f0.002234637814632847 ETH
0xe4f242cb83d73625cfa9dad478ba25a9508f32d24a75efb8cb404c10a1388ee037692142024-03-01 21:02:137 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12f0x93e395064978c43ae0c69786b6e2ce87ba74acc50.019888362418095396 ETH
0xe4f242cb83d73625cfa9dad478ba25a9508f32d24a75efb8cb404c10a1388ee037692142024-03-01 21:02:137 mins ago Scroll: WETH Token 0xaa111c62cdeef205f70e6722d1e22274274ec12f0.019888362418095396 ETH
0x0d39bc7d3bfd1080d0f2caa126c6aa5eb6051dad85b4bc4adfc0111397efd71b37692112024-03-01 21:02:047 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12fScroll: WETH Token0.0000481 ETH
0xb2c7023814fda70e141f432984a14b943345755c1e9bf8c9d775cd36235c3e3137692052024-03-01 21:01:467 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12fScroll: WETH Token0.02 ETH
0xdbaa862227f8ba8f9f41487251d71ee0531dca352e3afd19873ac58424cbc45237691792024-03-01 21:00:288 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12fScroll: WETH Token0.0159 ETH
0x8d2562f2102d4a0b1eac862bc1dbcc95d1e788cec165c74bd42377ec552a706e37691562024-03-01 20:59:1910 mins ago 0xaa111c62cdeef205f70e6722d1e22274274ec12f0x05239b3a7ef612c26c130b51d6db665512ddf1bb0.002522963010220968 ETH
[ Download CSV Export 
Index Block
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Router

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at scrollscan.com on 2023-10-18
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.13;

// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // 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(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // 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].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            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 for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the 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.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // 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 preconditions 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 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function transfer(address recipient, uint amount) external returns (bool);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function balanceOf(address) external view returns (uint);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

interface IPair {
    function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1);
    function tokens() external returns (address, address);
    function token0() external returns (address);
    function token1() external returns (address);
    function transferFrom(address src, address dst, uint amount) external returns (bool);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function burn(address to) external returns (uint amount0, uint amount1);
    function mint(address to) external returns (uint liquidity);
    function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast);
    function getAmountOut(uint, address) external view returns (uint);
    function setHasGauge(bool value) external;
    function setExternalBribe(address _externalBribe) external;
    function hasGauge() external view returns (bool);
    function stable() external view returns (bool);
    function prices(address tokenIn, uint amountIn, uint points) external view returns (uint[] memory);
}

interface IPairFactory {
    function allPairsLength() external view returns (uint);

    function isPair(address pair) external view returns (bool);

    function isPaused() external view returns (bool);

    function pairCodeHash() external pure returns (bytes32);

    function getFee(address pair) external view returns (uint256);

    function getPair(
        address tokenA,
        address token,
        bool stable
    ) external view returns (address);

    function getInitializable() external view returns (address, address, bool);

    function createPair(
        address tokenA,
        address tokenB,
        bool stable
    ) external returns (address pair);

    function voter() external view returns (address);

    function tank() external view returns (address);
}

interface IRouter {
    function pairFor(address tokenA, address tokenB, bool stable) external view returns (address pair);
}

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint256 value) external returns (bool);
    function withdraw(uint256) external;
}

contract Router is IRouter {

    struct route {
        address from;
        address to;
        bool stable;
    }

    address public immutable factory;
    IWETH public immutable weth;
    uint internal constant MINIMUM_LIQUIDITY = 10**3;
    bytes32 immutable pairCodeHash;

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'Router: EXPIRED');
        _;
    }

    constructor(address _factory, address _weth) {
        factory = _factory;
        pairCodeHash = IPairFactory(_factory).pairCodeHash();
        weth = IWETH(_weth);
    }

    receive() external payable {
        assert(msg.sender == address(weth)); // only accept ETH via fallback from the WETH contract
    }

    function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'Router: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'Router: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address tokenA, address tokenB, bool stable) public view returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint160(uint256(keccak256(abi.encodePacked(
            hex'ff',
            factory,
            keccak256(abi.encodePacked(token0, token1, stable)),
            pairCodeHash // init code hash
        )))));
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quoteLiquidity(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'Router: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'Router: INSUFFICIENT_LIQUIDITY');
        amountB = amountA * reserveB / reserveA;
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address tokenA, address tokenB, bool stable) public view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IPair(pairFor(tokenA, tokenB, stable)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountOut(uint amountIn, address tokenIn, address tokenOut) public view returns (uint amount, bool stable) {
        address pair = pairFor(tokenIn, tokenOut, true);
        uint amountStable;
        uint amountVolatile;
        if (IPairFactory(factory).isPair(pair)) {
            amountStable = IPair(pair).getAmountOut(amountIn, tokenIn);
        }
        pair = pairFor(tokenIn, tokenOut, false);
        if (IPairFactory(factory).isPair(pair)) {
            amountVolatile = IPair(pair).getAmountOut(amountIn, tokenIn);
        }
        return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false);
    }

    //@override
    //getAmountOut	:	bool stable
    //Gets exact output for specific pair-type(S|V)
    function getAmountOut(uint amountIn, address tokenIn, address tokenOut, bool stable) public view returns (uint amount) {
        address pair = pairFor(tokenIn, tokenOut, stable);
        if (IPairFactory(factory).isPair(pair)) {
            amount = IPair(pair).getAmountOut(amountIn, tokenIn);
        }
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(uint amountIn, route[] memory routes) public view returns (uint[] memory amounts) {
        require(routes.length >= 1, 'Router: INVALID_PATH');
        amounts = new uint[](routes.length+1);
        amounts[0] = amountIn;
        for (uint i = 0; i < routes.length; i++) {
            address pair = pairFor(routes[i].from, routes[i].to, routes[i].stable);
            if (IPairFactory(factory).isPair(pair)) {
                amounts[i+1] = IPair(pair).getAmountOut(amounts[i], routes[i].from);
            }
        }
    }

    function isPair(address pair) external view returns (bool) {
        return IPairFactory(factory).isPair(pair);
    }

    function quoteAddLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired
    ) external view returns (uint amountA, uint amountB, uint liquidity) {
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);
        (uint reserveA, uint reserveB) = (0,0);
        uint _totalSupply = 0;
        if (_pair != address(0)) {
            _totalSupply = IERC20(_pair).totalSupply();
            (reserveA, reserveB) = getReserves(tokenA, tokenB, stable);
        }
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
            liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY;
        } else {

            uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                (amountA, amountB) = (amountADesired, amountBOptimal);
                liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
            } else {
                uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
                (amountA, amountB) = (amountAOptimal, amountBDesired);
                liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
            }
        }
    }

    function quoteRemoveLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity
    ) external view returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);

        if (_pair == address(0)) {
            return (0,0);
        }

        (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
        uint _totalSupply = IERC20(_pair).totalSupply();

        amountA = liquidity * reserveA / _totalSupply; // using balances ensures pro-rata distribution
        amountB = liquidity * reserveB / _totalSupply; // using balances ensures pro-rata distribution

    }

    function _addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal returns (uint amountA, uint amountB) {
        require(amountADesired >= amountAMin);
        require(amountBDesired >= amountBMin);
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);
        if (_pair == address(0)) {
            _pair = IPairFactory(factory).createPair(tokenA, tokenB, stable);
        }
        (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'Router: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = pairFor(tokenA, tokenB, stable);
        _safeTransferFrom(tokenA, msg.sender, pair, amountA);
        _safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IPair(pair).mint(to);
    }

    function addLiquidityETH(
        address token,
        bool stable,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            address(weth),
            stable,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = pairFor(token, address(weth), stable);
        _safeTransferFrom(token, msg.sender, pair, amountToken);
        weth.deposit{value: amountETH}();
        assert(weth.transfer(pair, amountETH));
        liquidity = IPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) _safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = pairFor(tokenA, tokenB, stable);
        require(IPair(pair).transferFrom(msg.sender, pair, liquidity)); // send liquidity to pair
        (uint amount0, uint amount1) = IPair(pair).burn(to);
        (address token0,) = sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'Router: INSUFFICIENT_B_AMOUNT');
    }

    function removeLiquidityETH(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            address(weth),
            stable,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, amountToken);
        weth.withdraw(amountETH);
        _safeTransferETH(to, amountETH);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB) {
        address pair = pairFor(tokenA, tokenB, stable);
        {
            uint value = approveMax ? type(uint).max : liquidity;
            IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        }

        (amountA, amountB) = removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline);
    }

    function removeLiquidityETHWithPermit(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH) {
        address pair = pairFor(token, address(weth), stable);
        uint value = approveMax ? type(uint).max : liquidity;
        IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, route[] memory routes, address _to) internal virtual {
        for (uint i = 0; i < routes.length; i++) {
            (address token0,) = sortTokens(routes[i].from, routes[i].to);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to;
            IPair(pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }

    function swapExactTokensForTokensSimple(
        uint amountIn,
        uint amountOutMin,
        address tokenFrom,
        address tokenTo,
        bool stable,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory amounts) {
        route[] memory routes = new route[](1);
        routes[0].from = tokenFrom;
        routes[0].to = tokenTo;
        routes[0].stable = stable;
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory amounts) {
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactETHForTokens(uint amountOutMin, route[] calldata routes, address to, uint deadline)
    external
    payable
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[0].from == address(weth), 'Router: INVALID_PATH');
        amounts = getAmountsOut(msg.value, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Router: INSUFFICIENT_OUTPUT_AMOUNT');
        weth.deposit{value: amounts[0]}();
        assert(weth.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]));
        _swap(amounts, routes, to);
    }

    function swapExactTokensForETH(uint amountIn, uint amountOutMin, route[] calldata routes, address to, uint deadline)
    external
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[routes.length - 1].to == address(weth), 'Router: INVALID_PATH');
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, address(this));
        weth.withdraw(amounts[amounts.length - 1]);
        _safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function UNSAFE_swapExactTokensForTokens(
        uint[] memory amounts,
        route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory) {
        _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]);
        _swap(amounts, routes, to);
        return amounts;
    }

    function _safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }

    function _safeTransfer(address token, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function _safeTransferFrom(address token, address from, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b5060405162003c9a38038062003c9a8339810160408190526200003491620000d8565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab9248916004808201926020929091908290030181865afa1580156200007f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a5919062000110565b60c0526001600160a01b031660a052506200012a565b80516001600160a01b0381168114620000d357600080fd5b919050565b60008060408385031215620000ec57600080fd5b620000f783620000bb565b91506200010760208401620000bb565b90509250929050565b6000602082840312156200012357600080fd5b5051919050565b60805160a05160c051613a9f620001fb6000396000610f32015260008181610149015281816102160152818161095201528181610b9101528181610de2015281816114a9015281816115bc0152818161164a01528181611e2201528181611e5801528181611e8d01528181611f220152818161206101526120b101526000818161043801528181610c7701528181610ef7015281816111b0015281816112c4015281816119cf01528181611b430152818161215c0152818161226d0152818161285701526128f80152613a9f6000f3fe6080604052600436106101395760003560e01c806367ffb66a116100ab578063b7e0d4c01161006f578063b7e0d4c014610413578063c45a015514610426578063d7b0e0a51461045a578063da2142311461047a578063e5e31b13146104a8578063f41766d8146104d857600080fd5b806367ffb66a146103805780637301e3c8146103935780639881fcb4146103b357806398a0fb3c146103d3578063a32b1fcd146103f357600080fd5b8063448725b4116100fd578063448725b4146102705780634c1ee03e14610290578063544caa56146102b05780635a47ddc3146102f05780635e1e63251461032b5780635e60dab51461036057600080fd5b80630dede6c41461017d57806313dcfc59146101b757806318a13086146101e45780633fc8cef3146102045780634386e63c1461025057600080fd5b3661017857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461017657610176612df0565b005b600080fd5b34801561018957600080fd5b5061019d610198366004612e3c565b6104f8565b604080519283526020830191909152015b60405180910390f35b3480156101c357600080fd5b506101d76101d2366004612ec1565b610712565b6040516101ae9190612f3c565b3480156101f057600080fd5b506101d76101ff366004612fc5565b610925565b34801561021057600080fd5b506102387f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101ae565b34801561025c57600080fd5b5061019d61026b366004613038565b610c70565b34801561027c57600080fd5b5061019d61028b36600461309a565b610dd7565b34801561029c57600080fd5b506102386102ab366004613144565b610eb0565b3480156102bc57600080fd5b506102d06102cb36600461318f565b610fb8565b604080516001600160a01b039384168152929091166020830152016101ae565b3480156102fc57600080fd5b5061031061030b3660046131c8565b611098565b604080519384526020840192909252908201526060016101ae565b34801561033757600080fd5b5061034b610346366004613257565b611178565b604080519283529015156020830152016101ae565b34801561036c57600080fd5b5061019d61037b366004613144565b6113cc565b6101d761038e36600461328e565b611484565b34801561039f57600080fd5b506101d76103ae366004613360565b6117e3565b3480156103bf57600080fd5b506101d76103ce3660046134a2565b6118b9565b3480156103df57600080fd5b506103106103ee366004613548565b611b3b565b3480156103ff57600080fd5b5061019d61040e3660046135a3565b611d3b565b61031061042136600461365f565b611df6565b34801561043257600080fd5b506102387f000000000000000000000000000000000000000000000000000000000000000081565b34801561046657600080fd5b5061019d61047536600461365f565b612037565b34801561048657600080fd5b5061049a6104953660046136ba565b61212c565b6040519081526020016101ae565b3480156104b457600080fd5b506104c86104c336600461370d565b61224b565b60405190151581526020016101ae565b3480156104e457600080fd5b506101d76104f3366004612fc5565b6122e0565b60008082428110156105255760405162461bcd60e51b815260040161051c9061372a565b60405180910390fd5b60006105328c8c8c610eb0565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190613753565b6105b557600080fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015610601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106259190613770565b9150915060006106358f8f610fb8565b509050806001600160a01b03168f6001600160a01b03161461065857818361065b565b82825b90975095508a8710156106b05760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f415f414d4f554e54000000604482015260640161051c565b898610156107005760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f425f414d4f554e54000000604482015260640161051c565b50505050509850989650505050505050565b606081428110156107355760405162461bcd60e51b815260040161051c9061372a565b604080516001808252818301909252600091816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161074c579050509050878160008151811061078f5761078f613794565b6020026020010151600001906001600160a01b031690816001600160a01b03168152505086816000815181106107c7576107c7613794565b6020026020010151602001906001600160a01b031690816001600160a01b03168152505085816000815181106107ff576107ff613794565b602090810291909101015190151560409091015261081d8a826118b9565b925088836001855161082f91906137c0565b8151811061083f5761083f613794565b602002602001015110156108655760405162461bcd60e51b815260040161051c906137d7565b61090d8160008151811061087b5761087b613794565b602002602001015160000151336108ed8460008151811061089e5761089e613794565b602002602001015160000151856000815181106108bd576108bd613794565b602002602001015160200151866000815181106108dc576108dc613794565b602002602001015160400151610eb0565b8660008151811061090057610900613794565b6020026020010151612405565b6109188382876124fd565b5050979650505050505050565b606081428110156109485760405162461bcd60e51b815260040161051c9061372a565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868661097f6001826137c0565b81811061098e5761098e613794565b90506060020160200160208101906109a6919061370d565b6001600160a01b0316146109cc5760405162461bcd60e51b815260040161051c90613819565b610a28888787808060200260200160405190810160405280939291908181526020016000905b82821015610a1e57610a0f60608302860136819003810190613847565b815260200190600101906109f2565b50505050506118b9565b9150868260018451610a3a91906137c0565b81518110610a4a57610a4a613794565b60200260200101511015610a705760405162461bcd60e51b815260040161051c906137d7565b610b3286866000818110610a8657610a86613794565b610a9c926020606090920201908101915061370d565b33610b1f89896000818110610ab357610ab3613794565b610ac9926020606090920201908101915061370d565b8a8a6000818110610adc57610adc613794565b9050606002016020016020810190610af4919061370d565b8b8b6000818110610b0757610b07613794565b90506060020160400160208101906102ab9190613863565b8560008151811061090057610900613794565b610b8f828787808060200260200160405190810160405280939291908181526020016000905b82821015610b8457610b7560608302860136819003810190613847565b81526020019060010190610b58565b5050505050306124fd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610bcd91906137c0565b81518110610bdd57610bdd613794565b60200260200101516040518263ffffffff1660e01b8152600401610c0391815260200190565b600060405180830381600087803b158015610c1d57600080fd5b505af1158015610c31573d6000803e3d6000fd5b50505050610c65848360018551610c4891906137c0565b81518110610c5857610c58613794565b6020026020010151612752565b509695505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610cc593929190613880565b602060405180830381865afa158015610ce2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0691906138a4565b90506001600160a01b038116610d23576000809250925050610dce565b600080610d318989896113cc565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9991906138c1565b905080610da684896138da565b610db0919061390f565b955080610dbd83896138da565b610dc7919061390f565b9450505050505b94509492505050565b6000806000610e078e7f00000000000000000000000000000000000000000000000000000000000000008f610eb0565b9050600087610e16578c610e1a565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610e55903390309086908f908e908e908e90600401613931565b600060405180830381600087803b158015610e6f57600080fd5b505af1158015610e83573d6000803e3d6000fd5b50505050610e968f8f8f8f8f8f8f612037565b809450819550505050509b509b9950505050505050505050565b6000806000610ebf8686610fb8565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f000000000000000000000000000000000000000000000000000000000000000090604901604051602081830303815290604052805190602001207f0000000000000000000000000000000000000000000000000000000000000000604051602001610f96939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b03160361101c5760405162461bcd60e51b815260206004820152601b60248201527f526f757465723a204944454e544943414c5f4144445245535345530000000000604482015260640161051c565b826001600160a01b0316846001600160a01b03161061103c57828461103f565b83835b90925090506001600160a01b0382166110915760405162461bcd60e51b8152602060048201526014602482015273526f757465723a205a45524f5f4144445245535360601b604482015260640161051c565b9250929050565b600080600083428110156110be5760405162461bcd60e51b815260040161051c9061372a565b6110cd8d8d8d8d8d8d8d612820565b909450925060006110df8e8e8e610eb0565b90506110ed8e338388612405565b6110f98d338387612405565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611141573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116591906138c1565b9250505099509950999650505050505050565b600080600061118985856001610eb0565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156111f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121d9190613753565b15611296576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561126f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129391906138c1565b91505b6112a287876000610eb0565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561130d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113319190613753565b156113aa576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611383573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a791906138c1565b90505b8082116113b9578060006113bd565b8160015b94509450505050935093915050565b60008060006113db8686610fb8565b5090506000806113ec888888610eb0565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611429573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144d9190613972565b5091509150826001600160a01b0316886001600160a01b031614611472578082611475565b81815b90999098509650505050505050565b606081428110156114a75760405162461bcd60e51b815260040161051c9061372a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316868660008181106114e4576114e4613794565b6114fa926020606090920201908101915061370d565b6001600160a01b0316146115205760405162461bcd60e51b815260040161051c90613819565b611572348787808060200260200160405190810160405280939291908181526020016000905b82821015610a1e5761156360608302860136819003810190613847565b81526020019060010190611546565b915086826001845161158491906137c0565b8151811061159457611594613794565b602002602001015110156115ba5760405162461bcd60e51b815260040161051c906137d7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106115fc576115fc613794565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561162f57600080fd5b505af1158015611643573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6116e18888600081811061168d5761168d613794565b6116a3926020606090920201908101915061370d565b898960008181106116b6576116b6613794565b90506060020160200160208101906116ce919061370d565b8a8a6000818110610b0757610b07613794565b846000815181106116f4576116f4613794565b60200260200101516040518363ffffffff1660e01b815260040161172d9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af115801561174c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117709190613753565b61177c5761177c612df0565b6117d9828787808060200260200160405190810160405280939291908181526020016000905b828210156117ce576117bf60608302860136819003810190613847565b815260200190600101906117a2565b5050505050866124fd565b5095945050505050565b606081428110156118065760405162461bcd60e51b815260040161051c9061372a565b61185c8686600081811061181c5761181c613794565b611832926020606090920201908101915061370d565b3361184989896000818110610ab357610ab3613794565b8a60008151811061090057610900613794565b6118ae878787808060200260200160405190810160405280939291908181526020016000905b828210156117ce5761189f60608302860136819003810190613847565b81526020019060010190611882565b509495945050505050565b60606001825110156118dd5760405162461bcd60e51b815260040161051c90613819565b81516118ea9060016139a0565b67ffffffffffffffff811115611902576119026132f5565b60405190808252806020026020018201604052801561192b578160200160208202803683370190505b509050828160008151811061194257611942613794565b60200260200101818152505060005b8251811015611b345760006119ad84838151811061197157611971613794565b60200260200101516000015185848151811061198f5761198f613794565b6020026020010151602001518685815181106108dc576108dc613794565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015611a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3c9190613753565b15611b2157806001600160a01b031663f140a35a848481518110611a6257611a62613794565b6020026020010151868581518110611a7c57611a7c613794565b6020026020010151600001516040518363ffffffff1660e01b8152600401611ab79291909182526001600160a01b0316602082015260400190565b602060405180830381865afa158015611ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af891906138c1565b83611b048460016139a0565b81518110611b1457611b14613794565b6020026020010181815250505b5080611b2c816139b8565b915050611951565b5092915050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401611b9193929190613880565b602060405180830381865afa158015611bae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd291906138a4565b9050600080806001600160a01b03841615611c5c57836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4991906138c1565b9050611c568c8c8c6113cc565b90935091505b82158015611c68575081155b15611c99578896508795506103e8611c88611c83888a6138da565b612a9e565b611c9291906137c0565b9450611d2c565b6000611ca68a8585612b8d565b9050888111611cee57899750955085611ce784611cc3848b6138da565b611ccd919061390f565b84611cd8858b6138da565b611ce2919061390f565b612c57565b9550611d2a565b6000611cfb8a8587612b8d565b9850899750889050611d2685611d1185846138da565b611d1b919061390f565b85611cd8868c6138da565b9650505b505b50505050955095509592505050565b6000806000611d4b8f8f8f610eb0565b9050600087611d5a578c611d5e565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611d99903390309086908f908e908e908e90600401613931565b600060405180830381600087803b158015611db357600080fd5b505af1158015611dc7573d6000803e3d6000fd5b5050505050611ddc8f8f8f8f8f8f8f8f6104f8565b8093508194505050509c509c9a5050505050505050505050565b60008060008342811015611e1c5760405162461bcd60e51b815260040161051c9061372a565b611e4b8b7f00000000000000000000000000000000000000000000000000000000000000008c8c348d8d612820565b90945092506000611e7d8c7f00000000000000000000000000000000000000000000000000000000000000008d610eb0565b9050611e8b8c338388612405565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ee657600080fd5b505af1158015611efa573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015611f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f939190613753565b611f9f57611f9f612df0565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611fe7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200b91906138c1565b925083341115612028576120283361202386346137c0565b612752565b50509750975097945050505050565b600080824281101561205b5760405162461bcd60e51b815260040161051c9061372a565b61208b8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b6104f8565b909350915061209b8a8685612c6d565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156120fd57600080fd5b505af1158015612111573d6000803e3d6000fd5b5050505061211f8583612752565b5097509795505050505050565b60008061213a858585610eb0565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156121a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c99190613753565b15612242576040516378a051ad60e11b8152600481018790526001600160a01b03868116602483015282169063f140a35a90604401602060405180830381865afa15801561221b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223f91906138c1565b91505b50949350505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156122b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122da9190613753565b92915050565b606081428110156123035760405162461bcd60e51b815260040161051c9061372a565b612355888787808060200260200160405190810160405280939291908181526020016000905b82821015610a1e5761234660608302860136819003810190613847565b81526020019060010190612329565b915086826001845161236791906137c0565b8151811061237757612377613794565b6020026020010151101561239d5760405162461bcd60e51b815260040161051c906137d7565b6123b386866000818110610a8657610a86613794565b610c65828787808060200260200160405190810160405280939291908181526020016000905b828210156117ce576123f660608302860136819003810190613847565b815260200190600101906123d9565b6000846001600160a01b03163b1161241c57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161248091906139fd565b6000604051808303816000865af19150503d80600081146124bd576040519150601f19603f3d011682016040523d82523d6000602084013e6124c2565b606091505b50915091508180156124ec5750805115806124ec5750808060200190518101906124ec9190613753565b6124f557600080fd5b505050505050565b60005b825181101561274c57600061254f84838151811061252057612520613794565b60200260200101516000015185848151811061253e5761253e613794565b602002602001015160200151610fb8565b5090506000856125608460016139a0565b8151811061257057612570613794565b60200260200101519050600080836001600160a01b031687868151811061259957612599613794565b6020026020010151600001516001600160a01b0316146125bb578260006125bf565b6000835b915091506000600188516125d391906137c0565b86106125df5786612652565b612652886125ee8860016139a0565b815181106125fe576125fe613794565b6020026020010151600001518988600161261891906139a0565b8151811061262857612628613794565b6020026020010151602001518a89600161264291906139a0565b815181106108dc576108dc613794565b90506126a588878151811061266957612669613794565b60200260200101516000015189888151811061268757612687613794565b6020026020010151602001518a89815181106108dc576108dc613794565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156126e2576020820181803683370190505b506040518563ffffffff1660e01b81526004016127029493929190613a19565b600060405180830381600087803b15801561271c57600080fd5b505af1158015612730573d6000803e3d6000fd5b5050505050505050508080612744906139b8565b915050612500565b50505050565b604080516000808252602082019092526001600160a01b03841690839060405161277c91906139fd565b60006040518083038185875af1925050503d80600081146127b9576040519150601f19603f3d011682016040523d82523d6000602084013e6127be565b606091505b505090508061281b5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b606482015260840161051c565b505050565b6000808386101561283057600080fd5b8285101561283d57600080fd5b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc3090612890908d908d908d90600401613880565b602060405180830381865afa1580156128ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d191906138a4565b90506001600160a01b038116612977576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906382dfdce490612931908d908d908d90600401613880565b6020604051808303816000875af1158015612950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297491906138a4565b90505b6000806129858c8c8c6113cc565b91509150816000148015612997575080155b156129a757889450879350612a8f565b60006129b48a8484612b8d565b9050888111612a185786811015612a0d5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f425f414d4f554e54000000604482015260640161051c565b899550935083612a8d565b6000612a258a8486612b8d565b90508a811115612a3757612a37612df0565b88811015612a875760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f415f414d4f554e54000000604482015260640161051c565b95508894505b505b50505097509795505050505050565b600081600003612ab057506000919050565b60006001612abd84612d5c565b901c6001901b90506001818481612ad657612ad66138f9565b048201901c90506001818481612aee57612aee6138f9565b048201901c90506001818481612b0657612b066138f9565b048201901c90506001818481612b1e57612b1e6138f9565b048201901c90506001818481612b3657612b366138f9565b048201901c90506001818481612b4e57612b4e6138f9565b048201901c90506001818481612b6657612b666138f9565b048201901c9050612b8681828581612b8057612b806138f9565b04612c57565b9392505050565b6000808411612bde5760405162461bcd60e51b815260206004820152601b60248201527f526f757465723a20494e53554646494349454e545f414d4f554e540000000000604482015260640161051c565b600083118015612bee5750600082115b612c3a5760405162461bcd60e51b815260206004820152601e60248201527f526f757465723a20494e53554646494349454e545f4c49515549444954590000604482015260640161051c565b82612c4583866138da565b612c4f919061390f565b949350505050565b6000818310612c665781612b86565b5090919050565b6000836001600160a01b03163b11612c8457600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612ce091906139fd565b6000604051808303816000865af19150503d8060008114612d1d576040519150601f19603f3d011682016040523d82523d6000602084013e612d22565b606091505b5091509150818015612d4c575080511580612d4c575080806020019051810190612d4c9190613753565b612d5557600080fd5b5050505050565b600080608083901c15612d7157608092831c92015b604083901c15612d8357604092831c92015b602083901c15612d9557602092831c92015b601083901c15612da757601092831c92015b600883901c15612db957600892831c92015b600483901c15612dcb57600492831c92015b600283901c15612ddd57600292831c92015b600183901c156122da5760010192915050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114612e1b57600080fd5b50565b8035612e2981612e06565b919050565b8015158114612e1b57600080fd5b600080600080600080600080610100898b031215612e5957600080fd5b8835612e6481612e06565b97506020890135612e7481612e06565b96506040890135612e8481612e2e565b9550606089013594506080890135935060a0890135925060c0890135612ea981612e06565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215612edc57600080fd5b87359650602088013595506040880135612ef581612e06565b94506060880135612f0581612e06565b93506080880135612f1581612e2e565b925060a0880135612f2581612e06565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015612f7457835183529284019291840191600101612f58565b50909695505050505050565b60008083601f840112612f9257600080fd5b50813567ffffffffffffffff811115612faa57600080fd5b60208301915083602060608302850101111561109157600080fd5b60008060008060008060a08789031215612fde57600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561300357600080fd5b61300f89828a01612f80565b909550935050606087013561302381612e06565b80925050608087013590509295509295509295565b6000806000806080858703121561304e57600080fd5b843561305981612e06565b9350602085013561306981612e06565b9250604085013561307981612e2e565b9396929550929360600135925050565b803560ff81168114612e2957600080fd5b60008060008060008060008060008060006101608c8e0312156130bc57600080fd5b8b356130c781612e06565b9a5060208c01356130d781612e2e565b995060408c0135985060608c0135975060808c0135965060a08c01356130fc81612e06565b955060c08c0135945060e08c013561311381612e2e565b93506131226101008d01613089565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60008060006060848603121561315957600080fd5b833561316481612e06565b9250602084013561317481612e06565b9150604084013561318481612e2e565b809150509250925092565b600080604083850312156131a257600080fd5b82356131ad81612e06565b915060208301356131bd81612e06565b809150509250929050565b60008060008060008060008060006101208a8c0312156131e757600080fd5b89356131f281612e06565b985060208a013561320281612e06565b975060408a013561321281612e2e565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a013561323e81612e06565b809250506101008a013590509295985092959850929598565b60008060006060848603121561326c57600080fd5b83359250602084013561327e81612e06565b9150604084013561318481612e06565b6000806000806000608086880312156132a657600080fd5b85359450602086013567ffffffffffffffff8111156132c457600080fd5b6132d088828901612f80565b90955093505060408601356132e481612e06565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613334576133346132f5565b604052919050565b600067ffffffffffffffff821115613356576133566132f5565b5060051b60200190565b60008060008060006080868803121561337857600080fd5b853567ffffffffffffffff8082111561339057600080fd5b818801915088601f8301126133a457600080fd5b813560206133b96133b48361333c565b61330b565b82815260059290921b8401810191818101908c8411156133d857600080fd5b948201945b838610156133f6578535825294820194908201906133dd565b9950508901359250508082111561340c57600080fd5b5061341988828901612f80565b90955093506132e4905060408701612e1e565b60006060828403121561343e57600080fd5b6040516060810181811067ffffffffffffffff82111715613461576134616132f5565b604052905080823561347281612e06565b8152602083013561348281612e06565b6020820152604083013561349581612e2e565b6040919091015292915050565b600080604083850312156134b557600080fd5b8235915060208084013567ffffffffffffffff8111156134d457600080fd5b8401601f810186136134e557600080fd5b80356134f36133b48261333c565b8181526060918202830184019184820191908984111561351257600080fd5b938501935b83851015613538576135298a8661342c565b83529384019391850191613517565b5080955050505050509250929050565b600080600080600060a0868803121561356057600080fd5b853561356b81612e06565b9450602086013561357b81612e06565b9350604086013561358b81612e2e565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f0312156135c657600080fd5b8c356135d181612e06565b9b5060208d01356135e181612e06565b9a5060408d01356135f181612e2e565b995060608d0135985060808d0135975060a08d0135965060c08d013561361681612e06565b955060e08d013594506101008d013561362e81612e2e565b935061363d6101208e01613089565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a03121561367a57600080fd5b873561368581612e06565b9650602088013561369581612e2e565b955060408801359450606088013593506080880135925060a0880135612f2581612e06565b600080600080608085870312156136d057600080fd5b8435935060208501356136e281612e06565b925060408501356136f281612e06565b9150606085013561370281612e2e565b939692955090935050565b60006020828403121561371f57600080fd5b8135612b8681612e06565b6020808252600f908201526e149bdd5d195c8e8811561412549151608a1b604082015260600190565b60006020828403121561376557600080fd5b8151612b8681612e2e565b6000806040838503121561378357600080fd5b505080516020909101519092909150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156137d2576137d26137aa565b500390565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f55604082015261139560f21b606082015260800190565b6020808252601490820152730a4deeae8cae47440929cac82989288bea082a8960631b604082015260600190565b60006060828403121561385957600080fd5b612b86838361342c565b60006020828403121561387557600080fd5b8135612b8681612e2e565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156138b657600080fd5b8151612b8681612e06565b6000602082840312156138d357600080fd5b5051919050565b60008160001904831182151516156138f4576138f46137aa565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261392c57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60008060006060848603121561398757600080fd5b8351925060208401519150604084015190509250925092565b600082198211156139b3576139b36137aa565b500190565b6000600182016139ca576139ca6137aa565b5060010190565b60005b838110156139ec5781810151838201526020016139d4565b8381111561274c5750506000910152565b60008251613a0f8184602087016139d1565b9190910192915050565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152613a528160a08501602087016139d1565b601f01601f19169190910160a0019594505050505056fea2646970667358221220adb8bb7c1405fbcc73ecf94f886a179c69535753d587283f4d1ff5b57d4f659c64736f6c634300080d00330000000000000000000000002516212168034b18a0155ffbe59f2f0063fffbd90000000000000000000000005300000000000000000000000000000000000004

Deployed Bytecode

0x6080604052600436106101395760003560e01c806367ffb66a116100ab578063b7e0d4c01161006f578063b7e0d4c014610413578063c45a015514610426578063d7b0e0a51461045a578063da2142311461047a578063e5e31b13146104a8578063f41766d8146104d857600080fd5b806367ffb66a146103805780637301e3c8146103935780639881fcb4146103b357806398a0fb3c146103d3578063a32b1fcd146103f357600080fd5b8063448725b4116100fd578063448725b4146102705780634c1ee03e14610290578063544caa56146102b05780635a47ddc3146102f05780635e1e63251461032b5780635e60dab51461036057600080fd5b80630dede6c41461017d57806313dcfc59146101b757806318a13086146101e45780633fc8cef3146102045780634386e63c1461025057600080fd5b3661017857336001600160a01b037f0000000000000000000000005300000000000000000000000000000000000004161461017657610176612df0565b005b600080fd5b34801561018957600080fd5b5061019d610198366004612e3c565b6104f8565b604080519283526020830191909152015b60405180910390f35b3480156101c357600080fd5b506101d76101d2366004612ec1565b610712565b6040516101ae9190612f3c565b3480156101f057600080fd5b506101d76101ff366004612fc5565b610925565b34801561021057600080fd5b506102387f000000000000000000000000530000000000000000000000000000000000000481565b6040516001600160a01b0390911681526020016101ae565b34801561025c57600080fd5b5061019d61026b366004613038565b610c70565b34801561027c57600080fd5b5061019d61028b36600461309a565b610dd7565b34801561029c57600080fd5b506102386102ab366004613144565b610eb0565b3480156102bc57600080fd5b506102d06102cb36600461318f565b610fb8565b604080516001600160a01b039384168152929091166020830152016101ae565b3480156102fc57600080fd5b5061031061030b3660046131c8565b611098565b604080519384526020840192909252908201526060016101ae565b34801561033757600080fd5b5061034b610346366004613257565b611178565b604080519283529015156020830152016101ae565b34801561036c57600080fd5b5061019d61037b366004613144565b6113cc565b6101d761038e36600461328e565b611484565b34801561039f57600080fd5b506101d76103ae366004613360565b6117e3565b3480156103bf57600080fd5b506101d76103ce3660046134a2565b6118b9565b3480156103df57600080fd5b506103106103ee366004613548565b611b3b565b3480156103ff57600080fd5b5061019d61040e3660046135a3565b611d3b565b61031061042136600461365f565b611df6565b34801561043257600080fd5b506102387f0000000000000000000000002516212168034b18a0155ffbe59f2f0063fffbd981565b34801561046657600080fd5b5061019d61047536600461365f565b612037565b34801561048657600080fd5b5061049a6104953660046136ba565b61212c565b6040519081526020016101ae565b3480156104b457600080fd5b506104c86104c336600461370d565b61224b565b60405190151581526020016101ae565b3480156104e457600080fd5b506101d76104f3366004612fc5565b6122e0565b60008082428110156105255760405162461bcd60e51b815260040161051c9061372a565b60405180910390fd5b60006105328c8c8c610eb0565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190613753565b6105b557600080fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015610601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106259190613770565b9150915060006106358f8f610fb8565b509050806001600160a01b03168f6001600160a01b03161461065857818361065b565b82825b90975095508a8710156106b05760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f415f414d4f554e54000000604482015260640161051c565b898610156107005760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f425f414d4f554e54000000604482015260640161051c565b50505050509850989650505050505050565b606081428110156107355760405162461bcd60e51b815260040161051c9061372a565b604080516001808252818301909252600091816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161074c579050509050878160008151811061078f5761078f613794565b6020026020010151600001906001600160a01b031690816001600160a01b03168152505086816000815181106107c7576107c7613794565b6020026020010151602001906001600160a01b031690816001600160a01b03168152505085816000815181106107ff576107ff613794565b602090810291909101015190151560409091015261081d8a826118b9565b925088836001855161082f91906137c0565b8151811061083f5761083f613794565b602002602001015110156108655760405162461bcd60e51b815260040161051c906137d7565b61090d8160008151811061087b5761087b613794565b602002602001015160000151336108ed8460008151811061089e5761089e613794565b602002602001015160000151856000815181106108bd576108bd613794565b602002602001015160200151866000815181106108dc576108dc613794565b602002602001015160400151610eb0565b8660008151811061090057610900613794565b6020026020010151612405565b6109188382876124fd565b5050979650505050505050565b606081428110156109485760405162461bcd60e51b815260040161051c9061372a565b6001600160a01b037f000000000000000000000000530000000000000000000000000000000000000416868661097f6001826137c0565b81811061098e5761098e613794565b90506060020160200160208101906109a6919061370d565b6001600160a01b0316146109cc5760405162461bcd60e51b815260040161051c90613819565b610a28888787808060200260200160405190810160405280939291908181526020016000905b82821015610a1e57610a0f60608302860136819003810190613847565b815260200190600101906109f2565b50505050506118b9565b9150868260018451610a3a91906137c0565b81518110610a4a57610a4a613794565b60200260200101511015610a705760405162461bcd60e51b815260040161051c906137d7565b610b3286866000818110610a8657610a86613794565b610a9c926020606090920201908101915061370d565b33610b1f89896000818110610ab357610ab3613794565b610ac9926020606090920201908101915061370d565b8a8a6000818110610adc57610adc613794565b9050606002016020016020810190610af4919061370d565b8b8b6000818110610b0757610b07613794565b90506060020160400160208101906102ab9190613863565b8560008151811061090057610900613794565b610b8f828787808060200260200160405190810160405280939291908181526020016000905b82821015610b8457610b7560608302860136819003810190613847565b81526020019060010190610b58565b5050505050306124fd565b7f00000000000000000000000053000000000000000000000000000000000000046001600160a01b0316632e1a7d4d8360018551610bcd91906137c0565b81518110610bdd57610bdd613794565b60200260200101516040518263ffffffff1660e01b8152600401610c0391815260200190565b600060405180830381600087803b158015610c1d57600080fd5b505af1158015610c31573d6000803e3d6000fd5b50505050610c65848360018551610c4891906137c0565b81518110610c5857610c58613794565b6020026020010151612752565b509695505050505050565b60008060007f0000000000000000000000002516212168034b18a0155ffbe59f2f0063fffbd96001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610cc593929190613880565b602060405180830381865afa158015610ce2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0691906138a4565b90506001600160a01b038116610d23576000809250925050610dce565b600080610d318989896113cc565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9991906138c1565b905080610da684896138da565b610db0919061390f565b955080610dbd83896138da565b610dc7919061390f565b9450505050505b94509492505050565b6000806000610e078e7f00000000000000000000000053000000000000000000000000000000000000048f610eb0565b9050600087610e16578c610e1a565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610e55903390309086908f908e908e908e90600401613931565b600060405180830381600087803b158015610e6f57600080fd5b505af1158015610e83573d6000803e3d6000fd5b50505050610e968f8f8f8f8f8f8f612037565b809450819550505050509b509b9950505050505050505050565b6000806000610ebf8686610fb8565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f0000000000000000000000002516212168034b18a0155ffbe59f2f0063fffbd990604901604051602081830303815290604052805190602001207f7384e8d36663b8089375a5ddd7a14c263a8fa46b706fad51471389f610b9bb0e604051602001610f96939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b03160361101c5760405162461bcd60e51b815260206004820152601b60248201527f526f757465723a204944454e544943414c5f4144445245535345530000000000604482015260640161051c565b826001600160a01b0316846001600160a01b03161061103c57828461103f565b83835b90925090506001600160a01b0382166110915760405162461bcd60e51b8152602060048201526014602482015273526f757465723a205a45524f5f4144445245535360601b604482015260640161051c565b9250929050565b600080600083428110156110be5760405162461bcd60e51b815260040161051c9061372a565b6110cd8d8d8d8d8d8d8d612820565b909450925060006110df8e8e8e610eb0565b90506110ed8e338388612405565b6110f98d338387612405565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611141573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116591906138c1565b9250505099509950999650505050505050565b600080600061118985856001610eb0565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f0000000000000000000000002516212168034b18a0155ffbe59f2f0063fffbd99091169063e5e31b1390602401602060405180830381865afa1580156111f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121d9190613753565b15611296576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561126f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129391906138c1565b91505b6112a287876000610eb0565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f0000000000000000000000002516212168034b18a0155ffbe59f2f0063fffbd99091169063e5e31b1390602401602060405180830381865afa15801561130d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113319190613753565b156113aa576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611383573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a791906138c1565b90505b8082116113b9578060006113bd565b8160015b94509450505050935093915050565b60008060006113db8686610fb8565b5090506000806113ec888888610eb0565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611429573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144d9190613972565b5091509150826001600160a01b0316886001600160a01b031614611472578082611475565b81815b90999098509650505050505050565b606081428110156114a75760405162461bcd60e51b815260040161051c9061372a565b7f00000000000000000000000053000000000000000000000000000000000000046001600160a01b0316868660008181106114e4576114e4613794565b6114fa926020606090920201908101915061370d565b6001600160a01b0316146115205760405162461bcd60e51b815260040161051c90613819565b611572348787808060200260200160405190810160405280939291908181526020016000905b82821015610a1e5761156360608302860136819003810190613847565b81526020019060010190611546565b915086826001845161158491906137c0565b8151811061159457611594613794565b602002602001015110156115ba5760405162461bcd60e51b815260040161051c906137d7565b7f00000000000000000000000053000000000000000000000000000000000000046001600160a01b031663d0e30db0836000815181106115fc576115fc613794565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561162f57600080fd5b505af1158015611643573d6000803e3d6000fd5b50505050507f00000000000000000000000053000000000000000000000000000000000000046001600160a01b031663a9059cbb6116e18888600081811061168d5761168d613794565b6116a3926020606090920201908101915061370d565b898960008181106116b6576116b6613794565b90506060020160200160208101906116ce919061370d565b8a8a6000818110610b0757610b07613794565b846000815181106116f4576116f4613794565b60200260200101516040518363ffffffff1660e01b815260040161172d9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af115801561174c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117709190613753565b61177c5761177c612df0565b6117d9828787808060200260200160405190810160405280939291908181526020016000905b828210156117ce576117bf60608302860136819003810190613847565b815260200190600101906117a2565b5050505050866124fd565b5095945050505050565b606081428110156118065760405162461bcd60e51b815260040161051c9061372a565b61185c8686600081811061181c5761181c613794565b611832926020606090920201908101915061370d565b3361184989896000818110610ab357610ab3613794565b8a60008151811061090057610900613794565b6118ae878787808060200260200160405190810160405280939291908181526020016000905b828210156117ce5761189f60608302860136819003810190613847565b81526020019060010190611882565b509495945050505050565b60606001825110156118dd5760405162461bcd60e51b815260040161051c90613819565b81516118ea9060016139a0565b67ffffffffffffffff811115611902576119026132f5565b60405190808252806020026020018201604052801561192b578160200160208202803683370190505b509050828160008151811061194257611942613794565b60200260200101818152505060005b8251811015611b345760006119ad84838151811061197157611971613794565b60200260200101516000015185848151811061198f5761198f613794565b6020026020010151602001518685815181106108dc576108dc613794565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f0000000000000000000000002516212168034b18a0155ffbe59f2f0063fffbd99091169063e5e31b1390602401602060405180830381865afa158015611a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3c9190613753565b15611b2157806001600160a01b031663f140a35a848481518110611a6257611a62613794565b6020026020010151868581518110611a7c57611a7c613794565b6020026020010151600001516040518363ffffffff1660e01b8152600401611ab79291909182526001600160a01b0316602082015260400190565b602060405180830381865afa158015611ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af891906138c1565b83611b048460016139a0565b81518110611b1457611b14613794565b6020026020010181815250505b5080611b2c816139b8565b915050611951565b5092915050565b6000806000807f0000000000000000000000002516212168034b18a0155ffbe59f2f0063fffbd96001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401611b9193929190613880565b602060405180830381865afa158015611bae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd291906138a4565b9050600080806001600160a01b03841615611c5c57836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4991906138c1565b9050611c568c8c8c6113cc565b90935091505b82158015611c68575081155b15611c99578896508795506103e8611c88611c83888a6138da565b612a9e565b611c9291906137c0565b9450611d2c565b6000611ca68a8585612b8d565b9050888111611cee57899750955085611ce784611cc3848b6138da565b611ccd919061390f565b84611cd8858b6138da565b611ce2919061390f565b612c57565b9550611d2a565b6000611cfb8a8587612b8d565b9850899750889050611d2685611d1185846138da565b611d1b919061390f565b85611cd8868c6138da565b9650505b505b50505050955095509592505050565b6000806000611d4b8f8f8f610eb0565b9050600087611d5a578c611d5e565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611d99903390309086908f908e908e908e90600401613931565b600060405180830381600087803b158015611db357600080fd5b505af1158015611dc7573d6000803e3d6000fd5b5050505050611ddc8f8f8f8f8f8f8f8f6104f8565b8093508194505050509c509c9a5050505050505050505050565b60008060008342811015611e1c5760405162461bcd60e51b815260040161051c9061372a565b611e4b8b7f00000000000000000000000053000000000000000000000000000000000000048c8c348d8d612820565b90945092506000611e7d8c7f00000000000000000000000053000000000000000000000000000000000000048d610eb0565b9050611e8b8c338388612405565b7f00000000000000000000000053000000000000000000000000000000000000046001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ee657600080fd5b505af1158015611efa573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000530000000000000000000000000000000000000416935063a9059cbb925060440190506020604051808303816000875af1158015611f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f939190613753565b611f9f57611f9f612df0565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611fe7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200b91906138c1565b925083341115612028576120283361202386346137c0565b612752565b50509750975097945050505050565b600080824281101561205b5760405162461bcd60e51b815260040161051c9061372a565b61208b8a7f00000000000000000000000053000000000000000000000000000000000000048b8b8b8b308b6104f8565b909350915061209b8a8685612c6d565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000053000000000000000000000000000000000000046001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156120fd57600080fd5b505af1158015612111573d6000803e3d6000fd5b5050505061211f8583612752565b5097509795505050505050565b60008061213a858585610eb0565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f0000000000000000000000002516212168034b18a0155ffbe59f2f0063fffbd99091169063e5e31b1390602401602060405180830381865afa1580156121a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c99190613753565b15612242576040516378a051ad60e11b8152600481018790526001600160a01b03868116602483015282169063f140a35a90604401602060405180830381865afa15801561221b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223f91906138c1565b91505b50949350505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f0000000000000000000000002516212168034b18a0155ffbe59f2f0063fffbd99091169063e5e31b1390602401602060405180830381865afa1580156122b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122da9190613753565b92915050565b606081428110156123035760405162461bcd60e51b815260040161051c9061372a565b612355888787808060200260200160405190810160405280939291908181526020016000905b82821015610a1e5761234660608302860136819003810190613847565b81526020019060010190612329565b915086826001845161236791906137c0565b8151811061237757612377613794565b6020026020010151101561239d5760405162461bcd60e51b815260040161051c906137d7565b6123b386866000818110610a8657610a86613794565b610c65828787808060200260200160405190810160405280939291908181526020016000905b828210156117ce576123f660608302860136819003810190613847565b815260200190600101906123d9565b6000846001600160a01b03163b1161241c57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161248091906139fd565b6000604051808303816000865af19150503d80600081146124bd576040519150601f19603f3d011682016040523d82523d6000602084013e6124c2565b606091505b50915091508180156124ec5750805115806124ec5750808060200190518101906124ec9190613753565b6124f557600080fd5b505050505050565b60005b825181101561274c57600061254f84838151811061252057612520613794565b60200260200101516000015185848151811061253e5761253e613794565b602002602001015160200151610fb8565b5090506000856125608460016139a0565b8151811061257057612570613794565b60200260200101519050600080836001600160a01b031687868151811061259957612599613794565b6020026020010151600001516001600160a01b0316146125bb578260006125bf565b6000835b915091506000600188516125d391906137c0565b86106125df5786612652565b612652886125ee8860016139a0565b815181106125fe576125fe613794565b6020026020010151600001518988600161261891906139a0565b8151811061262857612628613794565b6020026020010151602001518a89600161264291906139a0565b815181106108dc576108dc613794565b90506126a588878151811061266957612669613794565b60200260200101516000015189888151811061268757612687613794565b6020026020010151602001518a89815181106108dc576108dc613794565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156126e2576020820181803683370190505b506040518563ffffffff1660e01b81526004016127029493929190613a19565b600060405180830381600087803b15801561271c57600080fd5b505af1158015612730573d6000803e3d6000fd5b5050505050505050508080612744906139b8565b915050612500565b50505050565b604080516000808252602082019092526001600160a01b03841690839060405161277c91906139fd565b60006040518083038185875af1925050503d80600081146127b9576040519150601f19603f3d011682016040523d82523d6000602084013e6127be565b606091505b505090508061281b5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b606482015260840161051c565b505050565b6000808386101561283057600080fd5b8285101561283d57600080fd5b6040516306801cc360e41b81526000906001600160a01b037f0000000000000000000000002516212168034b18a0155ffbe59f2f0063fffbd91690636801cc3090612890908d908d908d90600401613880565b602060405180830381865afa1580156128ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d191906138a4565b90506001600160a01b038116612977576040516320b7f73960e21b81526001600160a01b037f0000000000000000000000002516212168034b18a0155ffbe59f2f0063fffbd916906382dfdce490612931908d908d908d90600401613880565b6020604051808303816000875af1158015612950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297491906138a4565b90505b6000806129858c8c8c6113cc565b91509150816000148015612997575080155b156129a757889450879350612a8f565b60006129b48a8484612b8d565b9050888111612a185786811015612a0d5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f425f414d4f554e54000000604482015260640161051c565b899550935083612a8d565b6000612a258a8486612b8d565b90508a811115612a3757612a37612df0565b88811015612a875760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f415f414d4f554e54000000604482015260640161051c565b95508894505b505b50505097509795505050505050565b600081600003612ab057506000919050565b60006001612abd84612d5c565b901c6001901b90506001818481612ad657612ad66138f9565b048201901c90506001818481612aee57612aee6138f9565b048201901c90506001818481612b0657612b066138f9565b048201901c90506001818481612b1e57612b1e6138f9565b048201901c90506001818481612b3657612b366138f9565b048201901c90506001818481612b4e57612b4e6138f9565b048201901c90506001818481612b6657612b666138f9565b048201901c9050612b8681828581612b8057612b806138f9565b04612c57565b9392505050565b6000808411612bde5760405162461bcd60e51b815260206004820152601b60248201527f526f757465723a20494e53554646494349454e545f414d4f554e540000000000604482015260640161051c565b600083118015612bee5750600082115b612c3a5760405162461bcd60e51b815260206004820152601e60248201527f526f757465723a20494e53554646494349454e545f4c49515549444954590000604482015260640161051c565b82612c4583866138da565b612c4f919061390f565b949350505050565b6000818310612c665781612b86565b5090919050565b6000836001600160a01b03163b11612c8457600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612ce091906139fd565b6000604051808303816000865af19150503d8060008114612d1d576040519150601f19603f3d011682016040523d82523d6000602084013e612d22565b606091505b5091509150818015612d4c575080511580612d4c575080806020019051810190612d4c9190613753565b612d5557600080fd5b5050505050565b600080608083901c15612d7157608092831c92015b604083901c15612d8357604092831c92015b602083901c15612d9557602092831c92015b601083901c15612da757601092831c92015b600883901c15612db957600892831c92015b600483901c15612dcb57600492831c92015b600283901c15612ddd57600292831c92015b600183901c156122da5760010192915050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114612e1b57600080fd5b50565b8035612e2981612e06565b919050565b8015158114612e1b57600080fd5b600080600080600080600080610100898b031215612e5957600080fd5b8835612e6481612e06565b97506020890135612e7481612e06565b96506040890135612e8481612e2e565b9550606089013594506080890135935060a0890135925060c0890135612ea981612e06565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215612edc57600080fd5b87359650602088013595506040880135612ef581612e06565b94506060880135612f0581612e06565b93506080880135612f1581612e2e565b925060a0880135612f2581612e06565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015612f7457835183529284019291840191600101612f58565b50909695505050505050565b60008083601f840112612f9257600080fd5b50813567ffffffffffffffff811115612faa57600080fd5b60208301915083602060608302850101111561109157600080fd5b60008060008060008060a08789031215612fde57600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561300357600080fd5b61300f89828a01612f80565b909550935050606087013561302381612e06565b80925050608087013590509295509295509295565b6000806000806080858703121561304e57600080fd5b843561305981612e06565b9350602085013561306981612e06565b9250604085013561307981612e2e565b9396929550929360600135925050565b803560ff81168114612e2957600080fd5b60008060008060008060008060008060006101608c8e0312156130bc57600080fd5b8b356130c781612e06565b9a5060208c01356130d781612e2e565b995060408c0135985060608c0135975060808c0135965060a08c01356130fc81612e06565b955060c08c0135945060e08c013561311381612e2e565b93506131226101008d01613089565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60008060006060848603121561315957600080fd5b833561316481612e06565b9250602084013561317481612e06565b9150604084013561318481612e2e565b809150509250925092565b600080604083850312156131a257600080fd5b82356131ad81612e06565b915060208301356131bd81612e06565b809150509250929050565b60008060008060008060008060006101208a8c0312156131e757600080fd5b89356131f281612e06565b985060208a013561320281612e06565b975060408a013561321281612e2e565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a013561323e81612e06565b809250506101008a013590509295985092959850929598565b60008060006060848603121561326c57600080fd5b83359250602084013561327e81612e06565b9150604084013561318481612e06565b6000806000806000608086880312156132a657600080fd5b85359450602086013567ffffffffffffffff8111156132c457600080fd5b6132d088828901612f80565b90955093505060408601356132e481612e06565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613334576133346132f5565b604052919050565b600067ffffffffffffffff821115613356576133566132f5565b5060051b60200190565b60008060008060006080868803121561337857600080fd5b853567ffffffffffffffff8082111561339057600080fd5b818801915088601f8301126133a457600080fd5b813560206133b96133b48361333c565b61330b565b82815260059290921b8401810191818101908c8411156133d857600080fd5b948201945b838610156133f6578535825294820194908201906133dd565b9950508901359250508082111561340c57600080fd5b5061341988828901612f80565b90955093506132e4905060408701612e1e565b60006060828403121561343e57600080fd5b6040516060810181811067ffffffffffffffff82111715613461576134616132f5565b604052905080823561347281612e06565b8152602083013561348281612e06565b6020820152604083013561349581612e2e565b6040919091015292915050565b600080604083850312156134b557600080fd5b8235915060208084013567ffffffffffffffff8111156134d457600080fd5b8401601f810186136134e557600080fd5b80356134f36133b48261333c565b8181526060918202830184019184820191908984111561351257600080fd5b938501935b83851015613538576135298a8661342c565b83529384019391850191613517565b5080955050505050509250929050565b600080600080600060a0868803121561356057600080fd5b853561356b81612e06565b9450602086013561357b81612e06565b9350604086013561358b81612e2e565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f0312156135c657600080fd5b8c356135d181612e06565b9b5060208d01356135e181612e06565b9a5060408d01356135f181612e2e565b995060608d0135985060808d0135975060a08d0135965060c08d013561361681612e06565b955060e08d013594506101008d013561362e81612e2e565b935061363d6101208e01613089565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a03121561367a57600080fd5b873561368581612e06565b9650602088013561369581612e2e565b955060408801359450606088013593506080880135925060a0880135612f2581612e06565b600080600080608085870312156136d057600080fd5b8435935060208501356136e281612e06565b925060408501356136f281612e06565b9150606085013561370281612e2e565b939692955090935050565b60006020828403121561371f57600080fd5b8135612b8681612e06565b6020808252600f908201526e149bdd5d195c8e8811561412549151608a1b604082015260600190565b60006020828403121561376557600080fd5b8151612b8681612e2e565b6000806040838503121561378357600080fd5b505080516020909101519092909150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156137d2576137d26137aa565b500390565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f55604082015261139560f21b606082015260800190565b6020808252601490820152730a4deeae8cae47440929cac82989288bea082a8960631b604082015260600190565b60006060828403121561385957600080fd5b612b86838361342c565b60006020828403121561387557600080fd5b8135612b8681612e2e565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156138b657600080fd5b8151612b8681612e06565b6000602082840312156138d357600080fd5b5051919050565b60008160001904831182151516156138f4576138f46137aa565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261392c57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60008060006060848603121561398757600080fd5b8351925060208401519150604084015190509250925092565b600082198211156139b3576139b36137aa565b500190565b6000600182016139ca576139ca6137aa565b5060010190565b60005b838110156139ec5781810151838201526020016139d4565b8381111561274c5750506000910152565b60008251613a0f8184602087016139d1565b9190910192915050565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152613a528160a08501602087016139d1565b601f01601f19169190910160a0019594505050505056fea2646970667358221220adb8bb7c1405fbcc73ecf94f886a179c69535753d587283f4d1ff5b57d4f659c64736f6c634300080d0033

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

0000000000000000000000002516212168034b18a0155ffbe59f2f0063fffbd90000000000000000000000005300000000000000000000000000000000000004

-----Decoded View---------------
Arg [0] : _factory (address): 0x2516212168034b18a0155ffbe59f2f0063fffbd9
Arg [1] : _weth (address): 0x5300000000000000000000000000000000000004

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000002516212168034b18a0155ffbe59f2f0063fffbd9
Arg [1] : 0000000000000000000000005300000000000000000000000000000000000004


Deployed ByteCode Sourcemap

16023:17573:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16674:10;-1:-1:-1;;;;;16696:4:0;16674:27;;16667:35;;;;:::i;:::-;16023:17573;;;;;25856:808;;;;;;;;;;-1:-1:-1;25856:808:0;;;;;:::i;:::-;;:::i;:::-;;;;1664:25:1;;;1720:2;1705:18;;1698:34;;;;1637:18;25856:808:0;;;;;;;;29531:780;;;;;;;;;;-1:-1:-1;29531:780:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31524:755::-;;;;;;;;;;-1:-1:-1;31524:755:0;;;;;:::i;:::-;;:::i;16193:27::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4646:32:1;;;4628:51;;4616:2;4601:18;16193:27:0;4468:217:1;21898:752:0;;;;;;;;;;-1:-1:-1;21898:752:0;;;;;:::i;:::-;;:::i;28062:670::-;;;;;;;;;;-1:-1:-1;28062:670:0;;;;;:::i;:::-;;:::i;17192:415::-;;;;;;;;;;-1:-1:-1;17192:415:0;;;;;:::i;:::-;;:::i;16773:327::-;;;;;;;;;;-1:-1:-1;16773:327:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7958:15:1;;;7940:34;;8010:15;;;;8005:2;7990:18;;7983:43;7875:18;16773:327:0;7728:304:1;24160:696:0;;;;;;;;;;-1:-1:-1;24160:696:0;;;;;:::i;:::-;;:::i;:::-;;;;9254:25:1;;;9310:2;9295:18;;9288:34;;;;9338:18;;;9331:34;9242:2;9227:18;24160:696:0;9052:319:1;18542:662:0;;;;;;;;;;-1:-1:-1;18542:662:0;;;;;:::i;:::-;;:::i;:::-;;;;10005:25:1;;;10073:14;;10066:22;10061:2;10046:18;;10039:50;9978:18;18542:662:0;9837:258:1;18085:375:0;;;;;;;;;;-1:-1:-1;18085:375:0;;;;;:::i;:::-;;:::i;30904:612::-;;;;;;:::i;:::-;;:::i;32287:404::-;;;;;;;;;;-1:-1:-1;32287:404:0;;;;;:::i;:::-;;:::i;19714:559::-;;;;;;;;;;-1:-1:-1;19714:559:0;;;;;:::i;:::-;;:::i;20408:1482::-;;;;;;;;;;-1:-1:-1;20408:1482:0;;;;;:::i;:::-;;:::i;27353:701::-;;;;;;;;;;-1:-1:-1;27353:701:0;;;;;:::i;:::-;;:::i;24864:949::-;;;;;;:::i;:::-;;:::i;16154:32::-;;;;;;;;;;;;;;;26672:673;;;;;;;;;;-1:-1:-1;26672:673:0;;;;;:::i;:::-;;:::i;19316:316::-;;;;;;;;;;-1:-1:-1;19316:316:0;;;;;:::i;:::-;;:::i;:::-;;;18165:25:1;;;18153:2;18138:18;19316:316:0;18019:177:1;20281:119:0;;;;;;;;;;-1:-1:-1;20281:119:0;;;;;:::i;:::-;;:::i;:::-;;;18618:14:1;;18611:22;18593:41;;18581:2;18566:18;20281:119:0;18453:187:1;30319:577:0;;;;;;;;;;-1:-1:-1;30319:577:0;;;;;:::i;:::-;;:::i;25856:808::-;26115:12;26129;26096:8;16383:15;16371:8;:27;;16363:55;;;;-1:-1:-1;;;16363:55:0;;;;;;;:::i;:::-;;;;;;;;;26154:12:::1;26169:31;26177:6;26185;26193;26169:7;:31::i;:::-;26219:53;::::0;-1:-1:-1;;;26219:53:0;;26244:10:::1;26219:53;::::0;::::1;19229:34:1::0;-1:-1:-1;;;;;26219:24:0;::::1;19279:18:1::0;;;19272:43;;;19331:18;;;19324:34;;;26154:46:0;;-1:-1:-1;26219:24:0::1;::::0;19164:18:1;;26219:53:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26211:62;;;::::0;::::1;;26341:20;::::0;-1:-1:-1;;;26341:20:0;;-1:-1:-1;;;;;4646:32:1;;;26341:20:0::1;::::0;::::1;4628:51:1::0;26311:12:0::1;::::0;;;26341:16;::::1;::::0;::::1;::::0;4601:18:1;;26341:20:0::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26310:51;;;;26373:14;26392:26;26403:6;26411;26392:10;:26::i;:::-;26372:46;;;26460:6;-1:-1:-1::0;;;;;26450:16:0::1;:6;-1:-1:-1::0;;;;;26450:16:0::1;;:58;;26491:7;26500;26450:58;;;26470:7;26479;26450:58;26429:79:::0;;-1:-1:-1;26429:79:0;-1:-1:-1;26527:21:0;;::::1;;26519:63;;;::::0;-1:-1:-1;;;26519:63:0;;20071:2:1;26519:63:0::1;::::0;::::1;20053:21:1::0;20110:2;20090:18;;;20083:30;20149:31;20129:18;;;20122:59;20198:18;;26519:63:0::1;19869:353:1::0;26519:63:0::1;26612:10;26601:7;:21;;26593:63;;;::::0;-1:-1:-1;;;26593:63:0;;20429:2:1;26593:63:0::1;::::0;::::1;20411:21:1::0;20468:2;20448:18;;;20441:30;20507:31;20487:18;;;20480:59;20556:18;;26593:63:0::1;20227:353:1::0;26593:63:0::1;26143:521;;;;25856:808:::0;;;;;;;;;;;;:::o;29531:780::-;29786:21;29767:8;16383:15;16371:8;:27;;16363:55;;;;-1:-1:-1;;;16363:55:0;;;;;;;:::i;:::-;29844:14:::1;::::0;;29856:1:::1;29844:14:::0;;;;;::::1;::::0;;;29820:21:::1;::::0;29844:14:::1;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;29844:14:0;;-1:-1:-1;;29844:14:0;;;;::::1;::::0;::::1;;;;;29820:38;;29886:9;29869:6;29876:1;29869:9;;;;;;;;:::i;:::-;;;;;;;:14;;:26;-1:-1:-1::0;;;;;29869:26:0::1;;;-1:-1:-1::0;;;;;29869:26:0::1;;;::::0;::::1;29921:7;29906:6;29913:1;29906:9;;;;;;;;:::i;:::-;;;;;;;:12;;:22;-1:-1:-1::0;;;;;29906:22:0::1;;;-1:-1:-1::0;;;;;29906:22:0::1;;;::::0;::::1;29958:6;29939;29946:1;29939:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;:25;::::1;;:16;::::0;;::::1;:25:::0;29985:31:::1;29999:8:::0;30009:6;29985:13:::1;:31::i;:::-;29975:41;;30066:12;30035:7;30060:1;30043:7;:14;:18;;;;:::i;:::-;30035:27;;;;;;;;:::i;:::-;;;;;;;:43;;30027:90;;;;-1:-1:-1::0;;;30027:90:0::1;;;;;;;:::i;:::-;30128:138;30160:6;30167:1;30160:9;;;;;;;;:::i;:::-;;;;;;;:14;;;30176:10;30188:55;30196:6;30203:1;30196:9;;;;;;;;:::i;:::-;;;;;;;:14;;;30212:6;30219:1;30212:9;;;;;;;;:::i;:::-;;;;;;;:12;;;30226:6;30233:1;30226:9;;;;;;;;:::i;:::-;;;;;;;:16;;;30188:7;:55::i;:::-;30245:7;30253:1;30245:10;;;;;;;;:::i;:::-;;;;;;;30128:17;:138::i;:::-;30277:26;30283:7;30292:6;30300:2;30277:5;:26::i;:::-;29809:502;29531:780:::0;;;;;;;;;;:::o;31524:755::-;31691:21;31667:8;16383:15;16371:8;:27;;16363:55;;;;-1:-1:-1;;;16363:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31778:4:0::1;31738:45;:6:::0;;31745:17:::1;31761:1;31738:6:::0;31745:17:::1;:::i;:::-;31738:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;31738:45:0::1;;31730:78;;;;-1:-1:-1::0;;;31730:78:0::1;;;;;;;:::i;:::-;31829:31;31843:8;31853:6;;31829:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;:13;:31::i;:::-;31819:41;;31910:12;31879:7;31904:1;31887:7;:14;:18;;;;:::i;:::-;31879:27;;;;;;;;:::i;:::-;;;;;;;:43;;31871:90;;;;-1:-1:-1::0;;;31871:90:0::1;;;;;;;:::i;:::-;31972:138;32004:6;;32011:1;32004:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;32004:14:0::1;:::i;:::-;32020:10;32032:55;32040:6;;32047:1;32040:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;32040:14:0::1;:::i;:::-;32056:6;;32063:1;32056:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;32070:6;;32077:1;32070:9;;;;;;;:::i;:::-;;;;;;:16;;;;;;;;;;:::i;32032:55::-;32089:7;32097:1;32089:10;;;;;;;;:::i;31972:138::-;32121:37;32127:7;32136:6;;32121:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;32152:4;32121:5;:37::i;:::-;32169:4;-1:-1:-1::0;;;;;32169:13:0::1;;32183:7;32208:1;32191:7;:14;:18;;;;:::i;:::-;32183:27;;;;;;;;:::i;:::-;;;;;;;32169:42;;;;;;;;;;;;;18165:25:1::0;;18153:2;18138:18;;18019:177;32169:42:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32222:49;32239:2;32243:7;32268:1;32251:7;:14;:18;;;;:::i;:::-;32243:27;;;;;;;;:::i;:::-;;;;;;;32222:16;:49::i;:::-;31524:755:::0;;;;;;;;;:::o;21898:752::-;22055:12;22069;22146:13;22175:7;-1:-1:-1;;;;;22162:29:0;;22192:6;22200;22208;22162:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22146:69;-1:-1:-1;;;;;;22232:19:0;;22228:64;;22276:1;22278;22268:12;;;;;;;22228:64;22305:13;22320;22337:35;22349:6;22357;22365;22337:11;:35::i;:::-;22304:68;;;;22383:17;22410:5;-1:-1:-1;;;;;22403:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22383:47;-1:-1:-1;22383:47:0;22453:20;22465:8;22453:9;:20;:::i;:::-;:35;;;;:::i;:::-;22443:45;-1:-1:-1;22580:12:0;22557:20;22569:8;22557:9;:20;:::i;:::-;:35;;;;:::i;:::-;22547:45;;22083:567;;;;21898:752;;;;;;;;:::o;28062:670::-;28356:16;28374:14;28401:12;28416:37;28424:5;28439:4;28446:6;28416:7;:37::i;:::-;28401:52;;28464:10;28477;:39;;28507:9;28477:39;;;-1:-1:-1;;28477:39:0;28527:71;;-1:-1:-1;;;28527:71:0;;28464:52;;-1:-1:-1;;;;;;28527:18:0;;;;;:71;;28546:10;;28566:4;;28464:52;;28580:8;;28590:1;;28593;;28596;;28527:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28636:88;28655:5;28662:6;28670:9;28681:14;28697:12;28711:2;28715:8;28636:18;:88::i;:::-;28609:115;;;;;;;;28390:342;;28062:670;;;;;;;;;;;;;;:::o;17192:415::-;17275:12;17301:14;17317;17335:26;17346:6;17354;17335:10;:26::i;:::-;17498:40;;-1:-1:-1;;24491:2:1;24487:15;;;24483:24;;17498:40:0;;;24471:37:1;24542:15;;;24538:24;24524:12;;;24517:46;24609:14;;24602:22;24597:3;24593:32;24579:12;;;24572:54;17300:61:0;;-1:-1:-1;17300:61:0;-1:-1:-1;17466:7:0;;24642:12:1;;17498:40:0;;;;;;;;;;;;17488:51;;;;;;17554:12;17413:182;;;;;;;;;-1:-1:-1;;;;;;24951:26:1;;25014:2;25010:15;;;;-1:-1:-1;;25006:53:1;25002:1;24993:11;;24986:74;25085:2;25076:12;;25069:28;;;;25122:2;25113:12;;25106:28;25159:2;25150:12;;24665:503;17413:182:0;;;;-1:-1:-1;;17413:182:0;;;;;;;;;17403:193;;17413:182;17403:193;;;;;17192:415;-1:-1:-1;;;;;;17192:415:0:o;16773:327::-;16846:14;16862;16907:6;-1:-1:-1;;;;;16897:16:0;:6;-1:-1:-1;;;;;16897:16:0;;16889:56;;;;-1:-1:-1;;;16889:56:0;;25375:2:1;16889:56:0;;;25357:21:1;25414:2;25394:18;;;25387:30;25453:29;25433:18;;;25426:57;25500:18;;16889:56:0;25173:351:1;16889:56:0;16984:6;-1:-1:-1;;;;;16975:15:0;:6;-1:-1:-1;;;;;16975:15:0;;:53;;17013:6;17021;16975:53;;;16994:6;17002;16975:53;16956:72;;-1:-1:-1;16956:72:0;-1:-1:-1;;;;;;17047:20:0;;17039:53;;;;-1:-1:-1;;;17039:53:0;;25731:2:1;17039:53:0;;;25713:21:1;25770:2;25750:18;;;25743:30;-1:-1:-1;;;25789:18:1;;;25782:50;25849:18;;17039:53:0;25529:344:1;17039:53:0;16773:327;;;;;:::o;24160:696::-;24453:12;24467;24481:14;24434:8;16383:15;16371:8;:27;;16363:55;;;;-1:-1:-1;;;16363:55:0;;;;;;;:::i;:::-;24529:93:::1;24543:6;24551;24559;24567:14;24583;24599:10;24611;24529:13;:93::i;:::-;24508:114:::0;;-1:-1:-1;24508:114:0;-1:-1:-1;24633:12:0::1;24648:31;24656:6:::0;24664;24672;24648:7:::1;:31::i;:::-;24633:46;;24690:52;24708:6;24716:10;24728:4;24734:7;24690:17;:52::i;:::-;24753;24771:6;24779:10;24791:4;24797:7;24753:17;:52::i;:::-;24828:20;::::0;-1:-1:-1;;;24828:20:0;;-1:-1:-1;;;;;4646:32:1;;;24828:20:0::1;::::0;::::1;4628:51:1::0;24828:16:0;::::1;::::0;::::1;::::0;4601:18:1;;24828:20:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24816:32;;24497:359;24160:696:::0;;;;;;;;;;;;;;:::o;18542:662::-;18635:11;18648;18672:12;18687:32;18695:7;18704:8;18714:4;18687:7;:32::i;:::-;18792:34;;-1:-1:-1;;;18792:34:0;;-1:-1:-1;;;;;4646:32:1;;;18792:34:0;;;4628:51:1;4646:32;;-1:-1:-1;;;;;18805:7:0;18792:28;;;;;;4601:18:1;;18792:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18788:125;;;18858:43;;-1:-1:-1;;;18858:43:0;;;;;26052:25:1;;;-1:-1:-1;;;;;26113:32:1;;;26093:18;;;26086:60;18858:24:0;;;;;26025:18:1;;18858:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18843:58;;18788:125;18930:33;18938:7;18947:8;18957:5;18930:7;:33::i;:::-;18978:34;;-1:-1:-1;;;18978:34:0;;-1:-1:-1;;;;;4646:32:1;;;18978:34:0;;;4628:51:1;18923:40:0;;-1:-1:-1;18991:7:0;18978:28;;;;;;4601:18:1;;18978:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18974:127;;;19046:43;;-1:-1:-1;;;19046:43:0;;;;;26052:25:1;;;-1:-1:-1;;;;;26113:32:1;;;26093:18;;;26086:60;19046:24:0;;;;;26025:18:1;;19046:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19029:60;;18974:127;19133:14;19118:12;:29;:78;;19174:14;19190:5;19118:78;;;19151:12;19165:4;19118:78;19111:85;;;;;;;18542:662;;;;;;:::o;18085:375::-;18172:13;18187;18214:14;18233:26;18244:6;18252;18233:10;:26::i;:::-;18213:46;;;18271:13;18286;18310:31;18318:6;18326;18334;18310:7;:31::i;:::-;-1:-1:-1;;;;;18304:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18270:86;;;;;18400:6;-1:-1:-1;;;;;18390:16:0;:6;-1:-1:-1;;;;;18390:16:0;;:62;;18433:8;18443;18390:62;;;18410:8;18420;18390:62;18367:85;;;;-1:-1:-1;18085:375:0;-1:-1:-1;;;;;;;18085:375:0:o;30904:612::-;31069:21;31045:8;16383:15;16371:8;:27;;16363:55;;;;-1:-1:-1;;;16363:55:0;;;;;;;:::i;:::-;31142:4:::1;-1:-1:-1::0;;;;;31116:31:0::1;:6;;31123:1;31116:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;31116:14:0::1;:::i;:::-;-1:-1:-1::0;;;;;31116:31:0::1;;31108:64;;;;-1:-1:-1::0;;;31108:64:0::1;;;;;;;:::i;:::-;31193:32;31207:9;31218:6;;31193:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;31183:42;;31275:12;31244:7;31269:1;31252:7;:14;:18;;;;:::i;:::-;31244:27;;;;;;;;:::i;:::-;;;;;;;:43;;31236:90;;;;-1:-1:-1::0;;;31236:90:0::1;;;;;;;:::i;:::-;31337:4;-1:-1:-1::0;;;;;31337:12:0::1;;31357:7;31365:1;31357:10;;;;;;;;:::i;:::-;;;;;;;31337:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;31388:4;-1:-1:-1::0;;;;;31388:13:0::1;;31402:55;31410:6;;31417:1;31410:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;31410:14:0::1;:::i;:::-;31426:6;;31433:1;31426:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;31440:6;;31447:1;31440:9;;;;;;;:::i;31402:55::-;31459:7;31467:1;31459:10;;;;;;;;:::i;:::-;;;;;;;31388:82;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;26660:32:1;;;;26642:51;;26724:2;26709:18;;26702:34;26630:2;26615:18;;26468:274;31388:82:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31381:90;;;;:::i;:::-;31482:26;31488:7;31497:6;;31482:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;31505:2;31482:5;:26::i;:::-;30904:612:::0;;;;;;;;:::o;32287:404::-;32481:13;32462:8;16383:15;16371:8;:27;;16363:55;;;;-1:-1:-1;;;16363:55:0;;;;;;;:::i;:::-;32507:114:::1;32525:6;;32532:1;32525:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;32525:14:0::1;:::i;:::-;32541:10;32553:55;32561:6;;32568:1;32561:9;;;;;;;:::i;32553:55::-;32610:7;32618:1;32610:10;;;;;;;;:::i;32507:114::-;32632:26;32638:7;32647:6;;32632:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;-1:-1:-1::0;32676:7:0;;32287:404;-1:-1:-1;;;;;32287:404:0:o;19714:559::-;19796:21;19855:1;19838:6;:13;:18;;19830:51;;;;-1:-1:-1;;;19830:51:0;;;;;;;:::i;:::-;19913:13;;:15;;19927:1;19913:15;:::i;:::-;19902:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19902:27:0;;19892:37;;19953:8;19940:7;19948:1;19940:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;19977:6;19972:294;19993:6;:13;19989:1;:17;19972:294;;;20028:12;20043:55;20051:6;20058:1;20051:9;;;;;;;;:::i;:::-;;;;;;;:14;;;20067:6;20074:1;20067:9;;;;;;;;:::i;:::-;;;;;;;:12;;;20081:6;20088:1;20081:9;;;;;;;;:::i;20043:55::-;20117:34;;-1:-1:-1;;;20117:34:0;;-1:-1:-1;;;;;4646:32:1;;;20117:34:0;;;4628:51:1;20028:70:0;;-1:-1:-1;20130:7:0;20117:28;;;;;;4601:18:1;;20117:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20113:142;;;20193:4;-1:-1:-1;;;;;20187:24:0;;20212:7;20220:1;20212:10;;;;;;;;:::i;:::-;;;;;;;20224:6;20231:1;20224:9;;;;;;;;:::i;:::-;;;;;;;:14;;;20187:52;;;;;;;;;;;;;;;26052:25:1;;;-1:-1:-1;;;;;26113:32:1;26108:2;26093:18;;26086:60;26040:2;26025:18;;25878:274;20187:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20172:7;20180:3;:1;20182;20180:3;:::i;:::-;20172:12;;;;;;;;:::i;:::-;;;;;;:67;;;;;20113:142;-1:-1:-1;20008:3:0;;;;:::i;:::-;;;;19972:294;;;;19714:559;;;;:::o;20408:1482::-;20597:12;20611;20625:14;20704:13;20733:7;-1:-1:-1;;;;;20720:29:0;;20750:6;20758;20766;20720:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20704:69;-1:-1:-1;20785:13:0;;;-1:-1:-1;;;;;20869:19:0;;;20865:167;;20927:5;-1:-1:-1;;;;;20920:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20905:42;;20985:35;20997:6;21005;21013;20985:11;:35::i;:::-;20962:58;;-1:-1:-1;20962:58:0;-1:-1:-1;20865:167:0;21046:13;;:30;;;;-1:-1:-1;21063:13:0;;21046:30;21042:841;;;21115:14;;-1:-1:-1;21131:14:0;;-1:-1:-1;16270:5:0;21173:28;21183:17;21131:14;21115;21183:17;:::i;:::-;21173:9;:28::i;:::-;:48;;;;:::i;:::-;21161:60;;21042:841;;;21256:19;21278:50;21293:14;21309:8;21319;21278:14;:50::i;:::-;21256:72;;21365:14;21347;:32;21343:529;;21422:14;;-1:-1:-1;21438:14:0;-1:-1:-1;21438:14:0;21484:78;21518:8;21493:22;21503:12;21422:14;21493:22;:::i;:::-;:33;;;;:::i;:::-;21553:8;21528:22;21538:12;21528:7;:22;:::i;:::-;:33;;;;:::i;:::-;21484:8;:78::i;:::-;21472:90;;21343:529;;;21603:19;21625:50;21640:14;21656:8;21666;21625:14;:50::i;:::-;21603:72;-1:-1:-1;21732:14:0;;-1:-1:-1;21603:72:0;;-1:-1:-1;21778:78:0;21812:8;21787:22;21797:12;21603:72;21787:22;:::i;:::-;:33;;;;:::i;:::-;21847:8;21822:22;21832:12;21822:7;:22;:::i;21778:78::-;21766:90;;21584:288;21343:529;21239:644;21042:841;20641:1249;;;;20408:1482;;;;;;;;;:::o;27353:701::-;27664:12;27678;27703;27718:31;27726:6;27734;27742;27718:7;:31::i;:::-;27703:46;;27775:10;27788;:39;;27818:9;27788:39;;;-1:-1:-1;;27788:39:0;27842:71;;-1:-1:-1;;;27842:71:0;;27775:52;;-1:-1:-1;;;;;;27842:18:0;;;;;:71;;27861:10;;27881:4;;27775:52;;27895:8;;27905:1;;27908;;27911;;27842:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27760:165;27958:88;27974:6;27982;27990;27998:9;28009:10;28021;28033:2;28037:8;27958:15;:88::i;:::-;27937:109;;;;;;;;27692:362;27353:701;;;;;;;;;;;;;;;:::o;24864:949::-;25122:16;25140:14;25156;25103:8;16383:15;16371:8;:27;;16363:55;;;;-1:-1:-1;;;16363:55:0;;;;;;;:::i;:::-;25210:206:::1;25238:5;25266:4;25286:6;25307:18;25340:9;25364:14;25393:12;25210:13;:206::i;:::-;25183:233:::0;;-1:-1:-1;25183:233:0;-1:-1:-1;25427:12:0::1;25442:37;25450:5:::0;25465:4:::1;25472:6:::0;25442:7:::1;:37::i;:::-;25427:52;;25490:55;25508:5;25515:10;25527:4;25533:11;25490:17;:55::i;:::-;25556:4;-1:-1:-1::0;;;;;25556:12:0::1;;25576:9;25556:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25606:30:0::1;::::0;-1:-1:-1;;;25606:30:0;;-1:-1:-1;;;;;26660:32:1;;;25606:30:0::1;::::0;::::1;26642:51:1::0;26709:18;;;26702:34;;;25606:4:0::1;:13;::::0;-1:-1:-1;25606:13:0::1;::::0;-1:-1:-1;26615:18:1;;;-1:-1:-1;25606:30:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25599:38;;;;:::i;:::-;25660:20;::::0;-1:-1:-1;;;25660:20:0;;-1:-1:-1;;;;;4646:32:1;;;25660:20:0::1;::::0;::::1;4628:51:1::0;25660:16:0;::::1;::::0;::::1;::::0;4601:18:1;;25660:20:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25648:32;;25743:9;25731;:21;25727:78;;;25754:51;25771:10;25783:21;25795:9:::0;25783::::1;:21;:::i;:::-;25754:16;:51::i;:::-;25172:641;24864:949:::0;;;;;;;;;;;;:::o;26672:673::-;26914:16;26932:14;26895:8;16383:15;16371:8;:27;;16363:55;;;;-1:-1:-1;;;16363:55:0;;;;;;;:::i;:::-;26986:226:::1;27016:5;27044:4;27064:6;27085:9;27109:14;27138:12;27173:4;27193:8;26986:15;:226::i;:::-;26959:253:::0;;-1:-1:-1;26959:253:0;-1:-1:-1;27223:37:0::1;27237:5:::0;27244:2;26959:253;27223:13:::1;:37::i;:::-;27271:24;::::0;-1:-1:-1;;;27271:24:0;;::::1;::::0;::::1;18165:25:1::0;;;27271:4:0::1;-1:-1:-1::0;;;;;27271:13:0::1;::::0;::::1;::::0;18138:18:1;;27271:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27306:31;27323:2;27327:9;27306:16;:31::i;:::-;26672:673:::0;;;;;;;;;;;:::o;19316:316::-;19422:11;19446:12;19461:34;19469:7;19478:8;19488:6;19461:7;:34::i;:::-;19510;;-1:-1:-1;;;19510:34:0;;-1:-1:-1;;;;;4646:32:1;;;19510:34:0;;;4628:51:1;19446:49:0;;-1:-1:-1;19523:7:0;19510:28;;;;;;4601:18:1;;19510:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19506:119;;;19570:43;;-1:-1:-1;;;19570:43:0;;;;;26052:25:1;;;-1:-1:-1;;;;;26113:32:1;;;26093:18;;;26086:60;19570:24:0;;;;;26025:18:1;;19570:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19561:52;;19506:119;19435:197;19316:316;;;;;;:::o;20281:119::-;20358:34;;-1:-1:-1;;;20358:34:0;;-1:-1:-1;;;;;4646:32:1;;;20358:34:0;;;4628:51:1;20334:4:0;;20371:7;20358:28;;;;;;4601:18:1;;20358:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20351:41;20281:119;-1:-1:-1;;20281:119:0:o;30319:577::-;30526:21;30507:8;16383:15;16371:8;:27;;16363:55;;;;-1:-1:-1;;;16363:55:0;;;;;;;:::i;:::-;30570:31:::1;30584:8;30594:6;;30570:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;30560:41;;30651:12;30620:7;30645:1;30628:7;:14;:18;;;;:::i;:::-;30620:27;;;;;;;;:::i;:::-;;;;;;;:43;;30612:90;;;;-1:-1:-1::0;;;30612:90:0::1;;;;;;;:::i;:::-;30713:138;30745:6;;30752:1;30745:9;;;;;;;:::i;30713:138::-;30862:26;30868:7;30877:6;;30862:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;33238:355:::0;33369:1;33349:5;-1:-1:-1;;;;;33349:17:0;;:21;33341:30;;;;;;33438:69;;;-1:-1:-1;;;;;19247:15:1;;;33438:69:0;;;19229:34:1;19299:15;;;19279:18;;;19272:43;19331:18;;;;19324:34;;;33438:69:0;;;;;;;;;;19164:18:1;;;;33438:69:0;;;;;;;-1:-1:-1;;;;;33438:69:0;-1:-1:-1;;;33438:69:0;;;33427:81;;-1:-1:-1;;;;33427:10:0;;;;:81;;33438:69;33427:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33382:126;;;;33527:7;:57;;;;-1:-1:-1;33539:11:0;;:16;;:44;;;33570:4;33559:24;;;;;;;;;;;;:::i;:::-;33519:66;;;;;;33330:263;;33238:355;;;;:::o;28843:680::-;28950:6;28945:571;28966:6;:13;28962:1;:17;28945:571;;;29002:14;29021:40;29032:6;29039:1;29032:9;;;;;;;;:::i;:::-;;;;;;;:14;;;29048:6;29055:1;29048:9;;;;;;;;:::i;:::-;;;;;;;:12;;;29021:10;:40::i;:::-;-1:-1:-1;29001:60:0;-1:-1:-1;29076:14:0;29093:7;29101:5;:1;29105;29101:5;:::i;:::-;29093:14;;;;;;;;:::i;:::-;;;;;;;29076:31;;29123:15;29140;29177:6;-1:-1:-1;;;;;29159:24:0;:6;29166:1;29159:9;;;;;;;;:::i;:::-;;;;;;;:14;;;-1:-1:-1;;;;;29159:24:0;;:70;;29210:9;29226:1;29159:70;;;29192:1;29196:9;29159:70;29122:107;;;;29244:10;29277:1;29261:6;:13;:17;;;;:::i;:::-;29257:1;:21;:91;;29345:3;29257:91;;;29281:61;29289:6;29296:3;:1;29298;29296:3;:::i;:::-;29289:11;;;;;;;;:::i;:::-;;;;;;;:16;;;29307:6;29314:1;29316;29314:3;;;;:::i;:::-;29307:11;;;;;;;;:::i;:::-;;;;;;;:14;;;29323:6;29330:1;29332;29330:3;;;;:::i;:::-;29323:11;;;;;;;;:::i;29281:61::-;29244:104;;29369:55;29377:6;29384:1;29377:9;;;;;;;;:::i;:::-;;;;;;;:14;;;29393:6;29400:1;29393:9;;;;;;;;:::i;:::-;;;;;;;:12;;;29407:6;29414:1;29407:9;;;;;;;;:::i;29369:55::-;-1:-1:-1;;;;;29363:67:0;;29449:10;29461;29473:2;29487:1;29477:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29477:12:0;;29363:141;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28986:530;;;;;28981:3;;;;;:::i;:::-;;;;28945:571;;;;28843:680;;;:::o;32699:196::-;32808:12;;;32770;32808;;;;;;;;;-1:-1:-1;;;;;32787:7:0;;;32801:5;;32787:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32769:52;;;32840:7;32832:55;;;;-1:-1:-1;;;32832:55:0;;28393:2:1;32832:55:0;;;28375:21:1;28432:2;28412:18;;;28405:30;28471:34;28451:18;;;28444:62;-1:-1:-1;;;28522:18:1;;;28515:33;28565:19;;32832:55:0;28191:399:1;32832:55:0;32758:137;32699:196;;:::o;22658:1494::-;22890:12;22904;22955:10;22937:14;:28;;22929:37;;;;;;23003:10;22985:14;:28;;22977:37;;;;;;23093:53;;-1:-1:-1;;;23093:53:0;;23077:13;;-1:-1:-1;;;;;23106:7:0;23093:29;;;;:53;;23123:6;;23131;;23139;;23093:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23077:69;-1:-1:-1;;;;;;23161:19:0;;23157:116;;23205:56;;-1:-1:-1;;;23205:56:0;;-1:-1:-1;;;;;23218:7:0;23205:32;;;;:56;;23238:6;;23246;;23254;;23205:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23197:64;;23157:116;23284:13;23299;23316:35;23328:6;23336;23344;23316:11;:35::i;:::-;23283:68;;;;23366:8;23378:1;23366:13;:30;;;;-1:-1:-1;23383:13:0;;23366:30;23362:783;;;23435:14;;-1:-1:-1;23451:14:0;;-1:-1:-1;23362:783:0;;;23499:19;23521:50;23536:14;23552:8;23562;23521:14;:50::i;:::-;23499:72;;23608:14;23590;:32;23586:548;;23669:10;23651:14;:28;;23643:70;;;;-1:-1:-1;;;23643:70:0;;20429:2:1;23643:70:0;;;20411:21:1;20468:2;20448:18;;;20441:30;20507:31;20487:18;;;20480:59;20556:18;;23643:70:0;20227:353:1;23643:70:0;23754:14;;-1:-1:-1;23770:14:0;-1:-1:-1;23770:14:0;23586:548;;;23826:19;23848:50;23863:14;23879:8;23889;23848:14;:50::i;:::-;23826:72;;23942:14;23924;:32;;23917:40;;;;:::i;:::-;24002:10;23984:14;:28;;23976:70;;;;-1:-1:-1;;;23976:70:0;;20071:2:1;23976:70:0;;;20053:21:1;20110:2;20090:18;;;20083:30;20149:31;20129:18;;;20122:59;20198:18;;23976:70:0;19869:353:1;23976:70:0;24087:14;-1:-1:-1;24103:14:0;;-1:-1:-1;23586:548:0;23484:661;23362:783;22918:1234;;;22658:1494;;;;;;;;;;:::o;6439:1673::-;6487:7;6511:1;6516;6511:6;6507:47;;-1:-1:-1;6541:1:0;;6439:1673;-1:-1:-1;6439:1673:0:o;6507:47::-;7245:14;7279:1;7268:7;7273:1;7268:4;:7::i;:::-;:12;;7262:1;:19;;7245:36;;7747:1;7736:6;7732:1;:10;;;;;:::i;:::-;;7723:6;:19;7722:26;;7713:35;;7797:1;7786:6;7782:1;:10;;;;;:::i;:::-;;7773:6;:19;7772:26;;7763:35;;7847:1;7836:6;7832:1;:10;;;;;:::i;:::-;;7823:6;:19;7822:26;;7813:35;;7897:1;7886:6;7882:1;:10;;;;;:::i;:::-;;7873:6;:19;7872:26;;7863:35;;7947:1;7936:6;7932:1;:10;;;;;:::i;:::-;;7923:6;:19;7922:26;;7913:35;;7997:1;7986:6;7982:1;:10;;;;;:::i;:::-;;7973:6;:19;7972:26;;7963:35;;8047:1;8036:6;8032:1;:10;;;;;:::i;:::-;;8023:6;:19;8022:26;;8013:35;;8070:23;8074:6;8086;8082:1;:10;;;;;:::i;:::-;;8070:3;:23::i;:::-;8063:30;6439:1673;-1:-1:-1;;;6439:1673:0:o;17720:307::-;17811:12;17854:1;17844:7;:11;17836:51;;;;-1:-1:-1;;;17836:51:0;;28797:2:1;17836:51:0;;;28779:21:1;28836:2;28816:18;;;28809:30;28875:29;28855:18;;;28848:57;28922:18;;17836:51:0;28595:351:1;17836:51:0;17917:1;17906:8;:12;:28;;;;;17933:1;17922:8;:12;17906:28;17898:71;;;;-1:-1:-1;;;17898:71:0;;29153:2:1;17898:71:0;;;29135:21:1;29192:2;29172:18;;;29165:30;29231:32;29211:18;;;29204:60;29281:18;;17898:71:0;28951:354:1;17898:71:0;18011:8;17990:18;18000:8;17990:7;:18;:::i;:::-;:29;;;;:::i;:::-;17980:39;17720:307;-1:-1:-1;;;;17720:307:0:o;615:106::-;673:7;704:1;700;:5;:13;;712:1;700:13;;;-1:-1:-1;708:1:0;;693:20;-1:-1:-1;615:106:0:o;32903:327::-;33016:1;32996:5;-1:-1:-1;;;;;32996:17:0;;:21;32988:30;;;;;;33085:59;;;-1:-1:-1;;;;;26660:32:1;;;33085:59:0;;;26642:51:1;26709:18;;;;26702:34;;;33085:59:0;;;;;;;;;;26615:18:1;;;;33085:59:0;;;;;;;-1:-1:-1;;;;;33085:59:0;-1:-1:-1;;;33085:59:0;;;33074:71;;-1:-1:-1;;;;33074:10:0;;;;:71;;33085:59;33074:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33029:116;;;;33164:7;:57;;;;-1:-1:-1;33176:11:0;;:16;;:44;;;33207:4;33196:24;;;;;;;;;;;;:::i;:::-;33156:66;;;;;;32977:253;;32903:327;;;:::o;8589:1019::-;8641:7;;8728:3;8719:12;;;:16;8715:102;;8766:3;8756:13;;;;8788;8715:102;8844:2;8835:11;;;:15;8831:99;;8881:2;8871:12;;;;8902;8831:99;8957:2;8948:11;;;:15;8944:99;;8994:2;8984:12;;;;9015;8944:99;9070:2;9061:11;;;:15;9057:99;;9107:2;9097:12;;;;9128;9057:99;9183:1;9174:10;;;:14;9170:96;;9219:1;9209:11;;;;9239;9170:96;9293:1;9284:10;;;:14;9280:96;;9329:1;9319:11;;;;9349;9280:96;9403:1;9394:10;;;:14;9390:96;;9439:1;9429:11;;;;9459;9390:96;9513:1;9504:10;;;:14;9500:66;;9549:1;9539:11;9594:6;8589:1019;-1:-1:-1;;8589:1019:0:o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:131;-1:-1:-1;;;;;221:31:1;;211:42;;201:70;;267:1;264;257:12;201:70;146:131;:::o;282:134::-;350:20;;379:31;350:20;379:31;:::i;:::-;282:134;;;:::o;421:118::-;507:5;500:13;493:21;486:5;483:32;473:60;;529:1;526;519:12;544:941;663:6;671;679;687;695;703;711;719;772:3;760:9;751:7;747:23;743:33;740:53;;;789:1;786;779:12;740:53;828:9;815:23;847:31;872:5;847:31;:::i;:::-;897:5;-1:-1:-1;954:2:1;939:18;;926:32;967:33;926:32;967:33;:::i;:::-;1019:7;-1:-1:-1;1078:2:1;1063:18;;1050:32;1091:30;1050:32;1091:30;:::i;:::-;1140:7;-1:-1:-1;1194:2:1;1179:18;;1166:32;;-1:-1:-1;1245:3:1;1230:19;;1217:33;;-1:-1:-1;1297:3:1;1282:19;;1269:33;;-1:-1:-1;1354:3:1;1339:19;;1326:33;1368;1326;1368;:::i;:::-;1420:7;1410:17;;;1474:3;1463:9;1459:19;1446:33;1436:43;;544:941;;;;;;;;;;;:::o;1743:872::-;1853:6;1861;1869;1877;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;2007:9;1994:23;1984:33;;2064:2;2053:9;2049:18;2036:32;2026:42;;2118:2;2107:9;2103:18;2090:32;2131:31;2156:5;2131:31;:::i;:::-;2181:5;-1:-1:-1;2238:2:1;2223:18;;2210:32;2251:33;2210:32;2251:33;:::i;:::-;2303:7;-1:-1:-1;2362:3:1;2347:19;;2334:33;2376:30;2334:33;2376:30;:::i;:::-;2425:7;-1:-1:-1;2484:3:1;2469:19;;2456:33;2498;2456;2498;:::i;:::-;2550:7;2540:17;;;2604:3;2593:9;2589:19;2576:33;2566:43;;1743:872;;;;;;;;;;:::o;2620:632::-;2791:2;2843:21;;;2913:13;;2816:18;;;2935:22;;;2762:4;;2791:2;3014:15;;;;2988:2;2973:18;;;2762:4;3057:169;3071:6;3068:1;3065:13;3057:169;;;3132:13;;3120:26;;3201:15;;;;3166:12;;;;3093:1;3086:9;3057:169;;;-1:-1:-1;3243:3:1;;2620:632;-1:-1:-1;;;;;;2620:632:1:o;3257:384::-;3334:8;3344:6;3398:3;3391:4;3383:6;3379:17;3375:27;3365:55;;3416:1;3413;3406:12;3365:55;-1:-1:-1;3439:20:1;;3482:18;3471:30;;3468:50;;;3514:1;3511;3504:12;3468:50;3551:4;3543:6;3539:17;3527:29;;3614:3;3607:4;3599;3591:6;3587:17;3579:6;3575:30;3571:41;3568:50;3565:70;;;3631:1;3628;3621:12;3646:817;3793:6;3801;3809;3817;3825;3833;3886:3;3874:9;3865:7;3861:23;3857:33;3854:53;;;3903:1;3900;3893:12;3854:53;3939:9;3926:23;3916:33;;3996:2;3985:9;3981:18;3968:32;3958:42;;4051:2;4040:9;4036:18;4023:32;4078:18;4070:6;4067:30;4064:50;;;4110:1;4107;4100:12;4064:50;4149:84;4225:7;4216:6;4205:9;4201:22;4149:84;:::i;:::-;4252:8;;-1:-1:-1;4123:110:1;-1:-1:-1;;4337:2:1;4322:18;;4309:32;4350:31;4309:32;4350:31;:::i;:::-;4400:5;4390:15;;;4452:3;4441:9;4437:19;4424:33;4414:43;;3646:817;;;;;;;;:::o;4690:592::-;4773:6;4781;4789;4797;4850:3;4838:9;4829:7;4825:23;4821:33;4818:53;;;4867:1;4864;4857:12;4818:53;4906:9;4893:23;4925:31;4950:5;4925:31;:::i;:::-;4975:5;-1:-1:-1;5032:2:1;5017:18;;5004:32;5045:33;5004:32;5045:33;:::i;:::-;5097:7;-1:-1:-1;5156:2:1;5141:18;;5128:32;5169:30;5128:32;5169:30;:::i;:::-;4690:592;;;;-1:-1:-1;5218:7:1;;5272:2;5257:18;5244:32;;-1:-1:-1;;4690:592:1:o;5287:156::-;5353:20;;5413:4;5402:16;;5392:27;;5382:55;;5433:1;5430;5423:12;5448:1146;5589:6;5597;5605;5613;5621;5629;5637;5645;5653;5661;5669:7;5723:3;5711:9;5702:7;5698:23;5694:33;5691:53;;;5740:1;5737;5730:12;5691:53;5779:9;5766:23;5798:31;5823:5;5798:31;:::i;:::-;5848:5;-1:-1:-1;5905:2:1;5890:18;;5877:32;5918:30;5877:32;5918:30;:::i;:::-;5967:7;-1:-1:-1;6021:2:1;6006:18;;5993:32;;-1:-1:-1;6072:2:1;6057:18;;6044:32;;-1:-1:-1;6123:3:1;6108:19;;6095:33;;-1:-1:-1;6180:3:1;6165:19;;6152:33;6194;6152;6194;:::i;:::-;6246:7;-1:-1:-1;6300:3:1;6285:19;;6272:33;;-1:-1:-1;6357:3:1;6342:19;;6329:33;6371:30;6329:33;6371:30;:::i;:::-;6420:7;-1:-1:-1;6446:37:1;6478:3;6463:19;;6446:37;:::i;:::-;6436:47;;6530:3;6519:9;6515:19;6502:33;6492:43;;6583:3;6572:9;6568:19;6555:33;6544:44;;5448:1146;;;;;;;;;;;;;;:::o;6599:523::-;6673:6;6681;6689;6742:2;6730:9;6721:7;6717:23;6713:32;6710:52;;;6758:1;6755;6748:12;6710:52;6797:9;6784:23;6816:31;6841:5;6816:31;:::i;:::-;6866:5;-1:-1:-1;6923:2:1;6908:18;;6895:32;6936:33;6895:32;6936:33;:::i;:::-;6988:7;-1:-1:-1;7047:2:1;7032:18;;7019:32;7060:30;7019:32;7060:30;:::i;:::-;7109:7;7099:17;;;6599:523;;;;;:::o;7335:388::-;7403:6;7411;7464:2;7452:9;7443:7;7439:23;7435:32;7432:52;;;7480:1;7477;7470:12;7432:52;7519:9;7506:23;7538:31;7563:5;7538:31;:::i;:::-;7588:5;-1:-1:-1;7645:2:1;7630:18;;7617:32;7658:33;7617:32;7658:33;:::i;:::-;7710:7;7700:17;;;7335:388;;;;;:::o;8037:1010::-;8165:6;8173;8181;8189;8197;8205;8213;8221;8229;8282:3;8270:9;8261:7;8257:23;8253:33;8250:53;;;8299:1;8296;8289:12;8250:53;8338:9;8325:23;8357:31;8382:5;8357:31;:::i;:::-;8407:5;-1:-1:-1;8464:2:1;8449:18;;8436:32;8477:33;8436:32;8477:33;:::i;:::-;8529:7;-1:-1:-1;8588:2:1;8573:18;;8560:32;8601:30;8560:32;8601:30;:::i;:::-;8650:7;-1:-1:-1;8704:2:1;8689:18;;8676:32;;-1:-1:-1;8755:3:1;8740:19;;8727:33;;-1:-1:-1;8807:3:1;8792:19;;8779:33;;-1:-1:-1;8859:3:1;8844:19;;8831:33;;-1:-1:-1;8916:3:1;8901:19;;8888:33;8930;8888;8930;:::i;:::-;8982:7;8972:17;;;9036:3;9025:9;9021:19;9008:33;8998:43;;8037:1010;;;;;;;;;;;:::o;9376:456::-;9453:6;9461;9469;9522:2;9510:9;9501:7;9497:23;9493:32;9490:52;;;9538:1;9535;9528:12;9490:52;9574:9;9561:23;9551:33;;9634:2;9623:9;9619:18;9606:32;9647:31;9672:5;9647:31;:::i;:::-;9697:5;-1:-1:-1;9754:2:1;9739:18;;9726:32;9767:33;9726:32;9767:33;:::i;10100:748::-;10238:6;10246;10254;10262;10270;10323:3;10311:9;10302:7;10298:23;10294:33;10291:53;;;10340:1;10337;10330:12;10291:53;10376:9;10363:23;10353:33;;10437:2;10426:9;10422:18;10409:32;10464:18;10456:6;10453:30;10450:50;;;10496:1;10493;10486:12;10450:50;10535:84;10611:7;10602:6;10591:9;10587:22;10535:84;:::i;:::-;10638:8;;-1:-1:-1;10509:110:1;-1:-1:-1;;10723:2:1;10708:18;;10695:32;10736:31;10695:32;10736:31;:::i;:::-;10100:748;;;;-1:-1:-1;10100:748:1;;10838:2;10823:18;10810:32;;10100:748;-1:-1:-1;;10100:748:1:o;10853:127::-;10914:10;10909:3;10905:20;10902:1;10895:31;10945:4;10942:1;10935:15;10969:4;10966:1;10959:15;10985:275;11056:2;11050:9;11121:2;11102:13;;-1:-1:-1;;11098:27:1;11086:40;;11156:18;11141:34;;11177:22;;;11138:62;11135:88;;;11203:18;;:::i;:::-;11239:2;11232:22;10985:275;;-1:-1:-1;10985:275:1:o;11265:183::-;11325:4;11358:18;11350:6;11347:30;11344:56;;;11380:18;;:::i;:::-;-1:-1:-1;11425:1:1;11421:14;11437:4;11417:25;;11265:183::o;11453:1411::-;11616:6;11624;11632;11640;11648;11701:3;11689:9;11680:7;11676:23;11672:33;11669:53;;;11718:1;11715;11708:12;11669:53;11758:9;11745:23;11787:18;11828:2;11820:6;11817:14;11814:34;;;11844:1;11841;11834:12;11814:34;11882:6;11871:9;11867:22;11857:32;;11927:7;11920:4;11916:2;11912:13;11908:27;11898:55;;11949:1;11946;11939:12;11898:55;11985:2;11972:16;12007:4;12031:60;12047:43;12087:2;12047:43;:::i;:::-;12031:60;:::i;:::-;12125:15;;;12207:1;12203:10;;;;12195:19;;12191:28;;;12156:12;;;;12231:19;;;12228:39;;;12263:1;12260;12253:12;12228:39;12287:11;;;;12307:142;12323:6;12318:3;12315:15;12307:142;;;12389:17;;12377:30;;12340:12;;;;12427;;;;12307:142;;;12468:5;-1:-1:-1;;12511:18:1;;12498:32;;-1:-1:-1;;12542:16:1;;;12539:36;;;12571:1;12568;12561:12;12539:36;;12610:86;12688:7;12677:8;12666:9;12662:24;12610:86;:::i;:::-;12715:8;;-1:-1:-1;12584:112:1;-1:-1:-1;12769:38:1;;-1:-1:-1;12803:2:1;12788:18;;12769:38;:::i;12869:752::-;12921:5;12969:4;12957:9;12952:3;12948:19;12944:30;12941:50;;;12987:1;12984;12977:12;12941:50;13020:2;13014:9;13062:4;13054:6;13050:17;13133:6;13121:10;13118:22;13097:18;13085:10;13082:34;13079:62;13076:88;;;13144:18;;:::i;:::-;13180:2;13173:22;13213:6;-1:-1:-1;13213:6:1;13243:23;;13275:33;13243:23;13275:33;:::i;:::-;13317:23;;13392:2;13377:18;;13364:32;13405:33;13364:32;13405:33;:::i;:::-;13466:2;13454:15;;13447:32;13531:2;13516:18;;13503:32;13544:30;13503:32;13544:30;:::i;:::-;13602:2;13590:15;;;;13583:32;12869:752;;-1:-1:-1;;12869:752:1:o;13626:1026::-;13742:6;13750;13803:2;13791:9;13782:7;13778:23;13774:32;13771:52;;;13819:1;13816;13809:12;13771:52;13855:9;13842:23;13832:33;;13884:2;13937;13926:9;13922:18;13909:32;13964:18;13956:6;13953:30;13950:50;;;13996:1;13993;13986:12;13950:50;14019:22;;14072:4;14064:13;;14060:27;-1:-1:-1;14050:55:1;;14101:1;14098;14091:12;14050:55;14137:2;14124:16;14160:60;14176:43;14216:2;14176:43;:::i;14160:60::-;14254:15;;;14316:4;14355:11;;;14347:20;;14343:29;;;14285:12;;;;14242:3;14384:19;;;14381:39;;;14416:1;14413;14406:12;14381:39;14440:11;;;;14460:162;14476:6;14471:3;14468:15;14460:162;;;14542:37;14571:7;14566:3;14542:37;:::i;:::-;14530:50;;14493:12;;;;14600;;;;14460:162;;;14464:3;14641:5;14631:15;;;;;;;13626:1026;;;;;:::o;14657:661::-;14749:6;14757;14765;14773;14781;14834:3;14822:9;14813:7;14809:23;14805:33;14802:53;;;14851:1;14848;14841:12;14802:53;14890:9;14877:23;14909:31;14934:5;14909:31;:::i;:::-;14959:5;-1:-1:-1;15016:2:1;15001:18;;14988:32;15029:33;14988:32;15029:33;:::i;:::-;15081:7;-1:-1:-1;15140:2:1;15125:18;;15112:32;15153:30;15112:32;15153:30;:::i;:::-;14657:661;;;;-1:-1:-1;15202:7:1;;15256:2;15241:18;;15228:32;;-1:-1:-1;15307:3:1;15292:19;15279:33;;14657:661;-1:-1:-1;;14657:661:1:o;15323:1290::-;15473:6;15481;15489;15497;15505;15513;15521;15529;15537;15545;15553:7;15562;15616:3;15604:9;15595:7;15591:23;15587:33;15584:53;;;15633:1;15630;15623:12;15584:53;15672:9;15659:23;15691:31;15716:5;15691:31;:::i;:::-;15741:5;-1:-1:-1;15798:2:1;15783:18;;15770:32;15811:33;15770:32;15811:33;:::i;:::-;15863:7;-1:-1:-1;15922:2:1;15907:18;;15894:32;15935:30;15894:32;15935:30;:::i;:::-;15984:7;-1:-1:-1;16038:2:1;16023:18;;16010:32;;-1:-1:-1;16089:3:1;16074:19;;16061:33;;-1:-1:-1;16141:3:1;16126:19;;16113:33;;-1:-1:-1;16198:3:1;16183:19;;16170:33;16212;16170;16212;:::i;:::-;16264:7;-1:-1:-1;16318:3:1;16303:19;;16290:33;;-1:-1:-1;16375:3:1;16360:19;;16347:33;16389:30;16347:33;16389:30;:::i;:::-;16438:7;-1:-1:-1;16464:37:1;16496:3;16481:19;;16464:37;:::i;:::-;16454:47;;16549:3;16538:9;16534:19;16521:33;16510:44;;16602:3;16591:9;16587:19;16574:33;16563:44;;15323:1290;;;;;;;;;;;;;;:::o;16618:799::-;16728:6;16736;16744;16752;16760;16768;16776;16829:3;16817:9;16808:7;16804:23;16800:33;16797:53;;;16846:1;16843;16836:12;16797:53;16885:9;16872:23;16904:31;16929:5;16904:31;:::i;:::-;16954:5;-1:-1:-1;17011:2:1;16996:18;;16983:32;17024:30;16983:32;17024:30;:::i;:::-;17073:7;-1:-1:-1;17127:2:1;17112:18;;17099:32;;-1:-1:-1;17178:2:1;17163:18;;17150:32;;-1:-1:-1;17229:3:1;17214:19;;17201:33;;-1:-1:-1;17286:3:1;17271:19;;17258:33;17300;17258;17300;:::i;17422:592::-;17505:6;17513;17521;17529;17582:3;17570:9;17561:7;17557:23;17553:33;17550:53;;;17599:1;17596;17589:12;17550:53;17635:9;17622:23;17612:33;;17695:2;17684:9;17680:18;17667:32;17708:31;17733:5;17708:31;:::i;:::-;17758:5;-1:-1:-1;17815:2:1;17800:18;;17787:32;17828:33;17787:32;17828:33;:::i;:::-;17880:7;-1:-1:-1;17939:2:1;17924:18;;17911:32;17952:30;17911:32;17952:30;:::i;:::-;17422:592;;;;-1:-1:-1;17422:592:1;;-1:-1:-1;;17422:592:1:o;18201:247::-;18260:6;18313:2;18301:9;18292:7;18288:23;18284:32;18281:52;;;18329:1;18326;18319:12;18281:52;18368:9;18355:23;18387:31;18412:5;18387:31;:::i;18645:339::-;18847:2;18829:21;;;18886:2;18866:18;;;18859:30;-1:-1:-1;;;18920:2:1;18905:18;;18898:45;18975:2;18960:18;;18645:339::o;19369:245::-;19436:6;19489:2;19477:9;19468:7;19464:23;19460:32;19457:52;;;19505:1;19502;19495:12;19457:52;19537:9;19531:16;19556:28;19578:5;19556:28;:::i;19619:245::-;19698:6;19706;19759:2;19747:9;19738:7;19734:23;19730:32;19727:52;;;19775:1;19772;19765:12;19727:52;-1:-1:-1;;19798:16:1;;19854:2;19839:18;;;19833:25;19798:16;;19833:25;;-1:-1:-1;19619:245:1:o;20585:127::-;20646:10;20641:3;20637:20;20634:1;20627:31;20677:4;20674:1;20667:15;20701:4;20698:1;20691:15;20717:127;20778:10;20773:3;20769:20;20766:1;20759:31;20809:4;20806:1;20799:15;20833:4;20830:1;20823:15;20849:125;20889:4;20917:1;20914;20911:8;20908:34;;;20922:18;;:::i;:::-;-1:-1:-1;20959:9:1;;20849:125::o;20979:398::-;21181:2;21163:21;;;21220:2;21200:18;;;21193:30;21259:34;21254:2;21239:18;;21232:62;-1:-1:-1;;;21325:2:1;21310:18;;21303:32;21367:3;21352:19;;20979:398::o;21382:344::-;21584:2;21566:21;;;21623:2;21603:18;;;21596:30;-1:-1:-1;;;21657:2:1;21642:18;;21635:50;21717:2;21702:18;;21382:344::o;21731:223::-;21813:6;21866:2;21854:9;21845:7;21841:23;21837:32;21834:52;;;21882:1;21879;21872:12;21834:52;21905:43;21940:7;21929:9;21905:43;:::i;21959:241::-;22015:6;22068:2;22056:9;22047:7;22043:23;22039:32;22036:52;;;22084:1;22081;22074:12;22036:52;22123:9;22110:23;22142:28;22164:5;22142:28;:::i;22205:385::-;-1:-1:-1;;;;;22457:15:1;;;22439:34;;22509:15;;;;22504:2;22489:18;;22482:43;22568:14;;22561:22;22556:2;22541:18;;22534:50;22389:2;22374:18;;22205:385::o;22595:251::-;22665:6;22718:2;22706:9;22697:7;22693:23;22689:32;22686:52;;;22734:1;22731;22724:12;22686:52;22766:9;22760:16;22785:31;22810:5;22785:31;:::i;22851:184::-;22921:6;22974:2;22962:9;22953:7;22949:23;22945:32;22942:52;;;22990:1;22987;22980:12;22942:52;-1:-1:-1;23013:16:1;;22851:184;-1:-1:-1;22851:184:1:o;23040:168::-;23080:7;23146:1;23142;23138:6;23134:14;23131:1;23128:21;23123:1;23116:9;23109:17;23105:45;23102:71;;;23153:18;;:::i;:::-;-1:-1:-1;23193:9:1;;23040:168::o;23213:127::-;23274:10;23269:3;23265:20;23262:1;23255:31;23305:4;23302:1;23295:15;23329:4;23326:1;23319:15;23345:217;23385:1;23411;23401:132;;23455:10;23450:3;23446:20;23443:1;23436:31;23490:4;23487:1;23480:15;23518:4;23515:1;23508:15;23401:132;-1:-1:-1;23547:9:1;;23345:217::o;23567:670::-;-1:-1:-1;;;;;23934:15:1;;;23916:34;;23986:15;;;;23981:2;23966:18;;23959:43;24033:2;24018:18;;24011:34;;;;24076:2;24061:18;;24054:34;;;;24137:4;24125:17;24119:3;24104:19;;24097:46;23896:3;24159:19;;24152:35;24218:3;24203:19;;24196:35;;;;23865:3;23850:19;;23567:670::o;26157:306::-;26245:6;26253;26261;26314:2;26302:9;26293:7;26289:23;26285:32;26282:52;;;26330:1;26327;26320:12;26282:52;26359:9;26353:16;26343:26;;26409:2;26398:9;26394:18;26388:25;26378:35;;26453:2;26442:9;26438:18;26432:25;26422:35;;26157:306;;;;;:::o;26747:128::-;26787:3;26818:1;26814:6;26811:1;26808:13;26805:39;;;26824:18;;:::i;:::-;-1:-1:-1;26860:9:1;;26747:128::o;26880:135::-;26919:3;26940:17;;;26937:43;;26960:18;;:::i;:::-;-1:-1:-1;27007:1:1;26996:13;;26880:135::o;27020:258::-;27092:1;27102:113;27116:6;27113:1;27110:13;27102:113;;;27192:11;;;27186:18;27173:11;;;27166:39;27138:2;27131:10;27102:113;;;27233:6;27230:1;27227:13;27224:48;;;-1:-1:-1;;27268:1:1;27250:16;;27243:27;27020:258::o;27283:274::-;27412:3;27450:6;27444:13;27466:53;27512:6;27507:3;27500:4;27492:6;27488:17;27466:53;:::i;:::-;27535:16;;;;;27283:274;-1:-1:-1;;27283:274:1:o;27562:624::-;27793:6;27782:9;27775:25;27836:6;27831:2;27820:9;27816:18;27809:34;27908:1;27904;27899:3;27895:11;27891:19;27883:6;27879:32;27874:2;27863:9;27859:18;27852:60;27948:3;27943:2;27932:9;27928:18;27921:31;27756:4;27981:6;27975:13;28025:6;28019:3;28008:9;28004:19;27997:35;28041:67;28101:6;28095:3;28084:9;28080:19;28075:2;28067:6;28063:15;28041:67;:::i;:::-;28169:2;28148:15;-1:-1:-1;;28144:29:1;28129:45;;;;28176:3;28125:55;;27562:624;-1:-1:-1;;;;;27562:624:1:o

Swarm Source

ipfs://adb8bb7c1405fbcc73ecf94f886a179c69535753d587283f4d1ff5b57d4f659c
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.