ETH Price: $2,668.27 (+0.54%)
Gas: 19 Gwei

Token

Bas4r.finance (Bas4r)
 

Overview

Max Total Supply

125,000 Bas4r

Holders

222

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.18460077 Bas4r

Value
$0.00
0x3902e68f7bc7cd443f159ca23f651cc4be018a96
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Bas4rFinance

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-12-17
*/

pragma solidity >=0.6.0 <0.8.0;
// SPDX-License-Identifier: MIT

/**
 * @dev Wrappers over Solidity's uintXX casting operators with added overflow
 * checks.
 *
 * Downcasting from uint256 in Solidity does not revert on overflow. This can
 * easily result in undesired exploitation or bugs, since developers usually
 * assume that overflows raise errors. `SafeCast` restores this intuition by
 * reverting the transaction when such 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.
 *
 * Can be combined with {SafeMath} to extend it to smaller types, by performing
 * all math on `uint256` and then downcasting.
 */
library SafeCast {

    /**
     * @dev Returns the downcasted uint128 from uint256, reverting on
     * overflow (when the input is greater than largest uint128).
     *
     * Counterpart to Solidity's `uint128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     */
    function toUint128(uint256 value) internal pure returns (uint128) {
        require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits");
        return uint128(value);
    }

    /**
     * @dev Returns the downcasted uint64 from uint256, reverting on
     * overflow (when the input is greater than largest uint64).
     *
     * Counterpart to Solidity's `uint64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     */
    function toUint64(uint256 value) internal pure returns (uint64) {
        require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits");
        return uint64(value);
    }

    /**
     * @dev Returns the downcasted uint32 from uint256, reverting on
     * overflow (when the input is greater than largest uint32).
     *
     * Counterpart to Solidity's `uint32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     */
    function toUint32(uint256 value) internal pure returns (uint32) {
        require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits");
        return uint32(value);
    }

    /**
     * @dev Returns the downcasted uint16 from uint256, reverting on
     * overflow (when the input is greater than largest uint16).
     *
     * Counterpart to Solidity's `uint16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     */
    function toUint16(uint256 value) internal pure returns (uint16) {
        require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits");
        return uint16(value);
    }

    /**
     * @dev Returns the downcasted uint8 from uint256, reverting on
     * overflow (when the input is greater than largest uint8).
     *
     * Counterpart to Solidity's `uint8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     */
    function toUint8(uint256 value) internal pure returns (uint8) {
        require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits");
        return uint8(value);
    }

    /**
     * @dev Converts a signed int256 into an unsigned uint256.
     *
     * Requirements:
     *
     * - input must be greater than or equal to 0.
     */
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    /**
     * @dev Converts an unsigned uint256 into a signed int256.
     *
     * Requirements:
     *
     * - input must be less than or equal to maxInt256.
     */
    function toInt256(uint256 value) internal pure returns (int256) {
        require(value < 2**255, "SafeCast: value doesn't fit in an int256");
        return int256(value);
    }
}

