Token Soldier

Overview ERC20

Price
$0.00 @ 0.000000 AVAX
Fully Diluted Market Cap
Total Supply:
1,130,000 SLD

Holders:
5,628 addresses

Transfers:
-

Contract:
0xad7476c49d3f82a144f4836aacb9b069c188b7590xad7476c49D3f82a144f4836aACb9b069c188b759

Decimals:
18

Social Profiles:
Not Available, Update ?

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x595d6a0c96d994b2642647c9d373b45d0c84f942

Contract Name:
Soldier

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 1000 runs

Other Settings:
byzantium EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-10
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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 TKNaper 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 untouTKNd) 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 untouTKNd) 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 untouTKNd) 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 untouTKNd) 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;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this;
        return msg.data;
    }
}

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
    );
}

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    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;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 this function is
     * overridden;
     *
     * 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 virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account)
        public
        view
        virtual
        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:
     *
     * - `account` 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 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 {}
}

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;
    }
}

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;
        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
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (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
     *
     * 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");

        (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");

        (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.4._
     */
    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.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library SafeERC20 {
    using Address for address;

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

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

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

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

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

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

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

contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(
        IERC20 indexed token,
        address to,
        uint256 amount
    );
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(
            payees.length == shares_.length,
            "PaymentSplitter: payees and shares length mismatch"
        );
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account)
        public
        view
        returns (uint256)
    {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(
            account,
            totalReceived,
            released(account)
        );

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) +
            totalReleased(token);
        uint256 payment = _pendingPayment(
            account,
            totalReceived,
            released(token, account)
        );

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return
            (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(
            account != address(0),
            "PaymentSplitter: account is the zero address"
        );
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(
            _shares[account] == 0,
            "PaymentSplitter: account already has shares"
        );

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key)
        public
        view
        returns (int256)
    {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index)
        public
        view
        returns (address)
    {
        return map.keys[index];
    }

    function size(Map storage map) public view returns (uint256) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint256 val
    ) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

contract NODERewardManagement is Ownable {
    using SafeMath for uint256;
    using IterableMapping for IterableMapping.Map;

    struct NodeEntity {
        string name;
        uint256 creationTime;
        uint256 lastClaimTime;
        uint256 rewardAvailable;
    }

    IterableMapping.Map private nodeOwners;
    mapping(address => NodeEntity[]) private _nodesOfUser;

    uint256 public nodePrice;
    uint256 public rewardPerNode;
    uint256 public claimTime;

    bool public autoDistri = true;
    bool public distribution = false;

    uint256 public gasForDistribution = 300000;
    uint256 public lastDistributionCount = 0;
    uint256 public lastIndexProcessed = 0;

    uint256 public totalNodesCreated = 0;
    uint256 public totalRewardStaked = 0;

    constructor(uint256 _nodePrice, uint256 _rewardPerNode, uint256 _claimTime) {
        nodePrice = _nodePrice * 10**18;
        rewardPerNode = _rewardPerNode * 10**18;
        claimTime = _claimTime;
    }

    function distributeRewards() private returns (uint256, uint256, uint256) {
        distribution = true;
        uint256 numberOfnodeOwners = nodeOwners.size();
        require(numberOfnodeOwners > 0, "DISTRI REWARDS: NO NODE OWNERS");

        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();
        uint256 localLastIndex = lastIndexProcessed;
        uint256 iterations = 0;
        uint256 newClaimTime = block.timestamp;
        uint256 claims = 0;
        NodeEntity[] storage nodes;
        NodeEntity storage _node;

        while (gasUsed < gasForDistribution && iterations < numberOfnodeOwners) {
            localLastIndex++;
            if (localLastIndex >= nodeOwners.size()) {
                localLastIndex = 0;
            }
            nodes = _nodesOfUser[nodeOwners.getKeyAtIndex(localLastIndex)];
            uint256 nodesCount = nodes.length;
            for (uint256 i = 0; i < nodesCount; i++) {
                _node = nodes[i];
                if (claimable(_node)) {
                    _node.rewardAvailable += rewardPerNode;
                    _node.lastClaimTime = newClaimTime;
                    totalRewardStaked += rewardPerNode;
                    claims++;
                }
            }
            iterations++;

            uint256 newGasLeft = gasleft();
            gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            gasLeft = newGasLeft;
        }

        lastIndexProcessed = localLastIndex;
        distribution = false;
        return (iterations, claims, lastIndexProcessed);
    }

    function createNode(address account, string memory nodeName) external {
        require(
            isNameAvailable(account, nodeName),
            "CREATE NODE: Name not available"
        );
        _nodesOfUser[account].push(
            NodeEntity({
                name: nodeName,
                creationTime: block.timestamp,
                lastClaimTime: block.timestamp,
                rewardAvailable: 0
            })
        );
        nodeOwners.set(account, _nodesOfUser[account].length);
        totalNodesCreated++;
        if (autoDistri && !distribution) {
            distributeRewards();
        }
    }

    function isNameAvailable(address account, string memory nodeName)
        private
        view
        returns (bool)
    {
        NodeEntity[] memory nodes = _nodesOfUser[account];
        for (uint256 i = 0; i < nodes.length; i++) {
            if (keccak256(bytes(nodes[i].name)) == keccak256(bytes(nodeName))) {
                return false;
            }
        }
        return true;
    }

    function _burn(uint256 index) internal {
        require(index < nodeOwners.size());
        nodeOwners.remove(nodeOwners.getKeyAtIndex(index));
    }

    function _getNodeWithCreatime(
        NodeEntity[] storage nodes,
        uint256 _creationTime
    ) private view returns (NodeEntity storage) {
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to cash-out"
        );
        int256 index = binary_search(nodes, 0, numberOfNodes, _creationTime);
        require(index >= 0, "NODE SEARCH: No NODE Found with this blocktime");
        return nodes[uint256(index)];
    }

    function binary_search(
        NodeEntity[] memory arr,
        uint256 low,
        uint256 high,
        uint256 x
    ) private view returns (int256) {
        if (high >= low) {
            uint256 mid = (high + low).div(2);
            if (arr[mid].creationTime == x) {
                return int256(mid);
            } else if (arr[mid].creationTime > x) {
                return binary_search(arr, low, mid - 1, x);
            } else {
                return binary_search(arr, mid + 1, high, x);
            }
        } else {
            return -1;
        }
    }

    function _cashoutNodeReward(address account, uint256 _creationTime) external onlyOwner returns (uint256) {
        require(_creationTime > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;
        require(numberOfNodes > 0, "CASHOUT ERROR: You don't have nodes to cash-out");
        NodeEntity storage node = _getNodeWithCreatime(nodes, _creationTime);
        uint256 rewardNode = node.rewardAvailable;
        node.rewardAvailable = 0;
        return rewardNode;
    }

    function _cashoutAllNodesReward(address account) external onlyOwner returns (uint256){
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        require(nodesCount > 0, "CASHOUT ERROR: You don't have nodes to cash-out");
        uint256 rewardsTotal = 0;
        for (uint256 i = 0; i < nodesCount; i++) {
            NodeEntity storage _node = nodes[i];
            rewardsTotal += _node.rewardAvailable;
            _node.rewardAvailable = 0;
        }
        return rewardsTotal;
    }

    function claimable(NodeEntity memory node) private view returns (bool) {
        return node.lastClaimTime + claimTime <= block.timestamp;
    }

    function _getRewardAmountOf(address account) external view returns (uint256) {
        require(isNodeOwner(account), "GET REWARD OF: NO NODE OWNER");
        uint256 nodesCount;
        uint256 rewardCount = 0;

        NodeEntity[] storage nodes = _nodesOfUser[account];
        nodesCount = nodes.length;

        for (uint256 i = 0; i < nodesCount; i++) {
            rewardCount += nodes[i].rewardAvailable;
        }

        return rewardCount;
    }

    function _getRewardAmountOf(address account, uint256 _creationTime) external view returns (uint256) {
        require(isNodeOwner(account), "GET REWARD OF: NO NODE OWNER");

        require(_creationTime > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity[] storage nodes = _nodesOfUser[account];
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to cash-out"
        );
        NodeEntity storage node = _getNodeWithCreatime(nodes, _creationTime);
        uint256 rewardNode = node.rewardAvailable;
        return rewardNode;
    }

    function _getNodeRewardAmountOf(address account, uint256 creationTime) external view returns (uint256) {
        return _getNodeWithCreatime(_nodesOfUser[account], creationTime).rewardAvailable;
    }

    function _getNodesNames(address account) external view returns (string memory) {
        require(isNodeOwner(account), "GET NAMES: NO NODE OWNER");
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory names = nodes[0].name;
        string memory separator = "#";
        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];
            names = string(abi.encodePacked(names, separator, _node.name));
        }
        return names;
    }

    function _getNodesCreationTime(address account) external view returns (string memory) {
        require(isNodeOwner(account), "GET CREATIME: NO NODE OWNER");
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory _creationTimes = uint2str(nodes[0].creationTime);
        string memory separator = "#";

        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];

            _creationTimes = string(
                abi.encodePacked(
                    _creationTimes,
                    separator,
                    uint2str(_node.creationTime)
                )
            );
        }
        return _creationTimes;
    }

    function _getNodesRewardAvailable(address account) external view returns (string memory) {
        if(isNodeOwner(account)) {
            NodeEntity[] memory nodes = _nodesOfUser[account];
            uint256 nodesCount = nodes.length;
            NodeEntity memory _node;
            string memory _rewardsAvailable = uint2str(nodes[0].rewardAvailable);
            string memory separator = "#";

            for (uint256 i = 1; i < nodesCount; i++) {
                _node = nodes[i];

                _rewardsAvailable = string(
                    abi.encodePacked(
                        _rewardsAvailable,
                        separator,
                        uint2str(_node.rewardAvailable)
                    )
                );
            }
            return _rewardsAvailable;
        } else {
            return "";
        }
    }

    function _getNodesLastClaimTime(address account) external view returns (string memory) {
        if(isNodeOwner(account)) {
            NodeEntity[] memory nodes = _nodesOfUser[account];
            uint256 nodesCount = nodes.length;
            NodeEntity memory _node;
            string memory _lastClaimTimes = uint2str(nodes[0].lastClaimTime);
            string memory separator = "#";

            for (uint256 i = 1; i < nodesCount; i++) {
                _node = nodes[i];

                _lastClaimTimes = string(
                    abi.encodePacked(
                        _lastClaimTimes,
                        separator,
                        uint2str(_node.lastClaimTime)
                    )
                );
            }
            return _lastClaimTimes;
        } else {
            return "";
        }
    }

    function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    function _changeNodePrice(uint256 newNodePrice) onlyOwner external {
        nodePrice = newNodePrice;
    }

    function _changeRewardPerNode(uint256 newPrice) onlyOwner external {
        rewardPerNode = newPrice;
    }

    function _changeClaimTime(uint256 newTime) onlyOwner external {
        claimTime = newTime;
    }

    function _changeAutoDistri(bool newMode) onlyOwner external {
        autoDistri = newMode;
    }

    function _changeGasDistri(uint256 newGasDistri) onlyOwner external {
        gasForDistribution = newGasDistri;
    }

    function _getNodeNumberOf(address account) public view returns (uint256) {
        return nodeOwners.get(account);
    }

    function isNodeOwner(address account) private view returns (bool) {
        return nodeOwners.get(account) > 0;
    }

    function _isNodeOwner(address account) external view returns (bool) {
        return isNodeOwner(account);
    }

    function _distributeRewards() external returns (uint256, uint256,uint256) {
        return distributeRewards();
    }
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WAVAX() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

