Contract 0xab9B68c9e53c94D7c0949FB909E80e4a29F9134A 9

 
Txn Hash Method
Block
From
To
Value
0xf06dda91bbde87a44e97a7a191b9e28a68edb062b46b7c604709355b1fc0abcbVote132128322024-04-15 21:03:316 hrs 59 mins ago0x94759c0cdd84054a71c4b9746dcdee90783aca4f IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000216259360.093535435
0x77ff3a05a66794b034b5ed50b3a1c609eb5a31ea0b06246a219ca017c86cef95Vote132032802024-04-15 15:45:0712 hrs 18 mins ago0x402f882da04037dbcb4c8dd03ce6187d1dc920b3 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0001169486590.321171952
0x224eaded4ddaab6b8e891f39e4047c1e061fd84643460ec9f5b6991c0f4bb5f4Reset132032692024-04-15 15:44:4512 hrs 18 mins ago0x402f882da04037dbcb4c8dd03ce6187d1dc920b3 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000150012820.322134134
0xf35b91ffac21b8ba1fc5b012cc758b86c22d87221bffe015ac3fd63c65b07083Vote132007832024-04-15 14:21:5313 hrs 41 mins ago0xad96f74eaf53c40ea25c70759c2d20d2c60c2fd7 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000576273950.1555
0x72ec5c2e696b14e0c77efa2c3a34018f84582122adaddf044d827842c9f1f033Vote131994322024-04-15 13:36:5114 hrs 26 mins ago0xf56d9b99a3b88ff4b7c5a74bfb244e1722827ae2 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000297568740.081547505
0x0fea9961268fa3b7880ad0c8114bc546ddae263329866a216131dd7f0b831a33Claim Bribes131872052024-04-15 6:49:1721 hrs 14 mins ago0x87fc1313880d579039ac48db8b25428ed5f33c4a IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000090081850.024861178
0x6f5441273acc432af0c54da1c8e99e614cf80e9a0be7fa466037d5aabc7ff7caClaim Bribes131841932024-04-15 5:08:5322 hrs 54 mins ago0xb05cf01231cf2ff99499682e64d3780d57c80fdd IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000213333540.0162
0xdb7847278e7d8913a8d08ec35dc258927e15a4864878aad87cd3c397350ac1deClaim Bribes131725452024-04-14 22:40:371 day 5 hrs ago0x3808107710de74cc83e3c165a28bb3a2779742e9 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000456642070.0267
0xbebb180e77e9dca203dd4363c0f89ce08548e57912adc2a0d14c4746d250c4bfClaim Bribes131725382024-04-14 22:40:231 day 5 hrs ago0x3808107710de74cc83e3c165a28bb3a2779742e9 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000095166880.0267
0x00ad310b6ba752aa57abac86138d054c77e353e10a9eeb3bd66732dfb55cfaecClaim Bribes131725302024-04-14 22:40:071 day 5 hrs ago0x3808107710de74cc83e3c165a28bb3a2779742e9 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000197403070.0267
0x2be7887d1d95d4b0baae08380e08c0f2ad761c27f9d12ce9233bd19b0e11b45aClaim Bribes131725052024-04-14 22:39:171 day 5 hrs ago0x3808107710de74cc83e3c165a28bb3a2779742e9 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000152677870.0265
0xf7a2513226e8f680ea83262a6e24e84db78338e34bc7edfb879a6eb417f464abClaim Bribes131722582024-04-14 22:31:031 day 5 hrs ago0x6a9696899e5b114342882c358ffc7c4e620e88df IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000094080020.0266
0xaa3290f05ac29af74de5f209c5788d8a10aafaac27b0295b3115cd13e02e15cbVote131666322024-04-14 19:23:311 day 8 hrs ago0x35fb78bfb4452e7fa0ef231d2ec5268b463e4f62 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000187137450.048525595
0x6d9e141acd8dd00e476233578f516cbf4960a8f8a74ba3f65ad37f97deac7b9bVote131664512024-04-14 19:17:291 day 8 hrs ago0x35fb78bfb4452e7fa0ef231d2ec5268b463e4f62 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000188452750.048871616
0xbb1ff264e3f2884b6f044e77fc197e79742ce13a3e3c88adbbbc57e4fc18e6f8Claim Bribes131664172024-04-14 19:16:211 day 8 hrs ago0x35fb78bfb4452e7fa0ef231d2ec5268b463e4f62 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000060106750.04955557
0xa318aed3ac3b001ae04e32d74f325064c1995ce2e2d282545e19aa8573b6b284Claim Bribes131664062024-04-14 19:15:591 day 8 hrs ago0x35fb78bfb4452e7fa0ef231d2ec5268b463e4f62 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000108085030.04953622
0xc63dcc06759c3cccaaa982e508fd3203ffdbcaa7686693484a2295dfc4476443Vote131355882024-04-14 2:08:432 days 1 hr ago0xfa5bb8ef28b789de7244c4176051950cb825630f IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000030711270.013114689
0x7e25482328e49eb3fec40f30282a99dc446caff859c1f242291c71fd797cc433Claim Bribes131336042024-04-14 1:02:352 days 3 hrs ago0x3f0dff6014836fa3e7308c1ed7b46b9b101977ea IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.000041931010.030436859
0xcc70b849c28155f2877190bc29d6e1a8f0a88ab37fc539ee7075030ee4e5af5aClaim Bribes131172032024-04-13 15:55:532 days 12 hrs ago0xc526fb73c639aaf21aa9aafe7ac5249c249e2730 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.00003917320.180194526
0x5882e17f227a2255ab424ecf3024fdfd0aca0de4dcea0107be32efba606a79e6Claim Bribes131076092024-04-13 10:36:052 days 17 hrs ago0x3f888f4e16a08c6b3745ddbade98e24569852fa4 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.000004631280.0272
0x782ffe961bad769f22bc6acf1c9ee2d3206b727066594bc14a988b9995d91cccClaim Bribes131075512024-04-13 10:34:092 days 17 hrs ago0x3f888f4e16a08c6b3745ddbade98e24569852fa4 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000104936230.0271
0x651cf281912d15917f99fc01777e59506d3c657afc33db2016e8104f91703803Vote131075332024-04-13 10:33:332 days 17 hrs ago0x3f888f4e16a08c6b3745ddbade98e24569852fa4 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000062895530.0271
0x91a34320fad18d633125b3e503bf147c4cf319f627612d0f60ccbcb04cc89a86Vote131075002024-04-13 10:32:272 days 17 hrs ago0x3f888f4e16a08c6b3745ddbade98e24569852fa4 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000122853330.0271
0x2365e4633b235af1fceb94b01813eab1a44f600f42c44a7682d2085f8ebef5f6Claim Bribes130560362024-04-12 5:56:593 days 22 hrs ago0x3214e141bdae08be1f382a885cf3d2a448a5e780 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000074610650.0405
0x68b6bb158a6001dc672c3ddde3c880c1420c2eae900d7a4740d6d2ecde51a5c9Claim Bribes130557682024-04-12 5:48:033 days 22 hrs ago0x2010aebd2826893408019f47d1f4d11ba0a518a0 IN  0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a0 ETH0.0000228022620.04
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x80863d39fe092cd590653768f15e7ebb1b1dc4331a481cf35f4c0f8d0055bc0619626642023-07-30 10:57:55260 days 17 hrs ago 0xab9b68c9e53c94d7c0949fb909e80e4a29f9134a 0x91f85d68b413de823684c891db515b0390a025120 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Voter

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2023-08-02
*/

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


// OpenZeppelin Contracts (last updated v4.9.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) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 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 256, 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 << 3) < value ? 1 : 0);
        }
    }
}


interface IBribe {
    function _deposit(uint amount, uint tokenId) external;
    function _withdraw(uint amount, uint tokenId) external;
    function getRewardForOwner(uint tokenId, address[] memory tokens) external;
    function notifyRewardAmount(address token, uint amount) external;
    function left(address token) external view returns (uint);
}


interface IBribeFactory {
    function createExternalBribe(address[] memory) external returns (address);
}



interface IGauge {
    function notifyRewardAmount(address token, uint amount) external;
    function getReward(address account, address[] memory tokens) external;
    function left(address token) external view returns (uint);
    function stake() external view returns (address);
}



interface IGaugeFactory {
    function createGauge(address, address, address, bool, address[] memory) external returns (address);
}


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 IMinter {
    function update_period() external returns (uint);
}



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 externalBribe() 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 IVoter {
    function _ve() external view returns (address);
    function governor() external view returns (address);
    function emergencyCouncil() external view returns (address);
    function attachTokenToGauge(uint _tokenId, address account) external;
    function detachTokenFromGauge(uint _tokenId, address account) external;
    function emitDeposit(uint _tokenId, address account, uint amount) external;
    function emitWithdraw(uint _tokenId, address account, uint amount) external;
    function isWhitelisted(address token) external view returns (bool);
    function notifyRewardAmount(uint amount) external;
    function distribute(address _gauge) external;
    function gauges(address) external view returns (address);
}



interface IVotingEscrow {

    struct Point {
        int128 bias;
        int128 slope; // # -dweight / dt
        uint256 ts;
        uint256 blk; // block
    }

    function token() external view returns (address);
    function team() external returns (address);
    function epoch() external view returns (uint);
    function point_history(uint loc) external view returns (Point memory);
    function user_point_history(uint tokenId, uint loc) external view returns (Point memory);
    function user_point_epoch(uint tokenId) external view returns (uint);

    function ownerOf(uint) external view returns (address);
    function isApprovedOrOwner(address, uint) external view returns (bool);
    function transferFrom(address, address, uint) external;

    function voting(uint tokenId) external;
    function abstain(uint tokenId) external;
    function attach(uint tokenId) external;
    function detach(uint tokenId) external;

    function checkpoint() external;
    function deposit_for(uint tokenId, uint value) external;
    function create_lock_for(uint, uint, address) external returns (uint);

    function balanceOfNFT(uint) external view returns (uint);
    function totalSupply() external view returns (uint);
}