// File: @openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol
/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol
/**
 * @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.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol
/**
 * @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;
    }
}

// File: @openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol
/**
 * @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 on 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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        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);
            }
        }
    }
}

// File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20.sol
/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
abstract contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public virtual view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public virtual view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

// File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20Burnable.sol
/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    using SafeMath for uint256;

    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");

        _approve(account, _msgSender(), decreasedAllowance);
        _burn(account, amount);
    }
}

abstract contract ERC20TransferLiquidityLock is ERC20 {
    using SafeMath for uint256;

    event Rebalance(uint256 tokenBurnt);
    event RewardLiquidityProviders(uint256 liquidityRewards);
    
    address public uniswapV2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address public uniswapV2Pair;
    address payable public treasury;
    mapping(address => bool) feelessAddr;
    mapping(address => bool) unlocked;
    
    // the amount of tokens to lock for liquidity during every transfer, i.e. 100 = 1%, 50 = 2%, 40 = 2.5%, 25 = 4%, 20 = 5%, 14 = 7%
    uint256 public liquidityLockDivisor;
    uint256 public callerRewardDivisor;
    uint256 public rebalanceDivisor;
    
    uint256 public minRebalanceAmount;
    uint256 public lastRebalance;
    uint256 public rebalanceInterval;
    
    uint256 public lpUnlocked;
    bool public locked;
    
    Balancer balancer;
    
    constructor() {
        lastRebalance = block.timestamp;
        liquidityLockDivisor = 50;
        callerRewardDivisor = 20;
        rebalanceDivisor = 100;
        rebalanceInterval = 3 hours;
        lpUnlocked = block.timestamp + 30 days;
        minRebalanceAmount = 1;
        treasury = msg.sender;
        balancer = new Balancer(treasury);
        feelessAddr[address(this)] = true;
        feelessAddr[address(balancer)] = true;
        feelessAddr[msg.sender] = true;
        locked = true;
        unlocked[msg.sender] = true;
        unlocked[address(balancer)] = true;
    }

    // receive eth from uniswap swap
    fallback() external payable {}
    receive() external payable {}

    function rebalanceLiquidity() public {
        require(balanceOf(msg.sender) >= minRebalanceAmount, "You are not allowed to rebalance!");
        require(block.timestamp > lastRebalance + rebalanceInterval, 'Too Soon.');
        lastRebalance = block.timestamp;
        // lockable supply is the token balance of this contract
        uint256 _lockableSupply = balanceOf(address(this));
        _rewardLiquidityProviders(_lockableSupply);
        
        uint256 amountToRemove = ERC20(uniswapV2Pair).balanceOf(address(this)).div(rebalanceDivisor);
        // needed in case contract already owns eth
        
        remLiquidity(amountToRemove);
        uint _locked = balancer.rebalance(callerRewardDivisor);

        emit Rebalance(_locked);
    }

    function _rewardLiquidityProviders(uint256 liquidityRewards) private {
        _transfer(address(this), uniswapV2Pair, liquidityRewards);
        IUniswapV2Pair(uniswapV2Pair).sync();
        emit RewardLiquidityProviders(liquidityRewards);
    }

    function remLiquidity(uint256 lpAmount) private returns(uint ETHAmount) {
        ERC20(uniswapV2Pair).approve(uniswapV2Router, lpAmount);
        (ETHAmount) = IUniswapV2Router02(uniswapV2Router)
            .removeLiquidityETHSupportingFeeOnTransferTokens(
                address(this),
                lpAmount,
                0,
                0,
                address(balancer),
                block.timestamp
            );
    }

    // returns token amount
    function lockableSupply() external view returns (uint256) {
        return balanceOf(address(this));
    }

    // returns token amount
    function lockedSupply() external view returns (uint256) {
        uint256 lpTotalSupply = ERC20(uniswapV2Pair).totalSupply();
        uint256 lpBalance = lockedLiquidity();
        uint256 percentOfLpTotalSupply = lpBalance.mul(1e12).div(lpTotalSupply);

        uint256 uniswapBalance = balanceOf(uniswapV2Pair);
        uint256 _lockedSupply = uniswapBalance.mul(percentOfLpTotalSupply).div(1e12);
        return _lockedSupply;
    }

    // returns token amount
    function burnedSupply() external view returns (uint256) {
        uint256 lpTotalSupply = ERC20(uniswapV2Pair).totalSupply();
        uint256 lpBalance = burnedLiquidity();
        uint256 percentOfLpTotalSupply = lpBalance.mul(1e12).div(lpTotalSupply);

        uint256 uniswapBalance = balanceOf(uniswapV2Pair);
        uint256 _burnedSupply = uniswapBalance.mul(percentOfLpTotalSupply).div(1e12);
        return _burnedSupply;
    }

    // returns LP amount, not token amount
    function burnableLiquidity() public view returns (uint256) {
        return ERC20(uniswapV2Pair).balanceOf(address(this));
    }

    // returns LP amount, not token amount
    function burnedLiquidity() public view returns (uint256) {
        return ERC20(uniswapV2Pair).balanceOf(address(0));
    }

    // returns LP amount, not token amount
    function lockedLiquidity() public view returns (uint256) {
        return burnableLiquidity().add(burnedLiquidity());
    }
}

contract Balancer {
    using SafeMath for uint256;    
    Bas4rFinance token;
    address public burnAddr = 0x000000000000000000000000000000000000dEaD;
    address payable public treasury;
    
    constructor(address payable treasury_) {
        token = Bas4rFinance(msg.sender);
        treasury = treasury_;
    }
    fallback() external payable {}
    receive() external payable {}
    function rebalance(uint callerRewardDivisor) external returns (uint256) { 
        require(msg.sender == address(token), "only token");
        swapEthForTokens(address(this).balance, callerRewardDivisor);
        uint256 lockableBalance = token.balanceOf(address(this));
        uint256 callerReward = lockableBalance.div(callerRewardDivisor);
        token.transfer(tx.origin, callerReward);
        token.transfer(burnAddr, lockableBalance.sub(callerReward));        
        return lockableBalance.sub(callerReward);
    }

    function swapEthForTokens(uint256 EthAmount, uint callerRewardDivisor) private {
        address[] memory uniswapPairPath = new address[](2);
        uniswapPairPath[0] = IUniswapV2Router02(token.uniswapV2Router()).WETH();
        uniswapPairPath[1] = address(token);
        uint256 treasuryAmount = EthAmount.div(callerRewardDivisor);
        treasury.transfer(treasuryAmount);
        
        token.approve(token.uniswapV2Router(), EthAmount);
        
        IUniswapV2Router02(token.uniswapV2Router())
            .swapExactETHForTokensSupportingFeeOnTransferTokens{value: (EthAmount.sub(treasuryAmount))}(
                0,
                uniswapPairPath,
                address(this),
                block.timestamp
            );
    }    
}

interface IUniswapV2Router02 {
    function WETH() external pure returns (address);
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
      uint amountOutMin,
      address[] calldata path,
      address to,
      uint deadline
    ) external payable;
    function removeLiquidityETH(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityETHSupportingFeeOnTransferTokens(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
    ) external returns (uint amountETH);    
}

interface IUniswapV2Pair {
    function sync() external;
}

contract Bas4rFinance is ERC20, ERC20Burnable, ERC20TransferLiquidityLock, Ownable {
    
    using SafeCast for int256;
    using SafeMath for uint256;
    using Address for address;
    
    struct Transaction {
        bool enabled;
        address destination;
        bytes data;
    }

    event TransactionFailed(address indexed destination, uint index, bytes data);
	
	// Stable ordering is not guaranteed.

    Transaction[] public transactions;

    uint256 private _epoch;
    event LogRebase(uint256 indexed epoch, uint256 totalSupply);

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcluded;
    address[] private _excluded;
	
	uint256 private _totalSupply;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 private _rTotal;
    uint256 private _tFeeTotal;
    
    uint256 private constant DECIMALS = 9;
    uint256 private constant RATE_PRECISION = 10 ** DECIMALS;
    
    uint256 public _tFeePercent;
    uint256 public _tFeeTimestamp;
    
    address public _rebaser;
    
    uint256 public _limitExpiresTimestamp;
    uint256 public _limitTransferAmount;
    uint256 public _limitMaxBalance;
    uint256 public _limitSellFeePercent;
    
    uint256 public _limitTimestamp;
    
    constructor() ERC20("Bas4r.finance", "Bas4r"){
        _setupDecimals(uint8(DECIMALS));
        
        _totalSupply = 500000000000000;
        _rTotal = (MAX - (MAX % _totalSupply));
        
        _rebaser = _msgSender();
        
        _tFeePercent = 200; //2.00%
        _tFeeTimestamp = block.timestamp;

        _rOwned[_msgSender()] = _rTotal;
        emit Transfer(address(0), _msgSender(), _totalSupply);
        
        excludeAccount(_msgSender());
    }
    
    function setRebaser(address rebaser) external onlyOwner() {
        _rebaser = rebaser;
    }
    
    function setTransferFeePercent(uint256 tFeePercent) external onlyOwner() {
        require(block.timestamp >= (_tFeeTimestamp + 12 hours), "Transfer fee changes timelocked for 12 hours");

        _tFeePercent = tFeePercent;
        
        _tFeeTimestamp = block.timestamp;
    }
    
    function setLimit(uint256 expiresTimestamp, uint256 transferAmount, uint256 maxBalance, uint256 sellFeePercent) external onlyOwner() {
        require(_limitTimestamp == 0, "Limit changes not allowed");
        
        _limitExpiresTimestamp = expiresTimestamp;
        _limitTransferAmount = transferAmount;
        _limitMaxBalance = maxBalance;
        _limitSellFeePercent = sellFeePercent;

        _limitTimestamp = block.timestamp;
    }
    
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }
    
    function rebase(int256 supplyDelta)
        external
        returns (uint256)
    {
        require(_msgSender() == owner() || _msgSender() == _rebaser, "Sender not authorized");
        
        _epoch = _epoch.add(1);
		
        if (supplyDelta == 0) {
            emit LogRebase(_epoch, _totalSupply);
            return _totalSupply;
        }
        
        uint256 uSupplyDelta = (supplyDelta < 0 ? -supplyDelta : supplyDelta).toUint256();
        uint256 rate = uSupplyDelta.mul(RATE_PRECISION).div(_totalSupply);
        uint256 multiplier;
        
        if (supplyDelta < 0) {
            multiplier = RATE_PRECISION.sub(rate);
        } else {
            multiplier = RATE_PRECISION.add(rate);
        }
        
        if (supplyDelta < 0) {
            _totalSupply = _totalSupply.sub(uSupplyDelta);
        } else {
            _totalSupply = _totalSupply.add(uSupplyDelta);
        }
        
        if (_totalSupply > MAX) {
            _totalSupply = MAX;
        }
        
        for (uint256 i = 0; i < _excluded.length; i++) {
            if(_tOwned[_excluded[i]] > 0) {
                _tOwned[_excluded[i]] = _tOwned[_excluded[i]].mul(multiplier).div(RATE_PRECISION);
            }
        }
        
        emit LogRebase(_epoch, _totalSupply);

		for (uint i = 0; i < transactions.length; i++) {
            Transaction storage t = transactions[i];
            if (t.enabled) {
                bool result = externalCall(t.destination, t.data);
                if (!result) {
                    emit TransactionFailed(t.destination, i, t.data);
                    revert("Transaction Failed");
                }
            }
        }

        return _totalSupply;
    }
    
    /**
     * @notice Adds a transaction that gets called for a downstream receiver of rebases
     * @param destination Address of contract destination
     * @param data Transaction data payload
     */
	
    function addTransaction(address destination, bytes memory data)
        external
        onlyOwner
    {
        transactions.push(Transaction({
            enabled: true,
            destination: destination,
            data: data
        }));
    }
	
	/**
     * @param index Index of transaction to remove.
     *              Transaction ordering may have changed since adding.
     */

    function removeTransaction(uint index)
        external
        onlyOwner
    {
        require(index < transactions.length, "index out of bounds");

        if (index < transactions.length - 1) {
            transactions[index] = transactions[transactions.length - 1];
        }

        transactions.pop();
    }
	
	/**
     * @param index Index of transaction. Transaction ordering may have changed since adding.
     * @param enabled True for enabled, false for disabled.
     */

    function setTransactionEnabled(uint index, bool enabled)
        external
        onlyOwner
    {
        require(index < transactions.length, "index must be in range of stored tx list");
        transactions[index].enabled = enabled;
    }
	
	/**
     * @return Number of transactions, both enabled and disabled, in transactions list.
     */

    function transactionsSize()
        external
        view
        returns (uint256)
    {
        return transactions.length;
    }
	
	/**
     * @dev wrapper to call the encoded transactions on downstream consumers.
     * @param destination Address of destination contract.
     * @param data The encoded data payload.
     * @return True on success
     */

    function externalCall(address destination, bytes memory data)
        internal
        returns (bool)
    {
        bool result;
        assembly {  // solhint-disable-line no-inline-assembly
            // "Allocate" memory for output
            // (0x40 is where "free memory" pointer is stored by convention)
            let outputAddress := mload(0x40)

            // First 32 bytes are the padded length of data, so exclude that
            let dataAddress := add(data, 32)

            result := call(
                // 34710 is the value that solidity is currently emitting
                // It includes callGas (700) + callVeryLow (3, to pay for SUB)
                // + callValueTransferGas (9000) + callNewAccountGas
                // (25000, in case the destination address does not exist and needs creating)
                sub(gas(), 34710),


                destination,
                0, // transfer value in wei
                dataAddress,
                mload(data),  // Size of the input, in bytes. Stored in position 0 of the array.
                outputAddress,
                0  // Output is ignored, therefore the output size is zero
            )
        }
        return result;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromRefraction(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual override returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual override returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function isExcluded(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function refract(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,) = _getValues(tAmount, _tFeePercent);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function refractionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _totalSupply, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,) = _getValues(tAmount, _tFeePercent);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,) = _getValues(tAmount, _tFeePercent);
            return rTransferAmount;
        }
    }

    function tokenFromRefraction(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total refractions");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeAccount(address account) public onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromRefraction(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeAccount(address account) public onlyOwner() {
        require(_isExcluded[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _approve(address owner, address spender, uint256 amount) internal override {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address sender, address recipient, uint256 amount) internal override {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        
        if(locked && unlocked[sender] != true && unlocked[recipient] != true)
            revert("Locked until end of presale");
            
        if (liquidityLockDivisor != 0 && feelessAddr[sender] == false && feelessAddr[recipient] == false) {
            uint256 liquidityLockAmount = amount.div(liquidityLockDivisor);
            _transfer(sender, address(this), liquidityLockAmount);
            amount = amount.sub(liquidityLockAmount);
        }
        
        if(_isExcluded[sender] && !_isExcluded[recipient]) {
            
            if(_limitExpiresTimestamp >= block.timestamp) {
                require(amount <= _limitTransferAmount, "Initial Uniswap listing - amount exceeds transfer limit");
                require(balanceOf(recipient).add(amount) <= _limitMaxBalance, "Initial Uniswap listing - max balance limit");
            }
            
            _transferFromExcluded(sender, recipient, amount, _tFeePercent);
            
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            
            if(_limitExpiresTimestamp >= block.timestamp) {
                _transferToExcluded(sender, recipient, amount, _limitSellFeePercent);
            } else {
                _transferToExcluded(sender, recipient, amount, _tFeePercent);
            }

        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            require(_limitExpiresTimestamp < block.timestamp, "Initial Uniswap listing - Wallet to Wallet transfers temporarily disabled");
            _transferStandard(sender, recipient, amount, _tFeePercent);
            
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount, 0);
            
        } else {
            require(_limitExpiresTimestamp < block.timestamp, "Initial Uniswap listing - Wallet to Wallet transfers temporarily disabled");
            _transferStandard(sender, recipient, amount, _tFeePercent);
            
        }
    }
    

    function _transferStandard(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);       
        _refractFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);           
        _refractFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);   
        _refractFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
        _refractFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _refractFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount, uint256 tFeePercent) private view returns (uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee) = _getTValues(tAmount, tFeePercent);
        uint256 currentRate =  _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, currentRate);
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee);
    }

    function _getTValues(uint256 tAmount, uint256 tFeePercent) private pure returns (uint256, uint256) {
        uint256 tFee = tAmount.mul(tFeePercent).div(10000);
        uint256 tTransferAmount = tAmount.sub(tFee);
        return (tTransferAmount, tFee);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _totalSupply;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _totalSupply);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_totalSupply)) return (_rTotal, _totalSupply);
        return (rSupply, tSupply);
    }
    
    function setUniswapV2Router(address _uniswapV2Router) public onlyOwner {
        require(uniswapV2Router == address(0), "setUniswapV2Router: already set");
        uniswapV2Router = _uniswapV2Router;
    }

    function setUniswapV2Pair(address _uniswapV2Pair) public onlyOwner {
        require(uniswapV2Pair == address(0), "setUniswapV2Pair: already set");
        uniswapV2Pair = _uniswapV2Pair;
    }

    function setLiquidityLockDivisor(uint256 _liquidityLockDivisor) public onlyOwner {
        if (_liquidityLockDivisor != 0) {
            require(_liquidityLockDivisor >= 10, "setLiquidityLockDivisor: too small");
        }
        liquidityLockDivisor = _liquidityLockDivisor;
    }

    function setRebalanceDivisor(uint256 _rebalanceDivisor) public onlyOwner {
        if (_rebalanceDivisor != 0) {
            require(_rebalanceDivisor >= 10, "setRebalanceDivisor: too small");
        }        
        rebalanceDivisor = _rebalanceDivisor;
    }
    
    function setRebalanceInterval(uint256 _interval) public onlyOwner {
        rebalanceInterval = _interval;
    }
    
    function setCallerRewardDivisior(uint256 _rewardDivisor) public onlyOwner {
        if (_rewardDivisor != 0) {
            require(_rewardDivisor >= 10, "setCallerRewardDivisor: too small");
        }        
        callerRewardDivisor = _rewardDivisor;
    }
    
    function unlockLP() public onlyOwner {
        require(block.timestamp != lpUnlocked, "Not unlocked yet");
        uint256 amount = IERC20(uniswapV2Pair).balanceOf(address(this));
        IERC20(uniswapV2Pair).transfer(msg.sender, amount);
    }
    
    function toggleFeeless(address _addr) public onlyOwner {
        feelessAddr[_addr] = !feelessAddr[_addr];
    }
    
    function toggleUnlockable(address _addr) public onlyOwner {
        unlocked[_addr] = !unlocked[_addr];
    }  
    
    function unlock() public onlyOwner {
        locked = false;
    }    

    function setMinRebalanceAmount(uint256 amount_) public onlyOwner {
        minRebalanceAmount = amount_;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"LogRebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenBurnt","type":"uint256"}],"name":"Rebalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityRewards","type":"uint256"}],"name":"RewardLiquidityProviders","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"destination","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"TransactionFailed","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_limitExpiresTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitMaxBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitSellFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rebaser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tFeeTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"addTransaction","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnableLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callerRewardDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityLockDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpUnlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minRebalanceAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalanceDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalanceInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalanceLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"supplyDelta","type":"int256"}],"name":"rebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"refract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"refractionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardDivisor","type":"uint256"}],"name":"setCallerRewardDivisior","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"expiresTimestamp","type":"uint256"},{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"uint256","name":"maxBalance","type":"uint256"},{"internalType":"uint256","name":"sellFeePercent","type":"uint256"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityLockDivisor","type":"uint256"}],"name":"setLiquidityLockDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setMinRebalanceAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rebalanceDivisor","type":"uint256"}],"name":"setRebalanceDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"setRebalanceInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rebaser","type":"address"}],"name":"setRebaser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setTransactionEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tFeePercent","type":"uint256"}],"name":"setTransferFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniswapV2Pair","type":"address"}],"name":"setUniswapV2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniswapV2Router","type":"address"}],"name":"setUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"toggleFeeless","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"toggleUnlockable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromRefraction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","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":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionsSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260058054610100600160a81b031916747a250d5630b4cf539739df2c5dacb4c659f2488d001790553480156200003957600080fd5b50604080518082018252600d81526c42617334722e66696e616e636560981b6020808301918252835180850190945260058452642130b99a3960d91b9084015281519192916200008c91600391620008ac565b508051620000a2906004906020840190620008ac565b50506005805460ff191660121790555042600e8190556032600a556014600b556064600c55612a30600f5562278d00016010556001600d55600780546001600160a01b0319163317908190556040516001600160a01b039190911690620001099062000941565b6001600160a01b03909116815260405190819003602001906000f08015801562000137573d6000803e3d6000fd5b5060118054610100600160a81b0319166101006001600160a01b039384168102919091178255306000908152600860209081526040808320805460ff1990811660019081179092558654869004881685528285208054821683179055338552828520805482168317905586548116821787556009909352818420805484168217905594549390930490941681529081208054909316909117909155620001dc6200031b565b601280546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200023660096200031f565b6601c6bf52634000601a556507326b47ffff19601b55620002566200031b565b601f80546001600160a01b0319166001600160a01b039290921691909117905560c8601d5542601e55601b5460156000620002906200031b565b6001600160a01b03168152602081019190915260400160002055620002b46200031b565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef601a546040518082815260200191505060405180910390a3620003156200030f6200031b565b62000335565b62000966565b3390565b6005805460ff191660ff92909216919091179055565b6200033f6200031b565b6012546001600160a01b03908116911614620003a2576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811660009081526018602052604090205460ff161562000411576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b6001600160a01b038116600090815260156020526040902054156200046e576001600160a01b0381166000908152601560205260409020546200045490620004d4565b6001600160a01b0382166000908152601660205260409020555b6001600160a01b03166000818152601860205260408120805460ff191660019081179091556019805491820181559091527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950180546001600160a01b0319169091179055565b6000601b54821115620005195760405162461bcd60e51b815260040180806020018281038252602a8152602001806200586a602a913960400191505060405180910390fd5b60006200052562000548565b90506200054181846200057b60201b620030df1790919060201c565b9392505050565b6000808062000556620005c5565b915091506200057481836200057b60201b620030df1790919060201c565b9250505090565b60006200054183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200075e60201b60201c565b601b54601a546000918291825b6019548110156200071b57826015600060198481548110620005f057fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806200065757508160166000601984815481106200063057fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156200067057601b54601a54945094505050506200075a565b620006bf60156000601984815481106200068657fe5b60009182526020808320909101546001600160a01b0316835282810193909352604090910190205485916200312162000805821b17901c565b9250620007106016600060198481548110620006d757fe5b60009182526020808320909101546001600160a01b0316835282810193909352604090910190205484916200312162000805821b17901c565b9150600101620005d2565b506200073a601a54601b546200057b60201b620030df1790919060201c565b8210156200075457601b54601a549350935050506200075a565b90925090505b9091565b60008183620007ee5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620007b257818101518382015260200162000798565b50505050905090810190601f168015620007e05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581620007fb57fe5b0495945050505050565b60006200054183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506200084f60201b60201c565b60008184841115620008a45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315620007b257818101518382015260200162000798565b505050900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620008e457600085556200092f565b82601f10620008ff57805160ff19168380011785556200092f565b828001600101855582156200092f579182015b828111156200092f57825182559160200191906001019062000912565b506200093d9291506200094f565b5090565b6108fd8062004f6d83390190565b5b808211156200093d576000815560010162000950565b6145f780620009766000396000f3fe6080604052600436106103fd5760003560e01c806370709a7c11610213578063a9059cbb11610123578063dc654a73116100ab578063e84354c51161007a578063e84354c514610e6b578063f2cc0c1814610e80578063f2fde38b14610eb3578063f84354f114610ee6578063f953797314610f1957610404565b8063dc654a7314610dd3578063dd62ed3e14610de8578063e161eb5614610e23578063e46adf6214610e3857610404565b8063b91f3f97116100f2578063b91f3f9714610d4c578063ca5c7b9114610d61578063cafab28914610d76578063cba0e99614610d8b578063cf30901214610dbe57610404565b8063a9059cbb14610cbf578063aef7f99e14610cf8578063b439824414610d0d578063b6833c5914610d2257610404565b80638da5cb5b116101a65780639ace38c2116101755780639ace38c214610b6e578063a29a608914610c29578063a457c2d714610c5c578063a69df4b514610c95578063a8a5550e14610caa57610404565b80638da5cb5b14610afd57806391d4ec1814610b1257806395d89b4114610b2757806397d0677b14610b3c57610404565b80637d449789116101e25780637d44978914610a945780637e0d943e14610aa95780637f4aeb1a14610ad3578063858750ab14610ae857610404565b806370709a7c146109e057806370a0823114610a13578063715018a614610a4657806379cc679014610a5b57610404565b80632ae427dc1161030e578063456e0a5d116102a15780635b7dcaed116102705780635b7dcaed146109095780635c1eca841461093357806361d027b31461096f57806367a9fca6146109845780636e9dde99146109ae57610404565b8063456e0a5d146108a057806346c3bd1f146108b557806349bd5a5e146108df57806355d0a1d0146108f457610404565b806338a9ad1d116102dd57806338a9ad1d1461081357806339509351146108285780633aa8d4be1461086157806342966c681461087657610404565b80632ae427dc146107945780632bc1281e146107a9578063303bb0b6146107be578063313ce567146107e857610404565b806313114a9d1161039157806316d1d9161161036057806316d1d916146106e857806318160ddd146106fd5780631f36d9251461071257806323b872dd1461073c5780632898cafa1461077f57610404565b806313114a9d146106455780631419841d1461065a57806314f43f7e1461068d5780631694505e146106b757610404565b8063095ea7b3116103cd578063095ea7b3146104f65780630ab114f914610543578063106b9ca11461056d578063126e19be1461058257610404565b80629a81301461040657806302dd19d91461043057806306fdde031461045757806308d1dd8a146104e157610404565b3661040457005b005b34801561041257600080fd5b506104046004803603602081101561042957600080fd5b5035610f4c565b34801561043c57600080fd5b50610445610fef565b60408051918252519081900360200190f35b34801561046357600080fd5b5061046c610ff5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104a657818101518382015260200161048e565b50505050905090810190601f1680156104d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ed57600080fd5b5061044561108b565b34801561050257600080fd5b5061052f6004803603604081101561051957600080fd5b506001600160a01b038135169060200135611091565b604080519115158252519081900360200190f35b34801561054f57600080fd5b506104456004803603602081101561056657600080fd5b50356110af565b34801561057957600080fd5b50610445611550565b34801561058e57600080fd5b50610404600480360360408110156105a557600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156105d057600080fd5b8201836020820111156105e257600080fd5b8035906020019184600183028401116401000000008311171561060457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611556945050505050565b34801561065157600080fd5b50610445611677565b34801561066657600080fd5b506104046004803603602081101561067d57600080fd5b50356001600160a01b031661167d565b34801561069957600080fd5b50610404600480360360208110156106b057600080fd5b5035611760565b3480156106c357600080fd5b506106cc61183b565b604080516001600160a01b039092168252519081900360200190f35b3480156106f457600080fd5b5061044561184f565b34801561070957600080fd5b50610445611855565b34801561071e57600080fd5b506104046004803603602081101561073557600080fd5b503561185b565b34801561074857600080fd5b5061052f6004803603606081101561075f57600080fd5b506001600160a01b03813581169160208101359091169060400135611901565b34801561078b57600080fd5b50610445611988565b3480156107a057600080fd5b50610445611a07565b3480156107b557600080fd5b50610445611a0d565b3480156107ca57600080fd5b50610445600480360360208110156107e157600080fd5b5035611a13565b3480156107f457600080fd5b506107fd611a73565b6040805160ff9092168252519081900360200190f35b34801561081f57600080fd5b50610445611a7c565b34801561083457600080fd5b5061052f6004803603604081101561084b57600080fd5b506001600160a01b038135169060200135611a82565b34801561086d57600080fd5b506106cc611ad0565b34801561088257600080fd5b506104046004803603602081101561089957600080fd5b5035611adf565b3480156108ac57600080fd5b50610445611af3565b3480156108c157600080fd5b50610404600480360360208110156108d857600080fd5b5035611af9565b3480156108eb57600080fd5b506106cc611c91565b34801561090057600080fd5b50610445611ca0565b34801561091557600080fd5b506104046004803603602081101561092c57600080fd5b5035611d7c565b34801561093f57600080fd5b506104046004803603608081101561095657600080fd5b5080359060208101359060408101359060600135611dd9565b34801561097b57600080fd5b506106cc611e9e565b34801561099057600080fd5b50610404600480360360208110156109a757600080fd5b5035611ead565b3480156109ba57600080fd5b50610404600480360360408110156109d157600080fd5b50803590602001351515611f50565b3480156109ec57600080fd5b5061040460048036036020811015610a0357600080fd5b50356001600160a01b0316612019565b348015610a1f57600080fd5b5061044560048036036020811015610a3657600080fd5b50356001600160a01b031661209a565b348015610a5257600080fd5b506104046120fc565b348015610a6757600080fd5b5061040460048036036040811015610a7e57600080fd5b506001600160a01b03813516906020013561219e565b348015610aa057600080fd5b506104456121f8565b348015610ab557600080fd5b5061040460048036036020811015610acc57600080fd5b50356121fe565b348015610adf57600080fd5b506104046122b7565b348015610af457600080fd5b506104456124b2565b348015610b0957600080fd5b506106cc6124fd565b348015610b1e57600080fd5b5061044561250c565b348015610b3357600080fd5b5061046c612512565b348015610b4857600080fd5b5061044560048036036040811015610b5f57600080fd5b50803590602001351515612573565b348015610b7a57600080fd5b50610b9860048036036020811015610b9157600080fd5b5035612609565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610bec578181015183820152602001610bd4565b50505050905090810190601f168015610c195780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610c3557600080fd5b5061040460048036036020811015610c4c57600080fd5b50356001600160a01b03166126d1565b348015610c6857600080fd5b5061052f60048036036040811015610c7f57600080fd5b506001600160a01b0381351690602001356127a9565b348015610ca157600080fd5b50610404612811565b348015610cb657600080fd5b50610445612875565b348015610ccb57600080fd5b5061052f60048036036040811015610ce257600080fd5b506001600160a01b038135169060200135612885565b348015610d0457600080fd5b50610445612899565b348015610d1957600080fd5b5061044561289f565b348015610d2e57600080fd5b5061040460048036036020811015610d4557600080fd5b50356128ba565b348015610d5857600080fd5b50610404612917565b348015610d6d57600080fd5b50610445612ab1565b348015610d8257600080fd5b50610445612b3a565b348015610d9757600080fd5b5061052f60048036036020811015610dae57600080fd5b50356001600160a01b0316612b40565b348015610dca57600080fd5b5061052f612b5e565b348015610ddf57600080fd5b50610445612b67565b348015610df457600080fd5b5061044560048036036040811015610e0b57600080fd5b506001600160a01b0381358116916020013516612b6d565b348015610e2f57600080fd5b50610445612b98565b348015610e4457600080fd5b5061040460048036036020811015610e5b57600080fd5b50356001600160a01b0316612b9e565b348015610e7757600080fd5b50610445612c18565b348015610e8c57600080fd5b5061040460048036036020811015610ea357600080fd5b50356001600160a01b0316612c1e565b348015610ebf57600080fd5b5061040460048036036020811015610ed657600080fd5b50356001600160a01b0316612da4565b348015610ef257600080fd5b5061040460048036036020811015610f0957600080fd5b50356001600160a01b0316612e9d565b348015610f2557600080fd5b5061040460048036036020811015610f3c57600080fd5b50356001600160a01b031661305e565b610f54613163565b6012546001600160a01b03908116911614610fa4576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b8015610fea57600a811015610fea5760405162461bcd60e51b81526004018080602001828103825260218152602001806142ec6021913960400191505060405180910390fd5b600b55565b600b5481565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110815780601f1061105657610100808354040283529160200191611081565b820191906000526020600020905b81548152906001019060200180831161106457829003601f168201915b5050505050905090565b60245481565b60006110a561109e613163565b8484613167565b5060015b92915050565b60006110b96124fd565b6001600160a01b03166110ca613163565b6001600160a01b031614806110f95750601f546001600160a01b03166110ee613163565b6001600160a01b0316145b611142576040805162461bcd60e51b815260206004820152601560248201527414d95b99195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604482015290519081900360640190fd5b601454611150906001613253565b6014558161119957601454601a5460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a250601a5461154b565b60006111b6600084126111ac57836111b1565b836000035b6132ad565b601a549091506000906111d7906111d184633b9aca00613308565b906130df565b90506000808512156111f8576111f1633b9aca0083613121565b9050611209565b611206633b9aca0083613253565b90505b600085121561122757601a5461121f9084613121565b601a55611238565b601a546112349084613253565b601a555b60005b60195481101561130a576000601660006019848154811061125857fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020541115611302576112cb6009600a0a6111d18460166000601987815481106112a057fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490613308565b60166000601984815481106112dc57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020555b60010161123b565b50601454601a5460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a260005b6013548110156115415760006013828154811061135f57fe5b60009182526020909120600290910201805490915060ff16156115385780546001808301805460408051602060026101009685161587026000190190941693909304601f81018490048402820184019092528181526000956114279590046001600160a01b031693909290919083018282801561141d5780601f106113f25761010080835404028352916020019161141d565b820191906000526020600020905b81548152906001019060200180831161140057829003601f168201915b5050505050613361565b9050806115365781546040805185815260208101828152600180870180546002610100938216158402600019019091160494840185905294046001600160a01b0316937f8091ecaaa54ebb82e02d36c2c336528e0fcb9b3430fc1291ac88295032b9c2639388939192906060830190849080156114e55780601f106114ba576101008083540402835291602001916114e5565b820191906000526020600020905b8154815290600101906020018083116114c857829003601f168201915b5050935050505060405180910390a26040805162461bcd60e51b8152602060048201526012602482015271151c985b9cd858dd1a5bdb8811985a5b195960721b604482015290519081900360640190fd5b505b50600101611346565b50601a5493505050505b919050565b600e5481565b61155e613163565b6012546001600160a01b039081169116146115ae576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6040805160608101825260018082526001600160a01b038086166020808501918252948401868152601380549485018155600052845160029094027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09081018054935190941661010002610100600160a81b031995151560ff19909416939093179490941691909117825551805193949193611670937f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a091019291909101906140d6565b5050505050565b601c5490565b611685613163565b6012546001600160a01b039081169116146116d5576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b60055461010090046001600160a01b031615611738576040805162461bcd60e51b815260206004820152601f60248201527f736574556e69737761705632526f757465723a20616c72656164792073657400604482015290519081900360640190fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600061176a613163565b6001600160a01b03811660009081526018602052604090205490915060ff16156117c55760405162461bcd60e51b815260040180806020018281038252602c815260200180614571602c913960400191505060405180910390fd5b60006117d383601d54613384565b505050506001600160a01b0383166000908152601560205260409020549091506117fd9082613121565b6001600160a01b038316600090815260156020526040902055601b546118239082613121565b601b55601c546118339084613253565b601c55505050565b60055461010090046001600160a01b031681565b600f5481565b601a5490565b611863613163565b6012546001600160a01b039081169116146118b3576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b601e5461a8c0014210156118f85760405162461bcd60e51b815260040180806020018281038252602c8152602001806143f7602c913960400191505060405180910390fd5b601d5542601e55565b600061190e8484846133d2565b61197e8461191a613163565b611979856040518060600160405280602881526020016143cf602891396001600160a01b038a16600090815260176020526040812090611958613163565b6001600160a01b031681526020810191909152604001600020549190613862565b613167565b5060019392505050565b600654604080516370a0823160e01b8152600060048201819052915191926001600160a01b0316916370a0823191602480820192602092909190829003018186803b1580156119d657600080fd5b505afa1580156119ea573d6000803e3d6000fd5b505050506040513d6020811015611a0057600080fd5b5051905090565b601d5481565b60215481565b6000601b54821115611a565760405162461bcd60e51b815260040180806020018281038252602a8152602001806144dc602a913960400191505060405180910390fd5b6000611a606138f9565b9050611a6c83826130df565b9392505050565b60055460ff1690565b60205481565b60006110a5611a8f613163565b846119798560176000611aa0613163565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490613253565b601f546001600160a01b031681565b611af0611aea613163565b8261391c565b50565b60225481565b611b01613163565b6012546001600160a01b03908116911614611b51576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6013548110611b9d576040805162461bcd60e51b8152602060048201526013602482015272696e646578206f7574206f6620626f756e647360681b604482015290519081900360640190fd5b60135460001901811015611c4e57601380546000198101908110611bbd57fe5b906000526020600020906002020160138281548110611bd857fe5b6000918252602090912082546002928302909101805460ff191660ff9092161515919091178082558354610100600160a81b0319909116610100918290046001600160a01b03168202178255600180850180549394611c4a94838701949293811615909202600019019091160461415e565b5050505b6013805480611c5957fe5b60008281526020812060026000199093019283020180546001600160a81b031916815590611c8a60018301826141e1565b5050905550565b6006546001600160a01b031681565b600080600660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611cf157600080fd5b505afa158015611d05573d6000803e3d6000fd5b505050506040513d6020811015611d1b57600080fd5b505190506000611d29611988565b90506000611d40836111d18464e8d4a51000613308565b600654909150600090611d5b906001600160a01b031661209a565b90506000611d7264e8d4a510006111d18486613308565b9550505050505090565b611d84613163565b6012546001600160a01b03908116911614611dd4576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b600f55565b611de1613163565b6012546001600160a01b03908116911614611e31576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b60245415611e86576040805162461bcd60e51b815260206004820152601960248201527f4c696d6974206368616e676573206e6f7420616c6c6f77656400000000000000604482015290519081900360640190fd5b60209390935560219190915560225560235542602455565b6007546001600160a01b031681565b611eb5613163565b6012546001600160a01b03908116911614611f05576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b8015611f4b57600a811015611f4b5760405162461bcd60e51b815260040180806020018281038252602281526020018061454f6022913960400191505060405180910390fd5b600a55565b611f58613163565b6012546001600160a01b03908116911614611fa8576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6013548210611fe85760405162461bcd60e51b81526004018080602001828103825260288152602001806142c46028913960400191505060405180910390fd5b8060138381548110611ff657fe5b60009182526020909120600290910201805460ff19169115159190911790555050565b612021613163565b6012546001600160a01b03908116911614612071576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600860205260409020805460ff19811660ff90911615179055565b6001600160a01b03811660009081526018602052604081205460ff16156120da57506001600160a01b03811660009081526016602052604090205461154b565b6001600160a01b0382166000908152601560205260409020546110a990611a13565b612104613163565b6012546001600160a01b03908116911614612154576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6012546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3601280546001600160a01b0319169055565b60006121d58260405180606001604052806024815260200161446c602491396121ce866121c9613163565b612b6d565b9190613862565b90506121e9836121e3613163565b83613167565b6121f3838361391c565b505050565b60235481565b612206613163565b6012546001600160a01b03908116911614612256576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b80156122b257600a8110156122b2576040805162461bcd60e51b815260206004820152601e60248201527f736574526562616c616e636544697669736f723a20746f6f20736d616c6c0000604482015290519081900360640190fd5b600c55565b600d546122c33361209a565b10156123005760405162461bcd60e51b81526004018080602001828103825260218152602001806143566021913960400191505060405180910390fd5b600f54600e54014211612346576040805162461bcd60e51b81526020600482015260096024820152682a37b79029b7b7b71760b91b604482015290519081900360640190fd5b42600e5560006123553061209a565b905061236081613a18565b600c54600654604080516370a0823160e01b815230600482015290516000936123e99390926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b1580156123b757600080fd5b505afa1580156123cb573d6000803e3d6000fd5b505050506040513d60208110156123e157600080fd5b5051906130df565b90506123f481613acf565b50601154600b5460408051631e93260360e31b815260048101929092525160009261010090046001600160a01b03169163f499301891602480830192602092919082900301818787803b15801561244a57600080fd5b505af115801561245e573d6000803e3d6000fd5b505050506040513d602081101561247457600080fd5b50516040805182815290519192507f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd0919081900360200190a1505050565b600654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156119d657600080fd5b6012546001600160a01b031690565b60135490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110815780601f1061105657610100808354040283529160200191611081565b6000601a548311156125cc576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b816125ed5760006125df84601d54613384565b509294506110a99350505050565b60006125fb84601d54613384565b509194506110a99350505050565b6013818154811061261957600080fd5b6000918252602091829020600291820201805460018083018054604080516101009483161585026000190190921696909604601f810188900488028201880190965285815260ff84169750919092046001600160a01b031694929390928301828280156126c75780601f1061269c576101008083540402835291602001916126c7565b820191906000526020600020905b8154815290600101906020018083116126aa57829003601f168201915b5050505050905083565b6126d9613163565b6012546001600160a01b03908116911614612729576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6006546001600160a01b031615612787576040805162461bcd60e51b815260206004820152601d60248201527f736574556e69737761705632506169723a20616c726561647920736574000000604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60006110a56127b6613163565b846119798560405180606001604052806025815260200161459d60259139601760006127e0613163565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190613862565b612819613163565b6012546001600160a01b03908116911614612869576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6011805460ff19169055565b60006128803061209a565b905090565b60006110a5612892613163565b84846133d2565b601e5481565b60006128806128ac611988565b6128b46124b2565b90613253565b6128c2613163565b6012546001600160a01b03908116911614612912576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b600d55565b61291f613163565b6012546001600160a01b0390811691161461296f576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6010544214156129b9576040805162461bcd60e51b815260206004820152601060248201526f139bdd081d5b9b1bd8dad959081e595d60821b604482015290519081900360640190fd5b600654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612a0457600080fd5b505afa158015612a18573d6000803e3d6000fd5b505050506040513d6020811015612a2e57600080fd5b50516006546040805163a9059cbb60e01b81523360048201526024810184905290519293506001600160a01b039091169163a9059cbb916044808201926020929091908290030181600087803b158015612a8757600080fd5b505af1158015612a9b573d6000803e3d6000fd5b505050506040513d60208110156121f357600080fd5b600080600660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b0257600080fd5b505afa158015612b16573d6000803e3d6000fd5b505050506040513d6020811015612b2c57600080fd5b505190506000611d2961289f565b60105481565b6001600160a01b031660009081526018602052604090205460ff1690565b60115460ff1681565b600a5481565b6001600160a01b03918216600090815260176020908152604080832093909416825291909152205490565b600c5481565b612ba6613163565b6012546001600160a01b03908116911614612bf6576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b601f80546001600160a01b0319166001600160a01b0392909216919091179055565b600d5481565b612c26613163565b6012546001600160a01b03908116911614612c76576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526018602052604090205460ff1615612ce4576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526015602052604090205415612d3e576001600160a01b038116600090815260156020526040902054612d2490611a13565b6001600160a01b0382166000908152601660205260409020555b6001600160a01b03166000818152601860205260408120805460ff191660019081179091556019805491820181559091527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950180546001600160a01b0319169091179055565b612dac613163565b6012546001600160a01b03908116911614612dfc576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6001600160a01b038116612e415760405162461bcd60e51b815260040180806020018281038252602681526020018061427c6026913960400191505060405180910390fd5b6012546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3601280546001600160a01b0319166001600160a01b0392909216919091179055565b612ea5613163565b6012546001600160a01b03908116911614612ef5576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526018602052604090205460ff16612f62576040805162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c75646564000000000000000000604482015290519081900360640190fd5b60005b60195481101561305a57816001600160a01b031660198281548110612f8657fe5b6000918252602090912001546001600160a01b0316141561305257601980546000198101908110612fb357fe5b600091825260209091200154601980546001600160a01b039092169183908110612fd957fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152601682526040808220829055601890925220805460ff19169055601980548061302b57fe5b600082815260209020810160001990810180546001600160a01b031916905501905561305a565b600101612f65565b5050565b613066613163565b6012546001600160a01b039081169116146130b6576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600960205260409020805460ff19811660ff90911615179055565b6000611a6c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c0d565b6000611a6c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613862565b3390565b6001600160a01b0383166131ac5760405162461bcd60e51b815260040180806020018281038252602481526020018061452b6024913960400191505060405180910390fd5b6001600160a01b0382166131f15760405162461bcd60e51b81526004018080602001828103825260228152602001806142a26022913960400191505060405180910390fd5b6001600160a01b03808416600081815260176020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082820183811015611a6c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080821215613304576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b5090565b600082613317575060006110a9565b8282028284828161332457fe5b0414611a6c5760405162461bcd60e51b81526004018080602001828103825260218152602001806143ae6021913960400191505060405180910390fd5b6000806040516020840160008286518360008a6187965a03f19695505050505050565b60008060008060008060006133998989613c72565b9150915060006133a76138f9565b905060008060006133b98d8686613ca0565b919f909e50909c50959a50939850939650505050505050565b6001600160a01b0383166134175760405162461bcd60e51b81526004018080602001828103825260258152602001806145066025913960400191505060405180910390fd5b6001600160a01b03821661345c5760405162461bcd60e51b81526004018080602001828103825260238152602001806142376023913960400191505060405180910390fd5b6000811161349b5760405162461bcd60e51b81526004018080602001828103825260298152602001806144436029913960400191505060405180910390fd5b60115460ff1680156134cb57506001600160a01b03831660009081526009602052604090205460ff161515600114155b80156134f557506001600160a01b03821660009081526009602052604090205460ff161515600114155b15613547576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b656420756e74696c20656e64206f662070726573616c650000000000604482015290519081900360640190fd5b600a541580159061357157506001600160a01b03831660009081526008602052604090205460ff16155b801561359657506001600160a01b03821660009081526008602052604090205460ff16155b156135cd5760006135b2600a54836130df90919063ffffffff16565b90506135bf8430836133d2565b6135c98282613121565b9150505b6001600160a01b03831660009081526018602052604090205460ff16801561360e57506001600160a01b03821660009081526018602052604090205460ff16155b156136bd5742602054106136aa5760215481111561365d5760405162461bcd60e51b81526004018080602001828103825260378152602001806143776037913960400191505060405180910390fd5b60225461366d826128b48561209a565b11156136aa5760405162461bcd60e51b815260040180806020018281038252602b8152602001806144b1602b913960400191505060405180910390fd5b6136b8838383601d54613cdc565b6121f3565b6001600160a01b03831660009081526018602052604090205460ff161580156136fe57506001600160a01b03821660009081526018602052604090205460ff165b1561372d57426020541061371f5761371a838383602354613df5565b6136b8565b6136b8838383601d54613df5565b6001600160a01b03831660009081526018602052604090205460ff1615801561376f57506001600160a01b03821660009081526018602052604090205460ff16155b156137c25742602054106137b45760405162461bcd60e51b815260040180806020018281038252604981526020018061430d6049913960600191505060405180910390fd5b6136b8838383601d54613e9c565b6001600160a01b03831660009081526018602052604090205460ff16801561380257506001600160a01b03821660009081526018602052604090205460ff165b15613814576136b88383836000613ede565b42602054106138545760405162461bcd60e51b815260040180806020018281038252604981526020018061430d6049913960600191505060405180910390fd5b6121f3838383601d54613e9c565b600081848411156138f15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156138b657818101518382015260200161389e565b50505050905090810190601f1680156138e35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000806000613906613f4f565b909250905061391582826130df565b9250505090565b6001600160a01b0382166139615760405162461bcd60e51b81526004018080602001828103825260218152602001806144906021913960400191505060405180910390fd5b61396d826000836121f3565b6139aa8160405180606001604052806022815260200161425a602291396001600160a01b0385166000908152602081905260409020549190613862565b6001600160a01b0383166000908152602081905260409020556002546139d09082613121565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600654613a309030906001600160a01b0316836133d2565b600660009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613a8057600080fd5b505af1158015613a94573d6000803e3d6000fd5b50506040805184815290517f8765d2bb982ed6ee74d2b03c76c9c129aa4a4e3e6b17bd7cf7830088e9d490549350908190036020019150a150565b6006546005546040805163095ea7b360e01b81526101009092046001600160a01b039081166004840152602483018590529051600093919091169163095ea7b391604480830192602092919082900301818787803b158015613b3057600080fd5b505af1158015613b44573d6000803e3d6000fd5b505050506040513d6020811015613b5a57600080fd5b50506005546011546040805163af2979eb60e01b815230600482015260248101869052600060448201819052606482018190526001600160a01b0361010094859004811660848401524260a48401529251939094049091169263af2979eb9260c4808401936020939083900390910190829087803b158015613bdb57600080fd5b505af1158015613bef573d6000803e3d6000fd5b505050506040513d6020811015613c0557600080fd5b505192915050565b60008183613c5c5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156138b657818101518382015260200161389e565b506000838581613c6857fe5b0495945050505050565b60008080613c866127106111d18787613308565b90506000613c948683613121565b96919550909350505050565b6000808080613caf8786613308565b90506000613cbd8787613308565b90506000613ccb8383613121565b929992985090965090945050505050565b6000806000806000613cee8787613384565b6001600160a01b038e1660009081526016602052604090205494995092975090955093509150613d1e9088613121565b6001600160a01b038a16600090815260166020908152604080832093909355601590522054613d4d9086613121565b6001600160a01b03808b1660009081526015602052604080822093909355908a1681522054613d7c9085613253565b6001600160a01b038916600090815260156020526040902055613d9f83826140b2565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b6000806000806000613e078787613384565b6001600160a01b038e1660009081526015602052604090205494995092975090955093509150613e379086613121565b6001600160a01b03808b16600090815260156020908152604080832094909455918b16815260169091522054613e6d9083613253565b6001600160a01b038916600090815260166020908152604080832093909355601590522054613d7c9085613253565b6000806000806000613eae8787613384565b6001600160a01b038e1660009081526015602052604090205494995092975090955093509150613d4d9086613121565b6000806000806000613ef08787613384565b6001600160a01b038e1660009081526016602052604090205494995092975090955093509150613f209088613121565b6001600160a01b038a16600090815260166020908152604080832093909355601590522054613e379086613121565b601b54601a546000918291825b60195481101561408057826015600060198481548110613f7857fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613fdd5750816016600060198481548110613fb657fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613ff457601b54601a54945094505050506140ae565b614034601560006019848154811061400857fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490613121565b9250614076601660006019848154811061404a57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390613121565b9150600101613f5c565b50601a54601b54614090916130df565b8210156140a857601b54601a549350935050506140ae565b90925090505b9091565b601b546140bf9083613121565b601b55601c546140cf9082613253565b601c555050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261410c5760008555614152565b82601f1061412557805160ff1916838001178555614152565b82800160010185558215614152579182015b82811115614152578251825591602001919060010190614137565b50613304929150614221565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826141945760008555614152565b82601f106141a55780548555614152565b8280016001018555821561415257600052602060002091601f016020900482015b828111156141525782548255916001019190600101906141c6565b50805460018160011615610100020316600290046000825580601f106142075750611af0565b601f016020900490600052602060002090810190611af091905b5b80821115613304576000815560010161422256fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373696e646578206d75737420626520696e2072616e6765206f662073746f726564207478206c69737473657443616c6c657252657761726444697669736f723a20746f6f20736d616c6c496e697469616c20556e6973776170206c697374696e67202d2057616c6c657420746f2057616c6c6574207472616e73666572732074656d706f726172696c792064697361626c6564596f7520617265206e6f7420616c6c6f77656420746f20726562616c616e636521496e697469616c20556e6973776170206c697374696e67202d20616d6f756e742065786365656473207472616e73666572206c696d6974536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220666565206368616e6765732074696d656c6f636b656420666f7220313220686f7572734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f2061646472657373496e697469616c20556e6973776170206c697374696e67202d206d61782062616c616e6365206c696d6974416d6f756e74206d757374206265206c657373207468616e20746f74616c2072656672616374696f6e7345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573737365744c69717569646974794c6f636b44697669736f723a20746f6f20736d616c6c4578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206c501b3f9e9690eccba2e21caf0bfb74ecdfaa2822dce43c8feab58f3baeab5564736f6c634300070500336080604052600180546001600160a01b03191661dead17905534801561002457600080fd5b506040516108fd3803806108fd8339818101604052602081101561004757600080fd5b5051600080546001600160a01b03199081163317909155600280546001600160a01b0390931692909116919091179055610877806100866000396000f3fe6080604052600436106100385760003560e01c806361d027b314610041578063d246d41114610072578063f4993018146100875761003f565b3661003f57005b005b34801561004d57600080fd5b506100566100c3565b604080516001600160a01b039092168252519081900360200190f35b34801561007e57600080fd5b506100566100d2565b34801561009357600080fd5b506100b1600480360360208110156100aa57600080fd5b50356100e1565b60408051918252519081900360200190f35b6002546001600160a01b031681565b6001546001600160a01b031681565b600080546001600160a01b0316331461012e576040805162461bcd60e51b815260206004820152600a60248201526937b7363c903a37b5b2b760b11b604482015290519081900360640190fd5b61013847836102eb565b60008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561018457600080fd5b505afa158015610198573d6000803e3d6000fd5b505050506040513d60208110156101ae57600080fd5b5051905060006101be82856106ba565b600080546040805163a9059cbb60e01b81523260048201526024810185905290519394506001600160a01b039091169263a9059cbb92604480840193602093929083900390910190829087803b15801561021757600080fd5b505af115801561022b573d6000803e3d6000fd5b505050506040513d602081101561024157600080fd5b50506000546001546001600160a01b039182169163a9059cbb91166102668585610703565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156102ac57600080fd5b505af11580156102c0573d6000803e3d6000fd5b505050506040513d60208110156102d657600080fd5b506102e390508282610703565b949350505050565b604080516002808252606080830184529260208301908036833701905050905060008054906101000a90046001600160a01b03166001600160a01b0316631694505e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561035757600080fd5b505afa15801561036b573d6000803e3d6000fd5b505050506040513d602081101561038157600080fd5b5051604080516315ab88c960e31b815290516001600160a01b039092169163ad5c464891600480820192602092909190829003018186803b1580156103c557600080fd5b505afa1580156103d9573d6000803e3d6000fd5b505050506040513d60208110156103ef57600080fd5b5051815182906000906103fe57fe5b6001600160a01b03928316602091820292909201015260005482519116908290600190811061042957fe5b6001600160a01b0390921660209283029190910190910152600061044d84846106ba565b6002546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015610488573d6000803e3d6000fd5b5060005460408051630b4a282f60e11b815290516001600160a01b039092169163095ea7b3918391631694505e91600480820192602092909190829003018186803b1580156104d657600080fd5b505afa1580156104ea573d6000803e3d6000fd5b505050506040513d602081101561050057600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482018890525160448083019260209291908290030181600087803b15801561055057600080fd5b505af1158015610564573d6000803e3d6000fd5b505050506040513d602081101561057a57600080fd5b505060005460408051630b4a282f60e11b815290516001600160a01b0390921691631694505e91600480820192602092909190829003018186803b1580156105c157600080fd5b505afa1580156105d5573d6000803e3d6000fd5b505050506040513d60208110156105eb57600080fd5b50516001600160a01b031663b6f9de956106058684610703565b60008530426040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561067457818101518382015260200161065c565b50505050905001955050505050506000604051808303818588803b15801561069b57600080fd5b505af11580156106af573d6000803e3d6000fd5b505050505050505050565b60006106fc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610745565b9392505050565b60006106fc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506107e7565b600081836107d15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561079657818101518382015260200161077e565b50505050905090810190601f1680156107c35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816107dd57fe5b0495945050505050565b600081848411156108395760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561079657818101518382015260200161077e565b50505090039056fea26469706673582212205a4113688629cce553186bc0dfec333e5412f0a6c53c9b6d270be5968be509a064736f6c63430007050033416d6f756e74206d757374206265206c657373207468616e20746f74616c2072656672616374696f6e73

