Contract 0x605711ced0e278c051868c648baf2ab21d7a3dd4 6

Contract Overview

Balance:
0 BTT
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x04fef09d1091e0e3290d8581533fd91f494ea1af559c8a9b793b76e0fbdcd0170x6080604081149562022-06-09 9:39:17659 days 18 mins ago0x9957887a260c7db1d4cb1fa67c0ce43d9b1d72c5 IN  Create: FToken0 BTT1,451.691
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x8f71680d4593f34d695cd3501ea45f271315237a14339ad82519b99b5681700494421372022-07-14 2:41:30624 days 7 hrs ago 0xeb9d55e84909ba099222e5c8723d0283438c6d9f 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0x8f71680d4593f34d695cd3501ea45f271315237a14339ad82519b99b5681700494421372022-07-14 2:41:30624 days 7 hrs ago 0xeb9d55e84909ba099222e5c8723d0283438c6d9f 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0x8f71680d4593f34d695cd3501ea45f271315237a14339ad82519b99b5681700494421372022-07-14 2:41:30624 days 7 hrs ago 0xeb9d55e84909ba099222e5c8723d0283438c6d9f 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0x8f71680d4593f34d695cd3501ea45f271315237a14339ad82519b99b5681700494421372022-07-14 2:41:30624 days 7 hrs ago 0xeb9d55e84909ba099222e5c8723d0283438c6d9f 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0x8f71680d4593f34d695cd3501ea45f271315237a14339ad82519b99b5681700494421372022-07-14 2:41:30624 days 7 hrs ago 0xeb9d55e84909ba099222e5c8723d0283438c6d9f 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0x8f71680d4593f34d695cd3501ea45f271315237a14339ad82519b99b5681700494421372022-07-14 2:41:30624 days 7 hrs ago 0xeb9d55e84909ba099222e5c8723d0283438c6d9f 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0x8f71680d4593f34d695cd3501ea45f271315237a14339ad82519b99b5681700494421372022-07-14 2:41:30624 days 7 hrs ago 0xeb9d55e84909ba099222e5c8723d0283438c6d9f 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0x8f71680d4593f34d695cd3501ea45f271315237a14339ad82519b99b5681700494421372022-07-14 2:41:30624 days 7 hrs ago 0xeb9d55e84909ba099222e5c8723d0283438c6d9f 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0x8f71680d4593f34d695cd3501ea45f271315237a14339ad82519b99b5681700494421372022-07-14 2:41:30624 days 7 hrs ago 0xeb9d55e84909ba099222e5c8723d0283438c6d9f 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0x8f71680d4593f34d695cd3501ea45f271315237a14339ad82519b99b5681700494421372022-07-14 2:41:30624 days 7 hrs ago 0xeb9d55e84909ba099222e5c8723d0283438c6d9f 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x9759f2092d446c7a595094c8299507487d729739 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x425d5b6e6efce7090adc5ed1ed9cc3dadc846a3e 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x9759f2092d446c7a595094c8299507487d729739 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x425d5b6e6efce7090adc5ed1ed9cc3dadc846a3e 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x9759f2092d446c7a595094c8299507487d729739 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x425d5b6e6efce7090adc5ed1ed9cc3dadc846a3e 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x425d5b6e6efce7090adc5ed1ed9cc3dadc846a3e 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x425d5b6e6efce7090adc5ed1ed9cc3dadc846a3e 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x425d5b6e6efce7090adc5ed1ed9cc3dadc846a3e 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x425d5b6e6efce7090adc5ed1ed9cc3dadc846a3e 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x425d5b6e6efce7090adc5ed1ed9cc3dadc846a3e 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x425d5b6e6efce7090adc5ed1ed9cc3dadc846a3e 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x9759f2092d446c7a595094c8299507487d729739 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x9759f2092d446c7a595094c8299507487d729739 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
0xd78867fda9949b7fdc1becb1874292d7d5a800e2c18058696c9caa5c87b9a9af86799982022-06-24 8:23:37644 days 1 hr ago 0x425d5b6e6efce7090adc5ed1ed9cc3dadc846a3e 0x605711ced0e278c051868c648baf2ab21d7a3dd40 BTT
[ Download CSV Export 
Index Block
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FToken

Compiler Version
v0.6.4+commit.1dca32f3

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at testnet.bttcscan.com on 2022-06-17
*/

pragma experimental ABIEncoderV2;
pragma solidity 0.6.4;


// SPDX-License-Identifier: MIT
interface IInterestRateModel {
    function utilizationRate(
        uint256 cash,
        uint256 borrows,
        uint256 reserves
    ) external pure returns (uint256);

    function getBorrowRate(
        uint256 cash,
        uint256 borrows,
        uint256 reserves
    ) external view returns (uint256);

    function getSupplyRate(
        uint256 cash,
        uint256 borrows,
        uint256 reserves,
        uint256 reserveFactorMantissa
    ) external view returns (uint256);

    function APR(
        uint256 cash,
        uint256 borrows,
        uint256 reserves
    ) external view returns (uint256);

    function APY(
        uint256 cash,
        uint256 borrows,
        uint256 reserves,
        uint256 reserveFactorMantissa
    ) external view returns (uint256);
}

// SPDX-License-Identifier: MIT
interface IBankController {
    function getCashPrior(address underlying) external view returns (uint256);

    function getCashAfter(address underlying, uint256 msgValue)
        external
        view
        returns (uint256);

    function getFTokeAddress(address underlying)
        external
        view
        returns (address);

    function transferToUser(
        address token,
        address payable user,
        uint256 amount
    ) external;

    function transferIn(
        address account,
        address underlying,
        uint256 amount
    ) external payable;

    function borrowCheck(
        address account,
        address underlying,
        address fToken,
        uint256 borrowAmount
    ) external;

    function repayCheck(address underlying) external;

    function liquidateBorrowCheck(
        address fTokenBorrowed,
        address fTokenCollateral,
        address borrower,
        address liquidator,
        uint256 repayAmount
    ) external;

    function liquidateTokens(
        address fTokenBorrowed,
        address fTokenCollateral,
        uint256 actualRepayAmount
    ) external view returns (uint256);

    function withdrawCheck(
        address fToken,
        address withdrawer,
        uint256 withdrawTokens
    ) external view returns (uint256);

    function transferCheck(
        address fToken,
        address src,
        address dst,
        uint256 transferTokens
    ) external;

    function marketsContains(address fToken) external view returns (bool);

    function seizeCheck(address cTokenCollateral, address cTokenBorrowed)
        external;

    function mintCheck(address underlying, address minter, uint256 amount) external;

    function addReserves(address underlying, uint256 addAmount)
        external
        payable;

    function reduceReserves(
        address underlying,
        address payable account,
        uint256 reduceAmount
    ) external;

    function calcMaxBorrowAmount(address user, address token)
        external
        view
        returns (uint256);

    function calcMaxWithdrawAmount(address user, address token)
        external
        view
        returns (uint256);

    function calcMaxCashOutAmount(address user, address token)
        external
        view
        returns (uint256);

    function calcMaxBorrowAmountWithRatio(address user, address token)
        external
        view
        returns (uint256);

    function transferEthGasCost() external view returns (uint256);

    function isFTokenValid(address fToken) external view returns (bool);

    function balance(address token) external view returns (uint256);
    function flashloanFeeBips() external view returns (uint256);
    function flashloanVault() external view returns (address);
    function transferFlashloanAsset(
        address token,
        address payable user,
        uint256 amount
    ) external;
}

// SPDX-License-Identifier: MIT
/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a <= b ? a : b;
    }

    function abs(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a < b) {
            return b - a;
        }
        return a - b;
    }
}

// SPDX-License-Identifier: MIT
contract Exponential {
    uint256 constant expScale = 1e18;
    uint256 constant doubleScale = 1e36;
    uint256 constant halfExpScale = expScale / 2;

    using SafeMath for uint256;

    function getExp(uint256 num, uint256 denom)
        public
        pure
        returns (uint256 rational)
    {
        rational = num.mul(expScale).div(denom);
    }

    function getDiv(uint256 num, uint256 denom)
        public
        pure
        returns (uint256 rational)
    {
        rational = num.mul(expScale).div(denom);
    }

    function addExp(uint256 a, uint256 b) public pure returns (uint256 result) {
        result = a.add(b);
    }

    function subExp(uint256 a, uint256 b) public pure returns (uint256 result) {
        result = a.sub(b);
    }

    function mulExp(uint256 a, uint256 b) public pure returns (uint256) {
        uint256 doubleScaledProduct = a.mul(b);

        uint256 doubleScaledProductWithHalfScale = halfExpScale.add(
            doubleScaledProduct
        );

        return doubleScaledProductWithHalfScale.div(expScale);
    }

    function divExp(uint256 a, uint256 b) public pure returns (uint256) {
        return getDiv(a, b);
    }

    function mulExp3(
        uint256 a,
        uint256 b,
        uint256 c
    ) public pure returns (uint256) {
        return mulExp(mulExp(a, b), c);
    }

    function mulScalar(uint256 a, uint256 scalar)
        public
        pure
        returns (uint256 scaled)
    {
        scaled = a.mul(scalar);
    }

    function mulScalarTruncate(uint256 a, uint256 scalar)
        public
        pure
        returns (uint256)
    {
        uint256 product = mulScalar(a, scalar);
        return truncate(product);
    }

    function mulScalarTruncateAddUInt(
        uint256 a,
        uint256 scalar,
        uint256 addend
    ) public pure returns (uint256) {
        uint256 product = mulScalar(a, scalar);
        return truncate(product).add(addend);
    }

    function divScalarByExpTruncate(uint256 scalar, uint256 divisor)
        public
        pure
        returns (uint256)
    {
        uint256 fraction = divScalarByExp(scalar, divisor);
        return truncate(fraction);
    }

    function divScalarByExp(uint256 scalar, uint256 divisor)
        public
        pure
        returns (uint256)
    {
        uint256 numerator = expScale.mul(scalar);
        return getExp(numerator, divisor);
    }

    function divScalar(uint256 a, uint256 scalar)
        public
        pure
        returns (uint256)
    {
        return a.div(scalar);
    }

    function truncate(uint256 exp) public pure returns (uint256) {
        return exp.div(expScale);
    }
}

// SPDX-License-Identifier: MIT
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    function decimals() external view returns (uint8);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