contract Voter is IVoter {

    address public immutable _ve; // the ve token that governs these contracts
    address internal immutable base;

    address[] public factories; // Array with all the pair factories
    address[] public gaugeFactories; // array with all the gauge factories
    address public bribefactory;
    uint internal constant DURATION = 7 days; // rewards are released over 7 days
    address public minter;
    address public governor; // should be set to an IGovernor
    address public emergencyCouncil; // credibly neutral party similar to Curve's Emergency DAO

    uint public totalWeight; // total voting weight

    address[] public pools; // all pools viable for incentives
    address[] public killedGauges;

    mapping(address => address) public gauges; // pool => gauge
    mapping(address => address) public poolForGauge; // gauge => pool
    mapping(address => address) public external_bribes; // gauge => external bribe (real bribes)
    mapping(address => uint256) public weights; // pool => weight
    mapping(uint => mapping(address => uint256)) public votes; // nft => pool => votes
    mapping(uint => address[]) public poolVote; // nft => pools
    mapping(uint => uint) public usedWeights;  // nft => total voting weight of user
    mapping(uint => uint) public lastVoted; // nft => timestamp of last vote, to ensure one vote per epoch
    mapping(address => bool) public isGauge;
    mapping(address => bool) public isWhitelisted;
    mapping(address => bool) public isAlive;
    mapping(address => bool) public isFactory; // factory  => boolean [the pair factory exists?]
    mapping(address => bool) public isGaugeFactory; // g.factory=> boolean [the gauge factory exists?]

    event GaugeCreated(address indexed gauge, address creator, address indexed external_bribe, address indexed pool);
    event GaugeKilledTotally(address indexed gauge);
    event GaugePaused(address indexed gauge);
    event GaugeRestarted(address indexed gauge);
    event Voted(address indexed voter, uint tokenId, uint256 weight);
    event Abstained(uint tokenId, uint256 weight);
    event Deposit(address indexed lp, address indexed gauge, uint tokenId, uint amount);
    event Withdraw(address indexed lp, address indexed gauge, uint tokenId, uint amount);
    event NotifyReward(address indexed sender, address indexed reward, uint amount);
    event DistributeReward(address indexed sender, address indexed gauge, uint amount);
    event Attach(address indexed owner, address indexed gauge, uint tokenId);
    event Detach(address indexed owner, address indexed gauge, uint tokenId);
    event Whitelisted(address indexed whitelister, address indexed token);
    event Blacklisted(address indexed blacklister, address indexed token);
    event BribeFactorySet(address indexed setter, address newBribeFatory);
    event ExternalBribeSet(address indexed setter, address indexed gauge, address externalBribe);
    event FactoryAdded(address indexed setter, address indexed pairFactory, address indexed gaugeFactory);
    event FactoryReplaced(address indexed setter, address indexed pairFactory, address indexed gaugeFactory, uint256 pos);
    event FactoryRemoved(address indexed setter, uint256 indexed pos);

    constructor(address __ve, address _factory, address _gauges, address _bribes) {
        _ve = __ve;
        base = IVotingEscrow(__ve).token();

        factories.push(_factory);
        isFactory[_factory] = true;

        gaugeFactories.push(_gauges);
        isGaugeFactory[_gauges] = true;

        bribefactory = _bribes;
        minter = msg.sender;
        governor = msg.sender;
        emergencyCouncil = msg.sender;
    }

    // simple re-entrancy check
    uint internal _unlocked = 1;

    modifier lock() {
        require(_unlocked == 1);
        _unlocked = 2;
        _;
        _unlocked = 1;
    }

    modifier onlyNewEpoch(uint _tokenId) {
        // ensure new epoch since last vote
        require((block.timestamp / DURATION) * DURATION > lastVoted[_tokenId], "TOKEN_ALREADY_VOTED_THIS_EPOCH");
        _;
    }

    modifier onlyEmergencyCouncil() {
        require(msg.sender == emergencyCouncil, "not emergencyCouncil");
        _;
    }

    function initialize(address[] memory _tokens, address _minter) external {
        require(msg.sender == minter);
        for (uint i = 0; i < _tokens.length; i++) {
            _whitelist(_tokens[i]);
        }
        minter = _minter;
    }

    function setGovernor(address _governor) public {
        require(msg.sender == governor);
        governor = _governor;
    }

    function setEmergencyCouncil(address _council) public {
        require(msg.sender == governor);
        emergencyCouncil = _council;
    }

    function setBribeFactory(address _bribeFactory) external onlyEmergencyCouncil {
        bribefactory = _bribeFactory;
        emit BribeFactorySet(msg.sender, _bribeFactory);
    }

    /// @notice Set a new External bribe for a given gauge
    function setExternalBribeFor(address _gauge, address _external) external onlyEmergencyCouncil {
        require(isGauge[_gauge]);
        _setExternalBribe(_gauge, _external);
    }

    function _setExternalBribe(address _gauge, address _external) private {
        external_bribes[_gauge] = _external;
        address pool = poolForGauge[_gauge];
        try IPair(pool).setExternalBribe(_external){} catch {}
        emit ExternalBribeSet(msg.sender, _gauge, _external);
    }

    function addFactory(address _pairFactory, address _gaugeFactory) external onlyEmergencyCouncil {
        require(_pairFactory != address(0), 'addr 0');
        require(_gaugeFactory != address(0), 'addr 0');
        require(!isGaugeFactory[_gaugeFactory], 'g.fact true');

        factories.push(_pairFactory);
        gaugeFactories.push(_gaugeFactory);
        isFactory[_pairFactory] = true;
        isGaugeFactory[_gaugeFactory] = true;

        emit FactoryAdded(msg.sender, _pairFactory, _gaugeFactory);
    }

    function replaceFactory(address _pairFactory, address _gaugeFactory, uint256 _pos) external onlyEmergencyCouncil {
        require(_pairFactory != address(0), 'addr 0');
        require(_gaugeFactory != address(0), 'addr 0');
        require(_pos < factoryLength() && _pos < gaugeFactoriesLength(), '_pos out of range');
        require(isFactory[_pairFactory], 'factory false');
        require(isGaugeFactory[_gaugeFactory], 'g.fact false');
        address oldPF = factories[_pos];
        address oldGF = gaugeFactories[_pos];
        isFactory[oldPF] = false;
        isGaugeFactory[oldGF] = false;

        factories[_pos] = (_pairFactory);
        gaugeFactories[_pos] = (_gaugeFactory);
        isFactory[_pairFactory] = true;
        isGaugeFactory[_gaugeFactory] = true;

        emit FactoryReplaced(msg.sender, _pairFactory, _gaugeFactory, _pos);
    }

    function removeFactory(uint256 _pos) external onlyEmergencyCouncil {
        require(_pos < factoryLength() && _pos < gaugeFactoriesLength(), '_pos out of range');
        address oldPF = factories[_pos];
        address oldGF = gaugeFactories[_pos];
        require(isFactory[oldPF], 'factory false');
        require(isGaugeFactory[oldGF], 'g.fact false');
        factories[_pos] = address(0);
        gaugeFactories[_pos] = address(0);
        isFactory[oldPF] = false;
        isGaugeFactory[oldGF] = false;

        emit FactoryRemoved(msg.sender, _pos);
    }

    function reset(uint _tokenId) external onlyNewEpoch(_tokenId) {
        require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId));
        _reset(_tokenId);
        IVotingEscrow(_ve).abstain(_tokenId);
    }

    function _reset(uint _tokenId) internal {
        address[] storage _poolVote = poolVote[_tokenId];
        uint _poolVoteCnt = _poolVote.length;
        uint256 _totalWeight = 0;

        for (uint i = 0; i < _poolVoteCnt; i ++) {
            address _pool = _poolVote[i];
            uint256 _votes = votes[_tokenId][_pool];

            if (_votes != 0) {
                _updateFor(gauges[_pool]);
                weights[_pool] -= _votes;
                votes[_tokenId][_pool] -= _votes;
                if (_votes > 0) {
                    IBribe(external_bribes[gauges[_pool]])._withdraw(uint256(_votes), _tokenId);
                    _totalWeight += _votes;
                } else {
                    _totalWeight -= _votes;
                }
                emit Abstained(_tokenId, _votes);
            }
        }
        totalWeight -= uint256(_totalWeight);
        usedWeights[_tokenId] = 0;
        delete poolVote[_tokenId];
    }

    function poke(uint _tokenId) external onlyNewEpoch(_tokenId) {
        require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId) || msg.sender == governor);
        lastVoted[_tokenId] = block.timestamp;

        address[] memory _poolVote = poolVote[_tokenId];
        uint _poolCnt = _poolVote.length;
        uint256[] memory _weights = new uint256[](_poolCnt);

        for (uint i = 0; i < _poolCnt; i ++) {
            _weights[i] = votes[_tokenId][_poolVote[i]];
        }

        _vote(_tokenId, _poolVote, _weights);
    }

    function _vote(uint _tokenId, address[] memory _poolVote, uint256[] memory _weights) internal {
        _reset(_tokenId);
        uint _poolCnt = _poolVote.length;
        uint256 _weight = IVotingEscrow(_ve).balanceOfNFT(_tokenId);
        uint256 _totalVoteWeight = 0;
        uint256 _totalWeight = 0;
        uint256 _usedWeight = 0;

        for (uint i = 0; i < _poolCnt; i++) {
            _totalVoteWeight += _weights[i];
        }

        for (uint i = 0; i < _poolCnt; i++) {
            address _pool = _poolVote[i];
            address _gauge = gauges[_pool];

            if (isGauge[_gauge]) {
                require(isAlive[_gauge], "gauge already dead");
                uint256 _poolWeight = _weights[i] * _weight / _totalVoteWeight;
                require(votes[_tokenId][_pool] == 0);
                require(_poolWeight != 0);
                _updateFor(_gauge);

                poolVote[_tokenId].push(_pool);

                weights[_pool] += _poolWeight;
                votes[_tokenId][_pool] += _poolWeight;
                IBribe(external_bribes[_gauge])._deposit(uint256(_poolWeight), _tokenId);
                _usedWeight += _poolWeight;
                _totalWeight += _poolWeight;
                emit Voted(msg.sender, _tokenId, _poolWeight);
            }
        }
        if (_usedWeight > 0) IVotingEscrow(_ve).voting(_tokenId);
        totalWeight += uint256(_totalWeight);
        usedWeights[_tokenId] = uint256(_usedWeight);
    }

    function vote(uint tokenId, address[] calldata _poolVote, uint256[] calldata _weights) external onlyNewEpoch(tokenId) {
        require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, tokenId));
        require(_poolVote.length == _weights.length);
        lastVoted[tokenId] = block.timestamp;
        _vote(tokenId, _poolVote, _weights);
    }

    function whitelist(address _token) public {
        require(msg.sender == governor);
        _whitelist(_token);
    }

    function _whitelist(address _token) internal {
        require(!isWhitelisted[_token]);
        isWhitelisted[_token] = true;
        emit Whitelisted(msg.sender, _token);
    }

    function blacklist(address _token) public {
        require(msg.sender == governor);
        _blacklist(_token);
    }

    function _blacklist(address _token) internal {
        require(isWhitelisted[_token]);
        isWhitelisted[_token] = false;
        emit Blacklisted(msg.sender, _token);
    }

    function createGauge(address _pool, uint256 _gaugeType) external returns (address) {
        require(_gaugeType < factories.length, "gaugetype big");
        require(gauges[_pool] == address(0x0), "exists");
        address[] memory allowedRewards = new address[](3);
        address[] memory internalRewards = new address[](2);
        address tokenA;
        address tokenB;
        address _factory = factories[_gaugeType];
        address _gaugeFactory = gaugeFactories[_gaugeType];
        require(_factory != address(0));
        require(_gaugeFactory != address(0));
        bool isPair = IPairFactory(_factory).isPair(_pool);

        if (isPair) {
            tokenA = IPair(_pool).token0();
            tokenB = IPair(_pool).token1();
            allowedRewards[0] = tokenA;
            allowedRewards[1] = tokenB;
            internalRewards[0] = tokenA;
            internalRewards[1] = tokenB;
            // if one of the tokens is not base (FLOW) then add base(FLOW) to allowed rewards
            if (base != tokenA && base != tokenB) {
              allowedRewards[2] = base;
            }
        }

        if (msg.sender != governor && msg.sender != emergencyCouncil) { // gov can create for any pool, even non-Velocimeter pairs
            require(isPair, "!_pool");
            require(isWhitelisted[tokenA] && isWhitelisted[tokenB], "!whitelisted");
        }

        address _external_bribe = IPair(_pool).externalBribe();
        
        if(_external_bribe == address(0)) {
          _external_bribe = IBribeFactory(bribefactory).createExternalBribe(allowedRewards); 
        }
        address _gauge = IGaugeFactory(_gaugeFactory).createGauge(_pool, _external_bribe, _ve, isPair, allowedRewards);

        IERC20(base).approve(_gauge, type(uint).max);
        external_bribes[_gauge] = _external_bribe;
        gauges[_pool] = _gauge;
        poolForGauge[_gauge] = _pool;
        isGauge[_gauge] = true;
        isAlive[_gauge] = true;
        _updateFor(_gauge);
        if(claimable[_gauge] > 0) {
            claimable[_gauge] = 0;
        }
        pools.push(_pool);
        if (isPair) {
            IPair(_pool).setHasGauge(true);
            IPair(_pool).setExternalBribe(_external_bribe);
        }
        emit GaugeCreated(_gauge, msg.sender, _external_bribe, _pool);
        return _gauge;
    }

    function pauseGauge(address _gauge) external {
        require(msg.sender == emergencyCouncil, "not emergency council");
        require(isAlive[_gauge], "gauge already dead");
        isAlive[_gauge] = false;
        claimable[_gauge] = 0;
        address _pair = IGauge(_gauge).stake(); // TODO: add test cases
        try IPair(_pair).setHasGauge(false) {} catch {}
        emit GaugePaused(_gauge);
    }

    function restartGauge(address _gauge) external {
        require(msg.sender == emergencyCouncil, "not emergency council");
        require(!isAlive[_gauge], "gauge already alive");
        isAlive[_gauge] = true;
        address _pair = IGauge(_gauge).stake(); // TODO: add test cases
        try IPair(_pair).setHasGauge(true) {} catch {}
        emit GaugeRestarted(_gauge);
    }

    function killGaugeTotally(address _gauge) external {
        require(msg.sender == emergencyCouncil, "not emergency council");
        require(isAlive[_gauge], "gauge already dead");

        address _pool = poolForGauge[_gauge];

        delete isAlive[_gauge];
        delete external_bribes[_gauge];
        delete poolForGauge[_gauge];
        delete isGauge[_gauge];
        delete claimable[_gauge];
        delete supplyIndex[_gauge];
        delete gauges[_pool];
        try IPair(_pool).setHasGauge(false) {} catch {}

        killedGauges.push(_gauge);

        emit GaugeKilledTotally(_gauge);
    }

    function attachTokenToGauge(uint tokenId, address account) external {
        require(isGauge[msg.sender]);
        require(isAlive[msg.sender]); // killed gauges cannot attach tokens to themselves
        if (tokenId > 0) IVotingEscrow(_ve).attach(tokenId);
        emit Attach(account, msg.sender, tokenId);
    }

    function emitDeposit(uint tokenId, address account, uint amount) external {
        require(isGauge[msg.sender]);
        require(isAlive[msg.sender]);
        emit Deposit(account, msg.sender, tokenId, amount);
    }

    function detachTokenFromGauge(uint tokenId, address account) external {
        if (tokenId > 0) IVotingEscrow(_ve).detach(tokenId);
        emit Detach(account, msg.sender, tokenId);
    }

    function emitWithdraw(uint tokenId, address account, uint amount) external {
        emit Withdraw(account, msg.sender, tokenId, amount);
    }

    function length() external view returns (uint) {
        return pools.length;
    }

    function _factories() external view returns(address[] memory){
        return factories;
    }
    
    function factoryLength() public view returns(uint){
        return factories.length;
    }
    
    function _gaugeFactories() external view returns(address[] memory){
        return gaugeFactories;
    }
    
    function gaugeFactoriesLength() public view returns(uint) {
        return gaugeFactories.length;
    }

    function _killedGauges() external view returns(address[] memory){
        return killedGauges;
    }
    
    function killedGaugesLength() public view returns(uint) {
        return killedGauges.length;
    }

    uint internal index;
    mapping(address => uint) internal supplyIndex;
    mapping(address => uint) public claimable;

    function notifyRewardAmount(uint amount) external {
        _safeTransferFrom(base, msg.sender, address(this), amount); // transfer the distro in
        uint256 _ratio = amount * 1e18 / totalWeight; // 1e18 adjustment is removed during claim
        if (_ratio > 0) {
            index += _ratio;
        }
        emit NotifyReward(msg.sender, base, amount);
    }

    function updateFor(address[] memory _gauges) external {
        for (uint i = 0; i < _gauges.length; i++) {
            _updateFor(_gauges[i]);
        }
    }

    function updateForRange(uint start, uint end) public {
        for (uint i = start; i < end; i++) {
            _updateFor(gauges[pools[i]]);
        }
    }

    function updateAll() external {
        updateForRange(0, pools.length);
    }

    function updateGauge(address _gauge) external {
        _updateFor(_gauge);
    }

    function _updateFor(address _gauge) internal {
        address _pool = poolForGauge[_gauge];
        uint256 _supplied = weights[_pool];
        if (_supplied > 0) {
            uint _supplyIndex = supplyIndex[_gauge];
            uint _index = index; // get global index0 for accumulated distro
            supplyIndex[_gauge] = _index; // update _gauge current position to global position
            uint _delta = _index - _supplyIndex; // see if there is any difference that need to be accrued
            if (_delta > 0) {
                uint _share = uint(_supplied) * _delta / 1e18; // add accrued difference for each supplied token
                if (isAlive[_gauge]) {
                    claimable[_gauge] += _share;
                }
            }
        } else {
            supplyIndex[_gauge] = index; // new users are set to the default global state
        }
    }

    function claimRewards(address[] memory _gauges, address[][] memory _tokens) external {
        for (uint i = 0; i < _gauges.length; i++) {
            IGauge(_gauges[i]).getReward(msg.sender, _tokens[i]);
        }
    }

    function claimBribes(address[] memory _bribes, address[][] memory _tokens, uint _tokenId) external {
        require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId));
        for (uint i = 0; i < _bribes.length; i++) {
            IBribe(_bribes[i]).getRewardForOwner(_tokenId, _tokens[i]);
        }
    }

    function distribute(address _gauge) public lock {
        IMinter(minter).update_period();
        _updateFor(_gauge); // should set claimable to 0 if killed
        uint _claimable = claimable[_gauge];
        if (_claimable > IGauge(_gauge).left(base) && _claimable / DURATION > 0) {
            claimable[_gauge] = 0;
            IGauge(_gauge).notifyRewardAmount(base, _claimable);
            emit DistributeReward(msg.sender, _gauge, _claimable);
        }
    }

    function distro() external {
        distribute(0, pools.length);
    }

    function distribute() external {
        distribute(0, pools.length);
    }

    function distribute(uint start, uint finish) public {
        for (uint x = start; x < finish; x++) {
            distribute(gauges[pools[x]]);
        }
    }

    function distribute(address[] memory _gauges) external {
        for (uint x = 0; x < _gauges.length; x++) {
            distribute(_gauges[x]);
        }
    }

    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 Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"__ve","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_gauges","type":"address"},{"internalType":"address","name":"_bribes","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"Abstained","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Attach","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"blacklister","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"Blacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"address","name":"newBribeFatory","type":"address"}],"name":"BribeFactorySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lp","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Detach","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DistributeReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"address","name":"externalBribe","type":"address"}],"name":"ExternalBribeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":true,"internalType":"address","name":"pairFactory","type":"address"},{"indexed":true,"internalType":"address","name":"gaugeFactory","type":"address"}],"name":"FactoryAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":true,"internalType":"uint256","name":"pos","type":"uint256"}],"name":"FactoryRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":true,"internalType":"address","name":"pairFactory","type":"address"},{"indexed":true,"internalType":"address","name":"gaugeFactory","type":"address"},{"indexed":false,"internalType":"uint256","name":"pos","type":"uint256"}],"name":"FactoryReplaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"address","name":"external_bribe","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"}],"name":"GaugeCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugeKilledTotally","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugePaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugeRestarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NotifyReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"Voted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"whitelister","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"Whitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lp","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"_factories","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_gaugeFactories","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_killedGauges","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pairFactory","type":"address"},{"internalType":"address","name":"_gaugeFactory","type":"address"}],"name":"addFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"attachTokenToGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bribefactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_bribes","type":"address[]"},{"internalType":"address[][]","name":"_tokens","type":"address[][]"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimBribes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"address[][]","name":"_tokens","type":"address[][]"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256","name":"_gaugeType","type":"uint256"}],"name":"createGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"detachTokenFromGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"finish","type":"uint256"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distro","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyCouncil","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emitDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emitWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"external_bribes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"factories","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factoryLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"gaugeFactories","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gaugeFactoriesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gauges","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"address","name":"_minter","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAlive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFactory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGauge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGaugeFactory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"killGaugeTotally","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"killedGauges","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"killedGaugesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastVoted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"length","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"pauseGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"poke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolForGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolVote","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pos","type":"uint256"}],"name":"removeFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pairFactory","type":"address"},{"internalType":"address","name":"_gaugeFactory","type":"address"},{"internalType":"uint256","name":"_pos","type":"uint256"}],"name":"replaceFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"reset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"restartGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bribeFactory","type":"address"}],"name":"setBribeFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_council","type":"address"}],"name":"setEmergencyCouncil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_external","type":"address"}],"name":"setExternalBribeFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governor","type":"address"}],"name":"setGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"updateFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"updateForRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"updateGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedWeights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address[]","name":"_poolVote","type":"address[]"},{"internalType":"uint256[]","name":"_weights","type":"uint256[]"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"votes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"weights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260016016553480156200001657600080fd5b50604051620045e0380380620045e08339810160408190526200003991620001b4565b6001600160a01b038416608081905260408051637e062a3560e11b8152905163fc0c546a916004808201926020929091908290030181865afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000211565b6001600160a01b0390811660a05260008054600181810183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390910180549684166001600160a01b031997881681179091558252601460209081526040808420805460ff199081168517909155835480850185557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6018054988716988a1689179055968452601590915290912080549094161790925560028054919092169083161790556003805482163390811790915560048054831682179055600580549092161790555062000236565b80516001600160a01b0381168114620001af57600080fd5b919050565b60008060008060808587031215620001cb57600080fd5b620001d68562000197565b9350620001e66020860162000197565b9250620001f66040860162000197565b9150620002066060860162000197565b905092959194509250565b6000602082840312156200022457600080fd5b6200022f8262000197565b9392505050565b60805160a05161430d620002d36000396000818161126a015281816112e3015281816117e6015281816118a2015281816129430152818161297c015281816129ae0152612c8c0152600081816106f001528181610f1401528181610faf015281816110790152818161135401528181611b6b01528181611c9b01528181611e3001528181612bde015281816133370152613691015261430d6000f3fe608060405234801561001057600080fd5b50600436106103d05760003560e01c80637778960e116101ff578063ae21c4cb1161011a578063daa168bd116100ad578063e9f6adfa1161007c578063e9f6adfa146108ff578063ea94ee4414610907578063f3594be01461091a578063f9f92be41461093a57600080fd5b8063daa168bd146108c6578063dcd9e47a146108d9578063e4fc6b6d146105c7578063e586875f146108ec57600080fd5b8063c448c78d116100e9578063c448c78d14610878578063cbadada414610880578063d23254b414610888578063d560b0d7146108b357600080fd5b8063ae21c4cb1461080b578063b52a315114610834578063b9a09fd51461083c578063c42cf5351461086557600080fd5b80639fb5dc0511610192578063a86a366d11610161578063a86a366d146107af578063a9b5aa7e146107c2578063aa79979b146107d5578063ac4afa38146107f857600080fd5b80639fb5dc0514610754578063a61c713a14610769578063a7cac8461461077c578063a82029f91461079c57600080fd5b806396c82e57116101ce57806396c82e57146107125780639b19251a1461071b5780639b6a9d721461072e5780639edfd4601461074157600080fd5b80637778960e146106a557806379e93824146106b85780637ac09bf7146106d85780638dd598fb146106eb57600080fd5b8063402914f5116102ef57806363453ae111610282578063698473e311610251578063698473e3146106595780636ecbe38a1461066c5780637625391a1461067f5780637715ee751461069257600080fd5b806363453ae1146105fd5780636566afad14610610578063657021fb14610623578063672383c41461064657600080fd5b806347b3c6ba116102be57806347b3c6ba146105c757806353d78693146105cf578063577387b5146105d75780636138889b146105ea57600080fd5b8063402914f514610579578063411b1f7714610599578063462d0b2e146105ac578063470f4985146105bf57600080fd5b806320b1cb6f1161036757806332145f901161033657806332145f901461051d57806338752a9d146105305780633af32abf146105435780633c6b16ab1461056657600080fd5b806320b1cb6f146104d157806323e1af42146104e457806327e5c823146104f7578063310bd74b1461050a57600080fd5b80630f04ba67116103a35780630f04ba67146104565780631703e5f914610489578063173de600146104ac5780631f7b6d32146104bf57600080fd5b806303c39b00146103d557806306d6a1b2146103ea57806307546172146104305780630c340a2414610443575b600080fd5b6103e86103e3366004613b09565b61094d565b005b6104136103f8366004613b09565b600a602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b600354610413906001600160a01b031681565b600454610413906001600160a01b031681565b610479610464366004613b09565b60146020526000908152604090205460ff1681565b6040519015158152602001610427565b610479610497366004613b09565b60136020526000908152604090205460ff1681565b6104136104ba366004613b2d565b610ad1565b6007545b604051908152602001610427565b6103e86104df366004613ca5565b610afb565b6104136104f2366004613b2d565b610bb1565b6103e8610505366004613d09565b610bc1565b6103e8610518366004613b2d565b610eb2565b6103e861052b366004613b2d565b611017565b600254610413906001600160a01b031681565b610479610551366004613b09565b60126020526000908152604090205460ff1681565b6103e8610574366004613b2d565b611265565b6104c3610587366004613b09565b60196020526000908152604090205481565b6103e86105a7366004613d4a565b611338565b6103e86105ba366004613d7a565b6113f6565b6000546104c3565b6103e8611471565b6103e8611482565b6103e86105e5366004613b2d565b611491565b6103e86105f8366004613dc1565b6116ea565b6103e861060b366004613b09565b61172e565b6103e861061e366004613dfe565b611956565b610479610631366004613b09565b60156020526000908152604090205460ff1681565b610413610654366004613b2d565b611b07565b6103e8610667366004613d4a565b611b17565b6103e861067a366004613b09565b611c0d565b6103e861068d366004613e2c565b611c19565b6103e86106a0366004613e4e565b611c7f565b600554610413906001600160a01b031681565b6104c36106c6366004613b2d565b600f6020526000908152604090205481565b6103e86106e6366004613f07565b611dce565b6104137f000000000000000000000000000000000000000000000000000000000000000081565b6104c360065481565b6103e8610729366004613b09565b611f36565b6103e861073c366004613e2c565b611f56565b6103e861074f366004613b09565b611fbc565b61075c612169565b6040516104279190613fc5565b6103e8610777366004613fd8565b6121cb565b6104c361078a366004613b09565b600c6020526000908152604090205481565b6103e86107aa366004613b09565b61224f565b6104136107bd366004613e2c565b6123ea565b6103e86107d0366004613b09565b612422565b6104796107e3366004613b09565b60116020526000908152604090205460ff1681565b610413610806366004613b2d565b6124a2565b610413610819366004613b09565b600b602052600090815260409020546001600160a01b031681565b6001546104c3565b61041361084a366004613b09565b6009602052600090815260409020546001600160a01b031681565b6103e8610873366004613b09565b6124b2565b6008546104c3565b61075c6124eb565b6104c3610896366004613d4a565b600d60209081526000928352604080842090915290825290205481565b6103e86108c1366004613dc1565b61254b565b6103e86108d4366004613dfe565b61258b565b6104136108e7366004613fff565b6125e4565b6103e86108fa366004613b09565b612ff3565b61075c61302c565b6103e8610915366004613fd8565b61308c565b6104c3610928366004613b2d565b60106020526000908152604090205481565b6103e8610948366004613b09565b6130cf565b6005546001600160a01b031633146109805760405162461bcd60e51b81526004016109779061402b565b60405180910390fd5b6001600160a01b03811660009081526013602052604090205460ff166109b85760405162461bcd60e51b81526004016109779061405a565b6001600160a01b0381166000818152601360209081526040808320805460ff19169055601982528083208390558051633a4b66f160e01b81529051929392633a4b66f1926004808401939192918290030181865afa158015610a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a429190614086565b6040516305916c7f60e51b8152600060048201529091506001600160a01b0382169063b22d8fe090602401600060405180830381600087803b158015610a8757600080fd5b505af1925050508015610a98575060015b506040516001600160a01b038316907f745308c08240010b7d5acf1a287fddff3bd591868cf1bc876f5f4ce80da4b22790600090a25050565b60088181548110610ae157600080fd5b6000918252602090912001546001600160a01b0316905081565b60005b8251811015610bac57828181518110610b1957610b196140a3565b60200260200101516001600160a01b03166331279d3d33848481518110610b4257610b426140a3565b60200260200101516040518363ffffffff1660e01b8152600401610b679291906140b9565b600060405180830381600087803b158015610b8157600080fd5b505af1158015610b95573d6000803e3d6000fd5b505050508080610ba4906140f3565b915050610afe565b505050565b60018181548110610ae157600080fd5b6005546001600160a01b03163314610beb5760405162461bcd60e51b81526004016109779061410c565b6001600160a01b038316610c115760405162461bcd60e51b81526004016109779061413a565b6001600160a01b038216610c375760405162461bcd60e51b81526004016109779061413a565b60005481108015610c49575060015481105b610c895760405162461bcd60e51b81526020600482015260116024820152705f706f73206f7574206f662072616e676560781b6044820152606401610977565b6001600160a01b03831660009081526014602052604090205460ff16610ce15760405162461bcd60e51b815260206004820152600d60248201526c666163746f72792066616c736560981b6044820152606401610977565b6001600160a01b03821660009081526015602052604090205460ff16610d385760405162461bcd60e51b815260206004820152600c60248201526b672e666163742066616c736560a01b6044820152606401610977565b6000808281548110610d4c57610d4c6140a3565b6000918252602082200154600180546001600160a01b0390921693509084908110610d7957610d796140a3565b60009182526020808320909101546001600160a01b038581168452601483526040808520805460ff1990811690915591909216808552601590935290832080549091169055815490925086919085908110610dd657610dd66140a3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360018481548110610e1857610e186140a3565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055878316808352601482526040808420805460ff199081166001908117909255958a168086526015855294829020805490961617909455925186815291929133917f3633a7f9c2b4cc760354edf1370d3cd58da11f6fbf1ef237641548407a4bd6f8910160405180910390a45050505050565b600081815260106020526040902054819062093a80610ed1814261415a565b610edb919061417c565b11610ef85760405162461bcd60e51b81526004016109779061419b565b60405163430c208160e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8791906141d2565b610f9057600080fd5b610f99826130ef565b60405163c1f0fb9f60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c1f0fb9f90602401600060405180830381600087803b158015610ffb57600080fd5b505af115801561100f573d6000803e3d6000fd5b505050505050565b600081815260106020526040902054819062093a80611036814261415a565b611040919061417c565b1161105d5760405162461bcd60e51b81526004016109779061419b565b60405163430c208160e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa1580156110c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ec91906141d2565b8061110157506004546001600160a01b031633145b61110a57600080fd5b6000828152601060209081526040808320429055600e82528083208054825181850281018501909352808352919290919083018282801561117457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611156575b5050505050905060008151905060008167ffffffffffffffff81111561119c5761119c613b46565b6040519080825280602002602001820160405280156111c5578160200160208202803683370190505b50905060005b8281101561125257600d600087815260200190815260200160002060008583815181106111fa576111fa6140a3565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611235576112356140a3565b60209081029190910101528061124a816140f3565b9150506111cb565b5061125e858483613313565b5050505050565b6112917f0000000000000000000000000000000000000000000000000000000000000000333084613728565b6006546000906112a983670de0b6b3a764000061417c565b6112b3919061415a565b905080156112d35780601760008282546112cd91906141f4565b90915550505b6040518281526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf50826906020015b60405180910390a35050565b81156113b957604051634c35bec560e11b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063986b7d8a90602401600060405180830381600087803b1580156113a057600080fd5b505af11580156113b4573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907fae268d9aab12f3605f58efd74fd3801fa812b03fdb44317eb70f46dff0e19e229060200161132c565b6003546001600160a01b0316331461140d57600080fd5b60005b825181101561144d5761143b83828151811061142e5761142e6140a3565b6020026020010151613818565b80611445816140f3565b915050611410565b50600380546001600160a01b0319166001600160a01b039290921691909117905550565b60075461148090600090611c19565b565b60075461148090600090611f56565b6005546001600160a01b031633146114bb5760405162461bcd60e51b81526004016109779061410c565b600054811080156114cd575060015481105b61150d5760405162461bcd60e51b81526020600482015260116024820152705f706f73206f7574206f662072616e676560781b6044820152606401610977565b6000808281548110611521576115216140a3565b6000918252602082200154600180546001600160a01b039092169350908490811061154e5761154e6140a3565b60009182526020808320909101546001600160a01b03858116845260149092526040909220549116915060ff166115b75760405162461bcd60e51b815260206004820152600d60248201526c666163746f72792066616c736560981b6044820152606401610977565b6001600160a01b03811660009081526015602052604090205460ff1661160e5760405162461bcd60e51b815260206004820152600c60248201526b672e666163742066616c736560a01b6044820152606401610977565b6000808481548110611622576116226140a3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600060018481548110611665576116656140a3565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790558483168252601481526040808320805460ff199081169091559385168352601590915280822080549093169092559051849133917f0b8a5f427e4dc8f150fa67b8072e1e0c1dd5a67cbb3c3e5e99fd9593f814f4129190a3505050565b60005b815181101561172a5761171882828151811061170b5761170b6140a3565b602002602001015161172e565b80611722816140f3565b9150506116ed565b5050565b60165460011461173d57600080fd5b60026016556003546040805163ed29fc1160e01b815290516001600160a01b039092169163ed29fc119160048082019260209290919082900301816000875af115801561178e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b2919061420c565b506117bc8161388b565b6001600160a01b0381811660008181526019602052604090819020549051634cde602960e11b81527f00000000000000000000000000000000000000000000000000000000000000009093166004840152916399bcc05290602401602060405180830381865afa158015611834573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611858919061420c565b811180156118725750600061187062093a808361415a565b115b1561194d576001600160a01b03828116600081815260196020526040808220919091555163b66503cf60e01b81527f00000000000000000000000000000000000000000000000000000000000000009092166004830152602482018390529063b66503cf90604401600060405180830381600087803b1580156118f457600080fd5b505af1158015611908573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b179060200160405180910390a35b50506001601655565b6005546001600160a01b031633146119805760405162461bcd60e51b81526004016109779061410c565b6001600160a01b0382166119a65760405162461bcd60e51b81526004016109779061413a565b6001600160a01b0381166119cc5760405162461bcd60e51b81526004016109779061413a565b6001600160a01b03811660009081526015602052604090205460ff1615611a235760405162461bcd60e51b815260206004820152600b60248201526a672e66616374207472756560a81b6044820152606401610977565b60008054600181810183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390910180546001600160a01b038087166001600160a01b03199283168117909355835480850185557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6018054918716919092168117909155818452601460209081526040808620805460ff19908116871790915583875260159092528086208054909216909417905591519192909133917f5af5acd828b04c6899aa8e9823b472c3a176605a47cae52d5acc849a12ab88bc91a45050565b60008181548110610ae157600080fd5b3360009081526011602052604090205460ff16611b3357600080fd5b3360009081526013602052604090205460ff16611b4f57600080fd5b8115611bd05760405163fbd3a29d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063fbd3a29d90602401600060405180830381600087803b158015611bb757600080fd5b505af1158015611bcb573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907f60940192810a6fb3bce3fd3e2e3a13fd6ccc7605e963fb87ee971aba829989bd9060200161132c565b611c168161388b565b50565b815b81811015610bac57611c6d6009600060078481548110611c3d57611c3d6140a3565b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020541661172e565b80611c77816140f3565b915050611c1b565b60405163430c208160e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015611cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0e91906141d2565b611d1757600080fd5b60005b8351811015611dc857838181518110611d3557611d356140a3565b60200260200101516001600160a01b031663a7852afa83858481518110611d5e57611d5e6140a3565b60200260200101516040518363ffffffff1660e01b8152600401611d83929190614225565b600060405180830381600087803b158015611d9d57600080fd5b505af1158015611db1573d6000803e3d6000fd5b505050508080611dc0906140f3565b915050611d1a565b50505050565b600085815260106020526040902054859062093a80611ded814261415a565b611df7919061417c565b11611e145760405162461bcd60e51b81526004016109779061419b565b60405163430c208160e01b8152336004820152602481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015611e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea391906141d2565b611eac57600080fd5b838214611eb857600080fd5b6000868152601060209081526040918290204290558151868202818101830190935286815261100f9289928991899182919085019084908082843760009201919091525050604080516020808a0282810182019093528982529093508992508891829185019084908082843760009201919091525061331392505050565b6004546001600160a01b03163314611f4d57600080fd5b611c1681613818565b815b81811015610bac57611faa6009600060078481548110611f7a57611f7a6140a3565b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020541661388b565b80611fb4816140f3565b915050611f58565b6005546001600160a01b03163314611fe65760405162461bcd60e51b81526004016109779061402b565b6001600160a01b03811660009081526013602052604090205460ff1661201e5760405162461bcd60e51b81526004016109779061405a565b6001600160a01b038181166000908152600a60209081526040808320805460138452828520805460ff19908116909155600b855283862080546001600160a01b031990811690915583548116909355601185528386208054909116905560198452828520859055601884528285208590559094168084526009909252808320805490941690935591516305916c7f60e51b81526004810191909152819063b22d8fe090602401600060405180830381600087803b1580156120de57600080fd5b505af19250505080156120ef575060015b506008805460018101825560009182527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b03851690811790915560405190917f3ee2da044873b7ddb31d4960187639074c5137888f359c667b947320284709c391a25050565b606060018054806020026020016040519081016040528092919081815260200182805480156121c157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116121a3575b5050505050905090565b3360009081526011602052604090205460ff166121e757600080fd5b3360009081526013602052604090205460ff1661220357600080fd5b604080518481526020810183905233916001600160a01b038516917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a3505050565b6005546001600160a01b031633146122795760405162461bcd60e51b81526004016109779061402b565b6001600160a01b03811660009081526013602052604090205460ff16156122d85760405162461bcd60e51b8152602060048201526013602482015272676175676520616c726561647920616c69766560681b6044820152606401610977565b6001600160a01b0381166000818152601360209081526040808320805460ff191660011790558051633a4b66f160e01b81529051929392633a4b66f1926004808401939192918290030181865afa158015612337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235b9190614086565b6040516305916c7f60e51b8152600160048201529091506001600160a01b0382169063b22d8fe090602401600060405180830381600087803b1580156123a057600080fd5b505af19250505080156123b1575060015b506040516001600160a01b038316907f3b8274015fe59b73ee1fb9c5d7ad25a8f253dc8d45ebd178bfef3295240fcabd90600090a25050565b600e602052816000526040600020818154811061240657600080fd5b6000918252602090912001546001600160a01b03169150829050565b6005546001600160a01b0316331461244c5760405162461bcd60e51b81526004016109779061410c565b600280546001600160a01b0319166001600160a01b03831690811790915560405190815233907f557e0f02d402561222ba54007de263881f84edad9a3877340d06e330e3400fa89060200160405180910390a250565b60078181548110610ae157600080fd5b6004546001600160a01b031633146124c957600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b606060088054806020026020016040519081016040528092919081815260200182805480156121c1576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116121a3575050505050905090565b60005b815181101561172a5761257982828151811061256c5761256c6140a3565b602002602001015161388b565b80612583816140f3565b91505061254e565b6005546001600160a01b031633146125b55760405162461bcd60e51b81526004016109779061410c565b6001600160a01b03821660009081526011602052604090205460ff166125da57600080fd5b61172a828261398c565b6000805482106126265760405162461bcd60e51b815260206004820152600d60248201526c6761756765747970652062696760981b6044820152606401610977565b6001600160a01b0383811660009081526009602052604090205416156126775760405162461bcd60e51b815260206004820152600660248201526565786973747360d01b6044820152606401610977565b604080516003808252608082019092526000916020820160608036833750506040805160028082526060820183529394506000939092509060208301908036833701905050905060008060008087815481106126d5576126d56140a3565b6000918252602082200154600180546001600160a01b0390921693509089908110612702576127026140a3565b6000918252602090912001546001600160a01b039081169150821661272657600080fd5b6001600160a01b03811661273957600080fd5b60405163e5e31b1360e01b81526001600160a01b038a811660048301526000919084169063e5e31b1390602401602060405180830381865afa158015612783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a791906141d2565b90508015612a0157896001600160a01b0316630dfe16816040518163ffffffff1660e01b81526004016020604051808303816000875af11580156127ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128139190614086565b9450896001600160a01b031663d21220a76040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612855573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128799190614086565b9350848760008151811061288f5761288f6140a3565b60200260200101906001600160a01b031690816001600160a01b03168152505083876001815181106128c3576128c36140a3565b60200260200101906001600160a01b031690816001600160a01b03168152505084866000815181106128f7576128f76140a3565b60200260200101906001600160a01b031690816001600160a01b031681525050838660018151811061292b5761292b6140a3565b6001600160a01b0392831660209182029290920101527f00000000000000000000000000000000000000000000000000000000000000008116908616148015906129a75750836001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614155b15612a01577f0000000000000000000000000000000000000000000000000000000000000000876002815181106129e0576129e06140a3565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6004546001600160a01b03163314801590612a2757506005546001600160a01b03163314155b15612add5780612a625760405162461bcd60e51b81526020600482015260066024820152650857dc1bdbdb60d21b6044820152606401610977565b6001600160a01b03851660009081526012602052604090205460ff168015612aa257506001600160a01b03841660009081526012602052604090205460ff165b612add5760405162461bcd60e51b815260206004820152600c60248201526b085dda1a5d195b1a5cdd195960a21b6044820152606401610977565b60008a6001600160a01b03166345a1de796040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612b1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b439190614086565b90506001600160a01b038116612bc9576002546040516319217c3160e21b81526001600160a01b0390911690636485f0c490612b83908b90600401613fc5565b6020604051808303816000875af1158015612ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc69190614086565b90505b6000836001600160a01b0316631ede5a8e8d847f0000000000000000000000000000000000000000000000000000000000000000878e6040518663ffffffff1660e01b8152600401612c1f95949392919061423e565b6020604051808303816000875af1158015612c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c629190614086565b60405163095ea7b360e01b81526001600160a01b03808316600483015260001960248301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015612cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cfb91906141d2565b5081600b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600960008e6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b600a6000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600160116000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160136000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550612e5f8161388b565b6001600160a01b03811660009081526019602052604090205415612e97576001600160a01b0381166000908152601960205260408120555b600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b038e161790558215612f9e576040516305916c7f60e51b8152600160048201526001600160a01b038d169063b22d8fe090602401600060405180830381600087803b158015612f2a57600080fd5b505af1158015612f3e573d6000803e3d6000fd5b5050604051630ccccab360e11b81526001600160a01b0385811660048301528f16925063199995669150602401600060405180830381600087803b158015612f8557600080fd5b505af1158015612f99573d6000803e3d6000fd5b505050505b6040513381526001600160a01b03808e1691848216918416907f48d3c521fd0d5541640f58c6d6381eed7cb2e8c9df421ae165a4f4c2d221ee0d9060200160405180910390a49b9a5050505050505050505050565b6004546001600160a01b0316331461300a57600080fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b606060008054806020026020016040519081016040528092919081815260200182805480156121c1576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116121a3575050505050905090565b604080518481526020810183905233916001600160a01b038516917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb5679101612242565b6004546001600160a01b031633146130e657600080fd5b611c1681613a53565b6000818152600e6020526040812080549091805b828110156132d757600084828154811061311f5761311f6140a3565b6000918252602080832090910154888352600d825260408084206001600160a01b039092168085529190925291205490915080156132c2576001600160a01b0380831660009081526009602052604090205461317b911661388b565b6001600160a01b0382166000908152600c6020526040812080548392906131a3908490614285565b90915550506000878152600d602090815260408083206001600160a01b0386168452909152812080548392906131da908490614285565b9091555050801561327b576001600160a01b0382811660009081526009602090815260408083205484168352600b9091529081902054905163278afc8b60e21b815260048101849052602481018a9052911690639e2bf22c90604401600060405180830381600087803b15801561325057600080fd5b505af1158015613264573d6000803e3d6000fd5b50505050808461327491906141f4565b9350613288565b6132858185614285565b93505b60408051888152602081018390527fa9f3ca5f8a9e1580edb2741e0ba560084ec72e0067ba3423f9e9327a176882db910160405180910390a15b505080806132cf906140f3565b915050613103565b5080600660008282546132ea9190614285565b90915550506000848152600f60209081526040808320839055600e9091528120611dc891613ac2565b61331c836130ef565b81516040516339f890b560e21b8152600481018590526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e7e242d490602401602060405180830381865afa158015613386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133aa919061420c565b90506000806000805b858110156133f4578681815181106133cd576133cd6140a3565b6020026020010151846133e091906141f4565b9350806133ec816140f3565b9150506133b3565b5060005b85811015613674576000888281518110613414576134146140a3565b6020908102919091018101516001600160a01b038082166000908152600984526040808220549092168082526011909452205490925060ff161561365f576001600160a01b03811660009081526013602052604090205460ff1661348a5760405162461bcd60e51b81526004016109779061405a565b600086888b86815181106134a0576134a06140a3565b60200260200101516134b2919061417c565b6134bc919061415a565b60008d8152600d602090815260408083206001600160a01b0388168452909152902054909150156134ec57600080fd5b806000036134f957600080fd5b6135028261388b565b60008c8152600e6020908152604080832080546001810182559084528284200180546001600160a01b0319166001600160a01b0388169081179091558352600c909152812080548392906135579084906141f4565b909155505060008c8152600d602090815260408083206001600160a01b03871684529091528120805483929061358e9084906141f4565b90915550506001600160a01b038083166000908152600b60205260409081902054905163f320772360e01b815260048101849052602481018f905291169063f320772390604401600060405180830381600087803b1580156135ef57600080fd5b505af1158015613603573d6000803e3d6000fd5b50505050808561361391906141f4565b945061361f81876141f4565b604080518e81526020810184905291975033917fea66f58e474bc09f580000e81f31b334d171db387d0c6098ba47bd897741679b910160405180910390a2505b5050808061366c906140f3565b9150506133f8565b5080156136f65760405163fd4a77f160e01b8152600481018990527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063fd4a77f190602401600060405180830381600087803b1580156136dd57600080fd5b505af11580156136f1573d6000803e3d6000fd5b505050505b816006600082825461370891906141f4565b90915550506000978852600f602052604090972096909655505050505050565b6000846001600160a01b03163b1161373f57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916137a3919061429c565b6000604051808303816000865af19150503d80600081146137e0576040519150601f19603f3d011682016040523d82523d6000602084013e6137e5565b606091505b509150915081801561380f57508051158061380f57508080602001905181019061380f91906141d2565b61100f57600080fd5b6001600160a01b03811660009081526012602052604090205460ff161561383e57600080fd5b6001600160a01b038116600081815260126020526040808220805460ff191660011790555133917f6661a7108aecd07864384529117d96c319c1163e3010c01390f6b704726e07de91a350565b6001600160a01b038082166000908152600a6020908152604080832054909316808352600c90915291902054801561396b576001600160a01b0383166000908152601860205260408120805460175491829055916138e98383614285565b9050801561100f576000670de0b6b3a7640000613906838761417c565b613910919061415a565b6001600160a01b03881660009081526013602052604090205490915060ff1615613962576001600160a01b0387166000908152601960205260408120805483929061395c9084906141f4565b90915550505b50505050505050565b6017546001600160a01b038416600090815260186020526040902055505050565b6001600160a01b038281166000908152600b6020908152604080832080546001600160a01b031916868616908117909155600a90925291829020549151630ccccab360e11b815260048101919091529116908190631999956690602401600060405180830381600087803b158015613a0357600080fd5b505af1925050508015613a14575060015b506040516001600160a01b03838116825284169033907ebe62e0582fada1d424f6ac546ee748e1e6066b71cabe22576ef6b8b279cca590602001612242565b6001600160a01b03811660009081526012602052604090205460ff16613a7857600080fd5b6001600160a01b038116600081815260126020526040808220805460ff191690555133917fd36871fdf6981136f3ac0564927005901eda06f7a9dff1e8b2a1d7846b8ebb5091a350565b5080546000825590600052602060002090810190611c1691905b80821115613af05760008155600101613adc565b5090565b6001600160a01b0381168114611c1657600080fd5b600060208284031215613b1b57600080fd5b8135613b2681613af4565b9392505050565b600060208284031215613b3f57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613b8557613b85613b46565b604052919050565b600067ffffffffffffffff821115613ba757613ba7613b46565b5060051b60200190565b600082601f830112613bc257600080fd5b81356020613bd7613bd283613b8d565b613b5c565b82815260059290921b84018101918181019086841115613bf657600080fd5b8286015b84811015613c1a578035613c0d81613af4565b8352918301918301613bfa565b509695505050505050565b600082601f830112613c3657600080fd5b81356020613c46613bd283613b8d565b82815260059290921b84018101918181019086841115613c6557600080fd5b8286015b84811015613c1a57803567ffffffffffffffff811115613c895760008081fd5b613c978986838b0101613bb1565b845250918301918301613c69565b60008060408385031215613cb857600080fd5b823567ffffffffffffffff80821115613cd057600080fd5b613cdc86838701613bb1565b93506020850135915080821115613cf257600080fd5b50613cff85828601613c25565b9150509250929050565b600080600060608486031215613d1e57600080fd5b8335613d2981613af4565b92506020840135613d3981613af4565b929592945050506040919091013590565b60008060408385031215613d5d57600080fd5b823591506020830135613d6f81613af4565b809150509250929050565b60008060408385031215613d8d57600080fd5b823567ffffffffffffffff811115613da457600080fd5b613db085828601613bb1565b9250506020830135613d6f81613af4565b600060208284031215613dd357600080fd5b813567ffffffffffffffff811115613dea57600080fd5b613df684828501613bb1565b949350505050565b60008060408385031215613e1157600080fd5b8235613e1c81613af4565b91506020830135613d6f81613af4565b60008060408385031215613e3f57600080fd5b50508035926020909101359150565b600080600060608486031215613e6357600080fd5b833567ffffffffffffffff80821115613e7b57600080fd5b613e8787838801613bb1565b94506020860135915080821115613e9d57600080fd5b50613eaa86828701613c25565b925050604084013590509250925092565b60008083601f840112613ecd57600080fd5b50813567ffffffffffffffff811115613ee557600080fd5b6020830191508360208260051b8501011115613f0057600080fd5b9250929050565b600080600080600060608688031215613f1f57600080fd5b85359450602086013567ffffffffffffffff80821115613f3e57600080fd5b613f4a89838a01613ebb565b90965094506040880135915080821115613f6357600080fd5b50613f7088828901613ebb565b969995985093965092949392505050565b600081518084526020808501945080840160005b83811015613fba5781516001600160a01b031687529582019590820190600101613f95565b509495945050505050565b602081526000613b266020830184613f81565b600080600060608486031215613fed57600080fd5b833592506020840135613d3981613af4565b6000806040838503121561401257600080fd5b823561401d81613af4565b946020939093013593505050565b6020808252601590820152741b9bdd08195b595c99d95b98de4818dbdd5b98da5b605a1b604082015260600190565b60208082526012908201527119d85d59d948185b1c9958591e481919585960721b604082015260600190565b60006020828403121561409857600080fd5b8151613b2681613af4565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0383168152604060208201819052600090613df690830184613f81565b634e487b7160e01b600052601160045260246000fd5b600060018201614105576141056140dd565b5060010190565b6020808252601490820152731b9bdd08195b595c99d95b98de50dbdd5b98da5b60621b604082015260600190565b60208082526006908201526506164647220360d41b604082015260600190565b60008261417757634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614196576141966140dd565b500290565b6020808252601e908201527f544f4b454e5f414c52454144595f564f5445445f544849535f45504f43480000604082015260600190565b6000602082840312156141e457600080fd5b81518015158114613b2657600080fd5b60008219821115614207576142076140dd565b500190565b60006020828403121561421e57600080fd5b5051919050565b828152604060208201526000613df66040830184613f81565b6001600160a01b038681168252858116602083015284166040820152821515606082015260a06080820181905260009061427a90830184613f81565b979650505050505050565b600082821015614297576142976140dd565b500390565b6000825160005b818110156142bd57602081860181015185830152016142a3565b818111156142cc576000828501525b50919091019291505056fea26469706673582212207375aa6f49e44d3af55a616eaec586e1c6a3943305e979654cb51aab5c56554364736f6c634300080d003300000000000000000000000091f85d68b413de823684c891db515b0390a02512000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd695100000000000000000000000096600b4293da981554805ccbab88b48b4c54faa80000000000000000000000006538fcbbdda7cbe8e89e6c502f9a599de411d32a

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103d05760003560e01c80637778960e116101ff578063ae21c4cb1161011a578063daa168bd116100ad578063e9f6adfa1161007c578063e9f6adfa146108ff578063ea94ee4414610907578063f3594be01461091a578063f9f92be41461093a57600080fd5b8063daa168bd146108c6578063dcd9e47a146108d9578063e4fc6b6d146105c7578063e586875f146108ec57600080fd5b8063c448c78d116100e9578063c448c78d14610878578063cbadada414610880578063d23254b414610888578063d560b0d7146108b357600080fd5b8063ae21c4cb1461080b578063b52a315114610834578063b9a09fd51461083c578063c42cf5351461086557600080fd5b80639fb5dc0511610192578063a86a366d11610161578063a86a366d146107af578063a9b5aa7e146107c2578063aa79979b146107d5578063ac4afa38146107f857600080fd5b80639fb5dc0514610754578063a61c713a14610769578063a7cac8461461077c578063a82029f91461079c57600080fd5b806396c82e57116101ce57806396c82e57146107125780639b19251a1461071b5780639b6a9d721461072e5780639edfd4601461074157600080fd5b80637778960e146106a557806379e93824146106b85780637ac09bf7146106d85780638dd598fb146106eb57600080fd5b8063402914f5116102ef57806363453ae111610282578063698473e311610251578063698473e3146106595780636ecbe38a1461066c5780637625391a1461067f5780637715ee751461069257600080fd5b806363453ae1146105fd5780636566afad14610610578063657021fb14610623578063672383c41461064657600080fd5b806347b3c6ba116102be57806347b3c6ba146105c757806353d78693146105cf578063577387b5146105d75780636138889b146105ea57600080fd5b8063402914f514610579578063411b1f7714610599578063462d0b2e146105ac578063470f4985146105bf57600080fd5b806320b1cb6f1161036757806332145f901161033657806332145f901461051d57806338752a9d146105305780633af32abf146105435780633c6b16ab1461056657600080fd5b806320b1cb6f146104d157806323e1af42146104e457806327e5c823146104f7578063310bd74b1461050a57600080fd5b80630f04ba67116103a35780630f04ba67146104565780631703e5f914610489578063173de600146104ac5780631f7b6d32146104bf57600080fd5b806303c39b00146103d557806306d6a1b2146103ea57806307546172146104305780630c340a2414610443575b600080fd5b6103e86103e3366004613b09565b61094d565b005b6104136103f8366004613b09565b600a602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b600354610413906001600160a01b031681565b600454610413906001600160a01b031681565b610479610464366004613b09565b60146020526000908152604090205460ff1681565b6040519015158152602001610427565b610479610497366004613b09565b60136020526000908152604090205460ff1681565b6104136104ba366004613b2d565b610ad1565b6007545b604051908152602001610427565b6103e86104df366004613ca5565b610afb565b6104136104f2366004613b2d565b610bb1565b6103e8610505366004613d09565b610bc1565b6103e8610518366004613b2d565b610eb2565b6103e861052b366004613b2d565b611017565b600254610413906001600160a01b031681565b610479610551366004613b09565b60126020526000908152604090205460ff1681565b6103e8610574366004613b2d565b611265565b6104c3610587366004613b09565b60196020526000908152604090205481565b6103e86105a7366004613d4a565b611338565b6103e86105ba366004613d7a565b6113f6565b6000546104c3565b6103e8611471565b6103e8611482565b6103e86105e5366004613b2d565b611491565b6103e86105f8366004613dc1565b6116ea565b6103e861060b366004613b09565b61172e565b6103e861061e366004613dfe565b611956565b610479610631366004613b09565b60156020526000908152604090205460ff1681565b610413610654366004613b2d565b611b07565b6103e8610667366004613d4a565b611b17565b6103e861067a366004613b09565b611c0d565b6103e861068d366004613e2c565b611c19565b6103e86106a0366004613e4e565b611c7f565b600554610413906001600160a01b031681565b6104c36106c6366004613b2d565b600f6020526000908152604090205481565b6103e86106e6366004613f07565b611dce565b6104137f00000000000000000000000091f85d68b413de823684c891db515b0390a0251281565b6104c360065481565b6103e8610729366004613b09565b611f36565b6103e861073c366004613e2c565b611f56565b6103e861074f366004613b09565b611fbc565b61075c612169565b6040516104279190613fc5565b6103e8610777366004613fd8565b6121cb565b6104c361078a366004613b09565b600c6020526000908152604090205481565b6103e86107aa366004613b09565b61224f565b6104136107bd366004613e2c565b6123ea565b6103e86107d0366004613b09565b612422565b6104796107e3366004613b09565b60116020526000908152604090205460ff1681565b610413610806366004613b2d565b6124a2565b610413610819366004613b09565b600b602052600090815260409020546001600160a01b031681565b6001546104c3565b61041361084a366004613b09565b6009602052600090815260409020546001600160a01b031681565b6103e8610873366004613b09565b6124b2565b6008546104c3565b61075c6124eb565b6104c3610896366004613d4a565b600d60209081526000928352604080842090915290825290205481565b6103e86108c1366004613dc1565b61254b565b6103e86108d4366004613dfe565b61258b565b6104136108e7366004613fff565b6125e4565b6103e86108fa366004613b09565b612ff3565b61075c61302c565b6103e8610915366004613fd8565b61308c565b6104c3610928366004613b2d565b60106020526000908152604090205481565b6103e8610948366004613b09565b6130cf565b6005546001600160a01b031633146109805760405162461bcd60e51b81526004016109779061402b565b60405180910390fd5b6001600160a01b03811660009081526013602052604090205460ff166109b85760405162461bcd60e51b81526004016109779061405a565b6001600160a01b0381166000818152601360209081526040808320805460ff19169055601982528083208390558051633a4b66f160e01b81529051929392633a4b66f1926004808401939192918290030181865afa158015610a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a429190614086565b6040516305916c7f60e51b8152600060048201529091506001600160a01b0382169063b22d8fe090602401600060405180830381600087803b158015610a8757600080fd5b505af1925050508015610a98575060015b506040516001600160a01b038316907f745308c08240010b7d5acf1a287fddff3bd591868cf1bc876f5f4ce80da4b22790600090a25050565b60088181548110610ae157600080fd5b6000918252602090912001546001600160a01b0316905081565b60005b8251811015610bac57828181518110610b1957610b196140a3565b60200260200101516001600160a01b03166331279d3d33848481518110610b4257610b426140a3565b60200260200101516040518363ffffffff1660e01b8152600401610b679291906140b9565b600060405180830381600087803b158015610b8157600080fd5b505af1158015610b95573d6000803e3d6000fd5b505050508080610ba4906140f3565b915050610afe565b505050565b60018181548110610ae157600080fd5b6005546001600160a01b03163314610beb5760405162461bcd60e51b81526004016109779061410c565b6001600160a01b038316610c115760405162461bcd60e51b81526004016109779061413a565b6001600160a01b038216610c375760405162461bcd60e51b81526004016109779061413a565b60005481108015610c49575060015481105b610c895760405162461bcd60e51b81526020600482015260116024820152705f706f73206f7574206f662072616e676560781b6044820152606401610977565b6001600160a01b03831660009081526014602052604090205460ff16610ce15760405162461bcd60e51b815260206004820152600d60248201526c666163746f72792066616c736560981b6044820152606401610977565b6001600160a01b03821660009081526015602052604090205460ff16610d385760405162461bcd60e51b815260206004820152600c60248201526b672e666163742066616c736560a01b6044820152606401610977565b6000808281548110610d4c57610d4c6140a3565b6000918252602082200154600180546001600160a01b0390921693509084908110610d7957610d796140a3565b60009182526020808320909101546001600160a01b038581168452601483526040808520805460ff1990811690915591909216808552601590935290832080549091169055815490925086919085908110610dd657610dd66140a3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360018481548110610e1857610e186140a3565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055878316808352601482526040808420805460ff199081166001908117909255958a168086526015855294829020805490961617909455925186815291929133917f3633a7f9c2b4cc760354edf1370d3cd58da11f6fbf1ef237641548407a4bd6f8910160405180910390a45050505050565b600081815260106020526040902054819062093a80610ed1814261415a565b610edb919061417c565b11610ef85760405162461bcd60e51b81526004016109779061419b565b60405163430c208160e01b8152336004820152602481018390527f00000000000000000000000091f85d68b413de823684c891db515b0390a025126001600160a01b03169063430c208190604401602060405180830381865afa158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8791906141d2565b610f9057600080fd5b610f99826130ef565b60405163c1f0fb9f60e01b8152600481018390527f00000000000000000000000091f85d68b413de823684c891db515b0390a025126001600160a01b03169063c1f0fb9f90602401600060405180830381600087803b158015610ffb57600080fd5b505af115801561100f573d6000803e3d6000fd5b505050505050565b600081815260106020526040902054819062093a80611036814261415a565b611040919061417c565b1161105d5760405162461bcd60e51b81526004016109779061419b565b60405163430c208160e01b8152336004820152602481018390527f00000000000000000000000091f85d68b413de823684c891db515b0390a025126001600160a01b03169063430c208190604401602060405180830381865afa1580156110c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ec91906141d2565b8061110157506004546001600160a01b031633145b61110a57600080fd5b6000828152601060209081526040808320429055600e82528083208054825181850281018501909352808352919290919083018282801561117457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611156575b5050505050905060008151905060008167ffffffffffffffff81111561119c5761119c613b46565b6040519080825280602002602001820160405280156111c5578160200160208202803683370190505b50905060005b8281101561125257600d600087815260200190815260200160002060008583815181106111fa576111fa6140a3565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611235576112356140a3565b60209081029190910101528061124a816140f3565b9150506111cb565b5061125e858483613313565b5050505050565b6112917f000000000000000000000000d386a121991e51eab5e3433bf5b1cf4c8884b47a333084613728565b6006546000906112a983670de0b6b3a764000061417c565b6112b3919061415a565b905080156112d35780601760008282546112cd91906141f4565b90915550505b6040518281526001600160a01b037f000000000000000000000000d386a121991e51eab5e3433bf5b1cf4c8884b47a169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf50826906020015b60405180910390a35050565b81156113b957604051634c35bec560e11b8152600481018390527f00000000000000000000000091f85d68b413de823684c891db515b0390a025126001600160a01b03169063986b7d8a90602401600060405180830381600087803b1580156113a057600080fd5b505af11580156113b4573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907fae268d9aab12f3605f58efd74fd3801fa812b03fdb44317eb70f46dff0e19e229060200161132c565b6003546001600160a01b0316331461140d57600080fd5b60005b825181101561144d5761143b83828151811061142e5761142e6140a3565b6020026020010151613818565b80611445816140f3565b915050611410565b50600380546001600160a01b0319166001600160a01b039290921691909117905550565b60075461148090600090611c19565b565b60075461148090600090611f56565b6005546001600160a01b031633146114bb5760405162461bcd60e51b81526004016109779061410c565b600054811080156114cd575060015481105b61150d5760405162461bcd60e51b81526020600482015260116024820152705f706f73206f7574206f662072616e676560781b6044820152606401610977565b6000808281548110611521576115216140a3565b6000918252602082200154600180546001600160a01b039092169350908490811061154e5761154e6140a3565b60009182526020808320909101546001600160a01b03858116845260149092526040909220549116915060ff166115b75760405162461bcd60e51b815260206004820152600d60248201526c666163746f72792066616c736560981b6044820152606401610977565b6001600160a01b03811660009081526015602052604090205460ff1661160e5760405162461bcd60e51b815260206004820152600c60248201526b672e666163742066616c736560a01b6044820152606401610977565b6000808481548110611622576116226140a3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600060018481548110611665576116656140a3565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790558483168252601481526040808320805460ff199081169091559385168352601590915280822080549093169092559051849133917f0b8a5f427e4dc8f150fa67b8072e1e0c1dd5a67cbb3c3e5e99fd9593f814f4129190a3505050565b60005b815181101561172a5761171882828151811061170b5761170b6140a3565b602002602001015161172e565b80611722816140f3565b9150506116ed565b5050565b60165460011461173d57600080fd5b60026016556003546040805163ed29fc1160e01b815290516001600160a01b039092169163ed29fc119160048082019260209290919082900301816000875af115801561178e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b2919061420c565b506117bc8161388b565b6001600160a01b0381811660008181526019602052604090819020549051634cde602960e11b81527f000000000000000000000000d386a121991e51eab5e3433bf5b1cf4c8884b47a9093166004840152916399bcc05290602401602060405180830381865afa158015611834573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611858919061420c565b811180156118725750600061187062093a808361415a565b115b1561194d576001600160a01b03828116600081815260196020526040808220919091555163b66503cf60e01b81527f000000000000000000000000d386a121991e51eab5e3433bf5b1cf4c8884b47a9092166004830152602482018390529063b66503cf90604401600060405180830381600087803b1580156118f457600080fd5b505af1158015611908573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b179060200160405180910390a35b50506001601655565b6005546001600160a01b031633146119805760405162461bcd60e51b81526004016109779061410c565b6001600160a01b0382166119a65760405162461bcd60e51b81526004016109779061413a565b6001600160a01b0381166119cc5760405162461bcd60e51b81526004016109779061413a565b6001600160a01b03811660009081526015602052604090205460ff1615611a235760405162461bcd60e51b815260206004820152600b60248201526a672e66616374207472756560a81b6044820152606401610977565b60008054600181810183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390910180546001600160a01b038087166001600160a01b03199283168117909355835480850185557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6018054918716919092168117909155818452601460209081526040808620805460ff19908116871790915583875260159092528086208054909216909417905591519192909133917f5af5acd828b04c6899aa8e9823b472c3a176605a47cae52d5acc849a12ab88bc91a45050565b60008181548110610ae157600080fd5b3360009081526011602052604090205460ff16611b3357600080fd5b3360009081526013602052604090205460ff16611b4f57600080fd5b8115611bd05760405163fbd3a29d60e01b8152600481018390527f00000000000000000000000091f85d68b413de823684c891db515b0390a025126001600160a01b03169063fbd3a29d90602401600060405180830381600087803b158015611bb757600080fd5b505af1158015611bcb573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907f60940192810a6fb3bce3fd3e2e3a13fd6ccc7605e963fb87ee971aba829989bd9060200161132c565b611c168161388b565b50565b815b81811015610bac57611c6d6009600060078481548110611c3d57611c3d6140a3565b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020541661172e565b80611c77816140f3565b915050611c1b565b60405163430c208160e01b8152336004820152602481018290527f00000000000000000000000091f85d68b413de823684c891db515b0390a025126001600160a01b03169063430c208190604401602060405180830381865afa158015611cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0e91906141d2565b611d1757600080fd5b60005b8351811015611dc857838181518110611d3557611d356140a3565b60200260200101516001600160a01b031663a7852afa83858481518110611d5e57611d5e6140a3565b60200260200101516040518363ffffffff1660e01b8152600401611d83929190614225565b600060405180830381600087803b158015611d9d57600080fd5b505af1158015611db1573d6000803e3d6000fd5b505050508080611dc0906140f3565b915050611d1a565b50505050565b600085815260106020526040902054859062093a80611ded814261415a565b611df7919061417c565b11611e145760405162461bcd60e51b81526004016109779061419b565b60405163430c208160e01b8152336004820152602481018790527f00000000000000000000000091f85d68b413de823684c891db515b0390a025126001600160a01b03169063430c208190604401602060405180830381865afa158015611e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea391906141d2565b611eac57600080fd5b838214611eb857600080fd5b6000868152601060209081526040918290204290558151868202818101830190935286815261100f9289928991899182919085019084908082843760009201919091525050604080516020808a0282810182019093528982529093508992508891829185019084908082843760009201919091525061331392505050565b6004546001600160a01b03163314611f4d57600080fd5b611c1681613818565b815b81811015610bac57611faa6009600060078481548110611f7a57611f7a6140a3565b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020541661388b565b80611fb4816140f3565b915050611f58565b6005546001600160a01b03163314611fe65760405162461bcd60e51b81526004016109779061402b565b6001600160a01b03811660009081526013602052604090205460ff1661201e5760405162461bcd60e51b81526004016109779061405a565b6001600160a01b038181166000908152600a60209081526040808320805460138452828520805460ff19908116909155600b855283862080546001600160a01b031990811690915583548116909355601185528386208054909116905560198452828520859055601884528285208590559094168084526009909252808320805490941690935591516305916c7f60e51b81526004810191909152819063b22d8fe090602401600060405180830381600087803b1580156120de57600080fd5b505af19250505080156120ef575060015b506008805460018101825560009182527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b03851690811790915560405190917f3ee2da044873b7ddb31d4960187639074c5137888f359c667b947320284709c391a25050565b606060018054806020026020016040519081016040528092919081815260200182805480156121c157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116121a3575b5050505050905090565b3360009081526011602052604090205460ff166121e757600080fd5b3360009081526013602052604090205460ff1661220357600080fd5b604080518481526020810183905233916001600160a01b038516917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a3505050565b6005546001600160a01b031633146122795760405162461bcd60e51b81526004016109779061402b565b6001600160a01b03811660009081526013602052604090205460ff16156122d85760405162461bcd60e51b8152602060048201526013602482015272676175676520616c726561647920616c69766560681b6044820152606401610977565b6001600160a01b0381166000818152601360209081526040808320805460ff191660011790558051633a4b66f160e01b81529051929392633a4b66f1926004808401939192918290030181865afa158015612337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235b9190614086565b6040516305916c7f60e51b8152600160048201529091506001600160a01b0382169063b22d8fe090602401600060405180830381600087803b1580156123a057600080fd5b505af19250505080156123b1575060015b506040516001600160a01b038316907f3b8274015fe59b73ee1fb9c5d7ad25a8f253dc8d45ebd178bfef3295240fcabd90600090a25050565b600e602052816000526040600020818154811061240657600080fd5b6000918252602090912001546001600160a01b03169150829050565b6005546001600160a01b0316331461244c5760405162461bcd60e51b81526004016109779061410c565b600280546001600160a01b0319166001600160a01b03831690811790915560405190815233907f557e0f02d402561222ba54007de263881f84edad9a3877340d06e330e3400fa89060200160405180910390a250565b60078181548110610ae157600080fd5b6004546001600160a01b031633146124c957600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b606060088054806020026020016040519081016040528092919081815260200182805480156121c1576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116121a3575050505050905090565b60005b815181101561172a5761257982828151811061256c5761256c6140a3565b602002602001015161388b565b80612583816140f3565b91505061254e565b6005546001600160a01b031633146125b55760405162461bcd60e51b81526004016109779061410c565b6001600160a01b03821660009081526011602052604090205460ff166125da57600080fd5b61172a828261398c565b6000805482106126265760405162461bcd60e51b815260206004820152600d60248201526c6761756765747970652062696760981b6044820152606401610977565b6001600160a01b0383811660009081526009602052604090205416156126775760405162461bcd60e51b815260206004820152600660248201526565786973747360d01b6044820152606401610977565b604080516003808252608082019092526000916020820160608036833750506040805160028082526060820183529394506000939092509060208301908036833701905050905060008060008087815481106126d5576126d56140a3565b6000918252602082200154600180546001600160a01b0390921693509089908110612702576127026140a3565b6000918252602090912001546001600160a01b039081169150821661272657600080fd5b6001600160a01b03811661273957600080fd5b60405163e5e31b1360e01b81526001600160a01b038a811660048301526000919084169063e5e31b1390602401602060405180830381865afa158015612783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a791906141d2565b90508015612a0157896001600160a01b0316630dfe16816040518163ffffffff1660e01b81526004016020604051808303816000875af11580156127ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128139190614086565b9450896001600160a01b031663d21220a76040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612855573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128799190614086565b9350848760008151811061288f5761288f6140a3565b60200260200101906001600160a01b031690816001600160a01b03168152505083876001815181106128c3576128c36140a3565b60200260200101906001600160a01b031690816001600160a01b03168152505084866000815181106128f7576128f76140a3565b60200260200101906001600160a01b031690816001600160a01b031681525050838660018151811061292b5761292b6140a3565b6001600160a01b0392831660209182029290920101527f000000000000000000000000d386a121991e51eab5e3433bf5b1cf4c8884b47a8116908616148015906129a75750836001600160a01b03167f000000000000000000000000d386a121991e51eab5e3433bf5b1cf4c8884b47a6001600160a01b031614155b15612a01577f000000000000000000000000d386a121991e51eab5e3433bf5b1cf4c8884b47a876002815181106129e0576129e06140a3565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6004546001600160a01b03163314801590612a2757506005546001600160a01b03163314155b15612add5780612a625760405162461bcd60e51b81526020600482015260066024820152650857dc1bdbdb60d21b6044820152606401610977565b6001600160a01b03851660009081526012602052604090205460ff168015612aa257506001600160a01b03841660009081526012602052604090205460ff165b612add5760405162461bcd60e51b815260206004820152600c60248201526b085dda1a5d195b1a5cdd195960a21b6044820152606401610977565b60008a6001600160a01b03166345a1de796040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612b1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b439190614086565b90506001600160a01b038116612bc9576002546040516319217c3160e21b81526001600160a01b0390911690636485f0c490612b83908b90600401613fc5565b6020604051808303816000875af1158015612ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc69190614086565b90505b6000836001600160a01b0316631ede5a8e8d847f00000000000000000000000091f85d68b413de823684c891db515b0390a02512878e6040518663ffffffff1660e01b8152600401612c1f95949392919061423e565b6020604051808303816000875af1158015612c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c629190614086565b60405163095ea7b360e01b81526001600160a01b03808316600483015260001960248301529192507f000000000000000000000000d386a121991e51eab5e3433bf5b1cf4c8884b47a9091169063095ea7b3906044016020604051808303816000875af1158015612cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cfb91906141d2565b5081600b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600960008e6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b600a6000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600160116000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160136000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550612e5f8161388b565b6001600160a01b03811660009081526019602052604090205415612e97576001600160a01b0381166000908152601960205260408120555b600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b038e161790558215612f9e576040516305916c7f60e51b8152600160048201526001600160a01b038d169063b22d8fe090602401600060405180830381600087803b158015612f2a57600080fd5b505af1158015612f3e573d6000803e3d6000fd5b5050604051630ccccab360e11b81526001600160a01b0385811660048301528f16925063199995669150602401600060405180830381600087803b158015612f8557600080fd5b505af1158015612f99573d6000803e3d6000fd5b505050505b6040513381526001600160a01b03808e1691848216918416907f48d3c521fd0d5541640f58c6d6381eed7cb2e8c9df421ae165a4f4c2d221ee0d9060200160405180910390a49b9a5050505050505050505050565b6004546001600160a01b0316331461300a57600080fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b606060008054806020026020016040519081016040528092919081815260200182805480156121c1576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116121a3575050505050905090565b604080518481526020810183905233916001600160a01b038516917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb5679101612242565b6004546001600160a01b031633146130e657600080fd5b611c1681613a53565b6000818152600e6020526040812080549091805b828110156132d757600084828154811061311f5761311f6140a3565b6000918252602080832090910154888352600d825260408084206001600160a01b039092168085529190925291205490915080156132c2576001600160a01b0380831660009081526009602052604090205461317b911661388b565b6001600160a01b0382166000908152600c6020526040812080548392906131a3908490614285565b90915550506000878152600d602090815260408083206001600160a01b0386168452909152812080548392906131da908490614285565b9091555050801561327b576001600160a01b0382811660009081526009602090815260408083205484168352600b9091529081902054905163278afc8b60e21b815260048101849052602481018a9052911690639e2bf22c90604401600060405180830381600087803b15801561325057600080fd5b505af1158015613264573d6000803e3d6000fd5b50505050808461327491906141f4565b9350613288565b6132858185614285565b93505b60408051888152602081018390527fa9f3ca5f8a9e1580edb2741e0ba560084ec72e0067ba3423f9e9327a176882db910160405180910390a15b505080806132cf906140f3565b915050613103565b5080600660008282546132ea9190614285565b90915550506000848152600f60209081526040808320839055600e9091528120611dc891613ac2565b61331c836130ef565b81516040516339f890b560e21b8152600481018590526000907f00000000000000000000000091f85d68b413de823684c891db515b0390a025126001600160a01b03169063e7e242d490602401602060405180830381865afa158015613386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133aa919061420c565b90506000806000805b858110156133f4578681815181106133cd576133cd6140a3565b6020026020010151846133e091906141f4565b9350806133ec816140f3565b9150506133b3565b5060005b85811015613674576000888281518110613414576134146140a3565b6020908102919091018101516001600160a01b038082166000908152600984526040808220549092168082526011909452205490925060ff161561365f576001600160a01b03811660009081526013602052604090205460ff1661348a5760405162461bcd60e51b81526004016109779061405a565b600086888b86815181106134a0576134a06140a3565b60200260200101516134b2919061417c565b6134bc919061415a565b60008d8152600d602090815260408083206001600160a01b0388168452909152902054909150156134ec57600080fd5b806000036134f957600080fd5b6135028261388b565b60008c8152600e6020908152604080832080546001810182559084528284200180546001600160a01b0319166001600160a01b0388169081179091558352600c909152812080548392906135579084906141f4565b909155505060008c8152600d602090815260408083206001600160a01b03871684529091528120805483929061358e9084906141f4565b90915550506001600160a01b038083166000908152600b60205260409081902054905163f320772360e01b815260048101849052602481018f905291169063f320772390604401600060405180830381600087803b1580156135ef57600080fd5b505af1158015613603573d6000803e3d6000fd5b50505050808561361391906141f4565b945061361f81876141f4565b604080518e81526020810184905291975033917fea66f58e474bc09f580000e81f31b334d171db387d0c6098ba47bd897741679b910160405180910390a2505b5050808061366c906140f3565b9150506133f8565b5080156136f65760405163fd4a77f160e01b8152600481018990527f00000000000000000000000091f85d68b413de823684c891db515b0390a025126001600160a01b03169063fd4a77f190602401600060405180830381600087803b1580156136dd57600080fd5b505af11580156136f1573d6000803e3d6000fd5b505050505b816006600082825461370891906141f4565b90915550506000978852600f602052604090972096909655505050505050565b6000846001600160a01b03163b1161373f57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916137a3919061429c565b6000604051808303816000865af19150503d80600081146137e0576040519150601f19603f3d011682016040523d82523d6000602084013e6137e5565b606091505b509150915081801561380f57508051158061380f57508080602001905181019061380f91906141d2565b61100f57600080fd5b6001600160a01b03811660009081526012602052604090205460ff161561383e57600080fd5b6001600160a01b038116600081815260126020526040808220805460ff191660011790555133917f6661a7108aecd07864384529117d96c319c1163e3010c01390f6b704726e07de91a350565b6001600160a01b038082166000908152600a6020908152604080832054909316808352600c90915291902054801561396b576001600160a01b0383166000908152601860205260408120805460175491829055916138e98383614285565b9050801561100f576000670de0b6b3a7640000613906838761417c565b613910919061415a565b6001600160a01b03881660009081526013602052604090205490915060ff1615613962576001600160a01b0387166000908152601960205260408120805483929061395c9084906141f4565b90915550505b50505050505050565b6017546001600160a01b038416600090815260186020526040902055505050565b6001600160a01b038281166000908152600b6020908152604080832080546001600160a01b031916868616908117909155600a90925291829020549151630ccccab360e11b815260048101919091529116908190631999956690602401600060405180830381600087803b158015613a0357600080fd5b505af1925050508015613a14575060015b506040516001600160a01b03838116825284169033907ebe62e0582fada1d424f6ac546ee748e1e6066b71cabe22576ef6b8b279cca590602001612242565b6001600160a01b03811660009081526012602052604090205460ff16613a7857600080fd5b6001600160a01b038116600081815260126020526040808220805460ff191690555133917fd36871fdf6981136f3ac0564927005901eda06f7a9dff1e8b2a1d7846b8ebb5091a350565b5080546000825590600052602060002090810190611c1691905b80821115613af05760008155600101613adc565b5090565b6001600160a01b0381168114611c1657600080fd5b600060208284031215613b1b57600080fd5b8135613b2681613af4565b9392505050565b600060208284031215613b3f57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613b8557613b85613b46565b604052919050565b600067ffffffffffffffff821115613ba757613ba7613b46565b5060051b60200190565b600082601f830112613bc257600080fd5b81356020613bd7613bd283613b8d565b613b5c565b82815260059290921b84018101918181019086841115613bf657600080fd5b8286015b84811015613c1a578035613c0d81613af4565b8352918301918301613bfa565b509695505050505050565b600082601f830112613c3657600080fd5b81356020613c46613bd283613b8d565b82815260059290921b84018101918181019086841115613c6557600080fd5b8286015b84811015613c1a57803567ffffffffffffffff811115613c895760008081fd5b613c978986838b0101613bb1565b845250918301918301613c69565b60008060408385031215613cb857600080fd5b823567ffffffffffffffff80821115613cd057600080fd5b613cdc86838701613bb1565b93506020850135915080821115613cf257600080fd5b50613cff85828601613c25565b9150509250929050565b600080600060608486031215613d1e57600080fd5b8335613d2981613af4565b92506020840135613d3981613af4565b929592945050506040919091013590565b60008060408385031215613d5d57600080fd5b823591506020830135613d6f81613af4565b809150509250929050565b60008060408385031215613d8d57600080fd5b823567ffffffffffffffff811115613da457600080fd5b613db085828601613bb1565b9250506020830135613d6f81613af4565b600060208284031215613dd357600080fd5b813567ffffffffffffffff811115613dea57600080fd5b613df684828501613bb1565b949350505050565b60008060408385031215613e1157600080fd5b8235613e1c81613af4565b91506020830135613d6f81613af4565b60008060408385031215613e3f57600080fd5b50508035926020909101359150565b600080600060608486031215613e6357600080fd5b833567ffffffffffffffff80821115613e7b57600080fd5b613e8787838801613bb1565b94506020860135915080821115613e9d57600080fd5b50613eaa86828701613c25565b925050604084013590509250925092565b60008083601f840112613ecd57600080fd5b50813567ffffffffffffffff811115613ee557600080fd5b6020830191508360208260051b8501011115613f0057600080fd5b9250929050565b600080600080600060608688031215613f1f57600080fd5b85359450602086013567ffffffffffffffff80821115613f3e57600080fd5b613f4a89838a01613ebb565b90965094506040880135915080821115613f6357600080fd5b50613f7088828901613ebb565b969995985093965092949392505050565b600081518084526020808501945080840160005b83811015613fba5781516001600160a01b031687529582019590820190600101613f95565b509495945050505050565b602081526000613b266020830184613f81565b600080600060608486031215613fed57600080fd5b833592506020840135613d3981613af4565b6000806040838503121561401257600080fd5b823561401d81613af4565b946020939093013593505050565b6020808252601590820152741b9bdd08195b595c99d95b98de4818dbdd5b98da5b605a1b604082015260600190565b60208082526012908201527119d85d59d948185b1c9958591e481919585960721b604082015260600190565b60006020828403121561409857600080fd5b8151613b2681613af4565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0383168152604060208201819052600090613df690830184613f81565b634e487b7160e01b600052601160045260246000fd5b600060018201614105576141056140dd565b5060010190565b6020808252601490820152731b9bdd08195b595c99d95b98de50dbdd5b98da5b60621b604082015260600190565b60208082526006908201526506164647220360d41b604082015260600190565b60008261417757634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614196576141966140dd565b500290565b6020808252601e908201527f544f4b454e5f414c52454144595f564f5445445f544849535f45504f43480000604082015260600190565b6000602082840312156141e457600080fd5b81518015158114613b2657600080fd5b60008219821115614207576142076140dd565b500190565b60006020828403121561421e57600080fd5b5051919050565b828152604060208201526000613df66040830184613f81565b6001600160a01b038681168252858116602083015284166040820152821515606082015260a06080820181905260009061427a90830184613f81565b979650505050505050565b600082821015614297576142976140dd565b500390565b6000825160005b818110156142bd57602081860181015185830152016142a3565b818111156142cc576000828501525b50919091019291505056fea26469706673582212207375aa6f49e44d3af55a616eaec586e1c6a3943305e979654cb51aab5c56554364736f6c634300080d0033

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

00000000000000000000000091f85d68b413de823684c891db515b0390a02512000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd695100000000000000000000000096600b4293da981554805ccbab88b48b4c54faa80000000000000000000000006538fcbbdda7cbe8e89e6c502f9a599de411d32a

-----Decoded View---------------
Arg [0] : __ve (address): 0x91F85d68B413dE823684c891db515B0390a02512
Arg [1] : _factory (address): 0xe21Aac7F113Bd5DC2389e4d8a8db854a87fD6951
Arg [2] : _gauges (address): 0x96600B4293DA981554805cCbAB88B48B4C54fAA8
Arg [3] : _bribes (address): 0x6538fCbBdDa7cbE8E89E6c502F9A599dE411d32a

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000091f85d68b413de823684c891db515b0390a02512
Arg [1] : 000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd6951
Arg [2] : 00000000000000000000000096600b4293da981554805ccbab88b48b4c54faa8
Arg [3] : 0000000000000000000000006538fcbbdda7cbe8e89e6c502f9a599de411d32a


Deployed ByteCode Sourcemap

19001:21272:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33296:416;;;;;;:::i;:::-;;:::i;:::-;;19830:47;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;19830:47:0;;;;;;-1:-1:-1;;;;;566:32:1;;;548:51;;536:2;521:18;19830:47:0;;;;;;;;19418:21;;;;;-1:-1:-1;;;;;19418:21:0;;;19446:23;;;;;-1:-1:-1;;;;;19446:23:0;;;20557:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;775:14:1;;768:22;750:41;;738:2;723:18;20557:41:0;610:187:1;20511:39:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;19727:29;;;;;;:::i;:::-;;:::i;35664:85::-;35729:5;:12;35664:85;;;1133:25:1;;;1121:2;1106:18;35664:85:0;987:177:1;38359:224:0;;;;;;:::i;:::-;;:::i;19225:31::-;;;;;;:::i;:::-;;:::i;25132:881::-;;;;;;:::i;:::-;;:::i;26607:222::-;;;;;;:::i;:::-;;:::i;27821:554::-;;;;;;:::i;:::-;;:::i;19301:27::-;;;;;-1:-1:-1;;;;;19301:27:0;;;20459:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;36551:373;;;;;;:::i;:::-;;:::i;36501:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;35311:192;;;;;;:::i;:::-;;:::i;23308:248::-;;;;;;:::i;:::-;;:::i;35865:92::-;35910:4;35933:16;35865:92;;39406:73;;;:::i;37272:80::-;;;:::i;26021:578::-;;;;;;:::i;:::-;;:::i;39743:164::-;;;;;;:::i;:::-;;:::i;38921:477::-;;;;;;:::i;:::-;;:::i;24598:526::-;;;;;;:::i;:::-;;:::i;20655:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;19155:26;;;;;;:::i;:::-;;:::i;34754:320::-;;;;;;:::i;:::-;;:::i;37360:83::-;;;;;;:::i;:::-;;:::i;39572:163::-;;;;;;:::i;:::-;;:::i;38591:322::-;;;;;;:::i;:::-;;:::i;19509:31::-;;;;;-1:-1:-1;;;;;19509:31:0;;;20219:40;;;;;;:::i;:::-;;;;;;;;;;;;;;29902:351;;;;;;:::i;:::-;;:::i;19035:28::-;;;;;19608:23;;;;;;30261:121;;;;;;:::i;:::-;;:::i;37103:161::-;;;;;;:::i;:::-;;:::i;34117:629::-;;;;;;:::i;:::-;;:::i;35969:106::-;;;:::i;:::-;;;;;;;:::i;35082:221::-;;;;;;:::i;:::-;;:::i;19999:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;33720:389;;;;;;:::i;:::-;;:::i;20154:42::-;;;;;;:::i;:::-;;:::i;23850:183::-;;;;;;:::i;:::-;;:::i;20413:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;19663:22;;;;;;:::i;:::-;;:::i;19901:50::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;19901:50:0;;;36087:105;36163:14;:21;36087:105;;19765:41;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;19765:41:0;;;23564:128;;;;;;:::i;:::-;;:::i;36314:101::-;36388:12;:19;36314:101;;36200:102;;;:::i;20066:57::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;36932:163;;;;;;:::i;:::-;;:::i;24101:184::-;;;;;;:::i;:::-;;:::i;30897:2391::-;;;;;;:::i;:::-;;:::i;23700:142::-;;;;;;:::i;:::-;;:::i;35757:96::-;;;:::i;35511:145::-;;;;;;:::i;:::-;;:::i;20305:38::-;;;;;;:::i;:::-;;;;;;;;;;;;;;30579:121;;;;;;:::i;:::-;;:::i;33296:416::-;33374:16;;-1:-1:-1;;;;;33374:16:0;33360:10;:30;33352:64;;;;-1:-1:-1;;;33352:64:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;33435:15:0;;;;;;:7;:15;;;;;;;;33427:46;;;;-1:-1:-1;;;33427:46:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33484:15:0;;33502:5;33484:15;;;:7;:15;;;;;;;;:23;;-1:-1:-1;;33484:23:0;;;33518:9;:17;;;;;:21;;;33566:22;;-1:-1:-1;;;33566:22:0;;;;33502:5;;33484:15;33566:20;;:22;;;;;33484:15;;33566:22;;;;;;33484:15;33566:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33627:31;;-1:-1:-1;;;33627:31:0;;33652:5;33627:31;;;750:41:1;33550:38:0;;-1:-1:-1;;;;;;33627:24:0;;;;;723:18:1;;33627:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33623:47;33685:19;;-1:-1:-1;;;;;33685:19:0;;;;;;;;33341:371;33296:416;:::o;19727:29::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19727:29:0;;-1:-1:-1;19727:29:0;:::o;38359:224::-;38460:6;38455:121;38476:7;:14;38472:1;:18;38455:121;;;38519:7;38527:1;38519:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;38512:28:0;;38541:10;38553:7;38561:1;38553:10;;;;;;;;:::i;:::-;;;;;;;38512:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38492:3;;;;;:::i;:::-;;;;38455:121;;;;38359:224;;:::o;19225:31::-;;;;;;;;;;;;25132:881;23239:16;;-1:-1:-1;;;;;23239:16:0;23225:10;:30;23217:63;;;;-1:-1:-1;;;23217:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25264:26:0;::::1;25256:45;;;;-1:-1:-1::0;;;25256:45:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25320:27:0;::::1;25312:46;;;;-1:-1:-1::0;;;25312:46:0::1;;;;;;;:::i;:::-;35910:4:::0;35933:16;25377:4:::1;:22;:55;;;;-1:-1:-1::0;36163:14:0;:21;25403:4:::1;:29;25377:55;25369:85;;;::::0;-1:-1:-1;;;25369:85:0;;12295:2:1;25369:85:0::1;::::0;::::1;12277:21:1::0;12334:2;12314:18;;;12307:30;-1:-1:-1;;;12353:18:1;;;12346:47;12410:18;;25369:85:0::1;12093:341:1::0;25369:85:0::1;-1:-1:-1::0;;;;;25473:23:0;::::1;;::::0;;;:9:::1;:23;::::0;;;;;::::1;;25465:49;;;::::0;-1:-1:-1;;;25465:49:0;;12641:2:1;25465:49:0::1;::::0;::::1;12623:21:1::0;12680:2;12660:18;;;12653:30;-1:-1:-1;;;12699:18:1;;;12692:43;12752:18;;25465:49:0::1;12439:337:1::0;25465:49:0::1;-1:-1:-1::0;;;;;25533:29:0;::::1;;::::0;;;:14:::1;:29;::::0;;;;;::::1;;25525:54;;;::::0;-1:-1:-1;;;25525:54:0;;12983:2:1;25525:54:0::1;::::0;::::1;12965:21:1::0;13022:2;13002:18;;;12995:30;-1:-1:-1;;;13041:18:1;;;13034:42;13093:18;;25525:54:0::1;12781:336:1::0;25525:54:0::1;25590:13;25606:9:::0;25616:4:::1;25606:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;25648:20;;-1:-1:-1;;;;;25606:15:0;;::::1;::::0;-1:-1:-1;25606:15:0;25663:4;;25648:20;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;25679:16:0;;::::1;::::0;;:9:::1;:16:::0;;;;;;:24;;-1:-1:-1;;25679:24:0;;::::1;::::0;;;25648:20;;;::::1;25714:21:::0;;;:14:::1;:21:::0;;;;;;:29;;;;::::1;::::0;;25756:15;;25648:20;;-1:-1:-1;25775:12:0;;25648:20;25766:4;;25756:15;::::1;;;;;:::i;:::-;;;;;;;;;:32;;;;;-1:-1:-1::0;;;;;25756:32:0::1;;;;;-1:-1:-1::0;;;;;25756:32:0::1;;;;;;25823:13;25799:14;25814:4;25799:20;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:38:::0;;-1:-1:-1;;;;;;25799:38:0::1;-1:-1:-1::0;;;;;25799:38:0;;::::1;;::::0;;25848:23;;::::1;::::0;;;:9:::1;:23:::0;;;;;;:30;;-1:-1:-1;;25848:30:0;;::::1;-1:-1:-1::0;25848:30:0;;::::1;::::0;;;25889:29;;::::1;::::0;;;:14:::1;:29:::0;;;;;;:36;;;;::::1;;::::0;;;25943:62;;1133:25:1;;;25889:29:0;;25848:23;25959:10:::1;::::0;25943:62:::1;::::0;1106:18:1;25943:62:0::1;;;;;;;25245:768;;25132:881:::0;;;:::o;26607:222::-;23092:19;;;;:9;:19;;;;;;26659:8;;19369:6;23051:26;19369:6;23051:15;:26;:::i;:::-;23050:39;;;;:::i;:::-;:61;23042:104;;;;-1:-1:-1;;;23042:104:0;;;;;;;:::i;:::-;26688:58:::1;::::0;-1:-1:-1;;;26688:58:0;;26725:10:::1;26688:58;::::0;::::1;14050:51:1::0;14117:18;;;14110:34;;;26702:3:0::1;-1:-1:-1::0;;;;;26688:36:0::1;::::0;::::1;::::0;14023:18:1;;26688:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26680:67;;;::::0;::::1;;26758:16;26765:8;26758:6;:16::i;:::-;26785:36;::::0;-1:-1:-1;;;26785:36:0;;::::1;::::0;::::1;1133:25:1::0;;;26799:3:0::1;-1:-1:-1::0;;;;;26785:26:0::1;::::0;::::1;::::0;1106:18:1;;26785:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26607:222:::0;;:::o;27821:554::-;23092:19;;;;:9;:19;;;;;;27872:8;;19369:6;23051:26;19369:6;23051:15;:26;:::i;:::-;23050:39;;;;:::i;:::-;:61;23042:104;;;;-1:-1:-1;;;23042:104:0;;;;;;;:::i;:::-;27901:58:::1;::::0;-1:-1:-1;;;27901:58:0;;27938:10:::1;27901:58;::::0;::::1;14050:51:1::0;14117:18;;;14110:34;;;27915:3:0::1;-1:-1:-1::0;;;;;27901:36:0::1;::::0;::::1;::::0;14023:18:1;;27901:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:84;;;-1:-1:-1::0;27977:8:0::1;::::0;-1:-1:-1;;;;;27977:8:0::1;27963:10;:22;27901:84;27893:93;;;::::0;::::1;;27997:19;::::0;;;:9:::1;:19;::::0;;;;;;;28019:15:::1;27997:37:::0;;28076:8:::1;:18:::0;;;;;28047:47;;;;;;::::1;::::0;;;;;;;;;;;;28076:18;;28047:47;;::::1;28076:18:::0;28047:47;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;28047:47:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;28105:13;28121:9;:16;28105:32;;28148:25;28190:8;28176:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;28176:23:0::1;;28148:51;;28217:6;28212:107;28233:8;28229:1;:12;28212:107;;;28278:5;:15;28284:8;28278:15;;;;;;;;;;;:29;28294:9;28304:1;28294:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;28278:29:0::1;-1:-1:-1::0;;;;;28278:29:0::1;;;;;;;;;;;;;28264:8;28273:1;28264:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:43;28243:4;::::1;::::0;::::1;:::i;:::-;;;;28212:107;;;;28331:36;28337:8;28347:9;28358:8;28331:5;:36::i;:::-;27882:493;;;27821:554:::0;;:::o;36551:373::-;36612:58;36630:4;36636:10;36656:4;36663:6;36612:17;:58::i;:::-;36740:11;;36707:14;;36724:13;:6;36733:4;36724:13;:::i;:::-;:27;;;;:::i;:::-;36707:44;-1:-1:-1;36809:10:0;;36805:58;;36845:6;36836:5;;:15;;;;;;;:::i;:::-;;;;-1:-1:-1;;36805:58:0;36878:38;;1133:25:1;;;-1:-1:-1;;;;;36903:4:0;36878:38;;36891:10;;36878:38;;1121:2:1;1106:18;36878:38:0;;;;;;;;36601:323;36551:373;:::o;35311:192::-;35396:11;;35392:51;;35409:34;;-1:-1:-1;;;35409:34:0;;;;;1133:25:1;;;35423:3:0;-1:-1:-1;;;;;35409:25:0;;;;1106:18:1;;35409:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35392:51;35459:36;;1133:25:1;;;35475:10:0;;-1:-1:-1;;;;;35459:36:0;;;;;1121:2:1;1106:18;35459:36:0;987:177:1;23308:248:0;23413:6;;-1:-1:-1;;;;;23413:6:0;23399:10;:20;23391:29;;;;;;23436:6;23431:91;23452:7;:14;23448:1;:18;23431:91;;;23488:22;23499:7;23507:1;23499:10;;;;;;;;:::i;:::-;;;;;;;23488;:22::i;:::-;23468:3;;;;:::i;:::-;;;;23431:91;;;-1:-1:-1;23532:6:0;:16;;-1:-1:-1;;;;;;23532:16:0;-1:-1:-1;;;;;23532:16:0;;;;;;;;;;-1:-1:-1;23308:248:0:o;39406:73::-;39458:5;:12;39444:27;;39455:1;;39444:10;:27::i;:::-;39406:73::o;37272:80::-;37331:5;:12;37313:31;;37328:1;;37313:14;:31::i;26021:578::-;23239:16;;-1:-1:-1;;;;;23239:16:0;23225:10;:30;23217:63;;;;-1:-1:-1;;;23217:63:0;;;;;;;:::i;:::-;35910:4;35933:16;26107:4:::1;:22;:55;;;;-1:-1:-1::0;36163:14:0;:21;26133:4:::1;:29;26107:55;26099:85;;;::::0;-1:-1:-1;;;26099:85:0;;12295:2:1;26099:85:0::1;::::0;::::1;12277:21:1::0;12334:2;12314:18;;;12307:30;-1:-1:-1;;;12353:18:1;;;12346:47;12410:18;;26099:85:0::1;12093:341:1::0;26099:85:0::1;26195:13;26211:9:::0;26221:4:::1;26211:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;26253:20;;-1:-1:-1;;;;;26211:15:0;;::::1;::::0;-1:-1:-1;26211:15:0;26268:4;;26253:20;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;26292:16:0;;::::1;::::0;;:9:::1;:16:::0;;;;;;;;26253:20;::::1;::::0;-1:-1:-1;26292:16:0::1;;26284:42;;;::::0;-1:-1:-1;;;26284:42:0;;12641:2:1;26284:42:0::1;::::0;::::1;12623:21:1::0;12680:2;12660:18;;;12653:30;-1:-1:-1;;;12699:18:1;;;12692:43;12752:18;;26284:42:0::1;12439:337:1::0;26284:42:0::1;-1:-1:-1::0;;;;;26345:21:0;::::1;;::::0;;;:14:::1;:21;::::0;;;;;::::1;;26337:46;;;::::0;-1:-1:-1;;;26337:46:0;;12983:2:1;26337:46:0::1;::::0;::::1;12965:21:1::0;13022:2;13002:18;;;12995:30;-1:-1:-1;;;13041:18:1;;;13034:42;13093:18;;26337:46:0::1;12781:336:1::0;26337:46:0::1;26420:1;26394:9:::0;26404:4:::1;26394:15;;;;;;;;:::i;:::-;;;;;;;;;:28;;;;;-1:-1:-1::0;;;;;26394:28:0::1;;;;;-1:-1:-1::0;;;;;26394:28:0::1;;;;;;26464:1;26433:14;26448:4;26433:20;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:33:::0;;-1:-1:-1;;;;;;26433:33:0::1;-1:-1:-1::0;;;;;26433:33:0;;::::1;;::::0;;26477:16;;::::1;::::0;;:9:::1;:16:::0;;;;;;:24;;-1:-1:-1;;26477:24:0;;::::1;::::0;;;26512:21;;::::1;::::0;;:14:::1;:21:::0;;;;;;:29;;;;::::1;::::0;;;26559:32;;26586:4;;26574:10:::1;::::0;26559:32:::1;::::0;26433:20;26559:32:::1;26088:511;;26021:578:::0;:::o;39743:164::-;39814:6;39809:91;39830:7;:14;39826:1;:18;39809:91;;;39866:22;39877:7;39885:1;39877:10;;;;;;;;:::i;:::-;;;;;;;39866;:22::i;:::-;39846:3;;;;:::i;:::-;;;;39809:91;;;;39743:164;:::o;38921:477::-;22858:9;;22871:1;22858:14;22850:23;;;;;;22896:1;22884:9;:13;38988:6:::1;::::0;38980:31:::1;::::0;;-1:-1:-1;;;38980:31:0;;;;-1:-1:-1;;;;;38988:6:0;;::::1;::::0;38980:29:::1;::::0;:31:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;38988:6:::1;::::0;38980:31:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39022:18;39033:6;39022:10;:18::i;:::-;-1:-1:-1::0;;;;;39108:17:0;;::::1;39090:15;39108:17:::0;;;:9:::1;:17;::::0;;;;;;;39153:25;;-1:-1:-1;;;39153:25:0;;39173:4:::1;566:32:1::0;;;39153:25:0::1;::::0;::::1;548:51:1::0;39108:17:0;39153:19:::1;::::0;521:18:1;;39153:25:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39140:10;:38;:67;;;;-1:-1:-1::0;39206:1:0::1;39182:21;19369:6;39182:10:::0;:21:::1;:::i;:::-;:25;39140:67;39136:255;;;-1:-1:-1::0;;;;;39224:17:0;;::::1;39244:1;39224:17:::0;;;:9:::1;:17;::::0;;;;;:21;;;;39260:51;-1:-1:-1;;;39260:51:0;;39294:4:::1;14068:32:1::0;;;39260:51:0::1;::::0;::::1;14050::1::0;14117:18;;;14110:34;;;39224:17:0;39260:33:::1;::::0;14023:18:1;;39260:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;39331:48:0::1;::::0;1133:25:1;;;-1:-1:-1;;;;;39331:48:0;::::1;::::0;-1:-1:-1;39348:10:0::1;::::0;-1:-1:-1;39331:48:0::1;::::0;1121:2:1;1106:18;39331:48:0::1;;;;;;;39136:255;-1:-1:-1::0;;22932:1:0;22920:9;:13;38921:477::o;24598:526::-;23239:16;;-1:-1:-1;;;;;23239:16:0;23225:10;:30;23217:63;;;;-1:-1:-1;;;23217:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24712:26:0;::::1;24704:45;;;;-1:-1:-1::0;;;24704:45:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24768:27:0;::::1;24760:46;;;;-1:-1:-1::0;;;24760:46:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24826:29:0;::::1;;::::0;;;:14:::1;:29;::::0;;;;;::::1;;24825:30;24817:54;;;::::0;-1:-1:-1;;;24817:54:0;;14961:2:1;24817:54:0::1;::::0;::::1;14943:21:1::0;15000:2;14980:18;;;14973:30;-1:-1:-1;;;15019:18:1;;;15012:41;15070:18;;24817:54:0::1;14759:335:1::0;24817:54:0::1;24884:9;:28:::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;24884:28:0;;::::1;-1:-1:-1::0;;;;;;24884:28:0;;::::1;::::0;::::1;::::0;;;24923:34;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;24968:23;;;:9:::1;24884:28;24968:23:::0;;;;;;;:30;;-1:-1:-1;;24968:30:0;;::::1;::::0;::::1;::::0;;;25009:29;;;:14:::1;:29:::0;;;;;;:36;;;;::::1;::::0;;::::1;::::0;;25063:53;;24923:34;;24884:28;;25076:10:::1;::::0;25063:53:::1;::::0;::::1;24598:526:::0;;:::o;19155:26::-;;;;;;;;;;;;34754:320;34849:10;34841:19;;;;:7;:19;;;;;;;;34833:28;;;;;;34888:10;34880:19;;;;:7;:19;;;;;;;;34872:28;;;;;;34967:11;;34963:51;;34980:34;;-1:-1:-1;;;34980:34:0;;;;;1133:25:1;;;34994:3:0;-1:-1:-1;;;;;34980:25:0;;;;1106:18:1;;34980:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34963:51;35030:36;;1133:25:1;;;35046:10:0;;-1:-1:-1;;;;;35030:36:0;;;;;1121:2:1;1106:18;35030:36:0;987:177:1;37360:83:0;37417:18;37428:6;37417:10;:18::i;:::-;37360:83;:::o;39572:163::-;39649:5;39635:93;39660:6;39656:1;:10;39635:93;;;39688:28;39699:6;:16;39706:5;39712:1;39706:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;39706:8:0;;;39699:16;;;;;;;;;;;;;;;;;39688:10;:28::i;:::-;39668:3;;;;:::i;:::-;;;;39635:93;;38591:322;38709:58;;-1:-1:-1;;;38709:58:0;;38746:10;38709:58;;;14050:51:1;14117:18;;;14110:34;;;38723:3:0;-1:-1:-1;;;;;38709:36:0;;;;14023:18:1;;38709:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38701:67;;;;;;38784:6;38779:127;38800:7;:14;38796:1;:18;38779:127;;;38843:7;38851:1;38843:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;38836:36:0;;38873:8;38883:7;38891:1;38883:10;;;;;;;;:::i;:::-;;;;;;;38836:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38816:3;;;;;:::i;:::-;;;;38779:127;;;;38591:322;;;:::o;29902:351::-;23092:19;;;;:9;:19;;;;;;30011:7;;19369:6;23051:26;19369:6;23051:15;:26;:::i;:::-;23050:39;;;;:::i;:::-;:61;23042:104;;;;-1:-1:-1;;;23042:104:0;;;;;;;:::i;:::-;30039:57:::1;::::0;-1:-1:-1;;;30039:57:0;;30076:10:::1;30039:57;::::0;::::1;14050:51:1::0;14117:18;;;14110:34;;;30053:3:0::1;-1:-1:-1::0;;;;;30039:36:0::1;::::0;::::1;::::0;14023:18:1;;30039:57:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30031:66;;;::::0;::::1;;30116:35:::0;;::::1;30108:44;;;::::0;::::1;;30163:18;::::0;;;:9:::1;:18;::::0;;;;;;;;30184:15:::1;30163:36:::0;;30210:35;;;;::::1;::::0;;;;;;;;;;;::::1;::::0;30173:7;;30225:9;;;;;;30210:35;;::::1;::::0;30225:9;;30210:35;30225:9;30210:35;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;;30210:35:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;30236:8:0;;-1:-1:-1;30236:8:0;;;;30210:35;::::1;::::0;30236:8;;30210:35;30236:8;30210:35;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;30210:5:0::1;::::0;-1:-1:-1;;;30210:35:0:i:1;30261:121::-:0;30336:8;;-1:-1:-1;;;;;30336:8:0;30322:10;:22;30314:31;;;;;;30356:18;30367:6;30356:10;:18::i;37103:161::-;37181:5;37167:90;37192:3;37188:1;:7;37167:90;;;37217:28;37228:6;:16;37235:5;37241:1;37235:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;37235:8:0;;;37228:16;;;;;;;;;;;;;;;;;37217:10;:28::i;:::-;37197:3;;;;:::i;:::-;;;;37167:90;;34117:629;34201:16;;-1:-1:-1;;;;;34201:16:0;34187:10;:30;34179:64;;;;-1:-1:-1;;;34179:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34262:15:0;;;;;;:7;:15;;;;;;;;34254:46;;;;-1:-1:-1;;;34254:46:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34329:20:0;;;34313:13;34329:20;;;:12;:20;;;;;;;;;;34369:7;:15;;;;;34362:22;;-1:-1:-1;;34362:22:0;;;;;;34402:15;:23;;;;;34395:30;;-1:-1:-1;;;;;;34395:30:0;;;;;;34436:27;;;;;;;34481:7;:15;;;;;34474:22;;;;;;;34514:9;:17;;;;;34507:24;;;34549:11;:19;;;;;34542:26;;;34329:20;;;34586:13;;;:6;:13;;;;;;34579:20;;;;;;;;34614:31;;-1:-1:-1;;;34614:31:0;;;;;750:41:1;;;;34329:20:0;;34614:24;;723:18:1;;34614:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34610:47;34669:12;:25;;;;;;;-1:-1:-1;34669:25:0;;;;;;;-1:-1:-1;;;;;;34669:25:0;-1:-1:-1;;;;;34669:25:0;;;;;;;;34712:26;;34669:25;;34712:26;;;34168:578;34117:629;:::o;35969:106::-;36018:16;36053:14;36046:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36046:21:0;;;;;;;;;;;;;;;;;;;;;;;35969:106;:::o;35082:221::-;35183:10;35175:19;;;;:7;:19;;;;;;;;35167:28;;;;;;35222:10;35214:19;;;;:7;:19;;;;;;;;35206:28;;;;;;35250:45;;;15610:25:1;;;15666:2;15651:18;;15644:34;;;35267:10:0;;-1:-1:-1;;;;;35250:45:0;;;;;15583:18:1;35250:45:0;;;;;;;;35082:221;;;:::o;33720:389::-;33800:16;;-1:-1:-1;;;;;33800:16:0;33786:10;:30;33778:64;;;;-1:-1:-1;;;33778:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33862:15:0;;;;;;:7;:15;;;;;;;;33861:16;33853:48;;;;-1:-1:-1;;;33853:48:0;;15891:2:1;33853:48:0;;;15873:21:1;15930:2;15910:18;;;15903:30;-1:-1:-1;;;15949:18:1;;;15942:49;16008:18;;33853:48:0;15689:343:1;33853:48:0;-1:-1:-1;;;;;33912:15:0;;;;;;:7;:15;;;;;;;;:22;;-1:-1:-1;;33912:22:0;33930:4;33912:22;;;33961;;-1:-1:-1;;;33961:22:0;;;;33912:15;;;33961:20;;:22;;;;;33912:15;;33961:22;;;;;;33912:15;33961:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34022:30;;-1:-1:-1;;;34022:30:0;;34047:4;34022:30;;;750:41:1;33945:38:0;;-1:-1:-1;;;;;;34022:24:0;;;;;723:18:1;;34022:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34018:46;34079:22;;-1:-1:-1;;;;;34079:22:0;;;;;;;;33767:342;33720:389;:::o;20154:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20154:42:0;;-1:-1:-1;20154:42:0;;-1:-1:-1;20154:42:0:o;23850:183::-;23239:16;;-1:-1:-1;;;;;23239:16:0;23225:10;:30;23217:63;;;;-1:-1:-1;;;23217:63:0;;;;;;;:::i;:::-;23939:12:::1;:28:::0;;-1:-1:-1;;;;;;23939:28:0::1;-1:-1:-1::0;;;;;23939:28:0;::::1;::::0;;::::1;::::0;;;23983:42:::1;::::0;548:51:1;;;23999:10:0::1;::::0;23983:42:::1;::::0;536:2:1;521:18;23983:42:0::1;;;;;;;23850:183:::0;:::o;19663:22::-;;;;;;;;;;;;23564:128;23644:8;;-1:-1:-1;;;;;23644:8:0;23630:10;:22;23622:31;;;;;;23664:8;:20;;-1:-1:-1;;;;;;23664:20:0;-1:-1:-1;;;;;23664:20:0;;;;;;;;;;23564:128::o;36200:102::-;36247:16;36282:12;36275:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36275:19:0;;;;;;;;;;;;;;;;;;;;;;36200:102;:::o;36932:163::-;37002:6;36997:91;37018:7;:14;37014:1;:18;36997:91;;;37054:22;37065:7;37073:1;37065:10;;;;;;;;:::i;:::-;;;;;;;37054;:22::i;:::-;37034:3;;;;:::i;:::-;;;;36997:91;;24101:184;23239:16;;-1:-1:-1;;;;;23239:16:0;23225:10;:30;23217:63;;;;-1:-1:-1;;;23217:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24214:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;::::1;;24206:24;;;::::0;::::1;;24241:36;24259:6;24267:9;24241:17;:36::i;30897:2391::-:0;30971:7;31012:16;;30999:29;;30991:55;;;;-1:-1:-1;;;30991:55:0;;16239:2:1;30991:55:0;;;16221:21:1;16278:2;16258:18;;;16251:30;-1:-1:-1;;;16297:18:1;;;16290:43;16350:18;;30991:55:0;16037:337:1;30991:55:0;-1:-1:-1;;;;;31065:13:0;;;31090:3;31065:13;;;:6;:13;;;;;;;:29;31057:48;;;;-1:-1:-1;;;31057:48:0;;16581:2:1;31057:48:0;;;16563:21:1;16620:1;16600:18;;;16593:29;-1:-1:-1;;;16638:18:1;;;16631:36;16684:18;;31057:48:0;16379:329:1;31057:48:0;31150:16;;;31164:1;31150:16;;;;;;;;;31116:31;;31150:16;;;;;;;;-1:-1:-1;;31212:16:0;;;31226:1;31212:16;;;;;;;;31116:50;;-1:-1:-1;31177:32:0;;31212:16;;-1:-1:-1;31226:1:0;31212:16;;;;;;;;;;-1:-1:-1;31212:16:0;31177:51;;31239:14;31264;31289:16;31308:9;31318:10;31308:21;;;;;;;;:::i;:::-;;;;;;;;;;;31364:26;;-1:-1:-1;;;;;31308:21:0;;;;-1:-1:-1;31308:21:0;31379:10;;31364:26;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;31364:26:0;;;;-1:-1:-1;31409:22:0;;31401:31;;;;;;-1:-1:-1;;;;;31451:27:0;;31443:36;;;;;;31504;;-1:-1:-1;;;31504:36:0;;-1:-1:-1;;;;;566:32:1;;;31504:36:0;;;548:51:1;31490:11:0;;31504:29;;;;;;521:18:1;;31504:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31490:50;;31557:6;31553:484;;;31595:5;-1:-1:-1;;;;;31589:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31580:30;;31640:5;-1:-1:-1;;;;;31634:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31625:30;;31690:6;31670:14;31685:1;31670:17;;;;;;;;:::i;:::-;;;;;;:26;-1:-1:-1;;;;;31670:26:0;;;-1:-1:-1;;;;;31670:26:0;;;;;31731:6;31711:14;31726:1;31711:17;;;;;;;;:::i;:::-;;;;;;:26;-1:-1:-1;;;;;31711:26:0;;;-1:-1:-1;;;;;31711:26:0;;;;;31773:6;31752:15;31768:1;31752:18;;;;;;;;:::i;:::-;;;;;;:27;-1:-1:-1;;;;;31752:27:0;;;-1:-1:-1;;;;;31752:27:0;;;;;31815:6;31794:15;31810:1;31794:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31794:27:0;;;:18;;;;;;;;;:27;31935:4;:14;;;;;;;;;:32;;;31961:6;-1:-1:-1;;;;;31953:14:0;:4;-1:-1:-1;;;;;31953:14:0;;;31935:32;31931:95;;;32006:4;31986:14;32001:1;31986:17;;;;;;;;:::i;:::-;;;;;;:24;-1:-1:-1;;;;;31986:24:0;;;-1:-1:-1;;;;;31986:24:0;;;;;31931:95;32067:8;;-1:-1:-1;;;;;32067:8:0;32053:10;:22;;;;:56;;-1:-1:-1;32093:16:0;;-1:-1:-1;;;;;32093:16:0;32079:10;:30;;32053:56;32049:259;;;32193:6;32185:25;;;;-1:-1:-1;;;32185:25:0;;16915:2:1;32185:25:0;;;16897:21:1;16954:1;16934:18;;;16927:29;-1:-1:-1;;;16972:18:1;;;16965:36;17018:18;;32185:25:0;16713:329:1;32185:25:0;-1:-1:-1;;;;;32233:21:0;;;;;;:13;:21;;;;;;;;:46;;;;-1:-1:-1;;;;;;32258:21:0;;;;;;:13;:21;;;;;;;;32233:46;32225:71;;;;-1:-1:-1;;;32225:71:0;;17249:2:1;32225:71:0;;;17231:21:1;17288:2;17268:18;;;17261:30;-1:-1:-1;;;17307:18:1;;;17300:42;17359:18;;32225:71:0;17047:336:1;32225:71:0;32320:23;32352:5;-1:-1:-1;;;;;32346:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32320:54;-1:-1:-1;;;;;;32398:29:0;;32395:141;;32474:12;;32460:63;;-1:-1:-1;;;32460:63:0;;-1:-1:-1;;;;;32474:12:0;;;;32460:47;;:63;;32508:14;;32460:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32442:81;;32395:141;32546:14;32577:13;-1:-1:-1;;;;;32563:40:0;;32604:5;32611:15;32628:3;32633:6;32641:14;32563:93;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32669:44;;-1:-1:-1;;;32669:44:0;;-1:-1:-1;;;;;14068:32:1;;;32669:44:0;;;14050:51:1;-1:-1:-1;;14117:18:1;;;14110:34;32546:110:0;;-1:-1:-1;32676:4:0;32669:20;;;;;;14023:18:1;;32669:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32750:15;32724;:23;32740:6;-1:-1:-1;;;;;32724:23:0;-1:-1:-1;;;;;32724:23:0;;;;;;;;;;;;;:41;;;;;-1:-1:-1;;;;;32724:41:0;;;;;-1:-1:-1;;;;;32724:41:0;;;;;;32792:6;32776;:13;32783:5;-1:-1:-1;;;;;32776:13:0;-1:-1:-1;;;;;32776:13:0;;;;;;;;;;;;;:22;;;;;-1:-1:-1;;;;;32776:22:0;;;;;-1:-1:-1;;;;;32776:22:0;;;;;;32832:5;32809:12;:20;32822:6;-1:-1:-1;;;;;32809:20:0;-1:-1:-1;;;;;32809:20:0;;;;;;;;;;;;;:28;;;;;-1:-1:-1;;;;;32809:28:0;;;;;-1:-1:-1;;;;;32809:28:0;;;;;;32866:4;32848:7;:15;32856:6;-1:-1:-1;;;;;32848:15:0;-1:-1:-1;;;;;32848:15:0;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;32899:4;32881:7;:15;32889:6;-1:-1:-1;;;;;32881:15:0;-1:-1:-1;;;;;32881:15:0;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;32914:18;32925:6;32914:10;:18::i;:::-;-1:-1:-1;;;;;32946:17:0;;32966:1;32946:17;;;:9;:17;;;;;;:21;32943:74;;-1:-1:-1;;;;;32984:17:0;;33004:1;32984:17;;;:9;:17;;;;;:21;32943:74;33027:5;:17;;;;;;;-1:-1:-1;33027:17:0;;;;;;;;-1:-1:-1;;;;;;33027:17:0;-1:-1:-1;;;;;33027:17:0;;;;;33055:130;;;;33082:30;;-1:-1:-1;;;33082:30:0;;33107:4;33082:30;;;750:41:1;-1:-1:-1;;;;;33082:24:0;;;;;723:18:1;;33082:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33127:46:0;;-1:-1:-1;;;33127:46:0;;-1:-1:-1;;;;;566:32:1;;;33127:46:0;;;548:51:1;33127:29:0;;;-1:-1:-1;33127:29:0;;-1:-1:-1;521:18:1;;33127:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33055:130;33200:56;;33221:10;548:51:1;;-1:-1:-1;;;;;33200:56:0;;;;;;;;;;;;;536:2:1;521:18;33200:56:0;;;;;;;33274:6;30897:2391;-1:-1:-1;;;;;;;;;;;30897:2391:0:o;23700:142::-;23787:8;;-1:-1:-1;;;;;23787:8:0;23773:10;:22;23765:31;;;;;;23807:16;:27;;-1:-1:-1;;;;;;23807:27:0;-1:-1:-1;;;;;23807:27:0;;;;;;;;;;23700:142::o;35757:96::-;35801:16;35836:9;35829:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35829:16:0;;;;;;;;;;;;;;;;;;;;;;35757:96;:::o;35511:145::-;35602:46;;;15610:25:1;;;15666:2;15651:18;;15644:34;;;35620:10:0;;-1:-1:-1;;;;;35602:46:0;;;;;15583:18:1;35602:46:0;15436:248:1;30579:121:0;30654:8;;-1:-1:-1;;;;;30654:8:0;30640:10;:22;30632:31;;;;;;30674:18;30685:6;30674:10;:18::i;26837:976::-;26888:27;26918:18;;;:8;:18;;;;;26967:16;;26918:18;;26888:27;27031:656;27052:12;27048:1;:16;27031:656;;;27087:13;27103:9;27113:1;27103:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;27147:15;;;:5;:15;;;;;;-1:-1:-1;;;;;27103:12:0;;;27147:22;;;;;;;;;;27103:12;;-1:-1:-1;27190:11:0;;27186:490;;-1:-1:-1;;;;;27233:13:0;;;;;;;:6;:13;;;;;;27222:25;;27233:13;27222:10;:25::i;:::-;-1:-1:-1;;;;;27266:14:0;;;;;;:7;:14;;;;;:24;;27284:6;;27266:14;:24;;27284:6;;27266:24;:::i;:::-;;;;-1:-1:-1;;27309:15:0;;;;:5;:15;;;;;;;;-1:-1:-1;;;;;27309:22:0;;;;;;;;;:32;;27335:6;;27309:15;:32;;27335:6;;27309:32;:::i;:::-;;;;-1:-1:-1;;27364:10:0;;27360:250;;-1:-1:-1;;;;;27422:13:0;;;27406:30;27422:13;;;:6;:13;;;;;;;;;;;27406:30;;:15;:30;;;;;;;;27399:75;;-1:-1:-1;;;27399:75:0;;;;;15610:25:1;;;15651:18;;;15644:34;;;27406:30:0;;;27399:48;;15583:18:1;;27399:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27513:6;27497:22;;;;;:::i;:::-;;;27360:250;;;27568:22;27584:6;27568:22;;:::i;:::-;;;27360:250;27633:27;;;15610:25:1;;;15666:2;15651:18;;15644:34;;;27633:27:0;;15583:18:1;27633:27:0;;;;;;;27186:490;27072:615;;27066:4;;;;;:::i;:::-;;;;27031:656;;;;27720:12;27697:11;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;27768:1:0;27744:21;;;:11;:21;;;;;;;;:25;;;27787:8;:18;;;;;27780:25;;;:::i;28383:1511::-;28488:16;28495:8;28488:6;:16::i;:::-;28531;;28576:41;;-1:-1:-1;;;28576:41:0;;;;;1133:25:1;;;28515:13:0;;28590:3;-1:-1:-1;;;;;28576:31:0;;;;1106:18:1;;28576:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28558:59;;28628:24;28667:20;28702:19;28743:6;28738:94;28759:8;28755:1;:12;28738:94;;;28809:8;28818:1;28809:11;;;;;;;;:::i;:::-;;;;;;;28789:31;;;;;:::i;:::-;;-1:-1:-1;28769:3:0;;;;:::i;:::-;;;;28738:94;;;;28849:6;28844:874;28865:8;28861:1;:12;28844:874;;;28895:13;28911:9;28921:1;28911:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;28955:13:0;;;28938:14;28955:13;;;:6;:13;;;;;;;;;;28989:15;;;:7;:15;;;;;28911:12;;-1:-1:-1;28989:15:0;;28985:722;;;-1:-1:-1;;;;;29033:15:0;;;;;;:7;:15;;;;;;;;29025:46;;;;-1:-1:-1;;;29025:46:0;;;;;;;:::i;:::-;29090:19;29136:16;29126:7;29112:8;29121:1;29112:11;;;;;;;;:::i;:::-;;;;;;;:21;;;;:::i;:::-;:40;;;;:::i;:::-;29179:15;;;;:5;:15;;;;;;;;-1:-1:-1;;;;;29179:22:0;;;;;;;;;;29090:62;;-1:-1:-1;29179:27:0;29171:36;;;;;;29234:11;29249:1;29234:16;29226:25;;;;;;29270:18;29281:6;29270:10;:18::i;:::-;29309;;;;:8;:18;;;;;;;;:30;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29309:30:0;-1:-1:-1;;;;;29309:30:0;;;;;;;;29360:14;;:7;:14;;;;;:29;;29378:11;;29309:18;29360:29;;29378:11;;29360:29;:::i;:::-;;;;-1:-1:-1;;29408:15:0;;;;:5;:15;;;;;;;;-1:-1:-1;;;;;29408:22:0;;;;;;;;;:37;;29434:11;;29408:15;:37;;29434:11;;29408:37;:::i;:::-;;;;-1:-1:-1;;;;;;;29471:23:0;;;;;;;:15;:23;;;;;;;;29464:72;;-1:-1:-1;;;29464:72:0;;;;;15610:25:1;;;15651:18;;;15644:34;;;29471:23:0;;;29464:40;;15583:18:1;;29464:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29570:11;29555:26;;;;;:::i;:::-;;-1:-1:-1;29600:27:0;29616:11;29600:27;;:::i;:::-;29651:40;;;15610:25:1;;;15666:2;15651:18;;15644:34;;;29600:27:0;;-1:-1:-1;29657:10:0;;29651:40;;15583:18:1;29651:40:0;;;;;;;29006:701;28985:722;28880:838;;28875:3;;;;;:::i;:::-;;;;28844:874;;;-1:-1:-1;29732:15:0;;29728:56;;29749:35;;-1:-1:-1;;;29749:35:0;;;;;1133:25:1;;;29763:3:0;-1:-1:-1;;;;;29749:25:0;;;;1106:18:1;;29749:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29728:56;29818:12;29795:11;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;29842:21:0;;;;:11;:21;;;;;;:44;;;;-1:-1:-1;;;;;;28383:1511:0:o;39915:355::-;40046:1;40026:5;-1:-1:-1;;;;;40026:17:0;;:21;40018:30;;;;;;40115:69;;;-1:-1:-1;;;;;18404:15:1;;;40115:69:0;;;18386:34:1;18456:15;;;18436:18;;;18429:43;18488:18;;;;18481:34;;;40115:69:0;;;;;;;;;;18321:18:1;;;;40115:69:0;;;;;;;-1:-1:-1;;;;;40115:69:0;-1:-1:-1;;;40115:69:0;;;40104:81;;-1:-1:-1;;;;40104:10:0;;;;:81;;40115:69;40104:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40059:126;;;;40204:7;:57;;;;-1:-1:-1;40216:11:0;;:16;;:44;;;40247:4;40236:24;;;;;;;;;;;;:::i;:::-;40196:66;;;;;30390:181;-1:-1:-1;;;;;30455:21:0;;;;;;:13;:21;;;;;;;;30454:22;30446:31;;;;;;-1:-1:-1;;;;;30488:21:0;;;;;;:13;:21;;;;;;:28;;-1:-1:-1;;30488:28:0;30512:4;30488:28;;;30532:31;30544:10;;30532:31;;;30390:181;:::o;37451:900::-;-1:-1:-1;;;;;37523:20:0;;;37507:13;37523:20;;;:12;:20;;;;;;;;;;;;37574:14;;;:7;:14;;;;;;;37603:13;;37599:745;;-1:-1:-1;;;;;37653:19:0;;37633:17;37653:19;;;:11;:19;;;;;;;37701:5;;37765:28;;;;37653:19;37875:21;37653:19;37701:5;37875:21;:::i;:::-;37861:35;-1:-1:-1;37973:10:0;;37969:255;;38004:11;38045:4;38018:24;38036:6;38023:9;38018:24;:::i;:::-;:31;;;;:::i;:::-;-1:-1:-1;;;;;38122:15:0;;;;;;:7;:15;;;;;;38004:45;;-1:-1:-1;38122:15:0;;38118:91;;;-1:-1:-1;;;;;38162:17:0;;;;;;:9;:17;;;;;:27;;38183:6;;38162:17;:27;;38183:6;;38162:27;:::i;:::-;;;;-1:-1:-1;;38118:91:0;37985:239;37618:617;;;38455:121;38359:224;;:::o;37599:745::-;38278:5;;-1:-1:-1;;;;;38256:19:0;;;;;;:11;:19;;;;;:27;37496:855;;37451:900;:::o;24293:297::-;-1:-1:-1;;;;;24374:23:0;;;;;;;:15;:23;;;;;;;;:35;;-1:-1:-1;;;;;;24374:35:0;;;;;;;;;;24435:12;:20;;;;;;;;24470:39;;-1:-1:-1;;;24470:39:0;;;;;548:51:1;;;;24435:20:0;;;;;24470:28;;521:18:1;;24470:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24466:54;24535:47;;-1:-1:-1;;;;;566:32:1;;;548:51;;24535:47:0;;;24552:10;;24535:47;;536:2:1;521:18;24535:47:0;402:203:1;30708:181:0;-1:-1:-1;;;;;30772:21:0;;;;;;:13;:21;;;;;;;;30764:30;;;;;;-1:-1:-1;;;;;30805:21:0;;30829:5;30805:21;;;:13;:21;;;;;;:29;;-1:-1:-1;;30805:29:0;;;30850:31;30862:10;;30850:31;;;30708:181;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;:::-;386:5;150:247;-1:-1:-1;;;150:247:1:o;802:180::-;861:6;914:2;902:9;893:7;889:23;885:32;882:52;;;930:1;927;920:12;882:52;-1:-1:-1;953:23:1;;802:180;-1:-1:-1;802:180:1:o;1169:127::-;1230:10;1225:3;1221:20;1218:1;1211:31;1261:4;1258:1;1251:15;1285:4;1282:1;1275:15;1301:275;1372:2;1366:9;1437:2;1418:13;;-1:-1:-1;;1414:27:1;1402:40;;1472:18;1457:34;;1493:22;;;1454:62;1451:88;;;1519:18;;:::i;:::-;1555:2;1548:22;1301:275;;-1:-1:-1;1301:275:1:o;1581:183::-;1641:4;1674:18;1666:6;1663:30;1660:56;;;1696:18;;:::i;:::-;-1:-1:-1;1741:1:1;1737:14;1753:4;1733:25;;1581:183::o;1769:737::-;1823:5;1876:3;1869:4;1861:6;1857:17;1853:27;1843:55;;1894:1;1891;1884:12;1843:55;1930:6;1917:20;1956:4;1980:60;1996:43;2036:2;1996:43;:::i;:::-;1980:60;:::i;:::-;2074:15;;;2160:1;2156:10;;;;2144:23;;2140:32;;;2105:12;;;;2184:15;;;2181:35;;;2212:1;2209;2202:12;2181:35;2248:2;2240:6;2236:15;2260:217;2276:6;2271:3;2268:15;2260:217;;;2356:3;2343:17;2373:31;2398:5;2373:31;:::i;:::-;2417:18;;2455:12;;;;2293;;2260:217;;;-1:-1:-1;2495:5:1;1769:737;-1:-1:-1;;;;;;1769:737:1:o;2511:910::-;2575:5;2628:3;2621:4;2613:6;2609:17;2605:27;2595:55;;2646:1;2643;2636:12;2595:55;2682:6;2669:20;2708:4;2732:60;2748:43;2788:2;2748:43;:::i;2732:60::-;2826:15;;;2912:1;2908:10;;;;2896:23;;2892:32;;;2857:12;;;;2936:15;;;2933:35;;;2964:1;2961;2954:12;2933:35;3000:2;2992:6;2988:15;3012:380;3028:6;3023:3;3020:15;3012:380;;;3114:3;3101:17;3150:18;3137:11;3134:35;3131:125;;;3210:1;3239:2;3235;3228:14;3131:125;3281:68;3345:3;3340:2;3326:11;3318:6;3314:24;3310:33;3281:68;:::i;:::-;3269:81;;-1:-1:-1;3370:12:1;;;;3045;;3012:380;;3426:630;3569:6;3577;3630:2;3618:9;3609:7;3605:23;3601:32;3598:52;;;3646:1;3643;3636:12;3598:52;3686:9;3673:23;3715:18;3756:2;3748:6;3745:14;3742:34;;;3772:1;3769;3762:12;3742:34;3795:61;3848:7;3839:6;3828:9;3824:22;3795:61;:::i;:::-;3785:71;;3909:2;3898:9;3894:18;3881:32;3865:48;;3938:2;3928:8;3925:16;3922:36;;;3954:1;3951;3944:12;3922:36;;3977:73;4042:7;4031:8;4020:9;4016:24;3977:73;:::i;:::-;3967:83;;;3426:630;;;;;:::o;4061:456::-;4138:6;4146;4154;4207:2;4195:9;4186:7;4182:23;4178:32;4175:52;;;4223:1;4220;4213:12;4175:52;4262:9;4249:23;4281:31;4306:5;4281:31;:::i;:::-;4331:5;-1:-1:-1;4388:2:1;4373:18;;4360:32;4401:33;4360:32;4401:33;:::i;:::-;4061:456;;4453:7;;-1:-1:-1;;;4507:2:1;4492:18;;;;4479:32;;4061:456::o;4522:315::-;4590:6;4598;4651:2;4639:9;4630:7;4626:23;4622:32;4619:52;;;4667:1;4664;4657:12;4619:52;4703:9;4690:23;4680:33;;4763:2;4752:9;4748:18;4735:32;4776:31;4801:5;4776:31;:::i;:::-;4826:5;4816:15;;;4522:315;;;;;:::o;4842:483::-;4935:6;4943;4996:2;4984:9;4975:7;4971:23;4967:32;4964:52;;;5012:1;5009;5002:12;4964:52;5052:9;5039:23;5085:18;5077:6;5074:30;5071:50;;;5117:1;5114;5107:12;5071:50;5140:61;5193:7;5184:6;5173:9;5169:22;5140:61;:::i;:::-;5130:71;;;5251:2;5240:9;5236:18;5223:32;5264:31;5289:5;5264:31;:::i;5330:348::-;5414:6;5467:2;5455:9;5446:7;5442:23;5438:32;5435:52;;;5483:1;5480;5473:12;5435:52;5523:9;5510:23;5556:18;5548:6;5545:30;5542:50;;;5588:1;5585;5578:12;5542:50;5611:61;5664:7;5655:6;5644:9;5640:22;5611:61;:::i;:::-;5601:71;5330:348;-1:-1:-1;;;;5330:348:1:o;5683:388::-;5751:6;5759;5812:2;5800:9;5791:7;5787:23;5783:32;5780:52;;;5828:1;5825;5818:12;5780:52;5867:9;5854:23;5886:31;5911:5;5886:31;:::i;:::-;5936:5;-1:-1:-1;5993:2:1;5978:18;;5965:32;6006:33;5965:32;6006:33;:::i;6076:248::-;6144:6;6152;6205:2;6193:9;6184:7;6180:23;6176:32;6173:52;;;6221:1;6218;6211:12;6173:52;-1:-1:-1;;6244:23:1;;;6314:2;6299:18;;;6286:32;;-1:-1:-1;6076:248:1:o;6329:698::-;6481:6;6489;6497;6550:2;6538:9;6529:7;6525:23;6521:32;6518:52;;;6566:1;6563;6556:12;6518:52;6606:9;6593:23;6635:18;6676:2;6668:6;6665:14;6662:34;;;6692:1;6689;6682:12;6662:34;6715:61;6768:7;6759:6;6748:9;6744:22;6715:61;:::i;:::-;6705:71;;6829:2;6818:9;6814:18;6801:32;6785:48;;6858:2;6848:8;6845:16;6842:36;;;6874:1;6871;6864:12;6842:36;;6897:73;6962:7;6951:8;6940:9;6936:24;6897:73;:::i;:::-;6887:83;;;7017:2;7006:9;7002:18;6989:32;6979:42;;6329:698;;;;;:::o;7032:367::-;7095:8;7105:6;7159:3;7152:4;7144:6;7140:17;7136:27;7126:55;;7177:1;7174;7167:12;7126:55;-1:-1:-1;7200:20:1;;7243:18;7232:30;;7229:50;;;7275:1;7272;7265:12;7229:50;7312:4;7304:6;7300:17;7288:29;;7372:3;7365:4;7355:6;7352:1;7348:14;7340:6;7336:27;7332:38;7329:47;7326:67;;;7389:1;7386;7379:12;7326:67;7032:367;;;;;:::o;7404:841::-;7535:6;7543;7551;7559;7567;7620:2;7608:9;7599:7;7595:23;7591:32;7588:52;;;7636:1;7633;7626:12;7588:52;7672:9;7659:23;7649:33;;7733:2;7722:9;7718:18;7705:32;7756:18;7797:2;7789:6;7786:14;7783:34;;;7813:1;7810;7803:12;7783:34;7852:70;7914:7;7905:6;7894:9;7890:22;7852:70;:::i;:::-;7941:8;;-1:-1:-1;7826:96:1;-1:-1:-1;8029:2:1;8014:18;;8001:32;;-1:-1:-1;8045:16:1;;;8042:36;;;8074:1;8071;8064:12;8042:36;;8113:72;8177:7;8166:8;8155:9;8151:24;8113:72;:::i;:::-;7404:841;;;;-1:-1:-1;7404:841:1;;-1:-1:-1;8204:8:1;;8087:98;7404:841;-1:-1:-1;;;7404:841:1:o;8250:461::-;8303:3;8341:5;8335:12;8368:6;8363:3;8356:19;8394:4;8423:2;8418:3;8414:12;8407:19;;8460:2;8453:5;8449:14;8481:1;8491:195;8505:6;8502:1;8499:13;8491:195;;;8570:13;;-1:-1:-1;;;;;8566:39:1;8554:52;;8626:12;;;;8661:15;;;;8602:1;8520:9;8491:195;;;-1:-1:-1;8702:3:1;;8250:461;-1:-1:-1;;;;;8250:461:1:o;8716:261::-;8895:2;8884:9;8877:21;8858:4;8915:56;8967:2;8956:9;8952:18;8944:6;8915:56;:::i;8982:383::-;9059:6;9067;9075;9128:2;9116:9;9107:7;9103:23;9099:32;9096:52;;;9144:1;9141;9134:12;9096:52;9180:9;9167:23;9157:33;;9240:2;9229:9;9225:18;9212:32;9253:31;9278:5;9253:31;:::i;9370:315::-;9438:6;9446;9499:2;9487:9;9478:7;9474:23;9470:32;9467:52;;;9515:1;9512;9505:12;9467:52;9554:9;9541:23;9573:31;9598:5;9573:31;:::i;:::-;9623:5;9675:2;9660:18;;;;9647:32;;-1:-1:-1;;;9370:315:1:o;9690:345::-;9892:2;9874:21;;;9931:2;9911:18;;;9904:30;-1:-1:-1;;;9965:2:1;9950:18;;9943:51;10026:2;10011:18;;9690:345::o;10040:342::-;10242:2;10224:21;;;10281:2;10261:18;;;10254:30;-1:-1:-1;;;10315:2:1;10300:18;;10293:48;10373:2;10358:18;;10040:342::o;10387:251::-;10457:6;10510:2;10498:9;10489:7;10485:23;10481:32;10478:52;;;10526:1;10523;10516:12;10478:52;10558:9;10552:16;10577:31;10602:5;10577:31;:::i;10643:127::-;10704:10;10699:3;10695:20;10692:1;10685:31;10735:4;10732:1;10725:15;10759:4;10756:1;10749:15;10775:358;-1:-1:-1;;;;;10982:32:1;;10964:51;;11051:2;11046;11031:18;;11024:30;;;-1:-1:-1;;11071:56:1;;11108:18;;11100:6;11071:56;:::i;11138:127::-;11199:10;11194:3;11190:20;11187:1;11180:31;11230:4;11227:1;11220:15;11254:4;11251:1;11244:15;11270:135;11309:3;11330:17;;;11327:43;;11350:18;;:::i;:::-;-1:-1:-1;11397:1:1;11386:13;;11270:135::o;11410:344::-;11612:2;11594:21;;;11651:2;11631:18;;;11624:30;-1:-1:-1;;;11685:2:1;11670:18;;11663:50;11745:2;11730:18;;11410:344::o;11759:329::-;11961:2;11943:21;;;12000:1;11980:18;;;11973:29;-1:-1:-1;;;12033:2:1;12018:18;;12011:36;12079:2;12064:18;;11759:329::o;13122:217::-;13162:1;13188;13178:132;;13232:10;13227:3;13223:20;13220:1;13213:31;13267:4;13264:1;13257:15;13295:4;13292:1;13285:15;13178:132;-1:-1:-1;13324:9:1;;13122:217::o;13344:168::-;13384:7;13450:1;13446;13442:6;13438:14;13435:1;13432:21;13427:1;13420:9;13413:17;13409:45;13406:71;;;13457:18;;:::i;:::-;-1:-1:-1;13497:9:1;;13344:168::o;13517:354::-;13719:2;13701:21;;;13758:2;13738:18;;;13731:30;13797:32;13792:2;13777:18;;13770:60;13862:2;13847:18;;13517:354::o;14155:277::-;14222:6;14275:2;14263:9;14254:7;14250:23;14246:32;14243:52;;;14291:1;14288;14281:12;14243:52;14323:9;14317:16;14376:5;14369:13;14362:21;14355:5;14352:32;14342:60;;14398:1;14395;14388:12;14437:128;14477:3;14508:1;14504:6;14501:1;14498:13;14495:39;;;14514:18;;:::i;:::-;-1:-1:-1;14550:9:1;;14437:128::o;14570:184::-;14640:6;14693:2;14681:9;14672:7;14668:23;14664:32;14661:52;;;14709:1;14706;14699:12;14661:52;-1:-1:-1;14732:16:1;;14570:184;-1:-1:-1;14570:184:1:o;15099:332::-;15306:6;15295:9;15288:25;15349:2;15344;15333:9;15329:18;15322:30;15269:4;15369:56;15421:2;15410:9;15406:18;15398:6;15369:56;:::i;17388:623::-;-1:-1:-1;;;;;17711:15:1;;;17693:34;;17763:15;;;17758:2;17743:18;;17736:43;17815:15;;17810:2;17795:18;;17788:43;17874:14;;17867:22;17862:2;17847:18;;17840:50;17673:3;17921;17906:19;;17899:32;;;17636:4;;17948:57;;17985:19;;17977:6;17948:57;:::i;:::-;17940:65;17388:623;-1:-1:-1;;;;;;;17388:623:1:o;18016:125::-;18056:4;18084:1;18081;18078:8;18075:34;;;18089:18;;:::i;:::-;-1:-1:-1;18126:9:1;;18016:125::o;18526:426::-;18655:3;18693:6;18687:13;18718:1;18728:129;18742:6;18739:1;18736:13;18728:129;;;18840:4;18824:14;;;18820:25;;18814:32;18801:11;;;18794:53;18757:12;18728:129;;;18875:6;18872:1;18869:13;18866:48;;;18910:1;18901:6;18896:3;18892:16;18885:27;18866:48;-1:-1:-1;18930:16:1;;;;;18526:426;-1:-1:-1;;18526:426:1:o

Swarm Source

ipfs://7375aa6f49e44d3af55a616eaec586e1c6a3943305e979654cb51aab5c565543
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.