Deployed Bytecode

0x6080604052600436106103fd5760003560e01c806370709a7c11610213578063a9059cbb11610123578063dc654a73116100ab578063e84354c51161007a578063e84354c514610e6b578063f2cc0c1814610e80578063f2fde38b14610eb3578063f84354f114610ee6578063f953797314610f1957610404565b8063dc654a7314610dd3578063dd62ed3e14610de8578063e161eb5614610e23578063e46adf6214610e3857610404565b8063b91f3f97116100f2578063b91f3f9714610d4c578063ca5c7b9114610d61578063cafab28914610d76578063cba0e99614610d8b578063cf30901214610dbe57610404565b8063a9059cbb14610cbf578063aef7f99e14610cf8578063b439824414610d0d578063b6833c5914610d2257610404565b80638da5cb5b116101a65780639ace38c2116101755780639ace38c214610b6e578063a29a608914610c29578063a457c2d714610c5c578063a69df4b514610c95578063a8a5550e14610caa57610404565b80638da5cb5b14610afd57806391d4ec1814610b1257806395d89b4114610b2757806397d0677b14610b3c57610404565b80637d449789116101e25780637d44978914610a945780637e0d943e14610aa95780637f4aeb1a14610ad3578063858750ab14610ae857610404565b806370709a7c146109e057806370a0823114610a13578063715018a614610a4657806379cc679014610a5b57610404565b80632ae427dc1161030e578063456e0a5d116102a15780635b7dcaed116102705780635b7dcaed146109095780635c1eca841461093357806361d027b31461096f57806367a9fca6146109845780636e9dde99146109ae57610404565b8063456e0a5d146108a057806346c3bd1f146108b557806349bd5a5e146108df57806355d0a1d0146108f457610404565b806338a9ad1d116102dd57806338a9ad1d1461081357806339509351146108285780633aa8d4be1461086157806342966c681461087657610404565b80632ae427dc146107945780632bc1281e146107a9578063303bb0b6146107be578063313ce567146107e857610404565b806313114a9d1161039157806316d1d9161161036057806316d1d916146106e857806318160ddd146106fd5780631f36d9251461071257806323b872dd1461073c5780632898cafa1461077f57610404565b806313114a9d146106455780631419841d1461065a57806314f43f7e1461068d5780631694505e146106b757610404565b8063095ea7b3116103cd578063095ea7b3146104f65780630ab114f914610543578063106b9ca11461056d578063126e19be1461058257610404565b80629a81301461040657806302dd19d91461043057806306fdde031461045757806308d1dd8a146104e157610404565b3661040457005b005b34801561041257600080fd5b506104046004803603602081101561042957600080fd5b5035610f4c565b34801561043c57600080fd5b50610445610fef565b60408051918252519081900360200190f35b34801561046357600080fd5b5061046c610ff5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104a657818101518382015260200161048e565b50505050905090810190601f1680156104d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ed57600080fd5b5061044561108b565b34801561050257600080fd5b5061052f6004803603604081101561051957600080fd5b506001600160a01b038135169060200135611091565b604080519115158252519081900360200190f35b34801561054f57600080fd5b506104456004803603602081101561056657600080fd5b50356110af565b34801561057957600080fd5b50610445611550565b34801561058e57600080fd5b50610404600480360360408110156105a557600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156105d057600080fd5b8201836020820111156105e257600080fd5b8035906020019184600183028401116401000000008311171561060457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611556945050505050565b34801561065157600080fd5b50610445611677565b34801561066657600080fd5b506104046004803603602081101561067d57600080fd5b50356001600160a01b031661167d565b34801561069957600080fd5b50610404600480360360208110156106b057600080fd5b5035611760565b3480156106c357600080fd5b506106cc61183b565b604080516001600160a01b039092168252519081900360200190f35b3480156106f457600080fd5b5061044561184f565b34801561070957600080fd5b50610445611855565b34801561071e57600080fd5b506104046004803603602081101561073557600080fd5b503561185b565b34801561074857600080fd5b5061052f6004803603606081101561075f57600080fd5b506001600160a01b03813581169160208101359091169060400135611901565b34801561078b57600080fd5b50610445611988565b3480156107a057600080fd5b50610445611a07565b3480156107b557600080fd5b50610445611a0d565b3480156107ca57600080fd5b50610445600480360360208110156107e157600080fd5b5035611a13565b3480156107f457600080fd5b506107fd611a73565b6040805160ff9092168252519081900360200190f35b34801561081f57600080fd5b50610445611a7c565b34801561083457600080fd5b5061052f6004803603604081101561084b57600080fd5b506001600160a01b038135169060200135611a82565b34801561086d57600080fd5b506106cc611ad0565b34801561088257600080fd5b506104046004803603602081101561089957600080fd5b5035611adf565b3480156108ac57600080fd5b50610445611af3565b3480156108c157600080fd5b50610404600480360360208110156108d857600080fd5b5035611af9565b3480156108eb57600080fd5b506106cc611c91565b34801561090057600080fd5b50610445611ca0565b34801561091557600080fd5b506104046004803603602081101561092c57600080fd5b5035611d7c565b34801561093f57600080fd5b506104046004803603608081101561095657600080fd5b5080359060208101359060408101359060600135611dd9565b34801561097b57600080fd5b506106cc611e9e565b34801561099057600080fd5b50610404600480360360208110156109a757600080fd5b5035611ead565b3480156109ba57600080fd5b50610404600480360360408110156109d157600080fd5b50803590602001351515611f50565b3480156109ec57600080fd5b5061040460048036036020811015610a0357600080fd5b50356001600160a01b0316612019565b348015610a1f57600080fd5b5061044560048036036020811015610a3657600080fd5b50356001600160a01b031661209a565b348015610a5257600080fd5b506104046120fc565b348015610a6757600080fd5b5061040460048036036040811015610a7e57600080fd5b506001600160a01b03813516906020013561219e565b348015610aa057600080fd5b506104456121f8565b348015610ab557600080fd5b5061040460048036036020811015610acc57600080fd5b50356121fe565b348015610adf57600080fd5b506104046122b7565b348015610af457600080fd5b506104456124b2565b348015610b0957600080fd5b506106cc6124fd565b348015610b1e57600080fd5b5061044561250c565b348015610b3357600080fd5b5061046c612512565b348015610b4857600080fd5b5061044560048036036040811015610b5f57600080fd5b50803590602001351515612573565b348015610b7a57600080fd5b50610b9860048036036020811015610b9157600080fd5b5035612609565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610bec578181015183820152602001610bd4565b50505050905090810190601f168015610c195780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610c3557600080fd5b5061040460048036036020811015610c4c57600080fd5b50356001600160a01b03166126d1565b348015610c6857600080fd5b5061052f60048036036040811015610c7f57600080fd5b506001600160a01b0381351690602001356127a9565b348015610ca157600080fd5b50610404612811565b348015610cb657600080fd5b50610445612875565b348015610ccb57600080fd5b5061052f60048036036040811015610ce257600080fd5b506001600160a01b038135169060200135612885565b348015610d0457600080fd5b50610445612899565b348015610d1957600080fd5b5061044561289f565b348015610d2e57600080fd5b5061040460048036036020811015610d4557600080fd5b50356128ba565b348015610d5857600080fd5b50610404612917565b348015610d6d57600080fd5b50610445612ab1565b348015610d8257600080fd5b50610445612b3a565b348015610d9757600080fd5b5061052f60048036036020811015610dae57600080fd5b50356001600160a01b0316612b40565b348015610dca57600080fd5b5061052f612b5e565b348015610ddf57600080fd5b50610445612b67565b348015610df457600080fd5b5061044560048036036040811015610e0b57600080fd5b506001600160a01b0381358116916020013516612b6d565b348015610e2f57600080fd5b50610445612b98565b348015610e4457600080fd5b5061040460048036036020811015610e5b57600080fd5b50356001600160a01b0316612b9e565b348015610e7757600080fd5b50610445612c18565b348015610e8c57600080fd5b5061040460048036036020811015610ea357600080fd5b50356001600160a01b0316612c1e565b348015610ebf57600080fd5b5061040460048036036020811015610ed657600080fd5b50356001600160a01b0316612da4565b348015610ef257600080fd5b5061040460048036036020811015610f0957600080fd5b50356001600160a01b0316612e9d565b348015610f2557600080fd5b5061040460048036036020811015610f3c57600080fd5b50356001600160a01b031661305e565b610f54613163565b6012546001600160a01b03908116911614610fa4576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b8015610fea57600a811015610fea5760405162461bcd60e51b81526004018080602001828103825260218152602001806142ec6021913960400191505060405180910390fd5b600b55565b600b5481565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110815780601f1061105657610100808354040283529160200191611081565b820191906000526020600020905b81548152906001019060200180831161106457829003601f168201915b5050505050905090565b60245481565b60006110a561109e613163565b8484613167565b5060015b92915050565b60006110b96124fd565b6001600160a01b03166110ca613163565b6001600160a01b031614806110f95750601f546001600160a01b03166110ee613163565b6001600160a01b0316145b611142576040805162461bcd60e51b815260206004820152601560248201527414d95b99195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604482015290519081900360640190fd5b601454611150906001613253565b6014558161119957601454601a5460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a250601a5461154b565b60006111b6600084126111ac57836111b1565b836000035b6132ad565b601a549091506000906111d7906111d184633b9aca00613308565b906130df565b90506000808512156111f8576111f1633b9aca0083613121565b9050611209565b611206633b9aca0083613253565b90505b600085121561122757601a5461121f9084613121565b601a55611238565b601a546112349084613253565b601a555b60005b60195481101561130a576000601660006019848154811061125857fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020541115611302576112cb6009600a0a6111d18460166000601987815481106112a057fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490613308565b60166000601984815481106112dc57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020555b60010161123b565b50601454601a5460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a260005b6013548110156115415760006013828154811061135f57fe5b60009182526020909120600290910201805490915060ff16156115385780546001808301805460408051602060026101009685161587026000190190941693909304601f81018490048402820184019092528181526000956114279590046001600160a01b031693909290919083018282801561141d5780601f106113f25761010080835404028352916020019161141d565b820191906000526020600020905b81548152906001019060200180831161140057829003601f168201915b5050505050613361565b9050806115365781546040805185815260208101828152600180870180546002610100938216158402600019019091160494840185905294046001600160a01b0316937f8091ecaaa54ebb82e02d36c2c336528e0fcb9b3430fc1291ac88295032b9c2639388939192906060830190849080156114e55780601f106114ba576101008083540402835291602001916114e5565b820191906000526020600020905b8154815290600101906020018083116114c857829003601f168201915b5050935050505060405180910390a26040805162461bcd60e51b8152602060048201526012602482015271151c985b9cd858dd1a5bdb8811985a5b195960721b604482015290519081900360640190fd5b505b50600101611346565b50601a5493505050505b919050565b600e5481565b61155e613163565b6012546001600160a01b039081169116146115ae576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6040805160608101825260018082526001600160a01b038086166020808501918252948401868152601380549485018155600052845160029094027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09081018054935190941661010002610100600160a81b031995151560ff19909416939093179490941691909117825551805193949193611670937f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a091019291909101906140d6565b5050505050565b601c5490565b611685613163565b6012546001600160a01b039081169116146116d5576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b60055461010090046001600160a01b031615611738576040805162461bcd60e51b815260206004820152601f60248201527f736574556e69737761705632526f757465723a20616c72656164792073657400604482015290519081900360640190fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600061176a613163565b6001600160a01b03811660009081526018602052604090205490915060ff16156117c55760405162461bcd60e51b815260040180806020018281038252602c815260200180614571602c913960400191505060405180910390fd5b60006117d383601d54613384565b505050506001600160a01b0383166000908152601560205260409020549091506117fd9082613121565b6001600160a01b038316600090815260156020526040902055601b546118239082613121565b601b55601c546118339084613253565b601c55505050565b60055461010090046001600160a01b031681565b600f5481565b601a5490565b611863613163565b6012546001600160a01b039081169116146118b3576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b601e5461a8c0014210156118f85760405162461bcd60e51b815260040180806020018281038252602c8152602001806143f7602c913960400191505060405180910390fd5b601d5542601e55565b600061190e8484846133d2565b61197e8461191a613163565b611979856040518060600160405280602881526020016143cf602891396001600160a01b038a16600090815260176020526040812090611958613163565b6001600160a01b031681526020810191909152604001600020549190613862565b613167565b5060019392505050565b600654604080516370a0823160e01b8152600060048201819052915191926001600160a01b0316916370a0823191602480820192602092909190829003018186803b1580156119d657600080fd5b505afa1580156119ea573d6000803e3d6000fd5b505050506040513d6020811015611a0057600080fd5b5051905090565b601d5481565b60215481565b6000601b54821115611a565760405162461bcd60e51b815260040180806020018281038252602a8152602001806144dc602a913960400191505060405180910390fd5b6000611a606138f9565b9050611a6c83826130df565b9392505050565b60055460ff1690565b60205481565b60006110a5611a8f613163565b846119798560176000611aa0613163565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490613253565b601f546001600160a01b031681565b611af0611aea613163565b8261391c565b50565b60225481565b611b01613163565b6012546001600160a01b03908116911614611b51576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6013548110611b9d576040805162461bcd60e51b8152602060048201526013602482015272696e646578206f7574206f6620626f756e647360681b604482015290519081900360640190fd5b60135460001901811015611c4e57601380546000198101908110611bbd57fe5b906000526020600020906002020160138281548110611bd857fe5b6000918252602090912082546002928302909101805460ff191660ff9092161515919091178082558354610100600160a81b0319909116610100918290046001600160a01b03168202178255600180850180549394611c4a94838701949293811615909202600019019091160461415e565b5050505b6013805480611c5957fe5b60008281526020812060026000199093019283020180546001600160a81b031916815590611c8a60018301826141e1565b5050905550565b6006546001600160a01b031681565b600080600660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611cf157600080fd5b505afa158015611d05573d6000803e3d6000fd5b505050506040513d6020811015611d1b57600080fd5b505190506000611d29611988565b90506000611d40836111d18464e8d4a51000613308565b600654909150600090611d5b906001600160a01b031661209a565b90506000611d7264e8d4a510006111d18486613308565b9550505050505090565b611d84613163565b6012546001600160a01b03908116911614611dd4576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b600f55565b611de1613163565b6012546001600160a01b03908116911614611e31576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b60245415611e86576040805162461bcd60e51b815260206004820152601960248201527f4c696d6974206368616e676573206e6f7420616c6c6f77656400000000000000604482015290519081900360640190fd5b60209390935560219190915560225560235542602455565b6007546001600160a01b031681565b611eb5613163565b6012546001600160a01b03908116911614611f05576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b8015611f4b57600a811015611f4b5760405162461bcd60e51b815260040180806020018281038252602281526020018061454f6022913960400191505060405180910390fd5b600a55565b611f58613163565b6012546001600160a01b03908116911614611fa8576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6013548210611fe85760405162461bcd60e51b81526004018080602001828103825260288152602001806142c46028913960400191505060405180910390fd5b8060138381548110611ff657fe5b60009182526020909120600290910201805460ff19169115159190911790555050565b612021613163565b6012546001600160a01b03908116911614612071576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600860205260409020805460ff19811660ff90911615179055565b6001600160a01b03811660009081526018602052604081205460ff16156120da57506001600160a01b03811660009081526016602052604090205461154b565b6001600160a01b0382166000908152601560205260409020546110a990611a13565b612104613163565b6012546001600160a01b03908116911614612154576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6012546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3601280546001600160a01b0319169055565b60006121d58260405180606001604052806024815260200161446c602491396121ce866121c9613163565b612b6d565b9190613862565b90506121e9836121e3613163565b83613167565b6121f3838361391c565b505050565b60235481565b612206613163565b6012546001600160a01b03908116911614612256576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b80156122b257600a8110156122b2576040805162461bcd60e51b815260206004820152601e60248201527f736574526562616c616e636544697669736f723a20746f6f20736d616c6c0000604482015290519081900360640190fd5b600c55565b600d546122c33361209a565b10156123005760405162461bcd60e51b81526004018080602001828103825260218152602001806143566021913960400191505060405180910390fd5b600f54600e54014211612346576040805162461bcd60e51b81526020600482015260096024820152682a37b79029b7b7b71760b91b604482015290519081900360640190fd5b42600e5560006123553061209a565b905061236081613a18565b600c54600654604080516370a0823160e01b815230600482015290516000936123e99390926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b1580156123b757600080fd5b505afa1580156123cb573d6000803e3d6000fd5b505050506040513d60208110156123e157600080fd5b5051906130df565b90506123f481613acf565b50601154600b5460408051631e93260360e31b815260048101929092525160009261010090046001600160a01b03169163f499301891602480830192602092919082900301818787803b15801561244a57600080fd5b505af115801561245e573d6000803e3d6000fd5b505050506040513d602081101561247457600080fd5b50516040805182815290519192507f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd0919081900360200190a1505050565b600654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156119d657600080fd5b6012546001600160a01b031690565b60135490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110815780601f1061105657610100808354040283529160200191611081565b6000601a548311156125cc576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b816125ed5760006125df84601d54613384565b509294506110a99350505050565b60006125fb84601d54613384565b509194506110a99350505050565b6013818154811061261957600080fd5b6000918252602091829020600291820201805460018083018054604080516101009483161585026000190190921696909604601f810188900488028201880190965285815260ff84169750919092046001600160a01b031694929390928301828280156126c75780601f1061269c576101008083540402835291602001916126c7565b820191906000526020600020905b8154815290600101906020018083116126aa57829003601f168201915b5050505050905083565b6126d9613163565b6012546001600160a01b03908116911614612729576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6006546001600160a01b031615612787576040805162461bcd60e51b815260206004820152601d60248201527f736574556e69737761705632506169723a20616c726561647920736574000000604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60006110a56127b6613163565b846119798560405180606001604052806025815260200161459d60259139601760006127e0613163565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190613862565b612819613163565b6012546001600160a01b03908116911614612869576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6011805460ff19169055565b60006128803061209a565b905090565b60006110a5612892613163565b84846133d2565b601e5481565b60006128806128ac611988565b6128b46124b2565b90613253565b6128c2613163565b6012546001600160a01b03908116911614612912576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b600d55565b61291f613163565b6012546001600160a01b0390811691161461296f576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6010544214156129b9576040805162461bcd60e51b815260206004820152601060248201526f139bdd081d5b9b1bd8dad959081e595d60821b604482015290519081900360640190fd5b600654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612a0457600080fd5b505afa158015612a18573d6000803e3d6000fd5b505050506040513d6020811015612a2e57600080fd5b50516006546040805163a9059cbb60e01b81523360048201526024810184905290519293506001600160a01b039091169163a9059cbb916044808201926020929091908290030181600087803b158015612a8757600080fd5b505af1158015612a9b573d6000803e3d6000fd5b505050506040513d60208110156121f357600080fd5b600080600660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b0257600080fd5b505afa158015612b16573d6000803e3d6000fd5b505050506040513d6020811015612b2c57600080fd5b505190506000611d2961289f565b60105481565b6001600160a01b031660009081526018602052604090205460ff1690565b60115460ff1681565b600a5481565b6001600160a01b03918216600090815260176020908152604080832093909416825291909152205490565b600c5481565b612ba6613163565b6012546001600160a01b03908116911614612bf6576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b601f80546001600160a01b0319166001600160a01b0392909216919091179055565b600d5481565b612c26613163565b6012546001600160a01b03908116911614612c76576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526018602052604090205460ff1615612ce4576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526015602052604090205415612d3e576001600160a01b038116600090815260156020526040902054612d2490611a13565b6001600160a01b0382166000908152601660205260409020555b6001600160a01b03166000818152601860205260408120805460ff191660019081179091556019805491820181559091527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950180546001600160a01b0319169091179055565b612dac613163565b6012546001600160a01b03908116911614612dfc576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6001600160a01b038116612e415760405162461bcd60e51b815260040180806020018281038252602681526020018061427c6026913960400191505060405180910390fd5b6012546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3601280546001600160a01b0319166001600160a01b0392909216919091179055565b612ea5613163565b6012546001600160a01b03908116911614612ef5576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526018602052604090205460ff16612f62576040805162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c75646564000000000000000000604482015290519081900360640190fd5b60005b60195481101561305a57816001600160a01b031660198281548110612f8657fe5b6000918252602090912001546001600160a01b0316141561305257601980546000198101908110612fb357fe5b600091825260209091200154601980546001600160a01b039092169183908110612fd957fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152601682526040808220829055601890925220805460ff19169055601980548061302b57fe5b600082815260209020810160001990810180546001600160a01b031916905501905561305a565b600101612f65565b5050565b613066613163565b6012546001600160a01b039081169116146130b6576040805162461bcd60e51b81526020600482018190526024820152600080516020614423833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600960205260409020805460ff19811660ff90911615179055565b6000611a6c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c0d565b6000611a6c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613862565b3390565b6001600160a01b0383166131ac5760405162461bcd60e51b815260040180806020018281038252602481526020018061452b6024913960400191505060405180910390fd5b6001600160a01b0382166131f15760405162461bcd60e51b81526004018080602001828103825260228152602001806142a26022913960400191505060405180910390fd5b6001600160a01b03808416600081815260176020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082820183811015611a6c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080821215613304576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b5090565b600082613317575060006110a9565b8282028284828161332457fe5b0414611a6c5760405162461bcd60e51b81526004018080602001828103825260218152602001806143ae6021913960400191505060405180910390fd5b6000806040516020840160008286518360008a6187965a03f19695505050505050565b60008060008060008060006133998989613c72565b9150915060006133a76138f9565b905060008060006133b98d8686613ca0565b919f909e50909c50959a50939850939650505050505050565b6001600160a01b0383166134175760405162461bcd60e51b81526004018080602001828103825260258152602001806145066025913960400191505060405180910390fd5b6001600160a01b03821661345c5760405162461bcd60e51b81526004018080602001828103825260238152602001806142376023913960400191505060405180910390fd5b6000811161349b5760405162461bcd60e51b81526004018080602001828103825260298152602001806144436029913960400191505060405180910390fd5b60115460ff1680156134cb57506001600160a01b03831660009081526009602052604090205460ff161515600114155b80156134f557506001600160a01b03821660009081526009602052604090205460ff161515600114155b15613547576040805162461bcd60e51b815260206004820152601b60248201527f4c6f636b656420756e74696c20656e64206f662070726573616c650000000000604482015290519081900360640190fd5b600a541580159061357157506001600160a01b03831660009081526008602052604090205460ff16155b801561359657506001600160a01b03821660009081526008602052604090205460ff16155b156135cd5760006135b2600a54836130df90919063ffffffff16565b90506135bf8430836133d2565b6135c98282613121565b9150505b6001600160a01b03831660009081526018602052604090205460ff16801561360e57506001600160a01b03821660009081526018602052604090205460ff16155b156136bd5742602054106136aa5760215481111561365d5760405162461bcd60e51b81526004018080602001828103825260378152602001806143776037913960400191505060405180910390fd5b60225461366d826128b48561209a565b11156136aa5760405162461bcd60e51b815260040180806020018281038252602b8152602001806144b1602b913960400191505060405180910390fd5b6136b8838383601d54613cdc565b6121f3565b6001600160a01b03831660009081526018602052604090205460ff161580156136fe57506001600160a01b03821660009081526018602052604090205460ff165b1561372d57426020541061371f5761371a838383602354613df5565b6136b8565b6136b8838383601d54613df5565b6001600160a01b03831660009081526018602052604090205460ff1615801561376f57506001600160a01b03821660009081526018602052604090205460ff16155b156137c25742602054106137b45760405162461bcd60e51b815260040180806020018281038252604981526020018061430d6049913960600191505060405180910390fd5b6136b8838383601d54613e9c565b6001600160a01b03831660009081526018602052604090205460ff16801561380257506001600160a01b03821660009081526018602052604090205460ff165b15613814576136b88383836000613ede565b42602054106138545760405162461bcd60e51b815260040180806020018281038252604981526020018061430d6049913960600191505060405180910390fd5b6121f3838383601d54613e9c565b600081848411156138f15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156138b657818101518382015260200161389e565b50505050905090810190601f1680156138e35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000806000613906613f4f565b909250905061391582826130df565b9250505090565b6001600160a01b0382166139615760405162461bcd60e51b81526004018080602001828103825260218152602001806144906021913960400191505060405180910390fd5b61396d826000836121f3565b6139aa8160405180606001604052806022815260200161425a602291396001600160a01b0385166000908152602081905260409020549190613862565b6001600160a01b0383166000908152602081905260409020556002546139d09082613121565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600654613a309030906001600160a01b0316836133d2565b600660009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613a8057600080fd5b505af1158015613a94573d6000803e3d6000fd5b50506040805184815290517f8765d2bb982ed6ee74d2b03c76c9c129aa4a4e3e6b17bd7cf7830088e9d490549350908190036020019150a150565b6006546005546040805163095ea7b360e01b81526101009092046001600160a01b039081166004840152602483018590529051600093919091169163095ea7b391604480830192602092919082900301818787803b158015613b3057600080fd5b505af1158015613b44573d6000803e3d6000fd5b505050506040513d6020811015613b5a57600080fd5b50506005546011546040805163af2979eb60e01b815230600482015260248101869052600060448201819052606482018190526001600160a01b0361010094859004811660848401524260a48401529251939094049091169263af2979eb9260c4808401936020939083900390910190829087803b158015613bdb57600080fd5b505af1158015613bef573d6000803e3d6000fd5b505050506040513d6020811015613c0557600080fd5b505192915050565b60008183613c5c5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156138b657818101518382015260200161389e565b506000838581613c6857fe5b0495945050505050565b60008080613c866127106111d18787613308565b90506000613c948683613121565b96919550909350505050565b6000808080613caf8786613308565b90506000613cbd8787613308565b90506000613ccb8383613121565b929992985090965090945050505050565b6000806000806000613cee8787613384565b6001600160a01b038e1660009081526016602052604090205494995092975090955093509150613d1e9088613121565b6001600160a01b038a16600090815260166020908152604080832093909355601590522054613d4d9086613121565b6001600160a01b03808b1660009081526015602052604080822093909355908a1681522054613d7c9085613253565b6001600160a01b038916600090815260156020526040902055613d9f83826140b2565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b6000806000806000613e078787613384565b6001600160a01b038e1660009081526015602052604090205494995092975090955093509150613e379086613121565b6001600160a01b03808b16600090815260156020908152604080832094909455918b16815260169091522054613e6d9083613253565b6001600160a01b038916600090815260166020908152604080832093909355601590522054613d7c9085613253565b6000806000806000613eae8787613384565b6001600160a01b038e1660009081526015602052604090205494995092975090955093509150613d4d9086613121565b6000806000806000613ef08787613384565b6001600160a01b038e1660009081526016602052604090205494995092975090955093509150613f209088613121565b6001600160a01b038a16600090815260166020908152604080832093909355601590522054613e379086613121565b601b54601a546000918291825b60195481101561408057826015600060198481548110613f7857fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613fdd5750816016600060198481548110613fb657fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613ff457601b54601a54945094505050506140ae565b614034601560006019848154811061400857fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490613121565b9250614076601660006019848154811061404a57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390613121565b9150600101613f5c565b50601a54601b54614090916130df565b8210156140a857601b54601a549350935050506140ae565b90925090505b9091565b601b546140bf9083613121565b601b55601c546140cf9082613253565b601c555050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261410c5760008555614152565b82601f1061412557805160ff1916838001178555614152565b82800160010185558215614152579182015b82811115614152578251825591602001919060010190614137565b50613304929150614221565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826141945760008555614152565b82601f106141a55780548555614152565b8280016001018555821561415257600052602060002091601f016020900482015b828111156141525782548255916001019190600101906141c6565b50805460018160011615610100020316600290046000825580601f106142075750611af0565b601f016020900490600052602060002090810190611af091905b5b80821115613304576000815560010161422256fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373696e646578206d75737420626520696e2072616e6765206f662073746f726564207478206c69737473657443616c6c657252657761726444697669736f723a20746f6f20736d616c6c496e697469616c20556e6973776170206c697374696e67202d2057616c6c657420746f2057616c6c6574207472616e73666572732074656d706f726172696c792064697361626c6564596f7520617265206e6f7420616c6c6f77656420746f20726562616c616e636521496e697469616c20556e6973776170206c697374696e67202d20616d6f756e742065786365656473207472616e73666572206c696d6974536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220666565206368616e6765732074696d656c6f636b656420666f7220313220686f7572734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f2061646472657373496e697469616c20556e6973776170206c697374696e67202d206d61782062616c616e6365206c696d6974416d6f756e74206d757374206265206c657373207468616e20746f74616c2072656672616374696f6e7345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573737365744c69717569646974794c6f636b44697669736f723a20746f6f20736d616c6c4578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206c501b3f9e9690eccba2e21caf0bfb74ecdfaa2822dce43c8feab58f3baeab5564736f6c63430007050033