// SPDX-License-Identifier: MIT
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(
            data
        );
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// SPDX-License-Identifier: MIT
/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(
            value
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(
            value,
            "SafeERC20: decreased allowance below zero"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

// SPDX-License-Identifier: MIT
library EthAddressLib {
    /**
     * @dev returns the address used within the protocol to identify ETH
     * @return the address assigned to ETH
     */
    function ethAddress() internal pure returns (address) {
        return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    }
}

// SPDX-License-Identifier: MIT
interface IFToken is IERC20 {
    function mint(address user, uint256 amount) external returns (bytes memory);

    function borrow(address borrower, uint256 borrowAmount)
        external
        returns (bytes memory);

    function withdraw(
        address payable withdrawer,
        uint256 withdrawTokensIn,
        uint256 withdrawAmountIn
    ) external returns (uint256, bytes memory);

    function underlying() external view returns (address);

    function accrueInterest() external;

    function getAccountState(address account)
        external
        view
        returns (
            uint256,
            uint256,
            uint256
        );

    function MonitorEventCallback(
        address who,
        bytes32 funcName,
        bytes calldata payload
    ) external;

    //用户存借取还操作后的兑换率
    function exchangeRateCurrent() external view returns (uint256 exchangeRate);

    function repay(address borrower, uint256 repayAmount)
        external
        returns (uint256, bytes memory);

    function borrowBalanceStored(address account)
        external
        view
        returns (uint256);

    function exchangeRateStored() external view returns (uint256 exchangeRate);

    function liquidateBorrow(
        address liquidator,
        address borrower,
        uint256 repayAmount,
        address fTokenCollateral
    ) external returns (bytes memory);

    function borrowBalanceCurrent(address account) external returns (uint256);

    function balanceOfUnderlying(address owner) external returns (uint256);

    function _reduceReserves(uint256 reduceAmount) external;

    function _addReservesFresh(uint256 addAmount) external;

    function cancellingOut(address striker)
        external
        returns (bool strikeOk, bytes memory strikeLog);

    function APR() external view returns (uint256);

    function APY() external view returns (uint256);

    function calcBalanceOfUnderlying(address owner)
        external
        view
        returns (uint256);

    function borrowSafeRatio() external view returns (uint256);

    function tokenCash(address token, address account)
        external
        view
        returns (uint256);

    function getBorrowRate() external view returns (uint256);

    function addTotalCash(uint256 _addAmount) external;
    function subTotalCash(uint256 _subAmount) external;

    function totalCash() external view returns (uint256);
    function totalReserves() external view returns (uint256);
    function totalBorrows() external view returns (uint256);
}

// SPDX-License-Identifier: MIT
interface IBank {
    function MonitorEventCallback(bytes32 funcName, bytes calldata payload)
        external;

    function deposit(address token, uint256 amount) external payable;

    function borrow(address token, uint256 amount) external;

    function withdraw(address underlying, uint256 withdrawTokens) external;

    function withdrawUnderlying(address underlying, uint256 amount) external;

    function repay(address token, uint256 amount) external payable;

    function liquidateBorrow(
        address borrower,
        address underlyingBorrow,
        address underlyingCollateral,
        uint256 repayAmount
    ) external payable;

    function tokenIn(address token, uint256 amountIn) external payable;

    function tokenOut(address token, uint256 amountOut) external;

    function cancellingOut(address token) external;

    function paused() external view returns (bool);
}

/**
 * @title Initializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 */
contract Initializable {

  /**
   * @dev Indicates that the contract has been initialized.
   */
  bool private initialized;

  /**
   * @dev Indicates that the contract is in the process of being initialized.
   */
  bool private initializing;

  /**
   * @dev Modifier to use in the initializer function of a contract.
   */
  modifier initializer() {
    require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  /// @dev Returns true if and only if the function is running in the constructor
  function isConstructor() private view returns (bool) {
    // extcodesize checks the size of the code stored in an address, and
    // address returns the current address. Since the code is still not
    // deployed when running a constructor, any checks on its code size will
    // yield zero, making it an effective way to detect if a contract is
    // under construction or not.
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  // Reserved storage space to allow for layout changes in the future.
  uint256[50] private ______gap;
}

// SPDX-License-Identifier: MIT
contract FToken is Exponential, Initializable {
    using SafeERC20 for IERC20;

    uint256 public totalSupply;

    string public name;

    string public symbol;

    uint8 public decimals;

    mapping(address => mapping(address => uint256)) internal transferAllowances;

    uint256 public initialExchangeRate;

    address public admin;

    uint256 public totalBorrows;

    uint256 public totalReserves;

    uint256 public reserveFactor;

    uint256 public borrowIndex;

    uint256 internal constant borrowRateMax = 0.0005e16;

    uint256 public accrualBlockNumber;

    IInterestRateModel public interestRateModel;

    // 该 fToken 所代表的原生代币
    address public underlying;

    mapping(address => uint256) public accountTokens;

    IBankController public controller;

    uint256 public borrowSafeRatio;

    address public bank; // bank主合约入口地址

    bool internal _notEntered;

    uint256 public constant ONE = 1e18;

    // 借款人账户
    struct BorrowSnapshot {
        uint256 principal;
        uint256 interestIndex;
    }

    mapping(address => BorrowSnapshot) public accountBorrows;
    uint256 public totalCash;

    event Transfer(address indexed from, address indexed to, uint256 value);
    event NewInterestRateModel(address oldIRM, uint256 oldUR, uint256 oldAPR, uint256 oldAPY, uint256 exRate1,
        address newIRM, uint256 newUR, uint256 newAPR, uint256 newAPY, uint256 exRate2
    );
    event NewInitialExchangeRate(uint256 oldInitialExchangeRate, uint256 oldUR, uint256 oldAPR, uint256 oldAPY, uint256 exRate1,
        uint256 _initialExchangeRate, uint256 newUR, uint256 newAPR, uint256 newAPY, uint256 exRate2);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    function initialize(
        uint256 _initialExchangeRate,
        address _controller,
        address _initialInterestRateModel,
        address _underlying,
        address _bank,
        uint256 _borrowSafeRatio,
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) public initializer {
        initialExchangeRate = _initialExchangeRate;
        controller = IBankController(_controller);
        interestRateModel = IInterestRateModel(_initialInterestRateModel);
        admin = msg.sender;
        underlying = _underlying;
        borrowSafeRatio = _borrowSafeRatio;
        accrualBlockNumber = getBlockNumber();
        borrowIndex = ONE;
        bank = _bank;
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        _notEntered = true;
    }

    modifier onlyAdmin {
        require(msg.sender == admin, "require admin");
        _;
    }

    modifier onlyBank {
        require(msg.sender == bank, "require admin");
        _;
    }

    modifier onlyController {
        require(msg.sender == address(controller), "require controller");
        _;
    }

    modifier onlyRestricted {
        require(
            msg.sender == admin ||
                msg.sender == bank ||
                msg.sender == address(controller) ||
                controller.marketsContains(msg.sender),
            "only restricted user"
        );
        _;
    }

    modifier onlyBankComponent {
        require(
            msg.sender == bank ||
                msg.sender == address(controller) ||
                msg.sender == address(this) ||
                controller.marketsContains(msg.sender),
            "only bank component"
        );
        _;
    }

    modifier whenUnpaused {
        require(!IBank(bank).paused(), "System paused");
        _;
    }

    function _setController(address _controller) external onlyAdmin {
        controller = IBankController(_controller);
    }

    function tokenCash(address token, address account)
        public
        view
        returns (uint256)
    {
        return
            token != EthAddressLib.ethAddress()
                ? IERC20(token).balanceOf(account)
                : address(account).balance;
    }

    struct TransferLogStruct {
        address user_address;
        address token_address;
        address cheque_token_address;
        uint256 amount_transferred;
        uint256 account_balance;
        address payee_address;
        uint256 payee_balance;
        uint256 global_token_reserved;
    }

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     */
    function transfer(address dst, uint256 amount)
        external
        nonReentrant
        returns (bool)
    {
        // spender - src - dst
        transferTokens(msg.sender, msg.sender, dst, amount);

        TransferLogStruct memory tls = TransferLogStruct(
            msg.sender,
            underlying,
            address(this),
            amount,
            balanceOf(msg.sender),
            dst,
            balanceOf(dst),
            tokenCash(underlying, address(controller))
        );

        IBank(bank).MonitorEventCallback("Transfer", abi.encode(tls));

        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     */
    function transferFrom(
        address src,
        address dst,
        uint256 amount
    ) external nonReentrant returns (bool) {
        // spender - src - dst
        transferTokens(msg.sender, src, dst, amount);

        TransferLogStruct memory tls = TransferLogStruct(
            src,
            underlying,
            address(this),
            amount,
            balanceOf(src),
            dst,
            balanceOf(dst),
            tokenCash(underlying, address(controller))
        );

        IBank(bank).MonitorEventCallback("TransferFrom", abi.encode(tls));

        return true;
    }

    // tokens -> 转账的 fToken 的数量
    function transferTokens(
        address spender,
        address src,
        address dst,
        uint256 tokens
    ) internal whenUnpaused returns (bool) {
        //accrueInterest();
        controller.transferCheck(address(this), src, dst, mulScalarTruncate(tokens, borrowSafeRatio));

        require(src != dst, "Cannot transfer to self");

        uint256 startingAllowance = 0;
        if (spender == src) {
            startingAllowance = uint256(-1);
        } else {
            startingAllowance = transferAllowances[src][spender];
        }

        uint256 allowanceNew = startingAllowance.sub(tokens);

        accountTokens[src] = accountTokens[src].sub(tokens);
        accountTokens[dst] = accountTokens[dst].add(tokens);

        if (startingAllowance != uint256(-1)) {
            transferAllowances[src][spender] = allowanceNew;
        }

        emit Transfer(src, dst, tokens);
        return true;
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param amount The number of tokens that are approved (-1 means infinite)
     */
    function approve(address spender, uint256 amount) external returns (bool) {
        address src = msg.sender;
        transferAllowances[src][spender] = amount;
        emit Approval(src, spender, amount);
        return true;
    }

    /**
     * @notice Get the current allowance from `owner` for `spender`
     * @param owner The address of the account which owns the tokens to be spent
     * @param spender The address of the account which may transfer tokens
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256)
    {
        return transferAllowances[owner][spender];
    }

    struct MintLocals {
        uint256 exchangeRate;
        uint256 mintTokens;
        uint256 totalSupplyNew;
        uint256 accountTokensNew;
        uint256 actualMintAmount;
    }

    struct DepositLogStruct {
        address user_address;
        address token_address;
        address cheque_token_address;
        uint256 amount_deposited;
        uint256 underlying_deposited;
        uint256 cheque_token_value;
        uint256 loan_interest_rate;
        uint256 account_balance;
        uint256 global_token_reserved;
    }

    // 存款记账
    function mint(address user, uint256 amount)
        external
        onlyBank
        nonReentrant
        returns (bytes memory)
    {
        accrueInterest();
        return mintInternal(user, amount);
    }

    // 存款记账
    function mintInternal(address user, uint256 amount)
        internal
        returns (bytes memory)
    {
        require(accrualBlockNumber == getBlockNumber(), "Blocknumber fails");
        MintLocals memory tmp;
        controller.mintCheck(underlying, user, amount);
        tmp.exchangeRate = exchangeRateStored();
        tmp.mintTokens = divScalarByExpTruncate(amount, tmp.exchangeRate);
        tmp.totalSupplyNew = addExp(totalSupply, tmp.mintTokens);
        tmp.accountTokensNew = addExp(accountTokens[user], tmp.mintTokens);
        totalSupply = tmp.totalSupplyNew;
        accountTokens[user] = tmp.accountTokensNew;

        uint256 preCalcTokenCash = tokenCash(underlying, address(controller))
            .add(amount);

        DepositLogStruct memory dls = DepositLogStruct(
            user,
            underlying,
            address(this),
            tmp.mintTokens,
            amount,
            exchangeRateAfter(amount), //cheque_token_value, 存之后的交换率(预判)
            interestRateModel.getBorrowRate(
                preCalcTokenCash,
                totalBorrows,
                totalReserves
            ), //loan_interest_rate 借款利率,存之后的价款利率
            tokenCash(address(this), user),
            preCalcTokenCash
        );

        emit Transfer(address(0), user, tmp.mintTokens);

        return abi.encode(dls);
    }

    struct BorrowLocals {
        uint256 accountBorrows;
        uint256 accountBorrowsNew;
        uint256 totalBorrowsNew;
    }

    struct BorrowLogStruct {
        address user_address;
        address token_address;
        address cheque_token_address;
        uint256 amount_borrowed;
        uint256 interest_accrued;
        uint256 cheque_token_value;
        uint256 loan_interest_rate;
        uint256 account_debt;
        uint256 global_token_reserved;
    }

    // 用户借钱
    function borrow(address payable borrower, uint256 borrowAmount)
        external
        onlyBank
        nonReentrant
        returns (bytes memory)
    {
        accrueInterest();
        return borrowInternal(borrower, borrowAmount);
    }

    // 用户借钱
    function borrowInternal(address payable borrower, uint256 borrowAmount)
        internal
        returns (bytes memory)
    {
        controller.borrowCheck(
            borrower,
            underlying,
            address(this),
            mulScalarTruncate(borrowAmount, borrowSafeRatio)
        );

        require(
            controller.getCashPrior(underlying) >= borrowAmount,
            "Insufficient balance"
        );

        BorrowLocals memory tmp;
        uint256 lastPrincipal = accountBorrows[borrower].principal;
        tmp.accountBorrows = borrowBalanceStoredInternal(borrower);
        tmp.accountBorrowsNew = addExp(tmp.accountBorrows, borrowAmount);
        tmp.totalBorrowsNew = addExp(totalBorrows, borrowAmount);

        accountBorrows[borrower].principal = tmp.accountBorrowsNew;
        accountBorrows[borrower].interestIndex = borrowIndex;
        totalBorrows = tmp.totalBorrowsNew;

        controller.transferToUser(underlying, borrower, borrowAmount);
        subTotalCash(borrowAmount);

        BorrowLogStruct memory bls = BorrowLogStruct(
            borrower,
            underlying,
            address(this),
            borrowAmount,
            SafeMath.abs(tmp.accountBorrows, lastPrincipal),
            exchangeRateStored(),
            getBorrowRate(),
            accountBorrows[borrower].principal,
            tokenCash(underlying, address(controller))
        );

        return abi.encode(bls);
    }

    struct RepayLocals {
        uint256 repayAmount;
        uint256 borrowerIndex;
        uint256 accountBorrows;
        uint256 accountBorrowsNew;
        uint256 totalBorrowsNew;
        uint256 actualRepayAmount;
    }

    // 计算兑换率
    function exchangeRateStored() public view returns (uint256 exchangeRate) {
        return calcExchangeRate(totalBorrows, totalReserves);
    }

    function calcExchangeRate(uint256 _totalBorrows, uint256 _totalReserves)
        public
        view
        returns (uint256 exchangeRate)
    {
        uint256 _totalSupply = totalSupply;
        if (_totalSupply == 0) {
            return initialExchangeRate;
        } else {
            /*
             *  exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply
             */
            uint256 totalCash = controller.getCashPrior(underlying);
            uint256 cashPlusBorrowsMinusReserves = subExp(
                addExp(totalCash, _totalBorrows),
                _totalReserves
            );
            exchangeRate = getDiv(cashPlusBorrowsMinusReserves, _totalSupply);
        }
    }

    // 计算兑换率(预判),在实际转账之前调用,只是用于发事件,用户后端审计
    function exchangeRateAfter(uint256 transferInAmout)
        public
        view
        returns (uint256 exchangeRate)
    {
        uint256 _totalSupply = totalSupply;
        if (_totalSupply == 0) {
            // 如果市场是初始化状态,那么返回初始兑换率
            return initialExchangeRate;
        } else {
            /*
             *  exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply
             */
            uint256 totalCash = controller.getCashAfter(
                underlying,
                transferInAmout
            );
            uint256 cashPlusBorrowsMinusReserves = subExp(
                addExp(totalCash, totalBorrows),
                totalReserves
            );
            exchangeRate = getDiv(cashPlusBorrowsMinusReserves, _totalSupply);
        }
    }

    function balanceOfUnderlying(address owner) external returns (uint256) {
        // 获取利率
        uint256 exchangeRate = exchangeRateCurrent();
        // 利率乘余额
        uint256 balance = mulScalarTruncate(exchangeRate, accountTokens[owner]);
        return balance;
    }

    function calcBalanceOfUnderlying(address owner)
        public
        view
        returns (uint256)
    {
        (, , uint256 _totalBorrows, uint256 _trotalReserves) = peekInterest();

        uint256 _exchangeRate = calcExchangeRate(
            _totalBorrows,
            _trotalReserves
        );
        // 利率乘余额
        uint256 balance = mulScalarTruncate(
            _exchangeRate,
            accountTokens[owner]
        );
        return balance;
    }

    function exchangeRateCurrent() public nonReentrant returns (uint256) {
        accrueInterest();
        return exchangeRateStored();
    }

    // 获取账户信息
    function getAccountState(address account)
        external
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 fTokenBalance = accountTokens[account];
        uint256 borrowBalance = borrowBalanceStoredInternal(account);
        uint256 exchangeRate = exchangeRateStored();

        return (fTokenBalance, borrowBalance, exchangeRate);
    }

    struct WithdrawLocals {
        uint256 exchangeRate;
        uint256 withdrawTokens;
        uint256 withdrawAmount;
        uint256 totalSupplyNew;
        uint256 accountTokensNew;
    }

    struct WithdrawLogStruct {
        address user_address;
        address token_address;
        address cheque_token_address;
        uint256 amount_withdrawed;
        uint256 underlying_withdrawed;
        uint256 cheque_token_value;
        uint256 loan_interest_rate;
        uint256 account_balance;
        uint256 global_token_reserved;
    }

    // todo onlyController
    function withdraw(
        address payable withdrawer,
        uint256 withdrawTokensIn,
        uint256 withdrawAmountIn
    ) external onlyBank nonReentrant returns (uint256, bytes memory) {
        accrueInterest();
        return withdrawInternal(withdrawer, withdrawTokensIn, withdrawAmountIn);
    }

    function withdrawInternal(
        address payable withdrawer,
        uint256 withdrawTokensIn,
        uint256 withdrawAmountIn
    ) internal returns (uint256, bytes memory) {
        // 一个是想要兑换 cTokens 的数量,一个是想要兑换 asset 的数量,必须有一个是 0
        require(
            withdrawTokensIn == 0 || withdrawAmountIn == 0,
            "withdraw parameter not valid"
        );
        WithdrawLocals memory tmp;

        tmp.exchangeRate = exchangeRateStored();

        if (withdrawTokensIn > 0) {
            tmp.withdrawTokens = withdrawTokensIn;
            tmp.withdrawAmount = mulScalarTruncate(
                tmp.exchangeRate,
                withdrawTokensIn
            );
        } else {
            tmp.withdrawTokens = divScalarByExpTruncate(
                withdrawAmountIn,
                tmp.exchangeRate
            );
            tmp.withdrawAmount = withdrawAmountIn;
        }

        controller.withdrawCheck(address(this), withdrawer, tmp.withdrawTokens);

        require(accrualBlockNumber == getBlockNumber(), "Blocknumber fails");

        tmp.totalSupplyNew = totalSupply.sub(tmp.withdrawTokens);
        tmp.accountTokensNew = accountTokens[withdrawer].sub(
            tmp.withdrawTokens
        );

        require(
            controller.getCashPrior(underlying) >= tmp.withdrawAmount,
            "Insufficient money"
        );

        controller.transferToUser(underlying, withdrawer, tmp.withdrawAmount);
        subTotalCash(tmp.withdrawAmount);

        totalSupply = tmp.totalSupplyNew;
        accountTokens[withdrawer] = tmp.accountTokensNew;

        WithdrawLogStruct memory wls = WithdrawLogStruct(
            withdrawer,
            underlying,
            address(this),
            tmp.withdrawTokens,
            tmp.withdrawAmount,
            exchangeRateStored(),
            getBorrowRate(),
            tokenCash(address(this), withdrawer),
            tokenCash(underlying, address(controller))
        );

        emit Transfer(withdrawer, address(0), tmp.withdrawTokens);

        return (tmp.withdrawAmount, abi.encode(wls));
    }

    function strikeWithdrawInternal(
        address withdrawer,
        uint256 withdrawTokensIn,
        uint256 withdrawAmountIn
    ) internal returns (uint256, bytes memory) {
        // 一个是想要兑换 cTokens 的数量,一个是想要兑换 asset 的数量,必须有一个是 0
        require(
            withdrawTokensIn == 0 || withdrawAmountIn == 0,
            "withdraw parameter not valid"
        );
        WithdrawLocals memory tmp;

        tmp.exchangeRate = exchangeRateStored();

        if (withdrawTokensIn > 0) {
            tmp.withdrawTokens = withdrawTokensIn;
            tmp.withdrawAmount = mulScalarTruncate(
                tmp.exchangeRate,
                withdrawTokensIn
            );
        } else {
            tmp.withdrawTokens = divScalarByExpTruncate(
                withdrawAmountIn,
                tmp.exchangeRate
            );
            tmp.withdrawAmount = withdrawAmountIn;
        }

        require(accrualBlockNumber == getBlockNumber(), "Blocknumber fails");

        tmp.totalSupplyNew = totalSupply.sub(tmp.withdrawTokens);
        tmp.accountTokensNew = accountTokens[withdrawer].sub(
            tmp.withdrawTokens
        );

        totalSupply = tmp.totalSupplyNew;
        accountTokens[withdrawer] = tmp.accountTokensNew;

        uint256 preCalcTokenCash = tokenCash(underlying, address(controller))
            .add(tmp.withdrawAmount);

        WithdrawLogStruct memory wls = WithdrawLogStruct(
            withdrawer,
            underlying,
            address(this),
            tmp.withdrawTokens,
            tmp.withdrawAmount,
            exchangeRateStored(),
            interestRateModel.getBorrowRate(
                preCalcTokenCash,
                totalBorrows,
                totalReserves
            ),
            tokenCash(address(this), withdrawer),
            preCalcTokenCash
        );

        emit Transfer(withdrawer, address(0), tmp.withdrawTokens);

        return (tmp.withdrawAmount, abi.encode(wls));
    }

    // 更新利息
    function accrueInterest() public onlyRestricted {
        uint256 currentBlockNumber = getBlockNumber();
        uint256 accrualBlockNumberPrior = accrualBlockNumber;

        // 太短 零利息
        if (accrualBlockNumberPrior == currentBlockNumber) {
            return;
        }

        uint256 cashPrior = controller.getCashPrior(underlying);
        uint256 borrowsPrior = totalBorrows;
        uint256 reservesPrior = totalReserves;
        uint256 borrowIndexPrior = borrowIndex;

        // // 计算借贷利率
        uint256 borrowRate = interestRateModel.getBorrowRate(
            cashPrior,
            borrowsPrior,
            reservesPrior
        );
        // // 不能超过最大利率
        require(borrowRate <= borrowRateMax, "borrow rate is too high");

        // // 计算块差
        uint256 blockDelta = currentBlockNumber.sub(accrualBlockNumberPrior);

        /*
         *  simpleInterestFactor = borrowRate * blockDelta
         *  interestAccumulated = simpleInterestFactor * totalBorrows
         *  totalBorrowsNew = interestAccumulated + totalBorrows
         *  totalReservesNew = interestAccumulated * reserveFactor + totalReserves
         *  borrowIndexNew = simpleInterestFactor * borrowIndex + borrowIndex
         */

        uint256 simpleInterestFactor;
        uint256 interestAccumulated;
        uint256 totalBorrowsNew;
        uint256 totalReservesNew;
        uint256 borrowIndexNew;

        simpleInterestFactor = mulScalar(borrowRate, blockDelta);

        interestAccumulated = divExp(
            mulExp(simpleInterestFactor, borrowsPrior),
            expScale
        );

        totalBorrowsNew = addExp(interestAccumulated, borrowsPrior);

        totalReservesNew = addExp(
            divExp(mulExp(reserveFactor, interestAccumulated), expScale),
            reservesPrior
        );

        borrowIndexNew = addExp(
            divExp(mulExp(simpleInterestFactor, borrowIndexPrior), expScale),
            borrowIndexPrior
        );

        accrualBlockNumber = currentBlockNumber;
        borrowIndex = borrowIndexNew;
        totalBorrows = totalBorrowsNew;
        totalReserves = totalReservesNew;

        borrowRate = interestRateModel.getBorrowRate(
            cashPrior,
            totalBorrows,
            totalReserves
        );
        // 不能超过最大利率
        require(borrowRate <= borrowRateMax, "borrow rate is too high");
    }

    function peekInterest()
        public
        view
        returns (
            uint256 _accrualBlockNumber,
            uint256 _borrowIndex,
            uint256 _totalBorrows,
            uint256 _totalReserves
        )
    {
        _accrualBlockNumber = getBlockNumber();
        uint256 accrualBlockNumberPrior = accrualBlockNumber;

        // 太短 零利息
        if (accrualBlockNumberPrior == _accrualBlockNumber) {
            return (
                accrualBlockNumber,
                borrowIndex,
                totalBorrows,
                totalReserves
            );
        }

        uint256 cashPrior = controller.getCashPrior(underlying);
        uint256 borrowsPrior = totalBorrows;
        uint256 reservesPrior = totalReserves;
        uint256 borrowIndexPrior = borrowIndex;

        // // 计算借贷利率
        uint256 borrowRate = interestRateModel.getBorrowRate(
            cashPrior,
            borrowsPrior,
            reservesPrior
        );
        // // 不能超过最大利率
        require(borrowRate <= borrowRateMax, "borrow rate is too high");

        // // 计算块差
        uint256 blockDelta = _accrualBlockNumber.sub(accrualBlockNumberPrior);

        /*
         *  simpleInterestFactor = borrowRate * blockDelta
         *  interestAccumulated = simpleInterestFactor * totalBorrows
         *  totalBorrowsNew = interestAccumulated + totalBorrows
         *  totalReservesNew = interestAccumulated * reserveFactor + totalReserves
         *  borrowIndexNew = simpleInterestFactor * borrowIndex + borrowIndex
         */

        uint256 simpleInterestFactor;
        uint256 interestAccumulated;
        uint256 totalBorrowsNew;
        uint256 totalReservesNew;
        uint256 borrowIndexNew;

        simpleInterestFactor = mulScalar(borrowRate, blockDelta);

        interestAccumulated = divExp(
            mulExp(simpleInterestFactor, borrowsPrior),
            expScale
        );

        totalBorrowsNew = addExp(interestAccumulated, borrowsPrior);

        totalReservesNew = addExp(
            divExp(mulExp(reserveFactor, interestAccumulated), expScale),
            reservesPrior
        );

        borrowIndexNew = addExp(
            divExp(mulExp(simpleInterestFactor, borrowIndexPrior), expScale),
            borrowIndexPrior
        );

        _borrowIndex = borrowIndexNew;
        _totalBorrows = totalBorrowsNew;
        _totalReserves = totalReservesNew;

        borrowRate = interestRateModel.getBorrowRate(
            cashPrior,
            totalBorrows,
            totalReserves
        );
        // 不能超过最大利率
        require(borrowRate <= borrowRateMax, "borrow rate is too high");
    }

    function borrowBalanceCurrent(address account)
        external
        nonReentrant
        returns (uint256)
    {
        accrueInterest();
        BorrowSnapshot memory borrowSnapshot = accountBorrows[account];
        require(borrowSnapshot.interestIndex <= borrowIndex, "borrowIndex error");

        return borrowBalanceStoredInternal(account);
    }

    function borrowBalanceStoredInternal(address user)
        internal
        view
        returns (uint256 result)
    {
        // 借贷数量
        BorrowSnapshot memory borrowSnapshot = accountBorrows[user];

        if (borrowSnapshot.principal == 0) {
            return 0;
        }

        result = mulExp(borrowSnapshot.principal, divExp(borrowIndex, borrowSnapshot.interestIndex));
    }

    function _setReserveFactorFresh(uint256 newReserveFactor)
        external
        onlyAdmin
        nonReentrant
    {
        accrueInterest();
        require(accrualBlockNumber == getBlockNumber(), "Blocknumber fails");
        reserveFactor = newReserveFactor;
    }

    struct ReserveDepositLogStruct {
        address token_address;
        uint256 reserve_funded;
        uint256 cheque_token_value;
        uint256 loan_interest_rate;
        uint256 global_token_reserved;
    }

    function _setInterestRateModel(IInterestRateModel newInterestRateModel)
        public
        onlyAdmin
    {
        address oldIRM = address(interestRateModel);
        uint256 oldUR = utilizationRate();
        uint256 oldAPR = APR();
        uint256 oldAPY = APY();

        uint256 exRate1 = exchangeRateStored();     
        accrueInterest();
        uint256 exRate2 = exchangeRateStored();

        require(accrualBlockNumber == getBlockNumber(), "Blocknumber fails");

        interestRateModel = newInterestRateModel;
        uint256 newUR = utilizationRate();
        uint256 newAPR = APR();
        uint256 newAPY = APY();

        emit NewInterestRateModel(oldIRM, oldUR, oldAPR, oldAPY, exRate1, address(newInterestRateModel), newUR, newAPR, newAPY, exRate2);

        ReserveDepositLogStruct memory rds = ReserveDepositLogStruct(
            underlying,
            0,
            exchangeRateStored(),
            getBorrowRate(),
            tokenCash(underlying, address(controller))
        );

        IBank(bank).MonitorEventCallback(
            "ReserveDeposit",
            abi.encode(rds)
        );
    }

    function _setInitialExchangeRate(uint256 _initialExchangeRate) external onlyAdmin {
        uint256 oldInitialExchangeRate = initialExchangeRate;

        uint256 oldUR = utilizationRate();
        uint256 oldAPR = APR();
        uint256 oldAPY = APY();

        uint256 exRate1 = exchangeRateStored();
        accrueInterest();
        uint256 exRate2 = exchangeRateStored();

        require(accrualBlockNumber == getBlockNumber(), "Blocknumber fails");

        initialExchangeRate = _initialExchangeRate;
        uint256 newUR = utilizationRate();
        uint256 newAPR = APR();
        uint256 newAPY = APY();

        emit NewInitialExchangeRate(oldInitialExchangeRate, oldUR, oldAPR, oldAPY, exRate1, initialExchangeRate, newUR, newAPR, newAPY, exRate2);

        ReserveDepositLogStruct memory rds = ReserveDepositLogStruct(
            underlying,
            0,
            exchangeRateStored(),
            getBorrowRate(),
            tokenCash(underlying, address(controller))
        );

        IBank(bank).MonitorEventCallback(
            "ReserveDeposit",
            abi.encode(rds)
        );
    }

    function getBlockNumber() internal view returns (uint256) {
        return block.number;
    }

    function repay(address borrower, uint256 repayAmount)
        external
        onlyBank
        nonReentrant
        returns (uint256, bytes memory)
    {
        accrueInterest();
        return repayInternal(borrower, repayAmount);
    }

    struct RepayLogStruct {
        address user_address;
        address token_address;
        address cheque_token_address;
        uint256 amount_repayed;
        uint256 interest_accrued;
        uint256 cheque_token_value;
        uint256 loan_interest_rate;
        uint256 account_debt;
        uint256 global_token_reserved;
    }

    function repayInternal(address borrower, uint256 repayAmount)
        internal
        returns (uint256, bytes memory)
    {
        controller.repayCheck(underlying);
        require(accrualBlockNumber == getBlockNumber(), "Blocknumber fails");

        RepayLocals memory tmp;
        uint256 lastPrincipal = accountBorrows[borrower].principal;
        tmp.borrowerIndex = accountBorrows[borrower].interestIndex;
        tmp.accountBorrows = borrowBalanceStoredInternal(borrower);

        // -1 表示还最大
        if (repayAmount == uint256(-1)) {
            tmp.repayAmount = tmp.accountBorrows;
        } else {
            tmp.repayAmount = repayAmount;
        }

        tmp.accountBorrowsNew = tmp.accountBorrows.sub(tmp.repayAmount);
        if (totalBorrows < tmp.repayAmount) {
            tmp.totalBorrowsNew = 0;
        } else {
            tmp.totalBorrowsNew = totalBorrows.sub(tmp.repayAmount);
        }

        accountBorrows[borrower].principal = tmp.accountBorrowsNew;
        accountBorrows[borrower].interestIndex = borrowIndex;
        totalBorrows = tmp.totalBorrowsNew;

        uint256 preCalcTokenCash = tokenCash(underlying, address(controller))
            .add(tmp.repayAmount);

        RepayLogStruct memory rls = RepayLogStruct(
            borrower,
            underlying,
            address(this),
            tmp.repayAmount,
            SafeMath.abs(tmp.accountBorrows, lastPrincipal),
            exchangeRateAfter(tmp.repayAmount), //repay之后的交换率
            interestRateModel.getBorrowRate(
                preCalcTokenCash,
                totalBorrows,
                totalReserves
            ), //repay之后的借款利率
            accountBorrows[borrower].principal,
            preCalcTokenCash
        );

        return (tmp.repayAmount, abi.encode(rls));
    }

    function borrowBalanceStored(address account)
        external
        view
        returns (uint256)
    {
        return borrowBalanceStoredInternal(account);
    }

    struct LiquidateBorrowLogStruct {
        address user_address;
        address token_address;
        address cheque_token_address;
        uint256 debt_written_off;
        uint256 interest_accrued;
        address debtor_address;
        uint256 collateral_purchased;
        address collateral_cheque_token_address;
        uint256 debtor_balance;
        uint256 debt_remaining;
        uint256 cheque_token_value;
        uint256 loan_interest_rate;
        uint256 account_balance;
        uint256 global_token_reserved;
    }

    function liquidateBorrow(
        address liquidator,
        address borrower,
        uint256 repayAmount,
        FToken fTokenCollateral
    ) public onlyBank nonReentrant returns (bytes memory) {
        require(
            controller.isFTokenValid(address(this)) &&
                controller.isFTokenValid(address(fTokenCollateral)),
            "Market not listed"
        );
        accrueInterest();
        fTokenCollateral.accrueInterest();
        uint256 lastPrincipal = accountBorrows[borrower].principal;
        uint256 newPrincipal = borrowBalanceStoredInternal(borrower);

        controller.liquidateBorrowCheck(
            address(this),
            address(fTokenCollateral),
            borrower,
            liquidator,
            repayAmount
        );

        require(accrualBlockNumber == getBlockNumber(), "Blocknumber fails");
        require(
            fTokenCollateral.accrualBlockNumber() == getBlockNumber(),
            "Blocknumber fails"
        );

        // 还钱
        (uint256 actualRepayAmount, ) = repayInternal(borrower, repayAmount);

        // 计算清算的质押物数量(fToken数量)
        uint256 seizeTokens = controller.liquidateTokens(
            address(this),
            address(fTokenCollateral),
            actualRepayAmount
        );

        // 借款人得要有这么多余额才行
        require(
            fTokenCollateral.balanceOf(borrower) >= seizeTokens,
            "Seize too much"
        );

        if (address(fTokenCollateral) == address(this)) {
            seizeInternal(address(this), liquidator, borrower, seizeTokens);
        } else {
            fTokenCollateral.seize(liquidator, borrower, seizeTokens);
        }

        uint256 preCalcTokenCash = tokenCash(underlying, address(controller))
            .add(actualRepayAmount);

        LiquidateBorrowLogStruct memory lbls = LiquidateBorrowLogStruct(
            liquidator,
            underlying,
            address(this),
            actualRepayAmount,
            SafeMath.abs(newPrincipal, lastPrincipal),
            borrower,
            seizeTokens,
            address(fTokenCollateral),
            tokenCash(address(fTokenCollateral), borrower),
            accountBorrows[borrower].principal, //debt_remaining
            exchangeRateAfter(actualRepayAmount),
            interestRateModel.getBorrowRate(
                preCalcTokenCash,
                totalBorrows,
                totalReserves
            ),
            tokenCash(address(fTokenCollateral), liquidator),
            preCalcTokenCash
        );

        return abi.encode(lbls);
    }

    function seize(
        address liquidator,
        address borrower,
        uint256 seizeTokens
    ) external nonReentrant {
        return seizeInternal(msg.sender, liquidator, borrower, seizeTokens);
    }

    struct CallingOutLogStruct {
        address user_address;
        address token_address;
        address cheque_token_address;
        uint256 amount_wiped_out;
        uint256 debt_cancelled_out;
        uint256 interest_accrued;
        uint256 cheque_token_value;
        uint256 loan_interest_rate;
        uint256 account_balance;
        uint256 account_debt;
        uint256 global_token_reserved;
    }

    //冲账处理
    function cancellingOut(address striker)
        public
        onlyBank
        nonReentrant
        returns (bool strikeOk, bytes memory strikeLog)
    {
        // 需要冲账时,计算利息
        if (
            borrowBalanceStoredInternal(striker) > 0 && balanceOf(striker) > 0
        ) {
            accrueInterest();
            uint256 lastPrincipal = accountBorrows[striker].principal;
            uint256 curBorrowBalance = borrowBalanceStoredInternal(striker);
            uint256 userSupplyBalance = calcBalanceOfUnderlying(striker);
            uint256 lastFtokenBalance = balanceOf(striker);
            uint256 actualRepayAmount;
            bytes memory repayLog;
            uint256 withdrawAmount;
            bytes memory withdrawLog;
            // 有借款和存款(fToken)
            if (curBorrowBalance > 0 && userSupplyBalance > 0) {
                //无实际转账的赎回(冲账赎回)
                if (userSupplyBalance > curBorrowBalance) {
                    (withdrawAmount, withdrawLog) = strikeWithdrawInternal(
                        striker,
                        0,
                        curBorrowBalance
                    );
                } else {
                    (withdrawAmount, withdrawLog) = strikeWithdrawInternal(
                        striker,
                        balanceOf(striker),
                        0
                    );
                }

                (actualRepayAmount, repayLog) = repayInternal(
                    striker,
                    withdrawAmount
                );

                CallingOutLogStruct memory cols;

                cols.user_address = striker;
                cols.token_address = underlying;
                cols.cheque_token_address = address(this);
                cols.amount_wiped_out = SafeMath.abs(
                    lastFtokenBalance,
                    balanceOf(striker)
                );
                cols.debt_cancelled_out = actualRepayAmount;
                cols.interest_accrued = SafeMath.abs(
                    curBorrowBalance,
                    lastPrincipal
                );
                cols.cheque_token_value = exchangeRateStored();
                cols.loan_interest_rate = interestRateModel.getBorrowRate(
                    tokenCash(underlying, address(controller)),
                    totalBorrows,
                    totalReserves
                );
                cols.account_balance = tokenCash(address(this), striker);
                cols.account_debt = accountBorrows[striker].principal;
                cols.global_token_reserved = tokenCash(
                    underlying,
                    address(controller)
                );

                strikeLog = abi.encode(cols);

                strikeOk = true;
            }
        }
    }

    function balanceOf(address owner) public view returns (uint256) {
        return accountTokens[owner];
    }

    function _setBorrowSafeRatio(uint256 _borrowSafeRatio) public onlyAdmin {
        borrowSafeRatio = _borrowSafeRatio;
    }

    function seizeInternal(
        address seizerToken,
        address liquidator,
        address borrower,
        uint256 seizeTokens
    ) internal {
        require(borrower != liquidator, "Liquidator cannot be borrower");
        controller.seizeCheck(address(this), seizerToken);

        accountTokens[borrower] = accountTokens[borrower].sub(seizeTokens);
        accountTokens[liquidator] = accountTokens[liquidator].add(seizeTokens);

        emit Transfer(borrower, liquidator, seizeTokens);
    }

    // onlyController
    function _reduceReserves(uint256 reduceAmount) external onlyController {
        accrueInterest();

        require(accrualBlockNumber == getBlockNumber(), "Blocknumber fails");
        require(
            controller.getCashPrior(underlying) >= reduceAmount,
            "Insufficient cash"
        );
        require(totalReserves >= reduceAmount, "Insufficient reserves");

        totalReserves = SafeMath.sub(
            totalReserves,
            reduceAmount,
            "reduce reserves underflow"
        );
    }

    function _addReservesFresh(uint256 addAmount) external onlyController {
        accrueInterest();

        require(accrualBlockNumber == getBlockNumber(), "Blocknumber fails");
        totalReserves = SafeMath.add(totalReserves, addAmount);
    }

    function addTotalCash(uint256 _addAmount) public onlyBankComponent {
        totalCash = totalCash.add(_addAmount);
    }

    function subTotalCash(uint256 _subAmount) public onlyBankComponent {
        totalCash = totalCash.sub(_subAmount);
    }

    modifier nonReentrant() {
        require(_notEntered, "re-entered");
        _notEntered = false;
        _;
        _notEntered = true;
    }

    // 借款年利率
    function APR() public view returns (uint256) {
        uint256 cash = tokenCash(underlying, address(controller));
        return interestRateModel.APR(cash, totalBorrows, totalReserves);
    }

    // 存款年利率
    function APY() public view returns (uint256) {
        uint256 cash = tokenCash(underlying, address(controller));
        return
            interestRateModel.APY(
                cash,
                totalBorrows,
                totalReserves,
                reserveFactor
            );
    }

    function utilizationRate() public view returns (uint256) {
        uint256 cash = tokenCash(underlying, address(controller));
        return interestRateModel.utilizationRate(cash, totalBorrows, totalReserves);
    }

    // 借款年利率
    function getBorrowRate() public view returns (uint256) {
        uint256 cash = tokenCash(underlying, address(controller));
        return
            interestRateModel.getBorrowRate(cash, totalBorrows, totalReserves);
    }

    // 存款年利率
    function getSupplyRate() public view returns (uint256) {
        uint256 cash = tokenCash(underlying, address(controller));
        return
            interestRateModel.getSupplyRate(
                cash,
                totalBorrows,
                totalReserves,
                reserveFactor
            );
    }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldInitialExchangeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldUR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldAPR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldAPY","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"exRate1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_initialExchangeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newUR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAPR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAPY","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"exRate2","type":"uint256"}],"name":"NewInitialExchangeRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldIRM","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldUR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldAPR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldAPY","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"exRate1","type":"uint256"},{"indexed":false,"internalType":"address","name":"newIRM","type":"address"},{"indexed":false,"internalType":"uint256","name":"newUR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAPR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAPY","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"exRate2","type":"uint256"}],"name":"NewInterestRateModel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"APR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"APY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"addAmount","type":"uint256"}],"name":"_addReservesFresh","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reduceAmount","type":"uint256"}],"name":"_reduceReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_borrowSafeRatio","type":"uint256"}],"name":"_setBorrowSafeRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"_setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_initialExchangeRate","type":"uint256"}],"name":"_setInitialExchangeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IInterestRateModel","name":"newInterestRateModel","type":"address"}],"name":"_setInterestRateModel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newReserveFactor","type":"uint256"}],"name":"_setReserveFactorFresh","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accountBorrows","outputs":[{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"interestIndex","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accountTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accrualBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accrueInterest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"name":"addExp","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_addAmount","type":"uint256"}],"name":"addTotalCash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOfUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bank","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"borrower","type":"address"},{"internalType":"uint256","name":"borrowAmount","type":"uint256"}],"name":"borrow","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"borrowBalanceCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"borrowBalanceStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowSafeRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"calcBalanceOfUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalBorrows","type":"uint256"},{"internalType":"uint256","name":"_totalReserves","type":"uint256"}],"name":"calcExchangeRate","outputs":[{"internalType":"uint256","name":"exchangeRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"striker","type":"address"}],"name":"cancellingOut","outputs":[{"internalType":"bool","name":"strikeOk","type":"bool"},{"internalType":"bytes","name":"strikeLog","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"contract IBankController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"name":"divExp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"scalar","type":"uint256"}],"name":"divScalar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"scalar","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"divScalarByExp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"scalar","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"divScalarByExpTruncate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"transferInAmout","type":"uint256"}],"name":"exchangeRateAfter","outputs":[{"internalType":"uint256","name":"exchangeRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exchangeRateCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exchangeRateStored","outputs":[{"internalType":"uint256","name":"exchangeRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountState","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBorrowRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"uint256","name":"denom","type":"uint256"}],"name":"getDiv","outputs":[{"internalType":"uint256","name":"rational","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"uint256","name":"denom","type":"uint256"}],"name":"getExp","outputs":[{"internalType":"uint256","name":"rational","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getSupplyRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialExchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_initialExchangeRate","type":"uint256"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_initialInterestRateModel","type":"address"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"address","name":"_bank","type":"address"},{"internalType":"uint256","name":"_borrowSafeRatio","type":"uint256"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interestRateModel","outputs":[{"internalType":"contract IInterestRateModel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"liquidator","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"repayAmount","type":"uint256"},{"internalType":"contract FToken","name":"fTokenCollateral","type":"address"}],"name":"liquidateBorrow","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"name":"mulExp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"},{"internalType":"uint256","name":"c","type":"uint256"}],"name":"mulExp3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"scalar","type":"uint256"}],"name":"mulScalar","outputs":[{"internalType":"uint256","name":"scaled","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"scalar","type":"uint256"}],"name":"mulScalarTruncate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"scalar","type":"uint256"},{"internalType":"uint256","name":"addend","type":"uint256"}],"name":"mulScalarTruncateAddUInt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"peekInterest","outputs":[{"internalType":"uint256","name":"_accrualBlockNumber","type":"uint256"},{"internalType":"uint256","name":"_borrowIndex","type":"uint256"},{"internalType":"uint256","name":"_totalBorrows","type":"uint256"},{"internalType":"uint256","name":"_totalReserves","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"repayAmount","type":"uint256"}],"name":"repay","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"liquidator","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"seizeTokens","type":"uint256"}],"name":"seize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"name":"subExp","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_subAmount","type":"uint256"}],"name":"subTotalCash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"tokenCash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBorrows","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"exp","type":"uint256"}],"name":"truncate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"utilizationRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawer","type":"address"},{"internalType":"uint256","name":"withdrawTokensIn","type":"uint256"},{"internalType":"uint256","name":"withdrawAmountIn","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5061569080620000216000396000f3fe608060405234801561001057600080fd5b50600436106104335760003560e01c806385cc148611610236578063ba1c5e801161013b578063d40e8f4a116100c3578063ef8bd30511610087578063ef8bd305146108c9578063f2b3abbd146108d1578063f3fdb15a146108e4578063f77c4791146108ec578063f851a440146108f457610433565b8063d40e8f4a1461085c578063d6079cc61461087d578063dd62ed3e14610890578063de32abd1146108a3578063e61de305146108b657610433565b8063bee12d531161010a578063bee12d5314610813578063c2ee3a081461081b578063c319f86614610823578063c5e9cadc14610836578063ce603aad1461084957610433565b8063ba1c5e80146107fb578063ba9316b7146105f8578063bd30558e14610803578063bd6d894d1461080b57610433565b8063a19d1460116101be578063ae8a473d1161018d578063ae8a473d1461079c578063b2a02ff1146107af578063b4ab15e7146107c2578063b507f9f9146107d5578063b5c5f672146107e857610433565b8063a19d146014610766578063a6afed9514610779578063a9059cbb14610781578063aa5af0fd1461079457610433565b806395bd6a4c1161020557806395bd6a4c1461070357806395d89b411461071657806395dd91931461071e5780639c92779c146107315780639ee2735b1461074457610433565b806385cc1486146106cd5780638de46362146106d55780638f840ddd146106e857806393508164146106f057610433565b80634751b79c1161033c5780636c540baf116102c457806370a082311161029357806370a082311461068457806376cdb03b146106975780637b94aaac1461069f57806383de424e146106b257806384bdc9a8146106c557610433565b80636c540baf1461064c5780636d019f35146106545780636f307dc31461065c5780636f4a3de91461067157610433565b80635293ff311161030b5780635293ff31146105f8578063601a0bf11461060b5780636208fc411461061e57806364fd7078146106315780636c321c8a1461064457610433565b80634751b79c146105b757806347bd3718146105ca5780634b3ac1c2146105d25780634b8a3529146105e557610433565b806323b872dd116103bf5780633af9e6691161038e5780633af9e6691461056157806340c10f19146105745780634147da13146105875780634322b7141461059a578063474a5e05146105a257610433565b806323b872dd146105135780632985fa3114610526578063313ce56714610539578063396a98cf1461054e57610433565b806315f14eaa1161040657806315f14eaa146104ae57806317bfdfbc146104cf57806318160ddd146104e2578063182df0f5146104ea57806322867d78146104f257610433565b806306fdde031461043857806308186ecf146104565780630873f15014610476578063095ea7b31461048e575b600080fd5b6104406108fc565b60405161044d9190614eda565b60405180910390f35b610469610464366004614b84565b61098a565b60405161044d919061556e565b61047e610a5b565b60405161044d94939291906155b4565b6104a161049c366004614b52565b610d41565b60405161044d9190614eb4565b6104c16104bc366004614a0d565b610daf565b60405161044d929190614ebf565b6104696104dd366004614a0d565b61107c565b61046961113d565b610469611143565b610505610500366004614b52565b611159565b60405161044d929190615577565b6104a1610521366004614ac0565b6111f1565b610469610534366004614c83565b611361565b61054161137a565b60405161044d9190615614565b61046961055c366004614c83565b611383565b61046961056f366004614a0d565b611395565b610440610582366004614b52565b6113d0565b610469610595366004614c83565b611460565b610469611472565b6105b56105b0366004614b84565b611478565b005b6104696105c5366004614c83565b6114a7565b6104696114b9565b6105b56105e0366004614b84565b6114bf565b6104406105f3366004614a29565b6116c1565b610469610606366004614c83565b611736565b6105b5610619366004614b84565b611760565b61046961062c366004614ca4565b6118c9565b61044061063f366004614b00565b6118fa565b610469611f96565b610469612049565b61046961204f565b610664612055565b60405161044d9190614d8f565b6105b561067f366004614bb4565b612064565b610469610692366004614a0d565b6121bf565b6106646121da565b6104696106ad366004614b84565b6121e9565b6105b56106c0366004614a0d565b612203565b61046961224f565b6104696122b1565b6104696106e3366004614ca4565b6122b7565b6104696122cc565b6104696106fe366004614a88565b6122d2565b6105b5610711366004614b84565b612381565b610440612469565b61046961072c366004614a0d565b6124c4565b6105b561073f366004614b84565b6124cf565b610757610752366004614a0d565b612535565b60405161044d9392919061559e565b610469610774366004614a0d565b612576565b6105b5612588565b6104a161078f366004614b52565b612900565b610469612a70565b6105b56107aa366004614b84565b612a76565b6105b56107bd366004614ac0565b612b1e565b6104696107d0366004614c83565b612b78565b6104696107e3366004614c83565b612b90565b6105056107f6366004614a54565b612b9c565b610469612c36565b610469612c93565b610469612cf0565b610469612d51565b610469612d57565b6105b5610831366004614b84565b612d63565b610469610844366004614c83565b612e45565b610469610857366004614c83565b612f0f565b61086f61086a366004614a0d565b612f36565b60405161044d929190615590565b61046961088b366004614c83565b612f4f565b61046961089e366004614a88565b612f5c565b6104696108b1366004614c83565b612f87565b6104696108c4366004614a0d565b612fca565b610469613011565b6105b56108df366004614a0d565b613073565b610664613195565b6106646131a4565b6106646131b3565b6034805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109825780601f1061095757610100808354040283529160200191610982565b820191906000526020600020905b81548152906001019060200180831161096557829003601f168201915b505050505081565b6033546000908061099f575050603854610a56565b60425460408054905163051f87d160e51b81526000926001600160a01b039081169263a3f0fa20926109d992909116908890600401614e3e565b60206040518083038186803b1580156109f157600080fd5b505afa158015610a05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a299190614b9c565b90506000610a44610a3c83603a54611460565b603b54611383565b9050610a508184611736565b93505050505b919050565b600080600080610a696131c2565b603e5490945080851415610a9157603e54603d54603a54603b54945094509450945050610d3b565b604254604080549051639f77437b60e01b81526000926001600160a01b0390811692639f77437b92610ac99290911690600401614d8f565b60206040518083038186803b158015610ae157600080fd5b505afa158015610af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b199190614b9c565b603a54603b54603d54603f546040516315f2405360e01b81529495509293919290916000916001600160a01b0316906315f2405390610b609088908890889060040161559e565b60206040518083038186803b158015610b7857600080fd5b505afa158015610b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb09190614b9c565b905065048c27395000811115610be15760405162461bcd60e51b8152600401610bd8906152a9565b60405180910390fd5b6000610bf38b8863ffffffff6131c616565b90506000806000806000610c078787611361565b9450610c24610c16868c612f87565b670de0b6b3a7640000612b90565b9350610c30848b611460565b9250610c4a610c44610c16603c5487612f87565b8a611460565b9150610c62610c5c610c16878b612f87565b89611460565b9050809e50829d50819c50603f60009054906101000a90046001600160a01b03166001600160a01b03166315f240538c603a54603b546040518463ffffffff1660e01b8152600401610cb69392919061559e565b60206040518083038186803b158015610cce57600080fd5b505afa158015610ce2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d069190614b9c565b965065048c27395000871115610d2e5760405162461bcd60e51b8152600401610bd8906152a9565b5050505050505050505050505b90919293565b3360008181526037602090815260408083206001600160a01b03871680855292528083208590555191929182907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d9b90879061556e565b60405180910390a360019150505b92915050565b6044546000906060906001600160a01b03163314610ddf5760405162461bcd60e51b8152600401610bd890615214565b604454600160a01b900460ff16610e085760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b191690556000610e2084613208565b118015610e3557506000610e33846121bf565b115b1561106257610e42612588565b6001600160a01b03831660009081526045602052604081205490610e6585613208565b90506000610e7286612fca565b90506000610e7f876121bf565b90506000606060006060600087118015610e995750600086115b156110595786861115610ebc57610eb28b60008961326f565b9092509050610ed6565b610ed08b610ec98d6121bf565b600061326f565b90925090505b610ee08b83613512565b9094509250610eed614622565b6001600160a01b03808d1682526040805490911660208301523090820152610f1d86610f188e6121bf565b6137e1565b606082015260808101859052610f33888a6137e1565b60a0820152610f40611143565b60c0820152603f546040546042546001600160a01b03928316926315f2405392610f6e9290821691166122d2565b603a54603b546040518463ffffffff1660e01b8152600401610f929392919061559e565b60206040518083038186803b158015610faa57600080fd5b505afa158015610fbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe29190614b9c565b60e0820152610ff1308d6122d2565b6101008201526001600160a01b03808d1660009081526045602052604090819020546101208401525460425461102b9291821691166122d2565b61014082015260405161104290829060200161536a565b604051602081830303815290604052995060019a50505b50505050505050505b6044805460ff60a01b1916600160a01b1790559092909150565b604454600090600160a01b900460ff166110a85760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b191690556110bd612588565b6110c5614697565b506001600160a01b03821660009081526045602090815260409182902082518084019093528054835260010154908201819052603d5410156111195760405162461bcd60e51b8152600401610bd890615036565b61112283613208565b9150506044805460ff60a01b1916600160a01b179055919050565b60335481565b6000611153603a54603b54612e45565b90505b90565b6044546000906060906001600160a01b031633146111895760405162461bcd60e51b8152600401610bd890615214565b604454600160a01b900460ff166111b25760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b191690556111c7612588565b6111d18484613512565b915091506044805460ff60a01b1916600160a01b17905590939092509050565b604454600090600160a01b900460ff1661121d5760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b19169055611236338585856137fa565b5061123f6146b1565b60408051610100810182526001600160a01b03808816825282541660208201523091810191909152606081018490526080810161127b876121bf565b8152602001856001600160a01b03168152602001611298866121bf565b81526040546042546020909201916112bc916001600160a01b0390811691166122d2565b90526044546040519192506001600160a01b031690637bc597aa906112e5908490602001615505565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401611310919061519b565b600060405180830381600087803b15801561132a57600080fd5b505af115801561133e573d6000803e3d6000fd5b5050505060019150506044805460ff60a01b1916600160a01b1790559392505050565b6000611373838363ffffffff613a9516565b9392505050565b60365460ff1681565b6000611373838363ffffffff6131c616565b6000806113a0612cf0565b6001600160a01b038416600090815260416020526040812054919250906113c8908390612b78565b949350505050565b6044546060906001600160a01b031633146113fd5760405162461bcd60e51b8152600401610bd890615214565b604454600160a01b900460ff166114265760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b1916905561143b612588565b6114458383613acf565b90506044805460ff60a01b1916600160a01b17905592915050565b6000611373838363ffffffff613d6e16565b603c5481565b6039546001600160a01b031633146114a25760405162461bcd60e51b8152600401610bd890615214565b604355565b6000611373838363ffffffff613d9316565b603a5481565b6039546001600160a01b031633146114e95760405162461bcd60e51b8152600401610bd890615214565b60385460006114f6611f96565b90506000611502612c93565b9050600061150e613011565b9050600061151a611143565b9050611524612588565b600061152e611143565b90506115386131c2565b603e54146115585760405162461bcd60e51b8152600401610bd890614fb4565b60388790556000611567611f96565b90506000611573612c93565b9050600061157f613011565b90507fcff2ff0c9e99b301907279a45536b658e0227bfa9d6fba4799b46b268e804e2789898989896038548989898d6040516115c49a999897969594939291906155cf565b60405180910390a16115d461471a565b6040805160a08101825281546001600160a01b03168152600060208201529081016115fd611143565b815260200161160a612c36565b815260405460425460209092019161162e916001600160a01b0390811691166122d2565b90526044546040519192506001600160a01b031690637bc597aa906116579084906020016154c7565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161168291906151ea565b600060405180830381600087803b15801561169c57600080fd5b505af11580156116b0573d6000803e3d6000fd5b505050505050505050505050505050565b6044546060906001600160a01b031633146116ee5760405162461bcd60e51b8152600401610bd890615214565b604454600160a01b900460ff166117175760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b1916905561172c612588565b6114458383613dd5565b60006113738261175485670de0b6b3a764000063ffffffff613a9516565b9063ffffffff613d9316565b6042546001600160a01b0316331461178a5760405162461bcd60e51b8152600401610bd89061508e565b611792612588565b61179a6131c2565b603e54146117ba5760405162461bcd60e51b8152600401610bd890614fb4565b604254604080549051639f77437b60e01b815283926001600160a01b0390811692639f77437b926117f19290911690600401614d8f565b60206040518083038186803b15801561180957600080fd5b505afa15801561181d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118419190614b9c565b101561185f5760405162461bcd60e51b8152600401610bd8906152e0565b80603b5410156118815760405162461bcd60e51b8152600401610bd890614fdf565b6118c3603b54826040518060400160405280601981526020017f72656475636520726573657276657320756e646572666c6f7700000000000000815250614098565b603b5550565b6000806118d68585611361565b90506118f1836118e5836121e9565b9063ffffffff613d6e16565b95945050505050565b6044546060906001600160a01b031633146119275760405162461bcd60e51b8152600401610bd890615214565b604454600160a01b900460ff166119505760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b19169055604254604051632a4d98cf60e01b81526001600160a01b0390911690632a4d98cf9061198d903090600401614d8f565b60206040518083038186803b1580156119a557600080fd5b505afa1580156119b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119dd9190614b64565b8015611a645750604254604051632a4d98cf60e01b81526001600160a01b0390911690632a4d98cf90611a14908590600401614d8f565b60206040518083038186803b158015611a2c57600080fd5b505afa158015611a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a649190614b64565b611a805760405162461bcd60e51b8152600401610bd890614f5b565b611a88612588565b816001600160a01b031663a6afed956040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ac357600080fd5b505af1158015611ad7573d6000803e3d6000fd5b5050506001600160a01b0385166000908152604560205260408120549150611afe86613208565b604254604051633e5cd62160e11b81529192506001600160a01b031690637cb9ac4290611b3790309088908b908d908c90600401614e0b565b600060405180830381600087803b158015611b5157600080fd5b505af1158015611b65573d6000803e3d6000fd5b50505050611b716131c2565b603e5414611b915760405162461bcd60e51b8152600401610bd890614fb4565b611b996131c2565b846001600160a01b0316636c540baf6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bd257600080fd5b505afa158015611be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0a9190614b9c565b14611c275760405162461bcd60e51b8152600401610bd890614fb4565b6000611c338787613512565b506042546040516263fd3760e51b81529192506000916001600160a01b0390911690630c7fa6e090611c6d9030908a908790600401614de7565b60206040518083038186803b158015611c8557600080fd5b505afa158015611c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbd9190614b9c565b905080866001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401611cec9190614d8f565b60206040518083038186803b158015611d0457600080fd5b505afa158015611d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3c9190614b9c565b1015611d5a5760405162461bcd60e51b8152600401610bd89061500e565b6001600160a01b038616301415611d7c57611d77308a8a846140c4565b611ddf565b60405163b2a02ff160e01b81526001600160a01b0387169063b2a02ff190611dac908c908c908690600401614de7565b600060405180830381600087803b158015611dc657600080fd5b505af1158015611dda573d6000803e3d6000fd5b505050505b604054604254600091611e049185916118e5916001600160a01b0391821691166122d2565b9050611e0e614752565b604080516101c0810182526001600160a01b03808e168252825416602082015230918101919091526060810185905260808101611e4b87896137e1565b81526020018b6001600160a01b03168152602001848152602001896001600160a01b03168152602001611e7e8a8d6122d2565b81526001600160a01b038c16600090815260456020908152604091829020549083015201611eab8661098a565b8152603f54603a54603b546040516315f2405360e01b81526020909401936001600160a01b03909316926315f2405392611ee992899260040161559e565b60206040518083038186803b158015611f0157600080fd5b505afa158015611f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f399190614b9c565b8152602001611f488a8e6122d2565b815260200183815250905080604051602001611f649190615400565b60405160208183030381529060405296505050505050506044805460ff60a01b1916600160a01b179055949350505050565b6040546042546000918291611fb7916001600160a01b0390811691166122d2565b603f54603a54603b54604051630dce3c5b60e31b81529394506001600160a01b0390921692636e71e2d892611ff392869290919060040161559e565b60206040518083038186803b15801561200b57600080fd5b505afa15801561201f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120439190614b9c565b91505090565b603e5481565b60385481565b6040546001600160a01b031681565b600054610100900460ff168061207d575061207d614206565b8061208b575060005460ff16155b6120a75760405162461bcd60e51b8152600401610bd89061514d565b600054610100900460ff161580156120d2576000805460ff1961ff0019909116610100171660011790555b60388a9055604280546001600160a01b03808c166001600160a01b031992831617909255603f80548b84169083161790556039805482163317905560408054928a1692909116919091179055604385905561212b6131c2565b603e55670de0b6b3a7640000603d55604480546001600160a01b0319166001600160a01b03881617905583516121689060349060208701906147ee565b50825161217c9060359060208601906147ee565b506036805460ff841660ff199091161790556044805460ff60a01b1916600160a01b17905580156121b3576000805461ff00191690555b50505050505050505050565b6001600160a01b031660009081526041602052604090205490565b6044546001600160a01b031681565b6000610da982670de0b6b3a764000063ffffffff613d9316565b6039546001600160a01b0316331461222d5760405162461bcd60e51b8152600401610bd890615214565b604280546001600160a01b0319166001600160a01b0392909216919091179055565b6040546042546000918291612270916001600160a01b0390811691166122d2565b603f54603a54603b54603c54604051635c0b440b60e11b81529495506001600160a01b039093169363b816881693611ff393879390929091906004016155b4565b60435481565b60006113c86122c68585612f87565b83612f87565b603b5481565b60006122dc61420c565b6001600160a01b0316836001600160a01b0316141561230557816001600160a01b031631611373565b6040516370a0823160e01b81526001600160a01b038416906370a0823190612331908590600401614d8f565b60206040518083038186803b15801561234957600080fd5b505afa15801561235d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113739190614b9c565b6044546001600160a01b03163314806123a457506042546001600160a01b031633145b806123ae57503330145b806124345750604254604051639deec7cb60e01b81526001600160a01b0390911690639deec7cb906123e4903390600401614d8f565b60206040518083038186803b1580156123fc57600080fd5b505afa158015612410573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124349190614b64565b6124505760405162461bcd60e51b8152600401610bd890615061565b604654612463908263ffffffff613d6e16565b60465550565b6035805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109825780601f1061095757610100808354040283529160200191610982565b6000610da982613208565b6042546001600160a01b031633146124f95760405162461bcd60e51b8152600401610bd89061508e565b612501612588565b6125096131c2565b603e54146125295760405162461bcd60e51b8152600401610bd890614fb4565b6118c3603b5482613d6e565b6001600160a01b038116600090815260416020526040812054819081908161255c86613208565b90506000612568611143565b929791965091945092505050565b60416020526000908152604090205481565b6039546001600160a01b03163314806125ab57506044546001600160a01b031633145b806125c057506042546001600160a01b031633145b806126465750604254604051639deec7cb60e01b81526001600160a01b0390911690639deec7cb906125f6903390600401614d8f565b60206040518083038186803b15801561260e57600080fd5b505afa158015612622573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126469190614b64565b6126625760405162461bcd60e51b8152600401610bd89061511f565b600061266c6131c2565b603e54909150808214156126815750506128fe565b604254604080549051639f77437b60e01b81526000926001600160a01b0390811692639f77437b926126b99290911690600401614d8f565b60206040518083038186803b1580156126d157600080fd5b505afa1580156126e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127099190614b9c565b603a54603b54603d54603f546040516315f2405360e01b81529495509293919290916000916001600160a01b0316906315f24053906127509088908890889060040161559e565b60206040518083038186803b15801561276857600080fd5b505afa15801561277c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a09190614b9c565b905065048c273950008111156127c85760405162461bcd60e51b8152600401610bd8906152a9565b60006127da888863ffffffff6131c616565b905060008060008060006127ee8787611361565b94506127fd610c16868c612f87565b9350612809848b611460565b925061281d610c44610c16603c5487612f87565b915061282f610c5c610c16878b612f87565b603e8e9055603d819055603a849055603b839055603f546040516315f2405360e01b81529192506001600160a01b0316906315f2405390612878908e908790879060040161559e565b60206040518083038186803b15801561289057600080fd5b505afa1580156128a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c89190614b9c565b965065048c273950008711156128f05760405162461bcd60e51b8152600401610bd8906152a9565b505050505050505050505050505b565b604454600090600160a01b900460ff1661292c5760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b19169055612945338085856137fa565b5061294e6146b1565b60408051610100810182523380825282546001600160a01b0316602083015230928201929092526060810185905290608082019061298b906121bf565b8152602001856001600160a01b031681526020016129a8866121bf565b81526040546042546020909201916129cc916001600160a01b0390811691166122d2565b90526044546040519192506001600160a01b031690637bc597aa906129f5908490602001615505565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401612a20919061530b565b600060405180830381600087803b158015612a3a57600080fd5b505af1158015612a4e573d6000803e3d6000fd5b5050505060019150506044805460ff60a01b1916600160a01b17905592915050565b603d5481565b6039546001600160a01b03163314612aa05760405162461bcd60e51b8152600401610bd890615214565b604454600160a01b900460ff16612ac95760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b19169055612ade612588565b612ae66131c2565b603e5414612b065760405162461bcd60e51b8152600401610bd890614fb4565b603c556044805460ff60a01b1916600160a01b179055565b604454600160a01b900460ff16612b475760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b19169055612b60338484846140c4565b50506044805460ff60a01b1916600160a01b17905550565b600080612b858484611361565b90506113c8816121e9565b60006113738383611736565b6044546000906060906001600160a01b03163314612bcc5760405162461bcd60e51b8152600401610bd890615214565b604454600160a01b900460ff16612bf55760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b19169055612c0a612588565b612c15858585614224565b915091506044805460ff60a01b1916600160a01b1790559094909350915050565b6040546042546000918291612c57916001600160a01b0390811691166122d2565b603f54603a54603b546040516315f2405360e01b81529394506001600160a01b03909216926315f2405392611ff392869290919060040161559e565b6040546042546000918291612cb4916001600160a01b0390811691166122d2565b603f54603a54603b5460405163ca9cdd1b60e01b81529394506001600160a01b039092169263ca9cdd1b92611ff392869290919060040161559e565b604454600090600160a01b900460ff16612d1c5760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b19169055612d31612588565b612d39611143565b90506044805460ff60a01b1916600160a01b17905590565b60465481565b670de0b6b3a764000081565b6044546001600160a01b0316331480612d8657506042546001600160a01b031633145b80612d9057503330145b80612e165750604254604051639deec7cb60e01b81526001600160a01b0390911690639deec7cb90612dc6903390600401614d8f565b60206040518083038186803b158015612dde57600080fd5b505afa158015612df2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e169190614b64565b612e325760405162461bcd60e51b8152600401610bd890615061565b604654612463908263ffffffff6131c616565b60335460009080612e5a575050603854610da9565b604254604080549051639f77437b60e01b81526000926001600160a01b0390811692639f77437b92612e929290911690600401614d8f565b60206040518083038186803b158015612eaa57600080fd5b505afa158015612ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee29190614b9c565b90506000612ef9612ef38388611460565b86611383565b9050612f058184611736565b9695505050505050565b600080612f2a670de0b6b3a76400008563ffffffff613a9516565b90506113c88184611736565b6045602052600090815260409020805460019091015482565b600080612b858484612f0f565b6001600160a01b03918216600090815260376020908152604080832093909416825291909152205490565b600080612f9a848463ffffffff613a9516565b90506000612fb06706f05b59d3b2000083613d6e565b90506118f181670de0b6b3a764000063ffffffff613d9316565b6000806000612fd7610a5b565b9350935050506000612fe98383612e45565b6001600160a01b03861660009081526041602052604081205491925090612f05908390612b78565b6040546042546000918291613032916001600160a01b0390811691166122d2565b603f54603a54603b54603c5460405163ae8b520f60e01b81529495506001600160a01b039093169363ae8b520f93611ff393879390929091906004016155b4565b6039546001600160a01b0316331461309d5760405162461bcd60e51b8152600401610bd890615214565b603f546001600160a01b031660006130b3611f96565b905060006130bf612c93565b905060006130cb613011565b905060006130d7611143565b90506130e1612588565b60006130eb611143565b90506130f56131c2565b603e54146131155760405162461bcd60e51b8152600401610bd890614fb4565b603f80546001600160a01b0319166001600160a01b038916179055600061313a611f96565b90506000613146612c93565b90506000613152613011565b90507fdeb648bcaeacc8fe85ac80af712d28507d5040e38de659e3981835f7732b580e89898989898f8989898d6040516115c49a99989796959493929190614e57565b603f546001600160a01b031681565b6042546001600160a01b031681565b6039546001600160a01b031681565b4390565b600061137383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614098565b6000613212614697565b506001600160a01b0382166000908152604560209081526040918290208251808401909352805480845260019091015491830191909152613257576000915050610a56565b61137381600001516108b1603d548460200151612b90565b6000606083158061327e575082155b61329a5760405162461bcd60e51b8152600401610bd890614eed565b6132a261486c565b6132aa611143565b815284156132cf576020810185905280516132c59086612b78565b60408201526132ea565b6132dd848260000151612f4f565b6020820152604081018490525b6132f26131c2565b603e54146133125760405162461bcd60e51b8152600401610bd890614fb4565b60208101516033546133299163ffffffff6131c616565b60608201526020808201516001600160a01b0388166000908152604190925260409091205461335d9163ffffffff6131c616565b6080820181905260608201516033556001600160a01b038088166000908152604160205260408082209390935582840151925460425491936133a89390926118e592821691166122d2565b90506133b261489b565b60408051610120810182526001600160a01b03808b1682528254166020808301919091523082840152850151606082015290840151608082015260a081016133f8611143565b8152603f54603a54603b546040516315f2405360e01b81526020909401936001600160a01b03909316926315f240539261343692899260040161559e565b60206040518083038186803b15801561344e57600080fd5b505afa158015613462573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134869190614b9c565b8152602001613495308b6122d2565b815260200183815250905060006001600160a01b0316886001600160a01b031660008051602061563b83398151915285602001516040516134d6919061556e565b60405180910390a38260400151816040516020016134f4919061535b565b60405160208183030381529060405294509450505050935093915050565b60425460408054905163227a5a8360e11b81526000926060926001600160a01b03918216926344f4b5069261354b921690600401614d8f565b600060405180830381600087803b15801561356557600080fd5b505af1158015613579573d6000803e3d6000fd5b505050506135856131c2565b603e54146135a55760405162461bcd60e51b8152600401610bd890614fb4565b6135ad614902565b6001600160a01b03851660009081526045602090815260409091208054600190910154918301919091526135e086613208565b60408301526000198514156135fb57604082015182526135ff565b8482525b815160408301516136159163ffffffff6131c616565b60608301528151603a541015613631576000608083015261364b565b8151603a546136459163ffffffff6131c616565b60808301525b60608201516001600160a01b03808816600090815260456020526040808220938455603d546001909401939093556080850151603a5584519254604254919361369d9390926118e592821691166122d2565b90506136a761489b565b60408051610120810182526001600160a01b03808b16825282541660208201523081830152855160608201529085015160808201906136e690866137e1565b81526020016136f8866000015161098a565b8152603f54603a54603b546040516315f2405360e01b81526020909401936001600160a01b03909316926315f240539261373692899260040161559e565b60206040518083038186803b15801561374e57600080fd5b505afa158015613762573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137869190614b9c565b81526001600160a01b038a16600090815260456020908152604091829020548184015291810185905286519051929350916137c39184910161535b565b60405160208183030381529060405295509550505050509250929050565b6000818310156137f45750818103610da9565b50900390565b60445460408051635c975abb60e01b815290516000926001600160a01b031691635c975abb916004808301926020929190829003018186803b15801561383f57600080fd5b505afa158015613853573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138779190614b64565b156138945760405162461bcd60e51b8152600401610bd8906151c3565b604260009054906101000a90046001600160a01b03166001600160a01b031663d38120c93086866138c787604354612b78565b6040518563ffffffff1660e01b81526004016138e69493929190614da3565b600060405180830381600087803b15801561390057600080fd5b505af1158015613914573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316141561394a5760405162461bcd60e51b8152600401610bd890615272565b60006001600160a01b0386811690861614156139695750600019613991565b506001600160a01b038085166000908152603760209081526040808320938916835292905220545b60006139a3828563ffffffff6131c616565b6001600160a01b0387166000908152604160205260409020549091506139cf908563ffffffff6131c616565b6001600160a01b038088166000908152604160205260408082209390935590871681522054613a04908563ffffffff613d6e16565b6001600160a01b0386166000908152604160205260409020556000198214613a4f576001600160a01b038087166000908152603760209081526040808320938b168352929052208190555b846001600160a01b0316866001600160a01b031660008051602061563b83398151915286604051613a80919061556e565b60405180910390a35060019695505050505050565b600082613aa457506000610da9565b82820282848281613ab157fe5b04146113735760405162461bcd60e51b8152600401610bd8906150ba565b6060613ad96131c2565b603e5414613af95760405162461bcd60e51b8152600401610bd890614fb4565b613b0161486c565b604254604080549051631f3c14ef60e11b81526001600160a01b0392831692633e7829de92613b399291169088908890600401614de7565b600060405180830381600087803b158015613b5357600080fd5b505af1158015613b67573d6000803e3d6000fd5b50505050613b73611143565b808252613b81908490612f4f565b60208201819052603354613b9491611460565b6040808301919091526001600160a01b0385166000908152604160209081529190205490820151613bc59190611460565b606082018190526040808301516033556001600160a01b0380871660009081526041602052828120939093559054604254613c0a9287926118e59290821691166122d2565b9050613c1461489b565b60408051610120810182526001600160a01b03808916825282541660208083019190915230928201929092529084015160608201526080810186905260a08101613c5d8761098a565b8152603f54603a54603b546040516315f2405360e01b81526020909401936001600160a01b03909316926315f2405392613c9b92899260040161559e565b60206040518083038186803b158015613cb357600080fd5b505afa158015613cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ceb9190614b9c565b8152602001613cfa30896122d2565b8152602001838152509050856001600160a01b031660006001600160a01b031660008051602061563b8339815191528560200151604051613d3b919061556e565b60405180910390a380604051602001613d54919061535b565b604051602081830303815290604052935050505092915050565b6000828201838110156113735760405162461bcd60e51b8152600401610bd890614f24565b600061137383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506145eb565b6042546040546043546060926001600160a01b03908116926396a13b32928792909116903090613e06908890612b78565b6040518563ffffffff1660e01b8152600401613e259493929190614da3565b600060405180830381600087803b158015613e3f57600080fd5b505af1158015613e53573d6000803e3d6000fd5b5050604254604080549051639f77437b60e01b81528694506001600160a01b039283169350639f77437b92613e8c921690600401614d8f565b60206040518083038186803b158015613ea457600080fd5b505afa158015613eb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613edc9190614b9c565b1015613efa5760405162461bcd60e51b8152600401610bd890614f86565b613f02614938565b6001600160a01b038416600090815260456020526040902054613f2485613208565b808352613f319085611460565b6020830152603a54613f439085611460565b60408084019182526020808501516001600160a01b03808a166000908152604590935291839020908155603d546001909101559151603a556042548154915163fa93b2a560e01b81529083169263fa93b2a592613fa99291169089908990600401614de7565b600060405180830381600087803b158015613fc357600080fd5b505af1158015613fd7573d6000803e3d6000fd5b50505050613fe484612d63565b613fec61489b565b60408051610120810182526001600160a01b03808916825282541660208201523091810191909152606081018690528351608082019061402c90856137e1565b8152602001614039611143565b8152602001614046612c36565b81526001600160a01b038089166000908152604560209081526040918290205490840152805460425491909301926140829290811691166122d2565b815250905080604051602001613d54919061535b565b600081848411156140bc5760405162461bcd60e51b8152600401610bd89190614eda565b505050900390565b826001600160a01b0316826001600160a01b031614156140f65760405162461bcd60e51b8152600401610bd89061523b565b604254604051637ceb4c9760e01b81526001600160a01b0390911690637ceb4c97906141289030908890600401614dcd565b600060405180830381600087803b15801561414257600080fd5b505af1158015614156573d6000803e3d6000fd5b5050506001600160a01b03831660009081526041602052604090205461418391508263ffffffff6131c616565b6001600160a01b0380841660009081526041602052604080822093909355908516815220546141b8908263ffffffff613d6e16565b6001600160a01b03808516600081815260416020526040908190209390935591519084169060008051602061563b833981519152906141f890859061556e565b60405180910390a350505050565b303b1590565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b60006060831580614233575082155b61424f5760405162461bcd60e51b8152600401610bd890614eed565b61425761486c565b61425f611143565b815284156142845760208101859052805161427a9086612b78565b604082015261429f565b614292848260000151612f4f565b6020820152604081018490525b6042546020820151604051635798612960e01b81526001600160a01b03909216916357986129916142d69130918b91600401614de7565b60206040518083038186803b1580156142ee57600080fd5b505afa158015614302573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143269190614b9c565b5061432f6131c2565b603e541461434f5760405162461bcd60e51b8152600401610bd890614fb4565b60208101516033546143669163ffffffff6131c616565b60608201526020808201516001600160a01b0388166000908152604190925260409091205461439a9163ffffffff6131c616565b608082015260408082015160425482549251639f77437b60e01b815291926001600160a01b0391821692639f77437b926143d8921690600401614d8f565b60206040518083038186803b1580156143f057600080fd5b505afa158015614404573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144289190614b9c565b10156144465760405162461bcd60e51b8152600401610bd89061532f565b6042546040805483820151915163fa93b2a560e01b81526001600160a01b039384169363fa93b2a59361448293909116918b9190600401614de7565b600060405180830381600087803b15801561449c57600080fd5b505af11580156144b0573d6000803e3d6000fd5b505050506144c18160400151612d63565b606081015160335560808101516001600160a01b0387166000908152604160205260409020556144ef61489b565b60408051610120810182526001600160a01b03808a1682528254166020808301919091523082840152840151606082015290830151608082015260a08101614535611143565b8152602001614542612c36565b8152602001614551308a6122d2565b8152604054604254602090920191614575916001600160a01b0390811691166122d2565b815250905060006001600160a01b0316876001600160a01b031660008051602061563b83398151915284602001516040516145b0919061556e565b60405180910390a38160400151816040516020016145ce919061535b565b604051602081830303815290604052935093505050935093915050565b6000818361460c5760405162461bcd60e51b8152600401610bd89190614eda565b50600083858161461857fe5b0495945050505050565b60405180610160016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b60405180610100016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081525090565b6040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b604051806101c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160006001600160a01b031681526020016000815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061482f57805160ff191683800117855561485c565b8280016001018555821561485c579182015b8281111561485c578251825591602001919060010190614841565b50614868929150614959565b5090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180606001604052806000815260200160008152602001600081525090565b61115691905b80821115614868576000815560010161495f565b8035610da981615622565b600082601f83011261498e578081fd5b813567ffffffffffffffff808211156149a5578283fd5b604051601f8301601f1916810160200182811182821017156149c5578485fd5b6040528281529250828483016020018610156149e057600080fd5b8260208601602083013760006020848301015250505092915050565b803560ff81168114610da957600080fd5b600060208284031215614a1e578081fd5b813561137381615622565b60008060408385031215614a3b578081fd5b8235614a4681615622565b946020939093013593505050565b600080600060608486031215614a68578081fd5b8335614a7381615622565b95602085013595506040909401359392505050565b60008060408385031215614a9a578182fd5b8235614aa581615622565b91506020830135614ab581615622565b809150509250929050565b600080600060608486031215614ad4578283fd5b8335614adf81615622565b92506020840135614aef81615622565b929592945050506040919091013590565b60008060008060808587031215614b15578081fd5b8435614b2081615622565b93506020850135614b3081615622565b9250604085013591506060850135614b4781615622565b939692955090935050565b60008060408385031215614a3b578182fd5b600060208284031215614b75578081fd5b81518015158114611373578182fd5b600060208284031215614b95578081fd5b5035919050565b600060208284031215614bad578081fd5b5051919050565b60008060008060008060008060006101208a8c031215614bd2578485fd5b8935985060208a0135614be481615622565b975060408a0135614bf481615622565b9650614c038b60608c01614973565b9550614c128b60808c01614973565b945060a08a0135935060c08a013567ffffffffffffffff80821115614c35578485fd5b614c418d838e0161497e565b945060e08c0135915080821115614c56578384fd5b50614c638c828d0161497e565b925050614c748b6101008c016149fc565b90509295985092959850929598565b60008060408385031215614c95578081fd5b50508035926020909101359150565b600080600060608486031215614cb8578081fd5b505081359360208301359350604090920135919050565b6001600160a01b03169052565b60008151808452815b81811015614d0157602081850181015186830182015201614ce5565b81811115614d125782602083870101525b50601f01601f19169290920160200192915050565b60018060a01b0380825116835280602083015116602084015280604083015116604084015250606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b6001600160a01b0391909116815260200190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039586168152938516602085015291841660408401529092166060820152608081019190915260a00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039a8b1681526020810199909952604089019790975260608801959095526080870193909352951660a085015260c084019490945260e08301939093526101008201929092526101208101919091526101400190565b901515815260200190565b60008315158252604060208301526113c86040830184614cdc565b6000602082526113736020830184614cdc565b6020808252601c908201527f776974686472617720706172616d65746572206e6f742076616c696400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526011908201527013585c9ad95d081b9bdd081b1a5cdd1959607a1b604082015260600190565b602080825260149082015273496e73756666696369656e742062616c616e636560601b604082015260600190565b602080825260119082015270426c6f636b6e756d626572206661696c7360781b604082015260600190565b602080825260159082015274496e73756666696369656e7420726573657276657360581b604082015260600190565b6020808252600e908201526d0a6cad2f4ca40e8dede40daeac6d60931b604082015260600190565b6020808252601190820152703137b93937bba4b73232bc1032b93937b960791b604082015260600190565b6020808252601390820152721bdb9b1e4818985b9ac818dbdb5c1bdb995b9d606a1b604082015260600190565b6020808252601290820152713932b8bab4b9329031b7b73a3937b63632b960711b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252600a90820152691c994b595b9d195c995960b21b604082015260600190565b60208082526014908201527337b7363c903932b9ba3934b1ba32b2103ab9b2b960611b604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60006b5472616e7366657246726f6d60a01b8252604060208301526113736040830184614cdc565b6020808252600d908201526c14de5cdd195b481c185d5cd959609a1b604082015260600190565b60006d14995cd95c9d9951195c1bdcda5d60921b8252604060208301526113736040830184614cdc565b6020808252600d908201526c3932b8bab4b9329030b236b4b760991b604082015260600190565b6020808252601d908201527f4c697175696461746f722063616e6e6f7420626520626f72726f776572000000604082015260600190565b60208082526017908201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604082015260600190565b60208082526017908201527f626f72726f77207261746520697320746f6f2068696768000000000000000000604082015260600190565b602080825260119082015270092dce6eaccccd2c6d2cadce840c6c2e6d607b1b604082015260600190565b6000672a3930b739b332b960c11b8252604060208301526113736040830184614cdc565b602080825260129082015271496e73756666696369656e74206d6f6e657960701b604082015260600190565b6101208101610da98284614d27565b60006101608201905061537e828451614ccf565b60208301516153906020840182614ccf565b5060408301516153a36040840182614ccf565b50606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151818401525092915050565b60006101c082019050615414828451614ccf565b60208301516154266020840182614ccf565b5060408301516154396040840182614ccf565b50606083015160608301526080830151608083015260a083015161546060a0840182614ccf565b5060c083015160c083015260e083015161547d60e0840182614ccf565b50610100838101519083015261012080840151908301526101408084015190830152610160808401519083015261018080840151908301526101a092830151929091019190915290565b81516001600160a01b031681526020808301519082015260408083015190820152606080830151908201526080918201519181019190915260a00190565b60006101008201905060018060a01b0380845116835280602085015116602084015280604085015116604084015260608401516060840152608084015160808401528060a08501511660a08401525060c083015160c083015260e083015160e083015292915050565b90815260200190565b6000838252604060208301526113c86040830184614cdc565b918252602082015260400190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b998a5260208a019890985260408901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201526101400190565b60ff91909116815260200190565b6001600160a01b038116811461563757600080fd5b5056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c66381ca7253dddb0f78654edcd2c95941524b173e5fe168e67bab897644a63364736f6c63430006040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106104335760003560e01c806385cc148611610236578063ba1c5e801161013b578063d40e8f4a116100c3578063ef8bd30511610087578063ef8bd305146108c9578063f2b3abbd146108d1578063f3fdb15a146108e4578063f77c4791146108ec578063f851a440146108f457610433565b8063d40e8f4a1461085c578063d6079cc61461087d578063dd62ed3e14610890578063de32abd1146108a3578063e61de305146108b657610433565b8063bee12d531161010a578063bee12d5314610813578063c2ee3a081461081b578063c319f86614610823578063c5e9cadc14610836578063ce603aad1461084957610433565b8063ba1c5e80146107fb578063ba9316b7146105f8578063bd30558e14610803578063bd6d894d1461080b57610433565b8063a19d1460116101be578063ae8a473d1161018d578063ae8a473d1461079c578063b2a02ff1146107af578063b4ab15e7146107c2578063b507f9f9146107d5578063b5c5f672146107e857610433565b8063a19d146014610766578063a6afed9514610779578063a9059cbb14610781578063aa5af0fd1461079457610433565b806395bd6a4c1161020557806395bd6a4c1461070357806395d89b411461071657806395dd91931461071e5780639c92779c146107315780639ee2735b1461074457610433565b806385cc1486146106cd5780638de46362146106d55780638f840ddd146106e857806393508164146106f057610433565b80634751b79c1161033c5780636c540baf116102c457806370a082311161029357806370a082311461068457806376cdb03b146106975780637b94aaac1461069f57806383de424e146106b257806384bdc9a8146106c557610433565b80636c540baf1461064c5780636d019f35146106545780636f307dc31461065c5780636f4a3de91461067157610433565b80635293ff311161030b5780635293ff31146105f8578063601a0bf11461060b5780636208fc411461061e57806364fd7078146106315780636c321c8a1461064457610433565b80634751b79c146105b757806347bd3718146105ca5780634b3ac1c2146105d25780634b8a3529146105e557610433565b806323b872dd116103bf5780633af9e6691161038e5780633af9e6691461056157806340c10f19146105745780634147da13146105875780634322b7141461059a578063474a5e05146105a257610433565b806323b872dd146105135780632985fa3114610526578063313ce56714610539578063396a98cf1461054e57610433565b806315f14eaa1161040657806315f14eaa146104ae57806317bfdfbc146104cf57806318160ddd146104e2578063182df0f5146104ea57806322867d78146104f257610433565b806306fdde031461043857806308186ecf146104565780630873f15014610476578063095ea7b31461048e575b600080fd5b6104406108fc565b60405161044d9190614eda565b60405180910390f35b610469610464366004614b84565b61098a565b60405161044d919061556e565b61047e610a5b565b60405161044d94939291906155b4565b6104a161049c366004614b52565b610d41565b60405161044d9190614eb4565b6104c16104bc366004614a0d565b610daf565b60405161044d929190614ebf565b6104696104dd366004614a0d565b61107c565b61046961113d565b610469611143565b610505610500366004614b52565b611159565b60405161044d929190615577565b6104a1610521366004614ac0565b6111f1565b610469610534366004614c83565b611361565b61054161137a565b60405161044d9190615614565b61046961055c366004614c83565b611383565b61046961056f366004614a0d565b611395565b610440610582366004614b52565b6113d0565b610469610595366004614c83565b611460565b610469611472565b6105b56105b0366004614b84565b611478565b005b6104696105c5366004614c83565b6114a7565b6104696114b9565b6105b56105e0366004614b84565b6114bf565b6104406105f3366004614a29565b6116c1565b610469610606366004614c83565b611736565b6105b5610619366004614b84565b611760565b61046961062c366004614ca4565b6118c9565b61044061063f366004614b00565b6118fa565b610469611f96565b610469612049565b61046961204f565b610664612055565b60405161044d9190614d8f565b6105b561067f366004614bb4565b612064565b610469610692366004614a0d565b6121bf565b6106646121da565b6104696106ad366004614b84565b6121e9565b6105b56106c0366004614a0d565b612203565b61046961224f565b6104696122b1565b6104696106e3366004614ca4565b6122b7565b6104696122cc565b6104696106fe366004614a88565b6122d2565b6105b5610711366004614b84565b612381565b610440612469565b61046961072c366004614a0d565b6124c4565b6105b561073f366004614b84565b6124cf565b610757610752366004614a0d565b612535565b60405161044d9392919061559e565b610469610774366004614a0d565b612576565b6105b5612588565b6104a161078f366004614b52565b612900565b610469612a70565b6105b56107aa366004614b84565b612a76565b6105b56107bd366004614ac0565b612b1e565b6104696107d0366004614c83565b612b78565b6104696107e3366004614c83565b612b90565b6105056107f6366004614a54565b612b9c565b610469612c36565b610469612c93565b610469612cf0565b610469612d51565b610469612d57565b6105b5610831366004614b84565b612d63565b610469610844366004614c83565b612e45565b610469610857366004614c83565b612f0f565b61086f61086a366004614a0d565b612f36565b60405161044d929190615590565b61046961088b366004614c83565b612f4f565b61046961089e366004614a88565b612f5c565b6104696108b1366004614c83565b612f87565b6104696108c4366004614a0d565b612fca565b610469613011565b6105b56108df366004614a0d565b613073565b610664613195565b6106646131a4565b6106646131b3565b6034805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109825780601f1061095757610100808354040283529160200191610982565b820191906000526020600020905b81548152906001019060200180831161096557829003601f168201915b505050505081565b6033546000908061099f575050603854610a56565b60425460408054905163051f87d160e51b81526000926001600160a01b039081169263a3f0fa20926109d992909116908890600401614e3e565b60206040518083038186803b1580156109f157600080fd5b505afa158015610a05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a299190614b9c565b90506000610a44610a3c83603a54611460565b603b54611383565b9050610a508184611736565b93505050505b919050565b600080600080610a696131c2565b603e5490945080851415610a9157603e54603d54603a54603b54945094509450945050610d3b565b604254604080549051639f77437b60e01b81526000926001600160a01b0390811692639f77437b92610ac99290911690600401614d8f565b60206040518083038186803b158015610ae157600080fd5b505afa158015610af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b199190614b9c565b603a54603b54603d54603f546040516315f2405360e01b81529495509293919290916000916001600160a01b0316906315f2405390610b609088908890889060040161559e565b60206040518083038186803b158015610b7857600080fd5b505afa158015610b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb09190614b9c565b905065048c27395000811115610be15760405162461bcd60e51b8152600401610bd8906152a9565b60405180910390fd5b6000610bf38b8863ffffffff6131c616565b90506000806000806000610c078787611361565b9450610c24610c16868c612f87565b670de0b6b3a7640000612b90565b9350610c30848b611460565b9250610c4a610c44610c16603c5487612f87565b8a611460565b9150610c62610c5c610c16878b612f87565b89611460565b9050809e50829d50819c50603f60009054906101000a90046001600160a01b03166001600160a01b03166315f240538c603a54603b546040518463ffffffff1660e01b8152600401610cb69392919061559e565b60206040518083038186803b158015610cce57600080fd5b505afa158015610ce2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d069190614b9c565b965065048c27395000871115610d2e5760405162461bcd60e51b8152600401610bd8906152a9565b5050505050505050505050505b90919293565b3360008181526037602090815260408083206001600160a01b03871680855292528083208590555191929182907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d9b90879061556e565b60405180910390a360019150505b92915050565b6044546000906060906001600160a01b03163314610ddf5760405162461bcd60e51b8152600401610bd890615214565b604454600160a01b900460ff16610e085760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b191690556000610e2084613208565b118015610e3557506000610e33846121bf565b115b1561106257610e42612588565b6001600160a01b03831660009081526045602052604081205490610e6585613208565b90506000610e7286612fca565b90506000610e7f876121bf565b90506000606060006060600087118015610e995750600086115b156110595786861115610ebc57610eb28b60008961326f565b9092509050610ed6565b610ed08b610ec98d6121bf565b600061326f565b90925090505b610ee08b83613512565b9094509250610eed614622565b6001600160a01b03808d1682526040805490911660208301523090820152610f1d86610f188e6121bf565b6137e1565b606082015260808101859052610f33888a6137e1565b60a0820152610f40611143565b60c0820152603f546040546042546001600160a01b03928316926315f2405392610f6e9290821691166122d2565b603a54603b546040518463ffffffff1660e01b8152600401610f929392919061559e565b60206040518083038186803b158015610faa57600080fd5b505afa158015610fbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe29190614b9c565b60e0820152610ff1308d6122d2565b6101008201526001600160a01b03808d1660009081526045602052604090819020546101208401525460425461102b9291821691166122d2565b61014082015260405161104290829060200161536a565b604051602081830303815290604052995060019a50505b50505050505050505b6044805460ff60a01b1916600160a01b1790559092909150565b604454600090600160a01b900460ff166110a85760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b191690556110bd612588565b6110c5614697565b506001600160a01b03821660009081526045602090815260409182902082518084019093528054835260010154908201819052603d5410156111195760405162461bcd60e51b8152600401610bd890615036565b61112283613208565b9150506044805460ff60a01b1916600160a01b179055919050565b60335481565b6000611153603a54603b54612e45565b90505b90565b6044546000906060906001600160a01b031633146111895760405162461bcd60e51b8152600401610bd890615214565b604454600160a01b900460ff166111b25760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b191690556111c7612588565b6111d18484613512565b915091506044805460ff60a01b1916600160a01b17905590939092509050565b604454600090600160a01b900460ff1661121d5760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b19169055611236338585856137fa565b5061123f6146b1565b60408051610100810182526001600160a01b03808816825282541660208201523091810191909152606081018490526080810161127b876121bf565b8152602001856001600160a01b03168152602001611298866121bf565b81526040546042546020909201916112bc916001600160a01b0390811691166122d2565b90526044546040519192506001600160a01b031690637bc597aa906112e5908490602001615505565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401611310919061519b565b600060405180830381600087803b15801561132a57600080fd5b505af115801561133e573d6000803e3d6000fd5b5050505060019150506044805460ff60a01b1916600160a01b1790559392505050565b6000611373838363ffffffff613a9516565b9392505050565b60365460ff1681565b6000611373838363ffffffff6131c616565b6000806113a0612cf0565b6001600160a01b038416600090815260416020526040812054919250906113c8908390612b78565b949350505050565b6044546060906001600160a01b031633146113fd5760405162461bcd60e51b8152600401610bd890615214565b604454600160a01b900460ff166114265760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b1916905561143b612588565b6114458383613acf565b90506044805460ff60a01b1916600160a01b17905592915050565b6000611373838363ffffffff613d6e16565b603c5481565b6039546001600160a01b031633146114a25760405162461bcd60e51b8152600401610bd890615214565b604355565b6000611373838363ffffffff613d9316565b603a5481565b6039546001600160a01b031633146114e95760405162461bcd60e51b8152600401610bd890615214565b60385460006114f6611f96565b90506000611502612c93565b9050600061150e613011565b9050600061151a611143565b9050611524612588565b600061152e611143565b90506115386131c2565b603e54146115585760405162461bcd60e51b8152600401610bd890614fb4565b60388790556000611567611f96565b90506000611573612c93565b9050600061157f613011565b90507fcff2ff0c9e99b301907279a45536b658e0227bfa9d6fba4799b46b268e804e2789898989896038548989898d6040516115c49a999897969594939291906155cf565b60405180910390a16115d461471a565b6040805160a08101825281546001600160a01b03168152600060208201529081016115fd611143565b815260200161160a612c36565b815260405460425460209092019161162e916001600160a01b0390811691166122d2565b90526044546040519192506001600160a01b031690637bc597aa906116579084906020016154c7565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161168291906151ea565b600060405180830381600087803b15801561169c57600080fd5b505af11580156116b0573d6000803e3d6000fd5b505050505050505050505050505050565b6044546060906001600160a01b031633146116ee5760405162461bcd60e51b8152600401610bd890615214565b604454600160a01b900460ff166117175760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b1916905561172c612588565b6114458383613dd5565b60006113738261175485670de0b6b3a764000063ffffffff613a9516565b9063ffffffff613d9316565b6042546001600160a01b0316331461178a5760405162461bcd60e51b8152600401610bd89061508e565b611792612588565b61179a6131c2565b603e54146117ba5760405162461bcd60e51b8152600401610bd890614fb4565b604254604080549051639f77437b60e01b815283926001600160a01b0390811692639f77437b926117f19290911690600401614d8f565b60206040518083038186803b15801561180957600080fd5b505afa15801561181d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118419190614b9c565b101561185f5760405162461bcd60e51b8152600401610bd8906152e0565b80603b5410156118815760405162461bcd60e51b8152600401610bd890614fdf565b6118c3603b54826040518060400160405280601981526020017f72656475636520726573657276657320756e646572666c6f7700000000000000815250614098565b603b5550565b6000806118d68585611361565b90506118f1836118e5836121e9565b9063ffffffff613d6e16565b95945050505050565b6044546060906001600160a01b031633146119275760405162461bcd60e51b8152600401610bd890615214565b604454600160a01b900460ff166119505760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b19169055604254604051632a4d98cf60e01b81526001600160a01b0390911690632a4d98cf9061198d903090600401614d8f565b60206040518083038186803b1580156119a557600080fd5b505afa1580156119b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119dd9190614b64565b8015611a645750604254604051632a4d98cf60e01b81526001600160a01b0390911690632a4d98cf90611a14908590600401614d8f565b60206040518083038186803b158015611a2c57600080fd5b505afa158015611a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a649190614b64565b611a805760405162461bcd60e51b8152600401610bd890614f5b565b611a88612588565b816001600160a01b031663a6afed956040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ac357600080fd5b505af1158015611ad7573d6000803e3d6000fd5b5050506001600160a01b0385166000908152604560205260408120549150611afe86613208565b604254604051633e5cd62160e11b81529192506001600160a01b031690637cb9ac4290611b3790309088908b908d908c90600401614e0b565b600060405180830381600087803b158015611b5157600080fd5b505af1158015611b65573d6000803e3d6000fd5b50505050611b716131c2565b603e5414611b915760405162461bcd60e51b8152600401610bd890614fb4565b611b996131c2565b846001600160a01b0316636c540baf6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bd257600080fd5b505afa158015611be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0a9190614b9c565b14611c275760405162461bcd60e51b8152600401610bd890614fb4565b6000611c338787613512565b506042546040516263fd3760e51b81529192506000916001600160a01b0390911690630c7fa6e090611c6d9030908a908790600401614de7565b60206040518083038186803b158015611c8557600080fd5b505afa158015611c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbd9190614b9c565b905080866001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401611cec9190614d8f565b60206040518083038186803b158015611d0457600080fd5b505afa158015611d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3c9190614b9c565b1015611d5a5760405162461bcd60e51b8152600401610bd89061500e565b6001600160a01b038616301415611d7c57611d77308a8a846140c4565b611ddf565b60405163b2a02ff160e01b81526001600160a01b0387169063b2a02ff190611dac908c908c908690600401614de7565b600060405180830381600087803b158015611dc657600080fd5b505af1158015611dda573d6000803e3d6000fd5b505050505b604054604254600091611e049185916118e5916001600160a01b0391821691166122d2565b9050611e0e614752565b604080516101c0810182526001600160a01b03808e168252825416602082015230918101919091526060810185905260808101611e4b87896137e1565b81526020018b6001600160a01b03168152602001848152602001896001600160a01b03168152602001611e7e8a8d6122d2565b81526001600160a01b038c16600090815260456020908152604091829020549083015201611eab8661098a565b8152603f54603a54603b546040516315f2405360e01b81526020909401936001600160a01b03909316926315f2405392611ee992899260040161559e565b60206040518083038186803b158015611f0157600080fd5b505afa158015611f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f399190614b9c565b8152602001611f488a8e6122d2565b815260200183815250905080604051602001611f649190615400565b60405160208183030381529060405296505050505050506044805460ff60a01b1916600160a01b179055949350505050565b6040546042546000918291611fb7916001600160a01b0390811691166122d2565b603f54603a54603b54604051630dce3c5b60e31b81529394506001600160a01b0390921692636e71e2d892611ff392869290919060040161559e565b60206040518083038186803b15801561200b57600080fd5b505afa15801561201f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120439190614b9c565b91505090565b603e5481565b60385481565b6040546001600160a01b031681565b600054610100900460ff168061207d575061207d614206565b8061208b575060005460ff16155b6120a75760405162461bcd60e51b8152600401610bd89061514d565b600054610100900460ff161580156120d2576000805460ff1961ff0019909116610100171660011790555b60388a9055604280546001600160a01b03808c166001600160a01b031992831617909255603f80548b84169083161790556039805482163317905560408054928a1692909116919091179055604385905561212b6131c2565b603e55670de0b6b3a7640000603d55604480546001600160a01b0319166001600160a01b03881617905583516121689060349060208701906147ee565b50825161217c9060359060208601906147ee565b506036805460ff841660ff199091161790556044805460ff60a01b1916600160a01b17905580156121b3576000805461ff00191690555b50505050505050505050565b6001600160a01b031660009081526041602052604090205490565b6044546001600160a01b031681565b6000610da982670de0b6b3a764000063ffffffff613d9316565b6039546001600160a01b0316331461222d5760405162461bcd60e51b8152600401610bd890615214565b604280546001600160a01b0319166001600160a01b0392909216919091179055565b6040546042546000918291612270916001600160a01b0390811691166122d2565b603f54603a54603b54603c54604051635c0b440b60e11b81529495506001600160a01b039093169363b816881693611ff393879390929091906004016155b4565b60435481565b60006113c86122c68585612f87565b83612f87565b603b5481565b60006122dc61420c565b6001600160a01b0316836001600160a01b0316141561230557816001600160a01b031631611373565b6040516370a0823160e01b81526001600160a01b038416906370a0823190612331908590600401614d8f565b60206040518083038186803b15801561234957600080fd5b505afa15801561235d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113739190614b9c565b6044546001600160a01b03163314806123a457506042546001600160a01b031633145b806123ae57503330145b806124345750604254604051639deec7cb60e01b81526001600160a01b0390911690639deec7cb906123e4903390600401614d8f565b60206040518083038186803b1580156123fc57600080fd5b505afa158015612410573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124349190614b64565b6124505760405162461bcd60e51b8152600401610bd890615061565b604654612463908263ffffffff613d6e16565b60465550565b6035805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109825780601f1061095757610100808354040283529160200191610982565b6000610da982613208565b6042546001600160a01b031633146124f95760405162461bcd60e51b8152600401610bd89061508e565b612501612588565b6125096131c2565b603e54146125295760405162461bcd60e51b8152600401610bd890614fb4565b6118c3603b5482613d6e565b6001600160a01b038116600090815260416020526040812054819081908161255c86613208565b90506000612568611143565b929791965091945092505050565b60416020526000908152604090205481565b6039546001600160a01b03163314806125ab57506044546001600160a01b031633145b806125c057506042546001600160a01b031633145b806126465750604254604051639deec7cb60e01b81526001600160a01b0390911690639deec7cb906125f6903390600401614d8f565b60206040518083038186803b15801561260e57600080fd5b505afa158015612622573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126469190614b64565b6126625760405162461bcd60e51b8152600401610bd89061511f565b600061266c6131c2565b603e54909150808214156126815750506128fe565b604254604080549051639f77437b60e01b81526000926001600160a01b0390811692639f77437b926126b99290911690600401614d8f565b60206040518083038186803b1580156126d157600080fd5b505afa1580156126e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127099190614b9c565b603a54603b54603d54603f546040516315f2405360e01b81529495509293919290916000916001600160a01b0316906315f24053906127509088908890889060040161559e565b60206040518083038186803b15801561276857600080fd5b505afa15801561277c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a09190614b9c565b905065048c273950008111156127c85760405162461bcd60e51b8152600401610bd8906152a9565b60006127da888863ffffffff6131c616565b905060008060008060006127ee8787611361565b94506127fd610c16868c612f87565b9350612809848b611460565b925061281d610c44610c16603c5487612f87565b915061282f610c5c610c16878b612f87565b603e8e9055603d819055603a849055603b839055603f546040516315f2405360e01b81529192506001600160a01b0316906315f2405390612878908e908790879060040161559e565b60206040518083038186803b15801561289057600080fd5b505afa1580156128a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c89190614b9c565b965065048c273950008711156128f05760405162461bcd60e51b8152600401610bd8906152a9565b505050505050505050505050505b565b604454600090600160a01b900460ff1661292c5760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b19169055612945338085856137fa565b5061294e6146b1565b60408051610100810182523380825282546001600160a01b0316602083015230928201929092526060810185905290608082019061298b906121bf565b8152602001856001600160a01b031681526020016129a8866121bf565b81526040546042546020909201916129cc916001600160a01b0390811691166122d2565b90526044546040519192506001600160a01b031690637bc597aa906129f5908490602001615505565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401612a20919061530b565b600060405180830381600087803b158015612a3a57600080fd5b505af1158015612a4e573d6000803e3d6000fd5b5050505060019150506044805460ff60a01b1916600160a01b17905592915050565b603d5481565b6039546001600160a01b03163314612aa05760405162461bcd60e51b8152600401610bd890615214565b604454600160a01b900460ff16612ac95760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b19169055612ade612588565b612ae66131c2565b603e5414612b065760405162461bcd60e51b8152600401610bd890614fb4565b603c556044805460ff60a01b1916600160a01b179055565b604454600160a01b900460ff16612b475760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b19169055612b60338484846140c4565b50506044805460ff60a01b1916600160a01b17905550565b600080612b858484611361565b90506113c8816121e9565b60006113738383611736565b6044546000906060906001600160a01b03163314612bcc5760405162461bcd60e51b8152600401610bd890615214565b604454600160a01b900460ff16612bf55760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b19169055612c0a612588565b612c15858585614224565b915091506044805460ff60a01b1916600160a01b1790559094909350915050565b6040546042546000918291612c57916001600160a01b0390811691166122d2565b603f54603a54603b546040516315f2405360e01b81529394506001600160a01b03909216926315f2405392611ff392869290919060040161559e565b6040546042546000918291612cb4916001600160a01b0390811691166122d2565b603f54603a54603b5460405163ca9cdd1b60e01b81529394506001600160a01b039092169263ca9cdd1b92611ff392869290919060040161559e565b604454600090600160a01b900460ff16612d1c5760405162461bcd60e51b8152600401610bd8906150fb565b6044805460ff60a01b19169055612d31612588565b612d39611143565b90506044805460ff60a01b1916600160a01b17905590565b60465481565b670de0b6b3a764000081565b6044546001600160a01b0316331480612d8657506042546001600160a01b031633145b80612d9057503330145b80612e165750604254604051639deec7cb60e01b81526001600160a01b0390911690639deec7cb90612dc6903390600401614d8f565b60206040518083038186803b158015612dde57600080fd5b505afa158015612df2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e169190614b64565b612e325760405162461bcd60e51b8152600401610bd890615061565b604654612463908263ffffffff6131c616565b60335460009080612e5a575050603854610da9565b604254604080549051639f77437b60e01b81526000926001600160a01b0390811692639f77437b92612e929290911690600401614d8f565b60206040518083038186803b158015612eaa57600080fd5b505afa158015612ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee29190614b9c565b90506000612ef9612ef38388611460565b86611383565b9050612f058184611736565b9695505050505050565b600080612f2a670de0b6b3a76400008563ffffffff613a9516565b90506113c88184611736565b6045602052600090815260409020805460019091015482565b600080612b858484612f0f565b6001600160a01b03918216600090815260376020908152604080832093909416825291909152205490565b600080612f9a848463ffffffff613a9516565b90506000612fb06706f05b59d3b2000083613d6e565b90506118f181670de0b6b3a764000063ffffffff613d9316565b6000806000612fd7610a5b565b9350935050506000612fe98383612e45565b6001600160a01b03861660009081526041602052604081205491925090612f05908390612b78565b6040546042546000918291613032916001600160a01b0390811691166122d2565b603f54603a54603b54603c5460405163ae8b520f60e01b81529495506001600160a01b039093169363ae8b520f93611ff393879390929091906004016155b4565b6039546001600160a01b0316331461309d5760405162461bcd60e51b8152600401610bd890615214565b603f546001600160a01b031660006130b3611f96565b905060006130bf612c93565b905060006130cb613011565b905060006130d7611143565b90506130e1612588565b60006130eb611143565b90506130f56131c2565b603e54146131155760405162461bcd60e51b8152600401610bd890614fb4565b603f80546001600160a01b0319166001600160a01b038916179055600061313a611f96565b90506000613146612c93565b90506000613152613011565b90507fdeb648bcaeacc8fe85ac80af712d28507d5040e38de659e3981835f7732b580e89898989898f8989898d6040516115c49a99989796959493929190614e57565b603f546001600160a01b031681565b6042546001600160a01b031681565b6039546001600160a01b031681565b4390565b600061137383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614098565b6000613212614697565b506001600160a01b0382166000908152604560209081526040918290208251808401909352805480845260019091015491830191909152613257576000915050610a56565b61137381600001516108b1603d548460200151612b90565b6000606083158061327e575082155b61329a5760405162461bcd60e51b8152600401610bd890614eed565b6132a261486c565b6132aa611143565b815284156132cf576020810185905280516132c59086612b78565b60408201526132ea565b6132dd848260000151612f4f565b6020820152604081018490525b6132f26131c2565b603e54146133125760405162461bcd60e51b8152600401610bd890614fb4565b60208101516033546133299163ffffffff6131c616565b60608201526020808201516001600160a01b0388166000908152604190925260409091205461335d9163ffffffff6131c616565b6080820181905260608201516033556001600160a01b038088166000908152604160205260408082209390935582840151925460425491936133a89390926118e592821691166122d2565b90506133b261489b565b60408051610120810182526001600160a01b03808b1682528254166020808301919091523082840152850151606082015290840151608082015260a081016133f8611143565b8152603f54603a54603b546040516315f2405360e01b81526020909401936001600160a01b03909316926315f240539261343692899260040161559e565b60206040518083038186803b15801561344e57600080fd5b505afa158015613462573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134869190614b9c565b8152602001613495308b6122d2565b815260200183815250905060006001600160a01b0316886001600160a01b031660008051602061563b83398151915285602001516040516134d6919061556e565b60405180910390a38260400151816040516020016134f4919061535b565b60405160208183030381529060405294509450505050935093915050565b60425460408054905163227a5a8360e11b81526000926060926001600160a01b03918216926344f4b5069261354b921690600401614d8f565b600060405180830381600087803b15801561356557600080fd5b505af1158015613579573d6000803e3d6000fd5b505050506135856131c2565b603e54146135a55760405162461bcd60e51b8152600401610bd890614fb4565b6135ad614902565b6001600160a01b03851660009081526045602090815260409091208054600190910154918301919091526135e086613208565b60408301526000198514156135fb57604082015182526135ff565b8482525b815160408301516136159163ffffffff6131c616565b60608301528151603a541015613631576000608083015261364b565b8151603a546136459163ffffffff6131c616565b60808301525b60608201516001600160a01b03808816600090815260456020526040808220938455603d546001909401939093556080850151603a5584519254604254919361369d9390926118e592821691166122d2565b90506136a761489b565b60408051610120810182526001600160a01b03808b16825282541660208201523081830152855160608201529085015160808201906136e690866137e1565b81526020016136f8866000015161098a565b8152603f54603a54603b546040516315f2405360e01b81526020909401936001600160a01b03909316926315f240539261373692899260040161559e565b60206040518083038186803b15801561374e57600080fd5b505afa158015613762573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137869190614b9c565b81526001600160a01b038a16600090815260456020908152604091829020548184015291810185905286519051929350916137c39184910161535b565b60405160208183030381529060405295509550505050509250929050565b6000818310156137f45750818103610da9565b50900390565b60445460408051635c975abb60e01b815290516000926001600160a01b031691635c975abb916004808301926020929190829003018186803b15801561383f57600080fd5b505afa158015613853573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138779190614b64565b156138945760405162461bcd60e51b8152600401610bd8906151c3565b604260009054906101000a90046001600160a01b03166001600160a01b031663d38120c93086866138c787604354612b78565b6040518563ffffffff1660e01b81526004016138e69493929190614da3565b600060405180830381600087803b15801561390057600080fd5b505af1158015613914573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316141561394a5760405162461bcd60e51b8152600401610bd890615272565b60006001600160a01b0386811690861614156139695750600019613991565b506001600160a01b038085166000908152603760209081526040808320938916835292905220545b60006139a3828563ffffffff6131c616565b6001600160a01b0387166000908152604160205260409020549091506139cf908563ffffffff6131c616565b6001600160a01b038088166000908152604160205260408082209390935590871681522054613a04908563ffffffff613d6e16565b6001600160a01b0386166000908152604160205260409020556000198214613a4f576001600160a01b038087166000908152603760209081526040808320938b168352929052208190555b846001600160a01b0316866001600160a01b031660008051602061563b83398151915286604051613a80919061556e565b60405180910390a35060019695505050505050565b600082613aa457506000610da9565b82820282848281613ab157fe5b04146113735760405162461bcd60e51b8152600401610bd8906150ba565b6060613ad96131c2565b603e5414613af95760405162461bcd60e51b8152600401610bd890614fb4565b613b0161486c565b604254604080549051631f3c14ef60e11b81526001600160a01b0392831692633e7829de92613b399291169088908890600401614de7565b600060405180830381600087803b158015613b5357600080fd5b505af1158015613b67573d6000803e3d6000fd5b50505050613b73611143565b808252613b81908490612f4f565b60208201819052603354613b9491611460565b6040808301919091526001600160a01b0385166000908152604160209081529190205490820151613bc59190611460565b606082018190526040808301516033556001600160a01b0380871660009081526041602052828120939093559054604254613c0a9287926118e59290821691166122d2565b9050613c1461489b565b60408051610120810182526001600160a01b03808916825282541660208083019190915230928201929092529084015160608201526080810186905260a08101613c5d8761098a565b8152603f54603a54603b546040516315f2405360e01b81526020909401936001600160a01b03909316926315f2405392613c9b92899260040161559e565b60206040518083038186803b158015613cb357600080fd5b505afa158015613cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ceb9190614b9c565b8152602001613cfa30896122d2565b8152602001838152509050856001600160a01b031660006001600160a01b031660008051602061563b8339815191528560200151604051613d3b919061556e565b60405180910390a380604051602001613d54919061535b565b604051602081830303815290604052935050505092915050565b6000828201838110156113735760405162461bcd60e51b8152600401610bd890614f24565b600061137383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506145eb565b6042546040546043546060926001600160a01b03908116926396a13b32928792909116903090613e06908890612b78565b6040518563ffffffff1660e01b8152600401613e259493929190614da3565b600060405180830381600087803b158015613e3f57600080fd5b505af1158015613e53573d6000803e3d6000fd5b5050604254604080549051639f77437b60e01b81528694506001600160a01b039283169350639f77437b92613e8c921690600401614d8f565b60206040518083038186803b158015613ea457600080fd5b505afa158015613eb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613edc9190614b9c565b1015613efa5760405162461bcd60e51b8152600401610bd890614f86565b613f02614938565b6001600160a01b038416600090815260456020526040902054613f2485613208565b808352613f319085611460565b6020830152603a54613f439085611460565b60408084019182526020808501516001600160a01b03808a166000908152604590935291839020908155603d546001909101559151603a556042548154915163fa93b2a560e01b81529083169263fa93b2a592613fa99291169089908990600401614de7565b600060405180830381600087803b158015613fc357600080fd5b505af1158015613fd7573d6000803e3d6000fd5b50505050613fe484612d63565b613fec61489b565b60408051610120810182526001600160a01b03808916825282541660208201523091810191909152606081018690528351608082019061402c90856137e1565b8152602001614039611143565b8152602001614046612c36565b81526001600160a01b038089166000908152604560209081526040918290205490840152805460425491909301926140829290811691166122d2565b815250905080604051602001613d54919061535b565b600081848411156140bc5760405162461bcd60e51b8152600401610bd89190614eda565b505050900390565b826001600160a01b0316826001600160a01b031614156140f65760405162461bcd60e51b8152600401610bd89061523b565b604254604051637ceb4c9760e01b81526001600160a01b0390911690637ceb4c97906141289030908890600401614dcd565b600060405180830381600087803b15801561414257600080fd5b505af1158015614156573d6000803e3d6000fd5b5050506001600160a01b03831660009081526041602052604090205461418391508263ffffffff6131c616565b6001600160a01b0380841660009081526041602052604080822093909355908516815220546141b8908263ffffffff613d6e16565b6001600160a01b03808516600081815260416020526040908190209390935591519084169060008051602061563b833981519152906141f890859061556e565b60405180910390a350505050565b303b1590565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b60006060831580614233575082155b61424f5760405162461bcd60e51b8152600401610bd890614eed565b61425761486c565b61425f611143565b815284156142845760208101859052805161427a9086612b78565b604082015261429f565b614292848260000151612f4f565b6020820152604081018490525b6042546020820151604051635798612960e01b81526001600160a01b03909216916357986129916142d69130918b91600401614de7565b60206040518083038186803b1580156142ee57600080fd5b505afa158015614302573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143269190614b9c565b5061432f6131c2565b603e541461434f5760405162461bcd60e51b8152600401610bd890614fb4565b60208101516033546143669163ffffffff6131c616565b60608201526020808201516001600160a01b0388166000908152604190925260409091205461439a9163ffffffff6131c616565b608082015260408082015160425482549251639f77437b60e01b815291926001600160a01b0391821692639f77437b926143d8921690600401614d8f565b60206040518083038186803b1580156143f057600080fd5b505afa158015614404573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144289190614b9c565b10156144465760405162461bcd60e51b8152600401610bd89061532f565b6042546040805483820151915163fa93b2a560e01b81526001600160a01b039384169363fa93b2a59361448293909116918b9190600401614de7565b600060405180830381600087803b15801561449c57600080fd5b505af11580156144b0573d6000803e3d6000fd5b505050506144c18160400151612d63565b606081015160335560808101516001600160a01b0387166000908152604160205260409020556144ef61489b565b60408051610120810182526001600160a01b03808a1682528254166020808301919091523082840152840151606082015290830151608082015260a08101614535611143565b8152602001614542612c36565b8152602001614551308a6122d2565b8152604054604254602090920191614575916001600160a01b0390811691166122d2565b815250905060006001600160a01b0316876001600160a01b031660008051602061563b83398151915284602001516040516145b0919061556e565b60405180910390a38160400151816040516020016145ce919061535b565b604051602081830303815290604052935093505050935093915050565b6000818361460c5760405162461bcd60e51b8152600401610bd89190614eda565b50600083858161461857fe5b0495945050505050565b60405180610160016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b60405180610100016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081525090565b6040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b604051806101c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160006001600160a01b031681526020016000815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061482f57805160ff191683800117855561485c565b8280016001018555821561485c579182015b8281111561485c578251825591602001919060010190614841565b50614868929150614959565b5090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180606001604052806000815260200160008152602001600081525090565b61115691905b80821115614868576000815560010161495f565b8035610da981615622565b600082601f83011261498e578081fd5b813567ffffffffffffffff808211156149a5578283fd5b604051601f8301601f1916810160200182811182821017156149c5578485fd5b6040528281529250828483016020018610156149e057600080fd5b8260208601602083013760006020848301015250505092915050565b803560ff81168114610da957600080fd5b600060208284031215614a1e578081fd5b813561137381615622565b60008060408385031215614a3b578081fd5b8235614a4681615622565b946020939093013593505050565b600080600060608486031215614a68578081fd5b8335614a7381615622565b95602085013595506040909401359392505050565b60008060408385031215614a9a578182fd5b8235614aa581615622565b91506020830135614ab581615622565b809150509250929050565b600080600060608486031215614ad4578283fd5b8335614adf81615622565b92506020840135614aef81615622565b929592945050506040919091013590565b60008060008060808587031215614b15578081fd5b8435614b2081615622565b93506020850135614b3081615622565b9250604085013591506060850135614b4781615622565b939692955090935050565b60008060408385031215614a3b578182fd5b600060208284031215614b75578081fd5b81518015158114611373578182fd5b600060208284031215614b95578081fd5b5035919050565b600060208284031215614bad578081fd5b5051919050565b60008060008060008060008060006101208a8c031215614bd2578485fd5b8935985060208a0135614be481615622565b975060408a0135614bf481615622565b9650614c038b60608c01614973565b9550614c128b60808c01614973565b945060a08a0135935060c08a013567ffffffffffffffff80821115614c35578485fd5b614c418d838e0161497e565b945060e08c0135915080821115614c56578384fd5b50614c638c828d0161497e565b925050614c748b6101008c016149fc565b90509295985092959850929598565b60008060408385031215614c95578081fd5b50508035926020909101359150565b600080600060608486031215614cb8578081fd5b505081359360208301359350604090920135919050565b6001600160a01b03169052565b60008151808452815b81811015614d0157602081850181015186830182015201614ce5565b81811115614d125782602083870101525b50601f01601f19169290920160200192915050565b60018060a01b0380825116835280602083015116602084015280604083015116604084015250606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b6001600160a01b0391909116815260200190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039586168152938516602085015291841660408401529092166060820152608081019190915260a00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039a8b1681526020810199909952604089019790975260608801959095526080870193909352951660a085015260c084019490945260e08301939093526101008201929092526101208101919091526101400190565b901515815260200190565b60008315158252604060208301526113c86040830184614cdc565b6000602082526113736020830184614cdc565b6020808252601c908201527f776974686472617720706172616d65746572206e6f742076616c696400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526011908201527013585c9ad95d081b9bdd081b1a5cdd1959607a1b604082015260600190565b602080825260149082015273496e73756666696369656e742062616c616e636560601b604082015260600190565b602080825260119082015270426c6f636b6e756d626572206661696c7360781b604082015260600190565b602080825260159082015274496e73756666696369656e7420726573657276657360581b604082015260600190565b6020808252600e908201526d0a6cad2f4ca40e8dede40daeac6d60931b604082015260600190565b6020808252601190820152703137b93937bba4b73232bc1032b93937b960791b604082015260600190565b6020808252601390820152721bdb9b1e4818985b9ac818dbdb5c1bdb995b9d606a1b604082015260600190565b6020808252601290820152713932b8bab4b9329031b7b73a3937b63632b960711b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252600a90820152691c994b595b9d195c995960b21b604082015260600190565b60208082526014908201527337b7363c903932b9ba3934b1ba32b2103ab9b2b960611b604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60006b5472616e7366657246726f6d60a01b8252604060208301526113736040830184614cdc565b6020808252600d908201526c14de5cdd195b481c185d5cd959609a1b604082015260600190565b60006d14995cd95c9d9951195c1bdcda5d60921b8252604060208301526113736040830184614cdc565b6020808252600d908201526c3932b8bab4b9329030b236b4b760991b604082015260600190565b6020808252601d908201527f4c697175696461746f722063616e6e6f7420626520626f72726f776572000000604082015260600190565b60208082526017908201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604082015260600190565b60208082526017908201527f626f72726f77207261746520697320746f6f2068696768000000000000000000604082015260600190565b602080825260119082015270092dce6eaccccd2c6d2cadce840c6c2e6d607b1b604082015260600190565b6000672a3930b739b332b960c11b8252604060208301526113736040830184614cdc565b602080825260129082015271496e73756666696369656e74206d6f6e657960701b604082015260600190565b6101208101610da98284614d27565b60006101608201905061537e828451614ccf565b60208301516153906020840182614ccf565b5060408301516153a36040840182614ccf565b50606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151818401525092915050565b60006101c082019050615414828451614ccf565b60208301516154266020840182614ccf565b5060408301516154396040840182614ccf565b50606083015160608301526080830151608083015260a083015161546060a0840182614ccf565b5060c083015160c083015260e083015161547d60e0840182614ccf565b50610100838101519083015261012080840151908301526101408084015190830152610160808401519083015261018080840151908301526101a092830151929091019190915290565b81516001600160a01b031681526020808301519082015260408083015190820152606080830151908201526080918201519181019190915260a00190565b60006101008201905060018060a01b0380845116835280602085015116602084015280604085015116604084015260608401516060840152608084015160808401528060a08501511660a08401525060c083015160c083015260e083015160e083015292915050565b90815260200190565b6000838252604060208301526113c86040830184614cdc565b918252602082015260400190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b998a5260208a019890985260408901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201526101400190565b60ff91909116815260200190565b6001600160a01b038116811461563757600080fd5b5056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c66381ca7253dddb0f78654edcd2c95941524b173e5fe168e67bab897644a63364736f6c63430006040033