contract Soldier is ERC20, Ownable, PaymentSplitter {
    using SafeMath for uint256;

    NODERewardManagement public nodeRewardManagement;

    IUniswapV2Router02 public uniswapV2Router;

    address public uniswapV2Pair;
    address public futurUsePool;
    address public distributionPool;

    uint256 public rewardsFee;
    uint256 public liquidityPoolFee;
    uint256 public futurFee;
    uint256 public totalFees;

    uint256 public cashoutFee;

    uint256 private rwSwap;
    bool private swapping = false;
    bool private swapLiquify = false;
    uint256 public swapTokensAmount;

    uint256 public antiWhale = 75000;

    mapping(address => bool) public _isBlacklisted;
    mapping(address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event LiquidityWalletUpdated(
        address indexed newLiquidityWallet,
        address indexed oldLiquidityWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    // Anti Whale
    function _beforeTokenTransfer(address from, address, uint256 amount) internal view override {
        require(amount <= antiWhale*10**18 || !automatedMarketMakerPairs[from], "You are not permitted to transfer more than 100,000 tokens");
    }

    constructor(
        address[] memory payees,
        uint256[] memory shares,
        address[] memory addresses,
        uint256[] memory balances,
        uint256 swapAmount,
        address nodeManager,
        address uniV2Router
    ) ERC20("Soldier", "SLD") PaymentSplitter(payees, shares) {
        nodeRewardManagement = NODERewardManagement(nodeManager);
        futurUsePool = addresses[1];
        distributionPool = addresses[2];
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(uniV2Router);
        uniswapV2Router = _uniswapV2Router;

        totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee);
        for (uint256 i = 0; i < addresses.length; i++) {
            _mint(addresses[i], balances[i] * (10**18));
        }
        swapTokensAmount = swapAmount * (10**18);
    }

    function setDefaultFees(uint256[] memory fees) public onlyOwner {
        futurFee = fees[0];
        rewardsFee = fees[1];
        liquidityPoolFee = fees[2];
        cashoutFee = fees[3];
        rwSwap = fees[4];
    }

    function setTokenPair() public onlyOwner {
        require(uniswapV2Pair == address(0), "You can only set pair once !");
        address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WAVAX());
        uniswapV2Pair = _uniswapV2Pair;
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
        address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WAVAX());
        uniswapV2Pair = _uniswapV2Pair;
    }

    function updateSwapTokensAmount(uint256 newVal) external onlyOwner {
        swapTokensAmount = newVal;
    }

    function updateFuturWall(address payable wall) external onlyOwner {
        futurUsePool = wall;
    }

    function updateRewardsWall(address payable wall) external onlyOwner {
        distributionPool = wall;
    }

    function updateRewardsFee(uint256 value) external onlyOwner {
        rewardsFee = value;
        totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee);
    }

    function updateLiquiditFee(uint256 value) external onlyOwner {
        liquidityPoolFee = value;
        totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee);
    }

    function updateFuturFee(uint256 value) external onlyOwner {
        futurFee = value;
        totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee);
    }

    function updateCashoutFee(uint256 value) external onlyOwner {
        cashoutFee = value;
    }

    function updateRwSwapFee(uint256 value) external onlyOwner {
        rwSwap = value;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair,"TKN: The PancakeSwap pair cannot be moddified");
        _setAutomatedMarketMakerPair(pair, value);
    }

    function blacklistMalicious(address account, bool value) external onlyOwner {
        _isBlacklisted[account] = value;
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function _transfer(address from, address to, uint256 amount) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(!_isBlacklisted[from] && !_isBlacklisted[to],"Blacklisted address");
        super._transfer(from, to, amount);
    }

    function swapAndSendToFee(address destination, uint256 tokens) private {
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(tokens);
        uint256 received = (address(this).balance).sub(initialETHBalance);
        payable(destination).transfer(received);
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);

        uint256 initialBalance = address(this).balance;

        swapTokensForEth(half);

        uint256 received = address(this).balance.sub(initialBalance);

        addLiquidity(otherHalf, received);

        emit SwapAndLiquify(half, received, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WAVAX();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            address(0),
            block.timestamp
        );
    }

    function createNodeWithTokens(string memory name) public {
        require(bytes(name).length > 3 && bytes(name).length < 32, "NODE CREATION: NAME SIZE INVALID");
        address sender = _msgSender();
        require(sender != address(0), "NODE CREATION:  creation from the zero address");
        require(!_isBlacklisted[sender], "NODE CREATION: Blacklisted address");
        require(sender != futurUsePool && sender != distributionPool, "NODE CREATION: futur and rewardsPool cannot create node");
        uint256 nodePrice = nodeRewardManagement.nodePrice();
        require(balanceOf(sender) >= nodePrice, "NODE CREATION: Balance too low for creation.");
        uint256 contractTokenBalance = balanceOf(address(this));
        bool swapAmountOk = contractTokenBalance >= swapTokensAmount;
        if (
            swapAmountOk &&
            swapLiquify &&
            !swapping &&
            sender != owner() &&
            !automatedMarketMakerPairs[sender]
        ) {
            swapping = true;

            uint256 futurTokens = contractTokenBalance.mul(futurFee).div(100);

            swapAndSendToFee(futurUsePool, futurTokens);

            uint256 rewardsPoolTokens = contractTokenBalance.mul(rewardsFee).div(100);

            uint256 rewardsTokenstoSwap = rewardsPoolTokens.mul(rwSwap).div(100);

            swapAndSendToFee(distributionPool, rewardsTokenstoSwap);
            super._transfer(address(this), distributionPool, rewardsPoolTokens.sub(rewardsTokenstoSwap));

            uint256 swapTokens = contractTokenBalance.mul(liquidityPoolFee).div(100);

            swapAndLiquify(swapTokens);

            swapTokensForEth(balanceOf(address(this)));

            swapping = false;
        }
        super._transfer(sender, address(this), nodePrice);
        nodeRewardManagement.createNode(sender, name);
    }

    function cashoutReward(uint256 blocktime) public {
        address sender = _msgSender();
        require(sender != address(0), "CSHT:  creation from the zero address");
        require(!_isBlacklisted[sender], "MANIA CSHT: Blacklisted address");
        require(sender != futurUsePool && sender != distributionPool, "CSHT: futur and rewardsPool cannot cashout rewards");
        uint256 rewardAmount = nodeRewardManagement._cashoutNodeReward(sender, blocktime);
        require(rewardAmount > 0, "CSHT: You don't have enough reward to cash out");

        if (swapLiquify) {
            uint256 feeAmount;
            if (cashoutFee > 0) {
                feeAmount = rewardAmount.mul(cashoutFee).div(100);
                swapAndSendToFee(futurUsePool, feeAmount);
            }
            rewardAmount -= feeAmount;
        }
        super._transfer(distributionPool, sender, rewardAmount);
    }

    function cashoutAll() public {
        address sender = _msgSender();
        require(sender != address(0), "MANIA CSHT:  creation from the zero address");
        require(!_isBlacklisted[sender], "MANIA CSHT: Blacklisted address");
        require(sender != futurUsePool && sender != distributionPool, "MANIA CSHT: futur and rewardsPool cannot cashout rewards");
        uint256 rewardAmount = nodeRewardManagement._cashoutAllNodesReward(sender);
        require(rewardAmount > 0,"MANIA CSHT: You don't have enough reward to cash out");
        if (swapLiquify) {
            uint256 feeAmount;
            if (cashoutFee > 0) {
                feeAmount = rewardAmount.mul(cashoutFee).div(100);
                swapAndSendToFee(futurUsePool, feeAmount);
            }
            rewardAmount -= feeAmount;
        }
        super._transfer(distributionPool, sender, rewardAmount);
    }

    function changeSwapLiquify(bool newVal) public onlyOwner {
        swapLiquify = newVal;
    }

    function getNodeNumberOf(address account) public view returns (uint256) {
        return nodeRewardManagement._getNodeNumberOf(account);
    }

    function getRewardAmountOf(address account) public view returns (uint256){
        return nodeRewardManagement._getRewardAmountOf(account);
    }
    
    function changeNodePrice(uint256 newNodePrice) public onlyOwner {
        nodeRewardManagement._changeNodePrice(newNodePrice);
    }

    function getNodePrice() public view returns (uint256) {
        return nodeRewardManagement.nodePrice();
    }

    function changeRewardPerNode(uint256 newPrice) public onlyOwner {
        nodeRewardManagement._changeRewardPerNode(newPrice);
    }

    function getRewardPerNode() public view returns (uint256) {
        return nodeRewardManagement.rewardPerNode();
    }

    function changeClaimTime(uint256 newTime) public onlyOwner {
        nodeRewardManagement._changeClaimTime(newTime);
    }

    function getClaimTime() public view returns (uint256) {
        return nodeRewardManagement.claimTime();
    }

    function changeAutoDistri(bool newMode) public onlyOwner {
        nodeRewardManagement._changeAutoDistri(newMode);
    }

    function getAutoDistri() public view returns (bool) {
        return nodeRewardManagement.autoDistri();
    }

    function changeGasDistri(uint256 newGasDistri) public onlyOwner {
        nodeRewardManagement._changeGasDistri(newGasDistri);
    }

    function changeAntiWhale(uint256 newAntiWhale) public onlyOwner {
        antiWhale = newAntiWhale;
    }

    function getGasDistri() public view returns (uint256) {
        return nodeRewardManagement.gasForDistribution();
    }

    function getDistriCount() public view returns (uint256) {
        return nodeRewardManagement.lastDistributionCount();
    }

    function getNodesNames() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(nodeRewardManagement._isNodeOwner(_msgSender()), "NO NODE OWNER");
        return nodeRewardManagement._getNodesNames(_msgSender());
    }

    function getNodesCreatime() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(nodeRewardManagement._isNodeOwner(_msgSender()), "NO NODE OWNER");
        return nodeRewardManagement._getNodesCreationTime(_msgSender());
    }

    function getNodesRewards() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(nodeRewardManagement._isNodeOwner(_msgSender()), "NO NODE OWNER");
        return nodeRewardManagement._getNodesRewardAvailable(_msgSender());
    }

    function getNodesLastClaims() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(nodeRewardManagement._isNodeOwner(_msgSender()), "NO NODE OWNER");
        return nodeRewardManagement._getNodesLastClaimTime(_msgSender());
    }

    function distributeRewards() public onlyOwner returns (uint256, uint256, uint256) {
        return nodeRewardManagement._distributeRewards();
    }

    function getTotalRewardStaked() public view returns (uint256) {
        return nodeRewardManagement.totalRewardStaked();
    }

    function getTotalNodesCreated() public view returns (uint256) {
        return nodeRewardManagement.totalNodesCreated();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"address","name":"nodeManager","type":"address"},{"internalType":"address","name":"uniV2Router","type":"address"}],"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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","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":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiWhale","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistMalicious","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cashoutAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cashoutFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"cashoutReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAntiWhale","type":"uint256"}],"name":"changeAntiWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newMode","type":"bool"}],"name":"changeAutoDistri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"changeClaimTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newGasDistri","type":"uint256"}],"name":"changeGasDistri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNodePrice","type":"uint256"}],"name":"changeNodePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"changeRewardPerNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newVal","type":"bool"}],"name":"changeSwapLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createNodeWithTokens","outputs":[],"stateMutability":"nonpayable","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":[],"name":"distributeRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"futurFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"futurUsePool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAutoDistri","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDistriCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGasDistri","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getNodeNumberOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesCreatime","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesLastClaims","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesRewards","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getRewardAmountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardPerNode","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalNodesCreated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalRewardStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"liquidityPoolFee","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":"nodeRewardManagement","outputs":[{"internalType":"contract NODERewardManagement","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"fees","type":"uint256[]"}],"name":"setDefaultFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setTokenPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateCashoutFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateFuturFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateFuturWall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateLiquiditFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateRewardsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateRewardsWall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateRwSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"updateSwapTokensAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526018805461ffff19169055620124f8601a553480156200002357600080fd5b5060405162005f6738038062005f678339810160408190526200004691620009c9565b86866040518060400160405280600781526020017f536f6c64696572000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f534c4400000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000cc92919062000828565b508051620000e290600490602084019062000828565b505050600062000100620004c8640100000000026401000000009004565b60058054600160a060020a031916600160a060020a038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350805182511462000195576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018c9062000bb6565b60405180910390fd5b6000825111620001d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018c9062000c70565b60005b825181101562000292576200027d8382815181106200021e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183838151811062000260577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151620004cc640100000000026401000000009004565b80620002898162000e03565b915050620001d6565b5050600d8054600160a060020a031916600160a060020a03851617905550845185906001908110620002ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151601060006101000a815481600160a060020a030219169083600160a060020a031602179055508460028151811062000356577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810291909101015160118054600160a060020a0319908116600160a060020a0393841617909155600e80549091169183169190911790556014546013546012548392620003d0929091620003bb916401000000006200064c8102620034671704565b90640100000000620034676200064c82021704565b60155560005b8651811015620004a1576200048c8782815181106200041e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015187838151811062000460577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151670de0b6b3a76400006200047d919062000d8b565b640100000000620006a1810204565b80620004988162000e03565b915050620003d6565b50620004b684670de0b6b3a764000062000d8b565b6019555062000e7f9650505050505050565b3390565b600160a060020a0382166200050f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018c9062000ac5565b600081116200054c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018c9062000ca7565b600160a060020a038216600090815260086020526040902054156200059f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018c9062000c13565b600a8054600181019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8018054600160a060020a031916600160a060020a03841690811790915560009081526008602052604090208190556006546200060990829062000d70565b6006556040517f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac9062000640908490849062000aac565b60405180910390a15050565b6000806200065b838562000d70565b9050838110156200069a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018c9062000b22565b9392505050565b600160a060020a038216620006e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018c9062000cde565b620006fb60008383640100000000620007ab810204565b600254620007189082640100000000620034676200064c82021704565b600255600160a060020a0382166000908152602081905260409020546200074e9082640100000000620034676200064c82021704565b600160a060020a0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906200079f90859062000d15565b60405180910390a35050565b601a54620007c290670de0b6b3a764000062000d8b565b81111580620007ea5750600160a060020a0383166000908152601c602052604090205460ff16155b62000823576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018c9062000b59565b505050565b828054620008369062000dad565b90600052602060002090601f0160209004810192826200085a5760008555620008a5565b82601f106200087557805160ff1916838001178555620008a5565b82800160010185558215620008a5579182015b82811115620008a557825182559160200191906001019062000888565b50620008b3929150620008b7565b5090565b5b80821115620008b35760008155600101620008b8565b8051600160a060020a0381168114620008e657600080fd5b919050565b600082601f830112620008fc578081fd5b81516020620009156200090f8362000d4a565b62000d1e565b828152818101908583018385028701840188101562000932578586fd5b855b858110156200095b576200094882620008ce565b8452928401929084019060010162000934565b5090979650505050505050565b600082601f83011262000979578081fd5b815160206200098c6200090f8362000d4a565b8281528181019085830183850287018401881015620009a9578586fd5b855b858110156200095b57815184529284019290840190600101620009ab565b600080600080600080600060e0888a031215620009e4578283fd5b87516001604060020a0380821115620009fb578485fd5b62000a098b838c01620008eb565b985060208a015191508082111562000a1f578485fd5b62000a2d8b838c0162000968565b975060408a015191508082111562000a43578485fd5b62000a518b838c01620008eb565b965060608a015191508082111562000a67578485fd5b5062000a768a828b0162000968565b9450506080880151925062000a8e60a08901620008ce565b915062000a9e60c08901620008ce565b905092959891949750929550565b600160a060020a03929092168252602082015260400190565b6020808252602c908201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060408201527f7a65726f20616464726573730000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252603a908201527f596f7520617265206e6f74207065726d697474656420746f207472616e73666560408201527f72206d6f7265207468616e203130302c30303020746f6b656e73000000000000606082015260800190565b60208082526032908201527f5061796d656e7453706c69747465723a2070617965657320616e64207368617260408201527f6573206c656e677468206d69736d617463680000000000000000000000000000606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960408201527f2068617320736861726573000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604082015260600190565b6020808252601d908201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b6040518181016001604060020a038111828210171562000d425762000d4262000e50565b604052919050565b60006001604060020a0382111562000d665762000d6662000e50565b5060209081020190565b6000821982111562000d865762000d8662000e21565b500190565b600081600019048311821515161562000da85762000da862000e21565b500290565b60028104600182168062000dc257607f821691505b6020821081141562000dfd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060001982141562000e1a5762000e1a62000e21565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6150d88062000e8f6000396000f3fe60806040526004361061050d576000357c010000000000000000000000000000000000000000000000000000000090048063715018a6116102b1578063ab5747611161017b578063da41b333116100f3578063f2fde38b116100a7578063f74c99341161008c578063f74c993414610d49578063f7b9f94314610d69578063f9afc76314610d7e57610554565b8063f2fde38b14610d14578063f5a0725614610d3457610554565b8063dd62ed3e116100d8578063dd62ed3e14610cca578063e33b7de314610cea578063ee1afdbf14610cff57610554565b8063da41b33314610ca0578063db3ad6b514610cb557610554565b8063c5ca7d6d1161014a578063d0f774741161012f578063d0f7747414610c40578063d79779b214610c60578063d892934214610c8057610554565b8063c5ca7d6d14610c0b578063ce7c2ac214610c2057610554565b8063ab57476114610ba1578063b62496f514610bb6578063b96392c114610bd6578063bdf24a5314610bf657610554565b80638f0ba4ca116102295780639c82751c116101dd578063a5021a17116101c2578063a5021a1714610b57578063a538ddf214610b6c578063a9059cbb14610b8157610554565b80639c82751c14610b17578063a457c2d714610b3757610554565b806395d89b411161020e57806395d89b4114610ac25780639852595c14610ad75780639a7a23d614610af757610554565b80638f0ba4ca14610a825780639349c47d14610aa257610554565b8063823349b3116102805780638b83209b116102655780638b83209b14610a2d5780638bc9c7b014610a4d5780638da5cb5b14610a6d57610554565b8063823349b3146109f857806388c41d7c14610a0d57610554565b8063715018a61461098357806375aa4ad9146109985780637b770392146109b85780638013858b146109d857610554565b806348b75044116103f25780635f1c31821161036a578063697e2f8e1161031e5780636f4a2cd0116103035780636f4a2cd01461091f578063709c6b8b1461094357806370a082311461096357610554565b8063697e2f8e146108f55780636d9ae0be1461090a57610554565b806365bfe4301161034f57806365bfe430146108955780636770474b146108b55780636815a91c146108d557610554565b80635f1c31821461086057806365b8dbc01461087557610554565b806354557973116103c1578063583bd7a6116103a6578063583bd7a61461080b57806359640ed91461082b5780635b0d46741461084b57610554565b806354557973146107e157806354f12f1f146107f657610554565b806348b750441461078257806349bd5a5e146107a25780634dacf3f5146107b75780634dc9b819146107cc57610554565b80631cdd3be3116104855780633950935111610454578063406072a911610439578063406072a91461072d57806342bc9fca1461074d57806347a0ed501461076d57610554565b806339509351146106f85780633a98ef391461071857610554565b80631cdd3be31461068157806323b872dd146106a15780632bb14e1d146106c1578063313ce567146106d657610554565b806313114a9d116104dc5780631694505e116104c15780631694505e1461062a57806318160ddd1461064c578063191655871461066157610554565b806313114a9d146105f3578063138a634a1461061557610554565b806306fdde0314610559578063084a6bff14610584578063095ea7b3146105a65780630c08f300146105d357610554565b36610554577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061053b610d93565b3460405161054a92919061430e565b60405180910390a1005b600080fd5b34801561056557600080fd5b5061056e610d97565b60405161057b91906143a9565b60405180910390f35b34801561059057600080fd5b506105a461059f366004614252565b610e29565b005b3480156105b257600080fd5b506105c66105c1366004614053565b610e91565b60405161057b919061439e565b3480156105df57600080fd5b506105a46105ee366004613f76565b610eaf565b3480156105ff57600080fd5b50610608610f16565b60405161057b9190614ddc565b34801561062157600080fd5b5061056e610f1c565b34801561063657600080fd5b5061063f6110bc565b60405161057b91906142fa565b34801561065857600080fd5b506106086110cb565b34801561066d57600080fd5b506105a461067c366004613f76565b6110d1565b34801561068d57600080fd5b506105c661069c366004613f76565b6111e6565b3480156106ad57600080fd5b506105c66106bc366004613fe6565b6111fb565b3480156106cd57600080fd5b50610608611283565b3480156106e257600080fd5b506106eb611289565b60405161057b9190614e6b565b34801561070457600080fd5b506105c6610713366004614053565b61128e565b34801561072457600080fd5b506106086112dc565b34801561073957600080fd5b5061060861074836600461415d565b6112e2565b34801561075957600080fd5b506105a4610768366004614252565b61130d565b34801561077957600080fd5b506105a461135f565b34801561078e57600080fd5b506105a461079d36600461415d565b6115cd565b3480156107ae57600080fd5b5061063f6117a2565b3480156107c357600080fd5b506106086117b1565b3480156107d857600080fd5b506106086117b7565b3480156107ed57600080fd5b506105a461184d565b34801561080257600080fd5b50610608611a47565b34801561081757600080fd5b506105a4610826366004614125565b611a4d565b34801561083757600080fd5b506105a4610846366004614252565b611a9f565b34801561085757600080fd5b5061056e611b55565b34801561086c57600080fd5b50610608611c64565b34801561088157600080fd5b506105a4610890366004613f76565b611c6a565b3480156108a157600080fd5b506105a46108b0366004614252565b611f06565b3480156108c157600080fd5b506105a46108d0366004614252565b6120fd565b3480156108e157600080fd5b506105a46108f0366004614252565b61213a565b34801561090157600080fd5b5061063f612177565b34801561091657600080fd5b50610608612186565b34801561092b57600080fd5b5061093461218c565b60405161057b93929190614e55565b34801561094f57600080fd5b506105a461095e366004614252565b612278565b34801561096f57600080fd5b5061060861097e366004613f76565b6122b5565b34801561098f57600080fd5b506105a46122d0565b3480156109a457600080fd5b506105a46109b336600461407e565b61235f565b3480156109c457600080fd5b506105a46109d3366004614252565b6124a8565b3480156109e457600080fd5b506105a46109f3366004614252565b612529565b348015610a0457600080fd5b506106086125aa565b348015610a1957600080fd5b506105a4610a28366004614252565b612608565b348015610a3957600080fd5b5061063f610a48366004614252565b61265a565b348015610a5957600080fd5b506105a4610a68366004614252565b61269f565b348015610a7957600080fd5b5061063f6126dc565b348015610a8e57600080fd5b506105a4610a9d36600461416f565b6126eb565b348015610aae57600080fd5b506105a4610abd366004613f76565b612aaa565b348015610ace57600080fd5b5061056e612b11565b348015610ae357600080fd5b50610608610af2366004613f76565b612b20565b348015610b0357600080fd5b506105a4610b12366004614026565b612b3b565b348015610b2357600080fd5b506105a4610b32366004614252565b612bae565b348015610b4357600080fd5b506105c6610b52366004614053565b612c2f565b348015610b6357600080fd5b50610608612c97565b348015610b7857600080fd5b5061063f612cf5565b348015610b8d57600080fd5b506105c6610b9c366004614053565b612d04565b348015610bad57600080fd5b50610608612d18565b348015610bc257600080fd5b506105c6610bd1366004613f76565b612d1e565b348015610be257600080fd5b50610608610bf1366004613f76565b612d33565b348015610c0257600080fd5b5061056e612dcd565b348015610c1757600080fd5b5061063f612edc565b348015610c2c57600080fd5b50610608610c3b366004613f76565b612eeb565b348015610c4c57600080fd5b506105a4610c5b366004614125565b612f06565b348015610c6c57600080fd5b50610608610c7b366004613f76565b612f87565b348015610c8c57600080fd5b506105a4610c9b366004614026565b612fa2565b348015610cac57600080fd5b50610608613005565b348015610cc157600080fd5b50610608613063565b348015610cd657600080fd5b50610608610ce5366004613fae565b6130c1565b348015610cf657600080fd5b506106086130ec565b348015610d0b57600080fd5b5061056e6130f2565b348015610d2057600080fd5b506105a4610d2f366004613f76565b613201565b348015610d4057600080fd5b506106086132cb565b348015610d5557600080fd5b50610608610d64366004613f76565b613329565b348015610d7557600080fd5b50610608613373565b348015610d8a57600080fd5b506105c66133d1565b3390565b606060038054610da690614f70565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd290614f70565b8015610e1f5780601f10610df457610100808354040283529160200191610e1f565b820191906000526020600020905b815481529060010190602001808311610e0257829003601f168201915b5050505050905090565b610e31610d93565b600554600160a060020a03908116911614610e6a5760405160e560020a62461bcd028152600401610e6190614b42565b60405180910390fd5b6012819055601454601354610e8b9190610e85908490613467565b90613467565b60155550565b6000610ea5610e9e610d93565b8484613499565b5060015b92915050565b610eb7610d93565b600554600160a060020a03908116911614610ee75760405160e560020a62461bcd028152600401610e6190614b42565b6010805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60155481565b60606000610f28610d93565b600160a060020a03161415610f525760405160e560020a62461bcd028152600401610e6190614667565b600d54600160a060020a03166341ac82b0610f6b610d93565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610fa391906142fa565b60206040518083038186803b158015610fbb57600080fd5b505afa158015610fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff39190614141565b6110125760405160e560020a62461bcd028152600401610e6190614476565b600d54600160a060020a031663334de3a261102b610d93565b6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161106391906142fa565b60006040518083038186803b15801561107b57600080fd5b505afa15801561108f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110b791908101906141e8565b905090565b600e54600160a060020a031681565b60025490565b600160a060020a0381166000908152600860205260409020546111095760405160e560020a62461bcd028152600401610e619061469e565b60006111136130ec565b61111e903031614ecb565b90506000611135838361113086612b20565b613553565b9050806111575760405160e560020a62461bcd028152600401610e61906147ec565b600160a060020a0383166000908152600960205260408120805483929061117f908490614ecb565b9250508190555080600760008282546111989190614ecb565b909155506111a890508382613599565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516111d992919061430e565b60405180910390a1505050565b601b6020526000908152604090205460ff1681565b600061120884848461363c565b61127884611214610d93565b6112738560405180606001604052806028815260200161505660289139600160a060020a038a16600090815260016020526040812090611252610d93565b600160a060020a0316815260208101919091526040016000205491906136fa565b613499565b5060015b9392505050565b60125481565b601290565b6000610ea561129b610d93565b8461127385600160006112ac610d93565b600160a060020a03908116825260208083019390935260409182016000908120918c168152925290205490613467565b60065490565b600160a060020a039182166000908152600c6020908152604080832093909416825291909152205490565b611315610d93565b600554600160a060020a039081169116146113455760405160e560020a62461bcd028152600401610e6190614b42565b6013819055601454601254610e8b9190610e859084613467565b611367610d93565b600554600160a060020a039081169116146113975760405160e560020a62461bcd028152600401610e6190614b42565b600f54600160a060020a0316156113c35760405160e560020a62461bcd028152600401610e6190614630565b600e54604080517fc45a01550000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163c45a0155916004808301926020929190829003018186803b15801561142157600080fd5b505afa158015611435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114599190613f92565b600160a060020a031663c9c6539630600e60009054906101000a9004600160a060020a0316600160a060020a03166373b295c26040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156114d257600080fd5b505afa1580156114e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150a9190613f92565b6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611543929190614327565b602060405180830381600087803b15801561155d57600080fd5b505af1158015611571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115959190613f92565b600f805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03831617905590506115ca816001613737565b50565b600160a060020a0381166000908152600860205260409020546116055760405160e560020a62461bcd028152600401610e619061469e565b600061161083612f87565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038516906370a08231906116559030906004016142fa565b60206040518083038186803b15801561166d57600080fd5b505afa158015611681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a5919061426a565b6116af9190614ecb565b905060006116c2838361113087876112e2565b9050806116e45760405160e560020a62461bcd028152600401610e61906147ec565b600160a060020a038085166000908152600c602090815260408083209387168352929052908120805483929061171b908490614ecb565b9091555050600160a060020a0384166000908152600b602052604081208054839290611748908490614ecb565b90915550611759905084848361378b565b83600160a060020a03167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a848360405161179492919061430e565b60405180910390a250505050565b600f54600160a060020a031681565b601a5481565b600d54604080517f8a327eaa0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691638a327eaa916004808301926020929190829003018186803b15801561181557600080fd5b505afa158015611829573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b7919061426a565b6000611857610d93565b9050600160a060020a0381166118825760405160e560020a62461bcd028152600401610e6190614cc5565b600160a060020a0381166000908152601b602052604090205460ff16156118be5760405160e560020a62461bcd028152600401610e6190614849565b601054600160a060020a038281169116148015906118ea5750601154600160a060020a03828116911614155b6119095760405160e560020a62461bcd028152600401610e6190614a2b565b600d546040517f5c298b1c000000000000000000000000000000000000000000000000000000008152600091600160a060020a031690635c298b1c906119539085906004016142fa565b602060405180830381600087803b15801561196d57600080fd5b505af1158015611981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a5919061426a565b9050600081116119ca5760405160e560020a62461bcd028152600401610e6190614d7f565b601854610100900460ff1615611a2c5760165460009015611a1e57611a0560646119ff6016548561382a90919063ffffffff16565b90613872565b601054909150611a1e90600160a060020a0316826138b4565b611a288183614f29565b9150505b601154611a4390600160a060020a03168383613905565b5050565b60135481565b611a55610d93565b600554600160a060020a03908116911614611a855760405160e560020a62461bcd028152600401610e6190614b42565b601880549115156101000261ff0019909216919091179055565b611aa7610d93565b600554600160a060020a03908116911614611ad75760405160e560020a62461bcd028152600401610e6190614b42565b600d546040517fef9bb988000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063ef9bb98890611b20908490600401614ddc565b600060405180830381600087803b158015611b3a57600080fd5b505af1158015611b4e573d6000803e3d6000fd5b5050505050565b60606000611b61610d93565b600160a060020a03161415611b8b5760405160e560020a62461bcd028152600401610e6190614667565b600d54600160a060020a03166341ac82b0611ba4610d93565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611bdc91906142fa565b60206040518083038186803b158015611bf457600080fd5b505afa158015611c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2c9190614141565b611c4b5760405160e560020a62461bcd028152600401610e6190614476565b600d54600160a060020a0316634a389fae61102b610d93565b60195481565b611c72610d93565b600554600160a060020a03908116911614611ca25760405160e560020a62461bcd028152600401610e6190614b42565b600e54604051600160a060020a03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600e805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038381169190911791829055604080517fc45a015500000000000000000000000000000000000000000000000000000000815290516000939092169163c45a015591600480820192602092909190829003018186803b158015611d6157600080fd5b505afa158015611d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d999190613f92565b600160a060020a031663c9c6539630600e60009054906101000a9004600160a060020a0316600160a060020a03166373b295c26040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611e1257600080fd5b505afa158015611e26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4a9190613f92565b6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611e83929190614327565b602060405180830381600087803b158015611e9d57600080fd5b505af1158015611eb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed59190613f92565b600f805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555050565b6000611f10610d93565b9050600160a060020a038116611f3b5760405160e560020a62461bcd028152600401610e61906145d3565b600160a060020a0381166000908152601b602052604090205460ff1615611f775760405160e560020a62461bcd028152600401610e6190614849565b601054600160a060020a03828116911614801590611fa35750601154600160a060020a03828116911614155b611fc25760405160e560020a62461bcd028152600401610e61906143bc565b600d546040517f6edb7002000000000000000000000000000000000000000000000000000000008152600091600160a060020a031690636edb70029061200e908590879060040161430e565b602060405180830381600087803b15801561202857600080fd5b505af115801561203c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612060919061426a565b9050600081116120855760405160e560020a62461bcd028152600401610e6190614758565b601854610100900460ff16156120e157601654600090156120d3576120ba60646119ff6016548561382a90919063ffffffff16565b6010549091506120d390600160a060020a0316826138b4565b6120dd8183614f29565b9150505b6011546120f890600160a060020a03168383613905565b505050565b612105610d93565b600554600160a060020a039081169116146121355760405160e560020a62461bcd028152600401610e6190614b42565b601955565b612142610d93565b600554600160a060020a039081169116146121725760405160e560020a62461bcd028152600401610e6190614b42565b601655565b600d54600160a060020a031681565b60165481565b6000806000612199610d93565b600554600160a060020a039081169116146121c95760405160e560020a62461bcd028152600401610e6190614b42565b600d60009054906101000a9004600160a060020a0316600160a060020a03166388fe65536040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401606060405180830381600087803b15801561223557600080fd5b505af1158015612249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226d9190614282565b925092509250909192565b612280610d93565b600554600160a060020a039081169116146122b05760405160e560020a62461bcd028152600401610e6190614b42565b601a55565b600160a060020a031660009081526020819052604090205490565b6122d8610d93565b600554600160a060020a039081169116146123085760405160e560020a62461bcd028152600401610e6190614b42565b600554604051600091600160a060020a0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36005805473ffffffffffffffffffffffffffffffffffffffff19169055565b612367610d93565b600554600160a060020a039081169116146123975760405160e560020a62461bcd028152600401610e6190614b42565b806000815181106123bf57600080516020615036833981519152600052603260045260246000fd5b6020026020010151601481905550806001815181106123f557600080516020615036833981519152600052603260045260246000fd5b60200260200101516012819055508060028151811061242b57600080516020615036833981519152600052603260045260246000fd5b60200260200101516013819055508060038151811061246157600080516020615036833981519152600052603260045260246000fd5b60200260200101516016819055508060048151811061249757600080516020615036833981519152600052603260045260246000fd5b602002602001015160178190555050565b6124b0610d93565b600554600160a060020a039081169116146124e05760405160e560020a62461bcd028152600401610e6190614b42565b600d546040517fc6faedc8000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063c6faedc890611b20908490600401614ddc565b612531610d93565b600554600160a060020a039081169116146125615760405160e560020a62461bcd028152600401610e6190614b42565b600d546040517fcece91eb000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063cece91eb90611b20908490600401614ddc565b600d54604080517fb8527aef0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163b8527aef916004808301926020929190829003018186803b15801561181557600080fd5b612610610d93565b600554600160a060020a039081169116146126405760405160e560020a62461bcd028152600401610e6190614b42565b6014819055601354601254610e8b918391610e8591613467565b6000600a828154811061268457600080516020615036833981519152600052603260045260246000fd5b600091825260209091200154600160a060020a031692915050565b6126a7610d93565b600554600160a060020a039081169116146126d75760405160e560020a62461bcd028152600401610e6190614b42565b601755565b600554600160a060020a031690565b600381511180156126fd575060208151105b61271c5760405160e560020a62461bcd028152600401610e61906144ad565b6000612726610d93565b9050600160a060020a0381166127515760405160e560020a62461bcd028152600401610e6190614a88565b600160a060020a0381166000908152601b602052604090205460ff161561278d5760405160e560020a62461bcd028152600401610e61906149ce565b601054600160a060020a038281169116148015906127b95750601154600160a060020a03828116911614155b6127d85760405160e560020a62461bcd028152600401610e6190614971565b600d54604080517ff1fec2b80000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163f1fec2b8916004808301926020929190829003018186803b15801561283657600080fd5b505afa15801561284a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286e919061426a565b90508061287a836122b5565b101561289b5760405160e560020a62461bcd028152600401610e61906148dd565b60006128a6306122b5565b601954909150811080159081906128c45750601854610100900460ff165b80156128d3575060185460ff16155b80156128f857506128e26126dc565b600160a060020a031684600160a060020a031614155b801561291d5750600160a060020a0384166000908152601c602052604090205460ff16155b15612a1b576018805460ff19166001179055601454600090612947906064906119ff90869061382a565b60105490915061296090600160a060020a0316826138b4565b600061297c60646119ff6012548761382a90919063ffffffff16565b9050600061299a60646119ff6017548561382a90919063ffffffff16565b6011549091506129b390600160a060020a0316826138b4565b6011546129d4903090600160a060020a03166129cf8585613a20565b613905565b60006129f060646119ff6013548961382a90919063ffffffff16565b90506129fb81613a62565b612a0c612a07306122b5565b613ae5565b50506018805460ff1916905550505b612a26843085613905565b600d546040517f12b8603f000000000000000000000000000000000000000000000000000000008152600160a060020a03909116906312b8603f90612a719087908990600401614341565b600060405180830381600087803b158015612a8b57600080fd5b505af1158015612a9f573d6000803e3d6000fd5b505050505050505050565b612ab2610d93565b600554600160a060020a03908116911614612ae25760405160e560020a62461bcd028152600401610e6190614b42565b6011805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b606060048054610da690614f70565b600160a060020a031660009081526009602052604090205490565b612b43610d93565b600554600160a060020a03908116911614612b735760405160e560020a62461bcd028152600401610e6190614b42565b600f54600160a060020a0383811691161415612ba45760405160e560020a62461bcd028152600401610e6190614d22565b611a438282613737565b612bb6610d93565b600554600160a060020a03908116911614612be65760405160e560020a62461bcd028152600401610e6190614b42565b600d546040517fd1871a89000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063d1871a8990611b20908490600401614ddc565b6000610ea5612c3c610d93565b846112738560405180606001604052806025815260200161507e6025913960016000612c66610d93565b600160a060020a03908116825260208083019390935260409182016000908120918d168152925290205491906136fa565b600d54604080517ff1fec2b80000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163f1fec2b8916004808301926020929190829003018186803b15801561181557600080fd5b601054600160a060020a031681565b6000610ea5612d11610d93565b848461363c565b60145481565b601c6020526000908152604090205460ff1681565b600d546040517f619a635e000000000000000000000000000000000000000000000000000000008152600091600160a060020a03169063619a635e90612d7d9085906004016142fa565b60206040518083038186803b158015612d9557600080fd5b505afa158015612da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea9919061426a565b60606000612dd9610d93565b600160a060020a03161415612e035760405160e560020a62461bcd028152600401610e6190614667565b600d54600160a060020a03166341ac82b0612e1c610d93565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612e5491906142fa565b60206040518083038186803b158015612e6c57600080fd5b505afa158015612e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea49190614141565b612ec35760405160e560020a62461bcd028152600401610e6190614476565b600d54600160a060020a031663c92819ce61102b610d93565b601154600160a060020a031681565b600160a060020a031660009081526008602052604090205490565b612f0e610d93565b600554600160a060020a03908116911614612f3e5760405160e560020a62461bcd028152600401610e6190614b42565b600d546040517fdab0882a000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063dab0882a90611b2090849060040161439e565b600160a060020a03166000908152600b602052604090205490565b612faa610d93565b600554600160a060020a03908116911614612fda5760405160e560020a62461bcd028152600401610e6190614b42565b600160a060020a03919091166000908152601b60205260409020805460ff1916911515919091179055565b600d54604080517ffb10d6fb0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163fb10d6fb916004808301926020929190829003018186803b15801561181557600080fd5b600d54604080517f613ff46f0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163613ff46f916004808301926020929190829003018186803b15801561181557600080fd5b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b60075490565b606060006130fe610d93565b600160a060020a031614156131285760405160e560020a62461bcd028152600401610e6190614667565b600d54600160a060020a03166341ac82b0613141610d93565b6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161317991906142fa565b60206040518083038186803b15801561319157600080fd5b505afa1580156131a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131c99190614141565b6131e85760405160e560020a62461bcd028152600401610e6190614476565b600d54600160a060020a0316635759fb0261102b610d93565b613209610d93565b600554600160a060020a039081169116146132395760405160e560020a62461bcd028152600401610e6190614b42565b600160a060020a0381166132625760405160e560020a62461bcd028152600401610e61906144e2565b600554604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600d54604080517f27b3bf110000000000000000000000000000000000000000000000000000000081529051600092600160a060020a0316916327b3bf11916004808301926020929190829003018186803b15801561181557600080fd5b600d546040517f4491a7e4000000000000000000000000000000000000000000000000000000008152600091600160a060020a031690634491a7e490612d7d9085906004016142fa565b600d54604080517fdec147260000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163dec14726916004808301926020929190829003018186803b15801561181557600080fd5b600d54604080517f85c44d9d0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a0316916385c44d9d916004808301926020929190829003018186803b15801561342f57600080fd5b505afa158015613443573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b79190614141565b6000806134748385614ecb565b90508381101561127c5760405160e560020a62461bcd028152600401610e619061459c565b600160a060020a0383166134c25760405160e560020a62461bcd028152600401610e6190614bd4565b600160a060020a0382166134eb5760405160e560020a62461bcd028152600401610e619061453f565b600160a060020a0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590613546908590614ddc565b60405180910390a3505050565b600654600160a060020a0384166000908152600860205260408120549091839161357d9086614f0a565b6135879190614ee3565b6135919190614f29565b949350505050565b30318111156135bd5760405160e560020a62461bcd028152600401610e61906147b5565b600082600160a060020a0316826040516135d6906142f7565b60006040518083038185875af1925050503d8060008114613613576040519150601f19603f3d011682016040523d82523d6000602084013e613618565b606091505b50509050806120f85760405160e560020a62461bcd028152600401610e61906146fb565b600160a060020a0383166136655760405160e560020a62461bcd028152600401610e6190614b77565b600160a060020a03821661368e5760405160e560020a62461bcd028152600401610e6190614419565b600160a060020a0383166000908152601b602052604090205460ff161580156136d05750600160a060020a0382166000908152601b602052604090205460ff16155b6136ef5760405160e560020a62461bcd028152600401610e619061493a565b6120f8838383613905565b600081848411156137215760405160e560020a62461bcd028152600401610e6191906143a9565b50600061372e8486614f29565b95945050505050565b600160a060020a0382166000818152601c6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6120f88363a9059cbb7c01000000000000000000000000000000000000000000000000000000000284846040516024016137c692919061430e565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613caa565b60008261383957506000610ea9565b60006138458385614f0a565b9050826138528583614ee3565b1461127c5760405160e560020a62461bcd028152600401610e6190614ae5565b600061127c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d3c565b30316138bf82613ae5565b60006138cc303183613a20565b604051909150600160a060020a0385169082156108fc029083906000818181858888f19350505050158015611b4e573d6000803e3d6000fd5b600160a060020a03831661392e5760405160e560020a62461bcd028152600401610e6190614b77565b600160a060020a0382166139575760405160e560020a62461bcd028152600401610e6190614419565b613962838383613d6d565b61399f8160405180606001604052806026815260200161501060269139600160a060020a03861660009081526020819052604090205491906136fa565b600160a060020a0380851660009081526020819052604080822093909355908416815220546139ce9082613467565b600160a060020a0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613546908590614ddc565b600061127c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506136fa565b6000613a6f826002613872565b90506000613a7d8383613a20565b90503031613a8a83613ae5565b6000613a97303183613a20565b9050613aa38382613dc8565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051613ad693929190614e55565b60405180910390a15050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613b2f57600080516020615036833981519152600052603260045260246000fd5b600160a060020a03928316602091820292909201810191909152600e54604080517f73b295c2000000000000000000000000000000000000000000000000000000008152905191909316926373b295c2926004808301939192829003018186803b158015613b9c57600080fd5b505afa158015613bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bd49190613f92565b81600181518110613bfc57600080516020615036833981519152600052603260045260246000fd5b600160a060020a039283166020918202929092010152600e54613c229130911684613499565b600e546040517f791ac947000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063791ac94790613c74908590600090869030904290600401614de5565b600060405180830381600087803b158015613c8e57600080fd5b505af1158015613ca2573d6000803e3d6000fd5b505050505050565b6000613cff826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525085600160a060020a0316613e889092919063ffffffff16565b8051909150156120f85780806020019051810190613d1d9190614141565b6120f85760405160e560020a62461bcd028152600401610e6190614c68565b60008183613d605760405160e560020a62461bcd028152600401610e6191906143a9565b50600061372e8486614ee3565b601a54613d8290670de0b6b3a7640000614f0a565b81111580613da95750600160a060020a0383166000908152601c602052604090205460ff16155b6120f85760405160e560020a62461bcd028152600401610e6190614880565b600e54613de0903090600160a060020a031684613499565b600e546040517ff305d719000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063f305d719908390613e369030908790600090819081904290600401614363565b6060604051808303818588803b158015613e4f57600080fd5b505af1158015613e63573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611b4e9190614282565b6060613591848460008585613e9c85613f34565b613ebb5760405160e560020a62461bcd028152600401610e6190614c31565b60008086600160a060020a03168587604051613ed791906142db565b60006040518083038185875af1925050503d8060008114613f14576040519150601f19603f3d011682016040523d82523d6000602084013e613f19565b606091505b5091509150613f29828286613f3a565b979650505050505050565b3b151590565b60608315613f4957508161127c565b825115613f595782518084602001fd5b8160405160e560020a62461bcd028152600401610e6191906143a9565b600060208284031215613f87578081fd5b813561127c81614fec565b600060208284031215613fa3578081fd5b815161127c81614fec565b60008060408385031215613fc0578081fd5b8235613fcb81614fec565b91506020830135613fdb81614fec565b809150509250929050565b600080600060608486031215613ffa578081fd5b833561400581614fec565b9250602084013561401581614fec565b929592945050506040919091013590565b60008060408385031215614038578182fd5b823561404381614fec565b91506020830135613fdb81615001565b60008060408385031215614065578182fd5b823561407081614fec565b946020939093013593505050565b60006020808385031215614090578182fd5b823567ffffffffffffffff808211156140a7578384fd5b818501915085601f8301126140ba578384fd5b8135818111156140cc576140cc614fcf565b83810291506140dc848301614e79565b8181528481019084860184860187018a10156140f6578788fd5b8795505b838610156141185780358352600195909501949186019186016140fa565b5098975050505050505050565b600060208284031215614136578081fd5b813561127c81615001565b600060208284031215614152578081fd5b815161127c81615001565b60008060408385031215613fc0578182fd5b600060208284031215614180578081fd5b813567ffffffffffffffff811115614196578182fd5b8201601f810184136141a6578182fd5b80356141b96141b482614ea3565b614e79565b8181528560208385010111156141cd578384fd5b81602084016020830137908101602001929092525092915050565b6000602082840312156141f9578081fd5b815167ffffffffffffffff81111561420f578182fd5b8201601f8101841361421f578182fd5b805161422d6141b482614ea3565b818152856020838501011115614241578384fd5b61372e826020830160208601614f40565b600060208284031215614263578081fd5b5035919050565b60006020828403121561427b578081fd5b5051919050565b600080600060608486031215614296578081fd5b8351925060208401519150604084015190509250925092565b600081518084526142c7816020860160208601614f40565b601f01601f19169290920160200192915050565b600082516142ed818460208701614f40565b9190910192915050565b90565b600160a060020a0391909116815260200190565b600160a060020a03929092168252602082015260400190565b600160a060020a0392831681529116602082015260400190565b6000600160a060020a03841682526040602083015261359160408301846142af565b600160a060020a039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b60006020825261127c60208301846142af565b60208082526032908201527f435348543a20667574757220616e642072657761726473506f6f6c2063616e6e60408201527f6f7420636173686f757420726577617264730000000000000000000000000000606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600d908201527f4e4f204e4f4445204f574e455200000000000000000000000000000000000000604082015260600190565b6020808252818101527f4e4f4445204352454154494f4e3a204e414d452053495a4520494e56414c4944604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560408201527f7373000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526025908201527f435348543a20206372656174696f6e2066726f6d20746865207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601c908201527f596f752063616e206f6e6c79207365742070616972206f6e6365202100000000604082015260600190565b60208082526014908201527f53454e4445522043414e2754204245205a45524f000000000000000000000000604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201527f7368617265730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b6020808252602e908201527f435348543a20596f7520646f6e2774206861766520656e6f756768207265776160408201527f726420746f2063617368206f7574000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201527f647565207061796d656e74000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f4d414e494120435348543a20426c61636b6c6973746564206164647265737300604082015260600190565b6020808252603a908201527f596f7520617265206e6f74207065726d697474656420746f207472616e73666560408201527f72206d6f7265207468616e203130302c30303020746f6b656e73000000000000606082015260800190565b6020808252602c908201527f4e4f4445204352454154494f4e3a2042616c616e636520746f6f206c6f77206660408201527f6f72206372656174696f6e2e0000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f426c61636b6c6973746564206164647265737300000000000000000000000000604082015260600190565b60208082526037908201527f4e4f4445204352454154494f4e3a20667574757220616e64207265776172647360408201527f506f6f6c2063616e6e6f7420637265617465206e6f6465000000000000000000606082015260800190565b60208082526022908201527f4e4f4445204352454154494f4e3a20426c61636b6c697374656420616464726560408201527f7373000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526038908201527f4d414e494120435348543a20667574757220616e642072657761726473506f6f60408201527f6c2063616e6e6f7420636173686f757420726577617264730000000000000000606082015260800190565b6020808252602e908201527f4e4f4445204352454154494f4e3a20206372656174696f6e2066726f6d20746860408201527f65207a65726f2061646472657373000000000000000000000000000000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460408201527f7265737300000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b6020808252602b908201527f4d414e494120435348543a20206372656174696f6e2066726f6d20746865207a60408201527f65726f2061646472657373000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f544b4e3a205468652050616e63616b655377617020706169722063616e6e6f7460408201527f206265206d6f6464696669656400000000000000000000000000000000000000606082015260800190565b60208082526034908201527f4d414e494120435348543a20596f7520646f6e2774206861766520656e6f756760408201527f682072657761726420746f2063617368206f7574000000000000000000000000606082015260800190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015614e34578451600160a060020a031683529383019391830191600101614e0f565b5050600160a060020a03969096166060850152505050608001529392505050565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715614e9b57614e9b614fcf565b604052919050565b600067ffffffffffffffff821115614ebd57614ebd614fcf565b50601f01601f191660200190565b60008219821115614ede57614ede614fb2565b500190565b600082614f055760008051602061503683398151915281526012600452602481fd5b500490565b6000816000190483118215151615614f2457614f24614fb2565b500290565b600082821015614f3b57614f3b614fb2565b500390565b60005b83811015614f5b578181015183820152602001614f43565b83811115614f6a576000848401525b50505050565b600281046001821680614f8457607f821691505b60208210811415614fac57600080516020615036833981519152600052602260045260246000fd5b50919050565b600080516020615036833981519152600052601160045260246000fd5b600080516020615036833981519152600052604160045260246000fd5b600160a060020a03811681146115ca57600080fd5b80151581146115ca57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654e487b710000000000000000000000000000000000000000000000000000000045524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206ef7fa29c45c7183802a2a4a3aee1c67ab311580a6efabae207419705d1c9b8164736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000096da4a3674c9965951b138e359fbb7af17d324e300000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d400000000000000000000000000000000000000000000000000000000000000010000000000000000000000009a481e39afc0463e01d7abcfe47f8d6214ace9dc0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000009a481e39afc0463e01d7abcfe47f8d6214ace9dc000000000000000000000000ad92cbfab5d8ba84e8302268ace41e76881388d70000000000000000000000007c50eb9e8173d6054fec3b87da82828cef7f556b00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000113e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

59199:14327:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33992:40;34008:12;:10;:12::i;:::-;34022:9;33992:40;;;;;;;:::i;:::-;;;;;;;;59199:14327;;;;;9138:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62906:166;;;;;;;;;;-1:-1:-1;62906:166:0;;;;;:::i;:::-;;:::i;:::-;;11446:210;;;;;;;;;;-1:-1:-1;11446:210:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;62676:104::-;;;;;;;;;;-1:-1:-1;62676:104:0;;;;;:::i;:::-;;:::i;59609:24::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;71875:290::-;;;;;;;;;;;;;:::i;59350:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10258:108::-;;;;;;;;;;;;;:::i;35810:616::-;;;;;;;;;;-1:-1:-1;35810:616:0;;;;;:::i;:::-;;:::i;59861:46::-;;;;;;;;;;-1:-1:-1;59861:46:0;;;;;:::i;:::-;;:::i;12138:454::-;;;;;;;;;;-1:-1:-1;12138:454:0;;;;;:::i;:::-;;:::i;59509:25::-;;;;;;;;;;;;;:::i;10100:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;13001:300::-;;;;;;;;;;-1:-1:-1;13001:300:0;;;;;:::i;:::-;;:::i;34123:91::-;;;;;;;;;;;;;:::i;35252:167::-;;;;;;;;;;-1:-1:-1;35252:167:0;;;;;:::i;:::-;;:::i;63080:173::-;;;;;;;;;;-1:-1:-1;63080:173:0;;;;;:::i;:::-;;:::i;61798:361::-;;;;;;;;;;;;;:::i;36694:704::-;;;;;;;;;;-1:-1:-1;36694:704:0;;;;;:::i;:::-;;:::i;59400:28::-;;;;;;;;;;;;;:::i;59820:32::-;;;;;;;;;;;;;:::i;73259:128::-;;;;;;;;;;;;;:::i;68993:905::-;;;;;;;;;;;;;:::i;59541:31::-;;;;;;;;;;;;;:::i;69906:96::-;;;;;;;;;;-1:-1:-1;69906:96:0;;;;;:::i;:::-;;:::i;71355:134::-;;;;;;;;;;-1:-1:-1;71355:134:0;;;;;:::i;:::-;;:::i;72481:302::-;;;;;;;;;;;;;:::i;59780:31::-;;;;;;;;;;;;;:::i;62167:382::-;;;;;;;;;;-1:-1:-1;62167:382:0;;;;;:::i;:::-;;:::i;68068:917::-;;;;;;;;;;-1:-1:-1;68068:917:0;;;;;:::i;:::-;;:::i;62557:111::-;;;;;;;;;;-1:-1:-1;62557:111:0;;;;;:::i;:::-;;:::i;63431:97::-;;;;;;;;;;-1:-1:-1;63431:97:0;;;;;:::i;:::-;;:::i;59293:48::-;;;;;;;;;;;;;:::i;59642:25::-;;;;;;;;;;;;;:::i;73102:149::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;71497:107::-;;;;;;;;;;-1:-1:-1;71497:107:0;;;;;:::i;:::-;;:::i;10429:177::-;;;;;;;;;;-1:-1:-1;10429:177:0;;;;;:::i;:::-;;:::i;19468:148::-;;;;;;;;;;;;;:::i;61563:227::-;;;;;;;;;;-1:-1:-1;61563:227:0;;;;;:::i;:::-;;:::i;70583:134::-;;;;;;;;;;-1:-1:-1;70583:134:0;;;;;:::i;:::-;;:::i;70321:::-;;;;;;;;;;-1:-1:-1;70321:134:0;;;;;:::i;:::-;;:::i;73395:128::-;;;;;;;;;;;;;:::i;63261:162::-;;;;;;;;;;-1:-1:-1;63261:162:0;;;;;:::i;:::-;;:::i;35510:100::-;;;;;;;;;;-1:-1:-1;35510:100:0;;;;;:::i;:::-;;:::i;63536:92::-;;;;;;;;;;-1:-1:-1;63536:92:0;;;;;:::i;:::-;;:::i;18826:79::-;;;;;;;;;;;;;:::i;66181:1879::-;;;;;;;;;;-1:-1:-1;66181:1879:0;;;;;:::i;:::-;;:::i;62788:110::-;;;;;;;;;;-1:-1:-1;62788:110:0;;;;;:::i;:::-;;:::i;9357:104::-;;;;;;;;;;;;;:::i;34974:109::-;;;;;;;;;;-1:-1:-1;34974:109:0;;;;;:::i;:::-;;:::i;63636:229::-;;;;;;;;;;-1:-1:-1;63636:229:0;;;;;:::i;:::-;;:::i;70853:124::-;;;;;;;;;;-1:-1:-1;70853:124:0;;;;;:::i;:::-;;:::i;13804:400::-;;;;;;;;;;-1:-1:-1;13804:400:0;;;;;:::i;:::-;;:::i;70463:112::-;;;;;;;;;;;;;:::i;59435:27::-;;;;;;;;;;;;;:::i;10819:216::-;;;;;;;;;;-1:-1:-1;10819:216:0;;;;;:::i;:::-;;:::i;59579:23::-;;;;;;;;;;;;;:::i;59914:57::-;;;;;;;;;;-1:-1:-1;59914:57:0;;;;;:::i;:::-;;:::i;70162:147::-;;;;;;;;;;-1:-1:-1;70162:147:0;;;;;:::i;:::-;;:::i;72173:300::-;;;;;;;;;;;;;:::i;59469:31::-;;;;;;;;;;;;;:::i;34770:105::-;;;;;;;;;;-1:-1:-1;34770:105:0;;;;;:::i;:::-;;:::i;71105:123::-;;;;;;;;;;-1:-1:-1;71105:123:0;;;;;:::i;:::-;;:::i;34560:119::-;;;;;;;;;;-1:-1:-1;34560:119:0;;;;;:::i;:::-;;:::i;63873:126::-;;;;;;;;;;-1:-1:-1;63873:126:0;;;;;:::i;:::-;;:::i;71741:::-;;;;;;;;;;;;;:::i;70725:120::-;;;;;;;;;;;;;:::i;11098:201::-;;;;;;;;;;-1:-1:-1;11098:201:0;;;;;:::i;:::-;;:::i;34308:95::-;;;;;;;;;;;;;:::i;72791:303::-;;;;;;;;;;;;;:::i;19771:281::-;;;;;;;;;;-1:-1:-1;19771:281:0;;;;;:::i;:::-;;:::i;70985:112::-;;;;;;;;;;;;;:::i;70010:144::-;;;;;;;;;;-1:-1:-1;70010:144:0;;;;;:::i;:::-;;:::i;71612:121::-;;;;;;;;;;;;;:::i;71236:111::-;;;;;;;;;;;;;:::i;4920:98::-;5000:10;4920:98;:::o;9138:100::-;9192:13;9225:5;9218:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9138:100;:::o;62906:166::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;;;;;;;;;62977:10:::1;:18:::0;;;63055:8:::1;::::0;63033:16:::1;::::0;63018:46:::1;::::0;63055:8;63018:32:::1;::::0;62990:5;;63018:14:::1;:32::i;:::-;:36:::0;::::1;:46::i;:::-;63006:9;:58:::0;-1:-1:-1;62906:166:0:o;11446:210::-;11565:4;11587:39;11596:12;:10;:12::i;:::-;11610:7;11619:6;11587:8;:39::i;:::-;-1:-1:-1;11644:4:0;11446:210;;;;;:::o;62676:104::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;62753:12:::1;:19:::0;;-1:-1:-1;;62753:19:0::1;-1:-1:-1::0;;;;;62753:19:0;;;::::1;::::0;;;::::1;::::0;;62676:104::o;59609:24::-;;;;:::o;71875:290::-;71921:13;71979:1;71955:12;:10;:12::i;:::-;-1:-1:-1;;;;;71955:26:0;;;71947:59;;;;-1:-1:-1;;;;;71947:59:0;;;;;;;:::i;:::-;72025:20;;-1:-1:-1;;;;;72025:20:0;:33;72059:12;:10;:12::i;:::-;72025:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72017:73;;;;-1:-1:-1;;;;;72017:73:0;;;;;;;:::i;:::-;72108:20;;-1:-1:-1;;;;;72108:20:0;:35;72144:12;:10;:12::i;:::-;72108:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72108:49:0;;;;;;;;;;;;:::i;:::-;72101:56;;71875:290;:::o;59350:41::-;;;-1:-1:-1;;;;;59350:41:0;;:::o;10258:108::-;10346:12;;10258:108;:::o;35810:616::-;-1:-1:-1;;;;;35886:16:0;;35905:1;35886:16;;;:7;:16;;;;;;35878:71;;;;-1:-1:-1;;;;;35878:71:0;;;;;;;:::i;:::-;35962:21;36010:15;:13;:15::i;:::-;35986:39;;35994:4;35986:21;:39;:::i;:::-;35962:63;;36036:15;36054:108;36084:7;36106:13;36134:17;36143:7;36134:8;:17::i;:::-;36054:15;:108::i;:::-;36036:126;-1:-1:-1;36183:12:0;36175:68;;;;-1:-1:-1;;;;;36175:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36256:18:0;;;;;;:9;:18;;;;;:29;;36278:7;;36256:18;:29;;36278:7;;36256:29;:::i;:::-;;;;;;;;36314:7;36296:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;36334:35:0;;-1:-1:-1;36352:7:0;36361;36334:17;:35::i;:::-;36385:33;36401:7;36410;36385:33;;;;;;;:::i;:::-;;;;;;;;35810:616;;;:::o;59861:46::-;;;;;;;;;;;;;;;:::o;12138:454::-;12278:4;12295:36;12305:6;12313:9;12324:6;12295:9;:36::i;:::-;12342:220;12365:6;12386:12;:10;:12::i;:::-;12413:138;12469:6;12413:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12413:19:0;;;;;;:11;:19;;;;;;12433:12;:10;:12::i;:::-;-1:-1:-1;;;;;12413:33:0;;;;;;;;;;;;-1:-1:-1;12413:33:0;;;:138;:37;:138::i;:::-;12342:8;:220::i;:::-;-1:-1:-1;12580:4:0;12138:454;;;;;;:::o;59509:25::-;;;;:::o;10100:93::-;10183:2;10100:93;:::o;13001:300::-;13116:4;13138:133;13161:12;:10;:12::i;:::-;13188:7;13210:50;13249:10;13210:11;:25;13222:12;:10;:12::i;:::-;-1:-1:-1;;;;;13210:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;13210:25:0;;;:34;;;;;;;;;;;:38;:50::i;34123:91::-;34194:12;;34123:91;:::o;35252:167::-;-1:-1:-1;;;;;35381:21:0;;;35349:7;35381:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;35252:167::o;63080:173::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;63152:16:::1;:24:::0;;;63236:8:::1;::::0;63199:10:::1;::::0;:46:::1;::::0;63236:8;63199:32:::1;::::0;63171:5;63199:14:::1;:32::i;61798:361::-:0;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;61858:13:::1;::::0;-1:-1:-1;;;;;61858:13:0::1;:27:::0;61850:68:::1;;;;-1:-1:-1::0;;;;;61850:68:0::1;;;;;;;:::i;:::-;61972:15;::::0;:25:::1;::::0;;;;;;;61929:22:::1;::::0;-1:-1:-1;;;;;61972:15:0::1;::::0;:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61954:55:0::1;;62018:4;62025:15;;;;;;;;;-1:-1:-1::0;;;;;62025:15:0::1;-1:-1:-1::0;;;;;62025:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61954:95;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62060:13;:30:::0;;-1:-1:-1;;62060:30:0::1;-1:-1:-1::0;;;;;62060:30:0;::::1;;::::0;;;-1:-1:-1;62101:50:0::1;62060:30:::0;-1:-1:-1;62101:28:0::1;:50::i;:::-;19108:1;61798:361::o:0;36694:704::-;-1:-1:-1;;;;;36776:16:0;;36795:1;36776:16;;;:7;:16;;;;;;36768:71;;;;-1:-1:-1;;;;;36768:71:0;;;;;;;:::i;:::-;36852:21;36922:20;36936:5;36922:13;:20::i;:::-;36876:30;;;;;-1:-1:-1;;;;;36876:15:0;;;;;:30;;36900:4;;36876:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;;;:::i;:::-;36852:90;;36953:15;36971:115;37001:7;37023:13;37051:24;37060:5;37067:7;37051:8;:24::i;36971:115::-;36953:133;-1:-1:-1;37107:12:0;37099:68;;;;-1:-1:-1;;;;;37099:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37180:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;37214:7;;37180:21;:41;;37214:7;;37180:41;:::i;:::-;;;;-1:-1:-1;;;;;;;37232:26:0;;;;;;:19;:26;;;;;:37;;37262:7;;37232:26;:37;;37262:7;;37232:37;:::i;:::-;;;;-1:-1:-1;37282:47:0;;-1:-1:-1;37305:5:0;37312:7;37321;37282:22;:47::i;:::-;37366:5;-1:-1:-1;;;;;37345:45:0;;37373:7;37382;37345:45;;;;;;;:::i;:::-;;;;;;;;36694:704;;;;:::o;59400:28::-;;;-1:-1:-1;;;;;59400:28:0;;:::o;59820:32::-;;;;:::o;73259:128::-;73339:20;;:40;;;;;;;;73312:7;;-1:-1:-1;;;;;73339:20:0;;:38;;:40;;;;;;;;;;;;;;:20;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;68993:905::-;69033:14;69050:12;:10;:12::i;:::-;69033:29;-1:-1:-1;;;;;;69081:20:0;;69073:76;;;;-1:-1:-1;;;;;69073:76:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;69169:22:0;;;;;;:14;:22;;;;;;;;69168:23;69160:67;;;;-1:-1:-1;;;;;69160:67:0;;;;;;;:::i;:::-;69256:12;;-1:-1:-1;;;;;69246:22:0;;;69256:12;;69246:22;;;;:52;;-1:-1:-1;69282:16:0;;-1:-1:-1;;;;;69272:26:0;;;69282:16;;69272:26;;69246:52;69238:121;;;;-1:-1:-1;;;;;69238:121:0;;;;;;;:::i;:::-;69393:20;;:51;;;;;69370:20;;-1:-1:-1;;;;;69393:20:0;;:43;;:51;;69437:6;;69393:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69370:74;;69478:1;69463:12;:16;69455:80;;;;-1:-1:-1;;;;;69455:80:0;;;;;;;:::i;:::-;69550:11;;;;;;;69546:279;;;69614:10;;69578:17;;69614:14;69610:164;;69661:37;69694:3;69661:28;69678:10;;69661:12;:16;;:28;;;;:::i;:::-;:32;;:37::i;:::-;69734:12;;69649:49;;-1:-1:-1;69717:41:0;;-1:-1:-1;;;;;69734:12:0;69649:49;69717:16;:41::i;:::-;69788:25;69804:9;69788:25;;:::i;:::-;;;69546:279;;69851:16;;69835:55;;-1:-1:-1;;;;;69851:16:0;69869:6;69877:12;69835:15;:55::i;:::-;68993:905;;:::o;59541:31::-;;;;:::o;69906:96::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;69974:11:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;69974:20:0;;::::1;::::0;;;::::1;::::0;;69906:96::o;71355:134::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;71430:20:::1;::::0;:51:::1;::::0;;;;-1:-1:-1;;;;;71430:20:0;;::::1;::::0;:37:::1;::::0;:51:::1;::::0;71468:12;;71430:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;71355:134:::0;:::o;72481:302::-;72529:13;72587:1;72563:12;:10;:12::i;:::-;-1:-1:-1;;;;;72563:26:0;;;72555:59;;;;-1:-1:-1;;;;;72555:59:0;;;;;;;:::i;:::-;72633:20;;-1:-1:-1;;;;;72633:20:0;:33;72667:12;:10;:12::i;:::-;72633:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72625:73;;;;-1:-1:-1;;;;;72625:73:0;;;;;;;:::i;:::-;72716:20;;-1:-1:-1;;;;;72716:20:0;:45;72762:12;:10;:12::i;59780:31::-;;;;:::o;62167:382::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;62293:15:::1;::::0;62251:59:::1;::::0;-1:-1:-1;;;;;62293:15:0;;::::1;::::0;62251:59;::::1;::::0;::::1;::::0;62293:15:::1;::::0;62251:59:::1;62321:15;:48:::0;;-1:-1:-1;;62321:48:0::1;-1:-1:-1::0;;;;;62321:48:0;;::::1;::::0;;;::::1;::::0;;;;62423:25:::1;::::0;;;;;;;-1:-1:-1;;62423:15:0;;::::1;::::0;:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;:15;:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;62405:55:0::1;;62469:4;62476:15;;;;;;;;;-1:-1:-1::0;;;;;62476:15:0::1;-1:-1:-1::0;;;;;62476:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62405:95;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62511:13;:30:::0;;-1:-1:-1;;62511:30:0::1;-1:-1:-1::0;;;;;62511:30:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;62167:382:0:o;68068:917::-;68128:14;68145:12;:10;:12::i;:::-;68128:29;-1:-1:-1;;;;;;68176:20:0;;68168:70;;;;-1:-1:-1;;;;;68168:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;68258:22:0;;;;;;:14;:22;;;;;;;;68257:23;68249:67;;;;-1:-1:-1;;;;;68249:67:0;;;;;;;:::i;:::-;68345:12;;-1:-1:-1;;;;;68335:22:0;;;68345:12;;68335:22;;;;:52;;-1:-1:-1;68371:16:0;;-1:-1:-1;;;;;68361:26:0;;;68371:16;;68361:26;;68335:52;68327:115;;;;-1:-1:-1;;;;;68327:115:0;;;;;;;:::i;:::-;68476:20;;:58;;;;;68453:20;;-1:-1:-1;;;;;68476:20:0;;:39;;:58;;68516:6;;68524:9;;68476:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68453:81;;68568:1;68553:12;:16;68545:75;;;;-1:-1:-1;;;;;68545:75:0;;;;;;;:::i;:::-;68637:11;;;;;;;68633:279;;;68701:10;;68665:17;;68701:14;68697:164;;68748:37;68781:3;68748:28;68765:10;;68748:12;:16;;:28;;;;:::i;:37::-;68821:12;;68736:49;;-1:-1:-1;68804:41:0;;-1:-1:-1;;;;;68821:12:0;68736:49;68804:16;:41::i;:::-;68875:25;68891:9;68875:25;;:::i;:::-;;;68633:279;;68938:16;;68922:55;;-1:-1:-1;;;;;68938:16:0;68956:6;68964:12;68922:15;:55::i;:::-;68068:917;;;:::o;62557:111::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;62635:16:::1;:25:::0;62557:111::o;63431:97::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;63502:10:::1;:18:::0;63431:97::o;59293:48::-;;;-1:-1:-1;;;;;59293:48:0;;:::o;59642:25::-;;;;:::o;73102:149::-;73157:7;73166;73175;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;73202:20:::1;;;;;;;;;-1:-1:-1::0;;;;;73202:20:0::1;-1:-1:-1::0;;;;;73202:39:0::1;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73195:48;;;;;;73102:149:::0;;;:::o;71497:107::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;71572:9:::1;:24:::0;71497:107::o;10429:177::-;-1:-1:-1;;;;;10580:18:0;10548:7;10580:18;;;;;;;;;;;;10429:177::o;19468:148::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;19559:6:::1;::::0;19538:40:::1;::::0;19575:1:::1;::::0;-1:-1:-1;;;;;19559:6:0::1;::::0;19538:40:::1;::::0;19575:1;;19538:40:::1;19589:6;:19:::0;;-1:-1:-1;;19589:19:0::1;::::0;;19468:148::o;61563:227::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;61649:4:::1;61654:1;61649:7;;;;;;-1:-1:-1::0;;;;;;;;;;;61649:7:0::1;;;;;;;;;;;;;;;61638:8;:18;;;;61680:4;61685:1;61680:7;;;;;;-1:-1:-1::0;;;;;;;;;;;61680:7:0::1;;;;;;;;;;;;;;;61667:10;:20;;;;61717:4;61722:1;61717:7;;;;;;-1:-1:-1::0;;;;;;;;;;;61717:7:0::1;;;;;;;;;;;;;;;61698:16;:26;;;;61748:4;61753:1;61748:7;;;;;;-1:-1:-1::0;;;;;;;;;;;61748:7:0::1;;;;;;;;;;;;;;;61735:10;:20;;;;61775:4;61780:1;61775:7;;;;;;-1:-1:-1::0;;;;;;;;;;;61775:7:0::1;;;;;;;;;;;;;;;61766:6;:16;;;;61563:227:::0;:::o;70583:134::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;70658:20:::1;::::0;:51:::1;::::0;;;;-1:-1:-1;;;;;70658:20:0;;::::1;::::0;:41:::1;::::0;:51:::1;::::0;70700:8;;70658:51:::1;;;:::i;70321:134::-:0;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;70396:20:::1;::::0;:51:::1;::::0;;;;-1:-1:-1;;;;;70396:20:0;;::::1;::::0;:37:::1;::::0;:51:::1;::::0;70434:12;;70396:51:::1;;;:::i;73395:128::-:0;73475:20;;:40;;;;;;;;73448:7;;-1:-1:-1;;;;;73475:20:0;;:38;;:40;;;;;;;;;;;;;;:20;:40;;;;;;;;;;63261:162;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;63330:8:::1;:16:::0;;;63384::::1;::::0;63369:10:::1;::::0;:46:::1;::::0;63341:5;;63369:32:::1;::::0;:14:::1;:32::i;35510:100::-:0;35561:7;35588;35596:5;35588:14;;;;;;-1:-1:-1;;;;;;;;;;;35588:14:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35588:14:0;;35510:100;-1:-1:-1;;35510:100:0:o;63536:92::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;63606:6:::1;:14:::0;63536:92::o;18826:79::-;18891:6;;-1:-1:-1;;;;;18891:6:0;18826:79;:::o;66181:1879::-;66278:1;66263:4;66257:18;:22;:49;;;;;66304:2;66289:4;66283:18;:23;66257:49;66249:94;;;;-1:-1:-1;;;;;66249:94:0;;;;;;;:::i;:::-;66354:14;66371:12;:10;:12::i;:::-;66354:29;-1:-1:-1;;;;;;66402:20:0;;66394:79;;;;-1:-1:-1;;;;;66394:79:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66493:22:0;;;;;;:14;:22;;;;;;;;66492:23;66484:70;;;;-1:-1:-1;;;;;66484:70:0;;;;;;;:::i;:::-;66583:12;;-1:-1:-1;;;;;66573:22:0;;;66583:12;;66573:22;;;;:52;;-1:-1:-1;66609:16:0;;-1:-1:-1;;;;;66599:26:0;;;66609:16;;66599:26;;66573:52;66565:120;;;;-1:-1:-1;;;;;66565:120:0;;;;;;;:::i;:::-;66716:20;;:32;;;;;;;;66696:17;;-1:-1:-1;;;;;66716:20:0;;:30;;:32;;;;;;;;;;;;;;:20;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66696:52;;66788:9;66767:17;66777:6;66767:9;:17::i;:::-;:30;;66759:87;;;;-1:-1:-1;;;;;66759:87:0;;;;;;;:::i;:::-;66857:28;66888:24;66906:4;66888:9;:24::i;:::-;66967:16;;66857:55;;-1:-1:-1;66943:40:0;;;;;;;67012;;-1:-1:-1;67041:11:0;;;;;;;67012:40;:66;;;;-1:-1:-1;67070:8:0;;;;67069:9;67012:66;:100;;;;;67105:7;:5;:7::i;:::-;-1:-1:-1;;;;;67095:17:0;:6;-1:-1:-1;;;;;67095:17:0;;;67012:100;:151;;;;-1:-1:-1;;;;;;67130:33:0;;;;;;:25;:33;;;;;;;;67129:34;67012:151;66994:943;;;67190:8;:15;;-1:-1:-1;;67190:15:0;67201:4;67190:15;;;67269:8;;67190;;67244:43;;67283:3;;67244:34;;:20;;:24;:34::i;:43::-;67321:12;;67222:65;;-1:-1:-1;67304:43:0;;-1:-1:-1;;;;;67321:12:0;67222:65;67304:16;:43::i;:::-;67364:25;67392:45;67433:3;67392:36;67417:10;;67392:20;:24;;:36;;;;:::i;:45::-;67364:73;;67454:27;67484:38;67518:3;67484:29;67506:6;;67484:17;:21;;:29;;;;:::i;:38::-;67556:16;;67454:68;;-1:-1:-1;67539:55:0;;-1:-1:-1;;;;;67556:16:0;67454:68;67539:16;:55::i;:::-;67640:16;;67609:92;;67633:4;;-1:-1:-1;;;;;67640:16:0;67658:42;:17;67680:19;67658:21;:42::i;:::-;67609:15;:92::i;:::-;67718:18;67739:51;67786:3;67739:42;67764:16;;67739:20;:24;;:42;;;;:::i;:51::-;67718:72;;67807:26;67822:10;67807:14;:26::i;:::-;67850:42;67867:24;67885:4;67867:9;:24::i;:::-;67850:16;:42::i;:::-;-1:-1:-1;;67909:8:0;:16;;-1:-1:-1;;67909:16:0;;;-1:-1:-1;;66994:943:0;67947:49;67963:6;67979:4;67986:9;67947:15;:49::i;:::-;68007:20;;:45;;;;;-1:-1:-1;;;;;68007:20:0;;;;:31;;:45;;68039:6;;68047:4;;68007:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66181:1879;;;;;:::o;62788:110::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;62867:16:::1;:23:::0;;-1:-1:-1;;62867:23:0::1;-1:-1:-1::0;;;;;62867:23:0;;;::::1;::::0;;;::::1;::::0;;62788:110::o;9357:104::-;9413:13;9446:7;9439:14;;;;;:::i;34974:109::-;-1:-1:-1;;;;;35057:18:0;35030:7;35057:18;;;:9;:18;;;;;;;34974:109::o;63636:229::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;63743:13:::1;::::0;-1:-1:-1;;;;;63735:21:0;;::::1;63743:13:::0;::::1;63735:21;;63727:78;;;;-1:-1:-1::0;;;;;63727:78:0::1;;;;;;;:::i;:::-;63816:41;63845:4;63851:5;63816:28;:41::i;70853:124::-:0;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;70923:20:::1;::::0;:46:::1;::::0;;;;-1:-1:-1;;;;;70923:20:0;;::::1;::::0;:37:::1;::::0;:46:::1;::::0;70961:7;;70923:46:::1;;;:::i;13804:400::-:0;13924:4;13946:228;13969:12;:10;:12::i;:::-;13996:7;14018:145;14075:15;14018:145;;;;;;;;;;;;;;;;;:11;:25;14030:12;:10;:12::i;:::-;-1:-1:-1;;;;;14018:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;14018:25:0;;;:34;;;;;;;;;;;:145;:38;:145::i;70463:112::-;70535:20;;:32;;;;;;;;70508:7;;-1:-1:-1;;;;;70535:20:0;;:30;;:32;;;;;;;;;;;;;;:20;:32;;;;;;;;;;59435:27;;;-1:-1:-1;;;;;59435:27:0;;:::o;10819:216::-;10941:4;10963:42;10973:12;:10;:12::i;:::-;10987:9;10998:6;10963:9;:42::i;59579:23::-;;;;:::o;59914:57::-;;;;;;;;;;;;;;;:::o;70162:147::-;70253:20;;:48;;;;;70227:7;;-1:-1:-1;;;;;70253:20:0;;:39;;:48;;70293:7;;70253:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;72173:300::-;72222:13;72280:1;72256:12;:10;:12::i;:::-;-1:-1:-1;;;;;72256:26:0;;;72248:59;;;;-1:-1:-1;;;;;72248:59:0;;;;;;;:::i;:::-;72326:20;;-1:-1:-1;;;;;72326:20:0;:33;72360:12;:10;:12::i;:::-;72326:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72318:73;;;;-1:-1:-1;;;;;72318:73:0;;;;;;;:::i;:::-;72409:20;;-1:-1:-1;;;;;72409:20:0;:42;72452:12;:10;:12::i;59469:31::-;;;-1:-1:-1;;;;;59469:31:0;;:::o;34770:105::-;-1:-1:-1;;;;;34851:16:0;34824:7;34851:16;;;:7;:16;;;;;;;34770:105::o;71105:123::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;71173:20:::1;::::0;:47:::1;::::0;;;;-1:-1:-1;;;;;71173:20:0;;::::1;::::0;:38:::1;::::0;:47:::1;::::0;71212:7;;71173:47:::1;;;:::i;34560:119::-:0;-1:-1:-1;;;;;34645:26:0;34618:7;34645:26;;;:19;:26;;;;;;;34560:119::o;63873:126::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63960:23:0;;;::::1;;::::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;63960:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;63873:126::o;71741:::-;71815:20;;:44;;;;;;;;71788:7;;-1:-1:-1;;;;;71815:20:0;;:42;;:44;;;;;;;;;;;;;;:20;:44;;;;;;;;;;70725:120;70801:20;;:36;;;;;;;;70774:7;;-1:-1:-1;;;;;70801:20:0;;:34;;:36;;;;;;;;;;;;;;:20;:36;;;;;;;;;;11098:201;-1:-1:-1;;;;;11264:18:0;;;11232:7;11264:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11098:201::o;34308:95::-;34381:14;;34308:95;:::o;72791:303::-;72842:13;72900:1;72876:12;:10;:12::i;:::-;-1:-1:-1;;;;;72876:26:0;;;72868:59;;;;-1:-1:-1;;;;;72868:59:0;;;;;;;:::i;:::-;72946:20;;-1:-1:-1;;;;;72946:20:0;:33;72980:12;:10;:12::i;:::-;72946:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72938:73;;;;-1:-1:-1;;;;;72938:73:0;;;;;;;:::i;:::-;73029:20;;-1:-1:-1;;;;;73029:20:0;:43;73073:12;:10;:12::i;19771:281::-;19048:12;:10;:12::i;:::-;19038:6;;-1:-1:-1;;;;;19038:6:0;;;:22;;;19030:67;;;;-1:-1:-1;;;;;19030:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19874:22:0;::::1;19852:110;;;;-1:-1:-1::0;;;;;19852:110:0::1;;;;;;;:::i;:::-;19999:6;::::0;19978:38:::1;::::0;-1:-1:-1;;;;;19978:38:0;;::::1;::::0;19999:6:::1;::::0;19978:38:::1;::::0;19999:6:::1;::::0;19978:38:::1;20027:6;:17:::0;;-1:-1:-1;;20027:17:0::1;-1:-1:-1::0;;;;;20027:17:0;;;::::1;::::0;;;::::1;::::0;;19771:281::o;70985:112::-;71057:20;;:32;;;;;;;;71030:7;;-1:-1:-1;;;;;71057:20:0;;:30;;:32;;;;;;;;;;;;;;:20;:32;;;;;;;;;;70010:144;70100:20;;:46;;;;;70073:7;;-1:-1:-1;;;;;70100:20:0;;:37;;:46;;70138:7;;70100:46;;;:::i;71612:121::-;71684:20;;:41;;;;;;;;71657:7;;-1:-1:-1;;;;;71684:20:0;;:39;;:41;;;;;;;;;;;;;;:20;:41;;;;;;;;;;71236:111;71306:20;;:33;;;;;;;;71282:4;;-1:-1:-1;;;;;71306:20:0;;:31;;:33;;;;;;;;;;;;;;:20;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;325:181::-;383:7;;415:5;419:1;415;:5;:::i;:::-;403:17;;444:1;439;:6;;431:46;;;;-1:-1:-1;;;;;431:46:0;;;;;;;:::i;17195:380::-;-1:-1:-1;;;;;17331:19:0;;17323:68;;;;-1:-1:-1;;;;;17323:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17410:21:0;;17402:68;;;;-1:-1:-1;;;;;17402:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17483:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;17535:32;;;;;17513:6;;17535:32;:::i;:::-;;;;;;;;17195:380;;;:::o;37576:261::-;37799:12;;-1:-1:-1;;;;;37779:16:0;;37722:7;37779:16;;;:7;:16;;;;;;37722:7;;37814:15;;37763:32;;:13;:32;:::i;:::-;37762:49;;;;:::i;:::-;:67;;;;:::i;:::-;37742:87;37576:261;-1:-1:-1;;;;37576:261:0:o;21829:391::-;21941:4;21933:21;:31;-1:-1:-1;21933:31:0;21911:110;;;;-1:-1:-1;;;;;21911:110:0;;;;;;;:::i;:::-;22035:12;22053:9;-1:-1:-1;;;;;22053:14:0;22075:6;22053:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22034:52;;;22119:7;22097:115;;;;-1:-1:-1;;;;;22097:115:0;;;;;;;:::i;64213:371::-;-1:-1:-1;;;;;64311:18:0;;64303:68;;;;-1:-1:-1;;;;;64303:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;64390:16:0;;64382:64;;;;-1:-1:-1;;;;;64382:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;64466:20:0;;;;;;:14;:20;;;;;;;;64465:21;:44;;;;-1:-1:-1;;;;;;64491:18:0;;;;;;:14;:18;;;;;;;;64490:19;64465:44;64457:75;;;;-1:-1:-1;;;;;64457:75:0;;;;;;;:::i;:::-;64543:33;64559:4;64565:2;64569:6;64543:15;:33::i;1228:226::-;1348:7;1384:12;1376:6;;;;1368:29;;;;-1:-1:-1;;;;;1368:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1408:9:0;1420:5;1424:1;1420;:5;:::i;:::-;1408:17;1228:226;-1:-1:-1;;;;;1228:226:0:o;64007:198::-;-1:-1:-1;;;;;64100:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;64100:39:0;;;;;;;;;;64157:40;;64100:39;;:31;64157:40;;;64007:198;;:::o;28205:248::-;28322:123;28356:5;28399:23;;;28424:2;28428:5;28376:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;28376:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28322:19;:123::i;1713:471::-;1771:7;2016:6;2012:47;;-1:-1:-1;2046:1:0;2039:8;;2012:47;2071:9;2083:5;2087:1;2083;:5;:::i;:::-;2071:17;-1:-1:-1;2116:1:0;2107:5;2111:1;2071:17;2107:5;:::i;:::-;:10;2099:56;;;;-1:-1:-1;;;;;2099:56:0;;;;;;;:::i;2660:132::-;2718:7;2745:39;2749:1;2752;2745:39;;;;;;;;;;;;;;;;;:3;:39::i;64592:302::-;64710:4;64702:21;64736:24;64753:6;64736:16;:24::i;:::-;64771:16;64790:46;64799:4;64791:21;64818:17;64790:27;:46::i;:::-;64847:39;;64771:65;;-1:-1:-1;;;;;;64847:29:0;;;:39;;;;;64771:65;;64847:39;;;;64771:65;64847:29;:39;;;;;;;;;;;;;;;;;;;14694:610;-1:-1:-1;;;;;14834:20:0;;14826:70;;;;-1:-1:-1;;;;;14826:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14915:23:0;;14907:71;;;;-1:-1:-1;;;;;14907:71:0;;;;;;;:::i;:::-;14991:47;15012:6;15020:9;15031:6;14991:20;:47::i;:::-;15071:108;15107:6;15071:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15071:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;15051:17:0;;;:9;:17;;;;;;;;;;;:128;;;;15213:20;;;;;;;:32;;15238:6;15213:24;:32::i;:::-;-1:-1:-1;;;;;15190:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;15261:35;;;;;;;;;;15289:6;;15261:35;:::i;789:136::-;847:7;874:43;878:1;881;874:43;;;;;;;;;;;;;;;;;:3;:43::i;64902:414::-;64961:12;64976:13;:6;64987:1;64976:10;:13::i;:::-;64961:28;-1:-1:-1;65000:17:0;65020:16;:6;64961:28;65020:10;:16::i;:::-;65000:36;-1:-1:-1;65082:4:0;65074:21;65108:22;65125:4;65108:16;:22::i;:::-;65143:16;65162:41;65170:4;65162:21;65188:14;65162:25;:41::i;:::-;65143:60;;65216:33;65229:9;65240:8;65216:12;:33::i;:::-;65267:41;65282:4;65288:8;65298:9;65267:41;;;;;;;;:::i;:::-;;;;;;;;64902:414;;;;;:::o;65324:476::-;65414:16;;;65428:1;65414:16;;;;;;;;65390:21;;65414:16;;;;;;;;;;-1:-1:-1;65414:16:0;65390:40;;65459:4;65441;65446:1;65441:7;;;;;;-1:-1:-1;;;;;;;;;;;65441:7:0;;;;;;;;;-1:-1:-1;;;;;65441:23:0;;;:7;;;;;;;;;;:23;;;;65485:15;;:23;;;;;;;;:15;;;;;:21;;:23;;;;;65441:7;;65485:23;;;;;:15;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65475:4;65480:1;65475:7;;;;;;-1:-1:-1;;;;;;;;;;;65475:7:0;;;;;;;;;-1:-1:-1;;;;;65475:33:0;;;:7;;;;;;;;;:33;65553:15;;65521:62;;65538:4;;65553:15;65571:11;65521:8;:62::i;:::-;65596:15;;:196;;;;;-1:-1:-1;;;;;65596:15:0;;;;:66;;:196;;65677:11;;65596:15;;65719:4;;65746;;65766:15;;65596:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65324:476;;:::o;31172:802::-;31596:23;31622:106;31664:4;31622:106;;;;;;;;;;;;;;;;;31630:5;-1:-1:-1;;;;;31622:27:0;;;:106;;;;;:::i;:::-;31743:17;;31596:132;;-1:-1:-1;31743:21:0;31739:228;;31858:10;31847:30;;;;;;;;;;;;:::i;:::-;31821:134;;;;-1:-1:-1;;;;;31821:134:0;;;;;;;:::i;3288:312::-;3408:7;3443:12;3436:5;3428:28;;;;-1:-1:-1;;;;;3428:28:0;;;;;;;;:::i;:::-;-1:-1:-1;3467:9:0;3479:5;3483:1;3479;:5;:::i;60469:244::-;60590:9;;:16;;60600:6;60590:16;:::i;:::-;60580:6;:26;;:62;;;-1:-1:-1;;;;;;60611:31:0;;;;;;:25;:31;;;;;;;;60610:32;60580:62;60572:133;;;;-1:-1:-1;;;;;60572:133:0;;;;;;;:::i;65808:365::-;65921:15;;65889:62;;65906:4;;-1:-1:-1;;;;;65921:15:0;65939:11;65889:8;:62::i;:::-;65964:15;;:201;;;;;-1:-1:-1;;;;;65964:15:0;;;;:31;;66003:9;;65964:201;;66036:4;;66056:11;;65964:15;;;;;;66139;;65964:201;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23251:229::-;23388:12;23420:52;23442:6;23450:4;23456:1;23459:12;23388;24799:18;24810:6;24799:10;:18::i;:::-;24791:60;;;;-1:-1:-1;;;;;24791:60:0;;;;;;;:::i;:::-;24865:12;24879:23;24906:6;-1:-1:-1;;;;;24906:11:0;24925:5;24946:4;24906:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24864:97;;;;24979:51;24996:7;25005:10;25017:12;24979:16;:51::i;:::-;24972:58;24467:571;-1:-1:-1;;;;;;;24467:571:0:o;20669:387::-;20992:20;21040:8;;;20669:387::o;27427:712::-;27577:12;27606:7;27602:530;;;-1:-1:-1;27637:10:0;27630:17;;27602:530;27751:17;;:21;27747:374;;27949:10;27943:17;28010:15;27997:10;27993:2;27989:19;27982:44;27897:148;28092:12;28085:20;;-1:-1:-1;;;;;28085:20:0;;;;;;;;:::i;14:259:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;278:263::-;;401:2;389:9;380:7;376:23;372:32;369:2;;;422:6;414;407:22;369:2;459:9;453:16;478:33;505:5;478:33;:::i;818:402::-;;;947:2;935:9;926:7;922:23;918:32;915:2;;;968:6;960;953:22;915:2;1012:9;999:23;1031:33;1058:5;1031:33;:::i;:::-;1083:5;-1:-1:-1;1140:2:1;1125:18;;1112:32;1153:35;1112:32;1153:35;:::i;:::-;1207:7;1197:17;;;905:315;;;;;:::o;1225:470::-;;;;1371:2;1359:9;1350:7;1346:23;1342:32;1339:2;;;1392:6;1384;1377:22;1339:2;1436:9;1423:23;1455:33;1482:5;1455:33;:::i;:::-;1507:5;-1:-1:-1;1564:2:1;1549:18;;1536:32;1577:35;1536:32;1577:35;:::i;:::-;1329:366;;1631:7;;-1:-1:-1;;;1685:2:1;1670:18;;;;1657:32;;1329:366::o;1700:396::-;;;1826:2;1814:9;1805:7;1801:23;1797:32;1794:2;;;1847:6;1839;1832:22;1794:2;1891:9;1878:23;1910:33;1937:5;1910:33;:::i;:::-;1962:5;-1:-1:-1;2019:2:1;2004:18;;1991:32;2032;1991;2032;:::i;2101:327::-;;;2230:2;2218:9;2209:7;2205:23;2201:32;2198:2;;;2251:6;2243;2236:22;2198:2;2295:9;2282:23;2314:33;2341:5;2314:33;:::i;:::-;2366:5;2418:2;2403:18;;;;2390:32;;-1:-1:-1;;;2188:240:1:o;2433:1002::-;;2548:2;2591;2579:9;2570:7;2566:23;2562:32;2559:2;;;2612:6;2604;2597:22;2559:2;2657:9;2644:23;2686:18;2727:2;2719:6;2716:14;2713:2;;;2748:6;2740;2733:22;2713:2;2791:6;2780:9;2776:22;2766:32;;2836:7;2829:4;2825:2;2821:13;2817:27;2807:2;;2863:6;2855;2848:22;2807:2;2904;2891:16;2926:2;2922;2919:10;2916:2;;;2932:18;;:::i;:::-;2979:2;2975;2971:11;2961:21;;3002:27;3025:2;3021;3017:11;3002:27;:::i;:::-;3063:15;;;3094:12;;;;3126:11;;;3156;;;3152:20;;3149:33;-1:-1:-1;3146:2:1;;;3200:6;3192;3185:22;3146:2;3227:6;3218:15;;3242:163;3256:2;3253:1;3250:9;3242:163;;;3313:17;;3301:30;;3274:1;3267:9;;;;;3351:12;;;;3383;;3242:163;;;-1:-1:-1;3424:5:1;2528:907;-1:-1:-1;;;;;;;;2528:907:1:o;3440:253::-;;3549:2;3537:9;3528:7;3524:23;3520:32;3517:2;;;3570:6;3562;3555:22;3517:2;3614:9;3601:23;3633:30;3657:5;3633:30;:::i;3698:257::-;;3818:2;3806:9;3797:7;3793:23;3789:32;3786:2;;;3839:6;3831;3824:22;3786:2;3876:9;3870:16;3895:30;3919:5;3895:30;:::i;4238:416::-;;;4381:2;4369:9;4360:7;4356:23;4352:32;4349:2;;;4402:6;4394;4387:22;4659:719;;4781:2;4769:9;4760:7;4756:23;4752:32;4749:2;;;4802:6;4794;4787:22;4749:2;4847:9;4834:23;4880:18;4872:6;4869:30;4866:2;;;4917:6;4909;4902:22;4866:2;4945:22;;4998:4;4990:13;;4986:27;-1:-1:-1;4976:2:1;;5032:6;5024;5017:22;4976:2;5073;5060:16;5098:50;5113:34;5144:2;5113:34;:::i;:::-;5098:50;:::i;:::-;5171:2;5164:5;5157:17;5211:7;5206:2;5201;5197;5193:11;5189:20;5186:33;5183:2;;;5237:6;5229;5222:22;5183:2;5297;5292;5288;5284:11;5279:2;5272:5;5268:14;5255:45;5320:14;;;5336:2;5316:23;5309:39;;;;-1:-1:-1;5324:5:1;4739:639;-1:-1:-1;;4739:639:1:o;5383:677::-;;5516:2;5504:9;5495:7;5491:23;5487:32;5484:2;;;5537:6;5529;5522:22;5484:2;5575:9;5569:16;5608:18;5600:6;5597:30;5594:2;;;5645:6;5637;5630:22;5594:2;5673:22;;5726:4;5718:13;;5714:27;-1:-1:-1;5704:2:1;;5760:6;5752;5745:22;5704:2;5794;5788:9;5819:50;5834:34;5865:2;5834:34;:::i;5819:50::-;5892:2;5885:5;5878:17;5932:7;5927:2;5922;5918;5914:11;5910:20;5907:33;5904:2;;;5958:6;5950;5943:22;5904:2;5976:54;6027:2;6022;6015:5;6011:14;6006:2;6002;5998:11;5976:54;:::i;6065:190::-;;6177:2;6165:9;6156:7;6152:23;6148:32;6145:2;;;6198:6;6190;6183:22;6145:2;-1:-1:-1;6226:23:1;;6135:120;-1:-1:-1;6135:120:1:o;6260:194::-;;6383:2;6371:9;6362:7;6358:23;6354:32;6351:2;;;6404:6;6396;6389:22;6351:2;-1:-1:-1;6432:16:1;;6341:113;-1:-1:-1;6341:113:1:o;6459:316::-;;;;6616:2;6604:9;6595:7;6591:23;6587:32;6584:2;;;6637:6;6629;6622:22;6584:2;6671:9;6665:16;6655:26;;6721:2;6710:9;6706:18;6700:25;6690:35;;6765:2;6754:9;6750:18;6744:25;6734:35;;6574:201;;;;;:::o;6780:260::-;;6862:5;6856:12;6889:6;6884:3;6877:19;6905:63;6961:6;6954:4;6949:3;6945:14;6938:4;6931:5;6927:16;6905:63;:::i;:::-;7022:2;7001:15;-1:-1:-1;;6997:29:1;6988:39;;;;7029:4;6984:50;;6832:208;-1:-1:-1;;6832:208:1:o;7045:274::-;;7212:6;7206:13;7228:53;7274:6;7269:3;7262:4;7254:6;7250:17;7228:53;:::i;:::-;7297:16;;;;;7182:137;-1:-1:-1;;7182:137:1:o;7324:205::-;7524:3;7515:14::o;7534:226::-;-1:-1:-1;;;;;7698:55:1;;;;7680:74;;7668:2;7653:18;;7635:125::o;7765:305::-;-1:-1:-1;;;;;7965:55:1;;;;7947:74;;8052:2;8037:18;;8030:34;7935:2;7920:18;;7902:168::o;8075:327::-;-1:-1:-1;;;;;8328:15:1;;;8310:34;;8380:15;;8375:2;8360:18;;8353:43;8237:2;8222:18;;8204:198::o;8407:342::-;;-1:-1:-1;;;;;8588:6:1;8584:55;8573:9;8566:74;8676:2;8671;8660:9;8656:18;8649:30;8696:47;8739:2;8728:9;8724:18;8716:6;8696:47;:::i;9056:630::-;-1:-1:-1;;;;;9438:15:1;;;9420:34;;9485:2;9470:18;;9463:34;;;;9528:2;9513:18;;9506:34;;;;9571:2;9556:18;;9549:34;;;;9620:15;;;9614:3;9599:19;;9592:44;9667:3;9652:19;;9645:35;;;;9346:3;9331:19;;9313:373::o;9691:187::-;9856:14;;9849:22;9831:41;;9819:2;9804:18;;9786:92::o;10401:222::-;;10550:2;10539:9;10532:21;10570:47;10613:2;10602:9;10598:18;10590:6;10570:47;:::i;10628:414::-;10830:2;10812:21;;;10869:2;10849:18;;;10842:30;10908:34;10903:2;10888:18;;10881:62;10979:20;10974:2;10959:18;;10952:48;11032:3;11017:19;;10802:240::o;11047:399::-;11249:2;11231:21;;;11288:2;11268:18;;;11261:30;11327:34;11322:2;11307:18;;11300:62;11398:5;11393:2;11378:18;;11371:33;11436:3;11421:19;;11221:225::o;11451:337::-;11653:2;11635:21;;;11692:2;11672:18;;;11665:30;11731:15;11726:2;11711:18;;11704:43;11779:2;11764:18;;11625:163::o;11793:356::-;11995:2;11977:21;;;12014:18;;;12007:30;12073:34;12068:2;12053:18;;12046:62;12140:2;12125:18;;11967:182::o;12154:402::-;12356:2;12338:21;;;12395:2;12375:18;;;12368:30;12434:34;12429:2;12414:18;;12407:62;12505:8;12500:2;12485:18;;12478:36;12546:3;12531:19;;12328:228::o;12561:398::-;12763:2;12745:21;;;12802:2;12782:18;;;12775:30;12841:34;12836:2;12821:18;;12814:62;12912:4;12907:2;12892:18;;12885:32;12949:3;12934:19;;12735:224::o;12964:351::-;13166:2;13148:21;;;13205:2;13185:18;;;13178:30;13244:29;13239:2;13224:18;;13217:57;13306:2;13291:18;;13138:177::o;13320:401::-;13522:2;13504:21;;;13561:2;13541:18;;;13534:30;13600:34;13595:2;13580:18;;13573:62;13671:7;13666:2;13651:18;;13644:35;13711:3;13696:19;;13494:227::o;13726:352::-;13928:2;13910:21;;;13967:2;13947:18;;;13940:30;14006;14001:2;13986:18;;13979:58;14069:2;14054:18;;13900:178::o;14083:344::-;14285:2;14267:21;;;14324:2;14304:18;;;14297:30;14363:22;14358:2;14343:18;;14336:50;14418:2;14403:18;;14257:170::o;14432:402::-;14634:2;14616:21;;;14673:2;14653:18;;;14646:30;14712:34;14707:2;14692:18;;14685:62;14783:8;14778:2;14763:18;;14756:36;14824:3;14809:19;;14606:228::o;14839:422::-;15041:2;15023:21;;;15080:2;15060:18;;;15053:30;15119:34;15114:2;15099:18;;15092:62;15190:28;15185:2;15170:18;;15163:56;15251:3;15236:19;;15013:248::o;15266:410::-;15468:2;15450:21;;;15507:2;15487:18;;;15480:30;15546:34;15541:2;15526:18;;15519:62;15617:16;15612:2;15597:18;;15590:44;15666:3;15651:19;;15440:236::o;15681:353::-;15883:2;15865:21;;;15922:2;15902:18;;;15895:30;15961:31;15956:2;15941:18;;15934:59;16025:2;16010:18;;15855:179::o;16446:407::-;16648:2;16630:21;;;16687:2;16667:18;;;16660:30;16726:34;16721:2;16706:18;;16699:62;16797:13;16792:2;16777:18;;16770:41;16843:3;16828:19;;16620:233::o;16858:355::-;17060:2;17042:21;;;17099:2;17079:18;;;17072:30;17138:33;17133:2;17118:18;;17111:61;17204:2;17189:18;;17032:181::o;17218:422::-;17420:2;17402:21;;;17459:2;17439:18;;;17432:30;17498:34;17493:2;17478:18;;17471:62;17569:28;17564:2;17549:18;;17542:56;17630:3;17615:19;;17392:248::o;17645:408::-;17847:2;17829:21;;;17886:2;17866:18;;;17859:30;17925:34;17920:2;17905:18;;17898:62;17996:14;17991:2;17976:18;;17969:42;18043:3;18028:19;;17819:234::o;18058:343::-;18260:2;18242:21;;;18299:2;18279:18;;;18272:30;18338:21;18333:2;18318:18;;18311:49;18392:2;18377:18;;18232:169::o;18406:419::-;18608:2;18590:21;;;18647:2;18627:18;;;18620:30;18686:34;18681:2;18666:18;;18659:62;18757:25;18752:2;18737:18;;18730:53;18815:3;18800:19;;18580:245::o;18830:398::-;19032:2;19014:21;;;19071:2;19051:18;;;19044:30;19110:34;19105:2;19090:18;;19083:62;19181:4;19176:2;19161:18;;19154:32;19218:3;19203:19;;19004:224::o;19233:420::-;19435:2;19417:21;;;19474:2;19454:18;;;19447:30;19513:34;19508:2;19493:18;;19486:62;19584:26;19579:2;19564:18;;19557:54;19643:3;19628:19;;19407:246::o;19658:410::-;19860:2;19842:21;;;19899:2;19879:18;;;19872:30;19938:34;19933:2;19918:18;;19911:62;20009:16;20004:2;19989:18;;19982:44;20058:3;20043:19;;19832:236::o;20073:397::-;20275:2;20257:21;;;20314:2;20294:18;;;20287:30;20353:34;20348:2;20333:18;;20326:62;20424:3;20419:2;20404:18;;20397:31;20460:3;20445:19;;20247:223::o;20475:356::-;20677:2;20659:21;;;20696:18;;;20689:30;20755:34;20750:2;20735:18;;20728:62;20822:2;20807:18;;20649:182::o;20836:401::-;21038:2;21020:21;;;21077:2;21057:18;;;21050:30;21116:34;21111:2;21096:18;;21089:62;21187:7;21182:2;21167:18;;21160:35;21227:3;21212:19;;21010:227::o;21242:400::-;21444:2;21426:21;;;21483:2;21463:18;;;21456:30;21522:34;21517:2;21502:18;;21495:62;21593:6;21588:2;21573:18;;21566:34;21632:3;21617:19;;21416:226::o;21647:353::-;21849:2;21831:21;;;21888:2;21868:18;;;21861:30;21927:31;21922:2;21907:18;;21900:59;21991:2;21976:18;;21821:179::o;22005:406::-;22207:2;22189:21;;;22246:2;22226:18;;;22219:30;22285:34;22280:2;22265:18;;22258:62;22356:12;22351:2;22336:18;;22329:40;22401:3;22386:19;;22179:232::o;22416:407::-;22618:2;22600:21;;;22657:2;22637:18;;;22630:30;22696:34;22691:2;22676:18;;22669:62;22767:13;22762:2;22747:18;;22740:41;22813:3;22798:19;;22590:233::o;22828:409::-;23030:2;23012:21;;;23069:2;23049:18;;;23042:30;23108:34;23103:2;23088:18;;23081:62;23179:15;23174:2;23159:18;;23152:43;23227:3;23212:19;;23002:235::o;23242:416::-;23444:2;23426:21;;;23483:2;23463:18;;;23456:30;23522:34;23517:2;23502:18;;23495:62;23593:22;23588:2;23573:18;;23566:50;23648:3;23633:19;;23416:242::o;23663:177::-;23809:25;;;23797:2;23782:18;;23764:76::o;23845:1029::-;;24155:3;24144:9;24140:19;24186:6;24175:9;24168:25;24212:2;24250:6;24245:2;24234:9;24230:18;24223:34;24293:3;24288:2;24277:9;24273:18;24266:31;24317:6;24352;24346:13;24383:6;24375;24368:22;24421:3;24410:9;24406:19;24399:26;;24460:2;24452:6;24448:15;24434:29;;24481:4;24494:218;24508:6;24505:1;24502:13;24494:218;;;24573:13;;-1:-1:-1;;;;;24569:62:1;24557:75;;24687:15;;;;24652:12;;;;24530:1;24523:9;24494:218;;;-1:-1:-1;;;;;;;24768:55:1;;;;24763:2;24748:18;;24741:83;-1:-1:-1;;;24855:3:1;24840:19;24833:35;24729:3;24116:758;-1:-1:-1;;;24116:758:1:o;24879:319::-;25081:25;;;25137:2;25122:18;;25115:34;;;;25180:2;25165:18;;25158:34;25069:2;25054:18;;25036:162::o;25203:184::-;25375:4;25363:17;;;;25345:36;;25333:2;25318:18;;25300:87::o;25392:251::-;25462:2;25456:9;25492:17;;;25539:18;25524:34;;25560:22;;;25521:62;25518:2;;;25586:18;;:::i;:::-;25622:2;25615:22;25436:207;;-1:-1:-1;25436:207:1:o;25648:191::-;;25732:18;25724:6;25721:30;25718:2;;;25754:18;;:::i;:::-;-1:-1:-1;25822:2:1;25799:17;-1:-1:-1;;25795:31:1;25828:4;25791:42;;25708:131::o;25844:128::-;;25915:1;25911:6;25908:1;25905:13;25902:2;;;25921:18;;:::i;:::-;-1:-1:-1;25957:9:1;;25892:80::o;25977:274::-;;26043:1;26033:2;;-1:-1:-1;;;;;;;;;;;26075:1:1;26068:88;26179:4;26176:1;26169:15;26207:4;26204:1;26197:15;26033:2;-1:-1:-1;26236:9:1;;26023:228::o;26256:168::-;;26362:1;26358;26354:6;26350:14;26347:1;26344:21;26339:1;26332:9;26325:17;26321:45;26318:2;;;26369:18;;:::i;:::-;-1:-1:-1;26409:9:1;;26308:116::o;26429:125::-;;26497:1;26494;26491:8;26488:2;;;26502:18;;:::i;:::-;-1:-1:-1;26539:9:1;;26478:76::o;26559:258::-;26631:1;26641:113;26655:6;26652:1;26649:13;26641:113;;;26731:11;;;26725:18;26712:11;;;26705:39;26677:2;26670:10;26641:113;;;26772:6;26769:1;26766:13;26763:2;;;26807:1;26798:6;26793:3;26789:16;26782:27;26763:2;;26612:205;;;:::o;26822:437::-;26907:1;26897:12;;26954:1;26944:12;;;26965:2;;27019:4;27011:6;27007:17;26997:27;;26965:2;27072;27064:6;27061:14;27041:18;27038:38;27035:2;;;-1:-1:-1;;;;;;;;;;;27106:1:1;27099:88;27210:4;27207:1;27200:15;27238:4;27235:1;27228:15;27035:2;;26877:382;;;:::o;27264:184::-;-1:-1:-1;;;;;;;;;;;27313:1:1;27306:88;27413:4;27410:1;27403:15;27437:4;27434:1;27427:15;27453:184;-1:-1:-1;;;;;;;;;;;27502:1:1;27495:88;27602:4;27599:1;27592:15;27626:4;27623:1;27616:15;27642:156;-1:-1:-1;;;;;27723:5:1;27719:54;27712:5;27709:65;27699:2;;27788:1;27785;27778:12;27803:120;27891:5;27884:13;27877:21;27870:5;27867:32;27857:2;;27913:1;27910;27903:12

Swarm Source

ipfs://6ef7fa29c45c7183802a2a4a3aee1c67ab311580a6efabae207419705d1c9b81
Loading