Deployed Bytecode Sourcemap

42869:20610:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62495:265;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62495:265:0;;:::i;36168:34::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;25482:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44265:30;;;;;;;;;;;;;:::i;51227:161::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51227:161:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45790:1761;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45790:1761:0;;:::i;36293:28::-;;;;;;;;;;;;;:::i;47777:260::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47777:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47777:260:0;;-1:-1:-1;47777:260:0;;-1:-1:-1;;;;;47777:260:0:i;52356:87::-;;;;;;;;;;;;;:::i;61375:208::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61375:208:0;-1:-1:-1;;;;;61375:208:0;;:::i;52451:390::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52451:390:0;;:::i;35747:75::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;35747:75:0;;;;;;;;;;;;;;36328:32;;;;;;;;;;;;;:::i;45678:100::-;;;;;;;;;;;;;:::i;44913:287::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44913:287:0;;:::i;51396:313::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51396:313:0;;;;;;;;;;;;;;;;;:::i;40013:125::-;;;;;;;;;;;;;:::i;43981:27::-;;;;;;;;;;;;;:::i;44137:35::-;;;;;;;;;;;;;:::i;53324:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53324:253:0;;:::i;26409:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44093:37;;;;;;;;;;;;;:::i;51717:227::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51717:227:0;;;;;;;;:::i;44057:23::-;;;;;;;;;;;;;:::i;34828:91::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34828:91:0;;:::i;44179:31::-;;;;;;;;;;;;;:::i;48189:325::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48189:325:0;;:::i;35829:28::-;;;;;;;;;;;;;:::i;39336:443::-;;;;;;;;;;;;;:::i;62369:114::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62369:114:0;;:::i;45212:454::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45212:454:0;;;;;;;;;;;;;;;;;:::i;35864:31::-;;;;;;;;;;;;;:::i;61795:287::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61795:287:0;;:::i;48696:246::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48696:246:0;;;;;;;;;:::i;63033:114::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63033:114:0;-1:-1:-1;;;;;63033:114:0;;:::i;50695:198::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50695:198:0;-1:-1:-1;;;;;50695:198:0;;:::i;6583:148::-;;;;;;;;;;;;;:::i;35238:295::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35238:295:0;;;;;;;;:::i;44217:35::-;;;;;;;;;;;;;:::i;62090:267::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62090:267:0;;:::i;37189:767::-;;;;;;;;;;;;;:::i;39831:130::-;;;;;;;;;;;;;:::i;5941:79::-;;;;;;;;;;;;;:::i;49057:137::-;;;;;;;;;;;;;:::i;25684:87::-;;;;;;;;;;;;;:::i;52849:467::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52849:467:0;;;;;;;;;:::i;43305:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43305:33:0;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;43305:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61591:196;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61591:196:0;-1:-1:-1;;;;;61591:196:0;;:::i;51952:278::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51952:278:0;;;;;;;;:::i;63284:68::-;;;;;;;;;;;;;:::i;38711:108::-;;;;;;;;;;;;;:::i;50901:167::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50901:167:0;;;;;;;;:::i;44015:29::-;;;;;;;;;;;;;:::i;40190:125::-;;;;;;;;;;;;;:::i;63364:112::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63364:112:0;;:::i;62772:249::-;;;;;;;;;;;;;:::i;38856:443::-;;;;;;;;;;;;;:::i;36373:25::-;;;;;;;;;;;;;:::i;52238:110::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52238:110:0;-1:-1:-1;;;;;52238:110:0;;:::i;36405:18::-;;;;;;;;;;;;;:::i;36126:35::-;;;;;;;;;;;;;:::i;51076:143::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51076:143:0;;;;;;;;;;:::i;36209:31::-;;;;;;;;;;;;;:::i;44806:95::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44806:95:0;-1:-1:-1;;;;;44806:95:0;;:::i;36253:33::-;;;;;;;;;;;;;:::i;53585:330::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53585:330:0;-1:-1:-1;;;;;53585:330:0;;:::i;6886:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6886:244:0;-1:-1:-1;;;;;6886:244:0;;:::i;53923:472::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53923:472:0;-1:-1:-1;;;;;53923:472:0;;:::i;63159:111::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63159:111:0;-1:-1:-1;;;;;63159:111:0;;:::i;62495:265::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;62584:19;;62580:118:::1;;62646:2;62628:14;:20;;62620:66;;;;-1:-1:-1::0;;;62620:66:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62716:19;:36:::0;62495:265::o;36168:34::-;;;;:::o;25482:83::-;25552:5;25545:12;;;;;;;;-1:-1:-1;;25545:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25519:13;;25545:12;;25552:5;;25545:12;;25552:5;25545:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25482:83;:::o;44265:30::-;;;;:::o;51227:161::-;51302:4;51319:39;51328:12;:10;:12::i;:::-;51342:7;51351:6;51319:8;:39::i;:::-;-1:-1:-1;51376:4:0;51227:161;;;;;:::o;45790:1761::-;45862:7;45911;:5;:7::i;:::-;-1:-1:-1;;;;;45895:23:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;45895:23:0;;:51;;;-1:-1:-1;45938:8:0;;-1:-1:-1;;;;;45938:8:0;45922:12;:10;:12::i;:::-;-1:-1:-1;;;;;45922:24:0;;45895:51;45887:85;;;;;-1:-1:-1;;;45887:85:0;;;;;;;;;;;;-1:-1:-1;;;45887:85:0;;;;;;;;;;;;;;;46002:6;;:13;;46013:1;46002:10;:13::i;:::-;45993:6;:22;46034:16;46030:119;;46082:6;;46090:12;;46072:31;;;;;;;;;;;;;;;;-1:-1:-1;46125:12:0;;46118:19;;46030:119;46169:20;46192:58;46207:1;46193:11;:15;:44;;46226:11;46193:44;;;46212:11;46211:12;;46193:44;46192:56;:58::i;:::-;46313:12;;46169:81;;-1:-1:-1;46261:12:0;;46276:50;;:32;46169:81;43954:14;46276:16;:32::i;:::-;:36;;:50::i;:::-;46261:65;;46337:18;46394:1;46380:11;:15;46376:155;;;46425:24;43954:14;46444:4;46425:18;:24::i;:::-;46412:37;;46376:155;;;46495:24;43954:14;46514:4;46495:18;:24::i;:::-;46482:37;;46376:155;46569:1;46555:11;:15;46551:171;;;46602:12;;:30;;46619:12;46602:16;:30::i;:::-;46587:12;:45;46551:171;;;46680:12;;:30;;46697:12;46680:16;:30::i;:::-;46665:12;:45;46551:171;46836:9;46831:219;46855:9;:16;46851:20;;46831:219;;;46920:1;46896:7;:21;46904:9;46914:1;46904:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46904:12:0;46896:21;;;;;;;;;;;;;:25;46893:146;;;46966:57;43904:1;43954:2;:14;46966:37;46992:10;46966:7;:21;46974:9;46984:1;46974:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46974:12:0;46966:21;;;;;;;;;;;;;;:25;:37::i;:57::-;46942:7;:21;46950:9;46960:1;46950:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46950:12:0;46942:21;;;;;;;;;;;;:81;46893:146;46873:3;;46831:219;;;-1:-1:-1;47085:6:0;;47093:12;;47075:31;;;;;;;;;;;;;;;;47118:6;47113:399;47134:12;:19;47130:23;;47113:399;;;47175:21;47199:12;47212:1;47199:15;;;;;;;;;;;;;;;;;;;;;47233:9;;47199:15;;-1:-1:-1;47233:9:0;;47229:272;;;47290:13;;;47305:6;;;47277:35;;;;;;;47290:13;47277:35;;;;;;-1:-1:-1;;47277:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47277:35:0;;47290:13;;-1:-1:-1;;;;;47290:13:0;;47277:35;;47305:6;;47277:35;;;47305:6;47277:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:35::i;:::-;47263:49;;47336:6;47331:155;;47390:13;;47372:43;;;;;;;;;;;;47390:13;47408:6;;;47372:43;;;47390:13;47372:43;;;;;;-1:-1:-1;;47372:43:0;;;;;;;;;;;47390:13;;-1:-1:-1;;;;;47390:13:0;;47372:43;;;;47408:6;;47372:43;;;;;47408:6;;47372:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47438:28;;;-1:-1:-1;;;47438:28:0;;;;;;;;;;;;-1:-1:-1;;;47438:28:0;;;;;;;;;;;;;;47331:155;47229:272;;-1:-1:-1;47155:3:0;;47113:399;;;;47531:12;;47524:19;;;;;45790:1761;;;;:::o;36293:28::-;;;;:::o;47777:260::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;47912:116:::1;::::0;;::::1;::::0;::::1;::::0;;47948:4:::1;47912:116:::0;;;-1:-1:-1;;;;;47912:116:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;47894:12:::1;:135:::0;;;;::::1;::::0;;-1:-1:-1;47894:135:0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;;-1:-1:-1::0;;;;;;47894:135:0;::::1;;-1:-1:-1::0;;47894:135:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;47912:116;;47894:135;;::::1;::::0;;;;;;;::::1;::::0;::::1;:::i;:::-;;;;47777:260:::0;;:::o;52356:87::-;52425:10;;52356:87;:::o;61375:208::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;61465:15:::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;61465:15:0::1;:29:::0;61457:73:::1;;;::::0;;-1:-1:-1;;;61457:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;61541:15;:34:::0;;-1:-1:-1;;;;;61541:34:0;;::::1;;;-1:-1:-1::0;;;;;;61541:34:0;;::::1;::::0;;;::::1;::::0;;61375:208::o;52451:390::-;52503:14;52520:12;:10;:12::i;:::-;-1:-1:-1;;;;;52552:19:0;;;;;;:11;:19;;;;;;52503:29;;-1:-1:-1;52552:19:0;;52551:20;52543:77;;;;-1:-1:-1;;;52543:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52632:15;52655:33;52666:7;52675:12;;52655:10;:33::i;:::-;-1:-1:-1;;;;;;;;;52717:15:0;;;;;;:7;:15;;;;;;52631:57;;-1:-1:-1;52717:28:0;;52631:57;52717:19;:28::i;:::-;-1:-1:-1;;;;;52699:15:0;;;;;;:7;:15;;;;;:46;52766:7;;:20;;52778:7;52766:11;:20::i;:::-;52756:7;:30;52810:10;;:23;;52825:7;52810:14;:23::i;:::-;52797:10;:36;-1:-1:-1;;;52451:390:0:o;35747:75::-;;;;;;-1:-1:-1;;;;;35747:75:0;;:::o;36328:32::-;;;;:::o;45678:100::-;45758:12;;45678:100;:::o;44913:287::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;45025:14:::1;;45042:8;45025:25;45005:15;:46;;44997:103;;;;-1:-1:-1::0;;;44997:103:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45113:12;:26:::0;45177:15:::1;45160:14;:32:::0;44913:287::o;51396:313::-;51494:4;51511:36;51521:6;51529:9;51540:6;51511:9;:36::i;:::-;51558:121;51567:6;51575:12;:10;:12::i;:::-;51589:89;51627:6;51589:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51589:19:0;;;;;;:11;:19;;;;;;51609:12;:10;:12::i;:::-;-1:-1:-1;;;;;51589:33:0;;;;;;;;;;;;-1:-1:-1;51589:33:0;;;:89;:37;:89::i;:::-;51558:8;:121::i;:::-;-1:-1:-1;51697:4:0;51396:313;;;;;:::o;40013:125::-;40094:13;;40088:42;;;-1:-1:-1;;;40088:42:0;;40061:7;40088:42;;;;;;;;40061:7;;-1:-1:-1;;;;;40094:13:0;;40088:30;;:42;;;;;;;;;;;;;;;40094:13;40088:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40088:42:0;;-1:-1:-1;40013:125:0;:::o;43981:27::-;;;;:::o;44137:35::-;;;;:::o;53324:253::-;53390:7;53429;;53418;:18;;53410:73;;;;-1:-1:-1;;;53410:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53494:19;53517:10;:8;:10::i;:::-;53494:33;-1:-1:-1;53545:24:0;:7;53494:33;53545:11;:24::i;:::-;53538:31;53324:253;-1:-1:-1;;;53324:253:0:o;26409:83::-;26475:9;;;;26409:83;:::o;44093:37::-;;;;:::o;51717:227::-;51814:4;51831:83;51840:12;:10;:12::i;:::-;51854:7;51863:50;51902:10;51863:11;:25;51875:12;:10;:12::i;:::-;-1:-1:-1;;;;;51863:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;51863:25:0;;;:34;;;;;;;;;;;:38;:50::i;44057:23::-;;;-1:-1:-1;;;;;44057:23:0;;:::o;34828:91::-;34884:27;34890:12;:10;:12::i;:::-;34904:6;34884:5;:27::i;:::-;34828:91;:::o;44179:31::-;;;;:::o;48189:325::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;48297:12:::1;:19:::0;48289:27;::::1;48281:59;;;::::0;;-1:-1:-1;;;48281:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48281:59:0;;;;;;;;;;;;;::::1;;48365:12;:19:::0;-1:-1:-1;;48365:23:0;48357:31;::::1;48353:123;;;48427:12;48440:19:::0;;-1:-1:-1;;48440:23:0;;;48427:37;::::1;;;;;;;;;;;;;;;48405:12;48418:5;48405:19;;;;;;;;;::::0;;;::::1;::::0;;;:59;;:19:::1;::::0;;::::1;::::0;;::::1;:59:::0;;-1:-1:-1;;48405:59:0::1;;::::0;;::::1;;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;;;;;48405:59:0;;::::1;;::::0;;;::::1;-1:-1:-1::0;;;;;48405:59:0::1;::::0;::::1;;::::0;;-1:-1:-1;48405:59:0;;::::1;::::0;;:19;;:59:::1;::::0;;;::::1;::::0;;;;::::1;;::::0;;::::1;-1:-1:-1::0;;48405:59:0;;;::::1;;;:::i;:::-;-1:-1:-1::0;;;48353:123:0::1;48488:12;:18;;;;;;;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;48488:18:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;48488:18:0;;;;::::1;;::::0;::::1;::::0;::::1;:::i;:::-;;;;;48189:325:::0;:::o;35829:28::-;;;-1:-1:-1;;;;;35829:28:0;;:::o;39336:443::-;39383:7;39403:21;39433:13;;;;;;;;;-1:-1:-1;;;;;39433:13:0;-1:-1:-1;;;;;39427:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39427:34:0;;-1:-1:-1;39472:17:0;39492;:15;:17::i;:::-;39472:37;-1:-1:-1;39520:30:0;39553:38;39577:13;39553:19;39472:37;39567:4;39553:13;:19::i;:38::-;39639:13;;39520:71;;-1:-1:-1;39604:22:0;;39629:24;;-1:-1:-1;;;;;39639:13:0;39629:9;:24::i;:::-;39604:49;-1:-1:-1;39664:21:0;39688:52;39735:4;39688:42;39604:49;39707:22;39688:18;:42::i;:52::-;39664:76;-1:-1:-1;;;;;;39336:443:0;:::o;62369:114::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;62446:17:::1;:29:::0;62369:114::o;45212:454::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;45364:15:::1;::::0;:20;45356:58:::1;;;::::0;;-1:-1:-1;;;45356:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;45435:22;:41:::0;;;;45487:20:::1;:37:::0;;;;45535:16:::1;:29:::0;45575:20:::1;:37:::0;45643:15:::1;45625;:33:::0;45212:454::o;35864:31::-;;;-1:-1:-1;;;;;35864:31:0;;:::o;61795:287::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;61891:26;;61887:133:::1;;61967:2;61942:21;:27;;61934:74;;;;-1:-1:-1::0;;;61934:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62030:20;:44:::0;61795:287::o;48696:246::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;48822:12:::1;:19:::0;48814:27;::::1;48806:80;;;;-1:-1:-1::0;;;48806:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48927:7;48897:12;48910:5;48897:19;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:37:::0;;-1:-1:-1;;48897:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;;48696:246:0:o;63033:114::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;63121:18:0::1;;::::0;;;:11:::1;:18;::::0;;;;;;-1:-1:-1;;63099:40:0;::::1;63121:18;::::0;;::::1;63120:19;63099:40;::::0;;63033:114::o;50695:198::-;-1:-1:-1;;;;;50785:20:0;;50761:7;50785:20;;;:11;:20;;;;;;;;50781:49;;;-1:-1:-1;;;;;;50814:16:0;;;;;;:7;:16;;;;;;50807:23;;50781:49;-1:-1:-1;;;;;50868:16:0;;;;;;:7;:16;;;;;;50848:37;;:19;:37::i;6583:148::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;6674:6:::1;::::0;6653:40:::1;::::0;6690:1:::1;::::0;-1:-1:-1;;;;;6674:6:0::1;::::0;6653:40:::1;::::0;6690:1;;6653:40:::1;6704:6;:19:::0;;-1:-1:-1;;;;;;6704:19:0::1;::::0;;6583:148::o;35238:295::-;35315:26;35344:84;35381:6;35344:84;;;;;;;;;;;;;;;;;:32;35354:7;35363:12;:10;:12::i;:::-;35344:9;:32::i;:::-;:36;:84;:36;:84::i;:::-;35315:113;;35441:51;35450:7;35459:12;:10;:12::i;:::-;35473:18;35441:8;:51::i;:::-;35503:22;35509:7;35518:6;35503:5;:22::i;:::-;35238:295;;;:::o;44217:35::-;;;;:::o;62090:267::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;62178:22;;62174:121:::1;;62246:2;62225:17;:23;;62217:66;;;::::0;;-1:-1:-1;;;62217:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;62313:16;:36:::0;62090:267::o;37189:767::-;37270:18;;37245:21;37255:10;37245:9;:21::i;:::-;:43;;37237:89;;;;-1:-1:-1;;;37237:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37379:17;;37363:13;;:33;37345:15;:51;37337:73;;;;;-1:-1:-1;;;37337:73:0;;;;;;;;;;;;-1:-1:-1;;;37337:73:0;;;;;;;;;;;;;;;37437:15;37421:13;:31;37529:23;37555:24;37573:4;37555:9;:24::i;:::-;37529:50;;37590:42;37616:15;37590:25;:42::i;:::-;37728:16;;37684:13;;37678:45;;;-1:-1:-1;;;37678:45:0;;37717:4;37678:45;;;;;;37653:22;;37678:67;;37728:16;;-1:-1:-1;;;;;37684:13:0;;;;37678:30;;:45;;;;;;;;;;;;;;;37684:13;37678:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37678:45:0;;:49;:67::i;:::-;37653:92;;37819:28;37832:14;37819:12;:28::i;:::-;-1:-1:-1;37873:8:0;;37892:19;;37873:39;;;-1:-1:-1;;;37873:39:0;;;;;;;;;;-1:-1:-1;;37873:8:0;;;-1:-1:-1;;;;;37873:8:0;;:18;;:39;;;;;;;;;;;;;;-1:-1:-1;37873:8:0;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37873:39:0;37930:18;;;;;;;;37873:39;;-1:-1:-1;37930:18:0;;;;;;37873:39;37930:18;;;37189:767;;;:::o;39831:130::-;39914:13;;39908:45;;;-1:-1:-1;;;39908:45:0;;39947:4;39908:45;;;;;;39881:7;;-1:-1:-1;;;;;39914:13:0;;39908:30;;:45;;;;;;;;;;;;;;39914:13;39908:45;;;;;;;;;;5941:79;6006:6;;-1:-1:-1;;;;;6006:6:0;5941:79;:::o;49057:137::-;49167:12;:19;49057:137;:::o;25684:87::-;25756:7;25749:14;;;;;;;;-1:-1:-1;;25749:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25723:13;;25749:14;;25756:7;;25749:14;;25756:7;25749:14;;;;;;;;;;;;;;;;;;;;;;;;52849:467;52939:7;52978:12;;52967:7;:23;;52959:67;;;;;-1:-1:-1;;;52959:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53042:17;53037:272;;53077:15;53100:33;53111:7;53120:12;;53100:10;:33::i;:::-;-1:-1:-1;53076:57:0;;-1:-1:-1;53148:14:0;;-1:-1:-1;;;;53148:14:0;53037:272;53197:23;53227:33;53238:7;53247:12;;53227:10;:33::i;:::-;-1:-1:-1;53195:65:0;;-1:-1:-1;53275:22:0;;-1:-1:-1;;;;53275:22:0;43305:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43305:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43305:33:0;;;;-1:-1:-1;;;;;43305:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61591:196::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;61677:13:::1;::::0;-1:-1:-1;;;;;61677:13:0::1;:27:::0;61669:69:::1;;;::::0;;-1:-1:-1;;;61669:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;61749:13;:30:::0;;-1:-1:-1;;;;;;61749:30:0::1;-1:-1:-1::0;;;;;61749:30:0;;;::::1;::::0;;;::::1;::::0;;61591:196::o;51952:278::-;52054:4;52071:129;52080:12;:10;:12::i;:::-;52094:7;52103:96;52142:15;52103:96;;;;;;;;;;;;;;;;;:11;:25;52115:12;:10;:12::i;:::-;-1:-1:-1;;;;;52103:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;52103:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;63284:68::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;63330:6:::1;:14:::0;;-1:-1:-1;;63330:14:0::1;::::0;;63284:68::o;38711:108::-;38760:7;38787:24;38805:4;38787:9;:24::i;:::-;38780:31;;38711:108;:::o;50901:167::-;50979:4;50996:42;51006:12;:10;:12::i;:::-;51020:9;51031:6;50996:9;:42::i;44015:29::-;;;;:::o;40190:125::-;40238:7;40265:42;40289:17;:15;:17::i;:::-;40265:19;:17;:19::i;:::-;:23;;:42::i;63364:112::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;63440:18:::1;:28:::0;63364:112::o;62772:249::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;62847:10:::1;;62828:15;:29;;62820:58;;;::::0;;-1:-1:-1;;;62820:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;62820:58:0;;;;;;;;;;;;;::::1;;62913:13;::::0;62906:46:::1;::::0;;-1:-1:-1;;;62906:46:0;;62946:4:::1;62906:46;::::0;::::1;::::0;;;62889:14:::1;::::0;-1:-1:-1;;;;;62913:13:0::1;::::0;62906:31:::1;::::0;:46;;;;;::::1;::::0;;;;;;;;62913:13;62906:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;62906:46:0;62970:13:::1;::::0;62963:50:::1;::::0;;-1:-1:-1;;;62963:50:0;;62994:10:::1;62963:50;::::0;::::1;::::0;;;;;;;;;62906:46;;-1:-1:-1;;;;;;62970:13:0;;::::1;::::0;62963:30:::1;::::0;:50;;;;;62906:46:::1;::::0;62963:50;;;;;;;;62970:13:::1;::::0;62963:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;38856:443:::0;38903:7;38923:21;38953:13;;;;;;;;;-1:-1:-1;;;;;38953:13:0;-1:-1:-1;;;;;38947:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38947:34:0;;-1:-1:-1;38992:17:0;39012;:15;:17::i;36373:25::-;;;;:::o;52238:110::-;-1:-1:-1;;;;;52320:20:0;52296:4;52320:20;;;:11;:20;;;;;;;;;52238:110::o;36405:18::-;;;;;;:::o;36126:35::-;;;;:::o;51076:143::-;-1:-1:-1;;;;;51184:18:0;;;51157:7;51184:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;51076:143::o;36209:31::-;;;;:::o;44806:95::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;44875:8:::1;:18:::0;;-1:-1:-1;;;;;;44875:18:0::1;-1:-1:-1::0;;;;;44875:18:0;;;::::1;::::0;;;::::1;::::0;;44806:95::o;36253:33::-;;;;:::o;53585:330::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;53665:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;53664:21;53656:61;;;::::0;;-1:-1:-1;;;53656:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;53731:16:0;::::1;53750:1;53731:16:::0;;;:7:::1;:16;::::0;;;;;:20;53728:108:::1;;-1:-1:-1::0;;;;;53807:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;53787:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;53768:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;53728:108:::1;-1:-1:-1::0;;;;;53846:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;53846:27:0::1;53869:4;53846:27:::0;;::::1;::::0;;;53884:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;53884:23:0::1;::::0;;::::1;::::0;;53585:330::o;6886:244::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;6975:22:0;::::1;6967:73;;;;-1:-1:-1::0;;;6967:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7077:6;::::0;7056:38:::1;::::0;-1:-1:-1;;;;;7056:38:0;;::::1;::::0;7077:6:::1;::::0;7056:38:::1;::::0;7077:6:::1;::::0;7056:38:::1;7105:6;:17:::0;;-1:-1:-1;;;;;;7105:17:0::1;-1:-1:-1::0;;;;;7105:17:0;;;::::1;::::0;;;::::1;::::0;;6886:244::o;53923:472::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;54002:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;53994:56;;;::::0;;-1:-1:-1;;;53994:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;54066:9;54061:327;54085:9;:16:::0;54081:20;::::1;54061:327;;;54143:7;-1:-1:-1::0;;;;;54127:23:0::1;:9;54137:1;54127:12;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;54127:12:0::1;:23;54123:254;;;54186:9;54196:16:::0;;-1:-1:-1;;54196:20:0;;;54186:31;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;54171:9:::1;:12:::0;;-1:-1:-1;;;;;54186:31:0;;::::1;::::0;54181:1;;54171:12;::::1;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;54171:46:0::1;-1:-1:-1::0;;;;;54171:46:0;;::::1;;::::0;;54236:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;54275:11:::1;:20:::0;;;;:28;;-1:-1:-1;;54275:28:0::1;::::0;;54322:9:::1;:15:::0;;;::::1;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;54322:15:0;;;;;-1:-1:-1;;;;;;54322:15:0::1;::::0;;;;;54356:5:::1;;54123:254;54103:3;;54061:327;;;;53923:472:::0;:::o;63159:111::-;6163:12;:10;:12::i;:::-;6153:6;;-1:-1:-1;;;;;6153:6:0;;;:22;;;6145:67;;;;;-1:-1:-1;;;6145:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6145:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;63247:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;;;-1:-1:-1;;63228:34:0;::::1;63247:15;::::0;;::::1;63246:16;63228:34;::::0;;63159:111::o;13154:132::-;13212:7;13239:39;13243:1;13246;13239:39;;;;;;;;;;;;;;;;;:3;:39::i;11317:136::-;11375:7;11402:43;11406:1;11409;11402:43;;;;;;;;;;;;;;;;;:3;:43::i;4499:106::-;4587:10;4499:106;:::o;54403:347::-;-1:-1:-1;;;;;54506:19:0;;54498:68;;;;-1:-1:-1;;;54498:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54585:21:0;;54577:68;;;;-1:-1:-1;;;54577:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54658:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;54710:32;;;;;;;;;;;;;;;;;54403:347;;;:::o;10853:181::-;10911:7;10943:5;;;10967:6;;;;10959:46;;;;;-1:-1:-1;;;10959:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3335:171;3391:7;3428:1;3419:5;:10;;3411:55;;;;;-1:-1:-1;;;3411:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3492:5:0;3335:171::o;12207:471::-;12265:7;12510:6;12506:47;;-1:-1:-1;12540:1:0;12533:8;;12506:47;12577:5;;;12581:1;12577;:5;:1;12601:5;;;;;:10;12593:56;;;;-1:-1:-1;;;12593:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49437:1250;49535:4;49557:11;49797:4;49791:11;49925:2;49919:4;49915:13;50572:1;50540:13;50448:4;50442:11;50412;50367:1;50337:11;50308:5;50301;50297:17;49954:691;49944:701;49437:1250;-1:-1:-1;;;;;;49437:1250:0:o;59545:445::-;59625:7;59634;59643;59652;59661;59682:23;59707:12;59723:33;59735:7;59744:11;59723;:33::i;:::-;59681:75;;;;59767:19;59790:10;:8;:10::i;:::-;59767:33;;59812:15;59829:23;59854:12;59870:39;59882:7;59891:4;59897:11;59870;:39::i;:::-;59811:98;;;;-1:-1:-1;59811:98:0;;-1:-1:-1;59960:15:0;;-1:-1:-1;59977:4:0;;-1:-1:-1;59545:445:0;;-1:-1:-1;;;;;;;59545:445:0:o;54758:2375::-;-1:-1:-1;;;;;54865:20:0;;54857:70;;;;-1:-1:-1;;;54857:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54946:23:0;;54938:71;;;;-1:-1:-1;;;54938:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55037:1;55028:6;:10;55020:64;;;;-1:-1:-1;;;55020:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55108:6;;;;:34;;;;-1:-1:-1;;;;;;55118:16:0;;;;;;:8;:16;;;;;;;;:24;;:16;:24;;55108:34;:65;;;;-1:-1:-1;;;;;;55146:19:0;;;;;;:8;:19;;;;;;;;:27;;:19;:27;;55108:65;55105:120;;;55188:37;;;-1:-1:-1;;;55188:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;55105:120;55254:20;;:25;;;;:57;;-1:-1:-1;;;;;;55283:19:0;;;;;;:11;:19;;;;;;;;:28;55254:57;:92;;;;-1:-1:-1;;;;;;55315:22:0;;;;;;:11;:22;;;;;;;;:31;55254:92;55250:310;;;55363:27;55393:32;55404:20;;55393:6;:10;;:32;;;;:::i;:::-;55363:62;;55440:53;55450:6;55466:4;55473:19;55440:9;:53::i;:::-;55517:31;:6;55528:19;55517:10;:31::i;:::-;55508:40;;55250:310;;-1:-1:-1;;;;;55583:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;55607:22:0;;;;;;:11;:22;;;;;;;;55606:23;55583:46;55580:1546;;;55689:15;55663:22;;:41;55660:306;;55743:20;;55733:6;:30;;55725:98;;;;-1:-1:-1;;;55725:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55886:16;;55850:32;55875:6;55850:20;55860:9;55850;:20::i;:32::-;:52;;55842:108;;;;-1:-1:-1;;;55842:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55994:62;56016:6;56024:9;56035:6;56043:12;;55994:21;:62::i;:::-;55580:1546;;;-1:-1:-1;;;;;56093:19:0;;;;;;:11;:19;;;;;;;;56092:20;:46;;;;-1:-1:-1;;;;;;56116:22:0;;;;;;:11;:22;;;;;;;;56092:46;56088:1038;;;56198:15;56172:22;;:41;56169:250;;56234:68;56254:6;56262:9;56273:6;56281:20;;56234:19;:68::i;:::-;56169:250;;;56343:60;56363:6;56371:9;56382:6;56390:12;;56343:19;:60::i;56088:1038::-;-1:-1:-1;;;;;56443:19:0;;;;;;:11;:19;;;;;;;;56442:20;:47;;;;-1:-1:-1;;;;;;56467:22:0;;;;;;:11;:22;;;;;;;;56466:23;56442:47;56438:688;;;56539:15;56514:22;;:40;56506:126;;;;-1:-1:-1;;;56506:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56647:58;56665:6;56673:9;56684:6;56692:12;;56647:17;:58::i;56438:688::-;-1:-1:-1;;;;;56741:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;56764:22:0;;;;;;:11;:22;;;;;;;;56741:45;56737:389;;;56803:51;56825:6;56833:9;56844:6;56852:1;56803:21;:51::i;56737:389::-;56934:15;56909:22;;:40;56901:126;;;;-1:-1:-1;;;56901:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57042:58;57060:6;57068:9;57079:6;57087:12;;57042:17;:58::i;11756:192::-;11842:7;11878:12;11870:6;;;;11862:29;;;;-1:-1:-1;;;11862:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11914:5:0;;;11756:192::o;60611:163::-;60652:7;60673:15;60690;60709:19;:17;:19::i;:::-;60672:56;;-1:-1:-1;60672:56:0;-1:-1:-1;60746:20:0;60672:56;;60746:11;:20::i;:::-;60739:27;;;;60611:163;:::o;31997:418::-;-1:-1:-1;;;;;32081:21:0;;32073:67;;;;-1:-1:-1;;;32073:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32153:49;32174:7;32191:1;32195:6;32153:20;:49::i;:::-;32236:68;32259:6;32236:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32236:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;32215:18:0;;:9;:18;;;;;;;;;;:89;32330:12;;:24;;32347:6;32330:16;:24::i;:::-;32315:12;:39;32370:37;;;;;;;;32396:1;;-1:-1:-1;;;;;32370:37:0;;;;;;;;;;;;31997:418;;:::o;37964:250::-;38069:13;;38044:57;;38062:4;;-1:-1:-1;;;;;38069:13:0;38084:16;38044:9;:57::i;:::-;38127:13;;;;;;;;;-1:-1:-1;;;;;38127:13:0;-1:-1:-1;;;;;38112:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38164:42:0;;;;;;;;;;-1:-1:-1;38164:42:0;;;;;;;-1:-1:-1;38164:42:0;37964:250;:::o;38222:452::-;38311:13;;38334:15;;38305:55;;;-1:-1:-1;;;38305:55:0;;38311:13;38334:15;;;-1:-1:-1;;;;;38334:15:0;;;38305:55;;;;;;;;;;;;38278:14;;38311:13;;;;;38305:28;;:55;;;;;;;;;;;;;;38278:14;38311:13;38305:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38404:15:0;;38608:8;;38385:281;;;-1:-1:-1;;;38385:281:0;;38509:4;38385:281;;;;;;;;;;-1:-1:-1;38385:281:0;;;;;;;;;;;;-1:-1:-1;;;;;38404:15:0;38608:8;;;;;;38385:281;;;;38636:15;38385:281;;;;;;38404:15;;;;;;;;38385:97;;:281;;;;;38305:55;;38385:281;;;;;;;;;;38404:15;38385:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38385:281:0;;38222:452;-1:-1:-1;;38222:452:0:o;13782:278::-;13868:7;13903:12;13896:5;13888:28;;;;-1:-1:-1;;;13888:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13927:9;13943:1;13939;:5;;;;;;;13782:278;-1:-1:-1;;;;;13782:278:0:o;59998:263::-;60079:7;;;60123:35;60152:5;60123:24;:7;60135:11;60123;:24::i;:35::-;60108:50;-1:-1:-1;60169:23:0;60195:17;:7;60108:50;60195:11;:17::i;:::-;60169:43;60248:4;;-1:-1:-1;59998:263:0;;-1:-1:-1;;;;59998:263:0:o;60269:334::-;60364:7;;;;60420:24;:7;60432:11;60420;:24::i;:::-;60402:42;-1:-1:-1;60455:12:0;60470:21;:4;60479:11;60470:8;:21::i;:::-;60455:36;-1:-1:-1;60502:23:0;60528:17;:7;60455:36;60528:11;:17::i;:::-;60564:7;;;;-1:-1:-1;60590:4:0;;-1:-1:-1;60269:334:0;;-1:-1:-1;;;;;60269:334:0:o;58212:543::-;58336:15;58353:23;58378:12;58392:23;58417:12;58433:32;58444:7;58453:11;58433:10;:32::i;:::-;-1:-1:-1;;;;;58494:15:0;;;;;;:7;:15;;;;;;58335:130;;-1:-1:-1;58335:130:0;;-1:-1:-1;58335:130:0;;-1:-1:-1;58335:130:0;-1:-1:-1;58335:130:0;-1:-1:-1;58494:28:0;;58514:7;58494:19;:28::i;:::-;-1:-1:-1;;;;;58476:15:0;;;;;;:7;:15;;;;;;;;:46;;;;58551:7;:15;;;;:28;;58571:7;58551:19;:28::i;:::-;-1:-1:-1;;;;;58533:15:0;;;;;;;:7;:15;;;;;;:46;;;;58611:18;;;;;;;:39;;58634:15;58611:22;:39::i;:::-;-1:-1:-1;;;;;58590:18:0;;;;;;:7;:18;;;;;:60;58664:23;58676:4;58682;58664:11;:23::i;:::-;58720:9;-1:-1:-1;;;;;58703:44:0;58712:6;-1:-1:-1;;;;;58703:44:0;;58731:15;58703:44;;;;;;;;;;;;;;;;;;58212:543;;;;;;;;;:::o;57641:563::-;57763:15;57780:23;57805:12;57819:23;57844:12;57860:32;57871:7;57880:11;57860:10;:32::i;:::-;-1:-1:-1;;;;;57921:15:0;;;;;;:7;:15;;;;;;57762:130;;-1:-1:-1;57762:130:0;;-1:-1:-1;57762:130:0;;-1:-1:-1;57762:130:0;-1:-1:-1;57762:130:0;-1:-1:-1;57921:28:0;;57762:130;57921:19;:28::i;:::-;-1:-1:-1;;;;;57903:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;57981:18;;;;;:7;:18;;;;;:39;;58004:15;57981:22;:39::i;:::-;-1:-1:-1;;;;;57960:18:0;;;;;;:7;:18;;;;;;;;:60;;;;58052:7;:18;;;;:39;;58075:15;58052:22;:39::i;57147:486::-;57267:15;57284:23;57309:12;57323:23;57348:12;57364:32;57375:7;57384:11;57364:10;:32::i;:::-;-1:-1:-1;;;;;57425:15:0;;;;;;:7;:15;;;;;;57266:130;;-1:-1:-1;57266:130:0;;-1:-1:-1;57266:130:0;;-1:-1:-1;57266:130:0;-1:-1:-1;57266:130:0;-1:-1:-1;57425:28:0;;57266:130;57425:19;:28::i;58763:619::-;58887:15;58904:23;58929:12;58943:23;58968:12;58984:32;58995:7;59004:11;58984:10;:32::i;:::-;-1:-1:-1;;;;;59045:15:0;;;;;;:7;:15;;;;;;58886:130;;-1:-1:-1;58886:130:0;;-1:-1:-1;58886:130:0;;-1:-1:-1;58886:130:0;-1:-1:-1;58886:130:0;-1:-1:-1;59045:28:0;;59065:7;59045:19;:28::i;:::-;-1:-1:-1;;;;;59027:15:0;;;;;;:7;:15;;;;;;;;:46;;;;59102:7;:15;;;;:28;;59122:7;59102:19;:28::i;60782:581::-;60879:7;;60915:12;;60832:7;;;;;60944:294;60968:9;:16;60964:20;;60944:294;;;61034:7;61010;:21;61018:9;61028:1;61018:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61018:12:0;61010:21;;;;;;;;;;;;;:31;;:66;;;61069:7;61045;:21;61053:9;61063:1;61053:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61053:12:0;61045:21;;;;;;;;;;;;;:31;61010:66;61006:102;;;61086:7;;61095:12;;61078:30;;;;;;;;;61006:102;61133:34;61145:7;:21;61153:9;61163:1;61153:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61153:12:0;61145:21;;;;;;;;;;;;;61133:7;;:11;:34::i;:::-;61123:44;;61192:34;61204:7;:21;61212:9;61222:1;61212:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61212:12:0;61204:21;;;;;;;;;;;;;61192:7;;:11;:34::i;:::-;61182:44;-1:-1:-1;60986:3:0;;60944:294;;;-1:-1:-1;61274:12:0;;61262:7;;:25;;:11;:25::i;:::-;61252:7;:35;61248:71;;;61297:7;;61306:12;;61289:30;;;;;;;;61248:71;61338:7;;-1:-1:-1;61347:7:0;-1:-1:-1;60782:581:0;;;:::o;59390:147::-;59468:7;;:17;;59480:4;59468:11;:17::i;:::-;59458:7;:27;59509:10;;:20;;59524:4;59509:14;:20::i;:::-;59496:10;:33;-1:-1:-1;;59390:147:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://5a4113688629cce553186bc0dfec333e5412f0a6c53c9b6d270be5968be509a0
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.