Deployed ByteCode Sourcemap

32219:43710:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32219:43710:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;32342:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;46384:856;;;;;;;;;:::i;:::-;;;;;;;;56415:2790;;;:::i;:::-;;;;;;;;;;;39878:237;;;;;;;;;:::i;:::-;;;;;;;;69584:2907;;;;;;;;;:::i;:::-;;;;;;;;;59213:367;;;;;;;;;:::i;32307:26::-;;;:::i;45381:144::-;;;:::i;62957:247::-;;;;;;;;;:::i;:::-;;;;;;;;;37821:629;;;;;;;;;:::i;11120:156::-;;;;;;;;;:::i;32398:21::-;;;:::i;:::-;;;;;;;;10400:111;;;;;;;;;:::i;47248:294::-;;;;;;;;;:::i;41133:218::-;;;;;;;;;:::i;10281:111::-;;;;;;;;;:::i;32657:28::-;;;:::i;72617:125::-;;;;;;;;;:::i;:::-;;12223:147;;;;;;;;;:::i;32584:27::-;;;:::i;61694:1151::-;;;;;;;;;:::i;43337:250::-;;;;;;;;;:::i;10100:173::-;;;;;;;;;:::i;73300:539::-;;;;;;;;;:::i;11500:245::-;;;;;;;;;:::i;66195:2706::-;;;;;;;;;:::i;75089:219::-;;;:::i;32789:33::-;;;:::i;32512:34::-;;;:::i;32927:25::-;;;:::i;:::-;;;;;;;;34093:843;;;;;;;;;:::i;72499:110::-;;;;;;;;;:::i;33099:19::-;;;:::i;12378:104::-;;;;;;;;;:::i;36001:124::-;;;;;;;;;:::i;75600:326::-;;;:::i;33060:30::-;;;:::i;10949:163::-;;;;;;;;;:::i;32620:28::-;;;:::i;36133:283::-;;;;;;;;;:::i;74106:123::-;;;;;;;;;:::i;32369:20::-;;;:::i;65459:172::-;;;;;;;;;:::i;73847:251::-;;;;;;;;;:::i;48228:428::-;;;;;;;;;:::i;:::-;;;;;;;;;;32961:48;;;;;;;;;:::i;53901:2506::-;;;:::i;36941:627::-;;;;;;;;;:::i;32694:26::-;;;:::i;60008:279::-;;;;;;;;;:::i;68909:216::-;;;;;;;;;:::i;11284:208::-;;;;;;;;;:::i;10835:106::-;;;;;;;;;:::i;49262:312::-;;;;;;;;;:::i;75340:228::-;;;:::i;74548:195::-;;;:::i;48051:142::-;;;:::i;33418:24::-;;;:::i;33190:34::-;;;:::i;74237:123::-;;;;;;;;;:::i;45533:736::-;;;;;;;;;:::i;11993:222::-;;;;;;;;;:::i;33355:56::-;;;;;;;;;:::i;:::-;;;;;;;;;11753:232;;;;;;;;;:::i;40368:175::-;;;;;;;;;:::i;10519:308::-;;;;;;;;;:::i;47550:493::-;;;;;;;;;:::i;74775:306::-;;;:::i;60521:1165::-;;;;;;;;;:::i;32831:43::-;;;:::i;33018:33::-;;;:::i;32555:20::-;;;:::i;32342:18::-;;;;;;;;;;;;;;;-1:-1:-1;;32342:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46384:856::-;46545:11;;46484:20;;46571:17;46567:666;;-1:-1:-1;;46689:19:0;;46682:26;;46567:666;46883:10;;46925;;;46883:101;;-1:-1:-1;;;46883:101:0;;46863:17;;-1:-1:-1;;;;;46883:10:0;;;;:23;;:101;;46925:10;;;;46954:15;;46883:101;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;46883:101:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46883:101:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46883:101:0;;;;;;;;;46863:121;;46999:36;47038:103;47063:31;47070:9;47081:12;;47063:6;:31::i;:::-;47113:13;;47038:6;:103::i;:::-;46999:142;;47171:50;47178:28;47208:12;47171:6;:50::i;:::-;47156:65;;46567:666;;46384:856;;;;;:::o;56415:2790::-;56501:27;56543:20;56578:21;56614:22;56686:16;:14;:16::i;:::-;56747:18;;56664:38;;-1:-1:-1;56811:46:0;;;56807:231;;;56900:18;;56937:11;;56967:12;;56998:13;;56874:152;;;;;;;;;;;56807:231;57070:10;;57094;;;57070:35;;-1:-1:-1;;;57070:35:0;;57050:17;;-1:-1:-1;;;;;57070:10:0;;;;:23;;:35;;57094:10;;;;57070:35;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;57070:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57070:35:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;57070:35:0;;;;;;;;;57139:12;;57186:13;;57237:11;;57316:17;;:121;;-1:-1:-1;;;57316:121:0;;57050:55;;-1:-1:-1;57139:12:0;;57186:13;;57237:11;;57116:20;;-1:-1:-1;;;;;57316:17:0;;:31;;:121;;57050:55;;57139:12;;57186:13;;57316:121;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;57316:121:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57316:121:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;57316:121:0;;;;;;;;;57295:142;;32771:9;57496:10;:27;;57488:63;;;;-1:-1:-1;;;57488:63:0;;;;;;;;;;;;;;;;;57592:18;57613:48;:19;57637:23;57613:48;:23;:48;:::i;:::-;57592:69;;58061:28;58100:27;58138:23;58172:24;58207:22;58265:33;58275:10;58287;58265:9;:33::i;:::-;58242:56;;58333:97;58354:42;58361:20;58383:12;58354:6;:42::i;:::-;9778:4;58333:6;:97::i;:::-;58311:119;;58461:41;58468:19;58489:12;58461:6;:41::i;:::-;58443:59;;58534:120;58555:60;58562:42;58569:13;;58584:19;58562:6;:42::i;58555:60::-;58630:13;58534:6;:120::i;:::-;58515:139;;58684:127;58705:64;58712:46;58719:20;58741:16;58712:6;:46::i;58705:64::-;58784:16;58684:6;:127::i;:::-;58667:144;;58839:14;58824:29;;58880:15;58864:31;;58923:16;58906:33;;58965:17;;;;;;;;;-1:-1:-1;;;;;58965:17:0;-1:-1:-1;;;;;58965:31:0;;59011:9;59035:12;;59062:13;;58965:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;58965:121:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58965:121:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;58965:121:0;;;;;;;;;58952:134;;32771:9;59142:10;:27;;59134:63;;;;-1:-1:-1;;;59134:63:0;;;;;;;;;56415:2790;;;;;;;;;;;;;;;;;:::o;39878:237::-;39977:10;39946:4;39998:23;;;:18;:23;;;;;;;;-1:-1:-1;;;;;39998:32:0;;;;;;;;;;:41;;;40055:30;39946:4;;39977:10;;;40055:30;;;;40033:6;;40055:30;;;;;;;;;;40103:4;40096:11;;;39878:237;;;;;:::o;69584:2907::-;35098:4;;69698:13;;69713:22;;-1:-1:-1;;;;;35098:4:0;35084:10;:18;35076:44;;;;-1:-1:-1;;;35076:44:0;;;;;;;;;74411:11:::1;::::0;-1:-1:-1;;;74411:11:0;::::1;;;74403:34;;;;-1:-1:-1::0;;;74403:34:0::1;;;;;;;;;74448:11;:19:::0;;-1:-1:-1;;;;74448:19:0::1;::::0;;74462:5:::1;69814:36:::2;69842:7:::0;69814:27:::2;:36::i;:::-;:40;:66;;;;;69879:1;69858:18;69868:7;69858:9;:18::i;:::-;:22;69814:66;69796:2688;;;69907:16;:14;:16::i;:::-;-1:-1:-1::0;;;;;69962:23:0;::::2;69938:21;69962:23:::0;;;:14:::2;:23;::::0;;;;:33;;70037:36:::2;69977:7:::0;70037:27:::2;:36::i;:::-;70010:63;;70088:25;70116:32;70140:7;70116:23;:32::i;:::-;70088:60;;70163:25;70191:18;70201:7;70191:9;:18::i;:::-;70163:46;;70224:25;70264:21;70300:22;70337:24;70442:1;70423:16;:20;:45;;;;;70467:1;70447:17;:21;70423:45;70419:2054;;;70575:16;70555:17;:36;70551:500;;;70648:150;70697:7;70731:1;70759:16;70648:22;:150::i;:::-;70616:182:::0;;-1:-1:-1;70616:182:0;-1:-1:-1;70551:500:0::2;;;70879:152;70928:7;70962:18;70972:7;70962:9;:18::i;:::-;71007:1;70879:22;:152::i;:::-;70847:184:::0;;-1:-1:-1;70847:184:0;-1:-1:-1;70551:500:0::2;71103:99;71139:7;71169:14;71103:13;:99::i;:::-;71071:131:::0;;-1:-1:-1;71071:131:0;-1:-1:-1;71223:31:0::2;;:::i;:::-;-1:-1:-1::0;;;;;71275:27:0;;::::2;::::0;;71342:10:::2;::::0;;;;::::2;71321:18;::::0;::::2;:31:::0;71407:4:::2;71371:25:::0;;::::2;:41:::0;71455:112:::2;71490:17:::0;71530:18:::2;71295:7:::0;71530:9:::2;:18::i;:::-;71455:12;:112::i;:::-;71431:21;::::0;::::2;:136:::0;71586:23:::2;::::0;::::2;:43:::0;;;71672:106:::2;71707:16:::0;71746:13;71672:12:::2;:106::i;:::-;71648:21;::::0;::::2;:130:::0;71823:20:::2;:18;:20::i;:::-;71797:23;::::0;::::2;:46:::0;71888:17:::2;::::0;71952:10:::2;::::0;71972::::2;::::0;-1:-1:-1;;;;;71888:17:0;;::::2;::::0;:31:::2;::::0;71942:42:::2;::::0;71952:10;;::::2;::::0;71972::::2;71942:9;:42::i;:::-;72007:12;;72042:13;;71888:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;71888:186:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;71888:186:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;71888:186:0;;;;;;;;;71862:23;::::0;::::2;:212:::0;72116:33:::2;72134:4;72141:7:::0;72116:9:::2;:33::i;:::-;72093:20;::::0;::::2;:56:::0;-1:-1:-1;;;;;72188:23:0;;::::2;;::::0;;;:14:::2;:23;::::0;;;;;;:33;72168:17:::2;::::0;::::2;:53:::0;72301:10;72342::::2;::::0;72269:103:::2;::::0;72301:10;;::::2;::::0;72342::::2;72269:9;:103::i;:::-;72240:26;::::0;::::2;:132:::0;72405:16:::2;::::0;::::2;::::0;72240:4;;72405:16:::2;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;72405:16:0;;;72393:28;;72453:4;72442:15;;70419:2054;;69796:2688;;;;;;;;;74490:11:::1;:18:::0;;-1:-1:-1;;;;74490:18:0::1;-1:-1:-1::0;;;74490:18:0::1;::::0;;69584:2907;;;;-1:-1:-1;69584:2907:0:o;59213:367::-;74411:11;;59318:7;;-1:-1:-1;;;74411:11:0;;;;74403:34;;;;-1:-1:-1;;;74403:34:0;;;;;;;;;74448:11;:19;;-1:-1:-1;;;;74448:19:0;;;59343:16:::1;:14;:16::i;:::-;59370:36;;:::i;:::-;-1:-1:-1::0;;;;;;59409:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;;59370:62;;;;::::1;::::0;;;;;;;::::1;;::::0;;;::::1;::::0;;;59483:11:::1;::::0;-1:-1:-1;59451:43:0::1;59443:73;;;;-1:-1:-1::0;;;59443:73:0::1;;;;;;;;;59536:36;59564:7;59536:27;:36::i;:::-;59529:43;;;74490:11:::0;:18;;-1:-1:-1;;;;74490:18:0;-1:-1:-1;;;74490:18:0;;;59213:367;;-1:-1:-1;59213:367:0:o;32307:26::-;;;;:::o;45381:144::-;45432:20;45472:45;45489:12;;45503:13;;45472:16;:45::i;:::-;45465:52;;45381:144;;:::o;62957:247::-;35098:4;;63087:7;;63096:12;;-1:-1:-1;;;;;35098:4:0;35084:10;:18;35076:44;;;;-1:-1:-1;;;35076:44:0;;;;;;;;;74411:11:::1;::::0;-1:-1:-1;;;74411:11:0;::::1;;;74403:34;;;;-1:-1:-1::0;;;74403:34:0::1;;;;;;;;;74448:11;:19:::0;;-1:-1:-1;;;;74448:19:0::1;::::0;;63126:16:::2;:14;:16::i;:::-;63160:36;63174:8;63184:11;63160:13;:36::i;:::-;63153:43;;;;74490:11:::1;:18:::0;;-1:-1:-1;;;;74490:18:0::1;-1:-1:-1::0;;;74490:18:0::1;::::0;;62957:247;;;;-1:-1:-1;62957:247:0;-1:-1:-1;62957:247:0:o;37821:629::-;74411:11;;37950:4;;-1:-1:-1;;;74411:11:0;;;;74403:34;;;;-1:-1:-1;;;74403:34:0;;;;;;;;;74448:11;:19;;-1:-1:-1;;;;74448:19:0;;;37999:44:::1;38014:10;38026:3:::0;38031;38036:6;37999:14:::1;:44::i;:::-;;38056:28;;:::i;:::-;38087:253;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;38087:253:0;;::::1;::::0;;38137:10;;::::1;38087:253;::::0;::::1;::::0;38170:4:::1;38087:253:::0;;;;;;;;;;;;;;;;38211:14:::1;38119:3:::0;38211:9:::1;:14::i;:::-;38087:253;;;;38240:3;-1:-1:-1::0;;;;;38087:253:0::1;;;;;38258:14;38268:3;38258:9;:14::i;:::-;38087:253:::0;;38297:10:::1;::::0;38317::::1;::::0;38087:253:::1;::::0;;::::1;::::0;38287:42:::1;::::0;-1:-1:-1;;;;;38297:10:0;;::::1;::::0;38317::::1;38287:9;:42::i;:::-;38087:253:::0;;38359:4:::1;::::0;38402:15:::1;::::0;38056:284;;-1:-1:-1;;;;;;38359:4:0::1;::::0;38353:32:::1;::::0;38402:15:::1;::::0;38056:284;;38402:15:::1;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;38402:15:0;;;38353:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38353:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38353:65:0;;;;38438:4;38431:11;;;74490::::0;:18;;-1:-1:-1;;;;74490:18:0;-1:-1:-1;;;74490:18:0;;;37821:629;;-1:-1:-1;;;37821:629:0:o;11120:156::-;11214:14;11255:13;:1;11261:6;11255:13;:5;:13;:::i;:::-;11246:22;11120:156;-1:-1:-1;;;11120:156:0:o;32398:21::-;;;;;;:::o;10400:111::-;10459:14;10495:8;:1;10501;10495:8;:5;:8;:::i;47248:294::-;47310:7;47355:20;47378:21;:19;:21::i;:::-;-1:-1:-1;;;;;47488:20:0;;47438:15;47488:20;;;:13;:20;;;;;;47355:44;;-1:-1:-1;47438:15:0;47456:53;;47355:44;;47456:17;:53::i;:::-;47438:71;47248:294;-1:-1:-1;;;;47248:294:0:o;41133:218::-;35098:4;;41253:12;;-1:-1:-1;;;;;35098:4:0;35084:10;:18;35076:44;;;;-1:-1:-1;;;35076:44:0;;;;;;;;;74411:11:::1;::::0;-1:-1:-1;;;74411:11:0;::::1;;;74403:34;;;;-1:-1:-1::0;;;74403:34:0::1;;;;;;;;;74448:11;:19:::0;;-1:-1:-1;;;;74448:19:0::1;::::0;;41283:16:::2;:14;:16::i;:::-;41317:26;41330:4;41336:6;41317:12;:26::i;:::-;41310:33;;74490:11:::1;:18:::0;;-1:-1:-1;;;;74490:18:0::1;-1:-1:-1::0;;;74490:18:0::1;::::0;;41133:218;;-1:-1:-1;;41133:218:0:o;10281:111::-;10340:14;10376:8;:1;10382;10376:8;:5;:8;:::i;32657:28::-;;;;:::o;72617:125::-;34996:5;;-1:-1:-1;;;;;34996:5:0;34982:10;:19;34974:45;;;;-1:-1:-1;;;34974:45:0;;;;;;;;;72700:15:::1;:34:::0;72617:125::o;12223:147::-;12317:7;12349:13;:1;12355:6;12349:13;:5;:13;:::i;32584:27::-;;;;:::o;61694:1151::-;34996:5;;-1:-1:-1;;;;;34996:5:0;34982:10;:19;34974:45;;;;-1:-1:-1;;;34974:45:0;;;;;;;;;61820:19:::1;::::0;61787:30:::1;61868:17;:15;:17::i;:::-;61852:33;;61896:14;61913:5;:3;:5::i;:::-;61896:22;;61929:14;61946:5;:3;:5::i;:::-;61929:22;;61964:15;61982:20;:18;:20::i;:::-;61964:38;;62013:16;:14;:16::i;:::-;62040:15;62058:20;:18;:20::i;:::-;62040:38;;62121:16;:14;:16::i;:::-;62099:18;;:38;62091:68;;;;-1:-1:-1::0;;;62091:68:0::1;;;;;;;;;62172:19;:42:::0;;;62225:13:::1;62241:17;:15;:17::i;:::-;62225:33;;62269:14;62286:5;:3;:5::i;:::-;62269:22;;62302:14;62319:5;:3;:5::i;:::-;62302:22;;62342:131;62365:22;62389:5;62396:6;62404;62412:7;62421:19;;62442:5;62449:6;62457;62465:7;62342:131;;;;;;;;;;;;;;;;;;;;;;;;62486:34;;:::i;:::-;62523:197;::::0;;::::1;::::0;::::1;::::0;;62561:10;;-1:-1:-1;;;;;62561:10:0::1;62523:197:::0;;-1:-1:-1;62523:197:0::1;::::0;::::1;::::0;;;;62602:20:::1;:18;:20::i;:::-;62523:197;;;;62637:15;:13;:15::i;:::-;62523:197:::0;;62677:10:::1;::::0;62697::::1;::::0;62523:197:::1;::::0;;::::1;::::0;62667:42:::1;::::0;-1:-1:-1;;;;;62677:10:0;;::::1;::::0;62697::::1;62667:9;:42::i;:::-;62523:197:::0;;62739:4:::1;::::0;62811:15:::1;::::0;62486:234;;-1:-1:-1;;;;;;62739:4:0::1;::::0;62733:32:::1;::::0;62811:15:::1;::::0;62486:234;;62811:15:::1;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;62811:15:0;;;62733:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;62733:104:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;62733:104:0;;;;35030:1;;;;;;;;;;61694:1151:::0;:::o;43337:250::-;35098:4;;43477:12;;-1:-1:-1;;;;;35098:4:0;35084:10;:18;35076:44;;;;-1:-1:-1;;;35076:44:0;;;;;;;;;74411:11:::1;::::0;-1:-1:-1;;;74411:11:0;::::1;;;74403:34;;;;-1:-1:-1::0;;;74403:34:0::1;;;;;;;;;74448:11;:19:::0;;-1:-1:-1;;;;74448:19:0::1;::::0;;43507:16:::2;:14;:16::i;:::-;43541:38;43556:8;43566:12;43541:14;:38::i;10100:173::-:0;10192:16;10237:28;10259:5;10237:17;:3;9778:4;10237:17;:7;:17;:::i;:::-;:21;:28;:21;:28;:::i;73300:539::-;35213:10;;-1:-1:-1;;;;;35213:10:0;35191;:33;35183:64;;;;-1:-1:-1;;;35183:64:0;;;;;;;;;73382:16:::1;:14;:16::i;:::-;73441;:14;:16::i;:::-;73419:18;;:38;73411:68;;;;-1:-1:-1::0;;;73411:68:0::1;;;;;;;;;73512:10;::::0;73536::::1;::::0;;73512:35;;-1:-1:-1;;;73512:35:0;;73551:12;;-1:-1:-1;;;;;73512:10:0;;::::1;::::0;:23:::1;::::0;:35:::1;::::0;73536:10;;::::1;::::0;73512:35:::1;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;73512:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;73512:35:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;73512:35:0;;;;;;;;;:51;;73490:118;;;;-1:-1:-1::0;;;73490:118:0::1;;;;;;;;;73644:12;73627:13;;:29;;73619:63;;;;-1:-1:-1::0;;;73619:63:0::1;;;;;;;;;73711:120;73738:13;;73766:12;73711:120;;;;;;;;;;;;;;;;::::0;:12:::1;:120::i;:::-;73695:13;:136:::0;-1:-1:-1;73300:539:0:o;11500:245::-;11632:7;11652:15;11670:20;11680:1;11683:6;11670:9;:20::i;:::-;11652:38;;11708:29;11730:6;11708:17;11717:7;11708:8;:17::i;:::-;:21;:29;:21;:29;:::i;:::-;11701:36;11500:245;-1:-1:-1;;;;;11500:245:0:o;66195:2706::-;35098:4;;66385:12;;-1:-1:-1;;;;;35098:4:0;35084:10;:18;35076:44;;;;-1:-1:-1;;;35076:44:0;;;;;;;;;74411:11:::1;::::0;-1:-1:-1;;;74411:11:0;::::1;;;74403:34;;;;-1:-1:-1::0;;;74403:34:0::1;;;;;;;;;74448:11;:19:::0;;-1:-1:-1;;;;74448:19:0::1;::::0;;66432:10:::2;::::0;:39:::2;::::0;-1:-1:-1;;;66432:39:0;;-1:-1:-1;;;;;66432:10:0;;::::2;::::0;:24:::2;::::0;:39:::2;::::0;66465:4:::2;::::0;66432:39:::2;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;66432:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;66432:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;66432:39:0;;;;;;;;;:111;;;;-1:-1:-1::0;66492:10:0::2;::::0;:51:::2;::::0;-1:-1:-1;;;66492:51:0;;-1:-1:-1;;;;;66492:10:0;;::::2;::::0;:24:::2;::::0;:51:::2;::::0;66525:16;;66492:51:::2;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;66492:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;66492:51:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;66492:51:0;;;;;;;;;66410:178;;;;-1:-1:-1::0;;;66410:178:0::2;;;;;;;;;66599:16;:14;:16::i;:::-;66626;-1:-1:-1::0;;;;;66626:31:0::2;;:33;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;66626:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;;;;;;;66694:24:0;::::2;66670:21;66694:24:::0;;;:14:::2;:24;::::0;;;;:34;;-1:-1:-1;66762:37:0::2;66709:8:::0;66762:27:::2;:37::i;:::-;66812:10;::::0;:184:::2;::::0;-1:-1:-1;;;66812:184:0;;66739:60;;-1:-1:-1;;;;;;66812:10:0::2;::::0;:31:::2;::::0;:184:::2;::::0;66866:4:::2;::::0;66894:16;;66926:8;;66949:10;;66974:11;;66812:184:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;66812:184:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;66812:184:0;;;;67039:16;:14;:16::i;:::-;67017:18;;:38;67009:68;;;;-1:-1:-1::0;;;67009:68:0::2;;;;;;;;;67151:16;:14;:16::i;:::-;67110;-1:-1:-1::0;;;;;67110:35:0::2;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;67110:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;67110:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;67110:37:0;;;;;;;;;:57;67088:124;;;;-1:-1:-1::0;;;67088:124:0::2;;;;;;;;;67245:25;67276:36;67290:8;67300:11;67276:13;:36::i;:::-;-1:-1:-1::0;67408:10:0::2;::::0;:137:::2;::::0;-1:-1:-1;;;67408:137:0;;67244:68;;-1:-1:-1;67386:19:0::2;::::0;-1:-1:-1;;;;;67408:10:0;;::::2;::::0;:26:::2;::::0;:137:::2;::::0;67457:4:::2;::::0;67485:16;;67244:68;;67408:137:::2;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;67408:137:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;67408:137:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;67408:137:0;;;;;;;;;67386:159;;67672:11;67632:16;-1:-1:-1::0;;;;;67632:26:0::2;;67659:8;67632:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;67632:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;67632:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;67632:36:0;;;;;;;;;:51;;67610:115;;;;-1:-1:-1::0;;;67610:115:0::2;;;;;;;;;-1:-1:-1::0;;;;;67742:42:0;::::2;67779:4;67742:42;67738:228;;;67801:63;67823:4;67830:10;67842:8;67852:11;67801:13;:63::i;:::-;67738:228;;;67897:57;::::0;-1:-1:-1;;;67897:57:0;;-1:-1:-1;;;;;67897:22:0;::::2;::::0;::::2;::::0;:57:::2;::::0;67920:10;;67932:8;;67942:11;;67897:57:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;67897:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;67897:57:0;;;;67738:228;68015:10;::::0;68035::::2;::::0;67978:24:::2;::::0;68005:79:::2;::::0;68066:17;;68005:42:::2;::::0;-1:-1:-1;;;;;68015:10:0;;::::2;::::0;68035::::2;68005:9;:42::i;:79::-;67978:106;;68097:36;;:::i;:::-;68136:721;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;68136:721:0;;::::2;::::0;;68200:10;;::::2;68136:721;::::0;::::2;::::0;68233:4:::2;68136:721:::0;;;;;;;;;;;;;;;;68285:41:::2;68298:12:::0;68312:13;68285:12:::2;:41::i;:::-;68136:721;;;;68341:8;-1:-1:-1::0;;;;;68136:721:0::2;;;;;68364:11;68136:721;;;;68398:16;-1:-1:-1::0;;;;;68136:721:0::2;;;;;68430:46;68448:16;68467:8;68430:9;:46::i;:::-;68136:721:::0;;-1:-1:-1;;;;;68491:24:0;::::2;;::::0;;;:14:::2;68136:721;68491:24:::0;;;;;;;;:34;68136:721;;::::2;::::0;;68557:36:::2;68575:17:::0;68557::::2;:36::i;:::-;68136:721:::0;;68608:17:::2;::::0;68693:12:::2;::::0;68724:13:::2;::::0;68608:144:::2;::::0;-1:-1:-1;;;68608:144:0;;68136:721:::2;::::0;;::::2;::::0;-1:-1:-1;;;;;68608:17:0;;::::2;::::0;:31:::2;::::0;:144:::2;::::0;68658:16;;68608:144:::2;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;68608:144:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;68608:144:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;68608:144:0;;;;;;;;;68136:721;;;;68767:48;68785:16;68804:10;68767:9;:48::i;:::-;68136:721;;;;68830:16;68136:721;;::::0;68097:760:::2;;68888:4;68877:16;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;68877:16:0;;;68870:23;;;;;;;;74490:11:::1;:18:::0;;-1:-1:-1;;;;74490:18:0::1;-1:-1:-1::0;;;74490:18:0::1;::::0;;66195:2706;;-1:-1:-1;;;;66195:2706:0:o;75089:219::-;75182:10;;75202;;75137:7;;;;75172:42;;-1:-1:-1;;;;;75182:10:0;;;;75202;75172:9;:42::i;:::-;75232:17;;75272:12;;75286:13;;75232:68;;-1:-1:-1;;;75232:68:0;;75157:57;;-1:-1:-1;;;;;;75232:17:0;;;;:33;;:68;;75157:57;;75272:12;;75286:13;75232:68;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;75232:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;75232:68:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;75232:68:0;;;;;;;;;75225:75;;;75089:219;:::o;32789:33::-;;;;:::o;32512:34::-;;;;:::o;32927:25::-;;;-1:-1:-1;;;;;32927:25:0;;:::o;34093:843::-;31162:12;;;;;;;;:31;;;31178:15;:13;:15::i;:::-;31162:47;;;-1:-1:-1;31198:11:0;;;;31197:12;31162:47;31154:106;;;;-1:-1:-1;;;31154:106:0;;;;;;;;;31269:19;31292:12;;;;;;31291:13;31311:83;;;;31340:12;:19;;-1:-1:-1;;;;31340:19:0;;;;;31368:18;31355:4;31368:18;;;31311:83;34440:19:::1;:42:::0;;;34493:10:::1;:41:::0;;-1:-1:-1;;;;;34493:41:0;;::::1;-1:-1:-1::0;;;;;;34493:41:0;;::::1;;::::0;;;34545:17:::1;:65:::0;;;;::::1;::::0;;::::1;;::::0;;34621:5:::1;:18:::0;;;::::1;34629:10;34621:18;::::0;;34650:10:::1;:24:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;34685:15:::1;:34:::0;;;34751:16:::1;:14;:16::i;:::-;34730:18;:37:::0;33220:4:::1;34778:11;:17:::0;34806:4:::1;:12:::0;;-1:-1:-1;;;;;;34806:12:0::1;-1:-1:-1::0;;;;;34806:12:0;::::1;;::::0;;34829;;::::1;::::0;:4:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;34852:16:0;;::::1;::::0;:6:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;34879:8:0::1;:20:::0;;::::1;::::0;::::1;-1:-1:-1::0;;34879:20:0;;::::1;;::::0;;34910:11:::1;:18:::0;;-1:-1:-1;;;;34910:18:0::1;-1:-1:-1::0;;;34910:18:0::1;::::0;;31412:57;;;;31456:5;31441:20;;-1:-1:-1;;31441:20:0;;;31412:57;34093:843;;;;;;;;;;:::o;72499:110::-;-1:-1:-1;;;;;72581:20:0;72554:7;72581:20;;;:13;:20;;;;;;;72499:110::o;33099:19::-;;;-1:-1:-1;;;;;33099:19:0;;:::o;12378:104::-;12430:7;12457:17;:3;9778:4;12457:17;:7;:17;:::i;36001:124::-;34996:5;;-1:-1:-1;;;;;34996:5:0;34982:10;:19;34974:45;;;;-1:-1:-1;;;34974:45:0;;;;;;;;;36076:10:::1;:41:::0;;-1:-1:-1;;;;;;36076:41:0::1;-1:-1:-1::0;;;;;36076:41:0;;;::::1;::::0;;;::::1;::::0;;36001:124::o;75600:326::-;75691:10;;75711;;75646:7;;;;75681:42;;-1:-1:-1;;;;;75691:10:0;;;;75711;75681:9;:42::i;:::-;75754:17;;75827:12;;75858:13;;75890;;75754:164;;-1:-1:-1;;;75754:164:0;;75666:57;;-1:-1:-1;;;;;;75754:17:0;;;;:31;;:164;;75666:57;;75827:12;;75858:13;;75890;75754:164;;;;33060:30;;;;:::o;10949:163::-;11054:7;11081:23;11088:12;11095:1;11098;11088:6;:12::i;:::-;11102:1;11081:6;:23::i;32620:28::-;;;;:::o;36133:283::-;36232:7;36286:26;:24;:26::i;:::-;-1:-1:-1;;;;;36277:35:0;:5;-1:-1:-1;;;;;36277:35:0;;;:131;;36392:7;-1:-1:-1;;;;;36384:24:0;;36277:131;;;36332:32;;-1:-1:-1;;;36332:32:0;;-1:-1:-1;;;;;36332:23:0;;;;;:32;;36356:7;;36332:32;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36332:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36332:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;36332:32:0;;;;;;;;74106:123;35653:4;;-1:-1:-1;;;;;35653:4:0;35639:10;:18;;:72;;-1:-1:-1;35700:10:0;;-1:-1:-1;;;;;35700:10:0;35678;:33;35639:72;:120;;;-1:-1:-1;35732:10:0;35754:4;35732:27;35639:120;:179;;;-1:-1:-1;35780:10:0;;:38;;-1:-1:-1;;;35780:38:0;;-1:-1:-1;;;;;35780:10:0;;;;:26;;:38;;35807:10;;35780:38;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35780:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35780:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35780:38:0;;;;;;;;;35617:248;;;;-1:-1:-1;;;35617:248:0;;;;;;;;;74196:9:::1;::::0;:25:::1;::::0;74210:10;74196:25:::1;:13;:25;:::i;:::-;74184:9;:37:::0;-1:-1:-1;74106:123:0:o;32369:20::-;;;;;;;;;;;;;;;-1:-1:-1;;32369:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65459:172;65555:7;65587:36;65615:7;65587:27;:36::i;73847:251::-;35213:10;;-1:-1:-1;;;;;35213:10:0;35191;:33;35183:64;;;;-1:-1:-1;;;35183:64:0;;;;;;;;;73928:16:::1;:14;:16::i;:::-;73987;:14;:16::i;:::-;73965:18;;:38;73957:68;;;;-1:-1:-1::0;;;73957:68:0::1;;;;;;;;;74052:38;74065:13;;74080:9;74052:12;:38::i;48228:428::-:0;-1:-1:-1;;;;;48437:22:0;;48334:7;48437:22;;;:13;:22;;;;;;48334:7;;;;;48494:36;48451:7;48494:27;:36::i;:::-;48470:60;;48541:20;48564;:18;:20::i;:::-;48605:13;;48620;;-1:-1:-1;48605:13:0;;-1:-1:-1;48228:428:0;-1:-1:-1;;;48228:428:0:o;32961:48::-;;;;;;;;;;;;;:::o;53901:2506::-;35346:5;;-1:-1:-1;;;;;35346:5:0;35332:10;:19;;:58;;-1:-1:-1;35386:4:0;;-1:-1:-1;;;;;35386:4:0;35372:10;:18;35332:58;:112;;;-1:-1:-1;35433:10:0;;-1:-1:-1;;;;;35433:10:0;35411;:33;35332:112;:171;;;-1:-1:-1;35465:10:0;;:38;;-1:-1:-1;;;35465:38:0;;-1:-1:-1;;;;;35465:10:0;;;;:26;;:38;;35492:10;;35465:38;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35465:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35465:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35465:38:0;;;;;;;;;35310:241;;;;-1:-1:-1;;;35310:241:0;;;;;;;;;53960:26:::1;53989:16;:14;:16::i;:::-;54050:18;::::0;53960:45;;-1:-1:-1;54114:45:0;;::::1;54110:84;;;54176:7;;;;54110:84;54226:10;::::0;54250::::1;::::0;;54226:35;;-1:-1:-1;;;54226:35:0;;54206:17:::1;::::0;-1:-1:-1;;;;;54226:10:0;;::::1;::::0;:23:::1;::::0;:35:::1;::::0;54250:10;;::::1;::::0;54226:35:::1;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;54226:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;54226:35:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54226:35:0;;;;;;;;;54295:12;::::0;54342:13:::1;::::0;54393:11:::1;::::0;54472:17:::1;::::0;:121:::1;::::0;-1:-1:-1;;;54472:121:0;;54206:55;;-1:-1:-1;54295:12:0;;54342:13;;54393:11;;54272:20:::1;::::0;-1:-1:-1;;;;;54472:17:0::1;::::0;:31:::1;::::0;:121:::1;::::0;54206:55;;54295:12;;54342:13;;54472:121:::1;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;54472:121:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;54472:121:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54472:121:0;;;;;;;;;54451:142;;32771:9;54652:10;:27;;54644:63;;;;-1:-1:-1::0;;;54644:63:0::1;;;;;;;;;54748:18;54769:47;:18:::0;54792:23;54769:47:::1;:22;:47;:::i;:::-;54748:68;;55216:28;55255:27:::0;55293:23:::1;55327:24:::0;55362:22:::1;55420:33;55430:10;55442;55420:9;:33::i;:::-;55397:56;;55488:97;55509:42;55516:20;55538:12;55509:6;:42::i;55488:97::-;55466:119;;55616:41;55623:19;55644:12;55616:6;:41::i;:::-;55598:59;;55689:120;55710:60;55717:42;55724:13;;55739:19;55717:6;:42::i;55689:120::-;55670:139;;55839:127;55860:64;55867:46;55874:20;55896:16;55867:6;:46::i;55839:127::-;55979:18;:39:::0;;;56029:11:::1;:28:::0;;;56068:12:::1;:30:::0;;;56109:13:::1;:32:::0;;;56167:17:::1;::::0;:121:::1;::::0;-1:-1:-1;;;56167:121:0;;55822:144;;-1:-1:-1;;;;;;56167:17:0::1;::::0;:31:::1;::::0;:121:::1;::::0;56213:9;;56083:15;;56125:16;;-1:-1:-1;56167:121:0::1;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;56167:121:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;56167:121:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;56167:121:0;;;;;;;;;56154:134;;32771:9;56344:10;:27;;56336:63;;;;-1:-1:-1::0;;;56336:63:0::1;;;;;;;;;35562:1;;;;;;;;;;;;;;53901:2506::o:0;36941:627::-;74411:11;;37046:4;;-1:-1:-1;;;74411:11:0;;;;74403:34;;;;-1:-1:-1;;;74403:34:0;;;;;;;;;74448:11;:19;;-1:-1:-1;;;;74448:19:0;;;37100:51:::1;37115:10;::::0;37139:3;37144:6;37100:14:::1;:51::i;:::-;;37164:28;;:::i;:::-;37195:267;::::0;;::::1;::::0;::::1;::::0;;37227:10:::1;37195:267:::0;;;37252:10;;-1:-1:-1;;;;;37252:10:0::1;37195:267;::::0;::::1;::::0;37285:4:::1;37195:267:::0;;;;;;;;;;;;;;;;;;37326:21:::1;::::0;:9:::1;:21::i;:::-;37195:267;;;;37362:3;-1:-1:-1::0;;;;;37195:267:0::1;;;;;37380:14;37390:3;37380:9;:14::i;:::-;37195:267:::0;;37419:10:::1;::::0;37439::::1;::::0;37195:267:::1;::::0;;::::1;::::0;37409:42:::1;::::0;-1:-1:-1;;;;;37419:10:0;;::::1;::::0;37439::::1;37409:9;:42::i;:::-;37195:267:::0;;37481:4:::1;::::0;37520:15:::1;::::0;37164:298;;-1:-1:-1;;;;;;37481:4:0::1;::::0;37475:32:::1;::::0;37520:15:::1;::::0;37164:298;;37520:15:::1;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;37520:15:0;;;37475:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37475:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37475:61:0;;;;37556:4;37549:11;;;74490::::0;:18;;-1:-1:-1;;;;74490:18:0;-1:-1:-1;;;74490:18:0;;;36941:627;;-1:-1:-1;;36941:627:0:o;32694:26::-;;;;:::o;60008:279::-;34996:5;;-1:-1:-1;;;;;34996:5:0;34982:10;:19;34974:45;;;;-1:-1:-1;;;34974:45:0;;;;;;;;;74411:11:::1;::::0;-1:-1:-1;;;74411:11:0;::::1;;;74403:34;;;;-1:-1:-1::0;;;74403:34:0::1;;;;;;;;;74448:11;:19:::0;;-1:-1:-1;;;;74448:19:0::1;::::0;;60141:16:::2;:14;:16::i;:::-;60198;:14;:16::i;:::-;60176:18;;:38;60168:68;;;;-1:-1:-1::0;;;60168:68:0::2;;;;;;;;;60247:13;:32:::0;74490:11:::1;:18:::0;;-1:-1:-1;;;;74490:18:0::1;-1:-1:-1::0;;;74490:18:0::1;::::0;;60008:279::o;68909:216::-;74411:11;;-1:-1:-1;;;74411:11:0;;;;74403:34;;;;-1:-1:-1;;;74403:34:0;;;;;;;;;74448:11;:19;;-1:-1:-1;;;;74448:19:0;;;69057:60:::1;69071:10;69083::::0;69095:8;69105:11;69057:13:::1;:60::i;:::-;-1:-1:-1::0;;74490:11:0;:18;;-1:-1:-1;;;;74490:18:0;-1:-1:-1;;;74490:18:0;;;-1:-1:-1;68909:216:0:o;11284:208::-;11386:7;11411:15;11429:20;11439:1;11442:6;11429:9;:20::i;:::-;11411:38;;11467:17;11476:7;11467:8;:17::i;10835:106::-;10894:7;10921:12;10928:1;10931;10921:6;:12::i;49262:312::-;35098:4;;49434:7;;49443:12;;-1:-1:-1;;;;;35098:4:0;35084:10;:18;35076:44;;;;-1:-1:-1;;;35076:44:0;;;;;;;;;74411:11:::1;::::0;-1:-1:-1;;;74411:11:0;::::1;;;74403:34;;;;-1:-1:-1::0;;;74403:34:0::1;;;;;;;;;74448:11;:19:::0;;-1:-1:-1;;;;74448:19:0::1;::::0;;49468:16:::2;:14;:16::i;:::-;49502:64;49519:10;49531:16;49549;49502;:64::i;:::-;49495:71;;;;74490:11:::1;:18:::0;;-1:-1:-1;;;;74490:18:0::1;-1:-1:-1::0;;;74490:18:0::1;::::0;;49262:312;;;;-1:-1:-1;49262:312:0;-1:-1:-1;;49262:312:0:o;75340:228::-;75431:10;;75451;;75386:7;;;;75421:42;;-1:-1:-1;;;;;75431:10:0;;;;75451;75421:9;:42::i;:::-;75494:17;;75532:12;;75546:13;;75494:66;;-1:-1:-1;;;75494:66:0;;75406:57;;-1:-1:-1;;;;;;75494:17:0;;;;:31;;:66;;75406:57;;75532:12;;75546:13;75494:66;;;;74548:195;74629:10;;74649;;74584:7;;;;74619:42;;-1:-1:-1;;;;;74629:10:0;;;;74649;74619:9;:42::i;:::-;74679:17;;74707:12;;74721:13;;74679:56;;-1:-1:-1;;;74679:56:0;;74604:57;;-1:-1:-1;;;;;;74679:17:0;;;;:21;;:56;;74604:57;;74707:12;;74721:13;74679:56;;;;48051:142;74411:11;;48111:7;;-1:-1:-1;;;74411:11:0;;;;74403:34;;;;-1:-1:-1;;;74403:34:0;;;;;;;;;74448:11;:19;;-1:-1:-1;;;;74448:19:0;;;48131:16:::1;:14;:16::i;:::-;48165:20;:18;:20::i;:::-;48158:27;;74490:11:::0;:18;;-1:-1:-1;;;;74490:18:0;-1:-1:-1;;;74490:18:0;;;48051:142;:::o;33418:24::-;;;;:::o;33190:34::-;33220:4;33190:34;:::o;74237:123::-;35653:4;;-1:-1:-1;;;;;35653:4:0;35639:10;:18;;:72;;-1:-1:-1;35700:10:0;;-1:-1:-1;;;;;35700:10:0;35678;:33;35639:72;:120;;;-1:-1:-1;35732:10:0;35754:4;35732:27;35639:120;:179;;;-1:-1:-1;35780:10:0;;:38;;-1:-1:-1;;;35780:38:0;;-1:-1:-1;;;;;35780:10:0;;;;:26;;:38;;35807:10;;35780:38;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35780:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35780:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35780:38:0;;;;;;;;;35617:248;;;;-1:-1:-1;;;35617:248:0;;;;;;;;;74327:9:::1;::::0;:25:::1;::::0;74341:10;74327:25:::1;:13;:25;:::i;45533:736::-:0;45715:11;;45654:20;;45741:17;45737:525;;-1:-1:-1;;45782:19:0;;45775:26;;45737:525;45976:10;;46000;;;45976:35;;-1:-1:-1;;;45976:35:0;;45956:17;;-1:-1:-1;;;;;45976:10:0;;;;:23;;:35;;46000:10;;;;45976:35;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45976:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45976:35:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45976:35:0;;;;;;;;;45956:55;;46026:36;46065:105;46090:32;46097:9;46108:13;46090:6;:32::i;:::-;46141:14;46065:6;:105::i;:::-;46026:144;;46200:50;46207:28;46237:12;46200:6;:50::i;:::-;46185:65;45533:736;-1:-1:-1;;;;;;45533:736:0:o;11993:222::-;12098:7;;12143:20;9778:4;12156:6;12143:20;:12;:20;:::i;:::-;12123:40;;12181:26;12188:9;12199:7;12181:6;:26::i;33355:56::-;;;;;;;;;;;;;;;;;;;:::o;11753:232::-;11866:7;11891:16;11910:31;11925:6;11933:7;11910:14;:31::i;40368:175::-;-1:-1:-1;;;;;40501:25:0;;;40469:7;40501:25;;;:18;:25;;;;;;;;:34;;;;;;;;;;;;;40368:175::o;10519:308::-;10578:7;;10628:8;:1;10634;10628:8;:5;:8;:::i;:::-;10598:38;-1:-1:-1;10649:40:0;10692:61;9863:12;10598:38;10692:16;:61::i;:::-;10649:104;-1:-1:-1;10773:46:0;10649:104;9778:4;10773:46;:36;:46;:::i;47550:493::-;47646:7;47676:21;47699:23;47726:14;:12;:14::i;:::-;47671:69;;;;;;47753:21;47777:85;47808:13;47836:15;47777:16;:85::i;:::-;-1:-1:-1;;;;;47979:20:0;;47901:15;47979:20;;;:13;:20;;;;;;47753:109;;-1:-1:-1;47901:15:0;47919:91;;47753:109;;47919:17;:91::i;74775:306::-;74856:10;;74876;;74811:7;;;;74846:42;;-1:-1:-1;;;;;74856:10:0;;;;74876;74846:9;:42::i;:::-;74919:17;;74982:12;;75013:13;;75045;;74919:154;;-1:-1:-1;;;74919:154:0;;74831:57;;-1:-1:-1;;;;;;74919:17:0;;;;:21;;:154;;74831:57;;74982:12;;75013:13;;75045;74919:154;;;;60521:1165;34996:5;;-1:-1:-1;;;;;34996:5:0;34982:10;:19;34974:45;;;;-1:-1:-1;;;34974:45:0;;;;;;;;;60669:17:::1;::::0;-1:-1:-1;;;;;60669:17:0::1;60644:14;60714:17;:15;:17::i;:::-;60698:33;;60742:14;60759:5;:3;:5::i;:::-;60742:22;;60775:14;60792:5;:3;:5::i;:::-;60775:22;;60810:15;60828:20;:18;:20::i;:::-;60810:38;;60864:16;:14;:16::i;:::-;60891:15;60909:20;:18;:20::i;:::-;60891:38;;60972:16;:14;:16::i;:::-;60950:18;;:38;60942:68;;;;-1:-1:-1::0;;;60942:68:0::1;;;;;;;;;61023:17;:40:::0;;-1:-1:-1;;;;;;61023:40:0::1;-1:-1:-1::0;;;;;61023:40:0;::::1;;::::0;;-1:-1:-1;61090:17:0::1;:15;:17::i;:::-;61074:33;;61118:14;61135:5;:3;:5::i;:::-;61118:22;;61151:14;61168:5;:3;:5::i;:::-;61151:22;;61191:123;61212:6;61220:5;61227:6;61235;61243:7;61260:20;61283:5;61290:6;61298;61306:7;61191:123;;;;;;;;;;;;;;;;32831:43:::0;;;-1:-1:-1;;;;;32831:43:0;;:::o;33018:33::-;;;-1:-1:-1;;;;;33018:33:0;;:::o;32555:20::-;;;-1:-1:-1;;;;;32555:20:0;;:::o;62853:96::-;62929:12;62853:96;:::o;5310:136::-;5368:7;5395:43;5399:1;5402;5395:43;;;;;;;;;;;;;;;;;:3;:43::i;59588:412::-;59689:14;59746:36;;:::i;:::-;-1:-1:-1;;;;;;59785:20:0;;;;;;:14;:20;;;;;;;;;59746:59;;;;;;;;;;;;;;;;;;;;;;;;;59818:70;;59875:1;59868:8;;;;;59818:70;59909:83;59916:14;:24;;;59942:49;59949:11;;59962:14;:28;;;59942:6;:49::i;51794:2078::-;51950:7;51959:12;52121:21;;;:46;;-1:-1:-1;52146:21:0;;52121:46;52099:124;;;;-1:-1:-1;;;52099:124:0;;;;;;;;;52234:25;;:::i;:::-;52291:20;:18;:20::i;:::-;52272:39;;52328:20;;52324:441;;52365:18;;;:37;;;52474:16;;52438:102;;52386:16;52438:17;:102::i;:::-;52417:18;;;:123;52324:441;;;52594:107;52635:16;52670:3;:16;;;52594:22;:107::i;:::-;52573:18;;;:128;52716:18;;;:37;;;52324:441;52807:16;:14;:16::i;:::-;52785:18;;:38;52777:68;;;;-1:-1:-1;;;52777:68:0;;;;;;;;;52895:18;;;;52879:11;;:35;;;:15;:35;:::i;:::-;52858:18;;;:56;52992:18;;;;;-1:-1:-1;;;;;52948:25:0;;;;;;:13;:25;;;;;;;;:73;;;:29;:73;:::i;:::-;52925:20;;;:96;;;53048:18;;;;53034:11;:32;-1:-1:-1;;;;;53077:25:0;;;;;;;:13;:25;;;;;;:48;;;;53226:18;;;;53175:10;;53195;;53077:25;;53165:80;;53226:18;;53165:42;;53175:10;;;53195;53165:9;:42::i;:80::-;53138:107;;53258:28;;:::i;:::-;53289:448;;;;;;;;-1:-1:-1;;;;;53289:448:0;;;;;53346:10;;;53289:448;;;;;;;;53379:4;53289:448;;;;53399:18;;;53289:448;;;;53432:18;;;;53289:448;;;;;;;53465:20;:18;:20::i;:::-;53289:448;;53500:17;;53585:12;;53616:13;;53500:144;;-1:-1:-1;;;53500:144:0;;53289:448;;;;;-1:-1:-1;;;;;53500:17:0;;;;:31;;:144;;53550:16;;53500:144;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53500:144:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53500:144:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;53500:144:0;;;;;;;;;53289:448;;;;53659:36;53677:4;53684:10;53659:9;:36::i;:::-;53289:448;;;;53710:16;53289:448;;;53258:479;;53784:1;-1:-1:-1;;;;;53755:52:0;53764:10;-1:-1:-1;;;;;53755:52:0;-1:-1:-1;;;;;;;;;;;53788:3:0;:18;;;53755:52;;;;;;;;;;;;;;;53828:3;:18;;;53859:3;53848:15;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;53848:15:0;;;53820:44;;;;;;;51794:2078;;;;;;:::o;63565:1886::-;63702:10;;63724;;;63702:33;;-1:-1:-1;;;63702:33:0;;63663:7;;63672:12;;-1:-1:-1;;;;;63702:10:0;;;;:21;;:33;;63724:10;;63702:33;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;63702:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63702:33:0;;;;63776:16;:14;:16::i;:::-;63754:18;;:38;63746:68;;;;-1:-1:-1;;;63746:68:0;;;;;;;;;63827:22;;:::i;:::-;-1:-1:-1;;;;;63884:24:0;;63860:21;63884:24;;;:14;:24;;;;;;;;:34;;63949:38;;;;;63929:17;;;:58;;;;64019:37;63899:8;64019:27;:37::i;:::-;63998:18;;;:58;-1:-1:-1;;64104:26:0;;64100:157;;;64165:18;;;;64147:36;;64100:157;;;64216:29;;;64100:157;64316:15;;64293:18;;;;:39;;;:22;:39;:::i;:::-;64269:21;;;:63;64362:15;;64347:12;;:30;64343:174;;;64416:1;64394:19;;;:23;64343:174;;;64489:15;;64472:12;;:33;;;:16;:33;:::i;:::-;64450:19;;;:55;64343:174;64566:21;;;;-1:-1:-1;;;;;64529:24:0;;;;;;;:14;:24;;;;;;:58;;;64639:11;;64598:38;;;;:52;;;;64676:19;;;;64661:12;:34;64796:15;;64745:10;;64765;;64529:24;;64735:77;;64796:15;;64735:42;;64745:10;;;64765;64735:9;:42::i;:77::-;64708:104;;64825:25;;:::i;:::-;64853:536;;;;;;;;-1:-1:-1;;;;;64853:536:0;;;;;64905:10;;;64853:536;;;;64938:4;64853:536;;;;64958:15;;64853:536;;;;65001:18;;;;64853:536;;;;64988:47;;65021:13;64988:12;:47::i;:::-;64853:536;;;;65050:34;65068:3;:15;;;65050:17;:34::i;:::-;64853:536;;65125:17;;65210:12;;65241:13;;65125:144;;-1:-1:-1;;;65125:144:0;;64853:536;;;;;-1:-1:-1;;;;;65125:17:0;;;;:31;;:144;;65175:16;;65125:144;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;65125:144:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65125:144:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;65125:144:0;;;;;;;;;64853:536;;-1:-1:-1;;;;;65313:24:0;;;;;;:14;64853:536;65313:24;;;;;;;;:34;64853:536;;;;;;;;;;65410:15;;65427;;64825:564;;-1:-1:-1;65410:15:0;65427;;64825:564;;65427:15;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;65427:15:0;;;65402:41;;;;;;;;63565:1886;;;;;:::o;9524:158::-;9582:7;9610:1;9606;:5;9602:50;;;-1:-1:-1;9635:5:0;;;9628:12;;9602:50;-1:-1:-1;9669:5:0;;;9524:158::o;38503:959::-;35941:4;;35935:20;;;-1:-1:-1;;;35935:20:0;;;;38660:4;;-1:-1:-1;;;;;35941:4:0;;35935:18;;:20;;;;;;;;;;;;;;35941:4;35935:20;;;2:2:-1;;;;27:1;24;17:12;2:2;35935:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35935:20:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35935:20:0;;;;;;;;;35934:21;35926:47;;;;-1:-1:-1;;;35926:47:0;;;;;;;;;38706:10:::1;;;;;;;;;-1:-1:-1::0;;;;;38706:10:0::1;-1:-1:-1::0;;;;;38706:24:0::1;;38739:4;38746:3;38751;38756:42;38774:6;38782:15;;38756:17;:42::i;:::-;38706:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38706:93:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38706:93:0;;;;38827:3;-1:-1:-1::0;;;;;38820:10:0::1;:3;-1:-1:-1::0;;;;;38820:10:0::1;;;38812:46;;;;-1:-1:-1::0;;;38812:46:0::1;;;;;;;;;38871:25;-1:-1:-1::0;;;;;38915:14:0;;::::1;::::0;;::::1;;38911:163;;;-1:-1:-1::0;;;38911:163:0::1;;;-1:-1:-1::0;;;;;;39030:23:0;;::::1;;::::0;;;:18:::1;:23;::::0;;;;;;;:32;;::::1;::::0;;;;;;;38911:163:::1;39086:20;39109:29;:17:::0;39131:6;39109:29:::1;:21;:29;:::i;:::-;-1:-1:-1::0;;;;;39172:18:0;::::1;;::::0;;;:13:::1;:18;::::0;;;;;39086:52;;-1:-1:-1;39172:30:0::1;::::0;39195:6;39172:30:::1;:22;:30;:::i;:::-;-1:-1:-1::0;;;;;39151:18:0;;::::1;;::::0;;;:13:::1;:18;::::0;;;;;:51;;;;39234:18;;::::1;::::0;;;;:30:::1;::::0;39257:6;39234:30:::1;:22;:30;:::i;:::-;-1:-1:-1::0;;;;;39213:18:0;::::1;;::::0;;;:13:::1;:18;::::0;;;;:51;-1:-1:-1;;39281:32:0;::::1;39277:112;;-1:-1:-1::0;;;;;39330:23:0;;::::1;;::::0;;;:18:::1;:23;::::0;;;;;;;:32;;::::1;::::0;;;;;;:47;;;39277:112:::1;39420:3;-1:-1:-1::0;;;;;39406:26:0::1;39415:3;-1:-1:-1::0;;;;;39406:26:0::1;-1:-1:-1::0;;;;;;;;;;;39425:6:0::1;39406:26;;;;;;;;;;;;;;;-1:-1:-1::0;39450:4:0::1;::::0;38503:959;-1:-1:-1;;;;;;38503:959:0:o;6234:471::-;6292:7;6537:6;6533:47;;-1:-1:-1;6567:1:0;6560:8;;6533:47;6604:5;;;6608:1;6604;:5;:1;6628:5;;;;;:10;6620:56;;;;-1:-1:-1;;;6620:56:0;;;;;;;;41380:1434;41468:12;41528:16;:14;:16::i;:::-;41506:18;;:38;41498:68;;;;-1:-1:-1;;;41498:68:0;;;;;;;;;41577:21;;:::i;:::-;41609:10;;41630;;;41609:46;;-1:-1:-1;;;41609:46:0;;-1:-1:-1;;;;;41609:10:0;;;;:20;;:46;;41630:10;;;41642:4;;41648:6;;41609:46;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41609:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41609:46:0;;;;41685:20;:18;:20::i;:::-;41666:39;;;41733:48;;41756:6;;41733:22;:48::i;:::-;41716:14;;;:65;;;41820:11;;41813:35;;:6;:35::i;:::-;41792:18;;;;:56;;;;-1:-1:-1;;;;;41889:19:0;;;;;;:13;:19;;;;;;;;41910:14;;;;41882:43;;41889:19;41882:6;:43::i;:::-;41859:20;;;:66;;;41950:18;;;;;41936:11;:32;-1:-1:-1;;;;;41979:19:0;;;;;;;:13;:19;;;;;:42;;;;42071:10;;42091;;42061:68;;42122:6;;42061:42;;42071:10;;;;42091;42061:9;:42::i;:68::-;42034:95;;42142:27;;:::i;:::-;42172:539;;;;;;;;-1:-1:-1;;;;;42172:539:0;;;;;42222:10;;;42172:539;;;;;;;;42255:4;42172:539;;;;;;;42275:14;;;;42172:539;;;;;;;;;;;;;42325:25;42304:6;42325:17;:25::i;:::-;42172:539;;42421:17;;42506:12;;42537:13;;42421:144;;-1:-1:-1;;;42421:144:0;;42172:539;;;;;-1:-1:-1;;;;;42421:17:0;;;;:31;;:144;;42471:16;;42421:144;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42421:144:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42421:144:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42421:144:0;;;;;;;;;42172:539;;;;42639:30;42657:4;42664;42639:9;:30::i;:::-;42172:539;;;;42684:16;42172:539;;;42142:569;;42750:4;-1:-1:-1;;;;;42729:42:0;42746:1;-1:-1:-1;;;;;42729:42:0;-1:-1:-1;;;;;;;;;;;42756:3:0;:14;;;42729:42;;;;;;;;;;;;;;;42802:3;42791:15;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;42791:15:0;;;42784:22;;;;;41380:1434;;;;:::o;4846:181::-;4904:7;4936:5;;;4960:6;;;;4952:46;;;;-1:-1:-1;;;4952:46:0;;;;;;;;7181:132;7239:7;7266:39;7270:1;7273;7266:39;;;;;;;;;;;;;;;;;:3;:39::i;43616:1497::-;43754:10;;43814;;43899:15;;43724:12;;-1:-1:-1;;;;;43754:10:0;;;;:22;;43791:8;;43814:10;;;;43847:4;;43867:48;;43885:12;;43867:17;:48::i;:::-;43754:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43754:172:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;43961:10:0;;43985;;;43961:35;;-1:-1:-1;;;43961:35:0;;44000:12;;-1:-1:-1;;;;;;43961:10:0;;;;-1:-1:-1;43961:23:0;;:35;;43985:10;;43961:35;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43961:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43961:35:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43961:35:0;;;;;;;;;:51;;43939:121;;;;-1:-1:-1;;;43939:121:0;;;;;;;;;44073:23;;:::i;:::-;-1:-1:-1;;;;;44131:24:0;;44107:21;44131:24;;;:14;:24;;;;;:34;44197:37;44146:8;44197:27;:37::i;:::-;44176:58;;;44269:40;;44296:12;44269:6;:40::i;:::-;44245:21;;;:64;44349:12;;44342:34;;44363:12;44342:6;:34::i;:::-;44320:19;;;;:56;;;44426:21;;;;;-1:-1:-1;;;;;44389:24:0;;;;;;;:14;:24;;;;;;;:58;;;44499:11;;44458:38;;;;:52;44536:19;;44521:12;:34;44568:10;;44594;;44568:61;;-1:-1:-1;;;44568:61:0;;:10;;;;:25;;:61;;44594:10;;;44404:8;;44616:12;;44568:61;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44568:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44568:61:0;;;;44640:26;44653:12;44640;:26::i;:::-;44679;;:::i;:::-;44708:362;;;;;;;;-1:-1:-1;;;;;44708:362:0;;;;;44761:10;;;44708:362;;;;44794:4;44708:362;;;;;;;;;;;;;44854:18;;44708:362;;;;44841:47;;44874:13;44841:12;:47::i;:::-;44708:362;;;;44903:20;:18;:20::i;:::-;44708:362;;;;44938:15;:13;:15::i;:::-;44708:362;;-1:-1:-1;;;;;44968:24:0;;;;;;;:14;44708:362;44968:24;;;;;;;;:34;44708:362;;;;45027:10;;45047;;44708:362;;;;;45017:42;;45027:10;;;;45047;45017:9;:42::i;:::-;44708:362;;;44679:391;;45101:3;45090:15;;;;;;;;;5749:226;5869:7;5905:12;5897:6;;;;5889:29;;;;-1:-1:-1;;;5889:29:0;;;;;;;;;;-1:-1:-1;;;5941:5:0;;;5749:226::o;72750:519::-;72936:10;-1:-1:-1;;;;;72924:22:0;:8;-1:-1:-1;;;;;72924:22:0;;;72916:64;;;;-1:-1:-1;;;72916:64:0;;;;;;;;;72991:10;;:49;;-1:-1:-1;;;72991:49:0;;-1:-1:-1;;;;;72991:10:0;;;;:21;;:49;;73021:4;;73028:11;;72991:49;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;72991:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;;;73079:23:0;;;;;;:13;:23;;;;;;:40;;-1:-1:-1;73107:11:0;73079:40;:27;:40;:::i;:::-;-1:-1:-1;;;;;73053:23:0;;;;;;;:13;:23;;;;;;:66;;;;73158:25;;;;;;;:42;;73188:11;73158:42;:29;:42;:::i;:::-;-1:-1:-1;;;;;73130:25:0;;;;;;;:13;:25;;;;;;;:70;;;;73218:43;;;;;;-1:-1:-1;;;;;;;;;;;73218:43:0;;;73249:11;;73218:43;;;;;;;;;;72750:519;;;;:::o;31563:508::-;31980:4;32026:17;32058:7;31563:508;:::o;26360:122::-;26432:42;26360:122;:::o;49582:2204::-;49740:7;49749:12;49911:21;;;:46;;-1:-1:-1;49936:21:0;;49911:46;49889:124;;;;-1:-1:-1;;;49889:124:0;;;;;;;;;50024:25;;:::i;:::-;50081:20;:18;:20::i;:::-;50062:39;;50118:20;;50114:441;;50155:18;;;:37;;;50264:16;;50228:102;;50176:16;50228:17;:102::i;:::-;50207:18;;;:123;50114:441;;;50384:107;50425:16;50460:3;:16;;;50384:22;:107::i;:::-;50363:18;;;:128;50506:18;;;:37;;;50114:441;50567:10;;50619:18;;;;50567:71;;-1:-1:-1;;;50567:71:0;;-1:-1:-1;;;;;50567:10:0;;;;:24;;:71;;50600:4;;50607:10;;50567:71;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50567:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50567:71:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50567:71:0;;;;;;;;;;50681:16;:14;:16::i;:::-;50659:18;;:38;50651:68;;;;-1:-1:-1;;;50651:68:0;;;;;;;;;50769:18;;;;50753:11;;:35;;;:15;:35;:::i;:::-;50732:18;;;:56;50866:18;;;;;-1:-1:-1;;;;;50822:25:0;;;;;;:13;:25;;;;;;;;:73;;;:29;:73;:::i;:::-;50799:20;;;:96;50969:18;;;;;50930:10;;50954;;50930:35;;-1:-1:-1;;;50930:35:0;;50969:18;;-1:-1:-1;;;;;50930:10:0;;;;:23;;:35;;50954:10;;50930:35;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50930:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50930:35:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50930:35:0;;;;;;;;;:57;;50908:125;;;;-1:-1:-1;;;50908:125:0;;;;;;;;;51046:10;;51072;;;51096:18;;;;51046:69;;-1:-1:-1;;;51046:69:0;;-1:-1:-1;;;;;51046:10:0;;;;:25;;:69;;51072:10;;;;51084;;51096:18;51046:69;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51046:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51046:69:0;;;;51126:32;51139:3;:18;;;51126:12;:32::i;:::-;51185:18;;;;51171:11;:32;51242:20;;;;-1:-1:-1;;;;;51214:25:0;;;;;;:13;:25;;;;;:48;51275:28;;:::i;:::-;51306:345;;;;;;;;-1:-1:-1;;;;;51306:345:0;;;;;51363:10;;;51306:345;;;;;;;;51396:4;51306:345;;;;51416:18;;;51306:345;;;;51449:18;;;;51306:345;;;;;;;51482:20;:18;:20::i;:::-;51306:345;;;;51517:15;:13;:15::i;:::-;51306:345;;;;51547:36;51565:4;51572:10;51547:9;:36::i;:::-;51306:345;;51608:10;;51628;;51306:345;;;;;51598:42;;-1:-1:-1;;;;;51608:10:0;;;;51628;51598:9;:42::i;:::-;51306:345;;;51275:376;;51698:1;-1:-1:-1;;;;;51669:52:0;51678:10;-1:-1:-1;;;;;51669:52:0;-1:-1:-1;;;;;;;;;;;51702:3:0;:18;;;51669:52;;;;;;;;;;;;;;;51742:3;:18;;;51773:3;51762:15;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;51762:15:0;;;51734:44;;;;;;49582:2204;;;;;;:::o;7809:312::-;7929:7;7964:12;7957:5;7949:28;;;;-1:-1:-1;;;7949:28:0;;;;;;;;;;;7988:9;8004:1;8000;:5;;;;;;;7809:312;-1:-1:-1;;;;;7809:312:0:o;32219:43710::-;;;;;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32219:43710:0;;;-1:-1:-1;32219:43710:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;-1:-1:-1;;;;;32219:43710:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;5:130:-1;72:20;;97:33;72:20;97:33;;785:442;;887:3;880:4;872:6;868:17;864:27;854:2;;-1:-1;;895:12;854:2;942:6;929:20;57224:18;;57216:6;57213:30;57210:2;;;-1:-1;;57246:12;57210:2;56879;56873:9;57319;57300:17;;-1:-1;;57296:33;56905:17;;57387:4;56905:17;56965:34;;;57001:22;;;56962:62;56959:2;;;-1:-1;;57027:12;56959:2;56879;57046:22;1035:21;;;955:74;-1:-1;955:74;1135:16;;;57387:4;1135:16;1132:25;-1:-1;1129:2;;;1170:1;;1160:12;1129:2;60052:6;57387:4;1077:6;1073:17;57387:4;1111:5;1107:16;60029:30;60108:1;57387:4;60099:6;1111:5;60090:16;;60083:27;;;;847:380;;;;;1513:126;1578:20;;58944:4;58933:16;;61397:33;;61387:2;;61444:1;;61434:12;1646:241;;1750:2;1738:9;1729:7;1725:23;1721:32;1718:2;;;-1:-1;;1756:12;1718:2;85:6;72:20;97:33;124:5;97:33;;1894:382;;;2023:2;2011:9;2002:7;1998:23;1994:32;1991:2;;;-1:-1;;2029:12;1991:2;230:6;217:20;242:41;277:5;242:41;;;2081:71;2189:2;2228:22;;;;1302:20;;-1:-1;;;1985:291;2283:507;;;;2429:2;2417:9;2408:7;2404:23;2400:32;2397:2;;;-1:-1;;2435:12;2397:2;230:6;217:20;242:41;277:5;242:41;;;2487:71;2595:2;2634:22;;1302:20;;-1:-1;2703:2;2742:22;;;1302:20;;2391:399;-1:-1;;;2391:399;2797:366;;;2918:2;2906:9;2897:7;2893:23;2889:32;2886:2;;;-1:-1;;2924:12;2886:2;85:6;72:20;97:33;124:5;97:33;;;2976:63;-1:-1;3076:2;3115:22;;72:20;97:33;72:20;97:33;;;3084:63;;;;2880:283;;;;;;3170:491;;;;3308:2;3296:9;3287:7;3283:23;3279:32;3276:2;;;-1:-1;;3314:12;3276:2;85:6;72:20;97:33;124:5;97:33;;;3366:63;-1:-1;3466:2;3505:22;;72:20;97:33;72:20;97:33;;;3270:391;;3474:63;;-1:-1;;;3574:2;3613:22;;;;1302:20;;3270:391;3668:647;;;;;3838:3;3826:9;3817:7;3813:23;3809:33;3806:2;;;-1:-1;;3845:12;3806:2;85:6;72:20;97:33;124:5;97:33;;;3897:63;-1:-1;3997:2;4036:22;;72:20;97:33;72:20;97:33;;;4005:63;-1:-1;4105:2;4144:22;;1302:20;;-1:-1;4213:2;4267:22;;512:20;537:48;512:20;537:48;;;3800:515;;;;-1:-1;3800:515;;-1:-1;;3800:515;4322:366;;;4443:2;4431:9;4422:7;4418:23;4414:32;4411:2;;;-1:-1;;4449:12;4695:257;;4807:2;4795:9;4786:7;4782:23;4778:32;4775:2;;;-1:-1;;4813:12;4775:2;376:6;370:13;60851:5;58404:13;58397:21;60829:5;60826:32;60816:2;;-1:-1;;60862:12;5257:241;;5361:2;5349:9;5340:7;5336:23;5332:32;5329:2;;;-1:-1;;5367:12;5329:2;-1:-1;1302:20;;5323:175;-1:-1;5323:175;5505:263;;5620:2;5608:9;5599:7;5595:23;5591:32;5588:2;;;-1:-1;;5626:12;5588:2;-1:-1;1450:13;;5582:186;-1:-1;5582:186;5775:1455;;;;;;;;;;6033:3;6021:9;6012:7;6008:23;6004:33;6001:2;;;-1:-1;;6040:12;6001:2;1315:6;1302:20;6092:63;;6192:2;6235:9;6231:22;72:20;97:33;124:5;97:33;;;6200:63;-1:-1;6300:2;6339:22;;72:20;97:33;72:20;97:33;;;6308:63;-1:-1;6426:53;6471:7;6408:2;6447:22;;6426:53;;;6416:63;;6535:53;6580:7;6516:3;6560:9;6556:22;6535:53;;;6525:63;;6625:3;6669:9;6665:22;1302:20;6634:63;;6762:3;6751:9;6747:19;6734:33;6787:18;;6779:6;6776:30;6773:2;;;-1:-1;;6809:12;6773:2;6839:63;6894:7;6885:6;6874:9;6870:22;6839:63;;;6829:73;;6967:3;6956:9;6952:19;6939:33;6925:47;;6787:18;6984:6;6981:30;6978:2;;;-1:-1;;7014:12;6978:2;;7044:63;7099:7;7090:6;7079:9;7075:22;7044:63;;;7034:73;;;7163:51;7206:7;7144:3;7186:9;7182:22;7163:51;;;7153:61;;5995:1235;;;;;;;;;;;;7237:366;;;7358:2;7346:9;7337:7;7333:23;7329:32;7326:2;;;-1:-1;;7364:12;7326:2;-1:-1;;1302:20;;;7516:2;7555:22;;;1302:20;;-1:-1;7320:283;7610:491;;;;7748:2;7736:9;7727:7;7723:23;7719:32;7716:2;;;-1:-1;;7754:12;7716:2;-1:-1;;1302:20;;;7906:2;7945:22;;1302:20;;-1:-1;8014:2;8053:22;;;1302:20;;7710:391;-1:-1;7710:391;8257:137;-1:-1;;;;;58728:54;8344:45;;8338:56;8742:343;;8884:5;57496:12;57906:6;57901:3;57894:19;-1:-1;60197:101;60211:6;60208:1;60205:13;60197:101;;;57943:4;60278:11;;;;;60272:18;60259:11;;;;;60252:39;60226:10;60197:101;;;60313:6;60310:1;60307:13;60304:2;;;-1:-1;57943:4;60369:6;57938:3;60360:16;;60353:27;60304:2;-1:-1;57319:9;60469:14;-1:-1;;60465:28;9041:39;;;;57943:4;9041:39;;8832:253;-1:-1;;8832:253;17761:1685;57224:18;;58739:42;;;;18002:16;17996:23;58728:54;8351:3;8344:45;58739:42;18176:4;18169:5;18165:16;18159:23;58728:54;18176:4;18240:3;18236:14;8344:45;58739:42;18346:4;18339:5;18335:16;18329:23;58728:54;18346:4;18410:3;18406:14;8344:45;;18511:4;18504:5;18500:16;18494:23;18511:4;18575:3;18571:14;32326:37;18677:4;18670:5;18666:16;18660:23;18677:4;18741:3;18737:14;32326:37;18845:4;18838:5;18834:16;18828:23;18845:4;18909:3;18905:14;32326:37;19013:4;19006:5;19002:16;18996:23;19013:4;19077:3;19073:14;32326:37;19175:4;19168:5;19164:16;19158:23;19175:4;19239:3;19235:14;32326:37;19346:6;;19339:5;19335:18;19329:25;19346:6;19412:3;19408:16;32326:37;;17893:1553;;;32609:213;-1:-1;;;;;58728:54;;;;8344:45;;32727:2;32712:18;;32698:124;33065:563;-1:-1;;;;;58728:54;;;8187:58;;58728:54;;;33448:2;33433:18;;8344:45;58728:54;;33531:2;33516:18;;8344:45;33614:2;33599:18;;32326:37;;;;33275:3;33260:19;;33246:382;33635:324;-1:-1;;;;;58728:54;;;8344:45;;58728:54;;33945:2;33930:18;;8344:45;33781:2;33766:18;;33752:207;33966:467;-1:-1;;;;;58728:54;;;8344:45;;58728:54;;;;34336:2;34321:18;;8344:45;34419:2;34404:18;;32326:37;;;;34156:2;34141:18;;34127:306;34898:659;-1:-1;;;;;58728:54;;;8344:45;;58728:54;;;35293:2;35278:18;;8344:45;58728:54;;;35376:2;35361:18;;8344:45;58728:54;;;35459:2;35444:18;;8344:45;35542:3;35527:19;;32326:37;;;;35128:3;35113:19;;35099:458;36560:324;-1:-1;;;;;58728:54;;;;8344:45;;36870:2;36855:18;;32326:37;36706:2;36691:18;;36677:207;36891:1219;-1:-1;;;;;58728:54;;;8344:45;;37426:2;37411:18;;32326:37;;;;37509:2;37494:18;;32326:37;;;;37592:2;37577:18;;32326:37;;;;37675:3;37660:19;;32326:37;;;;58728:54;;58739:42;37744:19;;8344:45;37843:3;37828:19;;32326:37;;;;37927:3;37912:19;;32326:37;;;;38011:3;37996:19;;32326:37;;;;38095:3;38080:19;;32326:37;;;;37261:3;37246:19;;37232:878;38117:201;58404:13;;58397:21;8696:34;;38229:2;38214:18;;38200:118;38325:396;;8723:5;58404:13;58397:21;8703:3;8696:34;38483:2;38595;38584:9;38580:18;38573:48;38635:76;38483:2;38472:9;38468:18;38697:6;38635:76;;38728:297;;38864:2;38885:17;38878:47;38939:76;38864:2;38853:9;38849:18;39001:6;38939:76;;40176:407;40367:2;40381:47;;;10379:2;40352:18;;;57894:19;10415:30;57934:14;;;10395:51;10465:12;;;40338:245;40590:407;40781:2;40795:47;;;10716:2;40766:18;;;57894:19;10752:29;57934:14;;;10732:50;10801:12;;;40752:245;41004:407;41195:2;41209:47;;;11052:2;41180:18;;;57894:19;-1:-1;;;57934:14;;;11068:40;11127:12;;;41166:245;41418:407;41609:2;41623:47;;;11378:2;41594:18;;;57894:19;-1:-1;;;57934:14;;;11394:43;11456:12;;;41580:245;41832:407;42023:2;42037:47;;;11707:2;42008:18;;;57894:19;-1:-1;;;57934:14;;;11723:40;11782:12;;;41994:245;42246:407;42437:2;42451:47;;;12033:2;42422:18;;;57894:19;-1:-1;;;57934:14;;;12049:44;12112:12;;;42408:245;42660:407;42851:2;42865:47;;;12363:2;42836:18;;;57894:19;-1:-1;;;57934:14;;;12379:37;12435:12;;;42822:245;43074:407;43265:2;43279:47;;;12686:2;43250:18;;;57894:19;-1:-1;;;57934:14;;;12702:40;12761:12;;;43236:245;43488:407;43679:2;43693:47;;;13012:2;43664:18;;;57894:19;-1:-1;;;57934:14;;;13028:42;13089:12;;;43650:245;43902:407;44093:2;44107:47;;;13340:2;44078:18;;;57894:19;-1:-1;;;57934:14;;;13356:41;13416:12;;;44064:245;44316:407;44507:2;44521:47;;;13667:2;44492:18;;;57894:19;13703:34;57934:14;;;13683:55;-1:-1;;;13758:12;;;13751:25;13795:12;;;44478:245;44730:407;44921:2;44935:47;;;14046:2;44906:18;;;57894:19;-1:-1;;;57934:14;;;14062:33;14114:12;;;44892:245;45144:407;45335:2;45349:47;;;14365:2;45320:18;;;57894:19;-1:-1;;;57934:14;;;14381:43;14443:12;;;45306:245;45558:407;45749:2;45763:47;;;14694:2;45734:18;;;57894:19;14730:34;57934:14;;;14710:55;-1:-1;;;14785:12;;;14778:38;14835:12;;;45720:245;45972:534;;-1:-1;;;15005:3;14998:27;46199:2;46380;46369:9;46365:18;46358:48;46420:76;46199:2;46188:9;46184:18;46482:6;46420:76;;46513:407;46704:2;46718:47;;;15264:2;46689:18;;;57894:19;-1:-1;;;57934:14;;;15280:36;15335:12;;;46675:245;46927:534;;-1:-1;;;15505:3;15498:29;47154:2;47335;47324:9;47320:18;47313:48;47375:76;47154:2;47143:9;47139:18;47437:6;47375:76;;47468:407;47659:2;47673:47;;;15766:2;47644:18;;;57894:19;-1:-1;;;57934:14;;;15782:36;15837:12;;;47630:245;47882:407;48073:2;48087:47;;;16088:2;48058:18;;;57894:19;16124:31;57934:14;;;16104:52;16175:12;;;48044:245;48296:407;48487:2;48501:47;;;16426:2;48472:18;;;57894:19;16462:25;57934:14;;;16442:46;16507:12;;;48458:245;48710:407;48901:2;48915:47;;;16758:2;48886:18;;;57894:19;16794:25;57934:14;;;16774:46;16839:12;;;48872:245;49124:407;49315:2;49329:47;;;17090:2;49300:18;;;57894:19;-1:-1;;;57934:14;;;17106:40;17165:12;;;49286:245;49538:534;;-1:-1;;;17335:3;17328:23;49765:2;49946;49935:9;49931:18;49924:48;49986:76;49765:2;49754:9;49750:18;50048:6;49986:76;;50079:407;50270:2;50284:47;;;17590:2;50255:18;;;57894:19;-1:-1;;;57934:14;;;17606:41;17666:12;;;50241:245;50493:346;50677:3;50662:19;;50692:137;50666:9;50802:6;50692:137;;50846:362;;51038:3;51027:9;51023:19;51015:27;;19802:63;19850:14;19779:16;19773:23;19802:63;;;19953:4;19946:5;19942:16;19936:23;19965:63;19953:4;20017:3;20013:14;19999:12;19965:63;;;;20123:4;20116:5;20112:16;20106:23;20135:63;20123:4;20187:3;20183:14;20169:12;20135:63;;;;20289:4;20282:5;20278:16;20272:23;20289:4;20353:3;20349:14;32326:37;20457:4;20450:5;20446:16;20440:23;20457:4;20521:3;20517:14;32326:37;20623:4;20616:5;20612:16;20606:23;20623:4;20687:3;20683:14;32326:37;20791:4;20784:5;20780:16;20774:23;20791:4;20855:3;20851:14;32326:37;20959:4;20952:5;20948:16;20942:23;20959:4;21023:3;21019:14;32326:37;21124:6;;21117:5;21113:18;21107:25;21124:6;21190:3;21186:16;32326:37;;21290:6;;21283:5;21279:18;21273:25;21290:6;21356:3;21352:16;32326:37;;21465:6;;21458:5;21454:18;21448:25;21465:6;21531:3;21527:16;32326:37;;51009:199;;;;;51572:382;;51774:3;51763:9;51759:19;51751:27;;23714:63;23762:14;23691:16;23685:23;23714:63;;;23865:4;23858:5;23854:16;23848:23;23877:63;23865:4;23929:3;23925:14;23911:12;23877:63;;;;24035:4;24028:5;24024:16;24018:23;24047:63;24035:4;24099:3;24095:14;24081:12;24047:63;;;;24201:4;24194:5;24190:16;24184:23;24201:4;24265:3;24261:14;32326:37;24367:4;24360:5;24356:16;24350:23;24367:4;24431:3;24427:14;32326:37;24531:4;24524:5;24520:16;24514:23;24543:63;24531:4;24595:3;24591:14;24577:12;24543:63;;;;24701:4;24694:5;24690:16;24684:23;24701:4;24765:3;24761:14;32326:37;24882:4;24875:5;24871:16;24865:23;24894:63;24882:4;24946:3;24942:14;24928:12;24894:63;;;-1:-1;25046:6;25035:18;;;25029:25;25108:16;;;32326:37;25214:6;25203:18;;;25197:25;25276:16;;;32326:37;25386:6;25375:18;;;25369:25;25448:16;;;32326:37;25558:6;25547:18;;;25541:25;25620:16;;;32326:37;25727:6;25716:18;;;25710:25;25789:16;;;32326:37;25902:6;25891:18;;;25885:25;25964:16;;;;32326:37;;;;51745:209;;52310:378;28100:23;;-1:-1;;;;;58728:54;8344:45;;28281:4;28270:16;;;28264:23;28341:14;;;32326:37;28449:4;28438:16;;;28432:23;28509:14;;;32326:37;28617:4;28606:16;;;28600:23;28677:14;;;32326:37;28788:4;28777:16;;;28771:23;28848:14;;;32326:37;;;;52510:3;52495:19;;52481:207;52695:354;;52883:3;52872:9;52868:19;52860:27;;57224:18;;58739:42;;;;29209:16;29203:23;58728:54;8351:3;8344:45;58739:42;29383:4;29376:5;29372:16;29366:23;58728:54;29383:4;29447:3;29443:14;8344:45;58739:42;29553:4;29546:5;29542:16;29536:23;58728:54;29553:4;29617:3;29613:14;8344:45;29721:4;29714:5;29710:16;29704:23;29721:4;29785:3;29781:14;32326:37;29886:4;29879:5;29875:16;29869:23;29886:4;29950:3;29946:14;32326:37;58739:42;30049:4;30042:5;30038:16;30032:23;58728:54;30049:4;30113:3;30109:14;8344:45;;30212:4;30205:5;30201:16;30195:23;30212:4;30276:3;30272:14;32326:37;30383:4;30376:5;30372:16;30366:23;30383:4;30447:3;30443:14;32326:37;52854:195;;;;;53417:213;32326:37;;;53535:2;53520:18;;53506:124;53637:408;;32356:5;32333:3;32326:37;53801:2;53919;53908:9;53904:18;53897:48;53959:76;53801:2;53790:9;53786:18;54021:6;53959:76;;54052:324;32326:37;;;54362:2;54347:18;;32326:37;54198:2;54183:18;;54169:207;54383:435;32326:37;;;54721:2;54706:18;;32326:37;;;;54804:2;54789:18;;32326:37;54557:2;54542:18;;54528:290;54825:547;32326:37;;;55192:2;55177:18;;32326:37;;;;55275:2;55260:18;;32326:37;55358:2;55343:18;;32326:37;55027:3;55012:19;;54998:374;55379:1219;32326:37;;;55914:2;55899:18;;32326:37;;;;55997:2;55982:18;;32326:37;;;;56080:2;56065:18;;32326:37;;;;56163:3;56148:19;;32326:37;;;;56247:3;56232:19;;32326:37;56331:3;56316:19;;32326:37;56415:3;56400:19;;32326:37;56499:3;56484:19;;32326:37;56583:3;56568:19;;32326:37;55749:3;55734:19;;55720:878;56605:205;58944:4;58933:16;;;;32562:35;;56719:2;56704:18;;56690:120;60506:117;-1:-1;;;;;58728:54;;60565:35;;60555:2;;60614:1;;60604:12;60555:2;60549:74;

Swarm Source

ipfs://c66381ca7253dddb0f78654edcd2c95941524b173e5fe168e67bab897644a633
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading